3-8 使用集成调试器:监视变量
在之前的课程(3.6——使用集成调试器:单步执行与3.7——使用集成调试器:运行与断点)中,您已学会如何使用调试器观察程序的执行路径。然而,单步执行程序仅是调试器实用性的半数功能。调试器还允许你在逐步执行代码时检查变量值,且无需修改代码。
与前几课相同,本节示例将使用Visual Studio——若你使用其他IDE/调试器,命令名称或位置可能略有差异。
警告
若需返回调试界面,请确保项目采用调试构型进行编译(详见0.9节——配置编译器:构型设置)。若使用发布构型编译项目,调试器功能可能无法正常运作。
监视变量
监视变量Watching a variable是指在程序以调试模式运行时检查变量值的过程。大多数调试器都提供了多种实现方式。
让我们看一个示例程序:
#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 上。某些现代调试器支持这种检查简单变量的方法,这也是最直接的方式。
对于 Code::Blocks 用户
若您使用 Code::Blocks,此选项默认状态下(令人费解地)处于关闭状态。请按以下步骤启用:首先进入菜单栏的「设置」>「调试器...」,在 GDB/CDB 调试器节点下选择「默认配置文件」,最后勾选标有「在光标下评估表达式Evaluate expression under cursor」的复选框。
将鼠标光标悬停在第6行的变量x上,您应该会看到类似以下内容:

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

若您使用的是 Visual Studio,也可使用快速查看功能。用鼠标选中变量名 x,然后从右键菜单中选择“快速查看”。

这将弹出一个子窗口,显示该变量的当前值:

如果你打开了QuickWatch,请先关闭它。
现在让我们在逐步执行程序时观察这个变量的变化。你可以选择两次步过,或者运行到光标所在的第9行。此时变量x的值应为3。检查它并确保确实如此!

监视窗口
若需了解变量在特定时刻的值,使用鼠标悬停或快速监视功能均可满足需求。但当需要实时观察变量在代码运行过程中的变化时,这些方法便显得不够理想——因为您必须不断重新悬停/选择目标变量。
为解决此问题,所有现代集成调试器均提供名为“监视窗口watch window”的特性。该窗口可添加需持续监控的变量,这些变量将在程序逐步执行时实时更新。进入调试模式时监视窗口可能已显示在屏幕上,若未显示,可通过IDE的窗口命令调出(通常位于“视图”或“调试”菜单中)。
对于 Visual Studio 用户
在 Visual Studio 中,监视窗口位于“调试”菜单 > “窗口” > “监视” > “监视 1”。请注意,此选项需在调试模式下启用,因此请先进入程序调试状态。
该窗口的显示位置(左侧、右侧或底部停靠)可能有所不同。您可通过将“监视 1”标签拖拽至应用程序窗口的任意侧边来调整停靠位置。
对于 Code::Blocks用户
在Code::Blocks中,监视窗口位于调试菜单 > 调试窗口 > 监视器。该窗口通常以独立窗口形式显示,可通过拖拽将其停靠至主窗口。
对于 VS Code用户
在VS Code中,监视窗口于调试模式下显示,默认停靠在调用堆栈上方左侧区域。
现在你应该看到类似这样的内容:

监视窗口可能已包含内容,也可能尚未包含任何内容。
通常有两种方式向监视窗口添加变量:
- 打开监视窗口,在窗口最左侧列输入要监视的变量名称。
- 在代码窗口中,右键单击要监视的变量,选择“添加监视”(Visual Studio)或“监视 x”(将 x 替换为变量名称)(Code::Blocks)。
若当前未处于调试会话且程序执行标记未停在第9行,请启动新调试会话并将光标移至第9行。
现在将变量“x”添加至监视列表,您应看到如下内容:

现在执行两次单步跳过,或运行至光标所在的第12行,您会看到x的值从3变为6。
超出作用域的变量(例如函数内部的局部变量,该函数已返回至调用方)仍会保留在监视窗口中,但通常会被标记为“不可用”,或显示最后已知值但呈灰色。若变量重新进入作用域(例如函数再次被调用),其值将重新显示。因此即使变量已超出作用域,仍可将其保留在监视窗口中。
在逐步执行程序时,使用监视功能是观察变量随时间变化的最佳方式。
在监视变量上设置断点
某些调试器允许您在监视变量而非代码行上设置断点。这将使程序在该变量值发生变化时停止执行。
例如,在上述程序的变量 x 上设置此类断点,将导致调试器在执行完第 8 行和第 11 行(即 x 值被修改的位置)后暂停。
对于 Visual Studio 用户:
在 Visual Studio 中,请确保您的变量处于监视状态。随后逐步执行程序,转到监视窗口。右键单击该变量,选择“值改变时中断”。
每次启动调试会话时,您都需要重新启用“值改变时中断”功能。
监视窗口也可求值表达式
监视窗口同样支持评估简单表达式。若尚未操作,请将光标移至第12行。随后尝试在监视窗口输入x + 2并观察结果(应评估为8)。
您还可在代码中选中某个表达式,通过悬停查看其值,或通过右键上下文菜单将其添加到监视窗口进行检查。
警告
监视表达式中的标识符将按其当前值进行评估。若需了解代码中表达式实际评估的值,请先将光标移至该表达式处,确保所有标识符均采用正确值。
局部变量监视
由于在调试过程中检查函数内部局部变量的值很常见,许多调试器会提供某种方式快速监视作用域内所有局部变量的值。
对于 Visual Studio 用户
在 Visual Studio 中,您可在“局部变量”窗口查看所有局部变量的值,该窗口位于“调试”菜单 > “窗口” > “局部变量”。请注意必须处于调试会话中才能激活此窗口。
对于 Code::Blocks用户
在Code::Blocks中,此功能集成于“监视”窗口的“局部变量”节点下。若未显示变量,可能是变量不存在或需展开该节点。
对于 VS Code 用户
在 VS Code 中,局部变量值显示于调试模式下左侧停靠的 VARIABLES 区域。可能需要展开 Locals 节点。
若仅需查看某个局部变量的值,请优先检查 Locals 窗口,该变量值通常已显示其中。


浙公网安备 33010602011771号