Memory leak detectors for C?什么内存泄漏探测器有人有很好的经验? 以下是目前答案的摘要: Valgrind - 用于构建动态分析工具的仪器框架。 电围栏 - 与GDB一起使用的工具 夹板 - 注释辅助轻量级静态检查 Glow Code - 这是一个完整的实时性能和内存分析器,适用于使用C ++,C#或任何.NET Framework开发应用程序的Windows和.NET程序员 另请参阅此stackoverflow帖子。 第二个valgrind ...我会添加电围栏。 在linux下的Valgrind相当不错;我没有Windows下的经验。 如果你有钱:IBM Rational Purify是一个非常强大的行业强度内存泄漏和C / C ++内存损坏检测器。适用于Windows,Solaris和Linux。如果你只是linux而且想要一个廉价的解决方案,请去Valgrind。 Gcc的Mudflap!它实际上将检查编译成可执行文件。只需添加
到你的gcc标志。 我对cppcheck进行了一些点击,它只进行静态分析。它是开源的,并有一个命令行界面(我没有以任何其他方式使用它)。 lint(非常相似的开源工具,称为夹板) 如果您使用glibc在Linux上,也值得使用内置的调试堆代码。要使用它,请使用-lmcheck链接或使用值1,2或3定义(并导出)MALLOC_CHECK_环境变量.glibc手册提供了更多信息。 此模式对于检测双重释放非常有用,并且在执行空闲时通常会在分配的内存区域之外找到写入。我不认为它报告泄露的记忆。
痛苦,但如果你不得不使用一个.. 我对任何内存泄漏探测器的爱都很少。通常,有太多的误报可供他们使用。我会推荐这两个作为最不具侵入性的beiong: GlowCode 调试堆 对于内存泄漏的Win32调试,我对普通的旧CRT Debug Heap有了非常好的经验,它作为一个带有Visual C的lib。 在Debug构建中,malloc(等)将重新定义为_malloc_dbg(等),并且还有其他调用检索结果,如果未设置_DEBUG,则这些调用都是未定义的。它在堆上设置各种边界防护,并允许您随时显示结果。 当我在使用与库运行时分配混淆的一些时间例程时,我有一些误报,直到我发现_CRT_BLOCK。 我必须生成第一个DOS,然后Win32控制台和服务,将永远运行。据我所知,没有内存泄漏,并且至少在一个地方,代码在PC上的监视器失败之前无人值守运行了两年(尽管PC很好!)。 在Windows上,我使用了Visual Leak Detector。与VC ++集成,易于使用(只需包含一个头和设置LIB即可找到lib),开源,免费使用FTW。 在大学的时候,我在Unix Solaris下做了大部分工作,我使用了gdb。 但是我会在Linux下使用valgrind。 这个问题可能很老,但无论如何我都会回答 - 也许我的答案会帮助别人找到他们的内存泄漏。 这是我自己的项目 - 我把它作为开源代码: https://sourceforge.net/projects/diagnostic/ 支持Windows 32和64位平台,支持本机和混合模式callstack。 不支持.NET垃圾回收。 (C ++ cli的gcnew或C#的新内容) 它是高性能工具,不需要任何集成(除非你真的想要集成它)。 完整的手册可以在这里找到: http://diagnostic.sourceforge.net/index.html 不要害怕它实际检测到多少泄漏你的过程。它捕获整个过程中的内存泄漏。只分析最大的泄漏,而不是全部。 没有人提到clang的MSan,这是非常强大的。但它仅在Linux上得到官方支持。 这些工具的祖父是商业的,封闭源的Purify工具,它被出售给IBM然后出售给UNICOM Parasoft的Insure ++(源代码工具)和valgrind(开源)是另外两个真正的竞争对手。 Trivia:Purify的原作者Reed Hastings继续创建了NetFlix。
我将第二个valgrind作为内存泄漏的外部工具。 为什么在你自己编写时可以使用已编写的代码:)
我开玩笑,但有时候你需要一些简单的东西,自己写它会更快。 这实际上取决于泄漏的位置,如果您知道,那么您将不需要任何工具。但是,如果您对自己认为泄漏的位置有所了解,那么请自行安装仪器,看看它是否对您有所帮助。 我们的CheckPointer工具可以为GNU C 3/4以及C和GreenHills C的MS方言执行此操作。它可以找到Valgrind无法解决的内存管理问题。 如果您的代码只是泄漏,退出CheckPointer会告诉您所有未分配内存的分配位置。 |