是否可以在 valgrind 中列出泄漏内存的位置?
Is it possible to list the location of leaked memory in 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 节时,我没有找到显示块位置的方法,我希望我错过了它。有谁知道这是否可能?
注意: 这个问题的早期版本被标记为 "exact" 重复并链接到一个完全不同的问题。它问 如何 将 valgrind
用于内存泄漏 通常 ,问题的答案指定了我已经列出的选项多于。我知道如何启动 valgrind 和报告详细信息的基础知识;我不是在问那个。我在问是否有另一种选择或机制来获取不同的信息。
要获取块泄漏列表,请执行以下操作:
在 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.gdbserver
和
http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands
这是不是重复的。请看下面
运行 带有选项 --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 节时,我没有找到显示块位置的方法,我希望我错过了它。有谁知道这是否可能?
注意: 这个问题的早期版本被标记为 "exact" 重复并链接到一个完全不同的问题。它问 如何 将 valgrind
用于内存泄漏 通常 ,问题的答案指定了我已经列出的选项多于。我知道如何启动 valgrind 和报告详细信息的基础知识;我不是在问那个。我在问是否有另一种选择或机制来获取不同的信息。
要获取块泄漏列表,请执行以下操作:
在 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.gdbserver 和 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands