gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:15:27 25 4
gpt4 key购买 nike

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

使用选项 --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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com