手握利器,直面“蓝脸”
2009-02-10 10:18:42 来源:WEB开发网.hh bug check 0xCE
命令,在打开的窗口左栏右下角点击“Display”按钮。如果要在WinDbg中显示一个停止代码或者错误检查类的详细说明(以此错误为例),键入命令
!analyze -show 0x000000CE
或者
!analyze -show 000000CE
也可以是
!analyze -show 0xCE
区域3中显示的就是二审判决的重要信息——线程堆栈信息。特别注意红色框内的部分,第一行是“WARNING: Frame IP not in any known module. Following frames may be wrong.”意思就是“警告:堆栈帧IP(InstructionPtr,仅x86处理器,用于决定帧的堆栈回朔的指令指针)不存在于任何已知的模块中,下面的帧可能出现错误”。这个意思的解释已超出本文讨论范围,笔者仅告诉大家,这行文字下面的一行右侧的模块是系统蓝屏崩溃时刻使用的最后一个模块(除了Windows内核最后调用KeBugCheckEx牺牲自己,就是警告文字上方的三行),往往就是它引起了崩溃!我们来细看。大家如果了解了堆栈的数据结构或是Windows内存分配机制就应该知道,Windows为线程分配额外内存时是从高地指向低地址进行的,就是说,蓝色区域3中的堆栈信息我们得倒过来由下往上看,这样才是系统崩溃之前的一刻内核态函数的调用和传递情况,比如此例,系统内核执行体(nt!,即Ntoskrnl.exe)通过函数IopfCallDriver调用了BaseTDI,然后BaseTDI又调用了HookUrl.sys(Unloaded_字样表示未加载),再然后就蓝屏了。那么在这最后一刻就涉及到了两个非Windows内核的模块——BaseTDI以及HookUrl.sys。之所以要进行这个“二审判决”,就是要避免一种情况——万一HookUrl.sys与BaseTDI是来自两个公司或者两个软件的模块,而最后加载的HookUrl.sys是没有问题的,出错是因为BaseTDI给HookUrl.sys传递了格式错误或者已被破坏的、或者非法的参数信息,HookUrl.sys接受此无效数据而引发了崩溃。如果我们不看线程栈,就根据之前的“Probably Cause by:HookUrl.sys”进行判决,我们很有可能枉杀无辜而让凶手逍遥法外。只有通过线程栈我们才能发现另一个驱动程序BaseTDI也被牵连进来。(在应用程序崩溃不致系统崩溃的调试分析中,由于处于用户态,WinDbg自动分析结果中的“Probably Cause by:”几乎都是错误的。在这种情况下,使用!thread命令是不能显示出任何信息的,因为这个命令仅对内核态的崩溃调试有效,然而kb命令也显示不出有用的信息,只有用“~*kb”来显示详细的全部线程栈才可能发现问题根源,有的时候还需配合其他命令,本文不作讨论)
更多精彩
赞助商链接