控制目标

在用户模式下调试目标应用程序或内核模式下的目标计算机时,目标可以 运行停止

当调试器连接到内核模式目标时,调试器将离开目标运行,除非使用 -b 命令行选项,否则目标系统已停止响应(即崩溃),或者目标系统由于早期内核调试操作而停止。

当调试器启动或连接到用户模式目标时,调试器会立即停止目标,除非使用 -g 命令行选项。 有关详细信息,请参阅 初始断点

当目标正在运行时

目标运行时,大多数调试器操作都不可用。

如果要停止正在运行的目标,可以发出 Break 命令。 此命令会导致调试器 闯入目标。 也就是说,调试器停止目标,并向调试器提供所有控件。 应用程序可能不会立即中断。 例如,如果所有线程当前都在执行系统代码,或者处于等待操作中,则应用程序仅在控制返回到应用程序代码后中断。

如果正在运行的目标遇到异常、发生某些事件、命中断点或应用程序正常关闭,则目标会中断调试器 此操作会停止目标,并向调试器提供所有控制。 “调试器命令”窗口中会显示一条消息,并描述错误、事件或断点。

目标停止时

若要启动或控制目标的执行,可以执行以下操作:

  • 若要使应用程序开始运行,请发出 Go 命令。

  • 若要一次单步执行应用程序一个指令,请使用 “单步执行 ”或 “单步执行 ”命令。 如果函数调用发生, 单步执行 将进入函数并继续单步执行每个指令。 Step Over 将函数调用视为单个步骤。 当调试器处于 程序集模式时,单步执行一次发生一台计算机指令。 当调试器处于 源模式时,单步执行一次发生一个源行。

  • 若要完成当前函数并在返回发生时停止,请使用 Step OutTrace 和 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

执行停止,调试器会进入目标。

.restart (重启目标应用程序)

调试 | 重启

CTRL + SHIFT + F5

(仅限用户模式)重启目标应用程序。

g(转到)

调试 | 转到

F5

目标可以自由执行。

gc (从条件断点进行)

在条件断点恢复执行。

gh (带异常处理的 Go)

调试 | 转到已处理的异常

g(Go)相同,但当前异常被视为已处理。

gn (未处理异常的 Go)

调试 | 转到未经处理的异常

与 g (Go) 相同,但当前异常被视为未经处理的异常。

顾 (上去)

调试 | 跳出

SHIFT + F11

目标在当前函数完成之前执行。

p(步进)

调试 | 逐步运行

F10

目标执行一个指令。 如果此指令是函数调用,该函数将作为单个步骤执行。

pa (地址步骤)

目标执行到到达指定地址为止。 将显示此函数中的所有步骤(但调用函数中的步骤不是)。

pc (下一个呼叫的步骤)

目标执行到下一 个调用 指令为止。 如果当前指令是 调用 指令,则完全执行此调用,直到下一次 调用继续执行。

pct (下一个调用或返回的步骤)

目标执行到到达 调用 指令或 返回 指令为止。

ph (下一步分支指令)

目标执行到达到任何类型的分支指令,包括条件分支或无条件分支、调用、返回和系统调用。

pt (下一步返回)

目标执行到到达 返回 指令为止。

t (跟踪)

调试 | 跳入

F11

F8

目标执行一个指令。 如果此指令是函数调用,调试器将跟踪该调用。

ta (跟踪地址)

目标执行到到达指定地址为止。 将显示此函数和调用函数中的所有步骤。

tb (跟踪到下一分支)

(所有模式(内核模式除外)仅在基于 x86 的系统上)目标执行到下一分支指令为止。

tc (跟踪到下一个调用)

目标执行到下一 个调用 指令为止。 如果当前指令是 呼叫 指令,则会跟踪该指令,直到到达新 呼叫 为止。

tct (跟踪到下一次调用或返回)

目标执行到到达 调用 指令或 返回 指令为止。 如果当前指令是 呼叫 指令或 返回 指令,则会跟踪该指令,直到到达新的 呼叫返回

th (跟踪到下一分支指令)

目标执行到达到任何类型的分支指令,包括条件分支或无条件分支、调用、返回和系统调用。 如果当前指令是分支指令,则会跟踪该指令,直到到达新的分支指令为止。

tt (跟踪到下一个返回)

目标执行到到达 返回 指令为止。 如果当前指令是 返回 指令,则会跟踪该指令,直到到达新的 返回 为止。

wt (跟踪和监视数据)

目标执行到整个指定函数完成为止。 然后显示统计信息。

有关如何重启目标计算机的详细信息,请参阅 崩溃和重新启动目标计算机

命令行选项

如果不希望应用程序在启动或加载时立即停止,请使用 CDB 或 WinDbg 和 -g 命令行选项。 有关这种情况的详细信息,请参阅 初始断点

CDB 和 WinDbg 还支持 -G 命令行选项。 如果应用程序正确完成,此选项会导致调试会话结束。

以下命令尝试从头到尾运行应用程序,并且仅当发生错误时,调试器提示才会显示。

cdb -g -G ApplicationName 

可以使用 -pt 命令行选项 设置中断超时。某些问题可能导致目标无法与调试器通信。 如果发出中断命令并且调试器在此时间后无法进入目标,则调试器将显示“中断超时”消息。

此时,调试器停止尝试闯入目标。 相反,调试器会暂停目标,并使你能够检查目标应用程序(但不控制)。

默认超时为 30 秒。