C Language
Valgrind
Suche…
Syntax
- valgrind Programmname optionale Argumente < Testeingabe
Bemerkungen
Valgrind ist ein Debugging-Tool, mit dem Fehler in Bezug auf die Speicherverwaltung in C-Programmen diagnostiziert werden können. Valgrind kann verwendet werden, um Fehler wie die Verwendung eines ungültigen Zeigers zu erkennen, z. B. das Schreiben oder Lesen über den zugewiesenen Speicherplatz hinaus oder einen ungültigen Aufruf von free()
. Es kann auch zur Verbesserung von Anwendungen durch Funktionen verwendet werden, die die Speicherprofilerstellung durchführen.
Weitere Informationen finden Sie unter http://valgrind.org .
Valgrind laufen lassen
valgrind ./my-program arg1 arg2 < test-input
Dadurch wird Ihr Programm ausgeführt und ein Bericht über allfällige Zuweisungen und Abgaben erstellt. Außerdem werden Sie vor häufigen Fehlern gewarnt, z. B. mit nicht initialisiertem Speicher, der Deferenzierung von Zeigern auf fremde Stellen, dem Abschreiben des mit malloc zugewiesenen Blocks oder der fehlgeschlagenen Freigabe der Blöcke.
Flaggen hinzufügen
Sie können auch weitere Tests aktivieren, z.
valgrind -q --tool=memcheck --leak-check=yes ./my-program arg1 arg2 < test-input
Weitere Informationen zu den (vielen) Optionen finden Sie unter valgrind --help. Ausführliche Informationen zur Bedeutung der Ausgabe finden Sie in der Dokumentation unter http://valgrind.org .
Bytes verloren - vergessen vergessen
Hier ist ein Programm, das malloc aber nicht frei aufruft:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *s;
s = malloc(26); // the culprint
return 0;
}
Ohne zusätzliche Argumente sucht valgrind nicht nach diesem Fehler.
Wenn Sie jedoch --leak-check=yes
oder --tool=memcheck
, werden die Zeilen für diese Speicherverluste beschwert und angezeigt, wenn das Programm im Debug-Modus kompiliert wurde:
$ valgrind -q --leak-check=yes ./missing_free
==4776== 26 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4776== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==4776== by 0x80483F8: main (missing_free.c:9)
==4776==
Wenn das Programm nicht im Debug-Modus kompiliert wird (beispielsweise mit dem Flag -g
in GCC), zeigt es uns immer noch an, wo das Leck in Bezug auf die betreffende Funktion aufgetreten ist, nicht jedoch die Zeilen.
Dadurch können wir zurückgehen und sehen, welcher Block in dieser Zeile zugewiesen wurde, und versuchen, vorwärts zu suchen, um zu sehen, warum er nicht freigegeben wurde.
Die häufigsten Fehler bei der Verwendung von Valgrind
Valgrind liefert Ihnen die Zeilen, in denen der Fehler am Ende jeder Zeile im Format (file.c:line_no)
. Fehler in valgrind werden folgendermaßen zusammengefasst:
ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Zu den häufigsten Fehlern gehören:
- Illegale Lese- / Schreibfehler
==8451== Invalid read of size 2
==8451== at 0x4E7381D: getenv (getenv.c:84)
==8451== by 0x4EB1559: __libc_message (libc_fatal.c:80)
==8451== by 0x4F5256B: __fortify_fail (fortify_fail.c:37)
==8451== by 0x4F5250F: __stack_chk_fail (stack_chk_fail.c:28)
==8451== by 0x40059C: main (valg.c:10)
==8451== Address 0x700000007 is not stack'd, malloc'd or (recently) free'd
Dies geschieht, wenn der Code beginnt, auf Speicher zuzugreifen, der nicht zum Programm gehört. Die Größe des Speichers, auf den zugegriffen wird, zeigt auch an, welche Variable verwendet wurde.
- Verwendung von nicht initialisierten Variablen
==8795== 1 errors in context 5 of 8:
==8795== Conditional jump or move depends on uninitialised value(s)
==8795== at 0x4E881AF: vfprintf (vfprintf.c:1631)
==8795== by 0x4E8F898: printf (printf.c:33)
==8795== by 0x400548: main (valg.c:7)
Entsprechend dem Fehler hat der Aufruf von printf()
in Zeile 7 des main
von valg.c
eine nicht initialisierte Variable an printf
.
- Illegale Befreiung der Erinnerung
==8954== Invalid free() / delete / delete[] / realloc()
==8954== at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954== by 0x4005A8: main (valg.c:10)
==8954== Address 0x5203040 is 0 bytes inside a block of size 240 free'd
==8954== at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954== by 0x40059C: main (valg.c:9)
==8954== Block was alloc'd at
==8954== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954== by 0x40058C: main (valg.c:7)
Laut valgrind hat der Code den Speicher illegal (ein zweites Mal) in Zeile 10 von valg.c
, wohingegen er bereits in Zeile 9 freigegeben wurde und der Block selbst in Zeile 7 Speicher zugewiesen wurde.