次の方法で共有


プログラムにアタッチする

プログラムを適切なポートに登録した後で、デバッグ対象のプログラムにデバッガーをアタッチする必要があります。

アタッチ方法を選択する

セッション デバッグ マネージャー (SDM) がデバッグ対象のプログラムへのアタッチを試行する方法は 3 つあります。

  1. LaunchSuspended メソッドを使用してデバッグ エンジンによって起動されるプログラムの場合 (典型的なインタープリター言語など)、SDM は、アタッチ対象のプログラムに関連付けられている IDebugProgramNode2 オブジェクトから IDebugProgramNodeAttach2 インターフェイスを取得します。 SDM が IDebugProgramNodeAttach2 インターフェイスを取得できる場合、SDM は次に OnAttach メソッドを呼び出します。 IDebugProgramNodeAttach2::OnAttach メソッドは S_OK を返して、プログラムにアタッチしなかったことと、プログラムにアタッチするために他の方法を試行できることを示します。

  2. SDM がアタッチ対象のプログラムから IDebugProgramEx2 インターフェイスを取得できる場合、SDM は Attach メソッドを呼び出します。 この方法は、ポート サプライヤーによってリモートで起動されたプログラムの場合に一般的です。

  3. IDebugProgramNodeAttach2::OnAttach または IDebugProgramEx2::Attach メソッドを使用してプログラムにアタッチできない場合、SDM は CoCreateInstance 関数を呼び出してデバッグ エンジンを読み込み (まだ読み込まれていない場合)、その後、Attach メソッドを呼び出します。 この方法は、ポート サプライヤーによってローカルに起動されたプログラムの場合に一般的です。

    また、カスタム ポート サプライヤーが、カスタム ポート サプライヤーの IDebugProgramEx2::Attach メソッドの実装において、IDebugEngine2::Attach メソッドを呼び出すこともできます。 このケースでは通常、カスタム ポート サプライヤーは、リモート マシン上でデバッグ エンジンを起動します。

    アタッチが実行されるのは、セッション デバッグ マネージャー (SDM) が Attach メソッドを呼び出すときです。

    デバッグ対象のアプリケーションと同じプロセスで DE を実行する場合は、IDebugProgramNode2 の次のメソッドを実装する必要があります。

  • GetHostName

  • GetHostPid

  • GetProgramName

    IDebugEngine2::Attach メソッドが呼び出されたら、IDebugEngine2::Attach メソッドの実装で次の手順を実行します。

  1. IDebugEngineCreateEvent2 イベント オブジェクトを SDM に送信します。 詳細については、「イベントの送信」を参照してください。

  2. IDebugEngine2::Attach メソッドに渡された IDebugProgram2 オブジェクトに対して、GetProgramId メソッドを呼び出します。

    これによって、プログラムの識別に使用される GUID が返されます。 GUID は、DE に対してローカル プログラムを表すオブジェクトに格納される必要があります。また、IDebugProgram2::GetProgramId メソッドが IDebugProgram2 インターフェイスで呼び出されたときに返される必要があります。

    Note

    IDebugProgramNodeAttach2 インターフェイスを実装すると、プログラムの GUIDIDebugProgramNodeAttach2::OnAttach メソッドに渡されます。 この GUID は、IDebugProgram2::GetProgramId メソッドから返されるプログラムの GUID で使用されます。

  3. IDebugProgramCreateEvent2 イベント オブジェクトを送信して、DE に対してプログラムを表すローカルの IDebugProgram2オブジェクトが作成されたことを SDM に通知します。 詳細については、「イベントの送信」を参照してください。

    Note

    これは、IDebugEngine2::Attach メソッドに渡されたのと同じ IDebugProgram2 オブジェクトではありません。 以前渡された IDebugProgram2 オブジェクトはポートでのみ認識される別のオブジェクトです。