Memory leaks 如何从Valgrind获得完整的调用堆栈?

Memory leaks 如何从Valgrind获得完整的调用堆栈?,memory-leaks,valgrind,callstack,Memory Leaks,Valgrind,Callstack,我使用以下参数运行: --leak-check=full --show-reachable=yes --leak-resolution=high --num-callers=100 --trace-children=yes 在内存泄漏日志中,我看到了一些错误消息,其中包含到main的完整堆栈跟踪,但有些消息如下所示: ==3956== 1,999,140 (68,796 direct, 1,930,344 indirect) bytes in 5,733 blocks are definite

我使用以下参数运行:

--leak-check=full --show-reachable=yes --leak-resolution=high --num-callers=100 --trace-children=yes
在内存泄漏日志中,我看到了一些错误消息,其中包含到main的完整堆栈跟踪,但有些消息如下所示:

==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== 

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

获取完整堆栈跟踪需要对可能涉及泄漏的所有库/可执行文件使用调试符号(并且在
--num调用者设置的限制范围内)

如果您自己构建其中任何一个,则需要在gcc中指定
-g
标志(或任何其他编译器中的相关标志)

请注意,这不是万无一失的,有时可能会漏掉漏洞或无法提供完整的堆栈跟踪(特别是在使用线程或复杂的
实现时)

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


对于一个免费的工具,它非常擅长于它所做的事情,但是像IBM这样的地方可以以高价出售内存配置文件是有原因的。

Valgrind的最新发布版本只支持--num调用者,直到50岁。因此,不清楚您使用的是哪个版本。上面的堆栈跟踪看起来不完整。这可能与应用程序的编译方式有关(例如,option-fomit frame指针可能使堆栈跟踪更难生成)。(stackoverflow是否会“碰撞”帖子?)。使用-g编译应用程序。它显示了可能的内存泄漏,堆栈跟踪从malloc()开始,调用malloc()的函数,然后是main(),跳过中间的所有内容,包括与main()位于同一文件中的函数??我在网上看到的例子没有这个3堆栈帧限制。。??有什么想法吗?我正在使用Ubuntu13.10上的valgrind 3.8.1,看到了不包含所有中间调用的堆栈跟踪。使用gcc编译时没有优化(或者我可能需要-Og或其他东西…)您是否确保为应用程序链接到的所有库安装了调试符号?谢谢,在我的例子中,我只需要调整--num callers选项。默认值似乎是12,这对于STL等来说非常低。对于未来的查看器,要查看完整的调用堆栈,请使用
--num callers=
运行valgrind,其中
x
介于1和500之间。将其设置为500将导致打印整个堆栈。