蓝屏总结(二)——系统蓝屏及转储方法

目录

一、前言

二、关于page files设置

四、手动蓝屏方法

1、使用NotMyFaul Tool生成0xD1蓝屏

2、使用NMI生成0x80蓝屏

3、使用keyboard键盘生成0xE2蓝屏

4、使用WinDbg调试器

五、写在最后

六、参考资料


一、前言

        系统崩溃(system crash)也称为bugcheck或者停止错误,会在系统无法正常工作时发生蓝屏,通过CrashDump机制在系统下生成崩溃转储文件,称为系统崩溃转储文件。其中CrashDump是一种操作系统调用存储适配器驱动程序将内存内容写入转储文件的机制,在系统崩溃时相关进程会捕获系统内存记录生成内核或者完全内存转储文件(Kernel or memory dump file),这些文件通常用于crash问题的排查。

        关于系统蓝屏,分自动蓝屏和手动蓝屏两种方法,结合系统设置、注册表或者工具实现。手动蓝屏一般用于系统未自动发生蓝屏,但是需要触发蓝屏来对内存进行转储来分析问题的情况下,可通过微软工具NotMyFault、keyboard快捷键、Debugger等方式进行蓝屏触发,从而完成内存转储获取转储文件。在此之前,需要对内存转储进行设置,包括设置pagefile、开启内存转储设置。

二、关于page files设置

        Page files是硬盘上可选的隐藏系统文件,可用于备份系统崩溃转储,并扩展系统可支持的系统提交内存(“虚拟内存”)。要完成再系统崩溃期间创建故障转储文件,需要page file或者专用的转储文件向磁盘写入崩溃转储文件(Memory.dmp),因此page file或者专用的转储文件要足够大,否则不会创建系统内存转储文件。

        由系统管理的page file文件大小的要求取决于系统崩溃转储设置。对于小内存转储类型,要求的page file最小为1MB;对于完全内存转储类型,page file的最低要求是一个物理RAM大小再加上257MB;另外的内核内存转储以及自动内存转储两种类型,取决于内核虚拟内存的使用率,后者会根据系统崩溃的频率自动选择最佳页面文件大小。

        以微软技术工程师一次使用键盘触发蓝屏收集Memory Dump为例,在触发蓝屏之前,会先进行如下设置:

reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" /v PagingFiles /t REG_MULTI_SZ /d "C:\pagefile.sys 8492 8492" /f
reg add "HKLM\System\CurrentControlSet\Control\CrashControl" /v DumpFile /t REG_EXPAND_SZ /d "C:\Windows\Memory.dmp" /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters" /v CrashOnCtrlScroll /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters" /v CrashOnCtrlScroll /t REG_DWORD /d 1 /f
reg add "HKLM\System\CurrentControlSet\Control\CrashControl" /v NMICrashDump /t REG_DWORD /d 1 /f

        其中关于pagefile.sys的设置,应该为8192+300MB,即8G+300MB。

 

三、启用内存转储设置

        在未指定其他转储方式和转储路径时,启用系统内存转储设置将会在系统发生蓝屏时在指定路径自动生成转储文件。通过系统设置内存转储需要管理员权限,另外如果计算机已连接网络,那么网络策略设置可能会阻止内存转储过程。启用内存转储设置方法为:

  • Windows开始菜单,点击设置按钮进入Windows设置页面。

蓝屏总结(二)——系统蓝屏及转储方法_第1张图片

  • 点击系统-->关于-->高级系统设置,进入系统属性页面。

蓝屏总结(二)——系统蓝屏及转储方法_第2张图片

 

  • “高级”标签页,然后设置“启动和故障恢复”。

蓝屏总结(二)——系统蓝屏及转储方法_第3张图片

 

  • “系统失败”区域进行转储类型、转储文件路径等的设置,最后重启计算机以设置生效。

蓝屏总结(二)——系统蓝屏及转储方法_第4张图片

 

         关于转储文件路径的选择,要保证路径所在的磁盘具备足够大小的空间。默认情况下会将内存转储写至 %SystemRoot%\Memory.dmp文件。如果在 %SystemRoot%驱动器上没有足够的可用空间,可以将该转储文件重定向到另一个具有足够的可用空间的位置(所需空间大小请参考Pagefile size)。当系统发生crash和重启,物理RAM的内容将会被写入已安装操作系统分区上的分页文件(paging file),其转储的速度依赖于硬盘的速度。如果转储文件设置成存储在另外的本地硬盘,那么大量的数据将会在硬盘上发生读写,这可能导致长时间的服务停机。任何内核或者完全内存转储文件的调试都应该是在其他标准排查方法无效情况下作为最后的选择。

四、手动蓝屏方法

        一般情况下,系统遇到严重错误会自动调用函数触发蓝屏,但也存在很多没有发生蓝屏的异常场景,如系统或者某应用窗口发生hang死,需要转储文件来对问题进行排查,那么可以通过手动蓝屏的方式实现对内存的转储。

