3-7 使用集成调试器:运行与断点(todo)
虽然逐步执行(详见第3.6节——使用集成调试器:单步执行)有助于单独检查代码中的每行代码,但在大型程序中,逐步执行代码可能需要很长时间才能到达需要详细检查的位置。
所幸现代调试器提供了更多工具来帮助我们高效调试程序。本节将介绍若干调试器功能,助我们更快速地浏览代码。
运行至光标
首个实用命令通常称为“运行至光标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行任意位置单击鼠标右键,然后选择“运行至光标”。

您会注意到程序开始运行,执行标记移动到您刚刚选中的行。程序已执行至此处,现在正等待您输入进一步的调试命令。从这里开始,您可以逐步执行程序、运行至光标位置跳转至其他位置等等……
若将“运行至光标”功能应用于无法执行的位置,该操作将直接运行程序直至终止。
继续
当您处于调试会话中时,可能希望从当前点开始继续运行程序。最简便的方法是使用继续命令。继续continue调试命令会让程序按常规方式继续运行,直至程序终止,或直至某些事件触发控制权返回给您(例如断点,我们将在本课后续内容中介绍)。
对于 Visual Studio 用户
在 Visual Studio 中,调试程序时可通过“调试”菜单 > “继续”访问继续命令,或按 F5 快捷键。
对于 Code::Blocks 用户
在 Code::Blocks 中,调试程序时可通过“调试”菜单 > “开始/继续”访问继续命令,或按 F8 快捷键。
对于 VS Code 用户
在 VS Code 中,调试程序时可通过“运行”菜单 > “继续”访问继续命令,或按 F5 快捷键。
让我们测试一下继续命令。如果执行标记尚未位于第5行,请将光标移至第5行。然后选择从该点继续。程序将完成执行后终止。
开始
continue 命令有一个孪生兄弟,名为 start。start 命令与 continue 执行相同操作,只是从程序开头开始执行。它只能在尚未进入调试会话时调用。
对于 Visual Studio 用户
在 Visual Studio 中,当程序未处于调试状态时,可通过调试菜单 > 开始调试访问启动命令,或按 F5 快捷键。
对于 Code::Blocks 用户
在 Code::Blocks 中,非调试状态下可通过调试菜单 > 开始/继续,或按 F8 快捷键调用启动命令。
对于 VS Code 用户
在 VS Code 中,非调试状态下可通过运行菜单 > 开始调试,或按 F5 快捷键调用启动命令。
若在上述示例程序中使用 start 命令,程序将全程运行而不中断(VS Code 除外,因我们在前一课设置了 stopAtEntry: true)。这看似平淡无奇,实则因我们尚未指示调试器中断程序。下一节我们将更有效地运用此命令。
断点
本节最后要讨论的主题是断点。断点breakpoint是一种特殊标记,它指示调试器在调试模式下运行程序时,于该断点处停止程序执行。
对于 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行。再次选择继续,程序将第三次停在该行。继续执行一次后程序终止。由此可见,断点导致程序暂停的次数与该行被执行的次数完全一致。
设置下一个语句
还有一个调试命令使用频率较低,但至少值得了解——即便你很少用到它。设置下一个语句set next statement命令允许我们将执行点切换到其他语句(有时非正式地称为跳转)。这既可用于向前跳转以跳过本应执行的代码段,也可用于向后跳转使已执行的代码再次运行。
对于 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)被跳过了。
此功能在多种场景下都可能派上用场。
在探索基础调试技巧时,我们曾讨论过通过注释掉函数来判断其是否导致问题的方法。这需要修改代码,且需记得后续取消注释。调试器中没有直接跳过函数的选项,因此若需实现此功能,使用 set next statement 跳过函数调用是最便捷的方式。
若需观察刚执行的函数再次运行以查看其行为,向后跳转同样有效。
使用上述相同代码,将光标移至第12行运行程序。随后在第11行设置下一个语句,继续执行。程序输出应为:
5
6
6
7
警告
set next语句将改变程序的执行点,但不会改变程序状态。变量将保留跳转前的值。因此跳转可能导致程序产生与预期不同的值、结果或行为。请谨慎使用此功能(尤其向后跳转)。
警告
请勿使用set next statement将执行点切换至其他函数。此操作可能导致未定义行为,并极易引发程序崩溃。
“后退”与通过“设置下一个语句”向后跳转的区别
“后退”会将所有状态回溯至原始状态,如同从未跳过该点。变量值及其他程序状态的变更均被撤销。这本质上是步进操作的“撤销”指令。
当“设置下一个语句”用于向后跳转时,仅改变执行点。变量值及其他程序状态的变更不会被撤销。
结论
您现已掌握使用集成调试器观察和控制程序执行过程的主要方法。虽然这些命令有助于诊断代码流程问题(例如判断特定函数是否被调用),但它们仅是集成调试器所能提供的部分优势。在下一课中,我们将开始探索更多检查程序状态的方法,而这些命令正是你掌握这些新技巧的必备基础。让我们继续前进吧!

浙公网安备 33010602011771号