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

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

注意

如果是首次尝试调试代码,那么在阅读本文前,可能需要阅读零基础调试调试技术和工具

“自动变量”窗口可用于 C#、Visual Basic、C++ 和 Python 代码,但不可用于 JavaScript 或 F# 。

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

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

注意

本主题适用于 Visual Studio Windows 版。 对于 Visual Studio for Mac,请参阅 Visual Studio for Mac 的数据可视化效果

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

数组和对象在“自动变量”和“局部变量”窗口中显示为树形控件。 选择变量名称左侧的箭头可展开视图,以显示字段和属性。 以下是“局部变量”窗口中 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 或更高版本支持此功能。

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

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

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

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

切换属性名称的屏幕截图。

更改“自动”或“局部变量”窗口的上下文

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

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

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

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

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

“自动”窗口中的变量(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 行。

View return values of method calls

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

例如,下面的 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# 的屏幕截图。