Windows EXCEPTION_RECORD 结构深度解析
Windows EXCEPTION_RECORD 结构深度解析
EXCEPTION_RECORD
是Windows异常处理机制的核心数据结构,它完整描述了异常发生的所有关键信息。理解这个结构对于调试、崩溃分析和系统级编程至关重要。
1. EXCEPTION_RECORD 结构定义
typedef struct _EXCEPTION_RECORD {DWORD ExceptionCode; // 异常代码DWORD ExceptionFlags; // 异常标志struct _EXCEPTION_RECORD *ExceptionRecord; // 指向嵌套异常的指针PVOID ExceptionAddress; // 异常发生地址DWORD NumberParameters; // 参数个数ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; // 异常参数
} EXCEPTION_RECORD, *PEXCEPTION_RECORD;
2. 各字段详细解析
2.1 ExceptionCode - 异常代码
异常代码是32位值,包含多个部分:
// 异常代码的位布局
// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
// +---+-+-+-----------------------+-------------------------------+
// |Sev|C|R| Facility | Code |
// +---+-+-+-----------------------+-------------------------------+// 严重性位 (30-31)
#define EXCEPTION_SEVERITY_SUCCESS 0x00000000
#define EXCEPTION_SEVERITY_INFORMATIONAL 0x40000000
#define EXCEPTION_SEVERITY_WARNING 0x80000000
#define EXCEPTION_SEVERITY_ERROR 0xC0000000// 客户位 (29) - 1表示客户定义异常
#define EXCEPTION_CUSTOM_BIT 0x20000000// 保留位 (28)
#define EXCEPTION_RESERVED_BIT 0x10000000// 常见异常代码
#define EXCEPTION_ACCESS_VIOLATION 0xC0000005
#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008C
#define EXCEPTION_BREAKPOINT 0x80000003
#define EXCEPTION_DATATYPE_MISALIGNMENT 0x80000002
#define EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008D
#define EXCEPTION_FLT_DIVIDE_BY_ZERO 0xC000008E
#define EXCEPTION_FLT_INEXACT_RESULT 0xC000008F
#define EXCEPTION_FLT_INVALID_OPERATION 0xC0000090
#define EXCEPTION_FLT_OVERFLOW 0xC0000091
#define EXCEPTION_FLT_STACK_CHECK 0xC0000092
#define EXCEPTION_FLT_UNDERFLOW 0xC0000093
#define EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001D
#define EXCEPTION_IN_PAGE_ERROR 0xC0000006
#define EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094
#define EXCEPTION_INT_OVERFLOW 0C0000095
#define EXCEPTION_INVALID_DISPOSITION 0xC0000026
#define EXCEPTION_NONCONTINUABLE_EXCEPTION 0xC0000025
#define EXCEPTION_PRIV_INSTRUCTION 0xC0000096
#define EXCEPTION_SINGLE_STEP 0x80000004
#define EXCEPTION_STACK_OVERFLOW 0xC00000FD
#define EXCEPTION_GUARD_PAGE 0x80000001
#define EXCEPTION_INVALID_HANDLE 0xC0000008// 实用函数:解析异常代码
void DecodeExceptionCode(DWORD exceptionCode) {printf("异常代码: 0x%08X\n", exceptionCode);// 解析严重性DWORD severity = exceptionCode & 0xC0000000;switch(severity) {case EXCEPTION_SEVERITY_SUCCESS:printf("严重性: 成功\n"); break;case EXCEPTION_SEVERITY_INFORMATIONAL:printf("严重性: 信息\n"); break;case EXCEPTION_SEVERITY_WARNING:printf("严重性: 警告\n"); break;case EXCEPTION_SEVERITY_ERROR:printf("严重性: 错误\n"); break;}// 检查是否为客户定义异常if (exceptionCode & EXCEPTION_CUSTOM_BIT) {printf("类型: 客户定义异常\n");} else {printf("类型: 系统定义异常\n");}// 解析常见异常switch(exceptionCode) {case EXCEPTION_ACCESS_VIOLATION:printf("描述: 内存访问违规\n"); break;case EXCEPTION_INT_DIVIDE_BY_ZERO:printf("描述: 整数除零\n"); break;case EXCEPTION_STACK_OVERFLOW:printf("描述: 栈溢出\n"); break;case EXCEPTION_BREAKPOINT:printf("描述: 断点异常\n"); break;default:printf("描述: 未知异常类型\n"); break;}
}
常见代码(十六进制) | 名称 | 含义 |
---|---|---|
0xC0000005 | EXCEPTION_ACCESS_VIOLATION | 内存访问违例(读/写非法地址) |
0xC0000094 | EXCEPTION_INT_DIVIDE_BY_ZERO | 整数除零 |
0xC0000096 | EXCEPTION_PRIV_INSTRUCTION | 特权指令(用户态执行内核指令) |
0x80000003 | EXCEPTION_BREAKPOINT | 断点(int 3) |
0xE06D7363 | MSVC_CPP_EXCEPTION | C++ 异常(由 MSVC 抛出) |
0xC0000374 | EXCEPTION_HEAP_CORRUPTION | 堆损坏 |