是否可以在valgrind中列出泄漏内存的位置?

时间:2016-07-04 08:41:27

标签: memory memory-leaks valgrind

这是重复。请参阅下文。

使用选项--track-origins=yes --leak-check=full --leak-resolution=high运行valgrind可以很好地报告内存块的肯定会丢失,哪些函数分配它们,分配时的堆栈跟踪等

我找不到的是导致问题的块的地址。例如:如果我离开free,那么valgrind会给我这个输出:

==94998== 56 (24 direct, 32 indirect) bytes in 1 blocks are definitely lost in loss record 46 of 109
==94998==    at 0x1000A5E6B: malloc (vg_replace_malloc.c:302)
==94998==    by 0x1000ED43D: operator new(unsigned long) (in /usr/lib/libc++.1.dylib)
... more deleted ...

此处有问题的区块有unsigned long * p类型。现在,p的值为0x1008ff2d0。该地址是泄漏所在的 ,我知道这只是因为我设置了示例&打印地址。使用上面列出的选项,valgrind不会告诉我p位于0x1008ff2d0。它报告所涉及的职能的位置;即,内存泄漏的地址 。这是两件不同的事情。

准确了解哪个块导致错误可能会有所帮助。在阅读本手册第4.2.8节时,我没有找到显示块位置的方法,我希望我错过了它。有谁知道这是否可行?

注意:此问题的早期版本被标记为“完全”重复并链接到完全不同的问题。它询问如何使用valgrind进行内存泄漏一般,并且问题的答案指定了我已在上面列出的选项。我知道如何启动valgrind并报告详细信息的基础知识;我不是那么问的。我在问是否有其他选择或机制来获取不同的信息。

1 个答案:

答案 0 :(得分:3)

要使块列表泄漏,请执行以下操作:

  • 在valgrind下启动程序,使用--vgdb-error = 0或使用--vgdb-stop-at = startup

  • 然后使用gdb + vgdb连接。

  • 然后从gdb中,您可以放置​​断点并继续执行。

  • 当达到断点时,您使用例如进行内存泄漏搜索。 (gdb)监视器泄漏完全可达
  • 然后,您可以使用例如问题来询问泄漏块的详细信息。 (gdb)monitor block_list ...给这里丢失记录nr或范围......

在用户手册中查找更多信息,a.o。 http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserverhttp://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands