2

我们有几个后效插件,我们有充分的证据表明内存泄漏。为了调查这一点,我在 vcc 编译器/运行时中使用内存泄漏检测和隔离。我启用了泄漏检测:

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

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

所以另一个选择是为特定的内存分配号设置断点。但是,泄漏的分配不是一组一致的分配编号,所以我在这方面的成功有限。

那么,这里有什么想法吗?如何更好地使用此工具,或通过其他方式对此进行调查?谢谢!

4

1 回答 1

1

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

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

于 2011-09-22T06:41:42.230 回答