33

人们对哪些内存泄漏检测器有很好的体验?

以下是迄今为止的答案摘要:

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

Electric Fence - 与 GDB 一起使用的工具

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

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

另请参阅此stackoverflow 帖子

4

17 回答 17

18

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

于 2008-09-10T05:01:09.223 回答
11

linux下的valgrind还算不错;我在 Windows 下没有这方面的经验。

于 2008-09-10T04:50:10.967 回答
3

如果您有钱:IBM Rational Purify是一个非常强大的 C/C++ 行业内存泄漏和内存损坏检测器。适用于 Windows、Solaris 和 Linux。如果您只使用 linux 并且想要一个便宜的解决方案,请选择 Valgrind。

于 2008-09-25T21:37:19.147 回答
3

gcc的挡泥板!它实际上将检查编译到可执行文件中。只需添加

-fmudflap -lmudflap

到你的 gcc 标志。

于 2008-11-10T01:15:04.547 回答
2

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

于 2008-09-10T04:59:06.327 回答
2

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

于 2008-09-10T05:19:06.653 回答
2

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

这种模式对于检测双重释放最有用,它经常在释放时发现分配的内存区域之外的写入。我认为它不会报告内存泄漏。

于 2008-11-11T19:22:37.723 回答
2

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

于 2012-09-18T15:28:01.020 回答
1

我对任何内存泄漏检测器的喜爱都很少。通常有太多的误报,它们没有任何用处。我会推荐这两个作为干扰最小的:

发光代码

调试堆

于 2008-09-10T04:52:19.637 回答
1

对于内存泄漏的 Win32 调试,我对普通的旧 CRT 调试堆有很好的体验,它作为 Visual C 的库提供。

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

在我发现 _CRT_BLOCK 之前,当我发现一些时间例程与库运行时分配混淆时,我遇到了一些误报。

我必须生产第一个 DOS,然后是 Win32 控制台和可以永远运行的服务。据我所知,没有内存泄漏,并且在 PC 上的监视器出现故障之前,至少有一个地方的代码在无人看管的情况下运行了两年(尽管 PC 很好!)。

于 2008-09-11T04:25:26.477 回答
1

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

于 2008-11-11T14:45:06.987 回答
0

在大学里,当我在 Unix Solaris 下做大部分事情时,我使用gdb

但是我会在 Linux 下使用valgrind 。

于 2008-09-10T05:46:47.197 回答
0

这些工具的鼻祖是商业的、封闭源代码的Purify工具,它卖给了 IBM,然后卖给了 UNICOM

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

琐事:Purify 的原作者 Reed Hastings 继续创立了 NetFlix。

于 2008-09-25T21:13:12.277 回答
0

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

于 2015-10-07T05:47:13.297 回答
0

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

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

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

支持 Windows 32 和 64 位平台,支持本机和混合模式调用堆栈。

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

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

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

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

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

于 2016-11-03T17:43:39.713 回答
-1

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

当您可以编写自己的代码时,为什么要使用已经编写的代码:)

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

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

于 2008-09-10T18:38:42.237 回答
-1

我们的CheckPointer工具可以为 GNU C 3/4 和 MS 方言 C 和 GreenHills C 做到这一点。它可以找到 Valgrind 无法找到的内存管理问题。

如果您的代码只是泄漏,退出 CheckPointer 将告诉您所有未释放的内存分配在哪里。

于 2012-06-26T07:36:52.497 回答