2011-04-19 10 views
11

मैं के रूप में किसी भी C++ अपवाद gdb कमानजीडीबी कैचपॉइंट केवल बेकार सी ++ अपवादों के लिए?

catch throw 

हालांकि साथ एक catchpoint की स्थापना करके फेंक दिया जाता है जैसे ही रोकने के लिए gdb डीबगर बता सकता हूँ, वहाँ किसी भी तरह से करने के लिए है ही तरह ध्यान में न आया सी ++ अपवाद पर रोक (सी # या जावा में)? यह कुछ परिस्थितियों में बग खोजने के लिए बहुत आसान बना देगा।

धन्यवाद!

+0

संबंधित - [मुझे यह कैसे पता चलेगा कि सी ++ में अपवाद कहाँ डाला गया था?] (Http://stackoverflow.com/q/2443135/203667) – jschmier

+0

मुझे नहीं लगता कि मैं समझता हूं - आप कैसे अपवाद निर्धारित करते हैं इसे अपरिवर्तित करने के अलावा इसे अनलॉक करने के अलावा अन्यथा बेकार है? – Mat

+0

खैर, मुझे लगता है कि जीडीबी को यह जांचना होगा कि अपवाद पकड़ा गया है या नहीं * वास्तव में ढेर को अनदेखा करने से पहले। मुझे नहीं पता कि कैसे सी # या जावा इसे हल करते हैं, लेकिन अगर मैं सी ++ में किसी भी तरह से किया जा सकता हूं तो मैं उत्सुक हूं। – emkey08

उत्तर

11

यदि कोई अपवाद बेकार है, तो विशेष लाइब्रेरी फ़ंक्शन terminate() स्वचालित रूप से कॉल किया जाता है। टर्मिनेट वास्तव में एक फ़ंक्शन के लिए एक सूचक है और डिफ़ॉल्ट मान मानक सी लाइब्रेरी फ़ंक्शन abort() है। आप abort() फ़ंक्शन पर कॉल पर ब्रेकपॉइंट सेट करने में सक्षम हो सकते हैं और वहां से बेचे गए अपवाद के स्थान की पहचान कर सकते हैं।

break abort 
... 
run 
... 
bt 

आप std::set_terminate() का उपयोग करके अपने खुद के terminate() समारोह स्थापित कर सकते हैं। आप gdb में अपने समापन समारोह पर ब्रेकपॉइंट सेट करने में सक्षम होना चाहिए। आप अपने terminate() समारोह से एक आईएसपी नामों और इस पश्व-अनुरेखन उत्पन्न करने में सक्षम हो सकता है अपवाद के स्थान की पहचान करने में मदद मिल सकती है। अतिरिक्त विवरण here प्रदान किए जाते हैं।

+0

धन्यवाद, यह set_terminate() के साथ मेरे लिए काम करता है - g ++ 4.5.0 का उपयोग करके, gdb 7.2 – emkey08