使用集成调试器:运行和断点

虽然步进stepping对于单独检查代码的每一行很有用,但在大型程序中,逐步执行代码以便达到您希望更详细检查的地方可能需要很长时间。

幸运的是,现代调试器提供了更多工具来帮助我们高效地调试程序。在本课中,我们将介绍一些调试器功能,可以让我们更快速地导航我们的代码。

运行到光标(Run to cursor)

第一个有用的命令通常称为“运行到光标”。这个“运行到光标”命令执行程序,直到执行到由光标选中的语句为止。然后它将控制权返回给您,以便您可以从那一点开始调试。这是一种高效的方法,可以从代码中的特定位置开始调试,或者如果已经在调试中,可以直接移动到您想要进一步检查的某个地方。”

对于Visual Studio用户

在Visual Studio中,可以通过右键单击代码中的语句,然后从上下文菜单中选择“运行到光标”,或者按下Ctrl-F10键组合来访问“运行到光标”命令。

对于Code::Blocks用户

在Code::Blocks中,可以通过右键单击代码中的语句,然后从上下文菜单中选择“运行到光标”,或者从“调试”菜单中选择“运行到光标”,或者按下F4快捷键来访问“运行到光标”命令。

对于VS Code用户

在VS Code中,可以在调试程序时右键单击代码中的语句,然后从上下文菜单中选择“运行到光标”来访问“运行到光标”命令。

示例:

#include <iostream>

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

int main()
{
    printValue(5);

    return 0;
}

只需右键单击第5行上的任何位置,然后选择“运行到光标”。

使用集成调试器:运行和断点

你会注意到程序开始运行,执行标记移动到你刚刚选择的行。你的程序已执行到这个点,现在正在等待你的进一步调试命令。从这里,你可以逐步执行程序,运行到不同的位置,等等。

如果你将光标设置到一个不执行的位置,”run to cursor”将简单地运行你的程序直到终止。

继续continue

一旦你处于调试会话中,你可能只想从当前位置继续运行程序。最简单的方法是使用”continue”命令。”continue”调试命令会继续正常运行程序,直到程序终止,或者直到某事触发控制再次返回给你(比如断点,我们稍后在本课程中会讨论)。

对于Visual Studio用户

在Visual Studio中,你可以在调试程序时使用“Debug”菜单中的“Continue”命令,或者按下F5快捷键。

对于Code::Blocks用户

在Code::Blocks中,你可以在调试程序时使用“Debug”菜单中的“Start / Continue”命令,或者按下F8快捷键。

对于VS Code用户

在VS Code中,你可以在调试程序时使用“Run”菜单中的“Continue”命令,或者按下F5快捷键。

让我们测试一下continue命令。如果你的执行标记不在第5行,请运行到光标到第5行。然后从这个点选择continue。你的程序将继续执行,然后终止。

开始start

continue命令有一个双胞胎兄弟叫做startstart命令执行的动作与continue相同,只是从程序的开头开始。只能在尚未处于调试会话中时调用。

对于Visual Studio用户

在Visual Studio中,可以通过”调试”菜单 > “开始调试”或按下快捷键F5来访问”开始”命令。

对于Code::Blocks用户

在Code::Blocks中,可以在不调试程序时通过”调试”菜单 > “开始/继续”或按下快捷键F8来访问”开始”命令。

对于VS Code用户

在VS Code中,可以在不调试程序时通过”运行”菜单 > “开始调试”或按下快捷键F5来访问”开始”命令。

如果你在上面的示例程序上使用”开始”命令,它将一直运行到结束(除了在VS Code中,因为我们在前面的课程中设置了stopAtEntry: true)。尽管这可能看起来不起眼,这只是因为我们还没有告诉调试器中断程序。我们将在下一节更好地利用这个命令。

断点Breakpoints

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

对于Visual Studio用户

在Visual Studio中,您可以通过”调试”菜单 > “切换断点”来设置或移除断点,或者右键单击语句并从上下文菜单中选择”切换断点”,或者按下快捷键F9,或者单击行号左侧(在浅灰色区域)来设置或移除断点。

对于Code::Blocks用户

