首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

几乎每一位Windows用户都听说过臭名昭著的“蓝屏死机(blue screen of death)”,有的甚至还亲身经历过。这一不祥的术语是指当Microsoft Windows崩溃或停止执行(由于灾难性的错误或者内部条件阻止系统继续运行下去)时所显示的蓝色屏幕。

在本章中,我们将讨论那些引起Windows崩溃的基本问题,讲述一下在蓝屏上显示的信息,同时还将解释各种用于创建崩溃转储(crash dump)的配置选项。这里的崩溃转储是指在系统崩溃时刻的系统内存的纪录,它可以帮助你找出是哪个组件导致了这次系统崩溃。安排这一部分内容的意图并不是提供有关如何分析一次Windows系统崩溃的详细诊断信息。本章还将向你展示如何分析一个崩溃转储来识别出一个错误的驱动程序或者组件。为执行基本的崩溃转储分析而需要做的工作是非常少的,只需要几分钟就够了。即使每5个或10个崩溃转储中只有一个通过崩溃转储分析能探查到有问题的驱动程序,这种分析仍然是值得去做的:一次成功的分析可以避免将来的数据丢失、系统宕机和应用失败。

14.1  Windows为什么会崩溃

Windows崩溃(停止执行并显示蓝屏)有以下一些原因。

n  运行在内核模式下的设备驱动程序或者操作系统函数引发了一个未被处理的异常,比如内存访问违例(由于企图写一个只读页面或者企图读一个当前未被映射[因而不是一个有效内存位置]的地址而引起)。

n  调用一个内核支持例程,导致一次重新调度,比如当中断请求级别(IRQL)为DPC/Dispatch级别或更高级别时等待一个处于无信号状态的分发器对象(关于IRQL的细节,请参见第3章)。

n  在DPC/Dispatch级别或更高的IRQL级别时,在“由页面文件或内存映射文件中的数据来支撑的内存”上发生了一个页面错误(这将要求内存管理器必须等待一个I/O操作发生,但正如上面刚刚所说的,在DPC/Dispatch级别或更高级别上不能够进行等待,因为那将要求一次重新调度)。

n  一个设备驱动程序或操作系统函数显式地使系统崩溃(通过调用系统函数KeBugCheckEx)。因为它检测到一个内部条件表明了数据遭受破坏,或者表明了其他的情形:在不冒险破坏数据的情况下系统无法继续执行。

n  发生硬件错误,比如机器检查(machine check)或者不可屏蔽中断(NMI)。

对于Windows XP用户提交给Microsoft OCA(Microsoft Online Crash Analysis,在线崩溃分析,本章后面将会介绍)Web站点的崩溃转储,Microsoft的分析表明了崩溃原因的分类如图14.1所示(这里显示的数据是2004年4月份生成的)。

图14.1  提交给OCA的崩溃的原因分类

当一个内核模式设备驱动程序或者子系统引发一个非法的异常时,Windows面临着困难的抉择。此时,它检测到了在操作系统中,有能力访问任何硬件设备和任何有效内存的系统代码部分做了一些不应该做的事情。

但是,为什么这意味着Windows必须崩溃呢?难道它就不能够忽略该异常,让设备驱动程序或者子系统继续往下执行,就好像什么也没有发生过吗?该错误能被隔离出来的可能性是存在的,并且该组件将来能够通过某种方式被恢复过来的可能性也是存在的。但是,更有可能的是,被检测到的异常来源于更深层的问题——比如,由于内存的常规破坏(general corruption),或者由于硬件设备不能正常工作。允许系统继续运行下去将可能导致更多的异常,而且,存储在磁盘或其他外设中的数据可能也会遭受破坏,这样招致的风险太高了。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论