G++多平台内存泄漏检测工具

13
有没有人知道我能在哪里找到一个 C++ 内存泄漏检测工具,可以在 Windows 和 Linux 上作为命令行或 Eclipse 插件运行。我希望它易于使用,最好不要覆盖 new()、delete()、malloc() 或 free()。如果是命令行的话,类似于 GDB,但我不记得它被用来检测内存泄漏了。如果有一个单元测试框架可以自动完成这个任务,那就太好了。
此问题与其他问题(如 Memory leak detection under Windows for GNU C/C++)类似,但我觉得它不同,因为这些问题要求 Windows 特定的解决方案或者有一些我想避免的解决方案。我觉得我在这里需要更具体的东西。建议不必满足所有要求,但尽可能多的要求会很好。
谢谢。
编辑:由于这个问题已经出现,我指的是任何需要我 #include 一个库或以其他方式改变 C++ 编译我的代码的任何东西,如果它在运行时这样做,那么在不同的环境中运行代码不会影响任何事情,那就太好了。另外,不幸的是,我没有 Mac,所以任何关于 Mac 的建议都是无用的,但感谢您的尝试。我的台式电脑运行 Windows(我安装了 Linux,但我的双监视器不支持它),我不想在虚拟机中运行 Linux,尽管这当然也是一个选择。我的笔记本电脑运行 Linux,所以我可以在那里使用该工具,尽管我肯定更喜欢坚持使用我的台式电脑,因为屏幕空间非常适合将所有设计文档和要求保持在视野范围内,而不必在桌面上移动太多东西。
注意:虽然我可能会尝试答案,但在尝试并且满意之前,我不会将其标记为已接受的答案。
编辑2:我不担心我的代码的跨平台兼容性,它是一个使用 C++ 库的命令行应用程序。
6个回答

12

Valgrind是你的最好的朋友。Valgrind有一个适用于eclipse的插件。 "可惜" Valgrind不能在Windows上运行,但它可以在Mac OSX、*BSD和Linux上运行,所以我认为它是"多平台"的。 :)

Valgrind会"覆盖"new/delete/malloc/free,但不是在编译期间(因此,如果这就是你的意思,你不必重新编译)。它解释二进制文件,因此在测试期间性能会受到一些影响。


4

在较新的gcc版本中,有一种称为泄漏检测器的东西。您只需将-fsanitize=leak添加到编译命令中即可。然后正常运行程序,在结束时,如果有任何泄漏,您将得到摘要(当然是在终端上)。


1

DUMA 是一个跨平台的泄漏检测库,我在许多项目中使用它。它很好用,因为你不需要 #include 任何 DUMA 特定的头文件,只需在链接系统的 libc(包含内存分配例程)之前链接该库,然后再链接 libstdc++。

特别是在 C++ 项目中使用时,设置可能有点棘手,但我认为这值得投入时间。它帮助我发现了一些以前可能无法发现的内存泄漏,以及一个重复删除分配的情况。

请注意:如果构建静态存档(默认情况下在 Windows 上构建),会更容易一些,因为它有助于减少由泄漏运行时引起的“误报”。


1

对于32位应用程序,Valgrind + Wine也可以作为Windows应用程序的工作解决方案。如果您的应用程序在Wine下可以运行而不需要任何更改,则在Valgrind + Wine下运行它在我的(非常有限的)经验中效果很好。由于您的应用程序在Linux下运行,我猜测您的应用程序很可能会在Wine下运行(避免了一些尚未在Wine中支持的非常特定于Windows的代码)。


你的意思是使用Wine作为API实现在*nix上重新编译Windows应用程序吗?(我只是很好奇) - olliej
valgrind 适用于 x86_64 以及 PowerPC、MIPS、ARM 和其他架构。 - LiraNuna
不,我的意思是在Wine本身下使用Valgrind在Linux上运行您的Windows二进制文件,而不需要进行修改。这就是为什么我提到了仅支持32位:Valgrind无法在具有64位支持的Wine上运行应用程序,而具有64位支持的Wine是实验性的(64位指运行64位Windows应用程序)。 - David Cournapeau

0
在MacOS X上有一个名为 "leaks" 的工具(我不知道它是否存在于其他地方),我曾经在Linux上使用过一个叫做memprof的工具。还有一个在Linux上非常强大但性能会有一定影响的工具叫做valgrind,据说它也可以在macOS上使用,但我没有尝试过。
然而,我对Windows上没有类似的工具了解。

0

虽然您提到这不是首选方法,但Boehm垃圾收集器可用于检测内存泄漏。简单来说,如果垃圾收集器实际上正在运行,那么通常会出现内存泄漏。Mozilla使用它来检测Firefox中的内存泄漏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接