繁体   English   中英

检测退出时释放的C内存“泄漏”

[英]Detect C memory 'leaks' that are freed on exit

假设我有一个C程序(在Linux下运行),它操作许多数据结构,一些复杂,其中一些可以增长和缩小,但通常不会随着时间的推移而增长。 观察到该程序随着时间的推移逐渐增加RSS(比可以通过内存碎片解释的更多)。 我想找到泄漏的东西。 valgrind下运行是一个明显的建议,但是valgrind (使用--leak-check=full--show-reachables=yes )显示没有泄漏。 我相信这是因为数据结构本身在退出时正确释放,但其中一个在程序的生命周期中正在增长。 例如,可能有一个链接列表随着时间的推移呈线性增长,有人忘记删除列表中的资源,但退出清理正确地在退出时释放列表中的所有项目。 当然,如果它们被释放,那么它们是否实际上是“泄漏”存在一个哲学问题(因此问题中的引号)。

是否有任何有用的工具来检测这个? 我喜欢的是能够在valgrind下运行并让它产生当前分配的报告,就像它在退出时一样,但要在信号上发生这种情况并允许程序继续。 然后,我可以查找堆栈跟踪签名对它们的分配越来越多。

我可以通过generate-core-filegdb可靠地获得一个漂亮的大型“核心” generate-core-file ; 有没有办法分析离线,如果说我用一个方便的malloc()调试库编译了malloc()

我有完全访问源,可以修改它,但我真的不想手动检测每个数据结构,而且我对问题的一般解决方案感兴趣(如valgrind提供)而不是如何解决这个特殊问题。

我在这里寻找类似的问题,但它们似乎都是:

  • 为什么我的程序会泄漏内存?
  • 如何在退出时检测内存泄漏? (对我没用)
  • 如何检测核心文件中的内存泄漏? (很棒,但没有一个人有满意的答案)

如果我在Solaris下运行,我猜测答案是“使用这个方便的dtrace脚本”。

Valgrind包含一个gdbserver。 这基本上意味着您可以使用gdb连接到它,例如发出泄漏转储,或者在运行时显示所有可访问的内存。 当然,你必须判断是否存在“内存泄漏”,因为valgrind无法知道应用程序逻辑中是否存在无法释放内存的错误,但仍然保留对它的引用。

使用--vgdb = yes标志运行valgrind,然后运行命令:

valgrind --vgdb=yes --leak-check=full --show-reachable=yes ./yourprogram 
gdb ./yourprogram
(gdb) target remote | vgdb
(gdb) monitor leak_check full reachable any

有关详细信息,请参阅文档, 此处此处

您也可以在程序中编程方式执行此操作

#include <valgrind/memcheck.h>

并在代码中的适当位置执行:

 VALGRIND_DO_LEAK_CHECK;

(只要valgrind与--show-reachable = yes一起运行,iirc也会显示可达内存

Valgrind Massif工具显示了应用程序的一般内存使用情况,而不仅仅是泄漏的内存。 它通过调用函数及其回溯来分解malloc()free() ,因此您可以看到哪些函数在不释放内存的情况下继续分配内存。 这可以成为查找您提到的类型泄漏的绝佳工具。

不幸的是,围绕Massif的工具ms_print ...... Valgrind提供的ms_print工具仅对最基本的任务有用; 对于实际工作,你可能想要一些显示图形的东西。 网上散布着几种工具 - 参见例如。 Valgrind Massif工具输出图形界面?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM