minidump为程序意外中止的瞬间系统及程序运行状况的一个快照,包含的信息如下:
导致中止的原因描述
加载的驱动程序的列表
已停止的处理器的上下文 (PRCB)
已停止的进程的信息和内核上下文 (EPROCESS)
已停止的进程的信息和内核上下文 (ETHREAD)
已停止的线程的内核模式调用堆栈
由于minidump内容有限,所以有时候可能并不能分析出程序真正中止的详细原因
本着物尽其用的原则,我们来详细描述下拿到minidump文件之后,怎样一步步分析出导致程序崩溃的真正原因,本文默认大家都有程序的完整符号文件pdb
1 拿到minidump之后,把pdb文件路径配置进windbg中,分析的时候好解析出来dump里面的各个符号,同时如果想看到源代码,则需要同时把源代码路径配置进工作空间中
2 !analyze -v 查看崩溃详细信息
3 .ecxr定位到堆栈上下文,最好使用 ctrl+alt + v启动Verbose 详细模式,启动之后各命令输出的内容会相应地附加上更多的信息,比如dv命令会打印出各局部变量在栈上的地址
4 如果pdb路径设置正确,那么此时堆栈中的内容已经替换为相应的函数调用信息了,如果没有的话就用 lm命令查看下各dll对应的pdb是否正确加载
5 用.frame n命令定位到特定层的,同时使用 ? @$frame命令可以查看到当前的栈帧号,$frame为windbg定义的伪寄存器,其他类似的伪寄存器有$scopeip 当前栈帧中当前执行的指令
6 使用dps @address 可以查看栈上一部分内容,默认为32*4字节,可以在后面添加参数 比如 L40则显示的长度为64*4字节
7 uf 函数名 可以查看各函数反汇编后的汇编代码,再结合栈上的数据可以查到相关的变量信息并根据这些信息推断崩溃原因。