如何:在调试器中监视表达式
在**“监视”窗口和“快速监视”**对话框中,可以输入要在调试会话期间监视的变量的名称和表达式。
使用**“快速监视”**对话框在同一时间可以检查单个变量或单个表达式。 它可用来快速查看一个值或一个较大的数据结构。 **“监视”窗口可以存储多个要在调试会话过程中查看的变量和表达式。 某些版本的 Visual Studio 有多个“监视”**窗口,其编号为 Watch1 到 Watch4。
有关如何打开**“监视”或“快速监视”**窗口的更多信息,请参见To display a variable window。
变量名是可输入的最简单的表达式。 如果要调试本机代码,可以使用注册名以及变量名。 然而,调试器还可以接受比这更复杂的表达式。 例如,您可以输入下列表达式以获得三个变量的平均值:
(var1 + var2 + var3) / 3
在 C# 中,可以输入对象 ID 或别名,而不能输入对象名。
调试器在**“监视”**窗口中接受大多数合法的语言表达式。 有关更多信息,请参见调试器中的表达式。
如果正在用本机代码编程,有时可能需要限定变量名或包含变量名的表达式的上下文。 上下文指变量所处的函数、源文件和模块。 如果需要限定上下文,您可以使用上下文运算符语法。 有关更多信息,请参见上下文运算符(C/C++ 语言表达式)。
影响程序状态的表达式
计算某些表达式可以更改变量的值,或会影响程序的状态。 例如,计算下列表达式会更改 var1 的值:
var1 = var2
更改数据的表达式被称为有副作用的表达式。 如果在**“监视”窗口中输入有副作用的表达式,则每次“监视”**窗口计算该表达式时都将发生副作用。 如果您不知道该表达式有副作用,则可能产生意外的结果。 首次输入已知有副作用的表达式时,将只对其计算一次。 随后的计算将被禁用。 通过单击出现在值旁边的更新图标,可以手动重写此行为。
意外的副作用通常是函数求值的结果。 例如,您可能在**“监视”**窗口中输入了以下函数调用:
Func1(var1)
如果从**“监视”窗口或“快速监视”调用函数,则被调用的函数可能更改数据,从而产生副作用。 避免函数计算可能产生的意外副作用的方法之一是在“选项”**对话框中关闭自动函数计算功能。 这将禁止对较新的语言功能(例如属性)进行自动计算。 但这样会更加安全。
备注
当在“监视”窗口中检查表达式时,可能会看到一个更新图标,该图标就像是绿色圆圈中按相反方向旋转的两个绿色箭头。如果已经关闭了自动函数计算功能,则更有可能看到刷新图标。该更新图标指示存在错误或过期的值。有关更多信息,请参见如何:刷新监视值。
对于本机代码和 C#,可以使用格式说明符指定表达式值的显示格式。 有关更多信息,请参见C++ 中的格式说明符和C# 中的格式说明符。
Visual Studio 调试器将自动展开常见的数据类型,以显示这些数据类型的最重要的元素。 您可以添加展开自定义数据类型的行为。 有关更多信息,请参见显示自定义数据类型和可视化工具。
备注
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。
计算“监视”窗口中的表达式
在**“监视”窗口中,单击“名称”**列中的空行。 调试器在此时必须处于中断模式。 键入或粘贴要监视的变量名或表达式。
- 或 -
将变量拖到**“监视”**窗口中的某行。
按 Enter。
结果出现在**“值”列中。 如果键入数组或对象变量的名称,“名称”列中的名称旁边就会出现树控件。 您可以展开或折叠“名称”**列中的变量。
表达式一直保留在**“监视”**窗口中,直到将其删除为止。
计算“快速监视”中的表达式
在**“快速监视”对话框中,将变量、寄存器或表达式键入或粘贴到“表达式”**文本框中。
单击**“重新计算”**或按 Enter。
值出现在**“当前值”**框中。
如果在**“表达式”框中键入数组或对象变量的名称,则“当前值”框中的名称旁边就会出现树控件。 您可以展开或折叠“名称”**列中的变量。
重新计算“快速监视”中以前的表达式
在**“快速监视”对话框中,单击出现在“表达式”**框右侧的向下箭头。
从下拉列表中选择一个以前的表达式。
单击**“重新计算”**。