程序启动后,调试会话已准备好将调试引擎(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_FALSE,GUID 被传递给该方法以供程序使用,并且设置本地程序对象的 GUID 的是 IDebugProgramNodeAttach2::OnAttach 方法。
DE 现已附加到程序,并可以随时发送启动事件。