一切都很完美;你已升级到了Windows 7。系统打上了全部的补丁,所有驱动程序都更新了,安全很到位,说不定你甚至还有新硬件……但是仍然无法避免的是系统崩溃,在本文中会为大家详细介绍如何处理崩溃后的Windows 7。
AD:
下载NotMyFault,迫使系统崩溃
1、从下列微软网址下载NotMyFault工具:http://download.sysinternals.com/Files/Notmyfault.zip,将文件提取到文件夹。
2、鼠标右击NotMyFault.exe,或者在命令提示符下,键入NotMyFault。如果看到“You don't have permission to open this file”(你没有权限打开此文件)的信息,那么再试一次,但是鼠标右击时,选择“Run as Administrator”(以管理员身份运行)。酷言网 www.colyan.com
3、从菜单中选择High IRQL fault (kernelmode))和Do Bug按钮。这将生成一个内存转储文件和“Stop D1”错误。
4、稍等一下...你的系统马上会回来,会有微型转储和内核转储可以查看了。
加载转储文件
如果你看到“你没有权限打开此文件”的信息,通过鼠标右击WinDbg来进行重新启动,选择“以管理员身份运行”。酷言网 www.colyan.com
一旦调试器运行,选择菜单选项File | Open crash dump(文件|打开崩溃转储),指向它,打开你想要分析的内存转储。如果你想让它记住转储文件在哪里,那么看到Save information for workspace(为工作区保存信息)时,选择Yes(确定)。
WinDbg会寻找Windows的这个确切版本的Windows符号文件。它引用符号文件路径,访问microsoft.com,并显示结果。
注意:如果调试器似乎很忙,那可能是第一次打开特定机器的转储文件,因而,WinDbg从SymServ下载符号。下次打开同一台机器的转储时,调试器似乎会快得多,因为符号文件已在本机上。
命令窗口会出现,崩溃分析显示在该窗口上。左下角将是KD>提示符。提示符右边是一个单行窗口,你可以在这里输入命令。
可能的错误信息
如果你看到信息:
ERROR: Symbol file could not be found. Defaulted to export symbols for ntoskrnl.exe -
错误:符号文件找不到。默认情况下导出ntoskrnl.exe的符号-
通常是下列三种情况中有一种出错了:
路径不正确;仔细检查,确保之前输入的符号文件路径没有拼写错误或其他错误(如空白处)
连接失效,检查互联网连接,确保它在正常工作
防火墙禁止访问符号文件,或者符号文件在检索过程中已损坏 酷言网 www.colyan.com
如果你的路径和连接没问题,那么问题可能出在防火墙上。如果防火墙一开始阻止WinDbg下载符号表,这会导致符号文件损坏。如果对防火墙解禁,再次试图下载符号文件仍不行,那么表明符号文件已损坏。最快的解决办法是关闭WinDbg,删除symbols文件夹(最有可能设成c:\symbols),并且对防火墙解禁。现在,重新打开WinDbg和转储文件。调试器会重新创建文件夹,并重新下载符号。
如果你看到这个信息:
Kernel symbols are WRONG. Please fix symbols to do analysis.
内核符号错误。请改正符号,进行分析。
那么,WinDbg无法检索正确的符号,它会改而使用默认的符号表。但是这个警告信息表明,它无法生成正确的结果。请记住:符号表是在程序编译时生成的,所以每个Windows版本、补丁和热修复程序等都有符号表文件。返回到前一个章节,确保你设置的路径正确、连接正常,而且没有被阻止。
从头到尾浏览WinDbg的输出。你可能会看到类似以下的错误信息,表明它可能找不到信息myfault.sys:
Unable to load image \??\C:\Windows\system32\drivers\myfault.sys, Win32 error 0n2
无法加载映像\??\C:\Windows\system32\drivers\myfault.sys, Win32 error 0n2
WARNING: Unable to verify timestamp for myfault.sys
警告:无法为myfault.sys验证时间戳酷言网 www.colyan.com
ERROR: Module load completed but symbols could not be loaded for myfault.sys
错误:模块加载已完成,但无法为myfault.sys加载符号
这意味着,调试器在寻找myfault.sys方面的信息。然而,由于它像第三方驱动程序(是的,它是由微软开发,但肯定不是平常的微软产品),它没有符号(微软并不存储所有第三方驱动程序)。可以忽视 该错误信息。供应商通常在交付驱动程序时不附带符号文件,符号文件并不是你所必要的;没有符号文件,你也能找到有问题的驱动程序。
当你让WinDbg打开转储文件后,它会自动进行基本的分析。甚至不用给调试器下达任何直接命令,它已报出了可疑对象,如下面屏幕所示。
命令
有数百个命令可以控制WinDbg;WinDbg是个功能很强大的工具。幸运的是,我们只需要一个命令。为了让探讨更深入一点,我们将多用两个命令,总共有三个命令。它们是!analyze –v、lmv和lmvm。
!analyze –v
以详细模式分析
!analyze –v显示了系统崩溃时,描述系统状态的信息,遇到的故障,以及谁是主要的可疑对象。
lmv
显示加载模块的
详细信息
lmv显示了一系列驱动程序及路径、版本和供应商信息。它常包含产品描述。lmv输出结果可能要很长的时间。留意WinDbg界面的左下角,你通常会看到kd>提示符。获取信息时,它会显示*BUSY*。只有kd>提示符返回后,你才能使用另外的命令。
lmvm
[模块名称]
显示某加载模块
(模块名称)的
详细信息酷言网 www.colyan.com
lmvm[模块名称]让你能够告诉调试器只获取那个特定模块的信息。比如说:lmvm myfault.sys。
!analyze -v
在命令窗口底部的命令行上输入!analyze -v(注意yynw命令与“-v”之间的空间)。V(详细)这个参数选项符告诉WinDbg,你想要所有的详细信息。它给出的解释结合了英语和编程术语,不过这是个良好的开头。实际上,在许多情况下,你可能不需要任何下一步操作。如果你明白了崩溃的原因,可能就搞定了。
下面这个例子是使用NotmyFault驱动程序来分析我们的崩溃。
如果使用!analyze –v,调试器输出结果的一个重要部分是堆栈文本。每次查看转储文件,总要关注堆栈最右边,留意任何第三方驱动程序。在本例中,我们看到了myfault。请注意:事件由下往上按年月顺序排列;系统执行每个新任务时,新任务会显示在最上面,把以前的操作往下移。在这个很短的堆栈中,你会看到myfault处于活跃状态,然后出现页面错误,系统声明进行错误检查,这正是系统停止(蓝屏)的时候。请注意:部分数据已被清除,以便该内容能在一个页面上显示,“truncated”注释表明了这点。酷言网 www.colyan.com