cc682/NetRoc
http://netroc682.spaces.live.com/
读写寄存器和标志
寄存器是CPU中的一些小的挥发性存储空间。一些寄存器被定义作为特定用途,另一些寄存器可以被用户模式程序使用。
基于x86和Itanium的处理器有不同的寄存器集合。关于每种处理器寄存器的更多信息,查看处理器体系结构。
使用如下方法之一来操作CPU寄存器:
寄存器也在每次目标停止下来时自动显示。如果使用p (Step) 或t (Trace) 命令来单步执行程序,每一步执行之后都可以看到寄存器的值。要停止这样的显示,可以在使用这些命令时加上r选项。
在基于x86的处理器上,r选项也用于控制一些例如flags这样的位寄存器。要修改这些标志,和修改其他规则寄存器有少许不同。关于这些标志和语法的更多信息,查看x86 标志寄存器。
查看调用堆栈
调用堆栈(call stack)是到达当前程序计数器位置的函数调用序列。调用堆栈顶部的函数是当前函数,下一个函数是调用当前函数的函数,等等。
当某个函数调用另外一个函数时,调用堆栈也保存了一些信息。这些信息不同的处理器上不同,但是一般它们包含下面这些部分:
- 被调用函数的名字或位置。
- 返回地址。(一般是紧跟着调用本函数的那条指令的下一条指令。)
- 传递给函数的参数。
- 堆栈帧的基指针。
使用下面一些方法显示调用堆栈:
如果在函数刚开始时显示调用堆栈(在函数的代码开始执行之前),可能会看到错误的结果。调试器使用帧指针寄存器来进行回溯,但是当函数代码开始执行前,该寄存器并没有被设置。
如果没有修改寄存器上下文,被显示的调用堆栈基于当前程序计数器。关于如何修改寄存器上下文的更多信息,查看修改上下文。
有很多原因都会造成调用堆栈回溯上的困难。关于这些原因的更多信息,查看堆栈回溯。
汇编模式的调试
如果拥有程序的C或C++ 源码文件,使用源码模式的调试可以利用调试器更强大的功能。
但是,有时候并不能进行源码调试。可能没有程序的源代码、可能在调试其他人的代码也可能没有使用完全的.pdb 符号来构建可执行文件,另外在有源码调试的情况下也可能需要跟踪到应用程序调用到的或者用于加载应用程序的Microsoft Windows函数。
在这些情况下,都必须以汇编模式调试。此外,汇编模式拥有在源码调试下不具备的一些有用特性。调试器会在内存位置或寄存其被访问到时自动显示他们的内容,并且显示程序计数器中的地址。这些显示使得汇编模式调试成为和源码调试一起使用的很有价值的工具。
反汇编代码
调试器首先分析二进制可执行代码。它以反汇编的形式,而不是原始格式显示代码。即调试器将机器码转换为汇编语言。
可以使用几种不同办法显示汇编代码:
- u (Unassemble) 命令反汇编并显示一段机器码。
- uf (Unassemble Function) 命令反汇编并显示一个函数。
- (仅WinDbg)
反汇编窗口反汇编并显示指定节的机器码。如果在Window 菜单中选择了Automatically Open Disassembly ,该窗口会自动激活。也可以通过点击View 菜单的Disassembly 、按下ALT+7或点击工具栏上的Disassembly (Alt+7) 按钮()。
反汇编的显示内容有4列:地址偏移、二进制代码、汇编语言助记符和汇编语言细节。下面是一个显示的例子。
0040116b 45 inc ebp
0040116c fc cld
0040116d 8945b0 mov eax,[ebp-0x1c]
在一行的右边,根据当前程序计数器的值,可能会显示将被访问的内存位置或寄存器的值。如果某行包含分支指令,会出现[br=1] 或[br=0]的提示。该提示表明了分支是否会实现。
使用.asm (Change Disassembly Options)命令来修改反汇编指令如何被显示。
在WinDbg反汇编窗口中,当前程序计数器所在的行会被用绿色高亮。设置了断点的行以红色 (启用的断点)、黄色(禁用的断点)或紫色(当前程序计数器位置是一个断点)。
也可以用下面的命令来操纵汇编代码:
汇编模式和源码模式
调试器有两个不同的操作模式:汇编模式和源码模式。
当对程序进行单步执行时,根据不同的模式,每一步执行的大小可以是一行汇编代码或一行源代码。
不同模式下,一些命令的显示输出也不相同。
WinDbg中, 在汇编模式下单步执行或运行程序时反汇编窗口自动切换到前台。在源码模式下, 源码窗口会切换到前台。
使用下面的方法之一来设置模式:
WinDbg中在汇编模式下,状态栏中会显示ASM。
WinDbg反汇编窗口的快捷菜单中有一项Highlight instructions from the current source line 命令。 该命令可以将当前源码行对应的所有汇编指令高亮。一般来说,单个源码行对应多个汇编指令。如果代码经过优化,这些汇编指令可能并不连贯。Highlight instructions from the current source line 命令用于找到当前代码行所生成的所有汇编指令。
汇编语言源文件
如果程序是用汇编语言编写的,调试器生成的反汇编可能和原始代码并不完全相同。特别是不存在NO-OPs(what?)和注释。
如果想用原始的.asm文件来调试,必须使用源码模式。可以像C或C++源码文件一样加载汇编文件。这类调试的更多信息,查看源码模式调试。