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

标签 memory memory-leaks valgrind

不是重复的。请参阅下文。

使用选项 --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.gdbserverhttp://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands

关于memory - 是否可以在 valgrind 中列出泄漏内存的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38180262/

相关文章:

python - wxpython 应用程序中严重的内存泄漏

macos - Valgrind 支持 Mac OS 10.8 吗?

c++ - 如何使用 Valgrind 检测段错误细节?

php - memory_limit : How does it work?

内存分配时的 C++ 错误

memory - 用户逻辑内存和虚拟内存有什么区别?

Javascript 闭包 : Memory Leak

windows-phone-7 - Windows Phone 内存泄漏 90MB - 只有两个静态页面

memory - 为什么是字节可寻址存储器而不是 4 字节可寻址存储器?

c++ - 为什么在我启动新线程时 Valgrind 会出现段错误