章节目录

断点

本节阅读量:

虽然单步执行对于逐行检查代码很有用,但在大型程序中,逐行执行代码可能需要很长时间才能到达您想要详细检查的位置。

幸运的是,现代调试器提供了更多工具来帮助我们高效地调试程序。在本课中,我们将介绍一些调试器功能,它们能让我们更快地定位到想要检查的代码。


运行到光标

第一个有用的命令通常称为"运行到光标"(Run-to-cursor)。该命令会执行程序,直到执行到达光标所选择的语句,然后将控制权返回给您,以便您从该点开始调试。这为在代码中的特定位置开始调试提供了一种高效的方法;如果您已经处于调试状态,也可以用它直接跳转到想要进一步检查的位置。

让我们用之前一直使用的示例程序来演示:

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

void printValue(int value)
{
    std::cout << value << '\n';
}

int main()
{
    printValue(5);

    return 0;
}

只需右键单击第5行的任意位置,然后选择“Run to cursor”。

执行到所选位置

您会注意到程序开始运行,并在您刚才选择的那一行暂停,等待进一步的调试命令。从这里,您可以继续单步执行程序、将程序运行到其他位置,等等……

如果您选择运行到一个不会被执行到的位置,那么程序将直接运行到终止为止。


Continue

一旦您处于调试状态,可能希望让程序从当前位置继续运行。最简单的方法是使用 continue 命令。continue 命令会让程序按照正常方式继续运行,直到程序终止,或者直到触发了某个中断条件并将控制权再次返回给您(例如断点(breakpoint),我们将在本课后面介绍)。

让我们来测试一下 continue 命令。如果您的执行标记不在第5行,请先使用”运行到光标”将其定位到第5行。然后选择”继续”。您的程序将完成执行并终止。


Start

continue 命令有一个名为 start 的孪生兄弟。start 命令的功能与 continue 相同,只不过它是从程序的开头开始执行。它只能在尚未处于调试状态时调用。

如果在上面的示例程序上使用 start 命令,程序将开始运行。虽然这看起来没什么特别的,但这只是因为我们还没有告诉调试器在哪里中断程序。


断点

我们将在本节中讨论的最后一个主题是断点。断点是一种特殊的标记,它告诉调试器在以调试模式运行时,在断点所在的位置暂停程序的执行。

设置断点时,您会看到出现一种新类型的图标。在 Visual Studio 中,断点显示为一个红色圆圈。

设置断点

在第5行上设置一个断点,如上图所示。

现在,选择 Start 命令让调试器运行代码,来看看断点的实际效果。您会注意到,调试器并没有一直运行到程序结束,而是在断点处停了下来(执行标记位于断点图标的上方):

运行到断点

效果就像您使用了"运行到光标"到达了这一点一样。

与"运行到光标"相比,断点有几个优点。首先,断点会让调试器在每次执行到该位置时都暂停并将控制权返回给您(而"运行到光标"每次调用只会运行一次)。其次,设置好的断点会一直存在,直到您将其删除为止;而使用"运行到光标"时,您每次都需要重新定位要运行到的位置。

请注意,如果断点放置在不会被执行到的行上,调试器将不会暂停程序的执行。

让我们来看一个稍微修改的程序,它更好地说明了断点和运行到光标之间的区别:

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

void printValue(int value)
{
    std::cout << value << '\n';
}

int main()
{
    printValue(5);
    printValue(6);
    printValue(7);

    return 0;
}

首先,启动一个新的调试会话,然后使用”运行到光标”到第5行。现在选择”继续”。程序将继续运行到结束(它不会再次在第5行停止,即使第5行还会被执行两次)。

接下来,在第5行上放置一个断点,然后选择 Start。程序将在第5行停下来。现在选择”继续”,程序将在第5行再次停下来。再次选择”继续”,程序将第三次停在第5行。再继续一次,程序将运行完毕并终止。可以看到,断点会让程序在该行每次被执行时都停下来。


结论

现在,您已经了解了使用集成调试器来监视和控制程序执行的主要方法。虽然这些命令对于诊断代码流程问题(例如确定某些函数是否被调用)很有用,但它们只是集成调试器功能的一部分。在下一课中,我们将开始探索检查程序状态的其他方法。


3.5 使用集成调试器:单步执行

上一节

3.7 监视变量

下一节