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

Mic*_*kin 18 callstack valgrind memory-leaks

我使用以下参数运行Valgrind:

--leak-check=full --show-reachable=yes --leak-resolution=high --num-callers=100 --trace-children=yes
Run Code Online (Sandbox Code Playgroud)

在内存泄漏日志中,我看到一些错误消息,完整堆栈跟踪到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== 
Run Code Online (Sandbox Code Playgroud)

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

roe*_*ofs 20

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

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

请注意,并非万无一失,并且可能偶尔会漏掉泄漏或无法提供完整的堆栈跟踪(特别是如果您正在使用线程或复杂的class实现).

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

对于一个免费的工具,非常擅长它的功能,但有一个原因,像IBM这样的地方可以出售大量资金的内存配置文件.

  • 谢谢,在我的情况下,我只需要调整--num-callers选项.默认值似乎是12,这对于STL等来说相当低. (9认同)
  • 对于未来的查看者,要查看完整的调用堆栈,请使用 `--num-callers=<x>` 运行 valgrind,其中 `x` 介于 1 和 500 之间。将其设置为 500 将导致打印完整堆栈。 (3认同)
  • 基本上,接受的答案应该是这些评论^ (2认同)