Übersicht
Valgrind bietet verschiedene 'Tools', um verschiedene Arten von Problemen zu analysieren. Das am häufigsten verwendete Tool ist 'Memcheck', das zur Laufzeit Speicherfehler erkennt. Andere Tools umfassen Cachegrind (Cache-Profiling), Callgrind (Funktionsaufruf-Profiling), Helgrind/DRD (Thread-Fehlererkennung) und Massif (Heap-Profiling).
Hauptfunktionen
Valgrind bietet die folgenden Hauptfunktionen:
- Erkennung von Speicherlecks (Memory Leak Detection)
- Erkennung von ungültigen Speicherzugriffen (Invalid Memory Access)
- Erkennung der Verwendung von nicht initialisierten Werten (Use of Uninitialised Values)
- Erkennung von Heap-Beschädigungen (Heap Corruption)
- Erkennung von Thread-Race-Conditions (Race Condition Detection)
- Profiling von CPU-Cache und Funktionsaufrufen (CPU Cache & Call Profiling)
Installation
Valgrind ist auf den meisten Linux-Distributionen nicht standardmäßig enthalten und muss daher über den Paketmanager installiert werden.
Debian/Ubuntu
sudo apt update
sudo apt install valgrind
Installation mit dem APT-Paketmanager.
RHEL/CentOS/Fedora
sudo yum install valgrind # oder sudo dnf install valgrind
Installation mit dem YUM- oder DNF-Paketmanager.
Wichtige Optionen
Valgrind wird mit verschiedenen Tools verwendet, und jedes Tool hat seine eigenen Optionen. Hier werden hauptsächlich die Optionen beschrieben, die mit dem Memcheck-Tool und allgemein verwendet werden.
Allgemeine Optionen
Memcheck-Optionen
Erzeugter Befehl:
Kombinieren Sie die Befehle.
Beschreibung:
`valgrind` Führen Sie den Befehl aus.
Kombinieren Sie diese Optionen und führen Sie die Befehle virtuell zusammen mit der KI aus.
Anwendungsbeispiele
Verschiedene Beispiele für die Analyse von Programmen mit Valgrind. Es wird angenommen, dass eine ausführbare Datei namens `my_program` verwendet wird.
Grundlegende Speicherfehlerprüfung
valgrind ./my_program
Die grundlegendste Verwendung zur Überprüfung von Speicherfehlern in `my_program`.
Detaillierte Speicherleck-Prüfung
valgrind --leak-check=full --show-leak-kinds=all ./my_program
Berichtet alle Speicherfehler, einschließlich Speicherlecks, detailliert und zeigt alle Arten von Lecks an.
Verfolgung nicht initialisierter Werte
valgrind --track-origins=yes ./my_program
Verfolgt und berichtet die Herkunft nicht initialisierter Werte, wenn diese verwendet werden.
Cache-Profiling mit Cachegrind
valgrind --tool=cachegrind ./my_program
Analysiert die CPU-Cache-Nutzung, um Performance-Engpässe zu finden. Die Ergebnisse werden in der Datei `cg.out.<pid>` gespeichert.
Funktionsaufruf-Profiling mit Callgrind
valgrind --tool=callgrind ./my_program
Analysiert die Anzahl und Kosten von Funktionsaufrufen. Die Ergebnisse werden in der Datei `callgrind.out.<pid>` gespeichert.
Tipps & Hinweise
Tipps und zu beachtende Punkte für die effektive Nutzung von Valgrind.
Einbeziehung von Debug-Symbolen
Damit Valgrind die korrekten Dateinamen und Zeilennummern melden kann, müssen Sie beim Kompilieren des Programms Debug-Symbole einbeziehen (z. B. mit der Option `-g` bei GCC/Clang).
- Verwenden Sie die Option `-g` beim Kompilieren: `gcc -g my_program.c -o my_program`
Performance-Overhead
Da Valgrind Programme in einer virtuellen Maschine ausführt, ist es deutlich langsamer als die normale Ausführung (5- bis 100-mal langsamer). Daher ist es möglicherweise nicht für performance-kritische Tests oder lang laufende Programme geeignet.
- Erhöhte Ausführungszeit: 5- bis 100-mal langsamer als die normale Ausführung
- Vorsicht bei der Analyse großer Programme
Interpretation der Ausgabe
Die Ausgabe von Valgrind ist detailliert, kann aber anfangs komplex erscheinen. Lesen Sie die Fehlermeldungen und Stack-Traces sorgfältig durch und konzentrieren Sie sich insbesondere auf die Meldungen 'definitely lost' (sicher verlorene Speicherbereiche), um diese zu beheben.
- Analyse von Fehlermeldungen und Stack-Traces
- Priorisieren Sie die Behebung von 'definitely lost'-Lecks
Nutzung anderer Tools
Neben Memcheck gibt es auch verschiedene andere Tools wie Cachegrind, Callgrind und Massif. Wählen Sie je nach Bedarf das passende Tool aus.
- Performance-Analyse: `cachegrind`, `callgrind`
- Heap-Nutzungsanalyse: `massif`
- Thread-Probleme: `helgrind`, `drd`