如何错过异常第一现场找到异常上下文

转载自:http://91dengdeng.cn/2019/05/07/%E5%A6%82%E4%BD%95%E9%94%99%E8%BF%87%E5%BC%82%E5%B8%B8%E7%AC%AC%E4%B8%80%E7%8E%B0%E5%9C%BA%E6%89%BE%E5%88%B0%E5%BC%82%E5%B8%B8%E4%B8%8A%E4%B8%8B%E6%96%87/

 

介绍

前面的章节都在讲解通过SetUnhandledExceptionFilter 设置程序自动捕获异常dump,这类dump通过.ecxr 命令或者 !analyze -v 就可以找到异常,但是在有些情况下(比如别人的项目),没有自动保存异常dump时应该怎么分析呢?

现象

某个新项目在测试环境出现了异常,弹出了一个异常框,这是windows下比较常见的异常框,是因为程序遇到了异常,但是没有设置用户自定异常处理函数,从而触发了windows默认异常处理函数“弹出一个异常提示框”。
这种情况下:
1、不要关闭对话框。使用windbg attach 到该异常程序
2、通过命令 .dump /ma d:\xx.dmp 保存fulldump
分析方法
通过windbg打开xx.dmp,加载系统符号文件。
输入命令

1
~*er?$t1=((ntdll!_NT_TIB*)@$teb)->StackLimit;r?$t2=((ntdll!_NT_TIB*)@$teb)->StackBase;!teb;dps@$t1@$t2

 

这个命令是打印所有线程的调用栈,通过查找“KiUserExceptionDispatcher”来找到异常上下文。

注意:因为如上命令会打印很多信息,所以windbg ui界面是无法显示的,好的办法是将输出都保存到日志文件中, windbg->”edit”->”open/close log file”。

1
在输出的log文件中查找"KiUserExceptionDispatcher",如下

 

1
2
3
4
5
6
7
8
9
10
11
12
044bed64  044ba000
044bed68  00000000
044bed6c  044bf288
044bed70  77a70133 ntdll!KiUserExceptionDispatcher+0xf
044bed74  014bed84
044bed78  [044bedd4]
044bed7c  044bed84
044bed80  044bedd4
044bed84  e06d7363
044bed88  00000001
044bed8c  00000000
044bed90  769cc42d KERNELBASE!RaiseException+0x58

注意其中“[]”的内容,这个地址就是异常上下文地址,最后通过命令
.cxr 044bedd4

kv

就可以找到异常点。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值