更新 : 2007 年 11 月
デバッグ中のプログラムの制御では、マネージ コードへのブレークポイントの設定、マネージ コードやアンマネージ コードのステップ実行、および初回例外やセカンド チャンス例外の処理を行います。以下のシナリオでは、デバッガが共通言語ランタイム (CLR) デバッグ API を使ってこれらのタスクを実行する方法を説明します。
マネージ コードでのブレークポイントの設定
以下では、マネージ コードにブレークポイントを設定する方法を操作手順に従って説明します。
デバッガは、特定の関数のモジュール オブジェクトを取得します。デバッガは、メタデータ インターフェイスで ICorDebugAppDomain::GetModuleFromMetaDataInterface メソッドを呼び出して、関数のモジュールの ICorDebugModule オブジェクトを取得します。
デバッガは、ICorDebugModule::GetFunctionFromToken メソッドを呼び出して、特定の関数の関数オブジェクトを取得します。
デバッガは、ICorDebugFunction::GetILCode メソッドを呼び出して、特定の関数のコード オブジェクトを取得します。
デバッガは、特定のオフセットを指定して ICorDebugCode::CreateBreakpoint メソッドを呼び出し、マネージ コードにブレークポイントを作成します。CreateBreakpoint は、ICorDebugBreakpoint のインスタンスを返します。ブレークポイントがアクティブな状態で作成されます。
デバッガは、現在のデバッグ対象プロセスに対して ICorDebugController::Continue メソッドを呼び出し、プロセスの実行を続けます。
デバッグ API は、スレッドがブレークポイントに達すると ICorDebugManagedCallback::Breakpoint コールバックを呼び出して、デバッガに通知します。
マネージ コードとアンマネージ コードのステップ実行
以下では、デバッガでマネージ コードをシングル ステップ実行する方法を操作手順に従って説明します。
デバッガは、シングル ステップを行うスレッドでステッパを作成します。デバッガは、ステップ実行するスレッドに対して ICorDebugThread::CreateStepper メソッドを呼び出します。また、デバッガは、ステップ実行の基準となるフレームに対して ICorDebugFrame::CreateStepper メソッドを呼び出すこともできます。ステッパが作成されると、プロセスは停止されるものと想定されます。
デバッガは、ICorDebugStepper::Step メソッドを呼び出して、スレッドをステップ実行します。
デバッガは、現在のデバッグ対象プロセスに対して ICorDebugController::Continue メソッドを呼び出し、プロセスの実行を続けます。
デバッグ API は、ステップが完了したことをデバッガに通知します。デバッグ API は、デバッガがランタイムに登録したオブジェクトの ICorDebugManagedCallback::StepComplete メソッドを呼び出します。
デバッガは、ICorDebugStepper::Step メソッドを呼び出して、再びスレッドをステップ実行します。
デバッガは、現在のデバッグ対象プロセスに対して ICorDebugController::Continue メソッドを呼び出し、プロセスの実行を続けます。
以下では、アンマネージ コードの場合のステップ実行について説明します。
デバッガは、必要に応じて、ネイティブ コードへのステップ インをスキップします。デバッガは、ICorDebugStepper::StepOut を呼び出して、前のフレームが再アクティブ化されるまで、ネイティブ コードのステップ実行をスキップします。マネージ コードに再び入ると、デバッグ API は ICorDebugManagedCallback::StepComplete メソッドを呼び出します。
デバッガは、必要に応じて、マネージ コードの次のセクションにステップ インします。デバッガは、ICorDebugStepper::Step メソッドを呼び出して、前のマネージ コード フレームに再び入るとき、またはアンマネージ コードが新しいマネージ コードを呼び出すときに、制御がデバッガに返されるようにします。
デバッガは、現在のデバッグ対象プロセスに対して ICorDebugController::Continue メソッドを呼び出し、プロセスの実行を続けます。
デバッグ API は、ICorDebugUnmanagedCallback::DebugEvent メソッドを呼び出して、アンマネージ コードにステップ インすることをデバッガに通知します。
例外処理
以下では、初回例外およびセカンド チャンス例外の処理方法を操作手順に従って説明します。
CLR は、初回例外が発生したことをデバッガに通知します。デバッグ API は、デバッガがランタイムに登録した ICorDebugManagedCallback インターフェイスの ICorDebugManagedCallback::Exception メソッドを呼び出します。
デバッガは、例外に関する情報を取得します。デバッガは、コールバックに渡された ICorDebugThread オブジェクトの ICorDebugThread::GetCurrentException メソッドを呼び出して、例外オブジェクト (ICorDebugValue) を取得します。
デバッガは、例外の ICorDebugObjectValue オブジェクトを取得します。デバッガは、QueryInterface メソッドを呼び出して、例外の ICorDebugObjectValue オブジェクトを取得します。
デバッガは、ICorDebugObjectValue::GetClass メソッドを呼び出して、スローされた例外オブジェクトのクラスを取得します。
デバッガは、例外を無視する判断をして続行します。
CLR は、セカンド チャンス例外が発生したことをデバッガに通知します。デバッグ API は、ICorDebugManagedCallback::Exception メソッドを呼び出して、例外がセカンド チャンス例外であることを指定します。
ユーザーは、例外が重要ではないと判断します。デバッガは、現在のデバッグ対象スレッドに対して ICorDebugThread::ClearCurrentException メソッドを呼び出します。このメソッドは、例外をクリアし、例外がスローされないようにします。
デバッガは、現在のデバッグ対象プロセスに対して ICorDebugController::Continue メソッドを呼び出し、プロセスの実行を続けます。