Q:如果出现异常时windbg没有设置为默认调试器,那么异常发生将弹出一个异常框,我保存了dump后,如何查找到异常出现的栈信息呢?
A:通常有以下几个方法:
1:获取到dump时,可以首先运行命令“!analyze –v”,如果输出如下:STACK_TEXT: 00bbffc8 7c971e68 00000005 00000004 00000001 ntdll!DbgBreakPoint00bbfff4 00000000 00000000 00000380 00001000 ntdll!DbgUiRemoteBreakin+0x2d说明这个dump是事后使用调试工具获取的,windbg会认为是dbg线程导致,所以这个分析没有效果;
2:使用命令“~*kv”,打印出所有线程栈,然后查看线程栈中是否有类似throwException或UnhandledExceptionFilter类的函数,说明该线程存在异常,使用命令~Ns,切换到该线程,执行“kv 100”或使用!Teb命令打印调用栈信息,查看异常点。
相同的方法:
搜索 !findstack kernel32!UnhandledExceptionFilter
!findstack ntdll!KiUserExceptionDispatcher
看到出现第几个线程,则跳转到第几号线程
3:如果使用以上方法都还没有效果的话,就采用这种方法,对大部分异常均有效果:使用命令(不带引号)“~*e r? $t1 = ((ntdll!_NT_TIB *)@$teb)->StackLimit; r? $t2 = ((ntdll!_NT_TIB *)@$teb)->StackBase; !teb; dps @$t1 @$t2”,对输出信息查找函数“KiUserExceptionDispatcher”,并记录下第二个地址值,使用“.cxrxxxxxxx”,切换栈信息,kv 即可
本文介绍了使用Windbg分析程序异常栈的几种方法,包括利用特定命令定位异常发生的线程及调用栈信息,适用于未设置Windbg为默认调试器的情况。

1171

被折叠的 条评论
为什么被折叠?



