一、Dump 分析完整流程(7步)
- 准备环境
准备对应系统版本的符号文件(PDB),配置符号路径(微软公共符号 + 本地PDB)。 - 加载Dump
使用 Windbg / x64dbg / Visual Studio 打开 Dump 文件。 - 定位异常信息
执行命令查看异常码、异常地址、异常类型。 - 回溯调用栈
显示崩溃时的函数调用链,定位崩溃指令位置。 - 定位崩溃模块
查看异常地址属于哪个模块(EXE、系统DLL、第三方DLL)。 - 分析上下文
查看寄存器、内存数据、指针、字符串,判断非法访问来源。 - 根因归类
区分是业务逻辑、内存越界、第三方库、驱动、系统异常。
二、如何定位崩溃栈、异常码、模块、调用链
1. 定位异常码
- 常见异常码:
- 0xC0000005 内存访问违例(最常见)
- 0xC00000FD 栈溢出
- 0xC000001D 非法指令
- 0x80000003 断点中断
- Windbg 命令:
!analyze -v(自动输出异常信息)
2. 定位崩溃栈与调用链
- Windbg 命令:
k:简单栈回溯kb:带参数栈kp:带完整函数名kv:带帧指针信息
- 看栈顶第一行:就是崩溃发生的函数。
3. 定位崩溃模块
- 用
lm命令列出所有加载模块。 - 看异常地址落在哪个模块范围内:
- 自己的 EXE → 业务代码问题
- ntdll / kernel32 → 系统层问题
- 第三方 DLL → 库或调用方式问题
三、如何区分崩溃根因
1. 业务逻辑崩溃
- 崩溃地址在自己的EXE代码段。
- 栈里全是业务函数,无异常第三方调用。
- 常见原因:空指针、逻辑判断错误、资源未初始化。
2. 内存越界/非法访问
- 异常码固定:0xC0000005。
- 访问地址为:0、0xcccccccc、0xdeadbeef 等非法地址。
- 栈显示在读写内存时崩溃,不是函数逻辑内部。
- 常见:野指针、数组越界、释放后使用、缓冲区溢出。
3. 第三方库导致崩溃
- 崩溃地址落在第三方DLL内。
- 栈顶是库函数,上层是自己的调用代码。
- 常见原因:
- 参数传错
- 句柄无效
- 版本不匹配
- 未按规范初始化/反初始化
四、总结
Dump分析流程:配符号→加载→!analyze -v→看异常码→回溯调用栈→定位模块→区分是业务逻辑、内存越界还是第三方库问题;0xC0000005基本是内存非法访问,栈顶在自家EXE是业务问题,在DLL是库或调用问题。
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/bayinglong/article/details/160890314



