人们对哪些内存泄漏检测器有良好的体验?

以下是迄今为止的答案摘要:

瓦尔格林德 - 用于构建动态分析工具的仪器框架。

电围栏 - 与GDB一起使用的工具

夹板 - 注释辅助的轻量级静态检查

发光代码 - 这是一个完整的实时性能和内存分析器,适用于使用 C++、C# 或任何 .NET Framework 开发应用程序的 Windows 和 .NET 程序员

另请参阅此 堆栈溢出帖子.

有帮助吗?

解决方案

第二个 瓦尔格林德...我会添加 电围栏.

其他提示

瓦尔格林德 linux下还算不错;我在 Windows 下没有这方面的经验。

如果你有钱: IBM Rational Purify 是一个极其强大的、行业级的 C/C++ 内存泄漏和内存损坏检测器。适用于 Windows、Solaris 和 Linux。如果您只使用 Linux 并且想要一个便宜的解决方案,请选择 Valgrind。

挡泥板 对于海湾合作委员会!它实际上将检查编译到可执行文件中。只需添加

-fmudflap -lmudflap

到你的海湾合作委员会标志。

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

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

此模式对于检测双重释放最有用,并且在执行释放时通常会发现已分配内存区域之外的写入。我不认为它报告内存泄漏。

我有很多点击 程序检查, ,仅进行静态分析。它是开源的并且有一个命令行界面(我没有以任何其他方式使用它)。

很痛苦,但如果你必须使用一个..
我会推荐 开发合作伙伴边界检查器 套房..这就是我工作场所的人们用于此目的的方法。付费n专有..不是免费软件。

我对任何内存泄漏检测器都没有什么好感。通常,误报太多,它们没有任何用处。我推荐这两个,因为它们是干扰最小的:

发光码

调试堆

对于内存泄漏的 Win32 调试,我使用普通的旧式 CRT 调试堆(它作为 Visual C 的库)获得了非常好的经验。

在调试版本中,malloc(等)被重新定义为 _malloc_dbg(等),并且还有其他调用来检索结果,如果未设置 _DEBUG,这些结果都是未定义的。它在堆上设置了各种边界守卫,并允许您随时显示结果。

当我发现一些时间例程扰乱库运行时分配时,我遇到了一些误报,直到我发现 _CRT_BLOCK。

我必须首先制作 DOS,然后制作 Win32 控制台和永远运行的服务。据我所知,没有内存泄漏,并且至少在一个地方,代码在 PC 上的监视器出现故障之前在无人值守的情况下运行了两年(尽管 PC 很好!)。

在Windows上,我用过 视觉检漏仪. 。与 VC++ 集成,易于使用(只需包含标头并设置 LIB 即可查找库),开源,免费使用 FTW。

在大学时,当我在 Unix Solaris 下做大部分事情时,我使用 数据库.

不过我会选择 瓦尔格林德 在Linux下。

这些工具的鼻祖是商业的、闭源的 净化 工具,先卖给IBM,后卖给联通

帕拉软件的 保险++ (源代码工具)和 valgrind(开源)是另外两个真正的竞争对手。

琐事:Purify 的原作者 Reed Hastings 后来创立了 Netflix。

没有人提到 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()的呼叫,这些功能可以更好地跟踪谁分配什么。我的大多数问题似乎都是有人忘记释放,这有助于解决该问题。

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

我们的 检查指针 工具可以为 GNU C 3/4 和 C 的 MS 方言以及 GreenHills C 执行此操作。它可以发现 Valgrind 无法发现的内存管理问题。

如果您的代码只是泄漏,退出时 CheckPointer 会告诉您所有未释放的内存被分配到哪里。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top