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