Cover image

Blue Screen, Page-Fault-In-Non-Paged-Area 修复历程

Feb 10, 2016

本身平时都基本脱离了Windows的魔爪,因为Linux下的工作效率真是杠杠的。 因此也只有在假期的时候会开个Windows来休闲娱乐下,打打游戏什么的,毕竟Linux环境的游戏还真没玩过几个。

然而天不遂人意,不晓得前一天游戏的时候装了什么插件,直接导致今天进入Windows时中头彩,蓝屏了。 欲哭无泪,话说本来自个没准备折腾它,没想到它却过来折腾我了。没办法,解决问题吧先。

Page-Fualt-In-Non-Paged-Area,从名字中我们能看出来,问题应该是一个不知道什么玩意的想要访问系统的Non-Paged区域,从而引起的BSOD。 感觉有点像平时程序里遇到的野指针的感觉,估摸着是内存泄露了把。 如果是自个的程序还好,好歹能跟踪Debug下,但这么大个的Windows,该怎么下手? 心想还是先Google下吧,找找经验之谈。

安全模式启动

解铃还须系铃人, 要解决问题,最好还是先安全模式启动Windows, 然后排查错误。 不过现在面临的尴尬问题是,Win8的安全模式设置已经不是在开机黑屏的间隔时狂按F8就可以进入的。 需要在进入系统后通过msconfig设置,亦或是shift+重启来开启安全模式。 然而我的系统现在连系统的登陆界面还没到的时候就BlueScreen了,哪能进入系统设置呢?

既然想通过Windows本身的接口不能进入安全模式,只能通过修改boot的配置文件或者利用第三方工具了。 于是自己找来一个Winpe先引导进入Winpe系统, 好在工具包里个BCDTool可以修改系统引导项。 在BCDTool中,找到Windows Load Manager,可以看到下边有一个启动项,该启动项是我出问题的启动项。 先复制该启动项并创建一个新的,然后可以将之名称description修改为SafeMode。 之后在新的启动项下添加参数safeboot,并将值设为Minimal,意味最小化加载系统驱动什么的。 还有参数Network,即带网络的安全模式。 不过也可以在Windows Load Manager里边添加参数displaybootmenu,值为yes,这样就可以在进入Windows时显示启动选项,然后选择进入安全模式。

启动项设置好后,就可以重新启动了。 进入启动项的界面,会发现比之前多了个SafeMode的选项,然后选择进入。 哈哈,终于完成了第一步,好歹总算是进入了系统。

Fix Page Fault in Nonpaged Area

一般出现蓝屏后可能由许多问题导致,比如添加硬件,更新驱动,添加软件等等。 如果是上述原因的话,那么第一步就是先把添加的卸掉,更新的驱动回滚原版。 这样或多或少能解决一部分通用蓝屏问题。 针对Page-Fault-In-Non-Paged-Aree问题,大致有这么三种解决方式,下面一一列举出来。

重设虚拟内存

在电脑属性>高级设置>性能 里边来修改系统的虚拟内存。 首先将已经勾选的 “自动管理所有驱动器的分页文件大小”, 选择”无分页文件“,之后应用并重启,使配置生效。 接下来继续进入虚拟内存的配置界面,在下边勾选”系统管理的大小“,然后勾选”自动管理所有驱动器的分页文件大小“。然后再应用并重启。 大致意思是重新分配下虚拟内存的Pagefile

ChkDSK

另一个方式是利用系统的ChkDsk自动扫描并修复硬盘。 因为pagefile.sys文件在C盘,所以可以的C盘进行下扫描修复,查看下有没有坏道什么的。 这也有可能导致Page-Fault的蓝屏问题。

具体执行就是打开cmd然后输入ChkDSK /f /r c:。 其中/f参数是指要求修复磁盘上的错误。 /r参数是指找到坏扇区并且回复可读取的信息。 然后修复完成再查看问题有没解决。

Check Memory

还有一个可能就是内存的损坏也会有可能导致该问题。 所以可以利用一些内存检查的软件来check下内存是否存在问题。 或是是将内存条拔下来擦拭一下内存条的金手指。

Others

当然,导致BSOD的原因往往不止这么几种。 各种各样的奇葩原因都能看的到。刚才就查到一个由于电源供电不足导致的。 不过因为自己不怎么玩硬件,所以这一类问题还是可以避免的。 当然,最好的解决方式就是备份还原点。出现问题的话只要还原到最近一次正常的还原点上就好了。 能够秒杀掉一大堆莫名奇妙的问题,简直是神器! 不过本人由于偷懒的性格,很少吧备份,而且也舍不得还原点占的空间。 所以导致每次出问题都只能靠手动来解决。

Blue Screen View

问题解决了,系统又能进入了,开心。 但是究竟是什么导致的蓝屏,是装的什么软件还是什么乱七八糟的驱动,总得像个办法把找出原因来,不然也不符合本人这睚疵必报的性格。

一般Windows蓝屏之后都去会生成内存转储的文件,Memory.dmp。 里边包含了故障发生前的程序信息。 不过由于修炼的不够,自个读这个二进制文件还是很痛苦的。 好歹我们是站在巨人的肩膀上的。 因此我们可以借助Blue Screen View这个程序来分析蓝屏生成的内存转储文件。 里边会详细显示出系统崩溃时的文件以及内存地址,从而方便我们来查询原因。

文已至此,该解决的基本上都解决了,只不过最后是要吐槽下百度。 为毛百度下技术性问题搜到的不是重装系统就是要换台电脑。 不能提供一点建设性的意见,除了浪费时间还能干什么。 实在是无语了。


10 Feb 2016

Post by: MetaCoder