启动后附加

程序启动后,调试会话已准备好将调试引擎(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::OnAttachGUID将程序用于该方法,并且是IDebugProgramNodeAttach2::OnAttach设置GUID本地程序对象的方法。

DE 现在附加到程序,并已准备好发送任何启动事件。