关于调试:C的内存泄漏检测器?

关于调试:C的内存泄漏检测器?

Memory leak detectors for C?

什么内存泄漏探测器有人有很好的经验?

以下是目前答案的摘要:

Valgrind - 用于构建动态分析工具的仪器框架。

电围栏 - 与GDB一起使用的工具

夹板 - 注释辅助轻量级静态检查

Glow Code - 这是一个完整的实时性能和内存分析器,适用于使用C ++,C#或任何.NET Framework开发应用程序的Windows和.NET程序员

另请参阅此stackoverflow帖子。


第二个valgrind ...我会添加电围栏。


在linux下的Valgrind相当不错;我没有Windows下的经验。


如果你有钱:IBM Rational Purify是一个非常强大的行业强度内存泄漏和C / C ++内存损坏检测器。适用于Windows,Solaris和Linux。如果你只是linux而且想要一个廉价的解决方案,请去Valgrind。


Gcc的Mudflap!它实际上将检查编译成可执行文件。只需添加

1
-fmudflap -lmudflap

到你的gcc标志。


我对cppcheck进行了一些点击,它只进行静态分析。它是开源的,并有一个命令行界面(我没有以任何其他方式使用它)。


lint(非常相似的开源工具,称为夹板)


如果您使用glibc在Linux上,也值得使用内置的调试堆代码。要使用它,请使用-lmcheck链接或使用值1,2或3定义(并导出)MALLOC_CHECK_环境变量.glibc手册提供了更多信息。

此模式对于检测双重释放非常有用,并且在执行空闲时通常会在分配的内存区域之外找到写入。我不认为它报告泄露的记忆。


痛苦,但如果你不得不使用一个..
我推荐DevPartner BoundsChecker套件......这就是我工作场所的人们为此目的使用的东西。支付n专有..不是免费软件。


我对任何内存泄漏探测器的爱都很少。通常,有太多的误报可供他们使用。我会推荐这两个作为最不具侵入性的beiong:

GlowCode

调试堆


对于内存泄漏的Win32调试,我对普通的旧CRT Debug Heap有了非常好的经验,它作为一个带有Visual C的lib。

在Debug构建中,malloc(等)将重新定义为_malloc_dbg(等),并且还有其他调用检索结果,如果未设置_DEBUG,则这些调用都是未定义的。它在堆上设置各种边界防护,并允许您随时显示结果。

当我在使用与库运行时分配混淆的一些时间例程时,我有一些误报,直到我发现_CRT_BLOCK。

我必须生成第一个DOS,然后Win32控制台和服务,将永远运行。据我所知,没有内存泄漏,并且至少在一个地方,代码在PC上的监视器失败之前无人值守运行了两年(尽管PC很好!)。


在Windows上,我使用了Visual Leak Detector。与VC ++集成,易于使用(只需包含一个头和设置LIB即可找到lib),开源,免费使用FTW。


在大学的时候,我在Unix Solaris下做了大部分工作,我使用了gdb。

但是我会在Linux下使用valgrind。


这个问题可能很老,但无论如何我都会回答 - 也许我的答案会帮助别人找到他们的内存泄漏。

这是我自己的项目 - 我把它作为开源代码:

https://sourceforge.net/projects/diagnostic/

支持Windows 32和64位平台,支持本机和混合模式callstack。

不支持.NET垃圾回收。 (C ++ cli的gcnew或C#的新内容)

它是高性能工具,不需要任何集成(除非你真的想要集成它)。

完整的手册可以在这里找到:

http://diagnostic.sourceforge.net/index.html

不要害怕它实际检测到多少泄漏你的过程。它捕获整个过程中的内存泄漏。只分析最大的泄漏,而不是全部。


没有人提到clang的MSan,这是非常强大的。但它仅在Linux上得到官方支持。


这些工具的祖父是商业的,封闭源的Purify工具,它被出售给IBM然后出售给UNICOM

Parasoft的Insure ++(源代码工具)和valgrind(开源)是另外两个真正的竞争对手。

Trivia:Purify的原作者Reed Hastings继续创建了NetFlix。


我将第二个valgrind作为内存泄漏的外部工具。
但是,对于我必须解决的大部分问题,我总是使用内部构建的工具。有时外部工具开销太大或设置太复杂。

为什么在你自己编写时可以使用已编写的代码:)

我开玩笑,但有时候你需要一些简单的东西,自己写它会更快。
通常我只是用更好的函数替换对malloc()和free()的调用
跟踪谁分配什么。我的大多数问题似乎都是忘记释放的人,这有助于解决这个问题。

这实际上取决于泄漏的位置,如果您知道,那么您将不需要任何工具。但是,如果您对自己认为泄漏的位置有所了解,那么请自行安装仪器,看看它是否对您有所帮助。


我们的CheckPointer工具可以为GNU C 3/4以及C和GreenHills C的MS方言执行此操作。它可以找到Valgrind无法解决的内存管理问题。

如果您的代码只是泄漏,退出CheckPointer会告诉您所有未分配内存的分配位置。


推荐阅读