在 WinDbg (经典) 中查看和编辑局部变量
在 WinDbg 中,可以通过输入命令、使用“局部变量”窗口或使用“监视”窗口来查看局部变量。
调试器命令窗口
可以通过在“调试器命令”窗口中输入 dv 命令或 dt 命令来查看局部变量和参数。
打开“局部变量”窗口
“局部变量”窗口显示有关当前范围内所有局部变量的信息。
若要打开或切换到“局部变量”窗口,请在“WinDbg”窗口中的“ 视图 ”菜单上,选择“ 局部变量”。 (还可以按 Alt+3 或选择工具栏上的 “局部变量 ”按钮。Alt+SHIFT+3 关闭“局部变量”窗口。)
以下屏幕截图显示了“局部变量”窗口的示例。
“局部变量”窗口可以包含四列。 始终显示“名称”和“值”列,“类型”和“位置”列是可选的。 若要显示 “类型” 和“ 位置” 列,请分别在工具栏上选择“ Typecast ”和“ 位置” 按钮。
使用“局部变量”窗口
在“局部变量”窗口中,可以执行以下操作:
“ 名称” 列显示每个局部变量的名称。 如果变量是数据结构,则其名称旁边会显示一个检查框。 若要展开或折叠结构成员的显示,请选择或清除检查框。
“ 值 ”列显示每个变量的当前值。
- 若要为变量输入新值,请双击当前值并键入新值,或编辑旧值。 (剪切、复制和粘贴命令可用于编辑。) 可以键入任何 C++ 表达式。
- 若要保存新值,请按 Enter。
- 若要放弃新值,请按 ESC。
- 如果键入无效值,则按 Enter 时,旧值将再次出现。
int 类型的整数显示为十进制值;UINT 类型的整数显示在当前基数中。 若要更改当前基数,请在“调试器命令”窗口中使用 n (Set Number Base) 命令。
如果 “类型” 列显示在“局部变量”窗口中,则 (该列) 显示每个变量的当前数据类型。 每个变量都以适合其自己的数据类型的格式显示。 数据结构在 “类型 ”列中具有其类型名称。 其他变量类型在此列中显示“输入新类型”。
如果双击“输入新类型”,可以通过输入新的数据类型来强制转换类型。 此强制转换仅在“局部变量”窗口中更改此变量的当前显示;它不会更改调试器或目标计算机上的任何内容。 此外,如果在 “值 ”列中输入新值,将根据符号的实际类型(而不是在“ 类型 ”列中输入的任何新类型)分析输入的文本。 如果关闭并重新打开“局部变量”窗口,将丢失数据类型更改。
还可以在 “类型” 列中输入扩展命令。 调试器会将符号的地址传递给此扩展,并在当前行下方的一系列可折叠行中显示生成的输出。 例如,如果此行中的符号是线程环境块的有效地址,则可以在“类型”列中输入 !teb,以在此符号的地址上运行 !teb 扩展。
如果 “位置” 列显示在“局部变量”窗口中,则 (“位置”列) 显示数据结构中每个成员的偏移量。
如果局部变量是包含 Vtable 的类的实例,则 Name 列将显示 Vtable,你可以展开 Vtable 以显示函数指针。 如果 Vtable 包含在指向派生实现的基类中,则显示表示法 _vtcast_Class 以指示由于派生类而添加的成员。 这些成员的扩展方式类似于派生类类型。
局部上下文确定将在“局部变量”窗口中显示哪一组局部变量。 当本地上下文因任何原因而更改时,“局部变量”窗口会自动更新。 默认情况下,本地上下文与程序计数器的当前位置匹配。 有关如何更改本地上下文的详细信息,请参阅本地上下文。
“局部变量”窗口具有一个工具栏,其中包含两个按钮 (Typecast 和 Locations) ,以及一个包含其他命令的快捷菜单。 若要访问菜单,请选择并按住 (或右键单击) 窗口标题栏,或选择窗口右上角附近的图标。 工具栏和菜单包含以下按钮和命令。
(工具栏和菜单) Typecast 打开和关闭 “类型” 列的显示。
(工具栏和菜单) “位置” 打开和关闭“ 位置” 列的显示。
(菜单仅) 显示 16 位值,因为 Unicode 在此窗口中显示 Unicode 字符串。 此命令打开和关闭影响“局部变量”窗口、“监视”窗口和调试器命令输出的全局设置。 此命令等效于使用 .enable_unicode (启用 Unicode 显示) 命令。
(菜单仅) 始终在默认基数中显示数字 会导致整数以默认基数显示,而不是以十进制格式显示。 此命令打开和关闭影响“局部变量”窗口、“监视”窗口和调试器命令输出的全局设置。 此命令等效于使用 .force_radix_output (将 Radix 用于整数) 命令。
注意“始终在默认基数中显示数字”命令不会影响长整数。 长整数以十进制格式显示,除非设置了 .enable_long_status (启用长整型显示) 命令。 .enable_long_status 命令会影响“局部变量”窗口、“监视”窗口和调试器命令输出中的显示;在“局部变量”窗口的菜单中,此命令没有等效项。
(菜单仅) 打开所选值的内存窗口 会打开一个新的停靠内存窗口,该窗口显示从所选表达式的地址开始的内存。
(菜单仅) 调用所选内存值的 dt 运行 dt (显示类型) 命令,并将所选符号作为其参数。 结果显示在“调试器命令”窗口中。 -n 选项会自动用于区分符号和十六进制地址。 不使用其他选项。 请注意,使用此菜单选择生成的内容与从命令行运行 dt 命令时生成的内容相同,但格式略有不同。
(菜单仅) 工具栏 打开和关闭工具栏。
(菜单仅) 停靠 或 取消停靠 会导致窗口进入或离开停靠状态。
(菜单仅) 移动到新扩展坞 会关闭“局部变量”窗口,并在新扩展坞中打开它。
(菜单仅) 设置为窗口类型的选项卡停靠目标 对“局部变量”窗口不可用。 此选项仅适用于“源”或“内存”窗口。
(菜单仅) 始终浮动 会导致窗口保持未停靠状态,即使它被拖动到停靠位置。
(菜单仅) 移动框架 会导致在移动 WinDbg 帧时窗口移动,即使窗口已取消停靠也是如此。
(菜单仅) 帮助 打开 Windows 调试工具文档中的本主题。
(菜单仅) 关闭 会关闭此窗口。
监视窗口
在 WinDbg 中,可以使用“监视”窗口显示和更改局部变量。 “监视”窗口可以显示所需的任何变量列表。 这些变量可以包括来自任何函数的全局变量和局部变量。 “监视”窗口随时显示与当前函数的范围匹配的变量的值。 还可以通过“监视”窗口更改这些变量的值。
与“局部变量”窗口不同,“监视”窗口不受本地上下文更改的影响。 只有当前程序计数器范围内定义的变量才能显示或修改其值。
若要打开“监视”窗口,请从“视图”菜单中选择“监视”。 还可以按 Alt+2 或选择工具栏上的“ 监视 ”按钮。 Alt+SHIFT+2 关闭“监视”窗口。
以下屏幕截图显示了监视窗口的示例。
监视窗口可以包含四列。 始终显示“名称”和“值”列,“类型”和“位置”列是可选的。 若要显示 “类型” 和“ 位置” 列,请分别在工具栏上选择“ Typecast ”和“ 位置” 按钮。
另请参阅
有关控制局部变量的详细信息、使用变量和更改作用域的概述以及其他内存相关命令的说明,请参阅 读取和写入内存。