【问题标题】:How to get the full call stack from Valgrind?如何从 Valgrind 获取完整的调用堆栈?
【发布时间】:2012-06-29 20:44:22
【问题描述】:

我使用以下参数运行Valgrind

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

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

【问题讨论】:

  • 最新发布的 Valgrind 版本只支持 --num-callers 直到 50。所以,不清楚你使用的是哪个版本。上面的堆栈跟踪看起来不完整。这可能与您的应用程序的编译方式有关(例如,选项 -fomit-frame-pointer 可能会使堆栈跟踪更难以生成)
  • 凹凸。 (stackoverflow“碰撞”帖子吗?)同样的问题。使用 -g 编译应用程序。它显示了可能的内存泄漏,堆栈跟踪从 malloc()、调用 malloc() 的函数和 main() 开始,跳过中间的所有内容,包括与 main() 位于同一文件中的函数。 ??我在网上看到没有这 3 个堆栈帧限制的示例..??有什么想法吗?
  • 我在 Ubuntu 13.10 上使用 valgrind 3.8.1 并查看不包含所有中间调用的堆栈跟踪。使用 gcc 编译时没有优化(或者我可能需要 -Og 或其他东西......)
  • 您是否确保为您的应用程序链接到的所有库都安装了调试符号?

标签: memory-leaks valgrind callstack


【解决方案1】:

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

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

请注意, 并非万无一失,有时可能会遗漏泄漏或无法提供完整的堆栈跟踪(尤其是在您使用线程或复杂的 class 实现时)。

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

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

【讨论】:

  • 谢谢,就我而言,我只需要调整 --num-callers 选项。默认值似乎是 12,这对于 STL 等来说是相当低的。
  • 对于未来的查看者,要查看完整的调用堆栈,请使用--num-callers=<x> 运行 valgrind,x 介于 1 和 500 之间。将其设置为 500 将导致打印完整的堆栈。
  • 基本上,接受的答案应该是这些 cmets ^
  • 我相信其他值是答案的一部分——似乎大多数人都被 --num-callers 绊倒了
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 2014-08-13
  • 2012-05-12
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2014-07-31
相关资源
最近更新 更多