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

Memory 是否可以列出valgrind中泄漏内存的位置?,memory,memory-leaks,valgrind,Memory,Memory Leaks,Valgrind,这不是重复的。请参见下文。 使用选项运行valgrind--track origins=yes--leak check=full--leak resolution=high可以很好地报告哪些类型的内存块肯定会丢失,哪些函数分配了它们,分配时的堆栈跟踪,等等 我找不到导致问题的块的地址。例如:如果我取消了一个自由,那么valgrind会给我以下输出: ==94998== 56 (24 direct, 32 indirect) bytes in 1 blocks are definitely los

这不是重复的。请参见下文。

使用选项运行valgrind
--track origins=yes--leak check=full--leak resolution=high
可以很好地报告哪些类型的内存块肯定会丢失,哪些函数分配了它们,分配时的堆栈跟踪,等等

我找不到导致问题的块的地址。例如:如果我取消了一个
自由
,那么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 ...
这里讨论的块具有类型
无符号长*p
。现在,
p
有一个值,
0x1008ff2d0
。这个地址就是漏洞所在的地方,我之所以知道它,是因为我设置了这个示例&让它打印了这个地址。使用上面列出的选项,valgrind不会告诉我
p
位于
0x1008ff2d0
。报告所涉及职能的位置;i、 例如,内存泄漏的地址。这是两件不同的事情

准确地知道是哪个块导致错误可能会有所帮助。在阅读手册第4.2.8节时,我没有找到显示块位置的方法,我希望我错过了它。有人知道这是否可能吗


注意:此问题的早期版本被标记为“完全”重复,并链接到一个完全不同的问题。它询问了如何使用
valgrind
来处理一般的内存泄漏,问题的答案指定了我上面列出的选项。我知道如何开始valgrind和报告详细信息的基础知识;我不是这样问的。我在问是否有其他选项或机制来获取不同的信息。

要获得块泄漏列表,请执行以下操作:

  • 在valgrind下启动程序,使用--vgdb error=0或--vgdb stop at=startup

  • 然后使用gdb+vgdb连接

  • 然后从gdb,您可以放置断点并继续执行

  • 当到达断点时,您可以使用。 (gdb)在任何情况下都可以监控泄漏
  • 然后,您可以使用例如。 (gdb)监视器块列表。。。请在此提供损失记录编号或范围
在用户手册中找到更多信息,a.o。 和

我从未使用过该选项,但valgrind的core有一个--read var info=[默认值:否]选项。描述是:启用时,Valgrind将从DWARF3调试信息中读取有关变量类型和位置的信息。这大大减慢了Valgrind的启动速度,并使其使用了更多的内存,但对于可以利用它的工具(Memcheck、Helgrind、DRD),它可能会导致更精确的错误消息。这是它的链接。你知道为什么要走这条路吗?Valgrind用自己的定制malloc替换malloc;这就是它一开始就知道泄漏的原因。我想它知道泄密是因为它知道他们的地址。为什么它不能只列出地址而不检查所有信息?(投票支持你,所以我不是在争论,只是好奇。)接下来:看看链接中的第一个例子。它列出了未初始化指针错误的地址,尽管用户未使用该选项(
地址0x80497f7是数据符号“global_i2”内的7个字节
)。所以valgrind知道指针的地址,即使没有这个选项。我明白你的意思,但是不,我不知道你为什么要走那条路线。第一个例子似乎暗示你不应该需要它,所以这可能对你没有任何帮助。。。我使用的是clang+lldb。你知道它是这样工作的吗?(也不是对你的答案的批评,但是,如果这是唯一的方法,那似乎有些过头了。Valgrind确实报告了一些指针错误的地址;见上面的评论。)我不同意它是否有用(例如,我上周真的可以使用它),你的答案让我担心lldb(使用OSX,所以我不确定我有多少选择)但是它看起来是正确的答案,并且评论很有帮助。谢谢!@phd在我的情况下,我的项目有很多记录对象地址的可用日志语句。如果Valgrind给我泄漏的地址,我可以找到它是哪个对象,它是在哪个上下文中创建的,当它的引用计数增加但没有随着我的增加而减少时n块等@phd我还想插话说,拥有泄漏块的地址会很有帮助。通过详细的跟踪/日志记录语句,它可以帮助缩小泄漏源的范围。例如,我可以将泄漏块的地址与对象ID关联。然后我可以对该对象上的操作进行详细的日志记录。