在调试程序的过程中,如果程序在某个位置挂起执行(例如:中断到某个断点),通常我们希望能够通过一些工具观察程序的当前状态。其中,最重要的当属查看程序中数据的值。例如,查看某个变量的类型和值、某个寄存器的值、或某段内存的值。所以,几乎所有的调试器提供了大量用于检查和修改程序数据的工具。 表 1列出了Visual Studio所提供的用于检查和修改程序数据的工具。
表 1 Visual Studio提供的数据检查和修改工具列表
工具名称 |
描述 |
“局部变量”窗口 | 用于显示对于当前上下文或范围来说位于本地的变量。 通常,这是当前正在执行的过程或函数。 调试器自动填充此窗口。 |
“自动” 窗口 | 用于显示在当前代码行和上一代码行中使用的变量。 对于C++程序,“自动”窗口还会显示函数返回值。 与“局部变量”窗口类似,“自动”窗口是由调试器自动填充的。 |
“监视”窗口 | 在“监视”窗口中可以添加要监视其值的变量。 此外,还可以添加调试器所能识别的任何有效表达式。 |
“快速监视”对话框 | “快速监视”对话框在概念上类似于“监视”窗口,但是“快速监视”每次只能显示一个变量或表达式。 如果需要快速查看变量或表达式而不想打开“监视”窗口,则可以使用“快速监视”。 |
“寄存器”窗口 | “寄存器”窗口用于显示寄存器内容,只有在程序正在运行或处于中断模式时“寄存器”窗口才会显示。 为了减少混乱,“寄存器”窗口将寄存器组织成组,具体情况随平台和处理器类型的不同而不同。右击“寄存器”窗口,可以看到一个包含组列表的快捷菜单,可根据需要显示或隐藏它。 |
“内存”窗口 | 使用“内存”窗口可以看到应用程序所占用的内存空间的情况。 在“监视”窗口、“快速监视”、“自动”窗口和“局部变量”窗口中都可看到内存中特定位置初变量的内容,但在“内存”窗口中可看到尺寸较大的图像。 这对于检查大片的数据(如缓冲区和大的字符串)很方便,在其他窗口中显示就不太好。 但是,“内存”窗口不仅限于显示数据, 按照定义“内存”窗口可以显示内存空间中的任何内容,无论它是数据、代码或是未分配内存中的无用随机位。 |
数据提示 | 数据提示是用于在调试过程中查看程序中的变量和对象的有关信息的最方便工具之一。 在调试器处于中断模式时,可以在当前范围内查看变量的值,方法是将鼠标指针置于源窗口中的变量上。 |
可视化工具 | 通过可视化工具可以以有意义的方式查看对象或变量的内容。 例如,可以使用 HTML 可视化工具来查看 HTML 字符串,因为这样可以解释该字符串并在浏览器中显示出来。 您可以通过数据提示、“监视”窗口、“自动”窗口、“局部变量”窗口或“快速监视”对话框来访问可视化工具。 |
下面,让我们通过一些示例来看看如何使用这些工具来检查和修改数据。
观察变量值的变化
给定清单1所示的程序,我们希望查看变量sum值的变化,从而验证程序的逻辑是否正确。
-----------------------------------------------------
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int sum = 0;
for (int i = 1; i <= 10; ++i)
sum += i;
cout << "1 + 2 + 3 +... + 10 = " << sum << endl;
return 0;
}
清单1 观察变量值的变化代码示例
---------------------------------------------------------最直接的方法就是在“sum += i”所在行设置一个断点,让程序反复中断到该断点。这时,我们可以通过“局部变量”窗口、“自动” 窗口、“监视”窗口、“快速监视”对话框、或数据提示来观察变量sum值的变化。对于“局部变量”窗口、“自动” 窗口、“监视”窗口来说,每一次变量的值发生改变,Visual Studio会使用红色的字体标记这种变化。图 1~图 5显示了在i等于5的时,通过“局部变量”窗口、“自动” 窗口、“监视”窗口、“快速监视”对话框、和数据提示显示sum的值。
图 1 使用“局部变量”窗口观察变量
图 2 使用“自动” 窗口观察变量
图 3 使用“监视”窗口观察变量
图 4 使用数据提示观察变量
图 5 使用“快速监视”对话框观察变量
虽然这种方法虽然比较直接,但是并不方便,因为我们不得不让程序不断地中断到“sum += i”所在行。清单 1所示的程序中循环只执行了10次,如果是100次或1000次,你肯定就会想有没有更好的办法了。
当然有更好的办法了。我们可以使用跟踪点来解决这个问题。在“sum += i”所在行,选择快捷菜单“断点”->“插入跟踪点”,就会出想如图 6所示的对话框。然后,选择“打印消息” 复选框,然后在相应的文本框中输入消息文本“i={i}, sum={sum}”({x}代表x的值)。那么,每到程序运行到跟踪点所在行时,就会在“输出”窗口中打印该消息。
图 6 使用跟踪点观察变量值的变化
有个这个跟踪点,你就不必不断地中断程序。在一次性执行完成清单 1中的for之后,“输出”窗口中就会显示如清单 2所示的结果。我们可以非常清晰地看到每次变量sum值的变化。
-------------------------------------------------------