这是不重复。请参阅下文。
使用选项--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并报告详细信息的基础知识;我不是那么问的。我在问是否有其他选择或机制来获取不同的信息。
答案 0 :(得分:3)
要使块列表泄漏,请执行以下操作:
在valgrind下启动程序,使用--vgdb-error = 0或使用--vgdb-stop-at = startup
然后使用gdb + vgdb连接。
然后从gdb中,您可以放置断点并继续执行。
在用户手册中查找更多信息,a.o。 http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserver 和 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands