Visual Studio 调试系列5 检查变量(使用自动窗口和局部变量窗口)

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

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

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

01 使用自动和局部变量窗口
数组和对象在“自动变量”和“局部变量”窗口中显示为树形控件。 选择变量名称左侧的箭头可展开视图,以显示字段和属性。

“局部变量”或“自动变量”窗口中的红色值表示自上次评估后值已更改。 此更改可能是在上一个调试会话中进行的,也可能是在窗口中更改了值。
 当集合中加入一条记录时,sharps 对象的 Count 属性发生变更,所以用红色标注。

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

02 编辑自动或局部变量窗口中的变量值

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

编辑完成后,按下回车键即生效,红色标注。

你可以输入表达式作为一个值,例如 a + b。 调试器接受大多数合法的语言表达式。

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

(1)计算某些表达式可能会更改变量的值或以其他方式影响程序的状态。 例如,计算 var1 = ++var2 会更改 var1 和 var2 的值。据说这些表达式具有副作用。 如果你不了解这些副作用,则可能会导致意外结果。

(2)编辑浮点值时,由于要将小数部分从十进制转换为二进制,因此所得的结果可能存在微小误差。

         甚至看起来无关紧要的编辑都能引起浮点变量中的位的某些更改。

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

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

使用左右箭头键 (Shift + F3 和 F3,分别) 之间进行导航找到匹配项。

 若要使搜索更多或更少全面,使用搜索更深入地顶部的下拉列表中自动或局部变量窗口可选择要搜索到的层深度嵌套的对象。

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

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

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

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

05 查看方法调用的返回值

在.NET 和 C ++ 代码中,当单步调试或退出方法调用时,可以在“自动”窗口中检查返回值如果方法调用返回值未保存在局部变量中,查看这些返回值会非常有用。 方法可以用作参数或用作另一种方法的返回值。

例如,下面的 C# 代码将添加两个函数的返回值:

 1 static void Main(string[] args)
 2 {
 3     int a, b, c, d;
 4     a = 1;
 5     b = 2;
 6     c = 3;
 7     d = 4;
 8     int x = sumVars(a, b) + subtractVars(c, d);
 9     
10     Console.WriteLine("Press any key to exit."); // 在调试模式下保持控制台打开
11     Console.ReadKey();
12 }
13 
14 private static int sumVars(int i, int j)
15 {
16     return i + j;
17 }
18 
19 private static int subtractVars(int i, int j)
20 {
21     return j - i;
22 }

要在“自动”窗口中查看 sumVars() 和 subtractVars() 方法调用的返回值,请执行以下操作:

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

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

原文地址:https://www.cnblogs.com/SavionZhang/p/11268051.html