ブレークポイントのバインド
ユーザーがブレークポイントを設定している場合、たとえば F9 キーを押すと、IDE によって要求が作成され、デバッグ セッションにブレークポイントの作成が促されます。
ブレークポイントの設定
ブレークポイントの設定は 2 段階のプロセスです。ブレークポイントの影響を受けるコードまたはデータがまだ使用できないことがあるためです。 まず、ブレークポイントを記述する必要があります。次に、コードまたはデータが使用可能になったら、そのコードまたはデータに次のようにバインドする必要があります。
ブレークポイントは関連するデバッグ エンジン (DE) から要求されます。その後、コードまたはデータが使用可能になった時点でブレークポイントがバインドされます。
ブレークポイント要求はデバッグ セッションに送信され、そこから関連するすべての DE に送信されます。 ブレークポイントの処理を選択した DE によって、対応する保留中ブレークポイントが作成されます。
デバッグ セッションによって、保留中ブレークポイントが収集され、それらがデバッグ パッケージ (Visual Studio のデバッグ コンポーネント) に送り返されます。
デバッグ パッケージにより、保留中ブレークポイントをコードまたはデータにバインドするようにデバッグ セッションが促されます。 デバッグ セッションによって、関連するすべての DE にこの要求が送信されます。
DE でブレークポイントをバインドできる場合は、ブレークポイントにバインドされたイベントがデバッグ セッションに送り返されます。 そうでない場合は、ブレークポイント エラー イベントが代わりに送信されます。
保留中ブレークポイント
保留中ブレークポイントは、コードの複数の場所にバインドできます。 たとえば、C++ テンプレート用のソース コード行は、そのテンプレートから生成されるすべてのコード シーケンスにバインドできます。 デバッグ セッションでは、ブレークポイントがバインドされたイベントを使用して、そのイベントの送信時にブレークポイントにバインドされるコード コンテキストを列挙できます。 さらに多くのコード コンテキストを後でバインドできるため、DE は各バインド要求でブレークポイントがバインドされたイベントを複数送信できます。 ただし、DE によって、ブレークポイント エラー イベントはバインド要求ごとに 1 つしか送信できません。
実装
デバッグ パッケージはプログラムによって、セッション デバッグ マネージャー (SDM) を呼び出して、BP_REQUEST_INFO 構造体 (設定対象のブレークポイントが記述されている) をラップする IDebugBreakpointRequest2 インターフェイスを提供できます。 ブレークポイントはさまざまな形式にすることができますが、最終的にはコードまたはデータ コンテキストに解決されます。
SDM は、CreatePendingBreakpoint メソッドを呼び出すことで、関連する各 DE にこの呼び出しを渡します。 DE によってブレークポイントの処理が選択される場合、IDebugPendingBreakpoint2 インターフェイスが作成されて返されます。 SDM によって、これらのインターフェイスが収集され、1 つの IDebugPendingBreakpoint2
インターフェイスとしてデバッグ パッケージに送り返されます。
ここまで、イベントは生成されていません。
次に、デバッグ パッケージによって、Bind (DE によって実装される) が呼び出され、コードまたはデータへの保留中ブレークポイントのバインドが試行されます。
ブレークポイントがバインドされると、DE によって IDebugBreakpointBoundEvent2 イベント インターフェイスがデバッグ パッケージに送信されます。 デバッグ パッケージで、1 つ以上の IDebugBoundBreakpoint2 インターフェイスを返す EnumBoundBreakpoints を呼び出すことで、このインターフェイスが使用され、ブレークポイントにバインドされたすべてのコード コンテキスト (または 1 つのデータ コンテキスト) が列挙されます。 GetBreakpointResolution インターフェイスは IDebugBreakpointResolution2 インターフェイスを返し、GetResolutionInfo はコードまたはデータ コンテキストを含む BP_RESOLUTION_INFO 共用体を返します。
DE によってブレークポイントがバインドできない場合、1 つの IDebugBreakpointErrorEvent2 イベント インターフェイスがデバッグ パッケージに送信されます。 デバッグ パッケージによって、GetErrorBreakpoint、GetBreakpointResolution および GetResolutionInfo を続けて呼び出すことで、エラーの種類 (エラーまたは警告) と情報メッセージが取得されます。 これによって、エラーの種類とメッセージを含む BP_ERROR_RESOLUTION_INFO 構造体が返されます。
DE によってブレークポイントが処理されるがバインドできなかった場合、種類が BPET_TYPE_ERROR
のエラーが返されます。 デバッグ パッケージではエラー ダイアログ ボックスを表示してこれに応答し、IDE ではソース コード行の左側のブレークポイント グリフ内に感嘆符のグリフが表示されます。
ある DE によってブレークポイントが処理されてバインドできなかったが、別の DE でバインドされる可能性がある場合は、警告が返されます。 IDE によって、ソース コード行の左側のブレークポイント グリフ内に疑問符のグリフが表示されます。