假设我有一个在Linux下运行的C程序,它操作许多数据结构,其中一些是复杂的,几个可以增长和缩小,但通常不应该增长。这个程序被观察到随着时间的推移而逐渐增加RSS(比内存碎片化更多)。我想找出哪里出现了泄漏。在这里,运行
有什么有用的工具来检测这个问题吗?我希望能够在
我可以可靠地从
我完全可以访问源代码,并且可以修改它,但我不想手动检测每个数据结构,而且我更感兴趣的是问题的通用解决方案(如
我在这里寻找类似的问题,但它们似乎都是:
- 我的程序为什么会泄漏内存? - 如何在退出时检测内存泄漏?(对我没有用) - 如何从核心文件中检测内存泄漏?(很好,但没有一个令人满意的答案)
如果我在Solaris下运行,我猜答案将是“使用这个方便的脚本”。
valgrind
是显而易见的建议,但是valgrind
(使用--leak-check=full
和--show-reachables=yes
)没有显示任何泄漏。我认为这是因为数据结构本身在退出时被正确释放,但其中一个正在程序的生命周期中增长。例如,可能会有一个链表,它随着时间的推移呈线性增长,有人忘记从列表中删除资源,但退出清理在退出时正确地释放了所有列表项。当然,如果它们被释放,这是否实际上是“泄漏”是一个哲学问题(因此问题中有引号)。有什么有用的工具来检测这个问题吗?我希望能够在
valgrind
下运行,并像在退出时一样生成当前分配报告,但要在信号下发生并允许程序继续。然后,我可以查找哪些堆栈跟踪签名具有不断增长的分配。我可以可靠地从
gdb
生成一个很好的大型“core”文件;如果我使用了一个方便的malloc()
调试库来对malloc()
进行插装,是否有一种离线分析它的方法?我完全可以访问源代码,并且可以修改它,但我不想手动检测每个数据结构,而且我更感兴趣的是问题的通用解决方案(如
valgrind
提供的)而不是如何解决这个特定问题。我在这里寻找类似的问题,但它们似乎都是:
- 我的程序为什么会泄漏内存? - 如何在退出时检测内存泄漏?(对我没有用) - 如何从核心文件中检测内存泄漏?(很好,但没有一个令人满意的答案)
如果我在Solaris下运行,我猜答案将是“使用这个方便的脚本”。
malloc
分配结构本身)引用该内存。因此,仅将泄漏的内存视为在退出时未通过调用free()
释放的内容是太狭隘了。 - abligh