控制目标

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

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

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

当目标正在运行时

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

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

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

当目标停止时

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

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

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

  • 若要完成当前函数并在返回时停止,请使用 “跳出”“跟踪和监视 ”命令。 Step Out 命令会一直持续到当前函数结束。 跟踪和监视 将一直持续到当前函数结束,并显示函数调用的摘要。 但是,必须在相关函数的第一个指令上发出 Trace and Watch 命令。

  • 如果发生异常,可以使用 Go with Exception HandledGo with Exception Not Handled 命令继续执行和控制异常的状态。 (有关异常的详细信息,请参阅 控制异常和事件。)

  • (WinDbg 仅) 如果在 反汇编窗口源窗口中 选择一行,然后使用 Run to Cursor 命令,程序将运行,直到遇到所选行。

  • (用户模式仅) 若要关闭目标应用程序并从头开始重启它,请使用 “重启” 命令。 只能将此命令用于调试器创建的进程。 重启进程后,它会立即中断到调试器中。

  • (WinDbg 仅) 若要关闭目标应用程序并清除调试器,请使用 “停止调试” 命令。 使用此命令可以开始调试其他目标。

命令窗体

大多数用于启动或控制目标执行的命令都以文本命令、菜单命令、工具栏按钮和快捷键的形式存在。 作为基本文本命令,可以在 CDB、KD 或 WinDbg 中使用这些命令。 (命令的文本形式通常支持其他选项,例如更改程序计数器的位置或执行固定数量的指令。) 可以使用 WinDbg 中的菜单命令、工具栏按钮和快捷键。

可以在以下窗体中使用这些命令。

命令 WinDbg 命令 WinDbg 快捷键 效果

调试 | 运行到光标处

F7

CTRL + F10

(WinDbg 仅) 执行,直到到达光标标记的行。

调试 | 停止调试

SHIFT + F5

停止所有调试并关闭目标。

仅) CTRL+C (CDB/KD

调试 | 中断

CTRL + BREAK

执行停止,调试器会中断目标。

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

调试 | 重启

CTRL + SHIFT + F5

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

g(转到)

调试 | 转到

F5

目标可自由执行。

gc(从条件断点继续)

在条件断点后继续执行。

gh(转到已处理的异常)

调试 | 转到已处理的异常

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

gn (Go,但未处理异常)

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

g (Go) 相同,只是当前异常被视为未经处理。

gu(向上)

调试 | 跳出

SHIFT + F11

目标将一直执行,直到当前函数完成。

p(步进)

调试 | 逐步运行

F10

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

pa(步进到地址)

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

pc(步进到下一个调用)

目标将一直执行,直到下一次 调用 指令。 如果当前指令是 调用 指令,则此调用将完全执行,并一直执行到下一次 调用

pct(步进到下一个 Call 或 Return)

目标将执行,直到到达 调用 指令或 返回 指令。

ph(步进到下一个分支指令)

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

pt(步进到下一个 Return)

目标将执行,直到到达 返回 指令。

t(跟踪)

调试 | 跳入

F11

F8

Target 执行一个指令。 如果此指令是函数调用,则调试器将跟踪到该调用中。

ta(跟踪到地址)

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

tb(跟踪到下一个分支)

(所有模式(内核模式除外),仅在基于 x86 的系统上执行) Target,直到到达下一个分支指令。

tc(跟踪到下一个调用)

Target 将一直执行,直到下一个 调用 指令。 如果当前指令是 调用 指令,则会跟踪该指令,直到到达新的 调用

tct(跟踪到下一个 Call 或 Return)

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

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

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

tt(跟踪到下一个 Return)

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

wt(跟踪和监视数据)

Target 将一直执行,直到整个指定函数完成。 然后显示统计信息。

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

命令行选项

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

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

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

cdb -g -G ApplicationName 

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

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

默认超时为 30 秒。