共用方式為


錯誤檢查0x50:PAGE_FAULT_IN_NONPAGED_AREA

PAGE_FAULT_IN_NONPAGED_AREA bug 檢查的值為 0x00000050。 這表示引用了無效的系統記憶體。 通常,記憶體位址是錯誤的,或者記憶體位址指向釋放的記憶體。

這很重要

本文適用於程式設計人員。 如果您是在使用計算機時收到藍色螢幕錯誤碼的客戶,請參閱 針對藍螢幕錯誤進行疑難解答

PAGE_FAULT_IN_NONPAGED_AREA參數

參數 說明

1

引用的記憶體位址

2

Windows 1507 (TH1) 版本 - x64 之後

0: 讀取作

阿拉伯數位: 寫入作

10: 執行作

Windows 1507 (TH1) 版本 - x86 之後

0: 讀取作

阿拉伯數位: 寫入作

10: 執行作

Windows 1507 (TH1) 版本之後 - Arm

0: 讀取作

1: 寫入作

8: 執行作

Windows 1507 (TH1) 版本 x64 / x86 之前

0: 讀取作

1: 寫入作

3

參考記憶體的位址(如果已知)

4

頁面錯誤的類型

0x0 - NONPAGED_BUGCHECK_FREED_PTE - 引用的地址位於標記為free的頁表條目上。

0x2 - NONPAGED_BUGCHECK_NOT_PRESENT_PAGE_TABLE 引用的地址沒有有效的活動頁表條目。

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)。 調用方不應嘗試訪問此位址。

0xF - NONPAGED_BUGCHECK_USER_VA_ACCESS_INCONSISTENT - 內核模式代碼在不允許使用者模式虛擬位址時嘗試訪問此類位址。

如果可以識別導致錯誤的驅動程式,則其名稱將列印在藍屏上,並存儲在記憶體中的位置 (PUNICODE_STRING) KiBugCheckDriver。 您可以使用 debugger dx 命令顯示此 - dx KiBugCheckDriver

原因

錯誤檢查0x50可能是由安裝錯誤的系統服務或錯誤的驅動程式代碼引起的。 防病毒軟體也可能觸發此錯誤,損壞的NTFS卷也會觸發此錯誤。

它也可能發生在安裝有故障的硬體或安裝的硬體出現故障時(通常與有缺陷的 RAM 有關,無論是主記憶體、L2 RAM 緩存還是視頻 RAM)。

備註

事件日誌: 檢查事件查看器中的系統日誌是否有其他錯誤消息,這些消息可能有助於查明導致錯誤的設備或驅動程式。 在與藍色畫面相同的時間範圍中,尋找系統記錄檔中發生的嚴重錯誤。

解決有故障的驅動程式: 檢查驅動程式的名稱(如果該名稱在藍屏上列出或存在於事件日誌中)。 請與驅動程式供應商聯繫,查看是否有更新的驅動程式可用。

解決故障系統服務問題: 禁用該服務並確認這解決了錯誤。 如果是這樣,請與系統服務的製造商聯繫,瞭解可能的更新。 如果在系統啟動期間發生錯誤,請調查 Windows 修復選項。 有關更多資訊,請參閱 Windows 10 中的恢復選項

解決防病毒軟體問題: 禁用該程式並確認這解決了錯誤。 如果是,請與程式製造商聯繫,瞭解可能的更新。

解決NTFS卷損壞問題: 運行 Chkdsk /f /r 以檢測和修復磁碟錯誤。 在系統分區上開始磁碟掃描之前,必須重新啟動系統。 請與硬碟驅動程式系統的製造商聯繫,以查找他們為硬碟子系統提供的任何診斷工具。

Windows 記憶體診斷: 運行 Windows 記憶體診斷工具,以測試物理記憶體。 選擇 Start 開始 按鈕,然後選擇 控制面板. 在搜索框中,鍵入 Memory,然後選擇 Diagnose your computer's memory problems。運行測試后,使用 Event viewer 在 System log (系統日誌) 下查看結果。 尋找 MemoryDiagnostics-Results 專案以檢視結果。

解決有故障的硬體問題: 如果最近已將硬體添加到系統中,請將其刪除以查看錯誤是否再次出現。 如果現有硬體出現故障,請移除或更換故障元件。 您應該運行系統製造商提供的硬體診斷程式。 有關這些過程的詳細資訊,請參閱計算機的使用者手冊。

有關藍屏故障排除的一般資訊,請參閱分析 Bug 檢查藍屏數據和停止錯誤或藍屏錯誤問題的高級故障排除

解決辦法

要確定具體原因並創建代碼修復,需要具備程式設計經驗並訪問故障模組的原始程式碼。

通常,引用的地址位於釋放的記憶體中,或者只是無效。 這不能被 try 保護 - 除了 handler -- 它只能被探測器或類似的程式設計技術保護。 有關文件系統驅動程式中的緩衝區處理和探測的資訊,請參閱 緩衝區處理。 有關驅動程序開發的最佳做法以及驅動程序開發人員常犯的錯誤的資訊,請參閱 Surface Team 驅動程式開發最佳做法

!analyze 調試擴展與 -v 詳細選項一起使用,以顯示有關 bug 檢查的資訊,以確定根本原因。

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, (reserved)

在此示例中,參數 2 指示在讀取記憶體區域時發生 bug 檢查。

查看所有 !analyze 輸出,以獲取有關 bug 檢查發生時發生的情況的資訊。 檢查 MODULE_NAME: 和 FAULTING_MODULE:,查看引用無效系統記憶體涉及哪些代碼。

查看 STACK TEXT 以獲取有關故障發生時正在運行的內容的線索。 如果有多個轉儲檔可用,請比較資訊以查找堆疊中的通用代碼。

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

TRAP_FRAME:  fffff98112e8b3d0 -- (.trap 0xfffff98112e8b3d0)

使用調試器命令(如 use kb (Display Stack Backtrace) ))來調查錯誤代碼。

lm t n使用 to 列出記憶體中載入的模組。

使用 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]

使用參數 3 的 u, ub, uu (Unassemble)Dissasemble 來檢查引用不良記憶體的 。 有關 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 and !pool 也可用於檢查記憶體。

使用 !memusage 和 來檢查系統記憶體的一般狀態。

有關 Windows 記憶體使用方式的詳細資訊,請參閱 Pavel Yosifovich、Mark E. Russinovich、David A. Solomon 和 Alex Ionescu 編寫的 Windows 內部第 7 版第 1 部分

驅動程式驗證器

Driver Verifier 是一種即時運行以檢查驅動程序行為的工具。 例如,驅動程式驗證程式檢查記憶體資源(如記憶體池)的使用方式。 如果它在執行驅動程式代碼時發現錯誤,它會主動創建一個異常,以允許進一步檢查驅動程式代碼的該部分。 驅動程式驗證程式管理員內置於 Windows 中,可在所有 Windows 電腦上使用。 使用 Driver Verifier 跟蹤失敗的具體原因。

若要啟動驅動程式驗證程式管理員,請在命令提示符處鍵入 Verifier 。 您可以設定要驗證的驅動程式。 驗證驅動程式的代碼在運行時會增加開銷,因此請嘗試驗證盡可能少的驅動程式。 如果識別出有故障的驅動程式,請選擇它。 如需詳細資訊,請參閱 驅動程式驗證器

另請參閱

錯誤檢查代碼參考