Debugging Tools for Windows |
如果拥有程序的C或C++ 源码文件,使用源码模式调试可以利用调试器更强大的功能。
但是,有时候并不能进行源码调试。可能没有程序的源代码、可能在调试其他人的代码也可能没有使用完全的.pdb 符号来构建可执行文件,另外在有源码调试的情况下也可能需要跟踪到应用程序调用到的或者用于加载应用程序的Microsoft Windows函数。
在这些情况下,都必须以汇编模式调试。此外,汇编模式拥有在源码调试下不具备的一些有用特性。调试器会在内存位置或寄存其被访问到时自动显示他们的内容,并且显示程序计数器中的地址。这些显示使得汇编模式调试成为和源码调试一起使用的很有价值的工具。
调试器首先分析二进制可执行代码。它以反汇编的形式,而不是原始格式显示代码。即调试器将机器码转换为汇编语言。
可以使用几种不同办法显示汇编代码:
反汇编的显示内容有4列:地址偏移、二进制代码、汇编语言助记符和汇编语言细节。下面是一个显示的例子。
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++源码文件一样加载汇编文件。这类调试的更多信息,查看源码模式调试。