启动程序

想要调试程序的用户可以按 F5 从 IDE 运行调试器。 这会开始一系列事件,最终导致 IDE 连接到调试引擎 (DE),后者又连接或附加到程序,如下所示:

  1. IDE 首先调用项目包,以获取解决方案的活动项目调试设置。 设置包括起始目录、环境变量、程序将在其中运行的端口,以及用于创建程序的 DE(如果指定)。 这些设置将传递到调试包。

  2. 如果指定了 DE,DE 会调用操作系统来启动程序。 启动程序后,将会加载程序的运行时环境。 例如,如果程序是用 MSIL 编写的,则会调用公共语言运行时,以运行程序。

    -或-

    如果未指定 DE,端口将调用操作系统来启动程序,从而加载程序的运行时环境。

    注意

    如果 DE 用于启动程序,很可能将同一 DE 附加到该程序。

  3. 根据 DE 还是端口启动程序,随后 DE 或运行时环境会创建程序说明或节点,并通知端口程序正在运行中。

    注意

    建议运行时环境创建程序节点,因为程序节点是可调试程序的轻型表示形式。 无需加载整个 DE 即可创建并注册程序节点。 如果 DE 设计为在 IDE 过程中运行,但实际上没有 IDE 正在运行,则需要有一个组件可将程序节点添加到端口。

    新创建的程序,连同从同一 IDE 启动或附加的任何其他相关或无关的程序一起组成调试会话。

    从编程的角度来看,当用户首次按 F5 时,Visual Studio 的调试包会通过 DebugLaunch 方法调用项目包(与正在启动的程序类型相关联),从而使用解决方案的活动项目调试设置填充 VsDebugTargetInfo2 结构。 此结构会通过调用 LaunchDebugTargets2 方法传回调试包。 然后,调试包实例化会话调试管理器 (SDM),由此启动正在调试的程序以及任何关联的调试引擎。

    传递给 SDM 的参数之一是用于启动程序的 DE 的 GUID。

    如果 DE GUID 不是 GUID_NULL,SDM 会共同创建 DE,再调用其 LaunchSuspended 方法来启动程序。 例如,如果程序是使用本机代码编写的,IDebugEngineLaunch2::LaunchSuspended 可能会调用 CreateProcessResumeThread(Win32 函数)来运行程序。

    启动程序后,将会加载程序的运行时环境。 然后,DE 或运行时环境会创建 IDebugProgramNode2 接口来描述该程序,并将此接口传递给 AddProgramNode,以通知端口该程序正在运行。

    如果 GUID_NULL 已传递,则端口将启动程序。 程序运行后,运行时环境会创建一个 IDebugProgramNode2 接口,以描述程序并将其传递给 IDebugPortNotify2::AddProgramNode。 这会通知端口该程序正在运行。 然后,SDM 会将调试引擎附加到正在运行的程序。

本节内容

通知端口说明启动程序并通知端口后会发生什么情况。

在启动之后附加记录了调试会话准备好将 DE 附加到程序的时间。

  • 调试任务包含各种调试任务的链接,如启动程序和计算表达式。