windbg 定位崩溃问题

Posted Love流浪的猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windbg 定位崩溃问题相关的知识,希望对你有一定的参考价值。

 

三板斧如下:

 

  1. 使用windbg打开dump文件,设置好对应进程的 pdb 文件(这个很关键。为了避免releas优化导致符号文件错乱,我发布的所有                      release 版都是关闭代码优化的)。
  2. 在windbg的"edit"->"open/close log file"  设置log 路径 “d:\\a.log”
  3. 输入命令 “~*er?$t1=((ntdll!_NT_TIB*)@$teb)->StackLimit;r?$t2=((ntdll!_NT_TIB*)@$teb)->StackBase;!teb;dps@$t1@$t2”

 

         等待完毕,最后打开 d:\\a.log ,查找"KiUserExceptionDispatcher", 并记录下第二个地址xxxxxxxx, 最后 “.cxr  xxxxxxxx”,就可以看到异常点了。

     有时候我们会遇到这样的情况,软件突然崩溃了,而这时候我还没开调试器呢,怎么办? 比如如下代码,因为访问了空指针,等待异常出现后,我们再按照如上方式来分析     

int *p = NULL;

int a = *p + 1;

     

     1、异常出现后,找到对应进场,并保存dump

     2、查找KiUserExceptionDispatcher

     3、切换 .cxr 0010e7e0

    

    一般大家会碰到如下几个问题:

1、~*er?$t1=((ntdll!_NT_TIB*)@$teb)->StackLimit;r?$t2=((ntdll!_NT_TIB*)@$teb)->StackBase;!teb;dps@$t1@$t2   ,输入后,会提示“Couldn\'t resolve error at \'ntdll!_NT_TIB*) .......” : 因为没有设置windows的符号文件。

2、使用KiUserExceptionDispatcher 找到多处异常地址,需要你一个个切换查看可疑点

3、KiUserExceptionDispatcher找到地址,但是.cxr  没有切换到奇怪的栈信息, 那么崩溃可能是由于 踩内存导致(这个需要后面的章节)

4、对于某些栈异常无法捕获dump,需要设置函数 http://www.cnblogs.com/txk1452/archive/2012/08/11/2634022.html

--------------------- 本文来自 corrupt 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/corrupt/article/details/51352318?utm_source=copy 

 

以上是关于windbg 定位崩溃问题的主要内容,如果未能解决你的问题,请参考以下文章

通过查看Windbg中汇编指令及内存中的值去定位软件崩溃问题

使用windbg分析iis崩溃的一个实例

杀鸡焉用牛刀!放下Windbg,让dotnet-stack来快速定位死锁原因

Windbg 堆栈跟踪问题

WINDBG常用方法纪念客户端测试

如何编写会崩溃并生成转储文件的示例代码?