バグ チェック 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 T- 参照されたアドレスに有効でアクティブなページ テーブル エントリがありません。

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 の場所に格納されます。 デバッガーの dx コマンドを使用して、これを表示できます: dx KiBugCheckDriver

原因

バグ チェック 0x50 は、問題のあるシステム サービスまたは問題のあるドライバー コードのインストールが原因で発生する可能性があります。 破損した NTFS ボリュームと同様、ウイルス対策ソフトウェアでこのエラーがトリガーされる可能性もあります。

また、問題のあるハードウェアをインストールした後や、インストールしたハードウェアで障害が発生した場合にも、発生する可能性があります (通常は、メイン メモリ、L2 RAM キャッシュ、ビデオ RAM などの欠陥のある RAM に関係します)。

解説

イベント ログ: イベント ビューアーのシステム ログで、エラーの原因となっているデバイスまたはドライバーの特定に役立つ可能性のある追加のエラー メッセージを調べます。 詳しくは、「イベント ビューアーの使用」を参照してください。 ブルー スクリーンと同じ時間帯に発生した重大なエラーをシステム ログで探します。

障害のあるドライバーの解決: ドライバーの名前がブルー スクリーンに表示された場合、またはイベント ログに記録されている場合は、その名前を調べます。 ドライバーの製造元に問い合わせて、更新されたドライバーが利用可能かどうかを確認します。

障害のあるシステム サービスの問題の解決: サービスを無効にし、それによってエラーが解決されることを確認します。 その場合は、システム サービスの製造元に、更新プログラムを入手できるかどうかを確認します。 システムの起動中にエラーが発生する場合は、Windows の修復オプションを調べます。 詳しくは、「Windows 10 の回復オプション」をご覧ください。

ウイルス対策ソフトウェアの問題の解決: プログラムを無効にし、それによってエラーが解決されることを確認します。 その場合は、プログラムの製造元に、更新プログラムを入手できるかどうかを確認します。

破損した NTFS ボリュームの問題の解決: Chkdsk /f /r を実行して、ディスク エラーの検出と修復を行います。 システム パーティションでディスク スキャンを開始する前に、システムを再起動する必要があります。 ハード ドライブ システムの製造元に問い合わせて、ハード ドライブ サブシステム用に提供されている診断ツールを入手します。

Windows メモリ診断: Windows メモリ診断ツールを実行して、物理メモリをテストします。 [スタート] ボタンを選択し、[コントロール パネル] を選択します。 検索ボックスに「メモリ」と入力し、[お使いのコンピューターのメモリの問題の診断]‌ を選択します。テストの実行後、イベント ビューアーを使用して、システム ログで結果を確認します。 MemoryDiagnostics-Results エントリを探して、結果を表示します。

障害のあるハードウェアの問題の解決: システムに最近ハードウェアを追加した場合は、そのハードウェアを取り外して、エラーが再発するかどうかを確認します。 既存のハードウェアで障害が発生した場合は、問題のあるコンポーネントを外すか交換します。 システムの製造元から提供されているハードウェア診断を実行する必要があります。 これらの手順の詳細については、コンピューターの取扱説明書を参照してください。

ブルー スクリーンの一般的なトラブルシューティング情報については、バグ チェックのブルー スクリーン データの分析に関する記述と「STOP エラーまたはブルー スクリーン エラーの問題に関する高度なトラブルシューティング」を参照してください。

解決方法

固有の原因を特定してコードを修正するには、プログラミングの経験と、障害が発生しているモジュールのソース コードへのアクセス権が必要です。

通常は、参照されているアドレスが解放されたメモリ内にあるか、単に無効になっています。 これは、try - except ハンドラーでは保護できません。プローブまたは同様のプログラミング手法によってのみ保護できます。 バッファー処理とファイル システム ドライバーのプローブについては、「バッファー処理」を参照してください。 ドライバー開発に関するベスト プラクティスと、ドライバー開発者が陥りやすい一般的な間違いについては、「Surface チームによるドライバー開発のベスト プラクティス」を参照してください。

!analyze デバッグ拡張機能を -v 詳細オプションと共に使用して、バグ チェックに関する情報を表示し、根本原因を特定します。

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 (メモリの表示) コマンドを使用して、パラメーター 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 (逆アセンブル) を使用して、無効なメモリを参照したものを調べます。 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 (レジスタ) コマンドを使用して、システム バグがチェックされたときに実行されていた内容を確認します。

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 を使用して、システム メモリの全般的な状態を確認します。

Windows メモリ使用率の詳細については、Pavel Yosifovich、Mark E. Russinovich、David A. Solomon、Alex Ionescu による 「Windows Internals 7th Edition Part 1」を参照してください。

ドライバーの検証ツール

ドライバーの検証ツールは、リアルタイムで実行してドライバーの動作を調べるためのツールです。 たとえば、ドライバーの検証ツールでは、メモリ プールなどのメモリ リソースの使用がチェックされます。 ドライバー コードの実行でエラーが検出された場合は、ドライバー コードのその部分をさらに詳しく調査できるように、事前に例外が作成されます。 ドライバーの検証ツール マネージャーは、Windows に組み込まれており、すべての Windows PC で使用できます。 ドライバーの検証ツールを使用して、エラーを引き起こした特定の原因を追跡します。

ドライバーの検証ツール マネージャーを起動するには、コマンド プロンプトで「Verifier」と入力します。 どのドライバーを検証するかを構成できます。 ドライバーを検証するコードが実行されるとオーバーヘッドが増えるので、可能な限り少ない数のドライバーで試してみてください。 障害が発生しているドライバーが特定されている場合は、それを選択します。 詳細については、「ドライバーの検証ツール」を参照してください。

関連項目

バグ チェック コード リファレンス