用于C的内存泄漏检测器?
人们对哪些内存泄漏检测器有很好的经验?
这是到目前为止的答案的摘要:
用于构建动态分析工具的Valgrind Instrumentation框架。
电子围栏与GDB一起使用的工具
夹板注释辅助的轻量级静态检查
Glow代码这是Windows和.NET程序员使用C ++,C#或者任何.NET Framework开发应用程序的完整实时性能和内存分析器。
另请参阅此stackoverflow帖子。
解决方案
回答
在Linux下的Valgrind相当不错。我在Windows下没有这个经验。
回答
我对任何内存泄漏检测器都没有多大的兴趣。通常,对于它们来说,太多的误报是无用的。我建议将这两种方式作为侵入性最小的方式:
发光代码
调试堆
回答
lint(非常类似的开源工具,称为splint)
回答
其次是valgrind ...然后我将添加电围栏。
回答
很痛苦,但是如果我们不得不使用一个..
我建议使用DevPartner BoundsChecker套件。这就是我工作场所中的人们为此目的所使用的。付费N专有..不是免费软件。
回答
在大学里,当我在Unix Solaris下做大多数事情时,我使用了gdb。
但是我会在Linux下使用valgrind。
回答
我将把valgrind用作内存泄漏的外部工具。
但是,对于我必须解决的大多数问题,我始终使用内部构建的工具。有时,外部工具的开销太大或者设置太复杂。
可以编写自己的代码时,为什么要使用已编写的代码:)
我开玩笑,但是有时候我们需要一些简单的东西,并且自己编写它会更快。
通常我只用保持更好的函数替换对malloc()和free()的调用
跟踪谁分配什么。我的大多数问题似乎都是有人忘记了免费,这有助于解决该问题。
这实际上取决于泄漏的位置,如果我们知道该泄漏,则将不需要任何工具。但是,如果我们对泄漏的位置有一定的了解,那么请使用自己的仪器,看看它是否对我们有帮助。
回答
对于Win32的内存泄漏调试,我在使用普通的旧CRT Debug Heap(它与Visual C一起提供)方面有很好的经验。
在调试版本中,将malloc(等)重新定义为_malloc_dbg(等),并且还有其他检索结果的调用,如果未设置_DEBUG,则所有这些调用都是未定义的。它在堆上设置了各种边界防护,并允许我们随时显示结果。
当我想弄清楚一些与库运行时分配有关的时间例程时,我有了一些误报,直到我发现_CRT_BLOCK。
我必须先生产DOS,然后生产将永远运行的Win32控制台和服务。据我所知,没有内存泄漏,并且至少有一个地方的代码在PC上的显示器出现故障之前无人看管了两年(尽管PC很好!)。
回答
这些工具的祖父是商业的,封闭源代码的Purify工具,该工具先后出售给IBM和UNICOM。
Parasoft的Insure ++(源代码工具)和valgrind(开源)是另外两个真正的竞争对手。
Trivia:Purify的原始作者Reed Hastings继续创建了NetFlix。
回答
如果我们有钱,IBM Rational Purify是一款功能强大的行业级内存泄漏和内存损坏检测程序,用于C / C ++。适用于Windows,Solaris和Linux。如果我们仅使用Linux,并且想要便宜的解决方案,请使用Valgrind。
回答
gcc的Mudflap!它实际上将检查编译到可执行文件中。只需添加
-fmudflap -lmudflap
到gcc标志。
回答
在Windows上,我使用了Visual Leak Detector。与VC ++集成,易于使用(只需包含一个标头并设置LIB来找到lib),开源,可以免费使用FTW。
回答
如果在Linux上使用glibc,也值得使用的是内置的调试堆代码。要使用它,请与-lmcheck链接或者定义(并导出)值为1、2或者3的MALLOC_CHECK_环境变量。glibc手册提供了更多信息。
此模式对于检测双重释放最有用,并且在进行释放时通常会在分配的内存区域之外查找写入。我认为它不会报告内存泄漏。