人们对哪些内存泄漏检测器有很好的体验?
以下是迄今为止的答案摘要:
Valgrind - 用于构建动态分析工具的仪器框架。
Electric Fence - 与 GDB 一起使用的工具
Splint - 注释辅助的轻量级静态检查
Glow Code - 这是一个完整的实时性能和内存分析器,适用于使用 C++、C# 或任何 .NET Framework 开发应用程序的 Windows 和 .NET 程序员
另请参阅此stackoverflow 帖子。
人们对哪些内存泄漏检测器有很好的体验?
以下是迄今为止的答案摘要:
Valgrind - 用于构建动态分析工具的仪器框架。
Electric Fence - 与 GDB 一起使用的工具
Splint - 注释辅助的轻量级静态检查
Glow Code - 这是一个完整的实时性能和内存分析器,适用于使用 C++、C# 或任何 .NET Framework 开发应用程序的 Windows 和 .NET 程序员
另请参阅此stackoverflow 帖子。
linux下的valgrind还算不错;我在 Windows 下没有这方面的经验。
如果您有钱:IBM Rational Purify是一个非常强大的 C/C++ 行业内存泄漏和内存损坏检测器。适用于 Windows、Solaris 和 Linux。如果您只使用 linux 并且想要一个便宜的解决方案,请选择 Valgrind。
lint(非常相似的开源工具,称为splint)
很痛苦,但如果你必须使用一个。
我推荐DevPartner BoundsChecker套件。这就是我工作场所的人们为此目的使用的。付费n专有..不是免费软件。
如果您在使用 glibc 的 Linux 上也值得使用内置调试堆代码。要使用它,请与-lmcheck链接或定义(并导出)值为 1、2 或 3 的MALLOC_CHECK_环境变量。glibc手册提供了更多信息。
这种模式对于检测双重释放最有用,它经常在释放时发现分配的内存区域之外的写入。我认为它不会报告内存泄漏。
我对cppcheck有很多成功,它只进行静态分析。它是开源的并且有一个命令行界面(我没有以任何其他方式使用它)。
对于内存泄漏的 Win32 调试,我对普通的旧 CRT 调试堆有很好的体验,它作为 Visual C 的库提供。
在 Debug 构建中 malloc (et al) 被重新定义为 _malloc_dbg (et al) 并且还有其他调用来检索结果,如果未设置 _DEBUG,这些调用都是未定义的。它在堆上设置了各种边界守卫,并允许您随时显示结果。
在我发现 _CRT_BLOCK 之前,当我发现一些时间例程与库运行时分配混淆时,我遇到了一些误报。
我必须生产第一个 DOS,然后是 Win32 控制台和可以永远运行的服务。据我所知,没有内存泄漏,并且在 PC 上的监视器出现故障之前,至少有一个地方的代码在无人看管的情况下运行了两年(尽管 PC 很好!)。
在 Windows 上,我使用了Visual Leak Detector。与 VC++ 集成,易于使用(只需包含一个头文件并设置 LIB 即可找到该库),开源,免费使用 FTW。
在大学里,当我在 Unix Solaris 下做大部分事情时,我使用gdb。
但是我会在 Linux 下使用valgrind 。
没有人提到clang 的 MSan,它非常强大。不过,它仅在 Linux 上得到官方支持。
这个问题可能很老,但无论如何我都会回答 - 也许我的回答会帮助某人找到他们的内存泄漏。
这是我自己的项目 - 我把它作为开源代码:
https://sourceforge.net/projects/diagnostic/
支持 Windows 32 和 64 位平台,支持本机和混合模式调用堆栈。
不支持 .NET 垃圾回收。(C++ cli 的 gcnew 或 C# 的 new)
它是高性能工具,并且不需要任何集成(除非你真的想集成它)。
完整的手册可以在这里找到:
http://diagnostic.sourceforge.net/index.html
不要害怕它实际检测到多少泄漏它你的过程。它从整个过程中捕获内存泄漏。只分析最大的泄漏,而不是全部。
我将把 valgrind 作为内存泄漏的外部工具。
但是,对于我必须解决的大多数问题,我总是使用内部构建的工具。有时,外部工具的开销太大或设置起来太复杂。
当您可以编写自己的代码时,为什么要使用已经编写的代码:)
我开玩笑,但有时你需要一些简单的东西,自己写会更快。通常我只是用可以更好地跟踪谁分配什么的函数替换对 malloc() 和 free() 的调用。我的大部分问题似乎是有人忘记释放,这有助于解决这个问题。
这实际上取决于泄漏的位置,如果您知道这一点,那么您将不需要任何工具。但是,如果您对自己认为泄漏的位置有所了解,那么请使用您自己的仪器,看看它是否对您有帮助。
我们的CheckPointer工具可以为 GNU C 3/4 和 MS 方言 C 和 GreenHills C 做到这一点。它可以找到 Valgrind 无法找到的内存管理问题。
如果您的代码只是泄漏,退出 CheckPointer 将告诉您所有未释放的内存分配在哪里。