使用_crtBreakAlloc,_CRTDBG_MAP_ALLOC跟踪插件中的内存泄漏

时间:2011-09-22 06:37:10

标签: c++ visual-c++ plugins memory-leaks after-effects

我们有几个后效插件,我们有充分的证据可以泄漏内存。为了研究这个问题,我在vcc编译器/运行时中使用Memory Leak Detection and Isolation。我启用了泄漏检测:

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

我得到了很好的漏洞。但是,我没有获取文件名和行号。我最好的猜测是,这是因为我正在构建一个dll,它被后效exe所消耗,而#define需要在可执行文件中进行,而不是我的插件(这不完全适合我的心理模型)这个定义和包含实际上做了什么,但它是我能想到的最好的。)

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

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

1 个答案:

答案 0 :(得分:1)

您必须使用相同的#define重新编译这些DLL - 它们将对malloc()的调用转换为对malloc_dbg()的调用,这将启用转储中的文件名和行号。这就是所有“泄漏检测”所做的 - 每个分配都传递了文件名和行号,然后存储并稍后转储。无法调用malloc_dbg() - 没有文件名,也没有行号。

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