GCC内存泄漏检测相当于微软的crtdbg.h?

经过多年在Visual Studio中使用Microsoft MSVC编译器开发通用C ++库后,我们现在将其移植到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

每个内存分配都使用这个NEW宏来完成。 无论何时使用我们的库的进程终止,任何内存泄漏(尚未解除分配的块)都会在控制台上报告,以及最初分配内存的文件和行号。

我喜欢的这部分内容是我不必积极“使用性能工具运行”或以其他方式表明我在寻找泄漏。 在正常的发展过程中向我报告泄漏,每次过程终止。

现在我们正在转向海湾合作委员会的世界,我发现内存泄漏检测工具,其中很多都非常复杂,要求我明确表明我处于泄漏检测模式。 我的IDE是Xcode,我已经研究过一些分配/泄漏检测工具(比如Instruments和MallocDebug),但我承认我没有花时间来充分利用它们。 由于我实际上必须提前指定我正在寻找泄漏,而不是自动提醒泄漏,所以我一直不满意。

我使用的是Xcode 3.2,我听说现在有了一个静态分析工具的漂亮集成,但我还没有看到这一点。 我正在寻找一些关于我的选择的想法。 GCC和/或Xcode中是否有类似的机制? 是否有一个简单的第三方库或工具可以执行我所知道并喜爱的基本功能? 或者我应该吸取它并学习新的做事方式?


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


您有多种选择可供您使用。

首先,也是最流行的,你可以在Valgrind之类的工具下运行你的应用程序。 这应该指向一些内存滥用,如NULL指针读取和写入以及内存泄漏。 Valgrind套件中提供了许多工具,因此一定要检查它们。

其次,您始终可以使用使用LD_PRELOAD技巧的库。 基本上,LD_PRELOAD技巧允许DLL注入,这意味着可以创建工具来帮助跟踪您的应用程序中的内存使用情况,而无需更改任何内容。 您会发现诸如dmalloc和efence等工具在其提供的调试工具中相当广泛。

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

我已经使用了所有三个,发现Valgrind是非常有用的。 我一直对使用Mudflap很感兴趣,尽管我还没有做到。


您也可能会发现MALLOC_CHECK_环境变量很有用。

从malloc(3)手册页:

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

链接地址: http://www.djcxy.com/p/19925.html

上一篇: GCC memory leak detection equivalent to Microsoft crtdbg.h?

下一篇: What Operating Systems Will Free The Memory Leaks?