次の方法で共有


エラーが発生したプロセスの検索

失敗したプロセスを見つける前に、受け入れ側プロセッサのコンテキストにあることを確認します。 受け入れ側プロセッサを特定するには、各プロセッサで !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 に加えて、次の拡張機能は、応答しないコンピューターの原因を特定するのに役立ちます。

拡張子 結果

!ready

実行する準備ができているスレッドを優先度順に識別します。

!kdext*.locks

リテール タイムアウトでデッドロックが発生した場合に備えて、保持されているリソース ロックを識別します。

!vm

仮想メモリの使用量を確認します。

!poolused

1 種類のプール割り当てが不均衡に大きいかどうかを判断します (プールのタグ付けが必要)。

!memusage

物理メモリの状態を確認します。

!heap

ヒープの有効性を確認します。

!irpfind

非ページ プールでアクティブな IRP を検索します。

提供された情報が異常な状態を示していない場合は、ntoskrnl!KiSwapThread にブレークポイントを設定して、プロセッサが 1 つのプロセスでスタックしているのか、それともまだ他のプロセスをスケジュールしているのかを確認してください。 スタックしていない場合は、NtReadFile などの一般的な関数にブレークポイントを設定して、コンピューターが特定のコード パスでスタックしているかどうかを判断します。