控制执行
适用范围:Visual Studio
Visual Studio for Mac
Visual Studio Code
调试引擎 (DE) 通常会将以下事件之一作为最后一个启动事件发送:
入口点事件(如果附加到新启动的程序)
加载完成事件(如果附加到已在运行的程序)
这两个事件都是停止事件,这意味着 DE 通过 IDE 等待用户的响应。 有关详细信息,请参阅 操作模式。
停止事件
将停止事件发送到调试会话时:
可以从事件接口获取包含当前指令指针的程序和线程。
IDE 确定当前源代码文件和位置,在编辑器中突出显示显示。
调试会话通常通过调用程序的 Continue 方法响应第一个停止事件。
然后,程序将运行,直到遇到停止条件,例如命中断点。 在这种情况下,DE 会将断点事件发送到调试会话。 断点事件是一个停止事件,DE 再次等待用户响应。
如果用户选择单步执行、跳过或退出某个函数,IDE 会提示调试会话调用程序
Step
的方法。 然后,IDE 将步骤单元 (指令、语句或行) 传递,步骤类型 (是单步执行还是单步执行函数) 。 步骤完成后,DE 会将步骤完成事件发送到调试会话,该会话是一个停止事件。-或-
如果用户选择继续从当前指令指针执行,IDE 会提示调试会话调用程序的 Execute 方法。 程序会继续执行,直到遇到下一个停止条件。
-或-
如果调试会话要忽略特定的停止事件,则调试会话将调用程序的 Continue 方法。 如果程序在遇到停止条件时单步执行、翻转或退出函数,则继续执行该步骤。
以编程方式,当 DE 遇到停止条件时,它会通过 IDebugEventCallback2 接口将 IDebugLoadCompleteEvent2 或 IDebugEntryPointEvent2 等停止事件发送到会话调试管理器 (SDM) 。 DE 传递表示程序和包含当前指令指针的线程的 IDebugProgram2 和 IDebugThread2 接口。 SDM 调用 IDebugThread2::EnumFrameInfo 以获取顶部堆栈帧,并调用 IDebugStackFrame2::GetDocumentContext 以获取与当前指令指针关联的文档上下文。 此文档上下文通常是源代码文件名、行和列号。 IDE 使用这些代码来突出显示包含当前指令指针的源代码。
SDM 通常通过调用 IDebugProgram2::Continue 来响应此第一个停止事件。 然后,程序将运行,直到遇到停止条件(例如命中断点),在这种情况下,DE 会向 SDM 发送 IDebugBreakpointEvent2 接口 。 断点事件是一个停止事件,DE 再次等待用户响应。
如果用户选择单步执行或单步执行函数,IDE 将提示 SDM 调用 IDebugProgram2::Step。 然后,IDE 将 STEPUNIT (指令、语句或行) 和 STEPKIND 传递,即是单步执行、单步执行还是单步执行函数。 步骤完成后,DE 会将 IDebugStepCompleteEvent2 接口发送到 SDM,SDM 是一个正在停止的事件。
如果用户选择继续从当前指令指针执行,IDE 会要求 SDM 调用 IDebugProgram2::Execute。 程序会继续执行,直到遇到下一个停止条件。
如果调试包要忽略特定的停止事件,则调试包将调用调用 IDebugProgram2::Continue 的 SDM。 如果程序在遇到停止条件时单步执行、跳过或退出函数,则它将继续执行该步骤。 这意味着程序会保持一个单步执行状态,以便它知道如何继续。
SDM 对
Step
、 Execute 和 Continue 的调用是异步的,这意味着 SDM 希望快速返回调用。 如果在 、Execute 或 Continue 返回之前Step
,DE 在同一线程上向 SDM 发送停止事件,则 SDM 将停止响应。