Startpagina > Omgeving & hulpmiddelen > valgrind

valgrind: geheugen debuggen en profileren tool

valgrind is een krachtige set tools die wordt gebruikt om geheugenbeheerfouten (zoals geheugenlekken, ongeldige geheugentoegang) in programma's te detecteren, thread-gerelateerde problemen (race conditions) te vinden en prestatieprofilering uit te voeren. Het wordt voornamelijk gebruikt voor het debuggen van C/C++ programma's.

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`

Hétzelfde categoriecommando