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.
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. –
_Welche Art von Fehler kann ein Programm so anders gestalten, wenn es mit valgrind ausgeführt wird? _ Undefiniertes Verhalten. – Shahbaz
Haben Sie '--leak-check = full' probiert? – Shahbaz