检查“自动”和“局部变量”窗口中的变量

在调试时,“自动变量”和“局部变量”窗口会显示变量值。 窗口仅在调试会话期间可用。 “自动”窗口显示在当前语句(调试器暂停的位置)周围使用的变量。 局部变量 窗口显示本地范围中定义的变量,通常是当前函数或方法。

说明

如果这是你第一次尝试调试代码,可能需要阅读 调试绝对初学者调试技术和工具,然后再阅读本文。

Autos 窗口适用于 C#、Visual Basic、C++ 和 Python 代码,但不适用于 JavaScript 或 F#。

若要打开“自动变量”窗口,请在调试时依次选择“调试”>“窗口”>“自动变量”,或按 Ctrl+Alt+V > A。

若要打开“局部变量”窗口,请在调试时选择“调试”>“窗口”>“局部变量”,或按 Alt+4

使用“自动”和“局部变量”窗口

数组和对象以树控件的形式显示在 自动变量局部变量 窗格中。 选择变量名称左侧的箭头以展开视图以显示字段和属性。 下面是 局部变量 窗口中 System.IO.FileStream 对象的示例:

“局部变量”窗口的屏幕截图,其中的文件设置为 System.IO.FileStream 值。

“局部变量”窗口的屏幕截图,其中的文件设置为 System.IO.FileStream 值。

本地变量自动变量 窗口中的红色值表示该值自上次评估以来已更改。 更改可能来自以前的调试会话,或者因为你更改了窗口中的值。

调试器窗口中的默认数字格式为十进制。 若要将其更改为十六进制,请在 局部变量自动 窗口中右键单击,然后选择 十六进制显示。 此更改会影响所有调试器窗口。

在“自动”或“局部变量”窗口中编辑变量值

若要编辑 自动局部变量 窗口中大多数变量的值,请双击该值并输入新值。

可以为值输入表达式,例如 a + b。 调试器接受最有效的语言表达式。

在原生C++代码中,可能需要限定变量名称的上下文。 有关详细信息,请参阅 上下文运算符(C++)

谨慎

在更改值和表达式之前,请确保了解后果。 一些可能的问题包括:

  • 计算某些表达式可能会更改变量的值或以其他方式影响程序的状态。 例如,评估 var1 = ++var2 会更改 var1var2的值。 据说这些表达式具有副作用。 如果不知道副作用可能会导致意外结果。

  • 由于小数部分在转换为二进制时,对浮点值进行编辑可能会导致轻微误差。 即使是看似无害的编辑也可能导致浮点变量中的某些位发生更改。

在“自动”或“局部变量”窗口中搜索

你可以使用每个窗口上方的搜索栏,在“自动”或“局部变量”窗口的“名称”、“值”和“类型”列中搜索关键字。 按 Enter 或选择其中一个箭头来执行搜索。 若要取消正在进行的搜索,请在搜索栏中选择“x”图标。

分别使用向左和向右箭头(Shift+F3 和 F3)在找到的匹配项之间导航。

“局部变量”窗口中搜索的屏幕截图

“局部变量”窗口中搜索的屏幕截图

要使搜索更加彻底,请使用“自动”或“局部变量”窗口顶部的“深入搜索”下拉列表,选择要在嵌套对象中搜索的深度级别。

在“自动”或“局部变量”窗口中固定属性

备注

.NET Core 3.0 或更高版本支持此功能。

使用可固定属性工具,可以快速检查“自动”或“局部变量”窗口中对象的属性。 要使用此工具,请将鼠标悬停在某个属性上,并选择出现的固定图标,或右键单击并选择所显示上下文菜单中的“将成员固定到收藏夹”选项。 这会将该属性以气泡形式显示到该对象的属性列表顶部,并且属性名称和值会显示在“值”列中。 要取消固定属性,请再次选择固定图标,或在上下文菜单中选择“取消将成员固定到收藏夹”选项。

在“局部变量”窗口中固定属性的屏幕截图。

还可以在“自动”或“局部变量”窗口中查看对象的属性列表时切换属性名称和筛选出非固定属性。 可以通过选择“自动”或“局部变量”窗口上方工具栏中的按钮来访问每个选项。

筛选器收藏夹属性的屏幕截图。

切换属性名称的截图。

更改“自动”或“本地”窗口的上下文

可以使用 调试位置 工具栏来选择所需的函数、线程或进程,从而更改 自动变量窗口局部变量窗口 的上下文。

若要启用 调试位置 工具栏,请单击工具栏区域的空部分,然后从下拉列表中选择 调试位置,或选择 视图>工具栏>调试位置

设置断点并开始调试。 命中断点后,执行将暂停,你可以在“调试位置”工具栏中看到 位置。

调试位置工具栏的屏幕截图。

调试位置工具栏的屏幕截图。

获取 AI 帮助

如果你有 Copilot,可以在查看“自动”或“局部变量”窗口或数据提示中的变量时获得 AI 帮助。 右键单击变量,并使用“询问 Copilot”“询问 Copilot”按钮的屏幕截图。 按钮。 在此方案中,Copilot 已经知道你的问题的上下文,因此你无需自己在聊天中提供上下文。 有关详细信息,请参阅使用 Copilot 进行调试

“自动”窗口中的变量(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 的值设置为 0。

    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; 设置断点并运行调试器。 当执行停止时,“自动”窗口将显示:

    “自动”窗口的屏幕截图,其中突出显示的行显示了值为 3 的 int c。

    “自动”窗口的屏幕截图,其中突出显示的行显示了值为 3 的 int c。

    变量 e 未初始化,因为尚未执行行 e = 5

查看方法调用的返回值

在 .NET 和 C++ 代码中,当你单步跳过或单步跳出方法调用时,可以在“自动”窗口检查返回值。 查看方法调用返回值在未存储在局部变量中时非常有用。 方法可用作参数,也可以用作另一方法的返回值。

备注

从 Visual Studio 2022 版本 17.12 预览版 3 开始,还可以查看内联返回值,而不仅仅是在“自动”窗口中查看。

例如,以下 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() 方法调用的返回值:

  1. int x = sumVars(a, b) + subtractVars(c, d); 行上设置断点。

  2. 开始调试,且当执行在断点处暂停时,选择“单步跳过”或按 F10。 你应该在“自动”窗口中看到以下返回值:

    自动返回值 C# 的屏幕截图。

    自动返回值 C# 的屏幕截图。