C语言的内存泄漏检测工具?

35

有哪些内存泄漏检测工具是值得推荐的?

以下是目前为止的回答总结:

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

Electric Fence - 与 GDB 搭配使用的工具。

Splint - 基于注解的轻量级静态检查。

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

还可以参考这篇stackoverflow文章


参见:https://github.com/google/sanitizers - Mikko Rantalainen
17个回答

20

Electric fence不适用于查找内存泄漏。 - fuenfundachtzig

12

在Linux下,Valgrind表现得相当不错;我在Windows下没有使用过它。


3

Mudflap是针对gcc的一种调试工具,它会将检查代码编译到可执行文件中。只需添加相关参数即可。

-fmudflap -lmudflap

添加到您的gcc标志中。


1
对于未来的用户而言,情况已经不同了。根据链接,标志不起作用。请改用地址安全器(Address Sanitizer)。 - UndyingJellyfish

3
如果你有预算:IBM Rational Purify是一款极为强大的行业级别内存泄漏和内存损坏检测器,适用于C/C++。适用于Windows、Solaris和Linux。如果你只使用Linux并且想要一个便宜的解决方案,可以选择Valgrind。

2
Purify与Valgrind有何不同?上次我尝试使用Purify时,安装和使用它都非常麻烦,还需要使用他们的编译器进行编译。而Valgrind使用您正常的调试构建。 - florin
请注意,Purify已被出售给UNICOM Systems。http://unicomsi.com/products/purifyplus/ - djsadinoff

3

我在使用仅进行静态分析的开源工具cppcheck方面取得了很好的效果。它具有命令行界面(我没有以其他方式使用它)。


+1 for cppcheck - 没用过这个,所以会看一下;重要的建议是静态分析。 - Andrew

2
如果你在Linux上使用glibc,那么内置的调试堆代码也值得使用。要使用它,请使用-lmcheck链接或定义(并导出)MALLOC_CHECK_环境变量,值为1、2或3。glibc手册提供了更多信息。 这种模式最适合检测双重释放,并且通常在释放时发现分配的内存区域之外的写入。我认为它不会报告泄漏的内存。

2

lint(非常类似的开源工具称为splint


1
特别是Splint并不是关于泄漏的问题。 - 0xC0000022L

2

虽然有些痛苦,但如果你必须使用一个工具的话,我建议使用DevPartner BoundsChecker套件。这是我们公司用于此目的的工具。它是付费和专有的,不是免费软件。


我自己使用过BoundsChecker。它对于内存泄漏和其他类型的资源泄漏都非常有帮助。 - Herms

1
在Windows上,我使用Visual Leak Detector。它与VC++集成,易于使用(只需包含一个头文件并设置LIB以查找库),开源且免费使用。

1

我对任何内存泄漏检测器都没有太多的好感。通常情况下,它们会有太多的误报,使得它们没有任何用处。我建议这两个是最不具侵入性的:

GlowCode

Debug heap


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接