1. 可以用everything软件工具搜索本机。如果没有windbg的话,可以去下载一个(根据需求选择x64或x86)。现在微软不提供单独的windbg下载,可以下载一个完整的windows sdk,在安装时只选择windbg即可。
2. 双击打开WinDgb.exe软件,File->Open Crash Dump。可能一打开dump,就找到了崩溃发生的位置,此时命令行前面的数字就表示了崩溃的线程编号"0:threadId>",比如0:128>就表示崩溃发生在128号线程。
3. 命令行输入".excr",定位到发生崩溃线程上下文位置。或者执行~128s,手动切换到128号线程上下文。
4.在输出信息中有“模块名!函数名+偏移地址offset1”, 指明了发生崩溃的位置。通过"?模块名!函数名+偏移地址offset1"计算崩溃的具体地址,记作pCrash,再通过"lm m 模块名"查看该模块此次被加载到进程中的基地址,记作pMbase。则该函数相对于模块的偏移地址offset0 = pCrash-offset1-pMbase,只要软件没更新,offset0和offset1每次运行都是不变的。如果找不到pdb符号文件,excr 输出信息中可能会没有函数名,即"模块名+offset",这个offset为offset0+offset1,如果想看这个崩溃位置所在的函数,可以用kn 指令查看当前线程的函数调用栈,最上面那一行就是目标函数信息,这样也可以推算出offset0和offset1。
5. u查看指定地址处的反汇编指令(u 模块名+(offset0+offset1)),默认是可以看到从指定地址起始的后面连续8条汇编指令。如果想看到更多,可以用"u 地址 行数"来查看指定行数的汇编指令。如果想看从给定地址往前的汇编指令,可以用"up 地址 行数",如果所给地址是某个函数的地址,也可以用"uf 地址"查看该函数的完整反汇编指令。
6.~*kn 可查看所有线程的信息,包括线程编号和线程调用栈;~3s 可切换到3号线程,然后执行kp/kn/kv查看当前线程调用栈相关信息。
7.如果还是找不到问题发生的原因,可以到开发环境进一步分析对应的模块反汇编代码(通过IDA逆向工具打开对应二进制模块,将IDA View-A中的内容导出到文本文件:Edit->Select all->Copy)。在模块的反汇编文件中,基地址是.textbss的Imagebase后面的数字,可以根据第4步算出来的offset0和offset1,叠加上这个基地址,就可以定位到出错的指令位置。如果因为软件版本不同,offset0和offset1已经不准确了,那可以用第5步看到的完整函数汇编代码段,尝试去匹配反汇编文件中的位置(因为虽然软件版本不同,但是某个函数内部逻辑大多数情况下不会发生太大变化)。