Overzicht
valgrind biedt verschillende 'tools' om verschillende soorten problemen te analyseren. De meest gebruikte tool is 'Memcheck', die geheugenfouten tijdens runtime detecteert. Andere tools zijn Cachegrind (cache profiling), Callgrind (functieaanroep profileren), Helgrind/DRD (thread bug detectie), Massif (heap profileren), enz.
Belangrijkste functies
valgrind biedt de volgende belangrijke functies:
- Detectie van geheugenlekken (Memory Leak Detection)
- Detectie van ongeldige geheugentoegang (Invalid Memory Access)
- Detectie van gebruik van niet-geïnitialiseerde waarden (Use of Uninitialised Values)
- Detectie van heap corruptie (Heap Corruption)
- Detectie van thread race conditions (Race Condition Detection)
- CPU cache en functieaanroep profileren (CPU Cache & Call Profiling)
Installatie
valgrind is niet standaard inbegrepen in de meeste Linux-distributies, dus u moet het installeren via de pakketbeheerder.
Debian/Ubuntu
sudo apt update
sudo apt install valgrind
Installeer met de APT-pakketbeheerder.
RHEL/CentOS/Fedora
sudo yum install valgrind # of sudo dnf install valgrind
Installeer met de YUM- of DNF-pakketbeheerder.
Belangrijkste opties
valgrind wordt gebruikt met verschillende tools, en elke tool heeft zijn eigen opties. Hier worden de opties beschreven die voornamelijk met de Memcheck-tool en algemeen worden gebruikt.
Algemene opties
Memcheck opties
Gegenereerde opdracht:
Probeer de opdrachtcombinaties.
Uitleg:
`valgrind` Voer het commando uit.
Combineer deze opties en voer de opdracht virtueel uit met de AI.
Gebruiksvoorbeelden
Diverse voorbeelden van het analyseren van programma's met valgrind. De voorbeelden gaan ervan uit dat u een uitvoerbaar bestand genaamd `my_program` gebruikt.
Basis geheugenfoutcontrole
valgrind ./my_program
De meest basale manier om geheugenfouten in `my_program` te controleren.
Gedetailleerde controle op geheugenlekken
valgrind --leak-check=full --show-leak-kinds=all ./my_program
Rapporteert alle geheugenfouten gedetailleerd, inclusief geheugenlekken, en toont alle soorten lekken.
Traceren van niet-geïnitialiseerde waarden
valgrind --track-origins=yes ./my_program
Wanneer niet-geïnitialiseerde waarden worden gebruikt, traceert en rapporteert het de oorsprong van die waarden.
Cache profileren met Cachegrind
valgrind --tool=cachegrind ./my_program
Analyseert het CPU-cachegebruik om prestatieknelpunten te vinden. De resultaten worden opgeslagen in het bestand `cg.out.<pid>`.
Functieaanroep profileren met Callgrind
valgrind --tool=callgrind ./my_program
Analyseert het aantal functieaanroepen en de kosten. De resultaten worden opgeslagen in het bestand `callgrind.out.<pid>`.
Tips & Aandachtspunten
Tips voor het effectief gebruiken van valgrind en dingen waar u op moet letten.
Debugsymbolen opnemen
Om ervoor te zorgen dat valgrind de juiste bestandsnamen en regelnummers rapporteert, moet u debugsymbolen opnemen bij het compileren van uw programma (bijvoorbeeld met de `-g` optie in GCC/Clang).
- Gebruik de `-g` optie tijdens het compileren: `gcc -g my_program.c -o my_program`
Prestatieoverhead
valgrind voert programma's uit in een virtuele machine, dus het is veel langzamer dan normale uitvoering (5 tot 100 keer of meer). Daarom is het mogelijk niet geschikt voor prestatiegevoelige tests of programma's die langdurig draaien.
- Verhoogde uitvoeringstijd: 5-100 keer langzamer dan normale uitvoering
- Wees voorzichtig bij het analyseren van grote programma's
Output interpreteren
De output van valgrind is gedetailleerd, maar kan in het begin complex lijken. Lees de foutmeldingen en stack traces zorgvuldig, en concentreer u vooral op 'definitely lost' (zekere lekken) meldingen om deze op te lossen.
- Analyseer foutmeldingen en stack traces
- Los eerst 'definitely lost' lekken op
Gebruik andere tools
Naast Memcheck zijn er verschillende andere tools zoals Cachegrind, Callgrind, Massif, dus kies de juiste tool op basis van uw behoeften.
- Prestatieanalyse: `cachegrind`, `callgrind`
- Heapgebruiksanalyse: `massif`
- Threadproblemen: `helgrind`, `drd`