为什么valgrind会产生多个(几乎)类似的泄漏汇总?

时间:2018-03-07 09:10:59

标签: qt memory-leaks valgrind memcheck

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

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

当应用程序运行时,日志似乎已被污染了,因为我不认为在应用程序仍在运行时可以100%确定地检测到内存泄漏。我想在某些情况下(也许是线程)这不是真的,而且valgrind足够聪明,能够及早发现它们吗?

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

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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

泄漏检测通常在应用程序终止时完成。有些方法可以在早些时候触发泄漏报告:

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

最后,'几乎相同'意味着它们是不同的。您可以减少堆栈深度,这样就更有可能将callstack组合在一起。

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

在终止时,Valgrind输出:

  1. 卸载共享库(详细模式)
  2. HEAP SUMMARY - 仍在使用,分配和释放的内存量
  3. 泄漏摘要 - 发现泄漏的详细信息
  4. 错误摘要
  5. 调用错误。对于非泄漏错误,这将复制先前的消息,尽管上下文与事件计数聚合在一起。
  6. 使用过抑制(我想再次详细模式)
  7. 再次出现错误摘要