2009-07-12 10 views
89

मैं एक बहुप्रचारित एप्लिकेशन पर काम कर रहा हूं, और मैं इसे जीडीबी का उपयोग करके डीबग करना चाहता हूं।एक अपवाद होने तक जीडीबी में एक एप्लिकेशन चलाएं

समस्या है, मेरी धागे से एक संदेश के साथ मरने रखता है:

pure virtual method called 
terminate called without an active exception 
Abort 

मुझे लगता है कि संदेश का कारण पता है, लेकिन मुझे नहीं पता कि जहाँ मेरे सूत्र में यह तब होता है की है। एक बैकट्रैक वास्तव में सहायक होगा।

जब मैं अपना ऐप जीडीबी में चलाता हूं, तो यह हर बार थ्रेड को निलंबित या फिर से शुरू करने पर रोक देता है। मैं चाहता हूं कि मेरा ऐप सामान्य रूप से चल रहा है जब तक कि उस अपवाद के साथ धागे में से कोई भी मर न जाए, जिस बिंदु पर सब कुछ रोकना चाहिए ताकि मैं बैकट्रैक प्राप्त कर सकूं।

+0

यह रोकता है जब जीडीबी रिपोर्टिंग क्या संकेत है? आप @ जेफरीहिल उत्तर में 'SIGUSR1 पास noprint nostop' – Hasturkun

उत्तर

126

आप एक "catchpoint" का उपयोग कोशिश कर सकते हैं (catch throw) पर एक ब्रेकपाइंट बिंदु है जहां अपवाद उत्पन्न होता है पर डिबगर को रोकने के लिए।

निम्नलिखित excerpt जीडीबी मैनुअल से पकड़ बिंदु सुविधा का वर्णन करता है।


5.1.3 स्थापना catchpoints

आप catchpoints उपयोग कर सकते हैं डिबगर जैसे C++ अपवाद या किसी साझा लाइब्रेरी की लोडिंग के रूप में कार्यक्रम की घटनाओं, के कुछ प्रकार के लिए बंद करने के लिए पैदा करने के लिए। कैचपॉइंट सेट करने के लिए कैच कमांड का उपयोग करें।

  • पकड़ घटना जब घटना होता

    बंद करो। घटना के बाद से कोई भी हो सकता है:

    • फेंक

      एक C++ अपवाद के फेंक।

    • पकड़

      एक C++ अपवाद के पकड़ने।

    • कार्यकारी

      एक कॉल exec करने के लिए। यह वर्तमान में केवल एचपी-यूएक्स के लिए उपलब्ध है।

    • कांटा

      एक कांटा करने के लिए कॉल। यह वर्तमान में केवल एचपी-यूएक्स के लिए उपलब्ध है।

    • vfork

      एक कॉल vfork करने के लिए। यह वर्तमान में केवल एचपी-यूएक्स के लिए उपलब्ध है।

    • लोड या लोड libname

      किसी भी शेयर की गई लाइब्रेरी के गतिशील लोड हो रहा है, या पुस्तकालय libname की लोडिंग। यह वर्तमान में केवल एचपी-यूएक्स के लिए उपलब्ध है।

    • अनलोड या अनलोड libname

      किसी भी गतिशील रूप से साझा लोड पुस्तकालय की उतराई, या पुस्तकालय libname की उतराई। यह वर्तमान में केवल एचपी-यूएक्स के लिए उपलब्ध है।

  • tcatch घटना

    एक catchpoint है कि केवल एक पड़ाव के लिए सक्षम किया गया है निर्धारित करें। पहली बार घटना पकड़े जाने के बाद पकड़ बिंदु स्वचालित रूप से हटा दिया जाता है।

उपयोग info break आदेश वर्तमान catchpoints सूची।

वर्तमान से निपटने (पकड़ फेंक और पकड़ पकड़) GDB में सेल्सियस तक ++ अपवाद कुछ सीमाएं हैं:

* If you call a function interactively, GDB normally returns control to you when the function has finished executing. If the call raises an exception, however, the call may bypass the mechanism that returns control to you and cause your program either to abort or to simply continue running until it hits a breakpoint, catches a signal that GDB is listening for, or exits. This is the case even if you set a catchpoint for the exception; catchpoints on exceptions are disabled within interactive calls. 

* You cannot raise an exception interactively. 

* You cannot install an exception handler interactively. 

कभी कभी पकड़ डिबग अपवाद संचालन करने के लिए सबसे अच्छा तरीका नहीं है: यदि आप वास्तव में, जहां एक जानने की जरूरत अपवाद उठाया जाता है, अपवाद हैंडलर कहने से पहले इसे रोकना बेहतर होता है, इस तरह से आप किसी भी अनचाहे होने से पहले स्टैक देख सकते हैं। यदि आप इसके बजाय अपवाद हैंडलर में ब्रेकपॉइंट सेट करते हैं, तो यह पता लगाना आसान नहीं होगा कि अपवाद कहाँ उठाया गया था।

अपवाद हैंडलर कहने से ठीक पहले रोकने के लिए, आपको कार्यान्वयन के कुछ ज्ञान की आवश्यकता है।

/* addr is where the exception identifier is stored. 
    id is the exception identifier. */ 
void __raise_exception (void **addr, void *id); 

डिबगर पकड़ सभी अपवादों से पहले किसी भी स्टैक जगह लेता है, पर एक ब्रेकपाइंट सेट करने के लिए: जीएनयू सी ++ के मामले में, अपवाद एक पुस्तकालय समारोह नामित __raise_exception जो निम्नलिखित एएनएसआई सी इंटरफ़ेस है फोन करके उठाए गए हैं __raise_exception (अनुभाग ब्रेकपॉइंट्स; वॉचपॉइंट्स और अपवाद देखें)।

एक सशर्त ब्रेकपॉइंट (अनुभाग ब्रेक स्थितियां देखें) के साथ जो आईडी के मान पर निर्भर करता है, जब आप एक विशिष्ट अपवाद उठाए जाते हैं तो आप अपने प्रोग्राम को रोक सकते हैं। जब आप कई अपवाद उठाए जाते हैं तो आप अपने प्रोग्राम को रोकने के लिए कई सशर्त ब्रेकपॉइंट्स का उपयोग कर सकते हैं।

+0

कृपया 100 वें अपवॉट करें। – YSC

5

सेट __pure_virtual

+0

' जैसे कमांड चलाने में सक्षम होना चाहिए, इसे अब __cxa_pure_virtual कहा जाता है। मुझे नहीं पता कि खुद को कैसे जांचें, इसलिए मैं जवाब संपादित नहीं करना चाहता हूं। मैं डाउन-वोट का इरादा नहीं रखता, लेकिन जवाब अब गलत हो सकता है और इसे किसी ऐसे व्यक्ति द्वारा संपादित किया जाना चाहिए जो सही जानता है। –

3

स्पष्ट रूप से, जीसीसी 4.1 में, एफडब्ल्यूआईडब्ल्यू, उपयुक्त फ़ंक्शन नाम बदल गया है और किसी को इस फ़ंक्शन में ब्रेकपॉइंट सेट करना होगा।

__cxa_pure_virtual

संबंधित मुद्दे