次の方法で共有


バグ チェック 0x50: PAGE_FAULT_IN_NONPAGED_AREA

PAGE_FAULT_IN_NONPAGED_AREAバグ チェックの値は 0x00000050 です。 これは、無効なシステム・メモリーが参照されたことを示します。 通常、メモリ アドレスが間違っているか、メモリ アドレスが解放されたメモリを指しています。

Von Bedeutung

この記事は、プログラマー向けです。 コンピューターを使用中に、ブルー スクリーン エラーが表示された場合は、「ブルー スクリーン エラーのトラブルシューティング」を参照してください。

PAGE_FAULT_IN_NONPAGED_AREAパラメータ

パラメーター 説明

1

参照されるメモリ アドレス

2

Windows 1507(TH1)バージョン以降 - x64

0: 読み取り操作

2: 書き込み操作

10: 操作の実行

Windows 1507(TH1)バージョン以降 - x86

0: 読み取り操作

2: 書き込み操作

10: 操作の実行

Windows 1507(TH1)バージョン後 - アーム

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 - カーネル モード コードは、ユーザー モードの仮想アドレスへのアクセスが許可されていない場合に、そのようなアクセスを試みました。

エラーの原因となったドライバーを特定できる場合は、その名前がブルー スクリーンに印刷され、メモリの (PUNICODE_STRING) KiBugCheckDriver の場所に格納されます。 デバッガーの dx コマンドを使用して、この - dx KiBugCheckDriverを表示できます。

原因

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

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

注釈

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

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

障害のあるシステム・サービスの問題の解決: サービスを無効にし、エラーが解決することを確認します。 その場合は、システムサービスの製造元に問い合わせて、更新の可能性を確認してください。 システムの起動中にエラーが発生した場合は、Windowsの修復オプションを調査します。 詳細については、「 Windows 10 の回復オプション」を参照してください。

ウイルス対策ソフトウェアの問題の解決: プログラムを無効にし、エラーが解決することを確認します。 その場合は、プログラムの製造元に問い合わせて、可能な更新プログラムについてお問い合わせください。

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

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

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

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

解決策

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

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

!analyze デバッグ拡張機能を -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)

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)Dissemble をパラメータ 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 (レジスタ) コマンドを使用して、システム・バグ・チェックとして実行されていた内容を調べます。

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 で使用できます。 ドライバー検証ツールを使用して、エラーの特定の原因を追跡します。

ドライバー検証ツール マネージャーを起動するには、コマンド プロンプトで「 検証ツール 」と入力します。 確認するドライバーを構成できます。 ドライバーを検証するコードは、実行時にオーバーヘッドを追加するため、ドライバーの数をできるだけ少なくしてみてください。 障害が発生しているドライバーが特定された場合は、それを選択します。 詳細については、「ドライバーの検証ツール」を参照してください。

こちらも参照ください

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