.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