2012-03-15 35 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的列表。