全部博文(30)
分类: 系统运维
2008-11-04 21:30:03
调试一个用户模式的目标程序或者内核模式的目标机时,目标可以被运行或停止。
当调试器连接到内核模式的目标时,调试器会继续让目标运行,除非使用了-b 、目标系统停止相应(即崩溃)或目标系统因为先前的内核调试行为而处于中断状态。
当调试器启动或连接到一个用户模式目标时,会立即中断目标的执行,除非使用-g 命令行选项。更多信息,查看。
当目标正在运行时,大多数调试操作都不可用。
如果要停止运行中的目标,可以输入中断(Break)命令。该命令使得调试器中断到目标中。即调试器停止目标,并获得所有控制权。应用程序可能不会立即中断下来。例如,如果所有线程当前正在执行系统代码,或者在等待操作,中断会延迟到控制返回应用程序代码时发生。
如果运行中的目标发生异常、特定发生、遇到或程序正常关闭,目标会中断到调试器。 该动作停止目标并将所有控制权交给调试器。会显示一条消息来描述这个错误、事件或断点。
通过下面一些方法来开始或控制目标的执行:
大多数用于开始或控制目标执行的命令都以文本命令、菜单命令、工具栏按钮和快捷键方式存在。基本的文本命令可以在CDB、KD或WinDbg中使用。(文本命令一般都支持附加的选项,例如改变程序计数器的位置或执行指定数量的指令。)可以在WinDbg中使用菜单命令、工具栏按钮和快捷键。
以如下方式使用这些命令。
命令 |
WinDbg按钮 |
WinDbg命令 |
WinDbg快捷键 |
作用 |
|
|
F7 |
(仅WinDbg) 运行到光标位置。 | |
|
|
SHIFT + F5 |
停止所有的调试并关闭目标。 | |
(仅CDB/KD) |
|
|
CTRL + BREAK |
停止执行,调试器中断目标。 |
|
|
|
CTRL + SHIFT + F5 |
(仅User mode) 重起目标程序 |
|
|
|
F5 |
目标自由执行。 |
|
在一次之后恢复执行。 | |||
|
|
和g (Go)相同,但是当前异常被当作已处理。 | ||
|
|
和g (Go)相同,但是当前异常被当作未处理。 | ||
|
|
|
目标运行到当前函数执行完成。 | |
|
|
|
目标执行一条指令。如果该指令是函数调用,则这个调用被当作一步执行。 | |
|
目标运行直到到达指定的地址。该函数中执行的每一步都会显示出来(但是不显示被调用的函数中的内容。) | |||
|
目标运行直到遇到下一个call指令。如果当前指令是call,则这个call会被完成并执行到下一个call。 | |||
|
目标继续执行,直到遇到一个call指令或者return指令。 | |||
|
目标执行,直到到达任何一种分支指令,包括条件和非条件分支、call调用、函数返回和系统调用。 | |||
|
目标执行,直到遇到return指令。 | |||
|
|
|
F11 |
目标执行一条指令。如果该指令是一条call,调试器跟踪到这个call中。 |
|
目标执行直到指定地址。本函数和被调用函数中的每一步都会显示出来。 | |||
|
(除内核模式之外的所有模式,仅在基于x86的系统上) 目标运行到下一条分支指令。 | |||
|
目标运行到下一条call指令。如果当前指令是call,该命令会跟踪进去直到遇到另一条call。 | |||
|
目标运行到下一条call指令或return指令。如果当前指令是call或return,命令会跟踪进去知道遇到另一个call或return。 | |||
|
目标执行直到遇到任意类型的分支指令,包括条件和非条件跳转、call、return和系统调用。如果当前指令是分支指令,该命令跟踪进入直到遇到下一个分支指令。 | |||
|
目标运行直到遇到return指令。如果当前指令是一条return,则跟踪进入直到另外一条return。 | |||
|
目标执行,直到指定的函数执行完成。这时会显示统计信息。 |
关于如何重起目标机的更多信息,查看。
如果要在程序启动或加载时立即停止,可以在CDB或WinDbg使用-g命令行选项。更多信息,查看。
CDB和WinDbg也支持-G 。 该选项使得当应用程序正常结束时调试会话被结束。
下面的命令尝试从开始到结束的运行应用程序,调试器仅在发生错误时显示提示。
cdb -g -G ApplicationName
使用-pt 来设置中断超时时间。有一些特定问题会造成目标不能和调试器通信。如果输入了某个中断命令但是调试器在这个时间到达之前未能中断目标,则调试器显示一条"Break-in timed out" 消息。
这时,调试器停止试图中断目标的行为。取而代之的是,暂停目标的执行使得可以检查(但不能控制)目标程序的状态。
默认的超时时间是30秒。