2009-11-02 14 views
7

मैं एक कार्यक्रम के साथ नाकाम रहने के होते हैं:मैं सी में gdb में St9bad_alloc विफलताओं को कैसे डीबग कर सकता हूं?

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): St9bad_alloc 

मैं कल्पना यह malloc/free के साथ कुछ है, लेकिन मैं जो एक नहीं पता है।

मैं जीडीबी सेट में क्या ब्रेकपॉइंट कर सकता हूं जो त्रुटि को तोड़ देगा ताकि मैं एक स्टैक ट्रेस देख सकूं?

कार्यक्रम सीसीसी और सी ++ का संयोजन है, जो जीसीसी 3.4.2 के साथ संकलित है।

उत्तर

12

यह वास्तव में मॉलोक/मुक्त नहीं है जो अपवाद का कारण बनता है, यह "नया" है जो निश्चित रूप से आपके आवेदन के सी ++ हिस्से में है। ऐसा लगता है कि आप एक पैरामीटर प्रदान कर रहे हैं जो आवंटित करने के लिए "नया" के लिए बहुत बड़ा है।

'std :: bad_alloc' उदाहरण के लिए निम्न कोड के कारण होता है:

int * p = new int[50000000]; 

पश्व-अनुरेखन क्या कहते होती है जब आप gdb में क्रैश डंप लोड? यदि आप डंप उत्पन्न नहीं कर सकते हैं, तो आप when exception is thrown or caught को रोकने के लिए जीडीबी से पूछ सकते हैं। दुर्भाग्य से, GDB समर्थन केवल निम्न सिंटैक्स के कुछ संस्करणों:

catch throw 

जो जब किसी भी अपवाद फेंक दिया जाता है कि आप आवेदन को तोड़ने के लिए अनुमति देता है। हालांकि, मदद में आप देखते हैं कि यह नए संस्करण में

catch throw std::bad_alloc 

को चलाने के लिए संभव हो जाना चाहिए।

और भूल नहीं है कि:

(gdb) मदद पकड़

अन्य उपयोगी जानकारी के लिए एक अच्छा स्रोत है।

+0

"जब अपवाद फेंक दिया या पकड़ा गया" के लिए आपका लिंक 404 है। – Karl

0

यह काफी संभव है कि कुछ स्मृति को अधिलेखित करने के कारण ऐसा होता है, इस प्रकार स्मृति आवंटन प्रणाली के राज्य को दूषित करता है (जिसे आमतौर पर स्मृति में ब्लॉक मेमोरी ब्लॉक से पहले या बाद में रखा जाता है)।

यदि आपके पास संभावना है (यानी, आप x86 लिनक्स पर हैं), तो अपने प्रोग्राम को Valgrind पर चलाएं, यह अक्सर आपको दिखाता है कि भ्रष्टाचार कहां होता है।

0

मेरे पास ऐसी फ़ाइल में पढ़ने की कोशिश करते समय ऐसा हुआ है जो मौजूद नहीं है ... मैं फ़ाइल सामग्री के लिए एक आंतरिक बफर बनाने का प्रयास करता हूं, लेकिन क्योंकि फ़ाइल मौजूद नहीं थी, इसलिए मेरा निर्माण बफर खराब हो गया।

int lenth_bytes; 
length_bytes = in_file.tellg(); 
new char [length_bytes]; // length_bytes hadn't been initialised!!!! 

बच्चों को याद रखें, हमेशा अपने चर शुरू करें: डी और शून्य मामलों की जांच करें।

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