2011-09-22 80 views
2

我们有几个后期效果插件,我们有很好的证据泄露内存。为了调查这一点,我在vcc编译器/运行库中玩弄Memory Leak Detection and Isolation。我启用了检漏:使用_crtBreakAlloc跟踪内存泄漏,_CRTDBG_MAP_ALLOC

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

而且我得到了一个很好的泄漏转储。但是,我没有得到文件名和行号。我最好的猜测是,这是因为我正在构建一个dll,它被after effects exe使用,并且#define需要在可执行文件中创建,而不是我的插件(这不完全符合我的心智模型这个定义和包括的内容实际上是做的,但这是我能想到的最好的)。

因此,另一个选项是设置特定内存分配号的断点。但是,泄漏的分配不是一组一致的分配数,所以我已经限制了成功。

那么,这里有什么想法?要么如何更好地使用此工具,要么以其他方式来调查此问题?谢谢!

回答

1

您必须重新编译那些具有相同#define的DLL - 他们将调用malloc()转换为调用malloc_dbg(),这将启用转储中的文件名和行号。这就是所谓的“泄漏检测” - 每个分配都通过文件名和行号,它们被存储并随后被转储。没有呼叫malloc_dbg() - 没有文件名和行号。

也是泄漏转储(所有相关功能)是每运行时 - 转储是为当前模块运行时的堆完成的,不一定适用于所有模块。由于您的进程中可能有多个C++运行时(每个DLL都可以与自己的运行时链接),因此可能会发生转储根本无法完成您期望的运行时。

+0

附近,我已经做了定义,包括和重建。谢谢。 – SirPentor