这不是重复的。请参阅下文。
使用选项 --track-origins=yes --leak-check=full --leak-resolution=high
运行 valgrind 会给出非常好的报告类型> 内存块肯定丢失了,哪些函数分配了它们,分配时的堆栈跟踪等。
我找不到的是导致问题的 block 的地址。例如:如果我离开了 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 ...
这里讨论的 block 的类型为unsigned long * p
。现在,p
的值为 0x1008ff2d0
。该地址是泄漏所在的位置,我知道它只是因为我设置了示例并让它打印了地址。使用上面列出的选项,valgrind 不会告诉我 p
位于 0x1008ff2d0
。它报告所涉及功能的位置;即内存泄漏的地址。这是两个不同的事情。
准确了解哪个 block 导致错误会很有帮助。在阅读手册第 4.2.8 节时,我没有找到显示 block 位置的方法,我希望我错过了它。有谁知道这是否可能?
注意:此问题的早期版本被标记为“精确”重复并链接到完全不同的问题。它询问如何使用valgrind
来解决一般情况下的内存泄漏,问题的答案指定了我上面已经列出的选项。我了解如何启动 valgrind 并报告详细信息的基础知识;我不是这么问的。我想问是否有其他选择或机制来获取不同的信息。
最佳答案
要获取 block 泄漏列表,请执行以下操作:
在 valgrind 下启动程序,使用 --vgdb-error=0 或 --vgdb-stop-at=startup
然后使用 gdb+vgdb 连接。
然后从 gdb 中,您可以设置断点并继续执行。
- 当到达断点时,您可以使用例如以下命令进行内存泄漏搜索: (gdb) 监视器泄漏完全可达任何
- 然后您可以使用例如询问泄漏 block 的详细信息 (gdb) 监视 block_list ...在此给出丢失记录 nr 或范围 ...
在用户手册中查找更多信息,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
关于memory - 是否可以在 valgrind 中列出泄漏内存的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38180262/