MiniDumpWriteDump 失败主因是权限不足或句柄非法:需管理员权限+SE_DEBUG_NAME、正确OpenProcess获取目标句柄,且32/64位必须匹配;dump类型应选MiniDumpNormal等组合标志而非FullMemory;符号路径和服务器配置决定WinDbg能否解析dump。

MiniDumpWriteDump 为什么经常失败?权限和句柄是关键
直接调用 MiniDumpWriteDump 失败(返回 FALSE,GetLastError() 常见为 5 或 6)——根本原因不是函数写错了,而是没拿到目标进程的合法句柄,或当前进程缺乏调试权限。Windows 默认禁止普通进程打开其他进程的 PROCESS_QUERY_INFORMATION | PROCESS_VM_READ 权限。
- 对自身进程 dump:必须先用
OpenProcess获取自己的句柄(不能直接传GetCurrentProcess(),它返回伪句柄,MiniDumpWriteDump不认) - 对其他进程 dump:需以管理员权限运行,并启用
SE_DEBUG_NAME权限(调用AdjustTokenPrivileges) - 32/64 位不匹配会导致
ERROR_PARTIAL_COPY (299):32 位程序无法 dump 64 位进程,反之亦然
MiniDumpWriteDump 的 minidump 类型怎么选?别全用 MiniDumpWithFullMemory
MiniDumpWithFullMemory 看起来“最全”,但实际几乎不用——它会把整个进程地址空间(包括共享 DLL 的只读页)都写入文件,体积巨大(几 GB),且多数调试器(如 WinDbg)并不需要它。真正实用的是组合标志:
-
MiniDumpNormal:基础信息(线程、模块、异常)、最小体积,适合崩溃现场快照 -
MiniDumpWithIndirectlyReferencedMemory:额外捕获栈/寄存器指向的内存页(比如局部对象、参数缓冲区),调试时更可靠 -
MiniDumpWithThreadInfo:记录线程创建时间、退出码、TEB 地址,排查死锁/挂起必备 - 慎用
MiniDumpWithFullMemoryInfo:它导出的是MEMORY_BASIC_INFORMATION结构数组,不是内存内容本身,体积小但需配合符号才能解读
dump 文件打不开?检查 pdb 路径和符号服务器配置
生成的 .dmp 文件本身不包含源码或类型信息,WinDbg 加载后显示 “*** ERROR: Module load completed but symbols not loaded for xxx.dll” 是常态。关键不在 dump 文件,而在符号(.pdb)是否可达:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 本地 pdb 必须与编译时完全一致(时间戳 + GUID 匹配),放在与 .exe 同目录或显式用
.sympath+ c:\path\to\pdb添加 - 系统 DLL 符号应配置微软符号服务器:
.sympath SRV*c:\symbols*https://msdl.microsoft.com/download/symbols - 如果用了自定义模块加载(如 LoadLibraryA 动态加载),需在 dump 前调用
MiniDumpWriteDump的CallbackRoutine参数,手动注入模块信息,否则 WinDbg 找不到该模块的基址
如何在程序崩溃时自动触发 dump?结构化异常处理(SEH)比 set_unexpected 更可靠
SetUnhandledExceptionFilter 是 Windows 下捕获崩溃的首选,但要注意它只捕获当前线程的未处理异常;C++ 异常(throw/catch)需额外处理。标准做法是双钩:
立即学习“C++免费学习笔记(深入)”;
- 用
SetUnhandledExceptionFilter捕获访问违规、除零等 SEH 异常 - 用
std::set_terminate捕获未被捕获的 C++ 异常(注意:此时栈已开始展开,MiniDumpWriteDump仍可安全调用) - 回调函数里避免分配内存、加载 DLL 或调用 C 运行时函数(如
fopen),全部用 Windows API(CreateFileW,WriteFile)完成写入 - 示例关键片段:
LONG WINAPI CrashHandler(EXCEPTION_POINTERS* pException) { HANDLE hFile = CreateFileW(L"crash.dmp", GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, pException, nullptr, nullptr); CloseHandle(hFile); return EXCEPTION_EXECUTE_HANDLER; }
结构体对齐、堆栈损坏时,pException 可能无效,所以生产环境建议加一层 __try/__except 保护 dump 写入逻辑本身。
















