2012-09-27 8 views
6

साथ जल्दी समाप्त हो जाता है मैं एक सी 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 का उपयोग करना चाहते हैं। मेरा सवाल इसलिए है: वाल्ग्रिंड के साथ निष्पादित होने पर किस प्रकार की त्रुटि प्रोग्राम को इतनी अलग तरीके से बना सकती है? और यदि ये स्मृति संबंधित त्रुटियां हैं तो मैं इसे कैसे पहचान सकता हूं? ध्यान दें कि यह मुझे स्पष्ट है कि मैं इसे ढूंढने के लिए "हाथ से डीबग" कर सकता हूं। लेकिन क्या मैं शायद यह देखने के लिए वाल्ग्रिंड के साथ जीडीबी चला सकता हूं कि यह कहां से निकलता है।

+1

के साथ छोड़ देता है आप शायद एक स्टैक ओवरफ़्लो कर रहे हैं। क्या आप ढेर पर "बड़े" सरणी आवंटित कर रहे हैं? जैसे 'डबल myArray [10000000];' यदि ऐसा है तो आपको 'malloc' और 'free' का उपयोग करके ढेर स्मृति के साथ ऐसे आवंटन को प्रतिस्थापित करना चाहिए। –

+1

_ वाल्ग्रिंड के साथ निष्पादित होने पर किस प्रकार की त्रुटि प्रोग्राम को इतनी अलग तरीके से बना सकती है? _ अपरिभाषित व्यवहार। – Shahbaz

+0

क्या आपने '--leak-check = full' की कोशिश की है? – Shahbaz

उत्तर

3

मैं मूल रूप से टिप्पणी में उत्तर दिया:

आप शायद एक ढेर अतिप्रवाह के कारण कर रहे हैं। क्या आप ढेर पर "बड़े" सरणी आवंटित कर रहे हैं? जैसे double myArray[10000000]; यदि ऐसा है तो आप को malloc और free का उपयोग करके हीप मेमोरी के साथ ऐसे आवंटन को प्रतिस्थापित करना चाहिए।

मैं एक छोटी सी कार्यक्रम लिखा जानबूझकर इस तरह एक ढेर अतिप्रवाह कारण और जाँच क्या valgrind रिपोर्टों के:

==83869== Warning: client switching stacks? SP change: 0x104802930 --> 0xffbb7520 
==83869==   to suppress, use: --max-stackframe=80000016 or greater 
==83869== Invalid write of size 8 
==83869== at 0x100000ED0: main (in ./a.out) 
==83869== Address 0xffbb7520 is on thread 1's stack 
साथ

:

#include <stdio.h> 

int main(){ 

    // imax*sizeof(double) is too big for the stack. 
    int imax = 10000000; 
    double test[imax]; 

    // I do a little math to prevent the stack overflow from being optimized away if -O3 is used. 
    test[0]=0; 
    test[1]=1; 
    for(int i=2; i<imax; i++) 
    test[i]=0.5*(test[i-1]+test[i-2]); 
    printf("%e\n", test[imax-1]); 

} 

पर्याप्त ज़रूर, valgrind साथ आता है कई अन्य त्रुटि संदेशों के साथ, और अंततः Segmentation fault: 11

+0

तथ्य यह है कि मुझे सेगफॉल्ट नहीं दिख रहा है, इस तथ्य से संबंधित हो सकता है कि मेरा कार्यक्रम कुछ संकेत प्राप्त करता है। मैं इसकी जांच करूंगा। – highsciguy

+0

@highsciguy इसे यह भी सुनिश्चित करने के लिए पोस्ट किए गए कोड के साथ एक शॉट दें कि आप उस साधारण स्थिति में सीजी गलती देखते हैं। –

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