साथ जल्दी समाप्त हो जाता है मैं एक सी programm (numerics का एक बहुत और बहुत लंबा पोस्ट करने के लिए) है जो मैंकार्यक्रम valgrind Memcheck
gcc -g -O0 program.c -o program
मैं gdb और valgrind Memcheck का उपयोग कर इसे डिबग करने के लिए कोशिश कर रहा हूँ के साथ संकलन। कोड पर कुछ बदलाव करने के बाद मैंने पाया कि
valgrind --tool=memcheck --log-file=output.log ./program
देता
==15866== Memcheck, a memory error detector
==15866== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==15866== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==15866== Command: ./program
==15866== Parent PID: 3362
==15866==
==15866== Warning: client switching stacks? SP change: 0xbe88bcd8 --> 0xbe4e1f70
==15866== to suppress, use: --max-stackframe=3841384 or greater
==15866== Invalid write of size 4
==15866== at 0x804B7BE: main (program.c:1396)
==15866== Address 0xbe4e1f74 is on thread 1's stack
==15866==
==15866== Invalid write of size 4
==15866== at 0x804B7C2: main (program.c:1396)
==15866== Address 0xbe4e1f70 is on thread 1's stack
==15866==
==15866== Invalid read of size 4
==15866== at 0x4320011: on_exit (on_exit.c:34)
==15866== by 0x43064D2: (below main) (libc-start.c:226)
==15866== Address 0xbe4e1f70 is on thread 1's stack
==15866==
==15866== Invalid read of size 4
==15866== at 0x4320022: on_exit (on_exit.c:37)
==15866== by 0x43064D2: (below main) (libc-start.c:226)
==15866== Address 0xbe4e1f74 is on thread 1's stack
और इस तरह के कई और।
valgrind --tool=memcheck --max-stackframe=3841384 --log-file=output.log ./program
किसी भी त्रुटि को मुद्रित नहीं करता है। लेकिन मुझे क्या पहेली है कि दोनों वाल्ग्रिंड कॉल के साथ प्रोग्राम प्रारंभिक (बिना त्रुटि संदेशों के) बाहर निकलता है और यह गणना नहीं करता है। समान कंपाइलर विकल्पों के साथ व्यवहार लेकिन बिना वाल्ग्रिंड के चलते पूरी तरह से अलग है और बहुत सामान्य दिखता है। मुझे एक स्मृति त्रुटि पर संदेह है हालांकि इसे खोजने के लिए valgrind का उपयोग करना चाहते हैं। मेरा सवाल इसलिए है: वाल्ग्रिंड के साथ निष्पादित होने पर किस प्रकार की त्रुटि प्रोग्राम को इतनी अलग तरीके से बना सकती है? और यदि ये स्मृति संबंधित त्रुटियां हैं तो मैं इसे कैसे पहचान सकता हूं? ध्यान दें कि यह मुझे स्पष्ट है कि मैं इसे ढूंढने के लिए "हाथ से डीबग" कर सकता हूं। लेकिन क्या मैं शायद यह देखने के लिए वाल्ग्रिंड के साथ जीडीबी चला सकता हूं कि यह कहां से निकलता है।
के साथ छोड़ देता है आप शायद एक स्टैक ओवरफ़्लो कर रहे हैं। क्या आप ढेर पर "बड़े" सरणी आवंटित कर रहे हैं? जैसे 'डबल myArray [10000000];' यदि ऐसा है तो आपको 'malloc' और 'free' का उपयोग करके ढेर स्मृति के साथ ऐसे आवंटन को प्रतिस्थापित करना चाहिए। –
_ वाल्ग्रिंड के साथ निष्पादित होने पर किस प्रकार की त्रुटि प्रोग्राम को इतनी अलग तरीके से बना सकती है? _ अपरिभाषित व्यवहार। – Shahbaz
क्या आपने '--leak-check = full' की कोशिश की है? – Shahbaz