2008-09-30 12 views
15

लिनक्स पर्यावरण में, "glibc का पता चला *** मुक्त(): अमान्य सूचक" त्रुटियां, मैं कोड की कौन सी पंक्ति को पहचानूं इसका कारण बन रहा है?"ग्लिब का पता चला *** मुक्त(): अमान्य सूचक"

क्या गर्भपात करने का कोई तरीका है? मुझे याद है कि इसे नियंत्रित करने के लिए एक एनएनवी var है?

glibc त्रुटि के लिए gdb में ब्रेकपॉइंट कैसे सेट करें?

+0

मुझे लगता है कि इस प्रश्न को विशिष्ट सिस्टम पर निर्भर विभिन्न उत्तरों की आवश्यकता है और यह लिनक्स तक सीमित नहीं है (जैसे ओपनबीएसडी, ओएसएक्स)। Valgrind को बढ़ावा देने के लिए – rwst

उत्तर

3

सामान्यतः, ऐसा लगता है कि आपको ग्लिबैक को फिर से कंपाइल करना पड़ सकता है, उह।

आप नहीं है का कहना है कि क्या पर्यावरण तुम पर चला रहे हैं, लेकिन अगर आप ओएस एक्स के लिए अपने कोड पुन: संयोजित कर सकते हैं, तो libc के इसके संस्करण एक नि: शुल्क है() है कि इस वातावरण चर को सुनता है:

MallocErrorAbort    If set, causes abort(3) to be called if an 
           error was encountered in malloc(3) or 
           free(3) , such as a calling free(3) on a 
           pointer previously freed. 

ओएस एक्स पर मुफ्त() के लिए मैन पेज में अधिक जानकारी है।

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

+0

+1;) – 0xC0000022L

3

जीडीबी में ब्रेकपॉइंट कैसे सेट करें?

(जीडीबी) बी फ़ाइल नाम: linenumber // उदा। बी main.cpp: 100

क्या गर्भपात करने का कोई तरीका है? मुझे याद है कि इसे नियंत्रित करने के लिए एक एनएनवी var है?

मैं इस धारणा के तहत था कि यह डिफ़ॉल्ट रूप से निरस्त हो गया था। सुनिश्चित करें कि आपके पास डीबग संस्करण स्थापित है।

या libdmalloc5 का उपयोग करें:। "सिस्टम के malloc', realloc के लिए प्रतिस्थापन में ड्रॉप ', calloc', मुक्त' और अन्य स्मृति प्रबंधन दिनचर्या जबकि कार्यावधि में शक्तिशाली डिबगिंग सुविधाओं विन्यास उपलब्ध कराने के इन सुविधाओं स्मृति रिसाव पर नज़र रखने के रूप में ऐसी बातें शामिल हैं, fence- पोस्ट लिखने का पता लगाने, फ़ाइल/लाइन नंबर रिपोर्टिंग, और आंकड़ों के सामान्य लॉगिंग। "

अपने लिंक आदेश

-L/usr/lib/debug/lib -ldmallocth 

gdb को यह जोड़े स्वचालित रूप से नियंत्रण लौट जाना चाहिए जब glibc एक बीच में बंद करें चलाता है।

या आप एसआईजीएबीआरटी के लिए एक सिग्नल हैंडलर सेट कर सकते हैं ताकि स्टैकट्रैक को एफडी (फाइल डिस्क्रिप्टर) में डंप किया जा सके। नीचे, mp_logfile एक फ़ाइल *

void *array[512/sizeof(void *)]; // 100 is just an arbitrary number of backtraces, increase if you want. 
size_t size; 

size = backtrace (array, 512/sizeof(void *)); 
backtrace_symbols_fd (array, size, fileno(mp_logfile)); 
7

मैं सुझाव है कि आप valgrind मिलता है:

valgrind --tool = Memcheck --leak की जांच = पूर्ण ./a.out

+2

आपके पास एकाधिक रन होंगे इसलिए वर्तमान समय के आधार पर फ़ाइल नाम पर आउटपुट करने के लिए valgrind प्राप्त करें। valgrind - tool = memcheck --leak-check = full --log-file = 'date +% s'-vg.txt ./a.out –

15

मैं अगर आप मानते हैं setenv MALLOC_CHECK_ से 2, glibc abort() पर कॉल करेगा जब यह "मुक्त(): अमान्य सूचक" त्रुटि का पता लगाएगा। पर्यावरण चर के नाम पर पिछला अंडरस्कोर नोट करें।

यदि MALLOC_CHECK_ 1 glibc "मुक्त(): अमान्य सूचक" (और अन्य त्रुटियों के लिए समान प्रिंटफ) प्रिंट करेगा।यदि MALLOC_CHECK_ 0 है, तो glibc चुपचाप ऐसी त्रुटियों को अनदेखा कर देगा और बस वापस आ जाएगा। यदि MALLOC_CHECK_ है 3 glibc संदेश प्रिंट करेगा और फिर abort() पर कॉल करें। अर्थात। यह एक बिटमास्क है।

आप mallopt(M_CHECK_ACTION, arg) पर 0-3 के तर्क के साथ भी कॉल कर सकते हैं, और MALLOC_CHECK_ के साथ ही परिणाम प्राप्त कर सकते हैं।

चूंकि आप "मुक्त(): अमान्य सूचक" संदेश देख रहे हैं, मुझे लगता है कि आपको पहले से ही MALLOC_CHECK_ सेट करना होगा या mallopt() पर कॉल करना होगा। डिफ़ॉल्ट रूप से glibc उन संदेशों को मुद्रित नहीं करता है।

इसे डीबग करने के तरीके के रूप में, SIGABRT के लिए हैंडलर स्थापित करना शायद आगे बढ़ने का सबसे अच्छा तरीका है। आप अपने हैंडलर में ब्रेकपॉइंट सेट कर सकते हैं या जानबूझकर कोर डंप ट्रिगर कर सकते हैं।

+0

मैं MALLOC_CHECK कहां सेट कर सकता हूं ताकि यह प्रभावी हो? –

+0

'$ निर्यात MALLOC_CHECK_ = 2' – KAction

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

  • कोई संबंधित समस्या नहीं^_^