蓝屏Word下载.docx
《蓝屏Word下载.docx》由会员分享,可在线阅读,更多相关《蓝屏Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
![蓝屏Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/23/88198e45-e09b-412a-a599-ae68716d5386/88198e45-e09b-412a-a599-ae68716d53861.gif)
1、运行在内核模式下的设备驱动程序或者操作系统函数引发了一个未被处理的异常,比如内存访问违例(由于企图写一个只读页面或者企图读一个当前未被映射的内存地址(即无效地址)而引起)。
2、调用一个内核支持例程导致了重新调度,比如当中断请求级别(IRQL)为DPC/Dispatch级别或更高级别时等待一个标记为需要等待的调度对象。
3、在DPC/Dispatch级别或更高的IRQL级别时由于数据存在于页面文件或内存映射文件中而发生了页面错误(PageFault)。
(这将要求内存管理器必须等待一个I/O操作发生。
但正如上面一项所说,在DPC/Dispatch级别或更高IRQL级别上不能够进行等待,因为那将要求一次重新调度)。
4、当检测到一个内部状态表明数据已遭受破坏或者在保证数据不被破坏的情况下系统无法继续执行时,设备驱动程序或操作系统函数明确地要求系统崩溃(通过调用系统函数KeBugCheckEx)。
5、发生硬件错误,比如处理器的计算机检查异常功能(MachineCheck)报告有异常或者发生不可屏蔽中断(NMI)。
在了解以上三点知识之后,相信您对Windows的大无畏牺牲精神会有所赞赏,也会原谅它的“蓝脸”了。
其实,在绝大多数情况下均是第三方设备驱动程序导致了Windows的崩溃。
对于WindowsXP用户提交给微软在线崩溃分析(MicrosoftOCA,MicrosoftOnlineCrashAnalysis)站点的内存转储文件,微软对引起崩溃的原因进行了统计分类,如下图所示:
(数据于2004年4月份生成)。
既然Windows向我们露出了无奈的“蓝脸”,我们就应该打破沙锅问到底,尽早将引发系统崩溃的罪魁祸首缉拿归案,让我们的系统早日康复。
下面,我们来看看Windows想通过这张“蓝脸”告诉我们些什么。
如上图所示,这是一张显示了所有参数的蓝屏图像。
当然,我们所遇到的蓝屏图像与之可能存在差异,比如少了一些信息等,但是大致是相同的,我们就以它为例进行全面地阐述。
首先,我们看看图中用数字1标注的区域,这里列出了传递给KeBugCheckEx函数的停止代码和四个参数。
此图中的停止代码为0x000000D1,四个参数为后面括号内的用逗号分隔的四段16进制数字;
接下来,我们来看看图中用数字2标注的区域,这里显示的是该停止代码0x000000D1对应的英文解释;
最后,我们看看图中用数字3标注的区域,这个区域当且仅当停止代码的四个参数中的一个参数包含了操作系统或设备驱动程序代码的地址时才会显示,显示的内容为、该地址所处模块的基地址以及日期戳。
如此例中,该设备驱动程序的文件名为“myfault.sys”。
这些信息对我们排错有何作用呢?
如果上图中的区域3出现了,那是最好的结果了,因为您直接就看到了罪魁祸首——“myfault.sys”文件。
但是,区域3往往是不出现的,那么我们就要在Microsoft的在线帮助和支持()中查找该停止代码等信息或者使用我们的利器——WinDbg进行手动分析了。
笔者推荐后者,因为同一个停止代码可能由各种各样的驱动程序错误造成,得到了停止代码并不等于得到了问题文件名称,另外,微软的在线帮助和支持中不是所有的错误都能够搜索到,而WinDbg正好克服了这两个弱点,直接能够抓出罪魁祸首文件,让您痛快将其斩首。
WinDbg是免费软件,其微软官方下载地址是DebuggingToolsforWindows32/64-bitVersion。
使用WinDbg分析崩溃时的内存转储文件的前提是您要让系统在崩溃时自动生成一个内存转储文件,做法如下:
1、单击开始,然后单击运行。
2、键入
1.controlsysdm.cpl
复制代码
,然后单击确定。
您将会打开系统属性,请切换到高级选项卡。
结果如下图所示:
3、在高级选项卡上,在启动和故障恢复部分中单击设置。
这将打开启动和故障恢复对话框,如下图所示:
4、在写入调试信息列表中,选择“小内存转储(64KB)”或“核心内存转储”,这样系统在崩溃时将会自动生成对应的内存转储文件。
如果您不想让蓝屏只闪烁一下,而是想看清楚它直到您手动重新启动计算机,请清除系统失败部分中自动重新启动(R)项目前的复选框。
然后单击确定。
5、在启动和故障恢复对话框中,单击确定。
6、单击确定关闭系统属性对话框。
7、在系统设置更改对话框中,如果要立即重新启动计算机,则单击是;
如果要稍后重新启动计算机,则单击否。
注:
∙Vista用户请类似操作。
∙对于原版操作系统,以上设置是默认的(除了禁止自动重新启动)。
∙对于第4点中的写入调试信息列表内容,现给出以下参照释义:
(以上三种转储文件的大小依次增大,关于三者的比较不在本文讨论范围之内,笔者仅推荐设置为“小内存转储”或者“核心内存转储”,一般性错误“小内存转储”就足够了,如不能完好分析请选择“核心内存转储”。
为了数据的丰富性,您也可以直接选择“核心内存转储”,但笔者强烈不推荐完全内存转储。
)
值得注意的是,为了确保崩溃时自动生成内存转储文件,您可能还须启用虚拟内存页面文件。
特别地,当您选择记录核心内存转储时,您必须启用虚拟内存页面文件,而且由于核心内存转储文件的大小取决于该机器上操作系统和所有活动驱动程序已经分配的内核模式内存的数量,因此没有很好的办法来预测内核内存转储的大小。
下表仅给出该情况下的参考虚拟内存大小设置值:
另外,除了页面文件占用的磁盘空间,内存转储文件(*.DMP)的生成位置所在的磁盘还要有足够的空闲空间来提取这个转储文件,否则一样会“生成不了”(实际上是丢失了)。
设置好这些之后,一旦您的系统发生蓝屏崩溃,系统就会在以上设置中选中的相应内存转储文件类型下对应的目录处生成转储文件。
您所要做的就是立刻拿出利器——启动WinDbg进行分析。
笔者在此将结合一个实例进行详细说明,过程中包含了WinDbg调试蓝屏用到的一些命令,这些命令将不再额外整理,请于阅读过程中注意识记。
首先,您要配置WinDbg将要使用的调试符号文件(SymbolFile)的位置。
什么是调试符号文件呢?
符号文件随DLL文件或者EXE文件建立时产生,提供包含在可执行文件和动态链接库(DLL)中的函数的占位空间。
此外,符号文件还可以表示达到失败点的函数调用路线图。
当我们使用各种Microsoft工具调试应用程序时,必须拥有符号信息,这样才能正确分析出问题根源。
那我们该如何设置调试符号文件的位置呢?
我们既可以从微软官网下载完整的符号文件包(同位于WinDbg下载页面),也可以使用微软的符号文件服务器(MicrosoftSymbolServer)。
笔者推荐后者,因为一次分析所要用到的符号文件局限于有限的几个而已,使用后者可以让程序自动下载,既节省时间,又可以确保符号文件是最新的并且是正确的。
在WinDbg中点击“File”菜单,选择“SymbolFilePath…”,在打开的对话框中输入
1.SRV*DownstreamStore*
后点击“OK”按钮即可。
当然,还有一步就是再次点击“File”菜单,选择“SaveWorkspace”来保存当前的设置。
设置了符号文件之后,您就可以进行内存转储文件的分析了。
同样点击“File”菜单,这次要选择“OpenCrashDump…”,然后通过文件打开对话框打开生成的待分析的内存转储文件。
本例中设置的是核心内存转储类型,于是应该定位至“%SystemRoot%”(即系统盘Windows文件夹下),打开MEMORY.DMP文件。
但是笔者已经事先将其转移至“E:
\MemoryDump\MEMORY.DMP”,因此在后续的图片中,您看到的是这个地址。
此时WinDbg会滚动显示一些信息并且会稍有挂起的感觉,直到从微软符号文件服务器下载完分析这个崩溃文件所需要的所有符号文件。
在上图中,我们看到就是这个打开的调试器命令窗口(DebuggerCommandWindow)(已经将符号文件加载完毕,待命),我们先看看位于底部的区域6,这个小的长方条就是WinDbg的命令输入处(CommandEntry),它又分为两个区域,左边显示“0:
kd>
”的是提示区,右边空白区是命令输入区。
当刚打开这个窗口而符号文件尚未下载/加载完毕时,提示区域会什么都不显示,而命令输入区域将显示“Debuggeenotconnected”。
直到符号加载完毕,窗口中显示出最后一行“Followup:
MachineOwner”才会变为空闲状态。
在空闲状态时,它将显示为与上图中类似的模样。
为什么说类似呢?
因为这个空闲待命提示根据调试类型、计算机处理器硬件配置不同,比如此例中,进行的是内核调试,于是显示“kd>
”(kerneldebug),系统为多(核)处理器,因此在“kd>
”之前还显示一个“0:
”,表明当前位于编号为0的处理器。
在执行了某个命令之后,如果命令需要处理的任务较多(如“!
analyze-v”),提示区域将显示为忙碌状态的“*BUSY*”,一旦显示为这个状态,您不论输入什么命令都不会立即执行,而是等待变为空闲状态时延缓执行。
如上图所示,图中区域1处将显示打开的这个内存转储文件的物理路经;
区域2处显示的则是当前加载的符号文件的位置,本例中表明是从微软服务器下载;
区域3共有三行,显示的为系统信息,第一行表明了系统为WindowsXP,内核版本为2600(SP3),多处理器(2颗),32位,第二行表明了系统类型为NT系统,客户端系统,第三行表明系统的详细版本标识;
区域4共两行,第一行表明该内存转储文件生成的时间,也就是系统崩溃的具体时间,本例中(这是去年12月得到的一个崩溃转储文件,现用作本例进行说明)为星期六(Sat),12月(Dec)27日,22:
56:
31.062,2008年,格林尼治标准时间东八区(GMT+8),第二行显示的是崩溃时自系统启动以来,系统共运行了0天4小时5分15.797秒。
区域5是很关键的错误信息,它的第一行仅在加载符号文件遇到错误时显示,此例中,它告诉我们“对于BaseTDI.SYS文件,模块已经加载完毕但却不能够为其加载符号文件”,如果之前配置了正确的符号文件路径,这就告诉我们BaseTDI.SYS不是微软公司的文件,而是第三方驱动程序文件,这很可能是引起错误的原因,值得关注但须进一步分析。
区域5的第二行是WinDbg自动分析的结果,它告诉我们,引起崩溃的原因(Probablycausedby:
)很可能是HookUrl.sys文件。
一般情况下,这就是引起错误的罪魁祸首了,但是也有不少的例外,最典型的就是显示一个微软自己的文件在此处,您可要注意了,为了避免枉杀无辜,最好进一步分析来看看都有哪些模块牵扯在崩溃的最后一刻,这样就能够保证审判无误了!
进一步分析的命令可以从“!
analyze-v”开始。
我们既可以在命令输入区域手动键入命令
1.!
analyze-v
,也可以在上图中的区域7所示位置单击蓝色的这个命令。
之后,提示区域将显示为“*BUSY*”,WinDbg将分析一段时间直到将结果显示完毕并再次转为空闲状态。
下面我们根据一张例图阐释执行“!
analyze-v”后显示的各种结果:
WinDbg经过自动的分析,可能会显示上图中区域1处所示第一行的错误检查说明(BugCheckInterpretation),而第二行则给出了详细的解释,从图中信息看得出,此例错误由于“驱动程序在队列工作项目完成之前卸载”造成的。
这个“DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS”就应该是显示在蓝屏上方的错误说明字样,后面的Arguments1~4就是蓝屏时停止代码后面的四个参数。
图中区域2所示的BUGCHECK_STR是WinDbg中分了类别的错误检查(BugCheck)的一项,此例中为0xCE,也是停止代码的分类简写,我们在命令输入区执行
1..bugcheck
命令,可以得到停止代码及其参数,这和上图的区域1、蓝屏上的信息是一致的。
本例中可以得到如下结果:
0:
.bugcheck
Bugcheckcode000000CE
Argumentsbacb0a4e00000008bacb0a4e00000000
我们在Bugcheckcode值前补上“0x”就可以得到蓝屏上的信息“***STOP:
0x000000CE(bacb0a4e,00000008,bacb0a4e,00000000)”。
当然,关于这个错误如果您想了解更多,一个是可以在微软在线帮助和支持网站上搜索字符串“0x000000CE”,再就是可以利用上图中区域2的BUGCHECK_STR值“0xCE”执行
1..hhbugcheck0xCE
命令,在打开的窗口左栏右下角点击“Display”按钮。
如果要在WinDbg中显示一个停止代码或者错误检查类的详细说明(以此错误为例),键入命令
analyze-show0x000000CE
或者
analyze-show000000CE
,也可以是
analyze-show0xCE
。
区域3中显示的就是二审判决的重要信息——线程堆栈信息。
特别注意红色框内的部分,第一行是“WARNING:
FrameIPnotinanyknownmodule.Followingframesmaybewrong.”意思就是“警告:
堆栈帧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接受此无效数据而引发了崩溃。
如果我们不看线程栈,就根据之前的“ProbablyCauseby:
HookUrl.sys”进行判决,我们很有可能枉杀无辜而让凶手逍遥法外。
只有通过线程栈我们才能发现另一个驱动程序BaseTDI也被牵连进来。
(在应用程序崩溃不致系统崩溃的调试分析中,由于处于用户态,WinDbg自动分析结果中的“ProbablyCauseby:
”几乎都是错误的。
在这种情况下,使用!
thread命令是不能显示出任何信息的,因为这个命令仅对内核态的崩溃调试有效,然而kb命令也显示不出有用的信息,只有用“~*kb”来显示详细的全部线程栈才可能发现问题根源,有的时候还需配合其他命令,本文不作讨论)
当然,如果您熟练以后,觉得没有必要使用“!
analyze-v”命令的话,可以直接使用
thread
1.kb
命令显示出核心的线程栈信息来二审判决。
现在好了,犯罪嫌疑人目标锁定在BaseTDI和HookUrl.sys身上。
现在,我们来看看它们究竟是什么、是哪个公司、哪个程序的模块。
(从之前不能够自动从微软服务器为他们加载符号文件就可以知道,它们一定都是第三方驱动程序)
使用命令
1.lmkvmBasetdi*
(使用lm(列出模块)命令和内核k选项、详细v选项以及参数m,配合包含通配符*的字符串BaseTDI,来列出当时已加载于内核模式的包含字符BaseTDI的所有驱动文件详细信息。
使用通配符来取代完整的文件名后缀可以避免信息的局限性,借此也许可以发现多个相关的模块以提供更多诊断线索),我们得到下图结果:
从图中蓝色框选部分,我们可以看出,当时内核态下只有一个叫BaseTDI.SYS的文件,这个文件的路径位于System32\Drivers下,属于名称为“瑞星个人防火墙”(ProductName:
RisingPFW,PFW=PersonalFirewall)的程序组件,软件公司注册商标为“瑞星”(LegalTrademarks:
RISING)。
文件的这些英文描述信息如果您不知道,可以XX一下。
当然,没有被笔者高亮显示的信息(如文件时间戳、版本、校验和等等)也是非常有用的,比如XX一下文件版本,也许您会发现该软件已经提供了更新的解决此问题的文件。
同样,我们使用
1.lmkvmhookurl*
来显示当时内核态下包含HookUrl的文件及其详细信息。
结果如下:
图示是一个不令人满意的结果,因为如高亮部分所示,这个模块未被加载,因此没有信息被记录。
不过我们有XX,不用急,XX一下你就知道。
在搜索完HookUrl.sys之后,发现这个也是瑞星个人防火墙的文件。
其实这个案例就是著名的“瑞星个人防火墙跨版本升级到2009版时引发蓝屏”事件。
您可以通过关键字“瑞星防火墙2009升级造成蓝屏”进行XX搜索。
到目前为止,瑞星官方都没有任何针对此事件的正式答复,虽然不是每个用户都出现此问题,但是非常多的用户都报告了此问题,瑞星也不承认这个是软件缺陷,只有官方卡卡论坛上有一个不知道是不是工作人员的人发帖要求大家遇到蓝屏就上传内存转储文件。
说到这里,我对瑞星又要失望了,但是通过这个可见蓝屏内存转储文件的分析是多么的有用!
在这里,我还要给出两个要得到更多信息时可能会使用到的命令,一个是
process00
,它可以列出当时运行着的所有进程的技术信息;
另一个则是
vm
,它能够显示出当时的虚拟内存使用情况,这对于分析系统是否耗尽了虚拟内存、换页内存池或非换页内存池,并结合进程列表找到可能的内存泄漏错误非常有用,不过已超出了本文的讨论范围。
收藏分享
▉▉▉▉▉▉▉▉▉▉▉▉▉99%
Windows7Ultimatex86
Eric
访问博客;
WinOS远程培训介绍|WinOS已开通的远程培训课程列表|WinOS企业服务|5月份面授课程表
TOP
hbycscc
∙发短消息
∙加为好友
hbycscc(Eric)
帖子
546
主题
4
精华
13
积分
46
技术积分
41
其他积分
5
阅读权限
150
在线时间
179小时
注册时间
2007-6-11
最后登录
2010-4-3
论坛资产
2358wb
来自
中国·
湖北
2#
发表于2009-2-223:
59|只看该作者
本帖最后由hbycscc于2009-2-300:
03编辑
最后,我们来看看以下的两种特殊情况该如何使用WinDbg进行调试分析:
第一种情况是系统挂起,也就是“死机”、“系统没有响应”,在这种情况下,