附加到程序

将程序注册到相应的端口后,必须将调试器附加到要调试的程序。

选择如何附加

会话调试管理器(SDM)尝试附加到正在调试的程序有三种方法。

  1. 对于通过 LaunchSuspended 方法(例如,解释语言的典型)启动的程序,SDM 从与所附加到的程序关联的 IDebugProgramNode2 对象获取 IDebugProgramNodeAttach2 接口。 如果 SDM 可以获取 IDebugProgramNodeAttach2 接口,则 SDM 将调用 OnAttach 方法。 该方法 IDebugProgramNodeAttach2::OnAttach 返回 S_OK 以指示它未附加到程序,并且可以进行其他尝试以附加到程序。

  2. 如果 SDM 可以从要附加到的程序获取 IDebugProgramEx2 接口,SDM 将调用 Attach 方法。 此方法适用于端口供应商远程启动的程序。

  3. 如果无法通过 IDebugProgramNodeAttach2::OnAttachIDebugProgramEx2::Attach 方法附加程序,则 SDM 通过调用 CoCreateInstance 函数加载调试引擎(如果尚未加载),然后调用 Attach 方法。 对于端口供应商在本地启动的程序,此方法很常见。

    自定义端口供应商还可以在自定义端口供应商的方法实现IDebugProgramEx2::Attach中调用IDebugEngine2::Attach该方法。 通常在这种情况下,自定义端口供应商会在远程计算机上启动调试引擎。

    当会话调试管理器 (SDM) 调用 Attach 方法时,会实现附件

    如果在要调试的应用程序所在的同一进程中运行 DE,则必须实现以下 IDebugProgramNode2 方法

  1. IDebugEngineCreateEvent2 事件对象发送到 SDM。 有关详细信息,请参阅 发送事件

  2. 传递给该方法的 IDebugProgram2 对象调用 GetProgramId 方法。IDebugEngine2::Attach

    这会返回用于标识程序的一个 GUIDGUID该对象必须存储在表示 DE 的本地程序的对象中,并且必须在接口上IDebugProgram2调用该方法时IDebugProgram2::GetProgramId返回它。

    注意

    如果实现 IDebugProgramNodeAttach2 接口,程序 GUIDIDebugProgramNodeAttach2::OnAttach 传递给该方法。 这GUID用于方法返回IDebugProgram2::GetProgramId的程序GUID

  3. 发送 IDebugProgramCreateEvent2 事件对象,以通知 SDM 已创建本地IDebugProgram2对象以将程序表示为 DE。 有关详细信息,请参阅 发送事件

    注意

    这与传递到IDebugEngine2::Attach方法的对象不同IDebugProgram2。 以前传递 IDebugProgram2 的对象只能由端口识别,并且是一个单独的对象。