cc682/NetRoc
http://netroc682.spaces.live.com/
调试器操作(常规)
本节包含以下主题:
控制目标
使用断点
读取和写入内存
读写寄存器和标志
查看调用堆栈
汇编模式调试
源码模式调试
调试BIOS代码
调试多个目标
结束调试会话
控制目标
调试一个用户模式的目标程序或者内核模式的目标机时,目标可以被运行或停止。
当调试器连接到内核模式的目标时,调试器会继续让目标运行,除非使用了-b 命令行选项、目标系统停止相应(即崩溃)或目标系统因为先前的内核调试行为而处于中断状态。
当调试器启动或连接到一个用户模式目标时,会立即中断目标的执行,除非使用-g 命令行选项。更多信息,查看初始断点。
运行中的目标
当目标正在运行时,大多数调试操作都不可用。
如果要停止运行中的目标,可以输入中断(Break)命令。该命令使得调试器中断到目标中。即调试器停止目标,并获得所有控制权。应用程序可能不会立即中断下来。例如,如果所有线程当前正在执行系统代码,或者在等待操作,中断会延迟到控制返回应用程序代码时发生。
如果运行中的目标发生异常、特定事件发生、遇到断点或程序正常关闭,目标会中断到调试器。 该动作停止目标并将所有控制权交给调试器。调试器命令窗口会显示一条消息来描述这个错误、事件或断点。
停止的目标
通过下面一些方法来开始或控制目标的执行:
- 使用运行(Go)命令使得程序开始运行。
- 一次单步执行一条指令,使用单步进入(Step Into) 或单步步过( Step Over )命令。如果发生函数调用,Step Into会进入函数体重并继续开始单步执行每条指令。Step Over将函数调用当作单步。当调试器运行于汇编模式时,单步操作每次执行一条指令。当调试器运行于源码模式时,单步操作一次执行一行代码。
- 结束当前函数的执行并在返回时中断,使用执行到返回(Step Out)或 or 跟踪和监视(Trace and Watch)命令。Step Out命令继续程序执行知道当前函数结束。Trace and Watch 继续执行知道当前函数结束,并显示函数调用的摘要信息。但是,必须在函数的第一条指令使用Trace and Watch 命令。在基于Itanium的处理器上跟踪到分支(Trace to Next Branch) 运行直到遇到分支指令。
- 如果有异常发生,可以使用处理异常并运行(Go with Exception Handled)和不处理异常并运行(Go with Exception Not Handled)命令来恢复执行和控制异常状态。(关于异常的更多信息,查看控制异常和事件。)
- (仅WinDbg) 如果在反汇编窗口(Disassembly window)或 源码窗口(Source window)选中一行,然后使用 运行到光标(Run to Cursor)命令,程序会一直运行直到遇到选中那一行。
- (仅User Mode) 关闭目标程序并重新开始运行它,可以使用重新开始(Restart)命令。该命令只能用于调试器创建的进程。进程重起之后,会立即中断到调试器。
- (仅WinDbg) 使用停止调试(Stop Debugging)命令关闭目标程序并清空调试器。该命令使得可以开始调试另一个目标。
命令窗体
大多数用于开始或控制目标执行的命令都以文本命令、菜单命令、工具栏按钮和快捷键方式存在。基本的文本命令可以在CDB、KD或WinDbg中使用。(文本命令一般都支持附加的选项,例如改变程序计数器的位置或执行指定数量的指令。)可以在WinDbg中使用菜单命令、工具栏按钮和快捷键。
以如下方式使用这些命令。
关于如何重起目标机的更多信息,查看崩溃和重起目标机。
命令行选项
如果要在程序启动或加载时立即停止,可以在CDB或WinDbg使用-g命令行选项。更多信息,查看初始断点。
CDB和WinDbg也支持-G 命令行选项。 该选项使得当应用程序正常结束时调试会话被结束。
下面的命令尝试从开始到结束的运行应用程序,调试器仅在发生错误时显示提示。
cdb -g -G ApplicationName
使用-pt 命令行选项来设置中断超时时间。有一些特定问题会造成目标不能和调试器通信。如果输入了某个中断命令但是调试器在这个时间到达之前未能中断目标,则调试器显示一条"Break-in timed out" 消息。
这时,调试器停止试图中断目标的行为。取而代之的是,暂停目标的执行使得可以检查(但不能控制)目标程序的状态。
默认的超时时间是30秒。