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.