1、使用NotMyFaul Tool生成0xD1蓝屏

        当系统下某些进程发生hang,或者发生其他异常但键盘鼠标可操作情况下,可以使用微软Sysinternals工具NotMyFaul来触发系统蓝屏,从而对内存进行转储分析。NotMyFaul工具用于系统下crash,将会触发0xD1蓝屏。

        工具的具体使用方法为:1、官网下载NotMyFaul Tool;2、启动crash。

        关于第二步,可以打开NotMyFaul的图形UI窗口进行选择触发动作种类进行crash:另外,也可以通过命令触发系统crash:

1. 管理员身份打开cmd
2. 进入NotMyFaul目录,输入命令运行noteMyfault.exe进行crash:
notMyfault.exe /crash

2、使用NMI生成0x80蓝屏

        NMI,全称为Non-Maskable Interrupt,即常说的不可屏蔽中断。在某些场景下,不能通过键盘来产生崩溃转储文件,须通过NMI开关在系统处理器上产生一个NMI来生成崩溃转储文件。比如,某些服务器基于网络浏览器图形用户界面,不能通过键盘来使系统蓝屏。

        在Windows 8 和Windows Server 2012以前的Windows操作系统需要设置注册表,之后的操作系统无需设置。修改方法为:一般情况下,如果注册表存在损坏或者注册表修改不正确,那么可能会出现严重的问题,所以在修改注册表之前,最好先做好备份。

        如果要使用NMI来产生崩溃转储文件,如硬件平台有提供自动系统恢复(ASR)的特性,那么需要关闭此特性。具体地,一般可以在BIOS中开启NMI开关,具体方法可以参考BIOS手册或者联系硬件供应商提供开启方法。如果发生一个NMI,那么将会看见一个STOP 0x80的硬件故障。

3、使用keyboard键盘生成0xE2蓝屏

        系统运行过程中,当发生hang死或者黑屏或者其他场景需要强制系统蓝屏来对内存进行转储,可以通过键盘来实现崩溃转储的触发。键盘主要分三种,一种是基于i8042prt端口的PS/2键盘,一种是USB键盘,另一种是Hyper-V键盘。这三种键盘在不同Windows版本可用性上存在差异,其中,Hyper-V键盘用于Windows 10 1903及之后的版本。

        这里通过键盘来强制系统发生崩溃也主要通过修改注册表实现。首先通过修改注册表对键盘触发系统崩溃进行设置,在实际的场景下根据需求通过键盘进行崩溃的触发。以USB键盘强制系统崩溃为例,通过如下方法对注册表进行设置:另外基于i8042prt端口的PS/2键盘和Hyper-V键盘的设置与上述一样,只需将注册表子项中的“kbdhid”替换为“i8042prt”或者“hyperkbd”。在实际的场景中,需要按住最右边Ctrl键,然后按两次ScrLk键来触发蓝屏。系统会调用KeBugCheck函数并发出0xE2的bug check,然后写入崩溃转储文件。

4、使用WinDbg调试器

        如果机器正在通过WinDbg或者KD调试器进行内核模式的调试,那么可以通过输入.crash命令来强制系统崩溃。如果输入此命令后没有立即崩溃,那么可以输入g命令查看。同样,输入此问题后,系统会调用KeBugCheck函数并产生0xE2的bug check,然后写入崩溃转储文件。

        当崩溃转储文件被写入之后,主机上的内核调试器会被提醒并且可以用来调试崩溃的机器。

五、写在最后

        一般情况下,系统蓝屏之后会自动对内存进行转储,然后在系统下生成崩溃转储文件。在某些情况下,系统虽然蓝屏,但是蓝屏进度一直停留在0%,通常这种错误是由于磁盘驱动器导致的,可以尝试升级磁盘驱动器或者联系SSD厂商进行问题排查。当然也有可能是系统其他的原因,以上文提到的pagefile为例,如果pagefile不够大,那么也将会发生转储失败。

        另外,对于应用层面的问题不是都得通过触发蓝屏来收集转储文件,根据实际场景选择触发或者不触发蓝屏来获取转储文件。触发系统蓝屏可以从系统层面来获取进程信息,而不触发可以从应用层面来进行获取信息进行分析。以进程hang为例,假设某应用程序发生hang,一方面我们可以通过上述的几个触发蓝屏的方法来收集转储文件,另一方面也可以在任务管理器中右键指定的进程,选择“创建转储文件”来获取此进程的转储文件。

蓝屏总结(二)——系统蓝屏及转储方法_第5张图片

 

六、参考资料

1、系统崩溃方法

2、创建转储文件

3、使用键盘转储

4、使用调试器

5、pagefile设置

你可能感兴趣的:(Windows)