如何从 Valgrind 获取完整的调用堆栈?

问题描述 投票:0回答:2

我使用以下参数运行Valgrind

--leak-check=full --show-reachable=yes --leak-resolution=high --num-callers=100 --trace-children=yes

在内存泄漏日志中,我看到一些错误消息,其中包含完整的堆栈跟踪到主程序,但有些消息如下所示:

==3956== 1,999,140 (68,796 direct, 1,930,344 indirect) bytes in 5,733 blocks are definitely lost in loss record 8,842 of 8,845
==3956==    at 0x4022AB8: malloc (vg_replace_malloc.c:207)
==3956== 

如何获取这些错误的完整堆栈跟踪?

memory-leaks valgrind callstack
2个回答
31
投票

获取完整的堆栈跟踪将需要可能涉及泄漏的所有库/可执行文件的调试符号(并且在

--num-callers
设置的限制内)。

如果您自己构建其中任何一个,则需要在 gcc 中指定

-g
标志(或任何其他编译器中的相关标志)。

请注意,并非万无一失,有时可能会错过泄漏或无法提供完整的堆栈跟踪(特别是当您使用线程或复杂的

class
实现时)。

对于没有调试信息的库,堆栈跟踪将停止在该库处。

对于免费工具来说, 非常擅长它的功能,但是像 IBM 这样的地方可以以大笔价格出售内存配置文件是有原因的。


0
投票

我遇到了类似的问题,Valgrind 仅在堆栈跟踪中显示库文件。我设法通过指定

--num-callers=500
来解决这个问题,这使得它显示到 main.cpp 的完整堆栈跟踪。 (
--num-callers
的默认值为 12,对于某些库来说太低了)。

© www.soinside.com 2019 - 2024. All rights reserved.