GCC内存泄漏检测相当于Microsoft crtdbg.h?

Gen*_*man 25 c c++ xcode gcc memory-leaks

经过多年在通用的C++使用Visual Studio中的微软MSVC编译器库,我们现在将它移植到Linux/Mac OS X的工作(请为我们祈祷).我已经习惯了并且非常喜欢MSVC中简单的内存泄漏检测机制:

#ifdef DEBUG
    #define _CRTDBG_MAP_ALLOC
    #define NEW   new( _NORMAL_BLOCK, __FILE__, __LINE__)
    #include <stdlib.h>
    #include <crtdbg.h>
#else
    #define NEW   new
#endif
Run Code Online (Sandbox Code Playgroud)

每个内存分配都使用此NEW宏完成.只要使用我们的库终止的过程,任何内存泄漏(即尚未解除分配块)与在内存最初分配的文件和行号一起通知的控制台上.

我喜欢的部分是我不必主动"运行性能工具"或以其他方式表明我正在寻找泄漏.每次进程终止时,都会在正常的开发过程中向我报告泄漏.

现在我们正在转向GCC世界,我发现内存泄漏检测工具,其中许多非常复杂,需要我明确表明我处于泄漏搜索模式.我的IDE是Xcode,我已经研究了一些分配/泄漏检测工具(比如Instruments和MallocDebug),但我承认我还没有花时间完全了解它们.事实上,我实际上必须提前说明我正在寻找泄漏,而不是自动提醒它.

我正在使用Xcode 3.2,我听说现在已经与静态分析工具进行了很好的集成,但我再也没有考虑过这个问题.我正在寻找一些关于我的选择的想法.GCC和/或Xcode中是否有类似的机制?是否有一个简单的第三方库或工具可以执行我所熟悉和喜爱的基本功能?或者我应该吮吸它并学习新的做事方式?

小智 19

您有多种选择.

首先,也是最常见的,您可以在Valgrind等工具下运行您的应用程序.这应该指向一些内存滥用,例如NULL指针读取和写入以及内存泄漏.Valgrind套件中有许多工具可供选择,因此请务必查看它们.

其次,您始终可以使用使用LD_PRELOAD技巧的库.基本上,LD_PRELOAD技巧允许DLL注入,这意味着可以创建工具来帮助跟踪应用程序中的内存使用情况,而无需进行任何更改.您会发现dmallocefence等工具在它们提供的调试工具中非常广泛.

最后,最近的GCC发布包括一个名为Mudflap的工具.这基本上使用函数检测来包围与dmalloc,efence和Valgrind相同的内存函数的调用.该程序将明显变慢,并且可以在运行时进行调整,尽管它看起来仍然具有很大的潜力.

我已经使用了所有三个并且发现Valgrind非常有用.我一直对使用Mudflap很感兴趣,尽管我还没有.


Cri*_*dam 15

您应该看看" 跨平台内存泄漏检测器 ",看起来非常类似于crtdbg.h技术.


gri*_*igy 9

您可能还会发现MALLOC_CHECK_环境变量很有用.

来自malloc(3)手册页:

最新版本的Linux libc(晚于5.4.23)和glibc(2.x)包含一个malloc()实现,它可以通过环境变量进行调整.当设置MALLOC_CHECK_时,使用一个特殊的(效率较低的)实现,它被设计为容忍简单错误,例如使用相同参数的free()的双重调用,或者单个字节的溢出(off-by-one bug) ).但是,并非所有此类错误都可以得到保护,并且可能导致内存泄漏.如果MALLOC_CHECK_设置为0,则会自动忽略任何检测到的堆损坏; 如果设置为1,则在stderr上打印诊断消息; 如果设置为2,则立即调用abort(3); 如果设置为3,则在stderr上打印诊断消息并中止程序.使用非零MALLOC_CHECK_值可能很有用,因为否则崩溃可能会在很晚之后发生,因此很难找到导致问题的真正原因.