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 模块名"查看该模块此次被加载到进程中的基地址(start),记作pMbase。则该函数相对于模块的偏移地址offset0 = pCrash-offset1-pMbase,只要模块版本一致,offset0和offset1在不同机器上运行都是不变的。如果找不到pdb符号文件,excr 输出信息中可能会没有函数名,即"模块名+offset",这个offset为offset0+offset1,如果想看这个崩溃位置所在的函数,可以用kn 指令查看当前线程的函数调用栈,最上面那一行就是目标函数信息,call site这一栏中有函数的符号或地址,这样减去pMbase也可以推算出offset0和offset1。
6. 如果看不到模块信息,可能是pdb 符号文件没找到,可以手动增加一个符号文件搜索路径:".sympath+ pdb文件所在文件夹",然后执行reload 指令".reload",重新加载符号。如果需要增加源码文件搜索路径,则可以输入".srcpath+ 源码文件路径",再执行".reload"。
7. u查看指定地址处的反汇编指令(u 模块名+(offset0+offset1)),默认是可以看到从指定地址起始的后面连续8条汇编指令。如果想看到更多,可以用"u 地址 L行数"来查看指定行数的汇编指令