.thread (レジスタ コンテキストの設定)

.thread コマンドは、レジスタ コンテキストに使用されるスレッドを指定します。

.thread [/p [/r] ] [/P] [/w] [Thread]

パラメーター

/p
(ライブ デバッグのみ) このオプションを指定した場合で、かつ Thread がゼロ以外の場合、このスレッドを所有するプロセスのすべての遷移ページ テーブル エントリ (PTE) は、アクセス前に物理アドレスに自動的に変換されます。 これが速度の低下につながる場合があります。デバッガーは、このプロセスで使用されるすべてのメモリの物理アドレスを参照する必要があり、また、デバッグ ケーブルを介して大量のデータを転送しなければならない場合があるためです。 (この動作は .cache forcedecodeuser と同じです。)

/p オプションを指定した場合で、かつ Thread が 0 または省略されている場合、この変換は無効になります。 (この動作は .cache noforcedecodeuser と同じです。)

/r
(ライブ デバッグのみ)/r オプションが /p オプションと一緒に指定された場合、このスレッドを所有するプロセスのユーザー モード シンボルは、プロセス コンテキストとレジスタ コンテキストが設定された後に再読み込みされます。 (この動作は .reload /user と同じです。)

/P
(ライブ デバッグのみ) このオプションが指定された場合で、かつ Thread がゼロ以外の場合、すべての遷移ページ テーブル エントリ (PTE) はアクセス前に物理アドレスに自動的に変換されます。 /pオプションとは異なり、このスレッドを所有するプロセスだけでなく、ユーザー モード プロセスとカーネル モード プロセスすべての PTE が変換されます。 デバッガは使用中のすべてのメモリの物理アドレスを検索する必要があり、デバッグ ケーブルを介して大量のデータを転送する必要があるため、これにより速度が低下する可能性があります。 (この動作は .cache forcedecodeptes と同じです。)

/w
(64 ビット カーネル デバッグのみ) スレッドのアクティブ コンテキストを WOW64 32 ビット コンテキストに変更します。 指定したスレッドは、WOW64 状態のプロセスで実行されている必要があります。

Thread
スレッドのアドレス。 これを省略した場合、または 0 の場合、スレッド コンテキストは現在のスレッドにリセットされます。

Environment

項目 説明
モード カーネル モードのみ
対象 ライブ、クラッシュ ダンプ
プラットフォーム すべて

追加情報

ユーザー モード アドレス コンテキストおよびその他のコンテキスト設定の詳細については、「コンテキストの変更」を参照してください。

解説

一般に、カーネル デバッグを実行している場合、視認できるレジスタは現在のスレッドに関連付けられているレジスタだけです。

.thread コマンドは、指定されたスレッドをレジスタ コンテキストとして使用するようにカーネル デバッガーに指示します。 このコマンドが実行されると、デバッガーは、このスレッドの最も重要なレジスタとスタック トレースにアクセスできるようになります。 このレジスタ コンテキストは、別のレジスタ コンテキスト コマンド (.thread.cxr、または .trap) の実行または使用をターゲットに許可するまで保持されます。 詳細については、「レジスタ コンテキスト」を参照してください。

/w オプションは、WOW64 状態のプロセスで実行されているスレッド上の 64 ビット カーネル デバッグ セッションでのみ使用できます。 取得されたコンテキストは、WOW64 によって記憶される最後のコンテキストになります。これは通常、Thread によって実行される最後のユーザー モード コードです。 このオプションは、ターゲットがネイティブ マシン モードの場合にのみ使用できます。 たとえば、WOW64 を使用して x86 ベースのプロセッサをエミュレートしている 64 ビット マシンでターゲットが実行されている場合、このオプションは使用できません。 /w オプションを使用すると、マシン モードが、x86 ベースのプロセッサに自動的に切り替わります。

このコマンドは、現在のスレッドを実際には変更しません。 言い換えると、!thread!teb などの拡張機能は、引数が使用されなければ、引き続き現在のスレッドを既定として扱います。

次に例を示します。 目的のスレッドのアドレスを見つけるには、!process 拡張機能を使用します。 (このケースでは、!process 0 0 を使用してすべてのプロセスを一覧表示した後、!process を再度使用して目的のプロセスのすべてのスレッドを一覧表示しています)。

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0  SessionId: 0  Cid: 0008    Peb: 00000000  ParentCid: 0000
    DirBase: 00030000  ObjectTable: fe529a88  TableSize: 145.
    Image: System

.....

PROCESS ffaa5280  SessionId: 0  Cid: 0120    Peb: 7ffdf000  ParentCid: 01e0
    DirBase: 03b70000  ObjectTable: ffaa4e48  TableSize:  23.
    Image: winmine.exe

kd> !process ffaa5280
PROCESS ffaa5280  SessionId: 0  Cid: 0120    Peb: 7ffdf000  ParentCid: 01e0
    DirBase: 03b70000  ObjectTable: ffaa4e48  TableSize:  23.
    Image: winmine.exe
    VadRoot ffaf6e48 Clone 0 Private 50. Modified 0. Locked 0.
    DeviceMap fe502e88
    Token                             e1b55d70

.....

        THREAD ffaa43a0  Cid 120.3a4  Teb: 7ffde000  Win32Thread: e1b4fea8 WAIT: (WrUserRequest) UserMode Non-Alertable
            ffadc6a0  SynchronizationEvent
        Not impersonating
        Owning Process ffaa5280
        WaitTime (seconds)      24323
        Context Switch Count    494                   LargeStack

.....

次に、目的のスレッドのアドレスで .thread コマンドを使用します。 これにより、レジスタ コンテキストが設定され、このスレッドの重要なレジスタと呼び出し履歴を調べることができます。

kd> .thread ffaa43a0
Using context of thread ffaa43a0

kd> r
Last set context:
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
eip=80403a0d esp=fd581c2c ebp=fd581c60 iopl=0         nv up di pl nz na pe nc
cs=0000  ss=0000  ds=0000  es=0000  fs=0000  gs=0000             efl=00000000
0000:3a0d ??              ???

kd> k
  *** Stack trace for last set context - .thread resets it
ChildEBP RetAddr  
fd581c38 8042d61c ntoskrnl!KiSwapThread+0xc5
00001c60 00000000 ntoskrnl!KeWaitForSingleObject+0x1a1