C的内存泄漏检测器?

时间:2008-09-10 04:47:58

标签: c debugging memory memory-leaks

人们有哪些内存泄漏探测器有很好的使用经验?

以下是目前答案的摘要:

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

Electric Fence - 适用于GDB的工具

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

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

另见stackoverflow post

17 个答案:

答案 0 :(得分:17)

第二个valgrind ...我将添加electric fence

答案 1 :(得分:11)

linux下的

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

对于gcc,

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

-fmudflap -lmudflap

到你的gcc标志。

答案 4 :(得分:2)

lint(非常相似的开源工具,名为splint

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

如果你在Linux上使用glibc也是值得使用的是内置的调试堆代码。要使用它,请链接 -lmcheck 或定义(并导出) MALLOC_CHECK _ 环境变量,其值为1,2或3. The glibc manual provides more information.

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

答案 8 :(得分:1)

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

GlowCode

Debug heap

答案 9 :(得分:1)

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

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

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

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

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

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

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

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

不支持.NET垃圾回收。 (C ++ cli' s gcnew或C#&new;)

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

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

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

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

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

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

答案 14 :(得分:0)

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

但是我会在Linux下使用valgrind

答案 15 :(得分:-1)

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

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

答案 16 :(得分:-1)

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

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

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

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