我们有几个 After Effects 插件,我们有充分的证据表明它们正在泄漏内存。为了调查这个,我正在玩弄 Memory Leak Detection and Isolation在 vcc 编译器/运行时。我启用了泄漏检测:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
我得到了一个很好的泄漏转储。但是,我没有得到文件名和行号。我最好的猜测是,这是因为我正在构建一个 dll,它由 after effects exe 使用,并且需要在可执行文件中进行 #define,而不是我的插件(这不完全符合我的心理模型这个定义和包含实际上做了什么,但这是我能想到的最好的)。
所以另一个选项是为特定的内存分配编号设置断点。但是,泄漏的分配不是一组一致的分配数字,因此我在这方面取得的成功有限。
那么,这里有什么想法吗?如何更好地使用这个工具,或者其他方法来调查这个?谢谢!
最佳答案
您必须使用相同的 #define
重新编译那些 DLL - 它们会将对 malloc()
的调用转换为对 malloc_dbg()
这会在转储中启用文件名和行号。这就是所有“泄漏检测”所做的——每个分配都传递文件名和行号,它们被存储并稍后被转储。没有调用 malloc_dbg()
- 没有文件名和行号。
泄漏转储(所有相关函数)也是按运行时进行的——转储是针对当前模块运行时的堆完成的,不一定针对所有模块。由于您的进程中可能有多个 C++ 运行时(每个 DLL 都可以链接到它自己的运行时),因此可能会发生转储根本没有为您期望的运行时完成。
关于c++ - 使用 _crtBreakAlloc、_CRTDBG_MAP_ALLOC 追踪插件中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7510566/