2023年1月

在WinDbg中,可以通过输入命令(u, ub, uu (Unassemble))或使用反汇编窗口查看程序汇编代码。

如何打开 DissAssembly Code窗口

  • 通过菜单View-->Disassembly
  • 快捷键Alt+7
  • 工具栏按钮

DissAssembly窗口

通过上面的方式打开的窗口如下

 

 

调试器获取一段内存,将其解释为二进制机器指令,然后将其反汇编以生成机器指令的汇编语言版本。生成的代码将显示在“反汇编”窗口中。

在“反汇编”窗口中,可以执行以下操作:

  • 若要反汇编内存的不同部分,请在“偏移量”框中键入要反汇编的内存的地址。(键入地址后可以按回车键,但不必如此。)
  • 要查看内存的其他部分,请单击“上一页”或“下一页”按钮,或按“向上翻页”或“向下翻页”键。这些命令分别显示内存前面或后面部分的反汇编代码。通过按右箭头、左箭头、上箭头和下箭头键,可以在窗口内导航。如果使用这些键离开页面,将出现一个新页面。

反汇编窗口中有一个包含两个按钮以及一个具有其他命令的快捷菜单的工具栏。 若要访问菜单,请右键单击标题栏或单击显示的窗口 (在右上角附近的图标显示反汇编窗口工具栏上的快捷菜单按钮的屏幕截图)。 以下列表介绍了一些菜单命令:

  • Go to current address 打开“源”窗口,其中包含与“反汇编”窗口中选定行相对应的源文件,并突出显示该行.

  • Disassemble before current instruction 使当前行放置在“反汇编”窗口的中间。此命令是默认选项。如果清除此命令,当前行将显示在反汇编窗口的顶部,这将节省时间,因为反向反汇编可能会很耗时.

  • Highlight instructions from the current source line 使与当前源代码行对应的所有指令突出显示。通常,一个源代码行将对应于多个汇编指令。如果代码已优化,则这些程序集指令可能不是连续的。此命令使您能够查找从当前源代码行汇编的所有指令.

  • Show source line for each instruction 显示对应于每个汇编指令的源行号.

  • Show source file for each instruction 显示与每个程序指令相对应的源文件名.

在WinDbg中,可以使用“监视”窗口显示和更改全局和局部变量和寄存器信息。 您可以自定义此窗口以显示您正在跟踪的项。。“监视”窗口可以显示所需的任何变量列表。这些变量可以包括来自任何函数的全局变量和局部变量。任何时候,“监视”窗口都会显示与当前函数范围匹配的变量值。也可以通过“监视”窗口更改这些变量的值。

如何打开监视窗口

  • 通过菜单View--->Watch
  • 快捷键Alt+2
  • 通过工具栏

监视窗口

通过上面的方式打开的窗口如下:

 

 监视窗口可以包含四列。Name列和Value列始终显示,Typecast列和Locations列是可选的。要显示“Typecast”和“Locations”列,请分别单击工具栏上的“类型转换”和“位置”按钮。

