Python全案例学习与实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 IDLE的程序调试功能

2.4.1 两种调试方法

在软件开发过程中,总免不了出现这样或那样的错误。在这些错误中,有些是属于语法方面的,有些是属于逻辑方面的。对于语法错误,Python解释器能轻而易举地将它们检测出来。因此,如果程序中存在语法错误,那么Python会停止运行程序并给出错误提示。而对于逻辑错误,Python解释器是无能为力的。如果程序中存在逻辑错误,那么虽然程序可以被运行,但是会出现死机或抛出异常的问题。显然,在这样的情况下,程序的运行结果一定是错误的。面对逻辑错误,最简单而可靠的解决方法就是对程序进行调试,也就是常说的“Debug”。

单词debug可以被分为两部分——de和bug,将两者合在一起,就是找出臭虫的意思;在计算机领域,被引申为发现错误的“调试”。

调试程序的方法有很多,有些需要借助工具,而有些需要借助程序开发者的经验。当然,经验是在长期的调试过程中积累起来的。

1.经验调试法

最简单的调试方法是直接显示程序运行中的有关数据,这是一种基于经验的调试方法。例如,可在某些关键位置用print()语句显示有关变量的值,然后通过输出值与期望值的对比,确定当前程序段有没有出错。该方法最大的问题是,开发者必须在所有可疑的地方插入print()语句,但是由于它们本身不是程序的真正代码,所以,等到程序被调试完后,还必须将这些打印显示语句全部清除。尽管如此,笔者还是非常喜欢这种方法,虽然比较烦琐,但是很管用,而且是人人学得会的调试方法。

2.工具调试法

除经验调试法外,还可以使用调试器进行调试。借助调试器,可分析被调试程序的数据,同时监视程序的运行流程。调试器通常具有暂停程序运行、检查和修改变量、调用方法而不更改程序代码等功能。

与大多数集成开发环境相似,IDLE也提供了一个调试器,它所具有的程序调试功能也可帮助开发者比较方便、快速地查找逻辑错误。

2.4.2 在Shell模式下的程序调试

在【Python Shell】窗口中选择【Debug】→【Debugger】命令,如图2-25所示,即可启动IDLE的交互式调试器。此时,IDLE会打开【Debug Control】窗口,并在【Python Shell】窗口中输出“[DEBUG ON]”,后跟一个“>>>”提示符,如图2-26所示。可像正常情况那样使用【Python Shell】窗口,只不过在调试状态下输入的任何命令都处于调试模式。借助调试器,可在【Debug Control】窗口的【Locals】下查看局部变量的值及与程序运行有关的其他内容。当然,为了查看全局变量,必须勾选【Globals】复选框。

图2-25 选择【Debug】→【Debugger】命令

图2-26 Debug的开关示意

如果要退出调试器,则可再次选择【Debug】→【Debugger】命令,IDLE会关闭【Debug Control】窗口,并在【Python Shell】窗口中输出“[DEBUG OFF]”。

需要注意的是,在Shell模式下,只能对语句进行编辑和调试。也就是说,只能先写一条语句,然后通过Debugger单步调试该语句。换句话说,Debug开关要被反复切换,类似于图2-27所示的效果。

图2-27 打开和关闭Debugger的界面

下面通过一个例子较为详细地讨论调试的过程。

首先,选择【Debug】→【Debugger】命令,打开Debug调试器,如图2-25所示。

在出现“[DEBUG ON]”后,在“>>>”提示符后输入待调试的语句。例如,输入如下for语句:

输入完成后,按回车键,即可进入调试状态,如图2-28所示。

图2-28 处于单步调试状态[DEBUG ON]的程序调试演示

此时,代码尚未被执行,必须通过【Debug Control】窗口中的Step、Over等单步调试命令一步一步地执行,从而得到每一步的执行结果。

这里需要说明的是:

· Step相当于Step in,即进入被调用函数或方法内部。

· Over相当于Step Over,即直接运行被调用函数或方法。

· Out相当于一次性执行该代码。

· Go相当于Out。

图2-29所示是单击【Over】按钮两次后,该代码输出的结果。

图2-29 单击【Over】按钮两次后,该代码输出的结果

通过【Debug Control】窗口中的Step、Over等单步功能,可以单步方式调试程序代码。通过查看每一步的执行结果和变量的变化,来判断、确定程序代码的正确性。单步调试是所有调试器中最为强大、最为常用的功能。

2.4.3 在Edit模式下的程序调试

进入Edit模式后,在编辑区中写入与上面一样的代码并保存,如图2-30所示。

图2-30 在Edit模式下程序的编辑输入

在Edit模式下,通过选择【Run】→【Python Shell】命令,如图2-31所示,打开Shell窗口,进入Shell模式。

图2-31 在Edit模式下选择【Run】→【Python Shell】命令

选择【Debug】→【Debugger】命令,即可进入Debug状态,如图2-32所示。

图2-32 进入Shell模式的Debug状态

然后切换回Edit模式,选择【Run】→【Run Module】命令,执行运行程序的命令,从而使IDLE正式进入Debug状态。接下来,通过【Debug Control】窗口中的各种单步调试功能来实现单步调试,它们的具体用法与在Shell模式下的用法相同。

不过,需要特别指出的是,在Edit模式下,使用Over与Step单步调试功能,一定要注意它们的区别,而这只能靠多实践才能领会。

2.4.4 断点调试

单步调试让人感觉效率低下,有时候甚至觉得无法忍受。相对而言,断点调试的效率要高很多。

所谓断点调试,就是先在程序中怀疑有问题的地方设置一个标志——断点标志,然后让程序全速运行,运行到此处,程序被暂停运行,此时,开发者可以通过程序呈现的结果(例如,某些变量的值)与预期的结果的比对,从而判断刚被运行的程序段是否存在问题,也就是找到程序错在哪里、是什么问题。

断点调试的主要步骤如下。

1.设置断点

在Python的源程序编辑器中,在需要进行断点调试的代码行上单击鼠标右键,在弹出的快捷菜单中选择【Set Breakpoint】命令,之后该行的底色就变为黄色,用以指示在此行设置了一个断点。如果要设置多个断点,就按此法对其他语句进行设置。

2.打开Debugger

通过菜单【Run】切换到Python的Shell模式,在Shell模式下选择【Debug】→【Debugger】命令,使IDLE进入Debug状态。

3.切换到编辑模式

在Edit模式下,按【F5】键或选择【Run】→【Run Module】命令,运行当前编辑区中正在被编辑的程序。如果出现在运行前先保存文件的提示,则请先保存文件。

4.运行到断点处

在【Debug Control】窗口中单击【Go】按钮,即可全速运行程序,遇到断点则自动暂停。注意,断点所在的那条语句此刻尚未被执行。此时,调试者要做的是比对工作,即比对此刻的结果与预期的结果,以判断刚被执行的代码是否存在问题。之后,可以继续运用【Go】【Over】或【Step】执行该断点语句及其后的语句。如果后面还有断点,那么,当遇到断点时,程序的运行又被暂停。