2008-09-23 11 views
13

इसका मतलब क्या है जब यह निम्न आउटपुट के साथ बैकट्रैक देता है?जीडीबी बैकट्रैक संदेश "0x0000000000000000 में ??()" का क्या अर्थ है?

#0 0x00000008009c991c in pthread_testcancel() from /lib/libpthread.so.2 
#1 0x00000008009b8120 in sigaction() from /lib/libpthread.so.2 
#2 0x00000008009c211a in pthread_mutexattr_init() from /lib/libpthread.so.2 
#3 0x0000000000000000 in ??() 

कार्यक्रम एक मानक संकेत 11, विभाजन गलती से दुर्घटनाग्रस्त हो गया है। मेरा आवेदन थ्रेडिंग लाइब्रेरी के रूप में pthread का उपयोग करके फ्रीबीएसडी 6.3 पर चल रहे एक बहु-थ्रेडेड फास्टसीजीआई सी ++ प्रोग्राम है।

इसे -g के साथ संकलित किया गया है और मेरे स्रोत के लिए सभी प्रतीक तालिकाओं को लोड किया गया है, सूचना स्रोतों के अनुसार।

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

EDIT: अंततः क्रैश को मेरे मुख्य कोड में एक मानक अमान्य मेमोरी एक्सेस तक ट्रैक किया गया। यह समझ में नहीं आता है कि स्टैक ट्रेस दूषित क्यों हुआ था, लेकिन यह एक और दिन के लिए एक प्रश्न है :)

उत्तर

9

gdb pthread_mutexattr_init से उचित वापसी पता निकालने में सक्षम नहीं था; इसे 0 का पता मिला। "??" प्रतीक तालिका में पता 0 देखने का नतीजा है। यह एक प्रतीकात्मक नाम नहीं मिल रहा है, इसलिए यह एक डिफ़ॉल्ट "??" प्रिंट करता है

दुर्भाग्यवश सही ऑफहैंड मुझे नहीं पता कि यह सही रिटर्न पता क्यों निकाला नहीं जा सका।

3

सुनिश्चित करें कि आप डीबग प्रतीकों के साथ संकलित हैं। (जीसीसी के लिए मुझे लगता है कि -जी विकल्प है)। फिर आप जीडीबी से अधिक दिलचस्प जानकारी प्राप्त करने में सक्षम होना चाहिए। जब आप उत्पादन संस्करण संकलित करते हैं तो इसे बंद करना न भूलें।

0

शायद बग जिसने दुर्घटना को ढेर तोड़ दिया है (ढेर के ओवरराइट किए गए हिस्सों)? उस स्थिति में, बैकट्रैक बेकार हो सकता है; कोई फर्क नहीं पड़ता कि उस मामले में क्या करना है ...

5

कुछ ऐसा जो आपने थ्रेडिंग लाइब्रेरी को क्रैश करने का कारण बनाया था। चूंकि थ्रेडिंग लाइब्रेरी को डीबगिंग प्रतीकों (-g) के साथ संकलित नहीं किया गया है, इसलिए यह स्रोत कोड फ़ाइल या क्रैश होने वाली लाइन संख्या प्रदर्शित नहीं कर सकता है। इसके अतिरिक्त, चूंकि यह धागे हैं, कॉल स्टैक आपकी फ़ाइल पर वापस इंगित नहीं करता है। दुर्भाग्यवश यह ट्रैक करने के लिए एक कठिन बग होगा, आपको अपने कोड के माध्यम से कदम उठाने की आवश्यकता होगी और जब दुर्घटना होती है तो कोशिश करें और संकुचित करें।

2

मुझे कुछ याद आ रहा है, लेकिन क्या यह NULL का उपयोग किसी फ़ंक्शन पॉइंटर के रूप में करने वाला नहीं है?

#include <stdio.h> 

typedef int (*funcptr)(void); 

int 
func_caller(funcptr f) 
{ 
    return (*f)(); 
} 

int 
main() 
{ 
    return func_caller(NULL); 
} 

अगर आप इसे gdb में चलाते हैं तो यह एक पश्व-अनुरेखन की उसी शैली का उत्पादन:

rivendell$ gcc -g -O0 foo.c -o foo 
rivendell$ gdb --quiet foo 
Reading symbols for shared libraries .. done 
(gdb) r 
Starting program: ... 
Reading symbols for shared libraries . done 

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000 
0x00000000 in ??() 
(gdb) bt 
#0 0x00000000 in ??() 
#1 0x00001f9d in func_caller (f=0) at foo.c:8 
#2 0x00001fb1 in main() at foo.c:14 

यह एक बहुत अजीब दुर्घटना हालांकि है ... pthread_mutexattr_init शायद ही कभी होता कुछ भी से भी अधिक डेटा संरचना का आवंटन और memset यह। मैं कुछ और चल रहा था। क्या मिस्डेटेड थ्रेडिंग लाइब्रेरीज़ या कुछ की संभावना है। मेरा बीएसडी ज्ञान थोड़ा दिनांकित है, लेकिन इसके आसपास के मुद्दे थे।

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