章节目录

监视变量

本节阅读量:

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

根据前面的课程,我们这里的示例将使用VisualStudio——如果您使用的是不同的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 调用堆栈

下一节