Может ли valgrind выводить частичные отчеты, не выходя из профилированного приложения? - PullRequest
6 голосов
/ 15 марта 2012

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

1 Ответ

12 голосов
/ 15 марта 2012

Вы можете сделать это, используя Valgrind gdbserver и 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) 

Список команд см. В руководстве, здесь , чтобы проверить memcheck.

...