C Language
Valgrind
Sök…
Syntax
- valgrind programnamn option-argumenter < testinmatning
Anmärkningar
Valgrind är ett felsökningsverktyg som kan användas för att diagnostisera fel angående minneshantering i C-program. Valgrind kan användas för att upptäcka fel som ogiltig pointeranvändning, inklusive att skriva eller läsa förbi det tilldelade utrymmet, eller ringa ett ogiltigt samtal free()
. Det kan också användas för att förbättra applikationer genom funktioner som utför minneprofilering.
För mer information se http://valgrind.org .
Kör Valgrind
valgrind ./my-program arg1 arg2 < test-input
Detta kommer att köra ditt program och producera en rapport över alla tilldelningar och avdelningar som det gjorde. Det kommer också att varna dig om vanliga fel som att använda uninitialiserat minne, avlägsna pekare till konstiga platser, skriva av slutet på block som tilldelats med malloc eller misslyckas med att frigöra block.
Lägga till flaggor
Du kan också aktivera fler tester, till exempel:
valgrind -q --tool=memcheck --leak-check=yes ./my-program arg1 arg2 < test-input
Se valgrind - hjälp för mer information om (många) alternativ, eller titta på dokumentationen på http://valgrind.org/ för detaljerad information om vad utgången innebär.
Bytes förlorade - glömmer att frigöra
Här är ett program som kallar malloc men inte gratis:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *s;
s = malloc(26); // the culprint
return 0;
}
Utan extra argument kommer valgrind inte att leta efter det här felet.
Men om vi slår på - --leak-check=yes
eller - --tool=memcheck
, kommer det att klaga och visa raderna som är ansvariga för dessa minnesläckor om programmet kompilerades i felsökningsläge:
$ 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==
Om programmet inte kompileras i felsökningsläge (till exempel med -g
flaggan i GCC) kommer det fortfarande att visa oss var läckan inträffade i termer av den relevanta funktionen, men inte linjerna.
Detta låter oss gå tillbaka och titta på vilket block som tilldelades i den raden och försöka spåra framåt för att se varför det inte frigjordes.
De vanligaste fel som uppstått vid användning av Valgrind
Valgrind ger dig raderna vid vilka felet inträffade i slutet av varje rad i formatet (file.c:line_no)
. Fel i valgrind sammanfattas på följande sätt:
ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
De vanligaste felen inkluderar:
- Olagliga läs- / skrivfel
==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
Detta händer när koden börjar få åtkomst till minne som inte tillhör programmet. Storleken på det åtkomna minnet ger dig också en indikation på vilken variabel som användes.
- Användning av oinitialiserade variabler
==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)
Enligt felet, vid linjen 7 av main
av valg.c
, anropet till printf()
passerade en oinitierad variabel till printf
.
- Olaglig frigörelse av minne
==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)
Enligt valgrind befriade koden olagligt (en andra gång) på rad 10 i valg.c
, medan det redan befriades på rad 9 , och själva blocket tilldelades minne på rad 7 .