Dr. Memory在Windows上能检测new/delete不匹配、malloc越界读写、释放后使用(UAF)、栈缓冲区溢出、未初始化内存读取及内存泄漏等问题。

Dr. Memory在Windows上能检测哪些C++内存问题
Dr. Memory不是编译器插件,也不是链接时工具,它是在运行时动态插桩的二进制分析器——这意味着你不需要改代码、不需重新编译,只要生成带调试信息的 .exe(推荐 /Zi + /DEBUG),就能查出 new/delete 不匹配、malloc 后越界读写、释放后使用(UAF)、栈缓冲区溢出、未初始化内存读取等典型问题。
它对 MSVC 生成的 x64/x86 程序支持较好,但不支持 LTO(链接时优化)或 /GL 编译选项;若用了 /LTCG 或 /O2 且没保留符号,报告里的调用栈可能退化到模块+偏移,定位困难。
怎么正确启动Dr. Memory并捕获C++程序的泄漏报告
直接双击运行会闪退,必须通过命令行。关键点是:路径不能含空格或中文,输出日志必须显式指定,否则默认只打屏且易丢失。
- 确保已从 drmemory.org 下载最新 Windows 版(如
DrMemory-Windows-2.5.1-0-g7e2297c.zip),解压后进入bin\目录 - 用管理员权限打开 cmd 或 PowerShell(仅当程序需要提权时才必需,普通检测不用)
- 执行类似命令:
drmemory.exe -batch -log_file drmem.log -- your_program.exe
-
-batch避免弹 GUI 窗口;-log_file必须紧跟其后(不能有空格);--之后才是你的可执行文件及其参数
运行结束后检查 drmem.log:真正有用的报告在末尾的 “Error #1: UNADDRESSABLE ACCESS” 或 “LEAK DETECTED” 段落,前面大量 “app exit” 或 “warning: unable to open …” 可忽略。
立即学习“C++免费学习笔记(深入)”;
Windows 命令行编码与兼容规范。涵盖 GBK/UTF-8 编码、PowerShell/pwsh 互操作、Python/Node.js、Git 配置及代码生成规则。适用于 Windows 10/11 + MSYS2/Git Bash 环境下的所有命令行操作。
为什么Dr. Memory报告里看不到C++源码行号
常见原因是 PDB 文件没被找到,或路径不匹配。Dr. Memory 不读取 IDE 工程配置,只按固定规则查找:
- PDB 必须和 EXE 在同一目录,且文件名严格匹配(如
app.exe对应app.pdb) - MSVC 默认生成的 PDB 是全局唯一的 UUID,Dr. Memory 会校验;若你手动复制过 PDB 或用了增量链接(
/INCREMENTAL),可能因 UUID 不一致而跳过符号解析 - 不要用
/Z7(将调试信息嵌入 OBJ),它生成的 PDB 不兼容 Dr. Memory;必须用/Zi生成独立 PDB - 如果用了 CMake,默认
set(CMAKE_DEBUG_POSTFIX "d")会导致appd.exe找appd.pdb,但若你误删了 d 后缀的 PDB,就会静默失败
验证方法:用 dumpbin /headers your_program.exe | findstr "debug" 看是否含 “debug directories”,再用 cvdump -s your_program.pdb(来自 VS 工具链)确认符号表非空。
和AddressSanitizer比,Dr. Memory在VS项目里更难配吗
是的,而且难在不可见的地方。ASan 只要加 /fsanitize=address(VS 2019 16.8+ 支持)就自动注入,而 Dr. Memory 完全脱离编译流程,导致两个典型冲突:
- 如果你的程序用
SetThreadStackGuarantee或自定义堆(如HeapCreate),Dr. Memory 可能无法拦截分配行为,漏报堆错误 - 某些第三方 DLL(尤其是反作弊、录屏、杀软驱动 hook 的 DLL)会干扰 Dr. Memory 的内存保护机制,表现为程序立即崩溃或报告大量“false positive UNADDRESSABLE ACCESS”
- Dr. Memory 对 C++ 异常栈展开支持有限:抛异常时若涉及 STL 容器内部临时对象,调用栈可能中断在
std::_Throw而非你的throw行
建议策略:先用 ASan 快速筛基础问题;Dr. Memory 留给 ASan 报不了的场景——比如怀疑某段代码触发了 Windows 特定堆管理行为(如 Low Fragmentation Heap 切换),或需要验证 Release 版本(ASan 不支持 /O2 全优化)。

















