プロセスとスレッドの制御
ユーザー モード デバッグを実行する場合は、プロセスとスレッドのアクティブ化、表示、凍結、凍結解除、一時停止、および一時停止解除を行います。
現在のプロセスまたはアクティブなプロセスが、現在デバッグの対象になっているプロセスです。 同様に、現在のスレッドまたはアクティブなスレッドが、現在デバッガーが制御しているスレッドです。 多くのデバッガー コマンドのアクションは、現在のプロセスとスレッドの ID によって決まります。 現在のプロセスは、デバッガーが使用する仮想アドレス マッピングも決定します。
デバッグが開始されたとき、現在のプロセスが、デバッガーにアタッチされているプロセス、またはデバッガーが割り込んだ例外の原因となったプロセスです。 同様に、現在のスレッドが、デバッガーがプロセスにアタッチされたときにアクティブだったスレッド、または例外の原因となったスレッドです。 ただし、デバッガーを使用して、現在のプロセスとスレッドを変更したり、個々のスレッドを凍結または凍結解除したりできます。
カーネル モード デバッグでは、プロセスとスレッドは、このセクションで説明する方法では制御されません。 カーネル モードでプロセスとスレッドを操作する方法の詳細については、「コンテキストの変更」を参照してください。
プロセスとスレッドの表示
プロセスとスレッドの情報を表示するには、以下の方法を使用します。
| (プロセスの状態) コマンド
~ (スレッドの状態) コマンド
(WinDbg のみ) [プロセスとスレッド] ウィンドウ
現在のプロセスとすれっdの設定
現在のプロセスまたはスレッドを変更するには、以下の方法を使用できます。
|s (現在のプロセスの設定) コマンド
~s (現在のスレッドの設定) コマンド
(WinDbg のみ) [プロセスとスレッド] ウィンドウ
スレッドの凍結と凍結解除
デバッガーは、スレッドを一時停止するか、スレッドを凍結することで、スレッドの実行を変更できます。 これら 2 つのアクションには、多少異なる効果があります。
各スレッドには、それに関連付けられている一時停止カウントがあります。 このカウントが 1 以上の場合、システムはスレッドを実行しません。 カウントが 0 以下の場合、システムは必要に応じてスレッドを実行します。
通常は、各スレッドの一時停止カウントは 0 です。 デバッガーがプロセスにアタッチされると、そのプロセス内のすべてのスレッドの一時停止カウントを 1 ずつ増やします。 デバッガーがプロセスからデタッチされると、すべての一時停止カウントが 1 ずつ減らされます。 デバッガーがプロセスを実行するときは、すべての一時停止カウントを一時的に 1 ずつ減らします。
以下の方法を使用して、デバッガーから任意のスレッドの一時停止カウントを制御できます。
~n (スレッドの一時停止) コマンドは、指定されたスレッドの一時停止カウントを 1 増やします。
~m (スレッドの再開) コマンドは、指定されたスレッドの一時停止カウントを 1 減らします。
これらのコマンドの最も一般的な用途は、特定のスレッドの一時停止カウントを 1 から 2 に上げることです。 デバッガーがプロセスを実行するか、プロセスからデタッチされると、プロセス内で他のスレッドが実行されている場合でも、スレッドの一時停止カウントは 1 になり、一時停止されたままになります。
非拡張デバッグを実行しているときでも、スレッドを一時停止できます。
デバッガーは、スレッドを凍結することもできます。 このアクションは、いくつかの点でスレッドの一時停止と似ています。 ただし、"凍結" はデバッガーの設定に過ぎません。 Windows オペレーティング システムで、このスレッドに関して何らかの違いが認識されることはありません。
既定では、すべてのスレッドは凍結解除された状態です。 デバッガーがプロセスを実行するときに、凍結されているスレッドは実行されません。 ただし、デバッガーがプロセスからデタッチされると、すべてのスレッドが凍結解除されます。
個々のスレッドを凍結および凍結解除するには、以下の方法を使用できます。
~f (スレッドの凍結) コマンドは、指定されたスレッドを凍結します。
~u (スレッドの凍結解除) コマンドは、指定されたスレッドを凍結解除します。
いずれの場合も、デバッガーがターゲットに割り込んでいるときは、ターゲット プロセスに属するスレッドは実行されません。 スレッドの一時停止カウントは、デバッガーがプロセスを実行するか、プロセスからデタッチされたときにのみ、スレッドの動作に影響します。 凍結状態は、デバッガーがプロセスを実行する場合にのみ、スレッドの動作に影響します。
その他のコマンドのスレッドとプロセス
その他の多くのコマンドで、スレッド指定子またはプロセス指定子を前に追加することができます。 詳細については、個別のコマンドのトピックを参照してください。
多くのコマンドや拡張コマンドの前に、~e (スレッド固有のコマンド) 修飾子を追加できます。 この修飾子を使用すると、指定されたスレッドに対してコマンドが実行されます。 この修飾子は、複数のスレッドにコマンドを適用する場合に特に便利です。 たとえば、次のコマンドは、デバッグ対象のすべてのスレッドに対して !gle 拡張コマンドを繰り返し実行します。
~*e !gle
複数のシステム
デバッガーは、複数のターゲットに同時にアタッチできます。 これらのプロセスにダンプ ファイルが含まれているか、複数のコンピューター上のライブ ターゲットが含まれている場合、デバッガーは、各アクションのシステム、プロセス、スレッドを参照します。 この種類のデバッグの詳細については、「複数のターゲットのデバッグ」を参照してください。