windbg分析dmp,异常记录EXCEPTION_RECORD: (.exr -1) .exr -1 ExceptionAddress: 75cfb5b2 (KERNELBASE+0x0012b5b2) ExceptionCode: e06d7363 (C++ EH exception) ExceptionFlags: 00000001 NumberParameters: 3 Parameter[0]: 19930520 Parameter[1]: 00efd5b8 Parameter[2]: 53a3580c能提供什么信息,如何进一步分析问题
时间: 2025-07-13 08:32:15 浏览: 6
<think>嗯,用户想通过WinDbg分析DMP文件中的EXCEPTION_RECORD信息,了解参数含义和排查方法。首先,我需要回忆EXCEPTION_RECORD的结构,包括异常代码、标志、地址等。用户提到的KERNELBASE+e06d7363可能与C++异常相关,因为e06d7363是Visual C++异常代码。
接下来,我应该考虑如何用WinDbg提取EXCEPTION_RECORD。使用.exr和.exceptptr命令可以查看异常记录。还要检查异常代码,比如0xE06D7363对应的是C++异常,而其他如0xC0000005是访问冲突。用户可能遇到的是空指针或内存损坏,需要分析堆栈和参数。
用户的问题可能涉及错误的堆栈信息,如引用[3]中的情况,堆栈不可信。这时候需要检查线程数或其他代码修改。另外,引用[4]提到的结构体可以帮助解析异常参数,特别是第三个参数可能指向异常对象。
我应该分步骤说明如何分析,包括加载DMP文件、查看异常记录、解析参数、检查堆栈,并给出常见异常代码的解释。此外,调试技巧如使用!analyze -v、lm验证模块、内存检查命令也很重要。需要提醒用户注意堆栈可信度和多线程问题,参考提供的引用资料来支持建议。</think>### WinDbg分析DMP文件中EXCEPTION_RECORD参数的详解与排查方法
#### 1. **EXCEPTION_RECORD结构解析**
在Windows异常处理中,`EXCEPTION_RECORD`记录了异常的核心信息,其结构定义如下:
```cpp
typedef struct _EXCEPTION_RECORD {
DWORD ExceptionCode; // 异常代码(如0xE06D7363)
DWORD ExceptionFlags; // 异常标志(如0x00000001)
struct _EXCEPTION_RECORD *ExceptionRecord; // 链式异常指针
PVOID ExceptionAddress; // 异常发生地址(如KERNELBASE+偏移)
DWORD NumberParameters; // 附加参数数量
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; // 参数数组
} EXCEPTION_RECORD;
```
关键字段说明:
- **ExceptionCode**:标识异常类型,例如:
- `0xE06D7363`:C++异常(对应`RaiseException`调用)[^4]
- `0xC0000005`:访问违规(如空指针解引用)
- **ExceptionAddress**:异常触发时的代码地址(如`KERNELBASE!RaiseException+0x...`)
- **ExceptionInformation**:参数数组,C++异常中通常包含异常对象指针和类型信息[^4]
---
#### 2. **分析步骤与调试技巧**
##### (1) 加载DMP文件并查看异常记录
```bash
# 加载DMP文件
WinDbg -z D:\crash.dmp
# 查看完整异常记录
.exr -1 # 显示最新异常记录
.exceptptr # 显示异常链信息
```
##### (2) 解析异常代码与参数
对于`ExceptionCode=0xE06D7363`的C++异常:
```bash
# 查看参数数量与内容
!exchain # 显示异常链
dd poi(exception_record_address) L4 # 手动查看参数(需替换地址)
```
典型参数结构(如引用[4]所述):
```
参数1:0x19930520 // Visual C++异常标识
参数2:异常对象指针 // 可用于!vcbinfo分析
参数3:类型信息指针 // 对应catch块类型
```
##### (3) 定位异常调用堆栈
```bash
!analyze -v # 自动分析异常(可能需结合.pdb符号文件)
kv 3 # 显示带参数的前3层堆栈
```
---
#### 3. **KERNELBASE+e06d7363的排查方法**
当异常地址显示为`KERNELBASE!RaiseException+0x...`时:
1. **检查异常参数**:
```bash
.exr -1 # 确认是否为C++异常(参数1是否为0x19930520)
!vcbinfo 参数2 # 解析异常对象内容
```
2. **符号文件验证**:
```bash
lm vm kernelbase # 检查KERNELBASE模块符号加载状态
.reload /f # 强制重新加载符号
```
3. **线程状态检查**:
```bash
~*k # 显示所有线程堆栈(排查多线程问题)
!runaway # 查看线程CPU占用时间
```
---
#### 4. **常见问题排查案例**
- **案例1**:堆栈显示`BUCKET_ID: APPLICATION_FAULT_NULL_CLASS_PTR_READ`但代码不一致
解决方法:检查近期代码修改(如线程启动/停止数量不匹配)[^3]
- **案例2**:异常对象指针无效
解决方法:使用`!heap`或`!address`检查内存损坏:
```bash
!address 参数2 # 查看异常对象内存属性
!heap -p -a 参数2 # 检查堆分配情况
```
---
阅读全文
相关推荐

















