当您尝试对问题进行调试时,通常要找出变量在特定应用状态下是否存储了您期望的值。 调试器的某些最有用的功能是可用于检查变量的功能。
本文介绍如何使用 Visual Studio 中的调试器检查变量和查看返回值。 调试器提供了多种便捷的方式来执行这些任务,包括:
- 在代码编辑器中,可以查看数据提示和内联返回值
- 在调试器窗口中(自动、局部变量和监视窗口),可以查看变量值
- 在可视化工具中,可以查看大型字符串或复杂的 .NET 对象
这些功能仅在调试时可用。 若要了解如何启动调试会话,请参阅 “开始调试”并进入中断模式。
在代码编辑器中查看变量
通常,在调试时,你需要快速检查代码编辑器中对象上的属性值,并且数据提示是执行此作的好方法。
在调试器中暂停时,将鼠标悬停在对象上,可以看到其值或默认属性值。
如果变量具有属性,则可以展开该对象以查看其所有属性。
有关使用数据提示的详细信息,请参阅在数据提示中查看数据值。
在代码编辑器中查看方法调用的内联返回值
在 .NET 和C++代码中,当单步执行或退出方法调用时,可以检查返回值,当返回值未存储在局部变量中时非常有用。 方法可用作参数,也可以用作另一方法的返回值。
从 Visual Studio 2022 版本 17.12 开始,你可以内联查看方法调用的返回值,而不仅仅是在自动”窗口中查看。
启用 Copilot 后,你还可以使用返回值数据提示中出现的“询问 Copilot”按钮,来获取与内联返回值相关的有针对性帮助。
监视变量
您可以使用 监视 窗口来指定您希望关注的变量或表达式。
调试时,右键单击代码编辑器中的对象并选择 “添加监视”。 此时会打开“监视”窗口。
在此示例中,你已对对象设置了监视,在浏览调试器时可以看到其值更改。 与其他变量窗口不同,监视窗口始终显示您正在监视的变量(当超出作用域时它们会变为灰色显示)。
有关详细信息,请参阅使用“监视”窗口和“快速监视”窗口设置监视。
获取 AI 帮助
如果你有 Copilot,则可以在代码编辑器或自动或局部变量窗口中查看变量时获得 AI 帮助。 调试时,右键单击变量,并使用Ask Copilot按钮。以下是“Ask Copilot”按钮的屏幕截图。 在此方案中,Copilot 已经知道你的问题的上下文,因此你无需自己在聊天中提供上下文。 有关详细信息,请参阅使用 Copilot 进行调试。
检查调试器窗口中的变量(自动和局部变量)
在调试时,“自动变量”和“局部变量”窗口会显示变量值。 窗口仅在调试会话期间可用。 “自动”窗口显示在当前语句(调试器暂停的位置)周围使用的变量。 局部变量 窗口显示本地范围中定义的变量,通常是当前函数或方法。
若要打开“自动变量”窗口,请在调试时依次选择“调试”>“窗口”>“自动变量”,或按 Ctrl+Alt+V > A 调试 。
Autos 窗口适用于 C#、Visual Basic、C++ 和 Python 代码,但不适用于 JavaScript 或 F#。
若要打开“局部变量”窗口,请在调试时选择“调试”>“窗口”>“局部变量”,或按 Alt+4 。
可展开的数组和对象显示在 “自动 ”和 “局部变量 ”窗口中。 选择变量名称左侧的箭头以展开视图以显示字段和属性。 下面是 System.IO.FileStream 窗口中 对象的示例:
本地变量 或 自动变量 窗口中的红色值表示该值自上次评估以来已更改。 更改可能来自以前的调试会话,或者因为你更改了窗口中的值。
调试器窗口中的默认数字格式为十进制。 若要将其更改为十六进制,请在 局部变量 或 自动 窗口中右键单击,然后选择 十六进制显示。 此更改会影响所有调试器窗口。
在“自动”或“局部变量”窗口中编辑变量值
若要编辑 自动 或 局部变量 窗口中大多数变量的值,请双击该值并输入新值。
可以为值输入表达式,例如 a + b
。 调试器接受最有效的语言表达式。
在原生C++代码中,可能需要限定变量名称的上下文。 有关详细信息,请参阅 上下文运算符(C++)。
谨慎
在更改值和表达式之前,请确保了解后果。 一些可能的问题包括:
计算某些表达式可能会更改变量的值或以其他方式影响程序的状态。 例如,评估
var1 = ++var2
会更改var1
和var2
的值。 据说这些表达式具有副作用。 如果你没有意识到它们,副作用可能会导致意外结果。由于小数部分在转换为二进制时,对浮点值进行编辑可能会导致轻微误差。 即使是看似无害的编辑也可能导致浮点变量中的某些位发生更改。
在“自动”或“局部变量”窗口中搜索
你可以使用每个窗口上方的搜索栏,在“自动变量”或“局部变量”窗口的“名称”、“值”和“类型”列中搜索关键字。 按 Enter 或选择其中一个箭头来执行搜索。 若要取消正在进行的搜索,请在搜索栏中选择“x”图标。
分别使用向左和向右箭头(Shift+F3 和 F3)在找到的匹配项之间导航。
要使搜索更加彻底,请使用“自动”或“局部变量”窗口顶部的“深入搜索”下拉列表,选择要在嵌套对象中搜索的深度级别。
在“自动”或“局部变量”窗口中固定属性
说明
.NET Core 3.0 或更高版本支持此功能。
使用可固定属性工具,可以快速检查“自动”或“局部变量”窗口中对象的属性。 要使用此工具,请将鼠标悬停在某个属性上,并选择出现的固定图标,或右键单击并选择所显示上下文菜单中的“将成员固定到收藏夹”选项。 这会将该属性以气泡形式显示到该对象的属性列表顶部,并且属性名称和值会显示在值列中。 要取消固定属性,请再次选择固定图标,或在上下文菜单中选择“取消将成员固定到收藏夹”选项。
还可以在“自动”或“局部变量”窗口中查看对象的属性列表时切换属性名称和筛选出非固定属性。 可以通过选择“自动”或“局部变量”窗口上方工具栏中的按钮来访问每个选项。
更改“自动”或“本地”窗口的上下文
可以使用 调试位置 工具栏来选择所需的函数、线程或进程,从而更改 自动变量窗口 和 局部变量窗口 的上下文。
若要启用 调试位置 工具栏,请单击工具栏区域的空部分,然后从下拉列表中选择 调试位置,或选择 视图>工具栏>调试位置。
设置断点并开始调试。 命中断点后,执行将暂停,你可以在“调试位置”工具栏中看到 位置。
“自动”窗口中的语言差异(C#、C++、Visual Basic、Python)
不同的代码语言在“自动变量”窗口中显示不同的变量。
在 C# 和 Visual Basic 中,“自动”窗口显示当前或前一行中使用的任何变量。 例如,在 C# 或 Visual Basic 代码中,声明以下四个变量:
public static void Main() { int a, b, c, d; a = 1; b = 2; c = 3; d = 4; }
在
c = 3;
行上设置断点,然后启动调试器。 当执行暂停时,“自动变量”窗口将显示:c
的值为 0,因为尚未执行行c = 3
。在 C++ 中,“自动”窗口将显示当前行(执行暂停的行)前面至少三行使用的变量。 例如,在C++代码中,声明六个变量:
void main() { int a, b, c, d, e, f; a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; }
在行
e = 5;
设置断点并运行调试器。 当执行停止时,“自动”窗口将显示:变量
e
未初始化,因为尚未执行行e = 5
。
在“自动”窗口中查看返回值
在以下示例中,此 C# 代码添加两个函数的返回值:
static void Main(string[] args)
{
int a, b, c, d;
a = 1;
b = 2;
c = 3;
d = 4;
int x = sumVars(a, b) + subtractVars(c, d);
}
private static int sumVars(int i, int j)
{
return i + j;
}
private static int subtractVars(int i, int j)
{
return j - i;
}
若要查看“自动”窗口中 sumVars()
和 subtractVars()
方法调用的返回值:
在
int x = sumVars(a, b) + subtractVars(c, d);
行上设置断点。开始调试,且当执行在断点处暂停时,选择“单步跳过”或按 F10。 你应该在“自动”窗口中看到以下返回值:
打开可视化工具以检查变量
在 Visual Studio 中进行调试时,可以使用内置可视化工具查看大型字符串或复杂对象,使数据更易于检查。 例如:
- 字符串可视化工具显示对于数据提示或调试器窗口而言过长的文本、XML、HTML 和 JSON 字符串。 它还可以帮助你识别格式不正确的字符串。 有关详细信息,请参阅 字符串可视化工具中的“查看字符串”。
- DataSet 和 IEnumerable 可视化工具在表格可视化工具中显示 .NET 集合对象。 有关详细信息,请参阅 Visual Studio 对象中的表格可视化工具。
可视化工具显示在 “自动” 窗口、数据提示和其他调试器窗口中。
说明
如果需要在可视化工具中检查 XAML 或 WPF UI 元素,请参考 调试时检查 XAML 属性 或 如何使用 WPF 树可视化工具。
要打开可视化工具,必须暂停调试过程。 将鼠标悬停在具有支持的可视化工具值的变量上,然后选择放大镜图标 。