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


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

这个问题与其他问题类似(例如 Windows下用于GNU C / C ++的内存泄漏检测 )但我觉得它是不同的,因为那些要求Windows特定的解决方案或有我宁愿避免的解决方案。我觉得我在这里寻找更具体的东西。建议不必满足所有要求,但尽可能多的是好的。

谢谢。

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

注意:虽然我可以尝试答案,但在我尝试了这个建议并且令人满意之前,我不会将其标记为已被接受。

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


12767
2018-06-27 05:04


起源



答案:


Valgrind的 是你的 最好的朋友。 Valgrind有一个 插入 为了日食。 “可悲的是”Valgrind不能在Windows上运行,但它运行在Mac OSX,* BSD和Linux上,因此我认为这是“多平台”。 :)

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


10
2018-06-27 06:14





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


1
2018-06-27 06:48



你的意思是使用Wine作为api实现在* nix上重新编译windows app? (我只是好奇) - olliej
valgrind适用于x86_64以及PowerPC,MIPS,ARM和其他架构。 - LiraNuna
不,我的意思是在valgrind下在wine下运行你的windows二进制文件,未经修改。这就是为什么我只提到了32位:valgrind无法在支持64位的葡萄酒下运行应用程序,64位支持的葡萄酒是实验性的(64位,我的意思是运行64位Windows应用程序) - David Cournapeau
就是这样: wiki.winehq.org/Wine_and_Valgrind - LiraNuna


答案:


Valgrind的 是你的 最好的朋友。 Valgrind有一个 插入 为了日食。 “可悲的是”Valgrind不能在Windows上运行,但它运行在Mac OSX,* BSD和Linux上,因此我认为这是“多平台”。 :)

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


10
2018-06-27 06:14





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


1
2018-06-27 06:48



你的意思是使用Wine作为api实现在* nix上重新编译windows app? (我只是好奇) - olliej
valgrind适用于x86_64以及PowerPC,MIPS,ARM和其他架构。 - LiraNuna
不,我的意思是在valgrind下在wine下运行你的windows二进制文件,未经修改。这就是为什么我只提到了32位:valgrind无法在支持64位的葡萄酒下运行应用程序,64位支持的葡萄酒是实验性的(64位,我的意思是运行64位Windows应用程序) - David Cournapeau
就是这样: wiki.winehq.org/Wine_and_Valgrind - LiraNuna


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


1
2018-06-27 17:02





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

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

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


1
2018-05-30 13:30





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

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


0
2018-06-27 06:35





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


0
2018-02-19 22:11