需注册seh异常处理器并安全生成minidump:在main首行调用setunhandledexceptionfilter;异常处理函数中依次获取进程/线程句柄、用create_always和write_through创建dump文件、填充minidump_exception_information、指定完整dumptype;失败时 fallback至临时目录或文本日志。

当C++程序在Windows上遭遇访问违规、栈溢出等未处理异常导致进程崩溃时,需要立即捕获现场并生成可被WinDbg或Visual Studio加载分析的MiniDump文件,确保堆栈、模块、线程上下文等关键信息完整写入磁盘。
注册全局SEH异常处理器
调用SetUnhandledExceptionFilter函数,传入自定义异常处理函数地址,使系统在未捕获异常时自动跳转至此函数执行。该调用必须在main()入口早期完成,否则可能错过主线程首次异常。
这一步操作起来很简单,直接在main函数第一行写:SetUnhandledExceptionFilter(UnhandledExceptionFilter);
注意:不要在DLL的DllMain中调用此函数,【DLL加载期间调用SetUnhandledExceptionFilter会导致进程静默终止,且无法触发你的处理函数】。
在异常处理函数中安全创建MiniDump
使用MiniDumpWriteDump API生成dump文件,需严格遵循以下步骤顺序:
第一步:调用GetCurrentProcess()和GetCurrentThread()获取当前进程与线程句柄;
第二步:使用CreateFileW以CREATE_ALWAYS标志打开目标路径的.dmp文件,指定FILE_FLAG_WRITE_THROUGH避免缓存导致崩溃后数据丢失;
第三步:构造MINIDUMP_EXCEPTION_INFORMATION结构体,将ExceptionPointers参数原样传入,确保异常上下文不被截断;
Windows 命令行编码与兼容规范。涵盖 GBK/UTF-8 编码、PowerShell/pwsh 互操作、Python/Node.js、Git 配置及代码生成规则。适用于 Windows 10/11 + MSYS2/Git Bash 环境下的所有命令行操作。
第四步:调用MiniDumpWriteDump,dumpType参数必须包含MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules,缺一不可——否则WinDbg无法还原完整调用栈或识别已卸载模块。
规避常见写入失败场景
方法一:检查磁盘空间与权限
在CreateFileW返回INVALID_HANDLE_VALUE时,立即调用GetLastError()判断是否为ERROR_ACCESS_DENIED或ERROR_DISK_FULL。若为前者,尝试将dump写入GetTempPathW()返回的临时目录而非程序安装目录。
方法二:禁用AV/EDR干扰
某些安全软件会拦截MiniDumpWriteDump调用并伪造成功返回,实际未写入任何内容。可在调用前插入Sleep(1),再检查目标文件大小是否大于0x1000字节,【小于该值说明dump写入失败,应立即fallback到仅记录ExceptionCode和StackBacktrace文本日志】。
方法三:防止递归崩溃
在异常处理函数内部禁止调用malloc、new、printf、std::string构造等可能触发内存分配或CRT锁的操作。所有字符串拼接使用预分配栈缓冲区,文件路径用MAX_PATH长度的wchar_t数组硬编码拼接。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










