Valgrind 报告内存肯定丢失而没有错误

Posted

技术标签:

【中文标题】Valgrind 报告内存肯定丢失而没有错误【英文标题】:Valgrind reporting memory definitely lost without errors 【发布时间】:2018-03-20 21:55:01 【问题描述】:

我正在测试 C 代码是否存在内存泄漏,但似乎无法找到泄漏源,因为有 0 个错误。 Valgrind 报告说存在(相当严重的)内存泄漏:

==30492== Memcheck, a memory error detector
==30492== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==30492== Using Valgrind-3.14.0.GIT and LibVEX; rerun with -h for copyright 
info
==30492== Command: ./a.out --leak-check=full --track-origins=yes
==30492== 
(This is where the input and output cases are displayed, which are a lot)
==30492== 
==30492== HEAP SUMMARY:
==30492==     in use at exit: 39,155 bytes in 167 blocks
==30492==   total heap usage: 380 allocs, 213 frees, 53,426 bytes allocated
==30492== 
==30492== LEAK SUMMARY:
==30492==    definitely lost: 20,480 bytes in 2 blocks
==30492==    indirectly lost: 2,064 bytes in 1 blocks
==30492==      possibly lost: 0 bytes in 0 blocks
==30492==    still reachable: 348 bytes in 9 blocks
==30492==         suppressed: 16,263 bytes in 155 blocks
==30492== Rerun with --leak-check=full to see details of leaked memory
==30492== 
==30492== For counts of detected and suppressed errors, rerun with: -v
==30492== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)

代码写在几个文件中,由数百行组成,所以在这里发布可能会有点多。谁能解释这里可能是什么问题?还是您需要查看实际代码才能给出答案?我只能找到很少的关于 valgrind 的文档,并且非常卡在这里。

(valgrind 建议使用 --leak-check=full 重新运行,但这就是我为获得此输出所做的操作)

【问题讨论】:

添加--track-origins=yes 你能发布 valgrind 的全部输出吗? 会不会是在命令行末尾添加--leak-check=full?在这种情况下,valgrind 会认为这是它正在测试的程序的参数,而不是它自己的参数。你跑valgrind --leak-check=full ./your_program arg1 arg2...了吗? @sturcotte06 --track-origins=yes 用于跟踪未初始化数据的来源,与内存泄漏无关。 --leak-check=full 是他需要的。 Valgrind 是说在你的代码中某处你已经 malloc'ed 了一些你从未释放过的内存。这样做本身可能不是问题,valgrind 不会将其视为错误。当您使用 --leak.check=full 运行 valgrind 时,重要的部分是您遗漏的“(这是显示输入和输出案例的地方,很多)”部分。这将向您显示您在哪里分配了尚未释放的内存,您需要确定这是否是一个问题。与往常一样,从 1. item 开始,修复它,重新运行 valgrind 并修复 1.item .... 【参考方案1】:

可能会出现误报(例如,在共享库初始化程序中,或者像 libcrypto.so 这样会泄漏一些分配的东西)。

但是,您应该经常检查 - 很可能您忘记了某些分配。

在您的输出中,我们可以看到:

 Command: ./a.out --leak-check=full --track-origins=yes`

这表明你调用了 valgrind:

valgrind ./a.out --leak-check=full --track-origins=yes

应该使用这个:

valgrind --leak-check=full --track-origins=yes ./a.out

如果您发现由于第三方库内部而无法控制的泄漏(或其他诊断),您可以发送suppression file

【讨论】:

谢谢,这确实是解决方案。错误结果是由于 valgrind 在 OS X 上的支持不如 Linux (***.com/questions/34573039/…)。

以上是关于Valgrind 报告内存肯定丢失而没有错误的主要内容,如果未能解决你的问题,请参考以下文章

Valgrind:可能丢失可以被视为绝对丢失吗?

MIPS 上的 Valgrind 报告没有堆使用

找不到 Valgrind 检测到的内存泄漏

Valgrind:致命错误:memcheck.h:没有这样的文件或目录

Valgrind 内存分析器结果

Valgrind 内存泄漏报告中的时间戳不正确