Ricerca…


Sintassi

  • valgrind nome-programma argomenti facoltativi < test input

Osservazioni

Valgrind è uno strumento di debug che può essere utilizzato per diagnosticare errori relativi alla gestione della memoria nei programmi C. Valgrind può essere utilizzato per rilevare errori come l'utilizzo di un puntatore non valido, inclusa la scrittura o la lettura oltre lo spazio allocato, oppure effettuare una chiamata non valida a free() . Può anche essere utilizzato per migliorare le applicazioni attraverso funzioni che gestiscono il profiling della memoria.

Per maggiori informazioni vedi http://valgrind.org .

Esecuzione di Valgrind

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

Questo eseguirà il tuo programma e produrrà un report di eventuali allocazioni e de-allocazioni che ha fatto. Ti avviserà anche di errori comuni come l'uso di memoria non inizializzata, i puntatori di dereferenziamento in posti strani, la cancellazione della fine dei blocchi allocati usando malloc, o il fallimento dei blocchi liberi.

Aggiungere bandiere

Puoi anche attivare altri test, come ad esempio:

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

Vedi valgrind --help per maggiori informazioni sulle (molte) opzioni, o guarda la documentazione su http://valgrind.org/ per informazioni dettagliate su cosa significa l'output.

Byte persi - Dimenticare di liberare

Ecco un programma che chiama malloc ma non è gratuito:

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

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

    s = malloc(26); // the culprint 

    return 0;
}

Senza argomenti aggiuntivi, valgrind non cercherà questo errore.

Ma se --leak-check=yes o --tool=memcheck , si lamenterà e mostrerà le linee responsabili di quelle perdite di memoria se il programma è stato compilato in modalità debug:

$ 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== 

Se il programma non è compilato in modalità debug (ad esempio con il flag -g in GCC) ci mostrerà comunque dove si è verificata la perdita in termini della funzione rilevante, ma non delle righe.

Questo ci permette di tornare indietro e vedere quale blocco è stato allocato in quella linea e provare a tracciare in avanti per capire perché non è stato liberato.

Errori più comuni riscontrati durante l'utilizzo di Valgrind

Valgrind ti fornisce le linee in cui si è verificato l'errore alla fine di ogni riga nel formato (file.c:line_no) . Gli errori in valgrind sono riassunti nel modo seguente:

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

Gli errori più comuni includono:

  1. Errori di lettura / scrittura non validi
==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

Questo accade quando il codice inizia ad accedere alla memoria che non appartiene al programma. La dimensione della memoria a cui si accede fornisce anche un'indicazione di quale variabile è stata utilizzata.

  1. Uso di variabili non inizializzate
==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)

Secondo l'errore, alla riga 7 del main di valg.c , la chiamata a printf() passato una variabile non inizializzata a printf .

  1. Liberazione illegale della memoria
==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)

Secondo valgrind, il codice liberava la memoria illegalmente (una seconda volta) alla riga 10 di valg.c , mentre era già liberato alla riga 9 , e il blocco stesso era allocata nella memoria alla riga 7 .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow