控制目标
在用户模式下调试目标应用程序或内核模式下的目标计算机时,目标可以 运行 或 停止。
当调试器连接到内核模式目标时,调试器将离开目标运行,除非使用 -b 命令行选项,否则目标系统已停止响应(即崩溃),或者目标系统由于早期内核调试操作而停止。
当调试器启动或连接到用户模式目标时,调试器会立即停止目标,除非使用 -g 命令行选项。 有关详细信息,请参阅 初始断点。
当目标正在运行时
目标运行时,大多数调试器操作都不可用。
如果要停止正在运行的目标,可以发出 Break 命令。 此命令会导致调试器 闯入目标。 也就是说,调试器停止目标,并向调试器提供所有控件。 应用程序可能不会立即中断。 例如,如果所有线程当前都在执行系统代码,或者处于等待操作中,则应用程序仅在控制返回到应用程序代码后中断。
如果正在运行的目标遇到异常、发生某些事件、命中断点或应用程序正常关闭,则目标会中断调试器。 此操作会停止目标,并向调试器提供所有控制。 “调试器命令”窗口中会显示一条消息,并描述错误、事件或断点。
目标停止时
若要启动或控制目标的执行,可以执行以下操作:
若要使应用程序开始运行,请发出 Go 命令。
若要一次单步执行应用程序一个指令,请使用 “单步执行 ”或 “单步执行 ”命令。 如果函数调用发生, 单步执行 将进入函数并继续单步执行每个指令。 Step Over 将函数调用视为单个步骤。 当调试器处于 程序集模式时,单步执行一次发生一台计算机指令。 当调试器处于 源模式时,单步执行一次发生一个源行。
若要完成当前函数并在返回发生时停止,请使用 Step Out 或 Trace 和 Watch 命令。 Step Out 命令将一直持续到当前函数结束。 跟踪和监视 将一直持续到当前函数结束,并显示函数调用的摘要。 但是,必须在相关函数的第一个指令上发出 Trace 和 Watch 命令。
如果发生异常,可以使用 Go 和异常处理和 Go 和“未处理异常”命令恢复执行并控制异常的状态。 (有关异常的详细信息,请参阅 控制异常和事件。
(仅限 WinDbg)如果在反汇编窗口或源窗口中选择一行,然后使用“运行到光标”命令,程序将运行,直到遇到所选行。
(仅限用户模式)若要关闭目标应用程序并从头开始重启它,请使用 “重启” 命令。 只能对调试器创建的进程使用此命令。 重启进程后,它会立即中断调试器。
(仅限 WinDbg)若要关闭目标应用程序并清除调试器,请使用 “停止调试” 命令。 此命令使你能够开始调试其他目标。
命令窗体
用于启动或控制目标执行的大多数命令都以文本命令、菜单命令、工具栏按钮和快捷键的形式存在。 作为基本文本命令,可以在 CDB、KD 或 WinDbg 中使用这些命令。 (命令的文本形式经常支持其他选项,例如更改程序计数器的位置或执行固定数量的指令。可以在 WinDbg 中使用菜单命令、工具栏按钮和快捷键。
可以使用以下窗体中的命令。
命令 | WinDbg 命令 | WinDbg 快捷键 | 效果 |
---|---|---|---|
调试 | 运行到光标处 |
F7 CTRL + F10 |
(仅限 WinDbg)执行,直到它到达光标标记的行。 |
|
调试 | 停止调试 |
SHIFT + F5 |
停止所有调试并关闭目标。 |
|
(仅限 CDB/KD) Ctrl+C |
调试 | 中断 |
CTRL + BREAK |
执行停止,调试器会进入目标。 |
调试 | 重启 |
CTRL + SHIFT + F5 |
(仅限用户模式)重启目标应用程序。 |
|
调试 | 转到 |
F5 |
目标可以自由执行。 |
|
在条件断点后恢复执行。 |
|||
调试 | 转到已处理的异常 |
与 g(Go)相同,但当前异常被视为已处理。 |
||
调试 | 转到未经处理的异常 |
与 g (Go) 相同,但当前异常被视为未经处理的异常。 |
||
调试 | 跳出 |
SHIFT + F11 |
目标在当前函数完成之前执行。 |
|
调试 | 逐步运行 |
F10 |
目标执行一个指令。 如果此指令是函数调用,该函数将作为单个步骤执行。 |
|
目标执行到到达指定地址为止。 将显示此函数中的所有步骤(但调用函数中的步骤不是)。 |
|||
目标执行到下一 个调用 指令为止。 如果当前指令是 调用 指令,则完全执行此调用,直到下一次 调用继续执行。 |
|||
目标执行到到达 调用 指令或 返回 指令为止。 |
|||
目标执行到达到任何类型的分支指令,包括条件分支或无条件分支、调用、返回和系统调用。 |
|||
目标执行到到达 返回 指令为止。 |
|||
调试 | 跳入 |
F11 F8 |
目标执行一个指令。 如果此指令是函数调用,调试器将跟踪该调用。 |
|
目标执行到到达指定地址为止。 将显示此函数和调用函数中的所有步骤。 |
|||
(所有模式(内核模式除外)仅在基于 x86 的系统上)目标执行到下一分支指令为止。 |
|||
目标执行到下一 个调用 指令为止。 如果当前指令是 呼叫 指令,则会跟踪该指令,直到到达新 呼叫 为止。 |
|||
目标执行到到达 调用 指令或 返回 指令为止。 如果当前指令是 呼叫 指令或 返回 指令,则会跟踪该指令,直到到达新的 呼叫 或 返回 。 |
|||
目标执行到达到任何类型的分支指令,包括条件分支或无条件分支、调用、返回和系统调用。 如果当前指令是分支指令,则会跟踪该指令,直到到达新的分支指令为止。 |
|||
目标执行到到达 返回 指令为止。 如果当前指令是 返回 指令,则会跟踪该指令,直到到达新的 返回 为止。 |
|||
目标执行到整个指定函数完成为止。 然后显示统计信息。 |
有关如何重启目标计算机的详细信息,请参阅 崩溃和重新启动目标计算机。
命令行选项
如果不希望应用程序在启动或加载时立即停止,请使用 CDB 或 WinDbg 和 -g 命令行选项。 有关这种情况的详细信息,请参阅 初始断点。
CDB 和 WinDbg 还支持 -G 命令行选项。 如果应用程序正确完成,此选项会导致调试会话结束。
以下命令尝试从头到尾运行应用程序,并且仅当发生错误时,调试器提示才会显示。
cdb -g -G ApplicationName
可以使用 -pt 命令行选项 设置中断超时。某些问题可能导致目标无法与调试器通信。 如果发出中断命令并且调试器在此时间后无法进入目标,则调试器将显示“中断超时”消息。
此时,调试器停止尝试闯入目标。 相反,调试器会暂停目标,并使你能够检查目标应用程序(但不控制)。
默认超时为 30 秒。