デバッグ中のプログラムの制御

デバッグ中のプログラムの制御では、マネージ コードへのブレークポイントの設定、マネージ コードやアンマネージ コードのステップ実行、および初回例外やセカンド チャンス例外の処理を行います。 以下のシナリオでは、デバッガーが共通言語ランタイム (CLR) デバッグ API を使ってこれらのタスクを実行する方法を説明します。

マネージ コードでのブレークポイントの設定

以下では、マネージ コードにブレークポイントを設定する方法を操作手順に従って説明します。

  • デバッガーは、特定の関数のモジュール オブジェクトを取得します。 デバッガーは、メタデータ インターフェイスで ICorDebugAppDomain::GetModuleFromMetaDataInterface メソッドを呼び出して、関数のモジュールの ICorDebugModule オブジェクトを取得します。

  • デバッガーは、ICorDebugModule::GetFunctionFromToken メソッドを呼び出して、特定の関数の関数オブジェクトを取得します。

  • デバッガーは、ICorDebugFunction::GetILCode メソッドを呼び出して、特定の関数のコード オブジェクトを取得します。

  • デバッガーは、特定のオフセットを指定して ICorDebugCode::CreateBreakpoint メソッドを呼び出し、マネージ コードにブレークポイントを作成します。 CreateBreakpoint は、ICorDebugBreakpoint のインスタンスを返します。 ブレークポイントがアクティブな状態で作成されます。

  • デバッガーは、現在のデバッグ対象プロセスに対して ICorDebugController::Continue メソッドを呼び出し、プロセスの実行を続けます。

  • デバッグ API は、スレッドがブレークポイントに達すると ICorDebugManagedCallback::Breakpoint コールバックを呼び出して、デバッガーに通知します。

マネージ コードとアンマネージ コードのステップ実行

以下では、デバッガーでマネージ コードをシングル ステップ実行する方法を操作手順に従って説明します。

  1. デバッガーは、シングル ステップを行うスレッドでステッパを作成します。 デバッガーは、ステップ実行するスレッドに対して ICorDebugThread::CreateStepper メソッドを呼び出します。 また、デバッガーは、ステップ実行の基準となるフレームに対して ICorDebugFrame::CreateStepper メソッドを呼び出すこともできます。 ステッパが作成されると、プロセスは停止されるものと想定されます。

  2. デバッガーは、ICorDebugStepper::Step メソッドを呼び出して、スレッドをステップ実行します。

  3. デバッガーは、現在のデバッグ対象プロセスに対して ICorDebugController::Continue メソッドを呼び出し、プロセスの実行を続けます。

  4. デバッグ API は、ステップが完了したことをデバッガーに通知します。 デバッグ API は、デバッガーがランタイムに登録したオブジェクトの ICorDebugManagedCallback::StepComplete メソッドを呼び出します。

  5. デバッガーは、ICorDebugStepper::Step メソッドを呼び出して、再びスレッドをステップ実行します。

  6. デバッガーは、現在のデバッグ対象プロセスに対して ICorDebugController::Continue メソッドを呼び出し、プロセスの実行を続けます。

以下では、アンマネージ コードの場合のステップ実行について説明します。

  • デバッガーは、必要に応じて、ネイティブ コードへのステップ インをスキップします。 デバッガーは、ICorDebugStepper::StepOut を呼び出して、前のフレームが再アクティブ化されるまで、ネイティブ コードのステップ実行をスキップします。 マネージ コードに再び入ると、デバッグ API は ICorDebugManagedCallback::StepComplete メソッドを呼び出します。

  • デバッガーは、必要に応じて、マネージ コードの次のセクションにステップ インします。 デバッガーは、ICorDebugStepper::Step メソッドを呼び出して、前のマネージ コード フレームに再び入るとき、またはアンマネージ コードが新しいマネージ コードを呼び出すときに、制御がデバッガーに返されるようにします。

  • デバッガーは、現在のデバッグ対象プロセスに対して ICorDebugController::Continue メソッドを呼び出し、プロセスの実行を続けます。

  • デバッグ API は、ICorDebugUnmanagedCallback::DebugEvent メソッドを呼び出して、アンマネージ コードにステップ インすることをデバッガーに通知します。

例外処理

以下では、初回例外およびセカンド チャンス例外の処理方法を操作手順に従って説明します。

  1. CLR は、初回例外が発生したことをデバッガーに通知します。 デバッグ API は、デバッガーがランタイムに登録した ICorDebugManagedCallback インターフェイスの ICorDebugManagedCallback::Exception メソッドを呼び出します。

  2. デバッガーは、例外に関する情報を取得します。 デバッガーは、コールバックに渡された ICorDebugThread オブジェクトの ICorDebugThread::GetCurrentException メソッドを呼び出して、例外オブジェクト (ICorDebugValue) を取得します。

  3. デバッガーは、例外の ICorDebugObjectValue オブジェクトを取得します。 デバッガーは、QueryInterface メソッドを呼び出して、例外の ICorDebugObjectValue オブジェクトを取得します。

  4. デバッガーは、ICorDebugObjectValue::GetClass メソッドを呼び出して、スローされた例外オブジェクトのクラスを取得します。

  5. デバッガーは、例外を無視する判断をして続行します。

  6. CLR は、セカンド チャンス例外が発生したことをデバッガーに通知します。 デバッグ API は、ICorDebugManagedCallback::Exception メソッドを呼び出して、例外がセカンド チャンス例外であることを指定します。

  7. ユーザーは、例外が重要ではないと判断します。 デバッガーは、現在のデバッグ対象スレッドに対して ICorDebugThread::ClearCurrentException メソッドを呼び出します。 このメソッドは、例外をクリアし、例外がスローされないようにします。

  8. デバッガーは、現在のデバッグ対象プロセスに対して ICorDebugController::Continue メソッドを呼び出し、プロセスの実行を続けます。

参照

概念

CLR デバッグの概要

その他の技術情報

デバッグ (アンマネージ API リファレンス)