次の方法で共有


ライブ ローカル デバッグ

-kl コマンド ライン オプションを使用してカーネル デバッガー (KD) または WinDbg を起動することで、ローカル カーネル デバッグを実行できます。

kd [-y SymbolPath] -kl 

または

windbg [-y SymbolPath] -kl 

Windows Vista 以降では、ローカル カーネル デバッグでは、/debug オプションを使用してコンピューターを起動する必要があります。 管理者としてコマンド プロンプト ウィンドウを開き、で bcdedit /debug 入力します。 コンピューターを再起動します。

重要

BCDEdit を使用してブート情報を変更する前に、テスト PC で BitLocker やセキュア ブートなどの Windows セキュリティ機能を一時的に中断する必要がある場合があります。 テストが完了し、セキュリティ機能が無効になっている場合は、テスト PC を適切に管理するときに、これらのセキュリティ機能を再度有効にします。

Windows Vista 以降では、ローカル カーネル デバッグでは、デバッガーを管理者として実行する必要があります。

ライブ ローカル デバッグは、デバッガーがアタッチされているときに再現が困難な問題のデバッグに非常に役立ちます。ただし、パケット、IRP、SRB データなど、時間の機密情報に関する知識が必要なものは、問題がハングまたはストールしていない限り機能する可能性は低くなります。

ローカル デバッグを実行する場合は、次の変数を考慮してください。

  • 全体的な状態。 たとえば、ストリームは流れていますか。 ストリームは一時停止していますか?

  • パケット数。 たとえば、ストリームにキューに登録されている IRP があるかどうか。

  • パケット数の変更。 ストリームは移動していますか?

  • パケット リストの変更。

  • ハングしたカーネル スレッド。

最後のものを考えてみましょう。

LKD でハングしたスレッドを調べる

まず、!process 0 0 拡張機能を使用して、ハングしたスレッドを含むプロセスを識別します。 次に、!process を再度発行して、そのスレッドの詳細を確認します。

lkd> !process 816a550 7
        THREAD 81705da8  Cid 0b5c.0b60  Teb: 7ffde000 Win32Thread: e1b2d890 WAIT: (Suspended)
        IRP List:
            816c9ad8: (0006,0190) Flags: 00000030  Mdl: 00000000
        Start Address kernel32!BaseProcessStartThunk (0x77e5c650)
        Win32 Start Address 0x0101c9be
        Stack Init f50bf000 Current f50bea74 Base f50bf000 Limit f50b9000 Call 0
        Priority 10 BasePriority 8 PriorityDecrement 0

スレッドは表示されませんが、スタック アドレスは表示されます。 スタック上の現在のアドレスで dds (または ddq) コマンドを使用すると、呼び出すプロセスが指定されるため、さらに調査するための開始点が得られます。

lkd> dds f50bea74
f50bea74  f50bebc4
f50bea78  00000000
f50bea7c  80805795 nt!KiSwapContext+0x25
f50beab4  8080ece0 nt!KeWaitForSingleObject
f50beabc  f942afda ks!CKsQueue::CancelAllIrps+0x14
f50bead8  f94406c4 ks!CKsQueue::SetDeviceState+0x170
f50beb00  f943f6f1 ks!CKsPipeSection::DistributeDeviceStateChange+0x1d
f50beb24  f943fb1e ks!CKsPipeSection::SetDeviceState+0xb2