在Code::Blocks中,您可以通过”调试”菜单 > “切换断点”来设置或移除断点,或者右键单击语句并从上下文菜单中选择”切换断点”,或者按下快捷键F5,或者单击行号右侧来设置或移除断点。

对于VS Code用户

在VS Code中,您可以通过”运行”菜单 > “切换断点”来设置或移除断点,或者按下快捷键F9,或者单击行号左侧来设置或移除断点。

当您设置断点时,将会看到一种新的图标出现。Visual Studio使用红色圆圈,Code::Blocks使用红色八边形(类似于停车标志)

使用集成调试器:运行和断点

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

然后,选择”开始”命令,让调试器运行您的代码,让我们看看断点是如何工作的。您会注意到,调试器不会一直运行到程序的末尾,而是会在断点处停下来(执行标记位于断点图标的上方):

使用集成调试器:运行和断点

断点比“运行到光标”有一些优点。首先,每次遇到断点时,它都会使调试器将控制返回给您(与“运行到光标”不同,它每次被调用时只会运行到光标一次)。其次,您可以设置一个断点,它将一直存在,直到您将其删除,而对于“运行到光标”,您必须在每次调用该命令时找到要运行到的位置。

请注意,放在不在执行路径中的代码行上的断点不会导致调试器停止执行代码。

让我们看一个稍微修改过的程序,以更好地说明断点和“运行到光标”的区别:

#include <iostream>

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

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

    return 0;
}

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

接下来,在第 5 行上设置一个断点,然后选择“开始”。程序将在第 5 行停下。现在选择“继续”。程序将在第 5 行停下第二次。再选择“继续”,它将第三次停在第 5 行。再选择“继续”,程序将终止。您可以看到断点导致程序停止的次数与该行执行的次数相同。

设置下一个语句

还有一个不太常用但仍然值得了解的调试命令,即“设置下一个语句”,即使您不经常使用它,至少还值得了解,因为它可以用于将执行点更改为其他语句(有时非正式地称为跳跃)。这可用于将执行点向前跳跃,跳过一些本来要执行的代码,或向后跳跃,使已执行的代码再次运行。

对于 Visual Studio 用户

在 Visual Studio 中,您可以右键单击语句并选择上下文菜单中的“设置下一个语句”,或按下 Ctrl-Shift-F10 快捷键组合来跳跃执行点。此选项是上下文相关的,仅在调试程序时出现。

对于 Code::Blocks 用户

在 Code::Blocks 中,您可以通过“调试”菜单中的“设置下一个语句”或右键单击语句并选择上下文菜单中的“设置下一个语句”来跳跃执行点。Code::Blocks 没有此命令的键盘快捷键。

对于 VS Code 用户

在 VS Code 中,您可以右键单击语句并选择上下文菜单中的“跳到光标”。此选项是上下文相关的,仅在调试程序时出现。

示例:

#include <iostream>

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

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

    return 0;
}

首先,运行到光标到第11行。在这一点,您应该在控制台输出窗口中看到值为5。

现在,右键单击第12行,然后选择“设置下一个语句”。这将导致跳过并不执行第11行。然后选择“继续”以完成执行您的程序。

您的程序的输出应如下所示:

5
7

我们可以看到printValue(6)被跳过了。

这个功能在多种情况下都很有用。

在我们探讨基本调试技术时,我们讨论了通过注释函数来确定该函数是否在引发问题方面发挥作用。这需要修改我们的代码,并记得以后取消注释函数。在调试器中,没有直接跳过函数的方法,所以如果您决定要这样做,使用“设置下一个语句”来跳过函数调用是最简单的方法。

倒退跳转也可以在我们想观察刚执行的函数再次运行的情况下非常有用,这样我们就可以看到它在做什么。

使用上面相同的代码,运行到光标到第12行。然后在第11行上设置下一个语句,然后继续。程序的输出应该是:

5
6
6
7

结论

您现在已经学会了如何使用集成调试器来观察和控制程序的执行方式。虽然这些命令对于诊断代码流程问题(例如确定某些函数是否被调用)很有用,但它们只是集成调试器提供的好处的一部分。在下一课中,我们将开始探讨其他检查程序状态的方式。

原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/using-an-integrated-debugger-running-and-breakpoints/

(0)
上一篇 1天前
下一篇 2023年9月30日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注