章节目录

监视变量

本节阅读量:

在前面的课程中,您学习了如何使用调试器监视程序的执行路径。然而,跟踪执行路径只是调试器功能的一半。调试器还允许您在执行代码时检查变量的值。

根据前面课程的惯例,我们这里的示例将使用 Visual Studio——如果您使用的是其他 IDE 或调试器,命令的名称可能略有不同,或者位于不同的位置。


监视变量

监视变量是在程序以调试模式执行时检查变量值的过程。大多数调试器提供了几种方法来实现这一点。

让我们来看一个示例程序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>

int main()
{
	int x{ 1 };
	std::cout << x << ' ';

	x = x + 2;
	std::cout << x << ' ';

	x = x + 3;
	std::cout << x << ' ';

	return 0;
}

这是一个非常简单的示例程序——它打印数字1、3和6。

首先,使用"运行到光标"到第6行。

运行到第六行

此时,变量x已经创建并用值1初始化,因此当我们检查x的值时,会看到值1。

检查简单变量(如 x)的值的最简单方法是将鼠标悬停在变量 x 上。一些现代调试器支持这种方式,这也是最直接的方法。

将鼠标光标悬停在第6行的变量x上,您应该会看到如下内容:

检查变量x的值

注意,您可以将鼠标悬停在任何出现的变量 x 上,而不仅仅是当前行上的。例如,如果将鼠标悬停在第12行的 x 上,我们会看到相同的值:

检查变量x的值

如果使用Visual Studio,也可以使用QuickWatch。用鼠标高亮显示变量名x,然后从右键单击菜单中选择“QuickWatch”。

快速查看

这将弹出一个包含变量当前值的子窗口:

快速查看

现在,让我们在逐步执行程序的过程中观察这个变量的变化。选择 step-over 两次,或使用"运行到光标"到第9行。此时变量 x 应该具有值 3。请检查并确认其正确!

检查变量x的值

变量监视窗口

如果您只是想查看变量在某个特定时间点的值,使用鼠标悬停或 QuickWatch 方法就可以了,但它不太适合在运行代码时持续观察变量值的变化,因为您必须不断地重新悬停或重新选择变量。

为了解决这个问题,所有现代集成调试器都提供了另一个功能,称为监视窗口。监视窗口是一个可以添加您想要持续观察的变量的窗口,在您单步执行程序时,这些变量的值会自动更新。当您进入调试模式时,监视窗口可能已经显示在屏幕上了;如果没有,可以通过 IDE 的窗口命令(通常在”视图”或”调试”菜单中)将其打开。

您现在应该看到这样的内容:

监视窗口

监视窗口可能已经包含也可能不包含任何内容。

通常有两种不同的方法可以将变量添加到监视窗口:

  1. 在监视窗口最左列的输入框中输入您想监视的变量名。
  2. 在代码窗口中,右键单击变量,选择”Add Watch”。

如果您尚未处于执行标记位于第9行的调试会话中,请启动一个新的调试会话,并使用”运行到光标”到第9行。

现在,将变量”x”添加到监视列表中。您应该会看到:

监视窗口查看变量x

现在单步执行两次,或者使用”运行到光标”到第12行,您应该会看到 x 的值从 3 变为 6。

超出作用域的变量(例如,已经返回给调用者的函数中的局部变量)将保留在监视窗口中,但通常会标记为”不可用”,或者可能显示最后一个已知值并变为灰色。如果变量重新回到作用域(例如,该函数再次被调用),其值将重新显示。因此,即使变量超出了作用域,您也可以将它们保留在监视窗口中。

使用监视窗口是在单步执行程序时观察变量值随时间变化的最佳方法。


在监视的变量上设置断点

一些调试器允许您在监视的变量上设置断点,而不是在某一行代码上设置。这样,当该变量的值发生变化时,程序就会暂停。

例如,在上面的程序中对变量 x 设置这样的断点,将导致调试器在执行第8行和第11行(即 x 的值发生变化的地方)之后暂停。


监视窗口也可以计算表达式

监视窗口还允许您计算简单的表达式。如果还没有的话,请先使用"运行到光标"到第12行。然后尝试在监视窗口中输入 x+2,看看会发生什么(它的计算结果应该是 8)。

您还可以在代码中高亮选中一个表达式,然后通过鼠标悬停或右键菜单将其添加到监视窗口来检查该表达式的值。


局部变量监视

由于在调试时检查函数内局部变量的值是很常见的需求,因此许多调试器提供了某种方法来快速查看当前作用域内所有局部变量的值。

如果您只是想查看局部变量的值,请先查看局部变量窗口,它可能已经显示在界面上了。


3.6 断点

上一节

3.8 调用堆栈

下一节