Zoeken…


Syntaxis

  • valgrind programma-naam optionele argumenten <testingang

Opmerkingen

Valgrind is een foutopsporingsprogramma dat kan worden gebruikt om fouten met betrekking tot geheugenbeheer in C-programma's te diagnosticeren. Valgrind kan worden gebruikt om fouten te detecteren, zoals ongeldig pointergebruik, inclusief schrijven of lezen voorbij de toegewezen ruimte, of een ongeldig gratis bellen free() . Het kan ook worden gebruikt voor het verbeteren van toepassingen door functies die geheugenprofilering uitvoeren.

Voor meer info zie http://valgrind.org .

Valgrind uitvoeren

valgrind ./my-program arg1 arg2 < test-input

Dit zal uw programma uitvoeren en een rapport produceren van alle toewijzingen en de-toewijzingen die het heeft gedaan. Het waarschuwt je ook voor veelvoorkomende fouten, zoals het gebruik van niet-geïnitialiseerd geheugen, het verwijderen van verwijzingen naar vreemde plaatsen, het afschrijven van het einde van blokken die zijn toegewezen met malloc, of het niet vrijmaken van blokken.

Vlaggen toevoegen

U kunt ook meer tests inschakelen, zoals:

valgrind -q --tool=memcheck --leak-check=yes ./my-program arg1 arg2 < test-input

Zie valgrind - help voor meer informatie over de (veel) opties, of kijk in de documentatie op http://valgrind.org/ voor gedetailleerde informatie over wat de output betekent.

Bytes verloren - Vergeten gratis

Hier is een programma dat malloc aanroept maar niet gratis:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char *s;

    s = malloc(26); // the culprint 

    return 0;
}

Zonder extra argumenten zal valgrind deze fout niet zoeken.

Maar als we --leak-check=yes of --tool=memcheck , zal het klagen en de regels weergeven die verantwoordelijk zijn voor die geheugenlekken als het programma in de foutopsporingsmodus is gecompileerd:

$ valgrind -q --leak-check=yes ./missing_free
==4776== 26 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4776==    at 0x4024F20: malloc (vg_replace_malloc.c:236)
==4776==    by 0x80483F8: main (missing_free.c:9)
==4776== 

Als het programma niet is gecompileerd in de foutopsporingsmodus (bijvoorbeeld met de vlag -g in GCC), zal het ons nog steeds laten zien waar het lek is opgetreden met betrekking tot de relevante functie, maar niet de lijnen.

Dit laat ons teruggaan en kijken naar welk blok in die regel werd toegewezen en proberen vooruit te komen om te zien waarom het niet werd vrijgegeven.

Meest voorkomende fouten bij het gebruik van Valgrind

Valgrind geeft u de regels waarop de fout is opgetreden aan het einde van elke regel in het formaat (file.c:line_no) . Fouten in valgrind worden op de volgende manier samengevat:

ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

De meest voorkomende fouten zijn:

  1. Illegale lees- / schrijffouten
==8451== Invalid read of size 2
==8451==    at 0x4E7381D: getenv (getenv.c:84)
==8451==    by 0x4EB1559: __libc_message (libc_fatal.c:80)
==8451==    by 0x4F5256B: __fortify_fail (fortify_fail.c:37)
==8451==    by 0x4F5250F: __stack_chk_fail (stack_chk_fail.c:28)
==8451==    by 0x40059C: main (valg.c:10)
==8451==  Address 0x700000007 is not stack'd, malloc'd or (recently) free'd

Dit gebeurt wanneer de code toegang begint te krijgen tot geheugen dat niet tot het programma behoort. De grootte van het geopende geheugen geeft u ook een indicatie van welke variabele is gebruikt.

  1. Gebruik van niet-geïnitialiseerde variabelen
==8795== 1 errors in context 5 of 8:
==8795== Conditional jump or move depends on uninitialised value(s)
==8795==    at 0x4E881AF: vfprintf (vfprintf.c:1631)
==8795==    by 0x4E8F898: printf (printf.c:33)
==8795==    by 0x400548: main (valg.c:7)

Volgens de fout, op regel 7 van de main van valg.c , heeft de aanroep van printf() een niet-geïnitialiseerde variabele doorgegeven aan printf .

  1. Illegaal geheugen vrijmaken
==8954== Invalid free() / delete / delete[] / realloc()
==8954==    at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954==    by 0x4005A8: main (valg.c:10)
==8954==  Address 0x5203040 is 0 bytes inside a block of size 240 free'd
==8954==    at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954==    by 0x40059C: main (valg.c:9)
==8954==  Block was alloc'd at
==8954==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954==    by 0x40058C: main (valg.c:7)

Volgens valgrind bevrijdde de code het geheugen illegaal (een tweede keer) op regel 10 van valg.c , terwijl het al was vrijgegeven op regel 9 , en het blok zelf geheugen was toegewezen op regel 7 .



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow