附加到程序
将程序注册到相应的端口后,必须将调试器附加到要调试的程序。
选择如何附加
会话调试管理器(SDM)尝试附加到正在调试的程序有三种方法。
对于通过 LaunchSuspended 方法(例如,解释语言的典型)启动的程序,SDM 从与所附加到的程序关联的 IDebugProgramNode2 对象获取 IDebugProgramNodeAttach2 接口。 如果 SDM 可以获取
IDebugProgramNodeAttach2
接口,则 SDM 将调用 OnAttach 方法。 该方法IDebugProgramNodeAttach2::OnAttach
返回S_OK
以指示它未附加到程序,并且可以进行其他尝试以附加到程序。如果 SDM 可以从要附加到的程序获取 IDebugProgramEx2 接口,SDM 将调用 Attach 方法。 此方法适用于端口供应商远程启动的程序。
如果无法通过
IDebugProgramNodeAttach2::OnAttach
或IDebugProgramEx2::Attach
方法附加程序,则 SDM 通过调用CoCreateInstance
函数加载调试引擎(如果尚未加载),然后调用 Attach 方法。 对于端口供应商在本地启动的程序,此方法很常见。自定义端口供应商还可以在自定义端口供应商的方法实现
IDebugProgramEx2::Attach
中调用IDebugEngine2::Attach
该方法。 通常在这种情况下,自定义端口供应商会在远程计算机上启动调试引擎。当会话调试管理器 (SDM) 调用 Attach 方法时,会实现附件 。
如果在要调试的应用程序所在的同一进程中运行 DE,则必须实现以下 IDebugProgramNode2 方法:
-
IDebugEngine2::Attach
调用该方法后,请在方法的IDebugEngine2::Attach
实现中执行以下步骤:
将 IDebugEngineCreateEvent2 事件对象发送到 SDM。 有关详细信息,请参阅 发送事件。
对传递给该方法的 IDebugProgram2 对象调用 GetProgramId 方法。
IDebugEngine2::Attach
这会返回用于标识程序的一个
GUID
。GUID
该对象必须存储在表示 DE 的本地程序的对象中,并且必须在接口上IDebugProgram2
调用该方法时IDebugProgram2::GetProgramId
返回它。注意
如果实现
IDebugProgramNodeAttach2
接口,程序GUID
将IDebugProgramNodeAttach2::OnAttach
传递给该方法。 这GUID
用于方法返回IDebugProgram2::GetProgramId
的程序GUID
。发送 IDebugProgramCreateEvent2 事件对象,以通知 SDM 已创建本地
IDebugProgram2
对象以将程序表示为 DE。 有关详细信息,请参阅 发送事件。注意
这与传递到
IDebugEngine2::Attach
方法的对象不同IDebugProgram2
。 以前传递IDebugProgram2
的对象只能由端口识别,并且是一个单独的对象。