在监视窗口中,可以执行以下操作:

  • 若要将变量添加到监视窗口中,选择第一个空单元格名称列中,键入变量名称,然后按 ENTER。 一个带有感叹号变量从单独的模块名称 ()。 如果未指定模块,则使用当前的模块。 若要输入中的地址名称字段中,该地址必须以具有十进制数字 (如有必要,使用该前缀0x)。

    如果您输入的变量名称当前函数的作用域中定义的其值将出现在列。 如果未定义,列将显示"错误:无法获取值"。

    即使未定义变量,它可将其添加到监视窗口。 如果程序计数器输入在其中定义此名称的变量的函数,其值将出现在窗口中在该时间。

  • 要从监视窗口中删除变量,请双击其名称,按 DELETE 键,然后按 ENTER。 通过双击旧名称,键入新名称,然后按 ENTER,也可以使用新名称替换旧名称。

  • 如果变量是一种数据结构,其名称旁边显示复选框。 若要展开和折叠结构成员的显示,请选择或清除该复选框。

  • 类型的整数int显示为十进制值; 类型的整数UINT显示在当前的基数。 若要更改当前的基数,请使用n (设置数量 Base)命令在调试器命令窗口中。

  • 若要更改本地变量的值,请双击其单元格。 输入新值,或编辑旧值。 (剪切、 复制和粘贴命令是可用来进行编辑。)您输入的值可以包含任何C++表达式输入新值或编辑旧值后,您可以按 enter 键来存储新值或按 esc 键放弃它。 如果提交无效的值后按 ENTER,,将重新出现的旧值。

    类型的整数int显示为十进制值; 类型的整数UINT显示在当前的基数。 若要更改当前的基数,请使用n (设置数量 Base)命令在调试器命令窗口中。

  • 类型列 (如果它显示在监视窗口中) 显示每个变量的当前数据类型。 每个变量显示在其自己的数据类型为正确的格式。 数据结构具有其类型名类型列。 其他变量的类型显示在此列中的"输入新的类型"。

    如果您双击"输入新类型",您可以通过输入新的数据类型强制转换类型。 此强制转换更改仅在监视窗口中; 此变量的当前显示它不会更改任何内容在调试器中或在目标计算机上。 此外,如果输入中的新值列中,你输入的文本将分析基于符号的实际类型而不是任何新型中输入类型列。 如果关闭并重新打开监视窗口,您将丢失的数据类型更改。

    您还可以输入中的扩展命令类型列。 调试器会将该符号的地址传递到此扩展插件,并将在一系列的当前行下方的可折叠行中显示生成的输出。 例如,如果在此行中的符号是有效的线程环境块的地址,则可以输入 ! teb类型列来运行! teb此符号的地址上的扩展。

  • 位置列 (如果它显示在监视窗口中) 显示了一种数据结构的每个成员的偏移量。

  • 除了变量之外,还可以监视监视窗口中的以下项:


    • 注册。 当将寄存器添加到监视窗口中时,其名称加上前缀 at 符号 (@)。 与变量不同,不能更改寄存器值通过监视窗口。
    • 包含函数的指针的 Vtable。 当 Vtable 出现在监视窗口中时,您可以浏览表中的函数条目。 如果在指向派生的实现,表示法的基类中包含 Vtable _vtcast_显示来指示要添加的成员由于派生类中。 这些成员展开类似于派生的类类型。
    • 扩展插件的返回值函数,如_EFN_GetPoolData。

与“局部”窗口不同,“监视”窗口不受寄存器上下文更改的影响。在监视窗口中,您只能查看和修改在当前程序计数器范围内定义的变量。如果打开新工作区,监视窗口内容将被丢弃并替换为新工作区中的内容。

在WinDbg中,可以通过输入命令、使用“局部变量”窗口或使用“监视”窗口查看局部变量。局部变量窗口显示当前作用域中的本地变量的所有信息。

如何打开Locals窗口

  • 通过菜单View--->Locals
  • 通过快捷键Al+3
  • 通过工具栏

局部变量窗口

通过上面的方式打开的窗口如下:

 

局部变量窗口可以包含四列。Name列和Value列始终显示,Typecast列和Locations列是可选的。要显示“Typecast”和“Locations”列,请分别单击工具栏上的“Typecast”和“Locations”按钮。

寄存器是位于在 CPU 的小易失性内存单位。 许多寄存器专用于特定用途,并可用于用户模式应用程序使用的其他寄存器。 基于 x86 和基于 x64 的处理器在有可用的寄存器的不同集合。

如何打开寄存器窗口

  • 通过菜单View--->Registers

     

     

  • 通过快捷键Alt+4
  • 通过工具栏

寄存器窗口

通过上面方式打开的窗口如下:

 

寄存器窗口包含两个列。 Reg列列出了所有目标处理器的寄存器。 Value列显示每个注册的当前值。 此窗口还包含自定义按钮在工具栏上,打开自定义注册列表对话框:

 

