gpt4 book ai didi

c - 检测退出时释放的 C 内存 'leaks'

转载 作者:IT王子 更新时间:2023-10-29 01:19:11 24 4
gpt4 key购买 nike

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

是否有任何有用的工具来对此进行检测?我喜欢的是能够在 valgrind 下运行并让它生成当前分配的报告,就像它在退出时所做的那样,但要让这发生在一个信号上并允许程序继续。然后,我可以查找哪些堆栈跟踪签名对它们有不断增长的分配。

我可以使用 generate-core-filegdb 可靠地获得一个不错的大型“核心”文件;有没有什么方法可以离线分析,如果说我用一个方便的 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

有关更多信息,请参阅文档,herehere

你也可以这样做programatically在你的程序中

#include <valgrind/memcheck.h>

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

 VALGRIND_DO_LEAK_CHECK;

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

关于c - 检测退出时释放的 C 内存 'leaks',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24280361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com