wenmo8 发布的文章

在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 帧,即使在窗口已解除固定。

在 WinDbg 中,可以查看和编辑内存,通过输入命令或通过使用内存窗口

内存窗口的打开

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

使用内存窗口

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

 

 

内存窗口显示多个列中的数据。 在窗口的左侧列显示每个行的开始地址。 其余列显示所需的信息,从左到右。 如果选择字节显示格式菜单中,对应于这两个字节的 ASCII 字符将显示在窗口的右侧。

请注意  默认情况下,内存窗口显示虚拟内存。 这种类型是内存的内存的在用户模式下可用的唯一类型。 在内核模式下,可以使用内存选项对话框以显示物理内存和其他数据空间。

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

  • 若要写入内存,请单击内存窗口并键入新数据。 您可以编辑仅十六进制数据,不能直接编辑 ASCII 和 Unicode 字符。 只要键入新的信息,更改才会生效。

  • 若要查看的其他部分的内存,请使用内存窗口工具栏上PreviousNext按钮()的或按 PAGE UP 或 PAGE DOWN 键。 这些按钮和密钥显示内存立即前面或后面的部分。 如果请求了无效的页面,将显示一条错误消息。

  • 若要导航窗口中,使用向右键、 向左键、 向上键和向下箭头键。 如果使用这些密钥来离开页面时,会显示一个新页面。 在使用这些密钥之前,应调整大小内存窗口,以便它不会包含滚动条。 此大小调整,可区分的实际页边缘和截止窗口。

  • 若要更改正在查看的内存位置,内存窗口顶部的地址框()中输入新的地址。 请注意内存窗口刷新其显示,而您输入一个地址,因此之前已完成键入地址,可获得错误消息。 请注意  中当前基数解释在框中输入的地址。 如果当前的基数不是 16,您应前缀与十六进制地址0x若要更改默认基数,请使用n (设置数量 Base)命令在调试器命令窗口中。 内存窗口本身中的显示不受当前的基数。

  • 若要更改窗口用于显示内存的数据类型,请使用内存窗口工具栏中的菜单显示格式(

    )。 支持的数据类型包括短单词、 双字和四字;short、 long,与四整数和无符号的整数;10 字节、 16 个字节,32 位和 64 字节实数;ASCII 字符;Unicode 字符;和十六进制字节。 十六进制字节的显示内容包括 ASCII 字符和。

内存窗口具有一个包含两个按钮、 菜单和一个框,但与其他命令的快捷菜单的工具栏。 若要访问菜单,请右键单击标题栏或单击窗口 (在右上角附近的图标显示内存窗口工具栏上的快捷菜单按钮的屏幕截图)。 工具栏和快捷菜单包含以下几种选择:

  • (仅工具栏)地址框中,可指定新的地址或偏移量。 此框的确切含义取决于正在查看的内存类型。 例如,如果您正在查看虚拟内存,框中,可指定新的虚拟地址或偏移量。

  • (仅工具栏)显示格式使您能够选择新的显示格式。

  • (工具栏和菜单)Previous(在工具栏上) 和Previous page(在快捷菜单上) 会导致内存要显示的上一节。

  • (工具栏和菜单)Next(在工具栏上) 和Next page(在快捷菜单上) 会导致内存要显示的下一节。

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

  • (仅限菜单)自动调整列可确保在内存窗口中显示的列数适合内存窗口的宽度。

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

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

  • (仅限菜单)设置为选项卡形式停靠为窗口中,键入目标作为其他内存窗口的选项卡形式停靠目标设置所选的内存窗口。 与选项卡式的集合中该窗口将自动进行分组之后作为选项卡形式停靠目标中选择一个打开的所有内存窗口。

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

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

  • (仅限菜单)属性会打开内存选项对话框中,在本主题中的以下部分中所述。

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

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