2012-03-15 2 views
5

Я хочу проверить длительный процесс утечки памяти с помощью valgrind. Я подозреваю, что утечка памяти, которую я после этого, может произойти только после нескольких часов исполнения. Я могу запустить приложение под valgrind и получить журнал valgrind просто отлично, но это означает, что я должен выйти из приложения и снова запустить его заново для нового сеанса valgrind, для которого мне все равно придется ждать несколько часов. Можно ли держать valgrind и приложение запущенным и по-прежнему получать данные valgrind (частичные) в любой момент во время выполнения?Может ли valgrind выводить частичные отчеты, не выходя из профилированного приложения?

ответ

8

Вы можете сделать это, используя Valgrind gdbserver and GDB.

Короче говоря, вы начинаете вашу программу с Valgrind, как обычно, но с --vgdb=yes переключатель:

$ valgrind --tool=memcheck --vgdb=yes ./a.out 

В другой сессии, вы начинаете GDB на тот же исполняемый файл, и подключиться к Valgrind. Вы можете оформить VALGRIND команды:

$ gdb ./a.out 
... 
(gdb) target remote | vgdb 
.... 
(gdb) monitor leak_check full reachable any 
==8677== 32 bytes in 1 blocks are definitely lost in loss record 1 of 2 
==8677== at 0x4C28E3D: malloc (vg_replace_malloc.c:263) 
==8677== by 0x400591: foo (in /home/me/tmp/a.out) 
==8677== by 0x4005A7: main (in /home/me/tmp/a.out) 
==8677== 
==8677== 32 bytes in 1 blocks are definitely lost in loss record 2 of 2 
==8677== at 0x4C28E3D: malloc (vg_replace_malloc.c:263) 
==8677== by 0x400591: foo (in /home/me/tmp/a.out) 
==8677== by 0x4005AC: main (in /home/me/tmp/a.out) 
==8677== 
==8677== LEAK SUMMARY: 
==8677== definitely lost: 64 bytes in 2 blocks 
==8677== indirectly lost: 0 bytes in 0 blocks 
==8677==  possibly lost: 0 bytes in 0 blocks 
==8677== still reachable: 0 bytes in 0 blocks 
==8677==   suppressed: 0 bytes in 0 blocks 
==8677== 
(gdb) 

Смотрите руководство для списка команд, here для MemCheck.