1

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

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

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

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

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

在此处输入图像描述

4

1 回答 1

1

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

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

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

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

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

终止时,Valgrind 输出:

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