Valgrind ist eine Werkzeug-Suite, die Programme in einer eigenen Laufzeitumgebung instrumentiert und dadurch Speicherfehler, Daten-Races und Performance-Engpässe aufspürt. Das wichtigste Werkzeug ist Memcheck (Standard), das ungültige Zugriffe, Benutzung nicht initialisierten Speichers und Speicherlecks meldet.
Speicherfehler prüfen (Memcheck)
valgrind ./programm
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./programm
valgrind --error-exitcode=1 ./programm # Exit-Code 1 bei Fehlern (CI)
Damit Valgrind Quellcode-Zeilen melden kann, muss das Programm mit Debug-Informationen übersetzt werden (gcc -g oder g++ -g). --leak-check=full zeigt jeden Speicherleck einzeln, --track-origins=yes hilft bei nicht initialisiertem Speicher, --error-exitcode=1 lässt Build-Pipelines bei gefundenen Fehlern scheitern.
Threads und Performance
valgrind --tool=helgrind ./thread-programm # Daten-Races finden
valgrind --tool=drd ./thread-programm # alternative Race-Erkennung
valgrind --tool=callgrind ./programm # Call-Graph-Profil
valgrind --tool=massif ./programm # Heap-Nutzung profilieren
Die Werkzeug-Suite umfasst Memcheck, Helgrind, DRD, Cachegrind, Callgrind und Massif. Helgrind und DRD erkennen Daten-Races in nebenläufigen Programmen, Callgrind erzeugt eine Datei callgrind.out.<pid>, die sich mit callgrind_annotate auswerten lässt; Massif schreibt massif.out.<pid> für ms_print. Cachegrind profiliert die Cache-Nutzung.
Praxis-Tipps
- Valgrind verlangsamt Programme stark (Faktor 10–50) — nur für Tests, nicht für Produktivläufe.
- Typische Meldungen:
Invalid read of size 4,definitely lost: 40 bytes. - Wer Daten-Races nicht mit Helgrind klären kann, findet Konzepte unter Race Condition.
Verwandte Grundlagen: GDB-Befehle, GCC-Befehle, strace-Befehle, objdump-Befehle, Compiler.