在Visual Studio中使用Microsoft MSVC编译器开发通用C++库多年后,我们现在将其移植到Linux/Mac (为我们祈祷)。我已经习惯并非常喜欢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每个内存分配都是使用这个新宏完成的。每当使用我们的库的进程终止时,任何内存泄漏(尚未释放的块)都会在控制台上与最初分配内存的文件和行号一起报告。
关于这一点,我喜欢的部分是,我不需要主动地“使用性能工具运行”,或者以其他方式表明我正在寻找漏洞。在开发的常规过程中,每次进程终止时,都会向我报告泄漏。
现在我们转到了GCC的世界,我发现内存泄漏检测工具,其中许多是相当复杂的,需要我明确指出我处于泄漏搜索模式。我的集成开发环境是Xcode,我已经研究了一些分配/泄漏检测工具(如Instruments和MallocDebug),但我承认我还没有花时间完全理解它们。我一直被这样一个事实所拖累,那就是我实际上必须指定我正在提前寻找泄漏,而不是自动提醒它。
我正在使用Xcode3.2,我听说现在有一个很好的与静态分析工具的集成,但我还没有研究过这一点。我想知道我的选择是什么。在GCC和/或Xcode中有没有类似的机制?有没有简单的第三方库或工具可以执行我所知道和喜欢的最基本的功能?或者我应该接受它,学习新的做事方式?
发布于 2009-11-20 18:32:41
您应该看看"Cross-Platform Memory Leak Detector",它看起来与crtdbg.h技术非常相似。
发布于 2009-11-19 14:22:39
您有许多可供选择的选项。
首先,也是最常见的,您可以在Valgrind等工具下运行应用程序。这应该会指出大量的内存滥用,例如空指针读写和内存泄漏。Valgrind套件中有许多可用的工具,因此请务必查看它们。
其次,您可以始终使用使用LD_PRELOAD技巧的库。基本上,LD_PRELOAD技巧允许动态链接库注入,这意味着可以创建工具来帮助跟踪应用程序中的内存使用情况,而无需进行任何更改。您会发现dmalloc和efence等工具在它们提供的调试工具中非常广泛。
最后,最近的GCC版本包括一个名为Mudflap的工具。这基本上使用了函数插装来围绕dmalloc、efence和Valgrind相同的内存函数进行调用。该程序将明显变慢,并且可以在运行时进行调整,尽管它看起来仍然有很大的潜力。
我已经使用了所有这三个工具,并且发现Valgrind非常有用。我对使用Mudflap也很感兴趣,尽管我还不能。
发布于 2009-11-19 14:46:57
您可能还会发现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_值可能很有用,因为否则崩溃可能会在很久以后发生,而问题的真正原因则很难追踪到。
https://stackoverflow.com/questions/1761125
复制相似问题