C的内存泄漏检测器?
Posted
技术标签:
【中文标题】C的内存泄漏检测器?【英文标题】:Memory leak detectors for C? 【发布时间】:2010-09-08 09:08:00 【问题描述】:人们对哪些内存泄漏检测器有很好的体验?
以下是迄今为止的答案摘要:
Valgrind - 用于构建动态分析工具的检测框架。
Electric Fence - 与 GDB 配合使用的工具
Splint - 注释辅助的轻量级静态检查
Glow Code - 这是一个完整的实时性能和内存分析器,适用于使用 C++、C# 或任何 .NET Framework 开发应用程序的 Windows 和 .NET 程序员
另见*** post。
【问题讨论】:
另见:github.com/google/sanitizers 【参考方案1】:第二个valgrind...我会添加electric fence。
【讨论】:
电子围栏不是用来发现内存泄漏的。【参考方案2】:Valgrind在linux下还算不错;我在 Windows 下没有这方面的经验。
【讨论】:
【参考方案3】:如果你有钱:IBM Rational Purify 是一个非常强大的行业级 C/C++ 内存泄漏和内存损坏检测器。适用于 Windows、Solaris 和 Linux。如果您只使用 linux 并且想要一个便宜的解决方案,请选择 Valgrind。
【讨论】:
Purify 有什么 Valgrind 没有的?上次我尝试 Purify 时,设置并从中获取任何东西真的很痛苦,而且您必须使用他们的编译器进行编译。 Valgrind 使用您的正常调试版本。 注意purify已经卖给联通系统unicomsi.com/products/purifyplus【参考方案4】:Mudflap 用于 gcc!它实际上将检查编译到可执行文件中。只需添加
-fmudflap -lmudflap
到你的 gcc 标志。
【讨论】:
对以后的用户来说,不再是这样了。根据链接,标志什么都不做。而是使用地址消毒剂。【参考方案5】:lint(非常相似的开源工具splint)
【讨论】:
特别是夹板与泄漏无关。【参考方案6】:如果您在使用 glibc 的 Linux 上也值得使用内置调试堆代码。要使用它,请与 -lmcheck 链接或使用值 1、2 或 3 定义(并导出)MALLOC_CHECK_ 环境变量。The glibc manual provides more information.
这种模式对于检测双重释放最有用,它通常会在释放时发现分配的内存区域之外的写入。我认为它不会报告内存泄漏。
【讨论】:
【参考方案7】:我对@987654321@ 的访问量很大,它只进行静态分析。它是开源的并且有一个命令行界面(我没有以任何其他方式使用它)。
【讨论】:
cppcheck +1 - 没用过,所以看看;重要的建议是静态分析【参考方案8】:很痛苦,但如果你不得不使用一个.. 我推荐DevPartner BoundsChecker 套件。这就是我工作场所的人们为此目的使用的。付费 n 专有.. 不是免费软件。
【讨论】:
我自己使用过 BoundsChecker。对于内存泄漏和其他类型的资源泄漏,它非常有用。【参考方案9】:我对任何内存泄漏检测器的喜爱程度最低。通常有太多的误报,以至于它们没有任何用处。我会推荐这两个作为干扰最小的:
GlowCode
Debug heap
【讨论】:
【参考方案10】:对于内存泄漏的 Win32 调试,我对普通的旧 CRT 调试堆有很好的体验,它作为 Visual C 的库提供。
在调试构建中,malloc (et al) 被重新定义为 _malloc_dbg (et al),并且还有其他调用来检索结果,如果未设置 _DEBUG,这些调用都是未定义的。它在堆上设置了各种边界守卫,并允许您随时显示结果。
在我发现 _CRT_BLOCK 之前,当我发现一些时间例程与库运行时分配混淆时,我遇到了一些误报。
我必须生产第一个 DOS,然后是 Win32 控制台和可以永远运行的服务。据我所知,没有内存泄漏,并且在 PC 上的监视器出现故障之前,至少有一个地方的代码在无人看管的情况下运行了两年(尽管 PC 很好!)。
【讨论】:
【参考方案11】:在 Windows 上,我使用了Visual Leak Detector。与VC++集成,易于使用(只需包含一个header并设置LIB来查找lib),开源,免费使用FTW。
【讨论】:
【参考方案12】:在大学里,当我在 Unix Solaris 下做大部分事情时,我使用了gdb。
但是我会在 Linux 下使用valgrind。
【讨论】:
【参考方案13】:这些工具的鼻祖是商业的、封闭源代码的 Purify 工具,它被卖给了 IBM,然后卖给了 UNICOM
Parasoft 的 Insure++(源代码检测)和 valgrind(开源)是另外两个真正的竞争对手。
琐事:Purify 的原作者 Reed Hastings 继续创建了 NetFlix。
【讨论】:
【参考方案14】:没有人提到clang's MSan,相当强大。不过,它仅在 Linux 上得到官方支持。
【讨论】:
【参考方案15】:这个问题可能很老,但无论如何我都会回答 - 也许我的回答会帮助某人找到他们的内存泄漏。
这是我自己的项目 - 我已经把它作为开源代码:
https://sourceforge.net/projects/diagnostic/
支持 Windows 32 和 64 位平台,支持原生和混合模式调用堆栈。
.NET 垃圾回收不受支持。 (C++ cli 的 gcnew 或 C# 的 new)
它是高性能工具,不需要任何集成(除非你真的想集成它)。
完整的手册可以在这里找到:
http://diagnostic.sourceforge.net/index.html
不要害怕它实际检测到多少泄漏到您的进程中。它从整个过程中捕获内存泄漏。只分析最大的泄漏,而不是全部。
【讨论】:
【参考方案16】:我将使用 valgrind 作为内存泄漏的外部工具。 但是,对于我必须解决的大多数问题,我总是使用内部构建的工具。有时,外部工具的开销太大或设置起来太复杂。
既然可以编写自己的代码,为什么还要使用已经编写好的代码:)
我开玩笑,但有时您需要一些简单的东西,自己编写会更快。 通常我只是用保持更好的函数替换对 malloc() 和 free() 的调用 跟踪谁分配了什么。我的大部分问题似乎都是有人忘记释放的,这有助于解决这个问题。
这实际上取决于泄漏的位置,如果您知道这一点,那么您将不需要任何工具。但是,如果您对您认为泄漏的位置有所了解,那么请使用您自己的仪器,看看它是否对您有帮助。
【讨论】:
【参考方案17】:我们的CheckPointer 工具可以为 GNU C 3/4 以及 C 的 MS 方言和 GreenHills C 执行此操作。它可以找到 Valgrind 无法找到的内存管理问题。
如果您的代码只是泄漏,退出时 CheckPointer 会告诉您所有未释放的内存分配在哪里。
【讨论】:
以上是关于C的内存泄漏检测器?的主要内容,如果未能解决你的问题,请参考以下文章