web-dev-qa-db-fra.com

Terminer le processus en cours d'exécution à l'intérieur de Valgrind

Tuer le processus valgrind lui-même ne laisse aucun rapport sur l'exécution du processus interne.

Est-il possible d'envoyer un signal de fin à un processus s'exécutant à l'intérieur de valgrind?

31
Antonio Pérez

Il n'y a pas de "processus interne" car valgrind lui-même et le programme client qu'il exécute s'exécutent en un seul processus.

Les signaux envoyés à ce processus seront transmis au programme client comme d'habitude. Si le signal provoque la fin du processus, les gestionnaires de sortie normaux de valgrind s'exécutent et (par exemple) signalent toute fuite.

Ainsi, par exemple, si nous démarrons valgrind sur une commande sleep:

bericote [~] % valgrind sleep 240
==9774== Memcheck, a memory error detector
==9774== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==9774== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==9774== Command: sleep 240
==9774== 

puis tuez cette commande:

bericote [~] % kill -TERM 9774

alors le processus se terminera et les gestionnaires de sortie de valgrind s'exécuteront:

==9774== 
==9774== HEAP SUMMARY:
==9774==     in use at exit: 0 bytes in 0 blocks
==9774==   total heap usage: 30 allocs, 30 frees, 3,667 bytes allocated
==9774== 
==9774== All heap blocks were freed -- no leaks are possible
==9774== 
==9774== For counts of detected and suppressed errors, rerun with: -v
==9774== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
[1]    9774 terminated  valgrind sleep 240

La seule exception serait pour kill -9 comme dans ce cas le processus est tué par le noyau sans jamais être informé du signal, donc valgrind n'a aucune possibilité de faire quoi que ce soit.

29
TomH