单步调试是调试程序十分有用的方法,你可以逐行执行程序并查看变量的值。然而这一高效的方法并非在每个学校的编程课上都会教学。尤其是对于非计算机专业的学生,单步调试更可能闻所未闻,大大增加了调试程序的难度。本文旨在大致介绍单步调试所包含的内容和操作方法。

一些提示与准备

提示:在本文中提到的开发环境一词可以理解为你编程使用的软件

在某些开发环境(如CodeBlock)下,尽管你可以在不创建项目的情况下编译代码,但是你仍然需要创建项目才能使用调试工具。

在大多数开发环境下,你可以点击最上方的调试 (Debug)选项卡(可能会是不同的名字)上看到本文接下来会提到的操作对应的按键。熟练掌握快捷键会大幅度提高操作的效率。

图中从左向右分别展示了Visual Studio 2019, Visual Studio Code 与 Codeblock的菜单

单步调试的操作在绝大多数的开发环境下都大同小异,且与使用的编程语言无关。因此本指南使用Visual Studio 2019开发环境,C++语言作为演示。

断点 (Breakpoint)

顾名思义,断点可以理解为是一个可以打在代码某一行上的点。在调试模式下,当程序运行到断点所在行时,程序就会暂停。

如下图所示,断点可以通过点击代码行数附近的位置来创建。

图中从左向右分别展示了在Visual Studio 2019, Visual Studio Code 与 Codeblock中创建断点的方法

在调试模式下,当程序运行到断点所在行时,程序就会暂停。此时,你可以寻找一个显示变量的窗口,并在其中查看局部变量的值。你也可以在监视窗口你可以手动输入变量名,并查看它的值。在调试过程中,你可以通过这个来发现哪些变量的值与你的想法不符。假如你没有找到这个窗口,你可以尝试搜索关键词你使用的开发环境监视窗口单步调试中查看变量的值等。

你可以在图中的黄色区域查看变量的值

图中展示了如何在监视窗口手动查看变量的值

逐语句与逐过程 (Step Into & Step Over)

提示:假如你还没有学习编程中有关函数的知识,你可以暂时将逐语句与逐过程看成是一样的
在不同开发环境下,逐语句和逐过程的表达方式可能不同,如:在Codeblock中逐过程 (Step Over) 对应的表达为Next Line

逐语句逐过程的作用都可视作为:运行黄色箭头所在行,并将黄色箭头下移。

如图所示,在按下"逐语句"或"逐过程"对应的按键后,左边的黄色箭头从第18行移动到了第19行,且下方变量窗口中n的值发生了变化,这是由于赋值语句(第18行)被执行了

让我们再次按下逐语句逐过程对应的按键,可以发现在本行的黄色箭头消失了。这是因为第19行是输入语句,当我们转到控制台窗口输入数据之后,黄色箭头将会再次出现。

如图所示,黄色箭头消失了

那么逐语句逐过程的区别是什么呢?当我们运行到第21行时就可以发现,若使用逐语句(Step Into)则会进入函数体,而使用逐过程(Step Over)则不会进入。

提示:绝大部分的开发环境在使用"逐语句"操作时不会进入库函数体,如:输入,输出函数。但不排除某些开发环境会这么做,遇到这种情况只需不断按"逐过程"直到函数执行完成后即可。
左图中在21行执行逐语句后进入了函数体func01;右图中则没有

跳出 (Step Out)

在调试模式下,再次打开Visual Studio的调试选项卡,我们可以发现有了更多的选项,而跳出是其中之一。在检查完一个函数后,跳出可以帮助我们便捷地跳出函数体,而不需要手动运行完整个函数。若我们在上一步进入了函数体内部,则可以通过跳出来回到第22行。

在左图情景中按下"跳出"所对应的按键就会跳出函数体,来到22行

继续 (Continue)

我们也可以找到继续选项。可以猜到,当我们按下继续选项后,程序就会继续运行直到遇到下一个断点。假如没有遇到断点,那么程序就会运行完成。

如图,程序中有两个断点,分别在func01与func02函数体中。在func01函数体中按下"继续"对应的按键,程序就会继续运行,直到遇到在func02函数体中的断点。假如此时再次按下"继续",则程序会运行结束。

结语

以上就是单步调试的常用操作。单步调试十分重要也十分有用,请务必多多练习,直到熟练掌握。
许多开发环境还配备了一些特殊功能,如条件断点,设置断点命中次数等。你可以通过在搜索引擎中搜索关键词你使用的环境 单步调试来更好地了解自己使用的工具。