在我们编写代码的过程中,很多时候我们需要查看变量的类型或函数的返回值类型,我们可以将鼠标悬浮到变量名上,弹出的气泡上就会显示变量名和类型。但是有时如果我们需要确定变量有没有初始化呢,因为我们一般都是在变量声明附近初始化变量的,所以我们只要找到变量声明的位置即可。
那么问题来了,如果我们的工程很庞大呢,我们又不记得我们的变量的声明位置,那我们该怎么办?前面我们说过, Visual Studio 是一个相当强大的 IDE,像这种“脏活累活”直接吩咐给 Visual Studio 做就行了。我们在任何一处的变量名上点击鼠标右键(如下图)-> 转到定义(G) 即可,Visual Studio 就会自动打开变量声明所在文件,并且自动移动光标到该行。
接下来我们来了解一下 Visual Studio 中调试器对变量的监视,在实际调试过程中,我们常常需要收集一个变量在运行到函数的不同位置的值,并加以分析,找出产生运行结果与我们预想的不一样的原因。
这种情况下,我们一般会想到在局部变量窗口查看不同时期的变量的值。但是如果变量一多起来呢,我们就要一个个的到局部变量列表里去找,或者鼠标在那些变量名上移来移去,这样是不是很麻烦呢?幸运的是,现在的调试器一般都带有变量监视的功能。只要我们对变量设置了监视,我们就可以实时获取变量的最新的值(当然,还是遵循在断点状态下才会更新显示变量值的原则)。
至于对被监视的变量的设置也是非常简单的,但是对被监视的变量的设置相对于断点的设置有一点不同,那就是设置被监视的变量的操作只能在程序触发断点的状态下进行,并且在 Visual Studio 中,我么设置的被监视的变量会在之后的调试例程中一直生效,当调试器运行的时候,它就会自动监视我们之前设置的被监视的变量。若要将其删除,我们就应该在监视窗口中将其删除。
说了这么多,我们就来试试在 Visual Studio 中设置被监视的变量吧。我们创建一个工程,输入下面的测试调试代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int height;
int weight;
int area;
for (;;) //进入死循环
{
//TODO:在这里插入断点
system("cls"); //调用 cmd 命令清屏
printf("面积计算器,退出请直接关闭程序!\n");
printf("请输入正方形的宽:");
scanf_s("%d", &weight);
printf("请输入正方形的高:");
scanf_s("%d", &height);
area = (height * weight);
printf("这个正方形的面积是 %d\n",area);
}
return 0;
}
我们在第十行先插入一个无条件断点,然后果断按 F5 启动调试,等待程序触发断点暂停。
这是,我们留意一下监视1窗口,可以看到,现在上面什么内容都没有,现在我们尝试监视变量 area ,我们右键单击代码中的变量名 area ,点击添加监视(W)即可,以后只要每次触发断点,监视窗口就会自动显示我们添加监视的变量。当然,前提是触发断点,可以这么说,如果我们的程序不在断点状态下,几乎全部的调试操作都是无效的。
我们看到,我们已经成功地添加了对 area 变量的监视了,但是因为 area 没有被初始化,他的值便是一串无用数值,接下来我们按 F5 让程序继续运行。
于是程序第二次触发了断点,这时我们可以看到 area 的值已经变为 25 了,我们按 Shift + F5 终止我们的调试进程,接下来我们把代码中的 area变量名全部改为 size ,我们再按 F5 进行调试,等待程序第一次触发断点:
我们看到,此时 Visual Studio 对 area 变量的监视依然存在,这时,我们在监视窗口中选中 area ,点击右键->删除监视(D) 即可删除 Visual Studio 对 area 变量的监视。