3.8 — 使用集成调试器:观察变量

在之前的课程(3.6 — 使用集成调试器:单步执行3.7 — 使用集成调试器:运行和断点)中,您学习了如何使用调试器来观察程序的执行路径。然而,单步执行程序只是调试器有用性的一半。调试器还允许您在单步执行代码时检查变量的值,所有这些都无需修改您的代码。

与之前的课程一样,我们的示例将使用 Visual Studio — 如果您使用不同的 IDE/调试器,命令的名称或位置可能略有不同。

警告

如果您正在返回,请确保您的项目使用调试构建配置进行编译(有关更多信息,请参阅 0.9 — 配置编译器:构建配置)。如果您使用发布配置编译项目,调试器的功能可能无法正常工作。

观察变量

观察变量是在调试模式下程序执行时检查变量值的过程。大多数调试器提供多种方法来执行此操作。

让我们看一个示例程序

#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 调试器节点下,选择默认配置文件。最后,勾选标有评估光标下的表达式的框。

将鼠标光标悬停在第 6 行的变量 x 上,您应该会看到类似这样的内容

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

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

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

如果您打开了 QuickWatch,请将其关闭。

现在让我们观察这个变量在程序单步执行时的变化。选择单步跳过两次,或者运行到光标到第 9 行。变量 x 现在应该有值 3。检查它并确保它确实如此!

监视窗口

如果您想知道某个特定时间点变量的值,使用鼠标悬停或 QuickWatch 方法检查变量是可以的,但它不特别适合在运行代码时观察变量值的变化,因为您需要不断地重新悬停/重新选择变量。

为了解决这个问题,所有现代集成调试器都提供另一个功能,称为监视窗口。监视窗口是一个窗口,您可以在其中添加您希望持续检查的变量,并且这些变量将在您单步执行程序时更新。当您进入调试模式时,监视窗口可能已经在您的屏幕上,但如果它不在,您可以通过 IDE 的窗口命令将其调出(这些命令通常在“视图”或“调试”菜单中找到)。

对于 Visual Studio 用户

在 Visual Studio 中,监视窗口可以在调试菜单 > 窗口 > 监视 > 监视 1中找到。请注意,您必须处于调试模式才能启用此选项,因此请先单步调试您的程序。

此窗口出现的位置(停靠在左侧、右侧或底部)可能有所不同。您可以通过将监视 1选项卡拖到应用程序窗口的不同侧来更改其停靠位置。

对于 Code::Blocks 用户

在 Code::Blocks 中,监视窗口可以在调试菜单 > 调试窗口 > 监视中找到。此窗口可能会显示为单独的窗口。您可以通过将其拖动到主窗口来将其停靠。

对于 VS Code 用户

在 VS Code 中,监视窗口在调试模式下显示,停靠在调用堆栈左侧。

您现在应该会看到类似这样的内容

监视窗口中可能已经包含了一些内容,也可能不包含任何内容。

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

  1. 调出监视窗口,然后在监视窗口的最左侧列中输入您要监视的变量的名称。
  2. 在代码窗口中,右键单击您要监视的变量,然后选择添加监视(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 中,局部变量的值可以在调试模式下停靠在左侧的变量部分中找到。您可能需要展开局部变量节点。

如果您只是想监视局部变量的值,请先检查局部变量窗口。它应该已经存在。

guest
您的电子邮箱地址将不会被显示
发现错误?请在上方留言!
与勘误相关的评论在处理后将被删除,以帮助减少混乱。感谢您帮助使网站对每个人都更好!
来自 https://gravatar.com/ 的头像与您提供的电子邮箱地址相关联。
有回复时通知我:  
164 条评论
最新
最早 最多投票
内联反馈
查看所有评论