エラーが発生したプロセスの検索
失敗したプロセスを見つける前に、受け入れ側プロセッサのコンテキストにあることを確認します。 受け入れ側プロセッサを特定するには、各プロセッサで !pcr 拡張機能を使用し、例外ハンドラーが読み込まれたプロセッサを探します。 受け入れるプロセッサの例外ハンドラーには、0xFFFFFFFF以外のアドレスがあります。
たとえば、このプロセッサの NtTib.ExceptionList のアドレスは0xFFFFFFFFであるため、これは失敗したプロセスを含むプロセッサではありません。
0: kd> !pcr
PCR Processor 0 @ffdff000
NtTib.ExceptionList: ffffffff
NtTib.StackBase: 80470650
NtTib.StackLimit: 8046d860
NtTib.SubSystemTib: 00000000
NtTib.Version: 00000000
NtTib.UserPointer: 00000000
NtTib.SelfTib: 00000000
SelfPcr: ffdff000
Prcb: ffdff120
Irql: 00000000
IRR: 00000000
IDR: ffffffff
InterruptMode: 00000000
IDT: 80036400
GDT: 80036000
TSS: 80257000
CurrentThread: 8046c610
NextThread: 00000000
IdleThread: 8046c610
DpcQueue:
ただし、プロセッサ 1 の結果はまったく異なります。 この場合、NtTib.ExceptionList の値は f0823cc0 であり、0xFFFFFFFFではなく、例外が発生したプロセッサであることを示します。
0: kd> ~1
1: kd> !pcr
PCR Processor 1 @81497000
NtTib.ExceptionList: f0823cc0
NtTib.StackBase: f0823df0
NtTib.StackLimit: f0821000
NtTib.SubSystemTib: 00000000
NtTib.Version: 00000000
NtTib.UserPointer: 00000000
NtTib.SelfTib: 00000000
SelfPcr: 81497000
Prcb: 81497120
Irql: 00000000
IRR: 00000000
IDR: ffffffff
InterruptMode: 00000000
IDT: 8149b0e8
GDT: 8149b908
TSS: 81498000
CurrentThread: 81496d28
NextThread: 00000000
IdleThread: 81496d28
DpcQueue:
正しいプロセッサ コンテキストにいる場合は、 !process 拡張機能に現在実行中のプロセスが表示されます。
プロセス ダンプの最も興味深い部分は次のとおりです。
時間 (高い値は、プロセスが原因である可能性があることを示します)。
ハンドル数 (これは、最初のエントリの ObjectTable の後のかっこ内の数値)。
スレッドの状態 (多くのプロセスには複数のスレッドがあります)。 現在のプロセスが アイドル 状態の場合は、コンピューターが本当にアイドル状態であるか、異常な問題が原因でハングしている可能性があります。
!process 0 7拡張機能を使用することはハングしたシステムで問題を見つける最良の方法ですが、フィルタリングするには情報が多すぎることがあります。 代わりに、CSRSS およびその他の不審なプロセスのプロセス ハンドルで !process 0 0 を使用し、次に !processを使用します。
!process 0 7 を使用する場合、これらのスタックはページ アウトされるため、スレッドの多くは "カーネル スタックが常駐していません" とマークされることがあります。これらのページがまだ移行中のキャッシュ内にある場合は、!process 0 7 の前に .cache decodeptes を使用して詳細情報を取得できます。
kd> .cache decodeptes
kd> !process 0 7
失敗したプロセスを特定できる場合は、 !process <process> 7 を使用して、プロセス内の各スレッドのカーネル スタックを表示します。 この出力では、カーネル モードの問題を特定し、疑わしいプロセスが呼び出している内容を明らかにできます。
!process に加えて、次の拡張機能は、応答しないコンピューターの原因を特定するのに役立ちます。
拡張子 | 効果 |
---|---|
実行する準備ができているスレッドを優先度順に識別します。 |
|
リテール タイムアウトでデッドロックが発生した場合に備えて、保持されているリソース ロックを識別します。 |
|
仮想メモリの使用量を確認します。 |
|
1 種類のプール割り当てが不均衡に大きいかどうかを判断します (プールのタグ付けが必要)。 |
|
物理メモリの状態を確認します。 |
|
ヒープの有効性を確認します。 |
|
非ページ プールでアクティブな IRP を検索します。 |
提供された情報が異常な状態を示していない場合は、ntoskrnl!KiSwapThread にブレークポイントを設定して、プロセッサが 1 つのプロセスでスタックしているのか、それともまだ他のプロセスをスケジュールしているのかを確認してください。 スタックしていない場合は、NtReadFile などの一般的な関数にブレークポイントを設定して、コンピューターが特定のコード パスでスタックしているかどうかを判断します。