Windows 蓝屏代码 0x50:PAGE_FAULT_IN_NONPAGED_AREA

PAGE_FAULT_IN_NONPAGED_AREA 错误检查的值为 0x00000050。
这表示引用了无效的系统内存。
通常内存地址错误或者内存地址指向释放的内存。

欢迎来到之路教程(on itroad-com)

注释 -

事件记录日志:
检查事件查看器中的系统日志以获取可能有助于查明导致错误的设备或者驱动程序的其他错误消息。
有关更多信息,请参阅打开事件查看器。

在系统日志中查找与蓝屏在同一时间窗口中发生的严重错误。

解决有问题的驱动程序:
检查驱动程序的名称是否在蓝屏上列出或者出现在事件日志中。
请联系驱动程序供应商以查看是否有更新的驱动程序可用。

解决有故障的系统服务问题:禁用服务并确认这解决了错误。
如果是这样,请联系系统服务的制造商以了解可能的更新。
如果在系统启动期间出现错误,请调查 Windows 修复选项。
有关详细信息,请参阅 Windows 10 中的恢复选项。

解决防病毒软件问题:禁用该程序并确认这可以解决错误。
如果是,请联系程序制造商以了解可能的更新。

解决损坏的 NTFS 卷问题:运行 Chkdsk /f /r 以检测和修复磁盘错误。
在系统分区上开始磁盘扫描之前,我们必须重新启动系统。
联系硬盘驱动器系统的制造商以找到他们为硬盘驱动器子系统提供的任何诊断工具。

Windows 内存诊断:
运行 Windows 内存诊断工具,以测试物理内存。
选择开始按钮,然后选择控制面板。
在搜索框中,键入内存,然后选择诊断计算机的内存问题。
运行测试后,使用事件查看器在系统日志下查看结果。
查找 MemoryDiagnostics-Results 条目以查看结果。

解决硬件故障问题:如果最近系统中添加了硬件,请将其移除以查看错误是否再次出现。
如果现有硬件出现故障,请移除或者更换故障组件。
我们应该运行系统制造商提供的硬件诊断程序。
有关这些步骤的详细信息,请参阅计算机的用户手册。

有关一般蓝屏故障排除信息,请参阅蓝屏数据。

PAGE_FAULT_IN_NONPAGED_AREA 参数

参数描述
1引用的内存地址
2Windows 1507 (TH1) 版本 - x64 之后
0:读取操作
2:写入操作
10:执行操作
Windows 1507 (TH1) 版本 - x86 之后
0:读取操作< br>2:写操作
10:执行操作
Windows 1507(TH1)版本之后-ARM
0:读操作
1:写操作
8:执行操作
之前Windows 1507 (TH1) 版本 x64 / x86
0:读取操作
1:写入操作
3引用内存的地址(如果已知)
4页错误类型
0x03 - NONPAGED_BUGCHECK_WRONG_SESSION - 在没有会话的进程的上下文中尝试引用会话空间地址。通常这意味着调用者在没有正确获取对正确进程的对象引用并首先添加到它的情况下不正确地尝试访问会话地址。此错误检查和子类型上次用于 Windows 10 RS3. 在 Windows 10 RS4 及更高版本中,此错误显示为 0x02 (NONPAGED_BUGCHECK_NOT_PRESENT_PAGE_TABLE)。
0x04 - NONPAGED_BUGCHECK_VA_NOT_CANONICAL - 尝试引用非规范(非法)虚拟地址(参数 1)。调用者不应试图访问此地址。

如果可以识别出导致错误的驱动程序,其名称将打印在蓝屏上并存储在内存中的位置 (PUNICODE_STRING) KiBugCheckDriver 。
你可以使用 debugger dx 命令来显示这个 dx KiBugCheckDriver

原因

错误检查 0x50 可能是由安装错误的系统服务或者错误的驱动程序代码引起的。
防病毒软件也可以触发此错误,损坏的 NTFS 卷也可以。

它也可能在安装有故障的硬件后或者安装的硬件出现故障时发生(通常与有缺陷的 内存 有关,无论是主内存、L2 内存 缓存还是视频 内存)。

解决方法

通常,引用的地址位于已释放的内存中或者根本无效。
这不能通过除处理程序之外的 try 来保护 - 它只能通过探针或者类似的编程技术来保护。

使用带有 -v 详细选项的 !analyze 调试扩展来显示有关错误检查的信息,以确定根本原因。

