需启用seh(/eha)并注册全局异常处理器,通过exception_pointers获取上下文与调用栈,用minidumpwritedump生成转储或回退至二进制日志,全程禁用堆分配与危险api,仅调用异步信号安全函数。

在Windows平台开发C++程序时,需要捕获由内核触发的严重错误(如访问违规、除零、栈溢出)并避免进程被系统强制终止,以便记录现场信息或执行安全清理。
启用SEH支持并编写顶层异常处理函数
在main函数之前注册全局异常处理器,使用SetUnhandledExceptionFilter设置回调函数。
在项目属性中,将【C/C++ → 代码生成 → 启用C++异常】设为【否】,同时将【启用SEH异常】设为【是(/EHa)】——【必须使用/EHa而非/EHsc,否则C++异常和结构化异常无法共存】。
定义LPTOP_LEVEL_EXCEPTION_FILTER类型的处理函数,返回EXCEPTION_EXECUTE_HANDLER表示已处理,返回EXCEPTION_CONTINUE_SEARCH交还给系统。
在异常处理函数中获取崩溃上下文
接收EXCEPTION_POINTERS*参数,从中提取CONTEXT结构体指针。
调用CaptureStackBackTrace或RtlCaptureStackBackTrace(需#include windows.h>和
从pExceptionInfo->ContextRecord中读取Eip/Rip、Esp/Rsp、Ebp/Rbp等寄存器值,用于定位指令地址;【若未启用调试符号且未保存PDB,仅靠Eip无法还原源码行号】。
通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。
安全导出崩溃快照到磁盘
第一步:调用MiniDumpWriteDump创建小型转储文件,传入当前进程句柄、GetCurrentProcessId()、文件句柄、MiniDumpWithFullMemory、NULL、NULL、NULL。
第二步:确保目标路径所在卷有写入权限且剩余空间≥50MB;若写入失败,改用WriteFile直接写入CONTEXT+前128字节栈内存到二进制日志。
第三步:关闭所有非必要句柄(如GDI对象、文件映射视图),防止dump过程中发生二次异常导致死锁。
避免在SEH处理函数中调用危险API
方法一:禁止调用malloc/new、printf、std::string构造、LoadLibrary、CreateThread等可能引发堆分配或加载DLL的函数。
方法二:使用预分配的静态缓冲区存放日志内容,用_snprintf_s写入,全程只调用InterlockedIncrement、WriteFile、FlushFileBuffers等异步信号安全函数。
方法三:将关键现场数据暂存于TLS(__declspec(thread)变量)或全局volatile数组,由主线程在收到信号后主动读取并处理——这一步操作起来很简单,直接把数据拷贝出来就行。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










