c++ - 使用 _crtBreakAlloc、_CRTDBG_MAP_ALLOC 追踪插件中的内存泄漏

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

我们有几个 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/

相关文章:

c++ - 需要解释从 3d 数组到 1d 数组的 memcpy

c++ - 结构化输出

ios - Flutter iOS 存档版本在 Xcode 中获取 'xx plugin.h' 文件未找到错误

visual-c++ - WASAPI 没有声音输出

debugging - C++ CLI/TS3 客户端在插件上崩溃

php - 创建自定义 joomla 验证码

c++ - 从 Visual Studio C++ 项目在 cmd 行上运行 .exe

c++ - std::string::empty() const () 不抛出段错误

c++ - 运行时检查失败 #2 MSVC 仅使用 utf8proc 进行调试

windows - 在所有未使用的情况下,进程外 COM 服务器最终是否应该停止?