2: kd> !analyze -v
***
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
***
PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced.  This cannot be protected by try-except.
Typically the address is just plain bad or it is pointing at freed memory.
Arguments:
Arg1: ffffffff00000090, memory referenced.
Arg2: 0000000000000000, value 0 = read operation, 1 = write operation.
Arg3: fffff80240d322f9, If non-zero, the instruction address which referenced the bad memory
	address.
Arg4: 000000000000000c, (保留)

在此示例中,参数 2 表示在读取内存区域时发生错误检查。

查看所有 !analyze 输出以获取有关错误检查发生时发生的情况的信息。
检查 MODULE_NAME: 和 FAULTING_MODULE: 以查看引用无效系统内存涉及哪些代码。

查看堆栈文本以获取有关发生故障时正在运行的内容的线索。
如果有多个转储文件可用,请比较信息以查找堆栈中的公共代码。

使用 !analyze 输出中提供的 .trap 命令设置上下文。

TRAP_FRAME:  fffff98112e8b3d0 -- (.trap 0xfffff98112e8b3d0)

使用调试器命令,例如 use kb (Display Stack Backtrace) 来调查有问题的代码。

使用 lm t n列出加载到内存中的模块。

使用 d、da、db、dc、dd、dD、df、dp、dq、du、dw(显示内存)命令调查参数 1 和参数 3 引用的内存区域。

2: kd> db ffffffff00000090
ffffffff`00000090  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000a0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000b0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000c0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000d0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000e0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`000000f0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
ffffffff`00000100  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

在这种情况下,参数 1 的内存区域中似乎没有数据,这是试图读取的内存区域。

使用 !address 命令查看参数 3,它是引用坏内存的指令的地址。

2: kd> !address fffff80240d322f9
Usage:                  Module
Base Address:           fffff802`40ca8000
End Address:            fffff802`415fb000
Region Size:            00000000`00953000
VA Type:                BootLoaded
Module name:            ntoskrnl.exe
Module path:            [\SystemRoot\system32\ntoskrnl.exe]

使用 u, ub, uu (Unassemble) 和参数 3 反汇编,检查引用了坏内存的那个。

有关 X64 处理器和汇编语言的更多信息,请参阅 x64 处理器。

2: kd> u fffff80240d322f9 
nt!RtlSubtreePredecessor+0x9:
fffff802`40d322f9 488b4810        mov     rcx,qword ptr [rax+10h]
fffff802`40d322fd eb07            jmp     nt!RtlSubtreePredecessor+0x16 (fffff802`40d32306)
fffff802`40d322ff 488bc1          mov     rax,rcx
fffff802`40d32302 488b4910        mov     rcx,qword ptr [rcx+10h]
fffff802`40d32306 4885c9          test    rcx,rcx
fffff802`40d32309 75f4            jne     nt!RtlSubtreePredecessor+0xf (fffff802`40d322ff)
fffff802`40d3230b c3              ret
fffff802`40d3230c c3              ret

使用 ub从给定地址向后反汇编。

使用 r (Registers) 命令检查在检查系统错误时正在执行的内容。

2: kd> r
Last set context:
rax=ffffffff00000080 rbx=0000000000000000 rcx=ffffa68337cb7028
rdx=7a107838c48dfc00 rsi=0000000000000000 rdi=0000000000000000
rip=fffff80240d322f9 rsp=ffff840c96510958 rbp=ffffffffffffffff
 r8=ffffffffffffffff  r9=0000000000000000 r10=7ffffffffffffffc
r11=ffff840c96510a10 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0         nv up ei ng nz na pe nc
cs=0010  ss=0018  ds=0000  es=0000  fs=0000  gs=0000             efl=00010282
nt!RtlSubtreePredecessor+0x9:
fffff802`40d322f9 488b4810        mov     rcx,qword ptr [rax+10h] ds:ffffffff`00000090=????????????????

在这种情况下,fffff80240d322f9在指令指针寄存器 rip 中。

!pte!pool命令也可用于检查内存。

使用 !memusage并检查系统内存的一般状态。

驱动程序验证器

Driver Verifier 是一种实时运行以检查驱动程序行为的工具。
例如,Driver Verifier 检查内存资源的使用,例如内存池。
如果它在驱动程序代码的执行中发现错误,它会主动创建一个异常以允许进一步检查该部分驱动程序代码。
驱动程序验证程序管理器内置于 Windows 中,可在所有 Windows PC 上使用。
要启动驱动程序验证程序管理器,请在命令提示符下键入 Verifier。
我们可以配置要验证的驱动程序。
验证驱动程序的代码在运行时会增加开销,因此请尝试验证尽可能少的驱动程序。
有关详细信息,请参阅驱动程序验证程序。

日期:2020-09-17 00:15:57 来源:oir作者:oir