在寄存器窗口中,可以执行以下操作:

  • Value列显示每个注册的当前值。 以红色文本显示的最近更改的寄存器的值。


    • 若要输入新值,请双击单元格,然后键入新值或编辑旧值。 (剪切、 复制和粘贴命令是可用来进行编辑。)
    • 若要保存新值,请按 ENTER。
    • 若要放弃的新值,请按 ESC。
    • 如果键入无效的值,按 ENTER 键时,将重新出现的旧值。
  • 寄存器值显示在当前的基数,并且必须在相同的基数中键入新值。 若要更改当前的基数,请使用n (设置数量 Base)命令在调试器命令窗口中。

  • 在用户模式下,寄存器窗口显示与当前线程相关联的寄存器。 

  • 在内核模式下,寄存器窗口显示与当前相关联的寄存器注册上下文可以设置寄存器上下文以匹配特定线程、 上下文记录或捕获帧。 实际显示仅指定的寄存器上下文的最重要寄存器;不能更改它们的值。

寄存器窗口已包含一个工具栏自定义按钮和具有带其他命令的快捷菜单。 若要访问菜单,请右键单击标题栏或单击窗口右上角附近的图标 (用于显示寄存器窗口快捷菜单的按钮图标的屏幕截图)。 工具栏和菜单包含以下按钮和命令:

  • (工具栏和菜单)自定义会打开自定义寄存器列表对话框中,在本主题中的以下部分中所述。

  • (仅限菜单)工具栏工具栏,开启和关闭。

  • (仅限菜单)停靠取消停靠将使窗口进入或离开停靠的状态。

  • (仅限菜单)移到新停靠寄存器窗口将关闭,并将其打开新的平台中。

  • (仅限菜单)设置为选项卡形式停靠为窗口中,键入目标不可用于寄存器窗口。 此选项才可用的源或内存窗口。

  • (仅限菜单)始终浮点将使窗口停靠,即使仍拖到停靠位置。

  • (仅限菜单)移动与帧将使窗口移动时移动的 WinDbg 帧,即使在窗口已解除固定。 

  • (仅限菜单)帮助有关 Windows 调试工具文档中打开此主题。

  • (仅限菜单)关闭关闭此窗口。

自定义寄存器列表对话框

若要更改显示的寄存器的列表,请单击自定义按钮。 自定义寄存器列表对话框将出现。在此对话框中,可以编辑的寄存器,若要更改的寄存器的显示的顺序的列表。 (不能实际从列表中删除寄存器; 如果这样做,它将结束时重新出现。)寄存器名称之间必须留一个空格。如果选择修改显示首次寄存器复选框,其值已更改的寄存器最近显示在顶部。如果选择不会显示 subregisters复选框,subregisters 不会显示。 例如, eax将显示,但不是axah,或者al单击确定以保存所做的更改或取消放弃所做的更改。如果你正在调试多个类型的处理器的多处理器计算机,WinDbg 将单独存储每个处理器类型的自定义设置。 这种分离使您可以同时自定义的每个处理器的寄存器的显示。

在 WinDbg 中,进程和线程窗口中显示有关系统、 进程和线程正在调试的信息。 此窗口还可选择新的系统、 进程和线程处于活动状态。

如何打开进程和线程窗口

  • 通过菜单View--->Processes and Threads
  • 快捷键Alt+9
  • 通过工具栏

使用进程和线程窗口

通过上面的方式打开的窗口如下:

 

“进程和线程”窗口显示当前正在调试的所有进程的列表。进程中的线程出现在每个进程下。如果调试器附加到多个系统,则系统显示在树的顶层,进程从属于它们,线程从属于进程。每个系统列表都包含服务器名和协议详细信息。运行调试器的系统被标识为<Local>。每个进程列表都包含调试器使用的内部十进制进程索引、十六进制进程ID和与该进程关联的应用程序的名称。每个线程列表包括调试器使用的内部十进制线程索引和十六进制线程ID。

在进程和线程窗口中,当前或处于活动状态的系统、 进程和线程以粗体显示。 若要使新的系统、 进程或线程处于活动状态,请单击窗口中的一行。进程和线程窗口具有带其他命令的快捷方式菜单。 若要访问菜单,请右键单击标题栏或单击窗口 (在右上角附近的图标显示的草稿板窗口工具栏快捷方式菜单按钮的屏幕截图)。 以下列表介绍了一些菜单命令:

  • 移到新停靠关闭进程和线程窗口中,并将其打开新的平台中。

  • 始终浮点将使窗口停靠,即使仍拖到停靠位置。

  • 移动与帧将使窗口移动时移动的 WinDbg 帧,即使在窗口已解除固定。