Accueil
 1  Debugging
 2  Utilisation d'un Debugger
 3  Valgrind
 4  Pointeurs de fonction
   
   
   
   
 

 Contacts

W3C validator

Département INF  
 Titre du cours


3 Valgrind

  • Outils de débugging et de profilage
    • Détection de fuites mémoire
    • Utilisation de variables non initialisées
  • valgrind [programme]

    previous     next 


Valgrind peut détecter l’utilisation de variables non initialisées. Par exemple, la non initialisation de n dans instructions suivantes est détectée par valgrind:

  int n; 
  printf("%d$\n", n);
  $ valgrind ./exemple_valgrind 
==1148== Memcheck, a memory error detector 
==1148== Copyright (C) 2002-2015, and GNU GPLd, by Julian Seward et al. 
==1148== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info 
==1148== Command: ./exemple_valgrind 
==1148== 
==1148== Conditional jump or move depends on uninitialised value(s) 
==1148==    at 0x4E7F2D3: vfprintf (vfprintf.c:1631) 
==1148==    by 0x4E86AC8: printf (printf.c:33) 
==1148==    by 0x400504: foo (exemple_valgrind.c:6) 
==1148==    by 0x400529: main (exemple_valgrind.c:13) 
==1148== 
==1148== Use of uninitialised value of size 8 
==1148==    at 0x4E7C06B: _itoa_word (_itoa.c:179) 
==1148==    by 0x4E7F87C: vfprintf (vfprintf.c:1631) 
==1148==    by 0x4E86AC8: printf (printf.c:33) 
==1148==    by 0x400504: foo (exemple_valgrind.c:6) 
==1148==    by 0x400529: main (exemple_valgrind.c:13) 
==1148== 
[...] 
==1148== 
5 
==1148== 
==1148== HEAP SUMMARY: 
==1148==     in use at exit: 0 bytes in 0 blocks 
==1148==   total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated 
==1148== 
==1148== All heap blocks were freed -- no leaks are possible 
==1148== 
==1148== For counts of detected and suppressed errors, rerun with: -v 
==1148== Use --track-origins=yes to see where uninitialised values come from 
==1148== ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 0 from 0)

Valgrind détecte également les fuites mémoire. Lorsqu’une zone mémoire allouée avec malloc() n’est pas libérée (avec free()), la zone mémoire peut être “perdue”. L’effet peut être grave si la fuite mémoire survient fréquemment. Par exemple, un serveur web qui perdrait quelques octets lors du traitement d’une requête web, pourrait perdre plusieurs gigaoctets de mémoire après le traitement de millions de requêtes.

Valgrind détecte ce type de fuites mémoire. Pour obtenir des informations sur l’origine de la fuite, on peut utiliser l’option –leak-check=full :

$ valgrind  --leak-check=full ./exemple_valgrind2 
==1572== Memcheck, a memory error detector 
==1572== Copyright (C) 2002-2015, and GNU GPLd, by Julian Seward et al. 
==1572== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info 
==1572== Command: ./exemple_valgrind2 
==1572== 
85823552 
==1572== 
==1572== HEAP SUMMARY: 
==1572==     in use at exit: 1,024 bytes in 1 blocks 
==1572==   total heap usage: 2 allocs, 1 frees, 2,048 bytes allocated 
==1572== 
==1572== 1,024 bytes in 1 blocks are definitely lost in loss record 1 of 1 
==1572==    at 0x4C2BBCF: malloc (vg_replace_malloc.c:299) 
==1572==    by 0x40054E: main (exemple_valgrind2.c:7) 
==1572== 
==1572== LEAK SUMMARY: 
==1572==    definitely lost: 1,024 bytes in 1 blocks 
==1572==    indirectly lost: 0 bytes in 0 blocks 
==1572==      possibly lost: 0 bytes in 0 blocks 
==1572==    still reachable: 0 bytes in 0 blocks 
==1572==         suppressed: 0 bytes in 0 blocks 
==1572== 
==1572== For counts of detected and suppressed errors, rerun with: -v 
==1572== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

François Trahay, Télécom SudParis, CSC4103 – Programmation système, 2019–2020