如何修复 Valgrind 日志中的内存泄漏

Posted

技术标签:

【中文标题】如何修复 Valgrind 日志中的内存泄漏【英文标题】:how fix memory leaks from Valgrind log 【发布时间】:2012-10-17 10:49:12 【问题描述】:

这是我第一次看到 valgrind 日志,这个日志是由其他用户提供的(我无法运行 valgrind,因为它不支持 stlinux (sh4)

为了了解如何使用 valgrind 日志修复内存泄漏,如果有任何专家,请选择 bellow 的 valgrind 错误日志中的一行(并告诉我们,他打算修复的 valgrind 错误行并发布他们的修复(补丁源代码)

然后,我们将学习如何从 valgrind 日志中修复内存泄漏,然后我将自己修复(我只需要一个示例修复)

这里是 app trac 浏览器(源代码): http://www.streamboard.tv/oscam/browser/trunk/?rev=5375

如果有专家可以查看这些日志(我真的需要帮助),将不胜感激,这里有 4 个 valgrind 日志:

http://www.4shared.com/office/04seUumN/valgrind_2.html

http://www.4shared.com/office/WYmfxICb/valgrindlog.html

http://www.4shared.com/office/WGwlKeUK/valgrind.html

http://www.4shared.com/office/mkX4FAzd/valgrind_1.html

附注:

    由于我自己无法运行 valgrind,请选择内存损失最大的内存泄漏(泄漏),然后,我可以用我的眼睛监控这些改进(top 命令,ps -aux)

    我对修复内存泄漏的关注主要限于这些模块(对我来说,优先级(重要性)在于它们的编号顺序(我的意思是,使用 module-datastruct-list.c 修复内存泄漏是最重要的)我,....)

    module-datastruct-list.c oscam-garbage.c oscam.c module-cccam.c 模块-dvbapi.c

提前致谢

【问题讨论】:

您是否考虑过在 x86 Linux 系统上编译和调试您的应用程序,然后在 Linux/x86 上进行调试后,将其移植到您的目标 sh4 嵌入式系统? @Basile ,是的,我认为这是不可能的,我在某处读过 valgrind 不支持 sh4 cpu(其他用户曾多次尝试让 valgrind 与 sh4 一起工作,但他们没有成功了。我的问题是,一位专家是这样的人,向我展示他将如何修复一行内存泄漏(来自真正的 valgrind 日志),然后我会学习自己,并自己修复 valgrind 日志 尝试在 x86 Linux 系统上编译和构建您的应用程序(可能为特定于目标 SH4 硬件的那些编写存根函数),然后在 x86/Linux 上调试它。 @Basile ,我无法在 X86 中运行我的应用程序,此应用程序在我的机顶盒中使用(连接到 Dvb-s,在我的电脑中我没有 dvb- s 硬件用于 X86(我只有 sh4 机顶盒),所以我必须坚持我的机顶盒(即 sh4),我认为我们的讨论离题了,我没有请人帮我用 sh4 运行 valgrind,我问,有人帮我一个忙,告诉我他将如何修复真实 valgrid 日志中的内存泄漏(我在上面发布过) 调试内存泄漏是一项重要的任务,即使使用valgrind 也是如此(因为即使valgrind 也不会告诉您泄漏的来源,它会在以后警告您,仅在检测到泄漏时) .软件作者可能需要一周的工作。你不能指望论坛贡献者做出这样的努力。 【参考方案1】:

我很久以前用过 Valgrind,所以我不太记得如何使用它,但我知道它相当容易。 Valgrind 日志显示程序的每一次内存泄漏,原因是您的代码,也可能是您从库中调用的代码。对于每个泄漏,都会显示函数调用堆栈,如下所示:

==5313== Invalid write of size 4
==5313==    at 0x8048A27: test_2() (valgrind-tests.cc:37)
==5313==    by 0x8048CDF: main (valgrind-tests.cc:134)
==5313==    by 0x215BBE: __libc_start_main (in /lib/libc-2.3.2.so)
==5313==    by 0x8048910: (within /home/newren/examples/valgrind-tests)
==5313==    Address 0x1B3E024 is 0 bytes inside a block of size 4 free'd
==5313==    at 0x5419C5: __builtin_delete (vg_replace_malloc.c:244)
==5313==    by 0x5419E3: operator delete(void*) (vg_replace_malloc.c:253)
==5313==    by 0x8048A20: test_2() (valgrind-tests.cc:36)
==5313==    by 0x8048CDF: main (valgrind-tests.cc:134)
==5313==    by 0x215BBE: __libc_start_main (in /lib/libc-2.3.2.so)
==5313==    by 0x8048910: (within /home/newren/examples/valgrind-tests)

这意味着您尝试在内存中写入 4 个字节,但您无权访问这些字节。 此问题位于本示例中“valgrind-tests.cc”的第 37 行。

valgrind 的主要问题是,正如我之前所说,它会显示来自您使用的库的内存泄漏或内存警告(如遗忘的指针)。 要清理日志,您可以编写名为“suppression files”的 valgrind 规则文件。

更多信息here和here。

【讨论】:

以上是关于如何修复 Valgrind 日志中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

如何创建内存转储和分析内存泄漏?

如何使用 valgrind 查找内存泄漏?

valgrind - 检查程序中的内存泄漏问题

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

sh C中的Valgrind内存泄漏检查器

如何结合使用thrust和valgrind来检测内存泄漏?