2012-09-27 9 views
6

Ich habe ein C-Programm (viele Numerik und zu lange zu schreiben), die ich kompilieren mitProgramm endet früh mit valgrind memcheck

gcc -g -O0 program.c -o program 

Ich versuche, es zu debuggen Gdb und Valgrind memcheck verwenden. Nach einigen Änderungen am Code fand ich, dass

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 

und viele mehr dieser Art gibt.

valgrind --tool=memcheck --max-stackframe=3841384 --log-file=output.log ./program 

druckt keine Fehler. Aber was mich verwirrt ist, dass mit beiden Valgrind-Aufrufe das Programm früh (ohne Fehlermeldungen) beendet wird und nicht die Berechnung ausführt, die es ausführen soll. Das Verhalten mit den gleichen Compiler-Optionen, aber ohne Valgrind läuft völlig anders und sieht ziemlich normal aus. Ich vermute jedoch einen Speicherfehler und möchte Valgrind verwenden, um es zu finden. Meine Frage also: Was für ein Fehler kann ein Programm so anders machen, wenn es mit valgrind ausgeführt wird? Und wenn diese Speicherfehler sind, wie kann ich sie identifizieren? Beachten Sie, dass es für mich klar ist, dass ich "von Hand debuggen" kann, um es zu finden. Aber kann ich vielleicht gdb mit valgrind ausführen, um zu sehen, wo es endet.

+1

beendet Sie verursachen wahrscheinlich einen Stapelüberlauf. Ordnen Sie "große" Arrays auf dem Stack zu? Z.B. 'double myArray [10000000];' Wenn dies der Fall ist, sollten Sie solche Zuweisungen durch 'malloc' und' free' ersetzen. –

+1

_Welche Art von Fehler kann ein Programm so anders gestalten, wenn es mit valgrind ausgeführt wird? _ Undefiniertes Verhalten. – Shahbaz

+0

Haben Sie '--leak-check = full' probiert? – Shahbaz

Antwort

3

antwortete ich ursprünglich in den Kommentaren:

Du bist wahrscheinlich einen Stapelüberlauf zu verursachen. Ordnen Sie "große" Arrays auf dem Stack zu? Z.B. double myArray[10000000]; Wenn dies der Fall ist, sollten Sie diese Zuordnungen mit Heap-Speicher unter Verwendung von malloc und free ersetzen.

Ich schrieb ein kurzes c-Programm absichtlich einen Stapelüberlauf so führen und überprüfen, was valgrind Berichte:

#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]); 

} 

Sicher genug, valgrind kommt mit:

==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 

entlang mit Tonnen von anderen Fehlermeldungen, und schließlich wird mit einem Segmentation fault: 11

+0

Die Tatsache, dass ich den Segfault nicht sehe, könnte mit der Tatsache zusammenhängen, dass mein Programm einige Signale empfängt. Ich werde es untersuchen. – highsciguy

+0

@highsciguy Gib auch einen Screenshot mit dem Code, den ich gepostet habe, um sicherzugehen, dass du den Seg-Fehler in dieser einfachen Situation siehst. –

Verwandte Themen