需注册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会导致进程静默终止,且无法触发你的处理函数】。
立即学习“C++免费学习笔记(深入)”;
在异常处理函数中安全创建MiniDump
使用MiniDumpWriteDump API生成dump文件,需严格遵循以下步骤顺序:
第一步:调用GetCurrentProcess()和GetCurrentThread()获取当前进程与线程句柄;
第二步:使用CreateFileW以CREATE_ALWAYS标志打开目标路径的.dmp文件,指定FILE_FLAG_WRITE_THROUGH避免缓存导致崩溃后数据丢失;
在 Windows 11 上"直接发声"的 TTS(从 WSL2/TUI 调用 powershell.exe + System.Speech)。适用于用户说"说出来/读出来/语音播报/用TTS",或反馈"没声音/tts 生成的 mp3 是空的/播不出来",以及需要中文语音但 OpenClaw 内置 tts 不可用时。
第三步:构造MINIDUMP_EXCEPTION_INFORMATION结构体,将ExceptionPointers参数原样传入,确保异常上下文不被截断;
第四步:调用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数组硬编码拼接。

















