WinDbg分析dump文件
一、 符号文件路径设置
Windbg分析dump文件需要有与当前程序匹配的符号文件 pdb ,否则无法有效的进行分析。首先设置符号文件pdb的路径,在调试自己的程序崩溃问题时,可以移除默认符号路径中包含的微软服务器路径,以避免大量时间在下载系统对应的符号文件,常用的设置符号路径可以在界面设置或者用命令行进行设置:
- 在Settings页面进行设置:
![]()
- 在命令行进行设置,打开dmp文件之后无法正确加载对应的pdb文件,需要重新设置路径并加载:
.sympath D:\WorkSpace\Test_Cpp\x64\Debug;D:\tmp:使用.sympath设置路径,多个路径时用分号隔开。.reload:设置完成之后重新加载.reload /f 模块名称:强制加载某个模块
二、 打开并分析 dump 文件
通过 Open dump file来打开文件相关的dmp文件,WinDbg界面会显示相关的信息。
1. 指令分析:
-
!analyze -v:自动分析加载的dmp文件,显示崩溃类型概要,如 Unhandled exception: C0000005.ACCESS_VIOLATION,主要关注:- \(ExceptionAddress\): 异常发送的大概位置
- \(ExceptionCode\): 异常的原因
-
kpn:显示带参数和符号的堆栈信息,k命令显示当前线程的堆栈信息,结合其它的参数来显示不同信息和格式- 如果符号文件完全匹配,就会显示出崩溃代码所在的文件和具体的行数,如图显示崩溃在 main.cpp的第154行,结合对应的代码可以查看到是空指针的调用导致的:
![]()
-
kb:显示简要调用栈信息,作用与kpn类似 -
dv /t /v:查看当前函数的所有局部变量 -
dt this:查看当前对象成员是否有效,如果未初始化可能显示为 (null)
2. 检查模块是否匹配
如果执行以上的分析之后,无有效的信息输出,那可能是pdb与崩溃的程序版本不匹配,可以使用如下指令进行分析:
lm vm A00_GeneralTest :其中A00_GeneralTest为当前模块的名称,输出包含:
- C (export symbols) : 表示未能成功加载pdb文件
- C (private pdb symbols):表示已经成功加载对应的pdb文件,显示如下
![]()
3. 问题:执行堆栈指令 k 不显示崩溃代码行
在执行指令的时候,不显示崩溃代码的具体行号,一般需要进行如下操作进行尝试:
- 确认符号路径是否正确,是否正确加载符号文件pdb:
.sympath D:\PdbFolder\:设置pdb的正确路径,会直接覆盖之前的符号文件路径.reload: 重新加载pdb
- 必须要切换到异常上下文
.ecxr:将寄存器和堆栈恢复到崩溃发生那一瞬间的状态
- 查看堆栈信息:
k:查看基本的堆栈信息,此时会显示具体的行号。(如果仍旧不能显示,可能是行号显示被关闭,需要先执行.lines -e开启行号显示,再执行k显示堆栈信息)
其它command
.symfix:让 WinDbg 自动去微软的服务器下载 Windows 系统文件(如 ntdll.dll, kernel32.dll 等)的符号文件,如果缺少系统文件一般分析时会报错 WRONG_SYMBOLS



浙公网安备 33010602011771号