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

时间:2009-06-27 05:04:01

标签: c++ eclipse memory-management memory-leaks

有谁知道我在哪里可以找到C ++的内存泄漏检测工具,它可以在命令行中运行,也可以在Windows和Linux中作为Eclipse插件运行。我希望它易于使用。最好不要覆盖new(),delete(),malloc()或free()。像GDB一样,如果它将在命令行中,但我不记得用于检测内存泄漏。如果有一个单元测试框架自动执行此操作,那就太棒了。

这个问题类似于其他问题(例如Memory leak detection under Windows for GNU C/C++)但是我觉得它有所不同,因为那些人​​要求提供特定于Windows的解决方案,或者有我宁愿避免的解决方案。我觉得我在寻找一些更具体的东西。建议不必满足所有要求,但尽可能多的是好的。

感谢。

编辑:由于这已经出现,“覆盖”是指任何需要我#include一个库或者改变C ++如何编译我的代码的东西,如果它在运行时这样做,那么运行代码不同的环境不会影响任何伟大的事情。另外,遗憾的是,我没有Mac,所以对此的任何建议都没有用,但谢谢你的尝试。我的桌面运行Windows(我安装了Linux但我的双显示器无法使用它)而且我宁愿不在VM中运行Linux,尽管这当然是一种选择。我的笔记本电脑运行Linux,所以我可以在那里使用该工具,虽然我肯定更喜欢坚持我的桌面,因为屏幕空间非常适合保持所有设计文档和要求,而不必在桌面上移动太多

注意:虽然我可能会尝试回答,但在我尝试过这个建议之前,我不会将其标记为已接受。

EDIT2:我并不担心代码的跨平台兼容性,它只是一个使用C ++库的命令行应用程序。

6 个答案:

答案 0 :(得分:10)

Valgrind是您的best friend。 Valgrind对于日食有plugin。 “可悲的是”Valgrind不在Windows上运行,但它运行在Mac OSX,* BSD和Linux上,所以我认为这是“多平台”。 :)

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

答案 1 :(得分:1)

对于32位应用程序,valgrind + wine也可以作为Windows应用程序的工作解决方案。如果你的应用程序可以在没有任何变化的情况下在wine下运行,那么在valgrind + wine下运行它可以很好地完成我的(非常有限的)体验。由于你的应用程序在Linux下工作,我猜你的应用程序可能会在wine下运行(避免使用非常特定于Windows的代码,而葡萄酒尚不支持)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

DUMA是一个跨平台的泄漏检测库,我将其用于许多项目。这很好,因为您没有#include任何特定于DUMA的标头,而只是在链接到系统的libc(包含内存分配例程)之前以及链接到libstdc ++之后链接到库中。

设置起来可能有点棘手,尤其是在与C ++项目一起使用时,但我认为投入的时间非常值得。它帮助我找到了一些内存泄漏之前我可能没有发现其他情况,以及一个我删除了两次分配的情况。

一个注意事项:如果您构建静态存档(在Windows上默认构建)会更容易,因为它有助于减少实际上由漏洞运行时引起的“误报”。

答案 4 :(得分:0)

MacOS X上有leaks工具(我不知道它是否存在于其他地方),我曾经在linux上使用过一个名为memprof的工具。还有valgrind可以在linux上工作,并且非常棒,但是性能大幅下降,表面上是macos但我还没有尝试过。

然而,我并不知道Windows上的任何此类工具。

答案 5 :(得分:0)

在较新版本的gcc中,有一种叫做泄漏消毒剂的东西。您只需要将-fsanitize=leak添加到编译命令。然后你正常运行你的程序,最后,如果有任何泄漏,你会得到摘要(当然在终端)。