【问题标题】:Why does valgrind produce multiple (almost) similar leak summaries?为什么 valgrind 会产生多个(几乎)相似的泄漏摘要?
【发布时间】:2018-08-15 07:46:02
【问题描述】:

我从控制台运行 valgrind 版本 3.12.0,如下所示:

valgrind --log-file="valgrind.log" --leak-check=yes ./application -param

日志似乎在应用程序运行时被污染了,这已经很有趣了,因为我认为在应用程序仍在运行时不能 100% 确定地检测到内存泄漏。我猜在某些情况下(可能是线程)这不是真的,而 valgrind 足够聪明,可以尽早捕捉到这些情况?

真正困扰我的是,有多个“泄漏摘要”包含或多或少相同的信息。在我看来,后期记录的摘要包含更多信息。

您将在下面找到在我的 Qt 应用程序上执行的 valgrind 的输出。我用记事本列出了所有“肯定”丢失的条目。您可以看到有大量的泄漏摘要,我不知道为什么包含的信息几乎相同。尤其是 QApplication 的构造函数泄漏的 15 个字节非常奇怪,因为它一次又一次地包含在每个摘要中。 valgrind 如何决定何时创建这样的摘要?

【问题讨论】:

  • 看起来每个报告中的进程id都不一样。这些报告可能来自分叉的进程,这些进程在没有执行另一个程序的情况下死亡。

标签: qt memory-leaks valgrind memcheck


【解决方案1】:

Valgrind 的设计目标之一是不产生误报(即,永远不要错误地指出问题)。总的来说,它非常接近这一点。几乎可以肯定你有泄漏。我建议您进行调试构建并查看源代码反向引用以调试问题。

泄漏检测通常在应用程序终止时进行。有一些方法可以更早地触发泄漏报告:

您可能正在使用其中的第二个。

最后,“几乎相同”意味着它们不同。您可以减少堆栈深度,这样更有可能将调用堆栈组合在一起。

在执行期间,Valgrind 将在发生非泄漏错误时输出它们。

在终止时,Valgrind 输出:

  1. 已卸载的共享库(详细模式)
  2. 堆摘要 - 有多少内存仍在使用、分配和释放
  3. 泄漏摘要 - 发现泄漏的详细信息
  4. 错误摘要
  5. 错误调用堆栈。对于非泄漏错误,这将重复之前的消息,尽管上下文会与出现次数一起汇总。
  6. 使用抑制(我认为又是详细模式)
  7. 再次总结错误

【讨论】:

  • 嗨,保罗,你是对的,我有一个泄漏,这就是我使用 valgrind 的原因 ;-) 1. 我没有听说过 gdbserver 命令和你所说的“触发器”。我在指定的版本中使用 valgrind 和指定的命令。我为什么要改变这一点,没有人在其他任何地方提到这样的选项? 2. 问题是为什么大家在“THE END”谈“THE”总结报告时,会有多个“总结”报告?你能详细说明那部分吗?我希望很清楚报告是在单次执行中生成的,而不是连续的:-)
  • 更新了我的答案。
  • 很抱歉,但我认为我们仍然没有谈论同一件事。您正在谈论的最后的报告在一次 valgrind 运行中打印了多次。所以我得到了多个“泄漏摘要”和多个“堆摘要”等。所以我在最后得到了这个报告的多个块,每个块都显示了每个可能/肯定丢失的消息的大量回溯。我希望最后有一个单一的回溯和一个单一的报告摘要。我误解了您编辑的答案吗?
  • 我想我明白了。你的应用程序是分叉的吗?我使用--memcheck:log-file=appname_valgrind.log.%p,它为每个进程生成一个日志文件(至少在 Valgrind 3.13 中,虽然我通常从 git 编译我自己的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多