デバッガー エンジンは、複数のターゲットを同時にデバッグできます。 デバッグ セッションは、エンジンがターゲットを取得したときに開始され、すべてのターゲットが破棄されるまで続行されます。 ターゲットの実行中はデバッグ セッションにアクセスできませんが、現在のターゲットが中断されるとアクセス可能になります。 エンジンは、セッションにアクセスできる間にのみターゲットを調べて操作するために使用できます。
デバッガーのメイン ループは、通常、実行状態の設定、 WaitForEvent メソッドの呼び出し、生成された イベントの処理で構成されます。 WaitForEvent が呼び出されると、セッションにアクセスできなくなります。
ターゲットでイベントが発生すると、エンジンはすべてのターゲットを中断し、セッションにアクセスできるようになります。 その後、エンジンはイベントのイベント コールバックを通知し、イベント フィルター ルールに従います。 イベント コールバックとイベント フィルターによって、ターゲットでの実行の続行方法が決まります。 エンジンがデバッガーに割り込む必要があると判断した場合、 WaitForEvent メソッドが返され、セッションは引き続きアクセス可能です。それ以外の場合、エンジンはイベント コールバックとイベント フィルターによって決定された方法でターゲットの実行を再開し、セッションに再度アクセスできなくなります。
WaitForEvent 呼び出しの期間中、特にイベント コールバックに通知し、フィルター ルールを処理している間、エンジンは "待機内" と呼ばれる状態になります。 この状態では、 WaitForEvent を呼び出すことはできません (再入可能ではありません)。
ターゲットでの実行の開始には、実行状態の設定と WaitForEvent の呼び出しの 2 つの手順があります。 実行状態は、 SetExecutionStatus メソッドを使用するか、実行状態を設定するデバッガー コマンド ( g(Go) や p (Step) など) を実行して設定できます。
一連のデバッガー コマンドが一緒に実行される場合 (例: "g; ?@$ip"-- 暗黙的な待機 は、そのコマンドがシーケンスの最後のコマンドでない場合、ターゲットでの実行を必要とするコマンドの後に発生します。 デバッガー エンジンが "待機内" の状態にある場合、暗黙的な待機は発生できません。この場合、コマンドの実行は停止し、現在のコマンド (暗黙的な待機を引き起こそうとしたコマンド) は、ターゲットでの実行を続行する方法を示すものとして解釈されます。 残りのコマンドは破棄されます。
手記 セッションがアクセス可能かアクセス不能かを判断する場合、ターゲットの限定的な実行 (ステップ実行など) はエンジンによって実行と見なされます。 制限された実行が完了すると、セッションにアクセスできるようになります。
ホスト エンジン
リモートでデバッグする場合は、デバッガー エンジンの複数のインスタンスを使用できます。 これらのインスタンスの 1 つだけで、デバッグ セッションが維持されます。このインスタンスは ホスト エンジンと呼ばれます。
すべてのデバッガー操作は、シンボルの読み込みと拡張機能の読み込みなど、ホスト エンジンに対して相対的です。