启动后附加

程序启动后,调试会话已准备好将调试引擎(DE)附加到上述程序。

设计决策

由于共享地址空间中的通信更容易,因此必须在两种设计方法之间进行选择:在调试会话和 DE 之间设置通信。 或者,设置 DE 和程序之间的通信。 在以下各项之间进行选择:

  • 如果设置调试会话与 DE 之间的通信更合理,则调试会话会协同创建 DE 并要求 DE 附加到程序。 此设计将调试会话和 DE 一起保留在一个地址空间中,同时将运行时环境和程序一起保留在另一个地址空间中。

  • 如果将 DE 与程序之间的通信设立得更合理,运行时环境将协作创建 DE。 此设计将 SDM 保留在一个地址空间中,而将 DE、运行时环境和程序放在另一个地址空间中。 此设计通常是使用解释器实现以运行脚本语言的 DE。

    注释

    DE 如何附加到程序依赖于实现。 DE 与程序之间的通信也依赖于实现。

Implementation

以编程方式,当会话调试管理器 (SDM) 首先接收表示要启动的程序的 IDebugProgram2 对象时,它会调用 Attach 方法,向其传递 IDebugEventCallback2 对象,后者稍后用于将调试事件传递回 SDM。 然后,该方法 IDebugProgram2::Attach 调用 OnAttach 方法。 有关 SDM 如何接收 IDebugProgram2 接口的详细信息,请参阅 通知端口

如果 DE 需要与要调试的程序在同一地址空间中运行:因为 DE 通常是运行脚本的解释器的一部分,因此该方法 IDebugProgramNodeAttach2::OnAttach 返回 S_FALSE。 返回 S_FALSE 指示它已完成附加过程。

但是,如果 DE 在 SDM 的地址空间中运行:该方法 IDebugProgramNodeAttach2::OnAttach 返回 S_OK,或 IDebugProgramNodeAttach2 接口根本不在与要调试的程序关联的 IDebugProgramNode2 对象上实现。 在这种情况下,最终会调用 Attach 方法以完成附加作。

在后一种情况下,必须对传递给IDebugEngine2::Attach方法的IDebugProgram2对象调用GetProgramId方法,将GUID存储到本地程序对象中,并在随后调用此对象上的IDebugProgram2::GetProgramId方法时返回此GUID。 该 GUID 用于在各种调试组件中唯一标识程序。

如果 IDebugProgramNodeAttach2::OnAttach 方法返回 S_FALSEGUID 被传递给该方法以供程序使用,并且设置本地程序对象的 GUID 的是 IDebugProgramNodeAttach2::OnAttach 方法。

DE 现已附加到程序,并可以随时发送启动事件。