Debugging Tools for Windows |
调试一个用户模式的目标程序或者内核模式的目标机时,目标可以被运行或停止。
当调试器连接到内核模式的目标时,调试器会继续让目标运行,除非使用了-b 命令行选项、目标系统停止相应(即崩溃)或目标系统因为先前的内核调试行为而处于中断状态。
当调试器启动或连接到一个用户模式目标时,会立即中断目标的执行,除非使用-g 命令行选项。更多信息,查看初始断点。
当目标正在运行时,大多数调试操作都不可用。
如果要停止运行中的目标,可以输入中断(Break)命令。该命令使得调试器中断到目标中。即调试器停止目标,并获得所有控制权。应用程序可能不会立即中断下来。例如,如果所有线程当前正在执行系统代码,或者在等待操作,中断会延迟到控制返回应用程序代码时发生。
如果运行中的目标发生异常、特定事件发生、遇到断点或程序正常关闭,目标会中断到调试器。该动作停止目标并将所有控制权交给调试器。调试器命令窗口会显示一条消息来描述这个错误、事件或断点。
通过下面一些方法来开始或控制目标的执行:
大多数用于开始或控制目标执行的命令都以文本命令、菜单命令、工具栏按钮和快捷键方式存在。基本的文本命令可以在CDB、KD或WinDbg中使用。(文本命令一般都支持附加的选项,例如改变程序计数器的位置或执行指定数量的指令。)可以在WinDbg中使用菜单命令、工具栏按钮和快捷键。
以如下方式使用这些命令。
命令 | WinDbg按钮 | WinDbg命令 | WinDbg快捷键 | 作用 |
---|---|---|---|---|
Debug | Run to Cursor | F7 CTRL + F10 |
(仅WinDbg) 运行到光标位置。 | ||
Debug | Stop Debugging | SHIFT + F5 | 停止所有的调试并关闭目标。 | ||
(仅CDB/KD) CTRL+C | Debug | Break | CTRL + BREAK | 停止执行,调试器中断目标。 | |
.restart (Restart Target Application) | Debug | Restart | CTRL + SHIFT + F5 | (仅User mode) 重起目标程序。 | |
g (Go) | Debug | Go | F5 | 目标自由执行。 | |
gc (Go from Conditional Breakpoint) | 在一次条件断点之后恢复执行。 | |||
gh (Go with Exception Handled) | Debug | Go Handled Exception | 和g (Go)相同,但是当前异常被当作已处理。 | ||
gn (Go with Exception Not Handled) | Debug | Go Unhandled Exception | 和g (Go)相同,但是当前异常被当作未处理。 | ||
gu (Go Up) | Debug | Step Out | SHIFT + F11 | 目标运行到当前函数执行完成。 | |
p (Step) | Debug | Step Over | F10 | 目标执行一条指令。如果该指令是函数调用,则这个调用被当作一步执行。 | |
pa (Step to Address) | 目标运行直到到达指定的地址。该函数中执行的每一步都会显示出来(但是不显示被调用的函数中的内容。) | |||
pc (Step to Next Call) | 目标运行直到遇到下一个call指令。如果当前指令是call,则这个call会被完成并执行到下一个call。 | |||
pct (Step to Next Call or Return) | 目标继续执行,直到遇到一个call指令或者return指令。 | |||
ph (Step to Next Branching Instruction) | 目标执行,直到到达任何一种分支指令,包括条件和非条件分支、call调用、函数返回和系统调用。 | |||
pt (Step to Next Return) | 目标执行,直到遇到return指令。 | |||
t (Trace) | Debug | Step Into | F11 F8 |
目标执行一条指令。如果该指令是一条call,调试器跟踪到这个call中。 | |
ta (Trace to Address) | 目标执行直到指定地址。本函数和被调用函数中的每一步都会显示出来。 | |||
tb (Trace to Next Branch) | (除内核模式之外的所有模式,仅在基于x86的系统上) 目标运行到下一条分支指令。 | |||
tc (Trace to Next Call) | 目标运行到下一条call指令。如果当前指令是call,该命令会跟踪进去直到遇到另一条call。 | |||
tct (Trace to Next Call or Return) | 目标运行到下一条call指令或return指令。如果当前指令是call或return,命令会跟踪进去知道遇到另一个call或return。 | |||
th (Trace to Next Branching Instruction) | 目标执行直到遇到任意类型的分支指令,包括条件和非条件跳转、call、return和系统调用。如果当前指令是分支指令,该命令跟踪进入直到遇到下一个分支指令。 | |||
tt (Trace to Next Return) | 目标运行直到遇到return指令。如果当前指令是一条return,则跟踪进入直到另外一条return。 | |||
wt (Trace and Watch Data) | 目标执行,直到指定的函数执行完成。这时会显示统计信息。 |
关于如何重起目标机的更多信息,查看崩溃和重起目标机。
如果要在程序启动或加载时立即停止,可以在CDB或WinDbg使用-g命令行选项。更多信息,查看初始断点。
CDB和WinDbg也支持-G 命令行选项。 该选项使得当应用程序正常结束时调试会话被结束。
下面的命令尝试从开始到结束的运行应用程序,调试器仅在发生错误时显示提示。
使用-pt 命令行选项来设置中断超时时间。有一些特定问题会造成目标不能和调试器通信。如果输入了某个中断命令但是调试器在这个时间到达之前未能中断目标,则调试器显示一条"Break-in timed out" 消息。
这时,调试器停止试图中断目标的行为。取而代之的是,暂停目标的执行使得可以检查(但不能控制)目标程序的状态。
默认的超时时间是30秒。