关于调试:C的内存泄漏检测器?

关于调试:C的内存泄漏检测器?

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!它实际上将检查编译成可执行文件。只需添加

1
-fmudflap -lmudflap

到你的gcc标志。


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


lint(非常相似的开源工具,称为夹板)


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

此模式对于检测双重释放非常有用,并且在执行空闲时通常会在分配的内存区域之外找到写入。我不认为它报告泄露的记忆。


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


我对任何内存泄漏探测器的爱都很少。通常,有太多的误报可供他们使用。我会推荐这两个作为最不具侵入性的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作为内存泄漏的外部工具。
但是,对于我必须解决的大部分问题,我总是使用内部构建的工具。有时外部工具开销太大或设置太复杂。

为什么在你自己编写时可以使用已编写的代码:)

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

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


我们的CheckPointer工具可以为GNU C 3/4以及C和GreenHills C的MS方言执行此操作。它可以找到Valgrind无法解决的内存管理问题。

如果您的代码只是泄漏,退出CheckPointer会告诉您所有未分配内存的分配位置。


推荐阅读

    linux查看动态命令?

    linux查看动态命令?,系统,状态,工具,实时,时间,命令,工作,信息,地址,百分比,l

    linux动态链接库命令?

    linux动态链接库命令?,代码,项目,工程,电脑,网上,文件,程序,静态,命令,目录,

    linux动态执行命令?

    linux动态执行命令?,时间,信息,名字,工作,网上,业务,工具,对比,地址,下来,如

    linux命令行动态输出?

    linux命令行动态输出?,标准,工作,信息,系统,命令,地址,文件,数据,管理,设备,l

    linux调试终端命令?

    linux调试终端命令?,系统,工作,地址,首页,电脑,终端,命令,标准,信息,基础,求L

    linux脚本调试的命令?

    linux脚本调试的命令?,工作,系统,管理,命令,地址,标准,脚本,底部,代码,官网,l

    linux命令调试模式?

    linux命令调试模式?,系统,工作,信息,地址,工程,命令,工具,环境,设备,地方,lin

    linux基本命令框架?

    linux基本命令框架?,系统,基础,网络,设备,管理,基础知识,环境,管理系统,概

    linux调试驱动的命令?

    linux调试驱动的命令?,系统,网络,官网,百度,地址,下来,第一,官方网站,软件,

    linux命令调试过程?

    linux命令调试过程?,代码,通用,地方,信息,系统,程序,进程,命令,编辑,断点,如

    内存泄漏linux命令?

    内存泄漏linux命令?,工具,检测,信息,服务,系统,分析,中心,报告,交易,生产,Lin

    linux文字动态命令?

    linux文字动态命令?,系统,工作,地址,工具,管理,网络,命令,分析,目录,代码,Lin

    python调试的几种方式

    python调试的几种方式,代码,位置,信息,状态,培训,数据,分析,变量,函数,方式

    python的单元测试框架

    python的单元测试框架,代码,生态,信息,标准,测试,分析,工具,环境,条款,活跃

    python 的异步框架模型

    python 的异步框架模型,暂停,流程,状态,地方,概念,培训,时间,任务,队列,框

    python的动态类型

    python的动态类型,代码,系统,类型,技术,培训,语言,静态,动态,错误,大发,为了

    优秀的GUI Python框架

    优秀的GUI Python框架,平台,代码,网站,包装,设备,系统,项目,软件,技术,工具