錯誤檢查0x50:PAGE_FAULT_IN_NONPAGED_AREA

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

重要

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

PAGE_FAULT_IN_NONPAGED_AREA參數

參數 描述

1

參考的記憶體位址

2

Windows 1507 (TH1) 版本之後 - x64

0: 讀取作業

2: 寫入作業

10: 執行作業

Windows 1507 (TH1) 版本之後 - x86

0: 讀取作業

2: 寫入作業

10: 執行作業

Windows 1507 (TH1) 版本之後 - Arm

0: 讀取作業

1: 寫入作業

8: 執行作業

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

0: 讀取作業

1: 寫入作業

3

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

4

頁面錯誤的類型

0x0 - NONPAGED_BUGCHECK_FREED_PTE - 參考的地址位於標示為免費的頁面數據表專案上。

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 - 不允許這類存取時,核心模式程式代碼嘗試存取使用者模式虛擬位址。

如果可以識別負責錯誤的驅動程式,則會在藍色螢幕上列印其名稱,並儲存在位於KiBugCheckDriver位置 PUNICODE_STRING的記憶體中。 您可以使用除錯程式 dx 命令來顯示這個 - dx KiBugCheckDriver

原因

錯誤檢查0x50可能是安裝錯誤系統服務或錯誤驅動程式程式代碼所造成。 防病毒軟體也可以觸發此錯誤,因為已損毀的NTFS磁碟區也一樣。

在安裝故障的硬體或發生安裝硬體失敗時,也可能會發生此情況(通常與有缺陷的 RAM、主要記憶體、L2 RAM 快取或視訊 RAM 有關)。

備註

事件記錄檔:檢查系統登入 事件檢視器 是否有其他錯誤訊息,以協助找出造成錯誤的裝置或驅動程式。 如需詳細資訊,請參閱開啟 事件檢視器。 在與藍色畫面相同的時間範圍中,尋找系統記錄檔中發生的嚴重錯誤。

解決錯誤驅動程式: 如果驅動程式列在藍色畫面上,或存在於事件記錄檔中,請檢查驅動程序的名稱。 請連絡驅動程式廠商,查看是否有更新的驅動程式可用。

解決錯誤系統服務問題: 停用服務,並確認這可解決錯誤。 如果是,請連絡系統服務的製造商,以取得可能的更新。 如果在系統啟動期間發生錯誤,請調查 Windows 修復選項。 如需詳細資訊,請參閱 Windows 10 中的復原選項。

解決防病毒軟體問題: 停用程式並確認這可解決錯誤。 如果是,請連絡計劃的製造商,以取得可能的更新。

解決損毀的NTFS磁碟區問題: 執行 Chkdsk /f/r 來偵測並修復磁碟錯誤。 您必須在磁碟掃描開始於系統磁碟分區之前重新啟動系統。 請連絡製造硬碟系統,找出它們為硬碟子系統提供的任何診斷工具。

Windows 記憶體診斷: 執行 Windows 記憶體診斷工具,以測試物理記憶體。 選取 [開始] 按鈕,然後選取 控制台。 在搜尋方塊中,輸入 Memory,然後選取 [ 診斷計算機的記憶體問題]。執行測試之後,請使用事件查看器來檢視系統記錄檔下的結果。 尋找 MemoryDiagnostics-Results 專案以檢視結果。

解決故障的硬體問題: 如果最近已將硬體新增至系統,請將其移除,以查看錯誤是否遞歸。 如果現有的硬體失敗,請移除或取代故障的元件。 您應該執行系統製造商所提供的硬體診斷。 如需這些程式的詳細資訊,請參閱計算機的擁有者手冊。

如需一般藍色畫面疑難解答資訊,請參閱分析錯誤檢查藍螢幕數據和進階疑難解答以取得停止錯誤或藍色畫面錯誤問題。

解決方法

若要判斷特定原因,以及建立程式碼修正,則需要程式設計體驗和存取錯誤模組的原始程式碼。

一般而言,參考的位址位於釋放的記憶體中,或只是無效。 這不能由 try 保護 ,但處理程式除外 -它只能受到探查或類似的程式設計技術保護。 如需文件系統驅動程式中緩衝區處理和探查的資訊,請參閱 緩衝區處理。 如需驅動程序開發的最佳作法,以及驅動程式開發人員所犯的常見錯誤資訊,請參閱 Surface Team Driver Development 最佳做法

使用 !analyze debug extension with the -v verbose 選項來顯示錯誤檢查的相關信息,以判斷根本原因。

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 表示讀取記憶體區域時發生錯誤檢查。

查看所有 !analyze 輸出,以取得錯誤檢查發生時所發生狀況的相關信息。 檢查MODULE_NAME: 和 FAULTING_MODULE:,以查看參考無效系統記憶體的程序代碼。

查看 STACK TEXT,以取得失敗發生時所執行的線索。 如果有多個傾印檔案可用,請比較資訊以尋找堆疊中的常見程序代碼。

使用 !analyze 輸出中提供的 .trap 命令來設定內容。

TRAP_FRAME:  fffff98112e8b3d0 -- (.trap 0xfffff98112e8b3d0)

使用調試程式命令,例如使用 kb(顯示堆疊回溯) 來調查錯誤程序代碼。

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

使用 d、da、db、dc、dd、dD、df、dp、dq、du、dw (Display Memory) 命令來調查參數 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)Dissasemble 搭配參數 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 ,位於指令指標緩存器中,請撕裂。

!pte!pool 命令也可用來檢查記憶體。

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

如需 Windows 記憶體使用量的詳細資訊,請參閱 Windows Internals 7th Edition 第 1 部分,By Pavel Yosifovich、Mark E. Russinovich、David A. 所羅門和 Alex Ionescu。

驅動程式驗證器

驅動程式驗證器是一種工具,可即時執行以檢查驅動程序的行為。 例如,驅動程式驗證器會檢查記憶體資源的使用方式,例如記憶體集區。 如果在執行驅動程式程式代碼時看到錯誤,它會主動建立例外狀況,以允許進一步審查該部分的驅動程序程序代碼。 驅動程式驗證器管理員內建於 Windows 中,可在所有 Windows 電腦上使用。 使用驅動程式驗證器來追蹤失敗的特定原因。

若要啟動驅動程式驗證器管理員,請在命令提示字元中輸入 驗證器 。 您可以設定您要驗證的驅動程式。 驗證驅動程式的程式代碼會在執行時增加額外負荷,因此請嘗試並確認最少的驅動程式數目。 如果識別出錯誤驅動程式,請選取它。 如需詳細資訊,請參閱驅動程式驗證器

另請參閱

錯誤檢查代碼參考