2012-04-23 11 views
6

द्वारा फेंका नहीं, gdb std::out_of_range पकड़ने अगर मैं catch throw कोशिश चाहते प्रतीत नहीं होता है। अगर मैं throw मैन्युअल रूप से यह ठीक पकड़ता है, तो क्या मैं कुछ गलत कर रहा हूं?gdb पकड़ने (छ ++ जी -std = C++ 0x के साथ) std :: MinGW 4.6.2 के साथ निम्न संकलन out_of_range वेक्टर

#include <stdexcept> 
#include <vector> 

int main() 
{ 
    std::vector<char> vec(10); 
    try {  
     vec.at(10); // this won't be caught by gdb 

     // throw std::out_of_range(""); // this will 
    } 
    catch (std::out_of_range const& e) {   
    } 
} 

उत्तर

3

आप seeen किया है, std::vector::at() से अपवाद __throw_out_of_rangelibstdc++.so अंदर एक समारोह है जिसके द्वारा फेंक दिया जाता है, तो मैं वहाँ है कि एक साझा लाइब्रेरी में कोई catchpoint सेट करने से रोकता है GDB Mingw पर कुछ समस्या है संदेह है। या शायद आपका libstdc++-g के साथ बनाया गया था।

यदि आपका जीसीसी --enable-libstdcxx-debug के साथ कॉन्फ़िगर किया गया था तो आपके पास -O0 -g के साथ निर्मित libs का दूसरा सेट होगा जो डिबगिंग के दौरान बेहतर काम कर सकता है, लेकिन उस विकल्प का अक्सर उपयोग नहीं किया जाता है।

0

आप वास्तव में जीडीबी में अपवाद नहीं पकड़ रहे हैं। catch catch से catch exception पर आज़माएं।

3

एक ब्रेकपॉइंट जोड़ें जहां std::vector अपवाद फेंकता है। इस समय, कोई ढेर अनचाहे नहीं हुआ है, इसलिए आप मूल कथन पर पूरी तरह से पीछे हटने में सक्षम होना चाहिए।

मैं इस लक्ष्य को हासिल करने में सक्षम था, लेकिन केवल एक बहुत ही कार्यान्वयन से परिभाषित रास्ते में:

1) stl_vector.h में वेक्टर की सीमा चेकिंग समारोह का पता लगाएं:

_M_range_check(size_type __n) const 
{ 
    if (__n >= this->size()) 
      __throw_out_of_range(__N("vector::_M_range_check")); 
} 

2) एक जोड़े उस रेखा को तोड़ना जहां __throw_out_of_range() कहा जाता है। नोट: मैंने 'ब्रेक __throw_out_of_range' द्वारा ब्रेकपॉइंट जोड़ने का प्रयास किया लेकिन यह काम नहीं किया। इसके बजाय, मुझे ब्रेकपॉइंट को इसकी फ़ाइल और लाइन नंबर (break stl_vector.h:794) के साथ हार्डकोड करने की आवश्यकता है। आप इसे असफल रेंज चेक पर जीडीबी ब्रेक रखने के लिए अपनी .gdbinit फ़ाइल में जोड़ सकते हैं।

1

मैं msys2/mingw64 के साथ इस मुद्दे हैं और इस ब्रेकपाइंट बनाया gdb रोक जहां फेंक हुआ स्थापित करने के लिए किया था:

(gdb) b std::__throw_out_of_range_fmt 

यह भी अन्य अपवाद है, उदा साथ काम करता है std :: bad_function_call अपवाद को पकड़ने के लिए, इसका उपयोग करें:

(gdb) b std::__throw_bad_function_call 
संबंधित मुद्दे