次の方法で共有


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

更新 : 2007 年 11 月

デバッグ中のプログラムの制御では、マネージ コードへのブレークポイントの設定、マネージ コードやアンマネージ コードのステップ実行、および初回例外やセカンド チャンス例外の処理を行います。以下のシナリオでは、デバッガが共通言語ランタイム (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 メソッドを呼び出し、プロセスの実行を続けます。

参照

その他の技術情報

デバッグ API の主要概念

CLR デバッグの概要

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