程序调试是将编制的程序投入实际运行前,用手工或
编译程序等方法进行测试,修正
语法错误和
逻辑错误的过程。这是保证
计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试。根据测试时所发现的错误,进一步诊断,找出原因和具体的位置进行修正。
步骤
第一步,用
编辑程序把编制的
源程序按照一定的书写格式送到计算机中,编辑程序会根据使用人员的意图对源程序进行增、删或修改。
第二步,把送入的源程序翻译成
机器语言,即用
编译程序对源程序进行语法检查并将符合
语法规则的源程序语句翻译成计算机能识别的“语言”。如果经编译程序检查,发现有语法错误,那就必须用编辑程序来修改源程序中的语法错误,然后再编译,直至没有语法错误为止。
第三步,使用计算机中的
连接程序,把翻译好的
计算机语言程序连接起来,并扶植成一个计算机能真正运行的程序。在连接过程中,一般不会出现连接错误,如果出现了连接错误,说明源程序中存在
子程序的调用混乱或
参数传递错误等问题。这时又要用编辑程序对
源程序进行修改,再进行编译和连接,如此反复进行,直至没有连接错误为止。
第四步,将修改后的程序进行试算,这时可以假设几个
模拟数据去试运行,并把输出结果与手工处理的正确结果相比较。如有差异,就表明计算机的程序存在有
逻辑错误。如果程序不大,可以用人工方法去
模拟计算机对源程序的这几个数据进行修改处理;如果程序比较大,人工模拟显然行不通,这时只能将计算机设置成单步执行的方式,一步步
跟踪程序的运行。一旦找到问题所在,仍然要用
编辑程序来修改源程序,接着仍要编译、连接和执行,直至无逻辑错误为止。也可以在完成后再进行编译。
原则
一,用头脑去分析思考与错误征兆有关的信息。
二,避开死胡同。
三,只把调试工具当做手段。利用调试工具,可以帮助思考,但
不能代替思考,因为调试工具给的是一种无规律的调试方法。
四,避免用试探法,最多只能把它当做最后手段。
五,在出现错误的地方,可能还有别的错误。
六,修改错误的一个常见失误是只修改了这个错误的征兆或这个错误的表现,而没有修改错误本身。如果提出的修改不能解释与这个错误有关的全部线索,那就表明只修改了错误的一部分。
七,注意修正一个错误的同时可能会引入新的错误。
八,修改错误的过程将迫使人们暂时回到
程序设计阶段。修改错误也是程序设计的一种形式。
方法
一,简单调试方法:步骤
1,在程序中插入打印语句、优点是能够
显示程序的动态过程,比较容易检查源程序的有关信息。缺点是效率低,可能输入大量无关的数据,发现错误带有
偶然性。
2,运行部分程序。有时为了测试某些被怀疑有错的
程序段,却将整个程序反复执行许多次,在这种情况下,应设法使被测程序只执行需要检查的程序段,以提高效率。
3,借助调试工具。大多数
程序设计语言都有专门的调试工具,可以用这些工具来分析程序的动态行为。
二,
回溯法排错。确定最先发现错误症状的地方,人工沿程序的
控制流往回追踪源程序代码,直到
找到错误或范围。
三,
归纳法排错。是一种系统化的思考方法,是从个别推断全体的方法,这种方法从线索(错误征兆出发),通过分析这些线索之间的关系找出故障。主要有4步:
(1)收集有关数据。收集
测试用例,弄清测试用例观察到哪些错误征兆,以及在什么情况下出现错误等信息。
(2)组织数据。整理分析数据,以便发现规律,即什么条件下出现错误,什么条件下不出现错误。
(3)导出假设。分析研究线索之间的关系,力求找出它们的规律,从而提出关于错误的一个或多个假设,如果无法做出假设,则应设计并执行更多的测试用例,以便获得更多的数据。
(4)证明假设。假设不等于事实,证明假设的
合理性是极其重要的,不经证明就根据假设排除错误,往往只能消除错误的征兆或只能改正部分错误。证明假设的方法是用它解释所有原始的测试结果,如果能圆满地解释一切现象,则假设得到证明,否则要么是假设不成立或不完备,要么是有多个错误同时存在。
四,
演绎法排错。设想可能的原因,用已有的数据排除不正确的假设,精化并证明余下的假设。
五、
对分查找法。如果知道每个变量在程序内若干个关键点上的正确值,则可用
赋值语句或
输入语句在程序中的关键点附近“注入”这些变量的正确值,然后检查程序的输出。如果输出结果是正确的,则表示错误发生在前半部分,否则,不妨认为错误在后半部分。这样反复进行多次,逐渐逼近错误位置。
分类
静态调试
可以采用如下两种方法:
(1)输出
寄存器的内容。在测试中出现问题,设法保留现场信息。把所有寄存器和
主存中有关部分的内容打印出来(通常以
八进制或十六进制的形式打印),进行
分析研究。用这种方法调试,输出的是程序的
静止状态(程序在某一时刻的状态),效率非常低,不得已时才采用。
(2)为取得关键变量的动态值,在程序中插入
打印语句。这是取得
动态信息的简单方法,并可检验在某时间后某个变量是否按预期要求发生了变化。此方法的缺点是可能输出大量需要分析的信息,必须修改源程序才能插入打印语句,这可能改变关键的时序关系,引入新的错误。
动态调试
通常利用
程序语言提供的调试功能或专门的
调试工具来
分析程序的动态行为。一般程序语言和工具提供的调试功能有检查主存和寄存器;设置
断点,即当执行到特定语句或改变特定变量的值时,程序停止执行,以便分析程序此时的状态。