检查正在运行的程序中的内存泄漏

时间:2011-10-30 15:38:44

标签: c linux debugging memory-leaks

我有一个问题是出于对检查内存泄漏的好奇心。

作为过去一两年经常使用valgrind来检查我的代码中的内存泄漏的人,我突然想到它只会在生命之后检测到丢失/不一致的内存 em>的程序。

所以,考虑到这一点,我想如果你有一个长期运行的程序malloc()间歇性而且free()直到应用程序退出,那么就有可能吃内存(不一定是通过泄漏)是巨大的,使用这些工具是不可观察的,因为它们只在程序生命周期后检查。是否有类似GDB的工具可以在运行时停止应用程序并检查内存是否存在应用程序中的实例

4 个答案:

答案 0 :(得分:3)

  

是否有类似GDB的工具可以在运行时停止应用程序并检查应用程序生命周期中某个实例是否引用的内存?

是的:Valgrind。

具体来说,Valgrind的SVN版本中嵌入了gdbserver存根。

这允许你做各种很酷的调试,以前不可能:

  • 您可以在valgrind 下运行程序,同时拥有GDB断点
  • 你可以问valgrind:这个内存分配了吗?这个变量被初始化了吗?
  • 你可以问valgrind:自从上次我要求泄漏以来发生了什么新的泄漏?

你也可以要求它列出未泄露的新分配。

答案 1 :(得分:2)

在支持指针运算的语言中通常不可能这样做,因为例如 - 您可以将指针转换为整数并返回。见http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html

答案 2 :(得分:2)

对于长时间运行的基于套接字的服务器,我所做的不是工具,是为了进行操作,但在此之前打印出可用内存量,然后在我的操作后将其打印出来,看看是否有任何差异。

我知道理论上我的服务器应该已经返回了每次调用服务器时使用的所有内存,所以如果我是唯一一个调用它的人,它应该不会比启动时使用更多的内存。

您可能会在第一次调用时发现需要一些内存,因此您可能需要进行多次调用,因此所有内容都已初始化,然后您可以执行此类检查。

另一个选项是创建一个列出你正在进行mallocing的所有内存的列表,然后当你释放它时从列表中删除该节点,最后看看哪些内存还没有被释放。

答案 3 :(得分:-1)

泄漏内存定义为程序中任何内容都未引用的内存。

如果你对内存和数据中的某个位置进行了malloced,那么就会有一个指向该内存的指针,就任何自动检查而言,它都不会“丢失”。

但是,如果你分配了内存,永远不会释放它,但你没有指向它的任何指针你很可能泄露了那个内存 - 因为你无法引用它。

像valgrind这样的程序可以找到上述类型的泄漏(丢失参考)。 AFAIK没有任何东西可以找到“逻辑”泄漏,你仍然拥有对内存的引用。