启动后附加
程序启动后,调试会话已准备好将调试引擎(DE)附加到上述程序。
设计决策
由于共享地址空间中的通信更容易,因此必须在两种设计方法之间进行选择:在调试会话和 DE 之间设置通信。 或者,设置 DE 和程序之间的通信。 在以下各项之间进行选择:
如果设置调试会话与 DE 之间的通信更有意义,则调试会话会共同创建 DE 并要求 DE 附加到程序。 此设计将调试会话和 DE 一起保留在一个地址空间中,同时将运行时环境和程序一起保留在另一个地址空间中。
如果设置 DE 与程序之间的通信更有意义,运行时环境会共同创建 DE。 此设计将 SDM 保留在一个地址空间和 DE、运行时环境和另一个地址空间中一起编程。 此设计通常是使用解释器实现以运行脚本语言的 DE。
注意
DE 如何附加到程序依赖于实现。 DE 与程序之间的通信也依赖于实现。
实现
以编程方式,当会话调试管理器 (SDM) 首先接收 表示要启动的程序的 IDebugProgram2 对象时,它会调用 Attach 方法,向其 传递 IDebugEventCallback2 对象,后者稍后用于将调试事件传递回 SDM。 然后,该方法 IDebugProgram2::Attach
调用 OnAttach 方法。 有关 SDM 如何接收 IDebugProgram2
接口的详细信息,请参阅 通知端口。
如果 DE 需要与要调试的程序在同一地址空间中运行:因为 DE 通常是运行脚本的解释器的一部分,因此该方法 IDebugProgramNodeAttach2::OnAttach
返回 S_FALSE
。 返回 S_FALSE
指示它已完成附加过程。
但是,如果 DE 在 SDM 的地址空间中运行:该方法IDebugProgramNodeAttach2::OnAttach
返回,或 IDebugProgramNodeAttach2 接口根本不在与要调试的程序关联的 IDebugProgramNode2 对象上实现。S_OK
在这种情况下, 最终会调用 Attach 方法以完成附加操作。
在后一种情况下,必须在传递给IDebugEngine2::Attach
该方法的对象上IDebugProgram2
调用 GetProgramId 方法,将本地程序对象存储GUID
到本地程序对象中,并在随后对此对象调用该方法时IDebugProgram2::GetProgramId
返回此方法GUID
。 用于 GUID
跨各种调试组件唯一标识程序。
在返回S_FALSE
方法的情况下IDebugProgramNodeAttach2::OnAttach
,GUID
将程序用于该方法,并且是IDebugProgramNodeAttach2::OnAttach
设置GUID
本地程序对象的方法。
DE 现在附加到程序,并已准备好发送任何启动事件。