
1.2.3 C-Free环境下的程序调试
学会调试程序是编程学习过程中非常重要的内容。如何快速地定位问题和调试的思路在前面的内容已经有叙述,这里主要介绍在C-Free中的具体调试过程。程序在正常运行的情况下,运行速度非常快,程序员只能通过输入和输出推测运行的过程。在这种情况下,程序员往往只能看到出现问题的结果,很难发现程序出现问题的原因。而从工程应用的角度来分析,程序出现问题(Bug)的时候又需要程序员找到出现问题的原因并进行修改。在这种情况下就需要使用调试的功能,调试的本质就是让程序运行的速度“慢下来”,并在程序员的控制下进行“慢速”运行。这样程序员就可以观察程序运行的过程和变量。在C-Free中调试的主要步骤有4个,具体内容和先后顺序如下所述。
(1)设置程序暂停(中断)的地方。该功能主要通过断点的设置来实现。
(2)启动调试模式。该功能让程序开始运行,并暂停在程序运行到的第一个断点处。
(3)根据实际需要,控制程序的慢速运行,用到的主要功能:单步进入、下一步、跳过、跳出、运行到光标处。
(4)查看程序运行到当前状态的各个变量的值,并在第(3)步和第(4)步之间进行循环。如果不再进行调试则可以结束调试。查看各个变量的值用到主要功能:环境窗口、查看/修改、监视窗口、查看窗口等。
请读者在多实践的基础上理解C-Free提供的调试功能,下面结合一个简单的例子,详细介绍C-Free的调试功能。
【例1-5】请结合例1-2的程序,进行调试功能的学习。
(1)根据例1-4的步骤,实现例1-2的代码输入。
(2)断点的设置。设置断点,最方便快捷的方法是将鼠标移到代码区中某一条代码的左边装订区,然后单击,看到红色断点即设置完成。图1.19所示为在第7行和第15行处各设置了一个断点。设置断点,也可以先将光标点定位到想要设置的行,然后单击工具栏上的“设置/取消断点”按钮,如图1.20所示。对于已经设置断点的行,对该行重复进行上面的设置断点的操作,将取消断点。

图1.19 断点设置示意图

图1.20 断点设置工具栏图
(3)断点管理。单击“调试”菜单,选择“断点管理”命令,弹出如图1.21所示对话框。程序员可以对断点进行简单的管理。单击“取消所有断点”按钮,取消所有设置的断点。选中一个断点,单击“取消断点”按钮,则取消该选中断点。选中一个断点,单击“查看”按钮,则编辑区的光标跳到该断点所在的行。

图1.21 断点管理设置
(4)条件断点。条件断点可以为断点设置条件。断点的条件是一个布尔表达式。当程序运行到条件断点,这个条件表达式被测试,若它的值为true,程序停在这个断点处;若值为false,程序继续运行,并不在这个断点停止。选中一个断点,在“断点条件”下面的编辑框输入作为条件的布尔表达式,然后单击“设置”就完成断点条件的设置。条件断点经常用在循环体里面的调试。图1.22表示在第7行设置一个断点,并设置断点条件为“a==2”。当运行到这个断点时,如果a的值为2则程序运行到此处会暂停在这个断点,否则在不会暂停在这个点。

图1.22 条件断点设置图
(5)开始调试。单击“调试”菜单下的“开始调试”命令可以开始调试,如图1.23所示。程序只有以“Debug”方式构建,才能够被调试。一旦程序开始调试,C-Free会自动显示“调试工具栏”,如图1.24所示。

图1.23 开始调试界面

图1.24 调试工具栏
(6)退出调试。一旦程序处于调试状态,可以单击调试工具栏上的“结束调试”按钮或“调试”菜单下的“结束调试”命令,程序退出调试状态,回到编辑状态,如图1.25所示。

图1.25 选择“结束调试”命令
(7)单步进入。当程序处于调试状态,并停在某个断点处,如果该断点处的语句是一条函数调用,单击调试工具栏上的“单步进入”按钮或“调试”菜单下的“单步进入”命令,程序将进入这个函数,可对这个函数进行调试。例如,对于本例题的程序,在第7行和15行设置断点,然后开始调试程序,程序在第7行停止,如图1.26所示。单击“调试”菜单下的“单步进入”命令,程序进入max()函数,如图1.27所示。

图1.26 调试界面

图1.27 进入函数调试界面
(8)当程序处于调试状态,并停在某个断点处时,单击调试工具栏上的“跳过”按钮或“调试”菜单下的“跳过”命令,程序执行到下一条语句。例如,对于图1.26的程序状态,单击“跳过”按钮,程序将在停在第8行,如图1.28所示。

图1.28 跳到断点下一行语句
(9)跳出。当程序停在某个函数内部时,单击调试工具栏上的“跳出”按钮,程序运行至从这个函数返回。对于图1.27的运行状态,单击“跳出”按钮,程序将从max()函数处返回,回到主函数。
(10)运行到光标处。当程序处于调试状态,并停在某个断点处,将光标定位到某条语句处,然后单击“运行到光标处”按钮,程序将运行到光标所在行。
(11)环境窗口。当程序处于调试停止状态时,环境窗口将显示当前运行环境下,所有局部变量的值。例如,当程序暂停在第7行的调试状态的时候,有3个局部变量和一个数组,环境窗口如图1.29所示。

图1.29 环境变量界面
(12)察看/修改。在环境窗口中右击某一条局部变量信息,将弹出如图1.30所示的菜单。选择“察看/修改”命令,对于数组、结构或者类变量,将显示“察看”窗口;对于其他变量,将显示“修改”窗口。双击某一条局部变量信息,也可以实现同样的功能。例如,对于图1.29的局部变量,双击“myData”,由于myData是数组,因此将显示“察看”窗口,如图1.31所示。对于图1.29的局部变量a,双击后将显示“修改”窗口,如图1.32所示。在“修改”窗口中,可以对变量进行修改。

图1.30 察看/修改环境变量界面

图1.31 环境数组变量察看界面

图1.32 变量修改界面
(13)监视窗口。单击“调试”菜单下的“开始调试”命令,打开如图1.33所示的“监视”窗口。右击“监视”窗口,弹出菜单,选择“添加监视”命令,弹出如图1.34所示的对话框。在文本框输入需要观察的表达式,就可以实时地观察这个表达式。添加如图1.34的监视后,监视窗口如图1.35所示。

图1.33 监视窗口

图1.34 添加监视窗口

图1.35 添加监视后的窗口