2012-02-10 10 views
18

मैं एक सी प्रोग्राम डीबग करने की कोशिश कर रहा हूं और जीडीबी मुझे बता रहा है कि एक निश्चित फ़ंक्शन के लाइन 32 9 पर एक सेगफॉल्ट है। इसलिए मैंने उस फ़ंक्शन के लिए ब्रेक पॉइंट सेट किया है और मैं इसके माध्यम से कदम उठाने की कोशिश कर रहा हूं। हालांकि, जब भी मैं लाइन 68 पर जाता हूं तो मुझे यह शिकायत gdb से मिलती है:gdb सत्र में विफल होने के लिए कॉल करें

(gdb) step 
68    next_bb = (basic_block *)malloc(sizeof(basic_block)); 
(gdb) step 
*__GI___libc_malloc (bytes=40) at malloc.c:3621 
3621 malloc.c: No such file or directory. 
in malloc.c 

मुझे नहीं पता कि इसका क्या अर्थ है। कार्यक्रम सभी पर इनपुट के एक सेट पर पूरी तरह से चलता है, इसलिए कार्यक्रम के अन्य निष्पादन के दौरान मॉलोक को यह कॉल स्पष्ट रूप से सफल होता है। और, बेशक, मेरे पास है:

// Block currently being built. 
    basic_block *next_bb = NULL; 
    // Traverse the list of instructions in the procedure. 
    while (curr_instr != NULL) 
    { 
     simple_op opcode = curr_instr->opcode; 
     // If we are not currently building a basic_block then we must start a new one. 
     // A new block can be started with any kind of instruction. 
     if (!in_block) 
     { 
      // Create a new basic_block. 
      next_bb = (basic_block *)malloc(sizeof(basic_block)); 
+2

malloc सबसे संभावित कारण विफल हो रहा है ढेर भ्रष्टाचार है। क्या आपने अपने कार्यक्रम को वालग्रिंड के तहत चलाने की कोशिश की है? – JaredPar

+4

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

+0

आह, धन्यवाद, 'अगला' इसे ठीक किया गया। – Schemer

उत्तर

22

आप सुरक्षित रूप से इस उपेक्षा कर सकते हैं:

#include <stdlib.h>. 

यहाँ स्रोत कोड है। जीडीबी शिकायत कर रहा है कि इसमें मॉलोक का स्रोत नहीं है - और यह लगभग निश्चित है कि आप स्रोत के माध्यम से कदम नहीं उठाना चाहते हैं।

दो आसान समाधान:

  • उपयोग next कदम के बजाय - यह कार्यों में उतर नहीं होंगे

  • आप पहले से ही एक समारोह में गलती से step एड कर दिया है तो finish उपयोग करने के लिए चलाने के लिए समारोह का वापसी विवरण।

और एक वैकल्पिक दृष्टिकोण:

  • तुम भी थोड़ा segfault से पहले, बल्कि पूरे कोड के माध्यम से कदम से तोड़ सकते थे।

    • (उदाहरण के break foo.c:320 के लिए foo.c की लाइन 320 पर तोड़ने के लिए) break <source file>:<line num> साथ एक विशेष लाइन पर एक ब्रेकपाइंट रख कर ऐसा कर सकते हैं।
    • या आप break <function name> के साथ किसी विशेष फ़ंक्शन को तोड़ सकते हैं (उदाहरण के लिए break foofoo() फ़ंक्शन के शीर्ष पर टूट जाएगा)।