jeudi 5 janvier 2012

Verifie ton code C/C++ avec valgrind

Apres avoir cree son programme C et C++, on a beau etre super bon, les jours de fatigue, on risque d'avoir place inconsciemment quelques erreurs relatives a l'allocation ou l'acces memoire.
Heureusement, le petit utilitaire Valgrind est la pour nous sauver (sous Linux ou Mac)!

L'installation est simple:
- on recupere les dernieres soures ici
- on extrait les fichiers
- on va dans le repertoire cree
- depuis le terminal, on tape "./configure", puis "make", et enfin "sudo make install"

on verifie que tout marche bien en tapant un petit "valgrind ls -l"

Pour tester son programme, que l'on lance d'habitude comme ceci: "./mon_prog arg1 arg2"
il faut s'assurer que l'on a compile avec l'option -g, Ex: "gcc -o mon_prog -g mon_prog.c"

Le test se fait en lancant une commande du genre: "valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./mon_prog arg1 arg2"




Remarque: sous macos 10.6 au moins, un printf() (voire d'autres fonctions utilisant stout) dans le code va allouer une zone memoire qui ne sera pas liberee en sortie explicitement par le programme (Ca sera purge par l'OS normalement!).
On se retrouve avec un message sous Valgrind du style:
4,096 bytes in 1 blocks are still reachable in loss record 2 of 2
at 0x100012679: malloc (vg_replace_malloc.c:266)
by 0x10006FF4D: __smakebuf (in /usr/lib/libSystem.B.dylib)
by 0x10006FEB9: __swsetup (in /usr/lib/libSystem.B.dylib)
by 0x10002CC13: __vfprintf (in /usr/lib/libSystem.B.dylib)
by 0x10006FE0A: vfprintf_l (in /usr/lib/libSystem.B.dylib)
by 0x10009D482: printf (in /usr/lib/libSystem.B.dylib)
by 0x10000224C: main (mon_prog.c:547)

LEAK SUMMARY:
definitely lost: 0 bytes in 0 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 4,096 bytes in 1 blocks
Pas besoin de s'en occuper!
Si ca derange, on peut fermer a la main stdout avec un petit: fclose( stdout );
..en esperant qu'il n'y ait pas de fonction executee a la terminaison ( atexit() ) qui utilise stdout..

Aucun commentaire:

Enregistrer un commentaire