控制目标
在用户模式下调试目标应用程序或内核模式下的目标计算机时,目标可以 运行 或 停止。
当调试器连接到内核模式目标时,调试器将保持目标运行,除非使用 -b命令行选项,否则目标系统已停止响应 (即 崩溃) ,或者目标系统仍因较早的内核调试操作而停止。
调试器启动或连接到用户模式目标时,调试器会立即停止目标,除非使用 -g 命令行选项。 有关详细信息,请参阅 初始断点。
当目标正在运行时
当目标运行时,大多数调试器操作都不可用。
如果要停止正在运行的目标,可以发出 Break 命令。 此命令会导致调试器 闯入目标。 也就是说,调试器停止目标,并将所有控件都提供给调试器。 应用程序可能不会立即中断。 例如,如果所有线程当前都在执行系统代码,或者处于等待操作中,则应用程序仅在控制权返回到应用程序的代码后才会中断。
如果正在运行的目标遇到异常、发生某些 事件 、命中 断点 或应用程序正常关闭,则目标 会进入调试器。 此操作将停止目标,并将所有控制权提供给调试器。 “调试器命令”窗口中会显示一条消息,描述错误、事件或断点。
当目标停止时
若要启动或控制目标的执行,可以执行以下操作:
若要使应用程序开始运行,请发出 Go 命令。
若要一次单步执行一个指令,请使用 “单步执行” 或“ 单步执行 ”命令。 如果发生函数调用, 则单步执行进入 函数并继续单步执行每个指令。 单步执行 将函数调用视为单个步骤。 当调试器处于 程序集模式时,单步执行一次一个计算机指令。 当调试器处于 源模式时,单步执行一次一个源行。
若要完成当前函数并在返回时停止,请使用 “跳出” 或 “跟踪和监视 ”命令。 Step Out 命令会一直持续到当前函数结束。 跟踪和监视 将一直持续到当前函数结束,并显示函数调用的摘要。 但是,必须在相关函数的第一个指令上发出 Trace and Watch 命令。
如果发生异常,可以使用 Go with Exception Handled 和 Go 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 |
执行停止,调试器会中断目标。 |
调试 | 重启 |
CTRL + SHIFT + F5 |
(用户模式仅) 重启目标应用程序。 |
|
调试 | 转到 |
F5 |
目标可自由执行。 |
|
在条件断点后继续执行。 |
|||
调试 | 转到已处理的异常 |
与 g (Go) 相同,只是当前异常被视为已处理。 |
||
调试 | 转到未经处理的异常 |
与 g (Go) 相同,只是当前异常被视为未经处理。 |
||
调试 | 跳出 |
SHIFT + F11 |
目标将一直执行,直到当前函数完成。 |
|
调试 | 逐步运行 |
F10 |
Target 执行一个指令。 如果此指令是函数调用,则该函数作为单个步骤执行。 |
|
目标将执行,直到到达指定的地址。 此函数中的所有步骤都显示在 (但不) 调用函数中的步骤。 |
|||
目标将一直执行,直到下一次 调用 指令。 如果当前指令是 调用 指令,则此调用将完全执行,并一直执行到下一次 调用。 |
|||
目标将执行,直到到达 调用 指令或 返回 指令。 |
|||
目标将执行,直到到达任何类型的分支指令,包括条件或无条件分支、调用、返回和系统调用。 |
|||
目标将执行,直到到达 返回 指令。 |
|||
调试 | 跳入 |
F11 F8 |
Target 执行一个指令。 如果此指令是函数调用,则调试器将跟踪到该调用中。 |
|
目标将一直执行,直到到达指定的地址。 将显示此函数和调用函数中的所有步骤。 |
|||
(所有模式(内核模式除外),仅在基于 x86 的系统上执行) Target,直到到达下一个分支指令。 |
|||
Target 将一直执行,直到下一个 调用 指令。 如果当前指令是 调用 指令,则会跟踪该指令,直到到达新的 调用 。 |
|||
目标将执行,直到它到达 调用 指令或 返回 指令。 如果当前指令是 调用 指令或 返回 指令,则会跟踪该指令,直到到达新的 调用 或 返回 。 |
|||
目标将执行,直到它到达任何类型的分支指令,包括条件或无条件分支、调用、返回和系统调用。 如果当前指令是分支指令,则会跟踪该指令,直到到达新的分支指令。 |
|||
目标将一直执行,直到到达 返回 指令。 如果当前指令是 返回 指令,则会跟踪该指令,直到到达新的 返回 。 |
|||
Target 将一直执行,直到整个指定函数完成。 然后显示统计信息。 |
有关如何重启目标计算机的详细信息,请参阅 崩溃和重新启动目标计算机。
命令行选项
如果不希望应用程序在启动或加载时立即停止,请将 CDB 或 WinDbg 与 -g 命令行选项一起使用。 有关这种情况的详细信息,请参阅 初始断点。
CDB 和 WinDbg 还支持 -G命令行选项。 如果应用程序正确完成,此选项将导致调试会话结束。
以下命令尝试从头到尾运行应用程序,并且仅在发生错误时显示调试器提示。
cdb -g -G ApplicationName
可以使用 -pt命令行选项 设置中断超时。某些问题可能导致目标无法与调试器通信。 如果发出中断命令,并且调试器在此时间后无法中断目标,则调试器将显示“中断超时”消息。
此时,调试器停止尝试闯入目标。 相反,调试器会暂停目标,并使你能够检查 (但不能控制) 目标应用程序。
默认超时为 30 秒。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