调试

来自计算思维百科
跳转至: 导航搜索
调试.png

调试是对你设计的程序进行测试发现错误之后排除错误的过程。在实际生活与工作中,调试也是无处不在的,你发现使用的设备处故障了,需要调试;你发现家里没有电了,你会去检查空开,这也是调试。

基本概念

葛丽丝·霍波(Grace Hopper)是一位美国海军准将及计算机科学家,她为马克2号(Harvard Mark II)编制程序的同时也是世界最早的一批程序设计师之一。有一天,她在调试设备时出现故障,拆开继电器后,发现有只飞蛾被夹扁在触点中间,从而“卡”住了机器的运行。于是,霍波诙谐的把程序故障统称为“臭虫(BUG)”,把排除程序故障叫DEBUG,而这奇怪的“称呼”,竟成为后来计算机领域的专业行话。

 

调试不是测试,它总发生在测试之后。调试过程从执行一个测试用例开始,评估测试结果,如果发现实际结果与预期结果不一致,这就说明这个程序存在着隐藏的问题,调试过程试图找出产生症状的原因,以便改正错误。

 

调试过程总一般有两种方法:

  1. 找到了问题的原因并把问题改正和排除掉了。
  2. 调试人员猜想一个原因,并设计测试用例来验证这个假设,重复这个过程直到找到原因并改正错误。

 

调试原则:

1.用头脑去分析思考与错误征兆有关的信息。

2.避开死胡同。

3.只把调试工具当做手段。利用调试工具,可以帮助思考,但不能代替思考,因为调试工具给的是一种无规律的调试方法。

4.避免用试探法,最多只能把它当做最后手段。

5.再出现错误的地方,可能还有别的错误。

6.修改错误的一个常见失误是只修改了这个错误的征兆或这个错误的表现,而没有修改错误本身。如果提出的修改不能解释与这个错误有关的全部线索,那就表明只修改了错误的一部分。

7.注意修正一个错误的同时可能会引入新的错误。

8.修改错误的过程将迫使人们暂时回到程序设计阶段。修改错误也是程序设计的一种形式。

使用方法及步骤

  • 蛮干法

蛮干法是为了找到错误原因而最长使用的最低效率的一个方法。这种方法的思想是把程序执行过程中的每个结果都输出出来,然后分析找到错误的地方,这种方法非常的浪费时间和经历。

  • 回溯法

回溯对调试小程序是最有效的。从发现症状的地方开始,人工沿着程序的控制流往回追踪源程序代码,直到找出错误为止。但是随着程序的规模变大,回溯路径变多,实现也会变得很困难。

  • 原因排除法

原因排除法的基本思路是,如果已经直到每个变量在程序内若干个关键点的正确值,则可以用赋值语句在程序中的某些点的附近“注入”正确的变量值,然后运行程序并检查输出,如果输出正确,那么问题就在这个点以前,如果输出错误,那么问题出现在这个点以后。反复使用这个方法来缩小范围,从而找到错误。

  • 归纳法

归纳法是从个别现象推断出一般性结论的思维方法。首先把和错误有关的数据组织起来进行分析,以便发现错误原因。然后导出对错误原因的一个或者多个假设,利用已有的数据证明或者排除假设。

  • 演绎法

演绎法从一般的原理或前提出发,经过排除和精华的过程推导出结论。首先设想出所有出错的可能原因,然后试图用测试来排除每一个可能原因,如果测试表明某一个原因可能是真的错误原因,则对数据进行细化以精确定位错误。

应用案例

应用1-

案例:

李先生的车出现故障拿到维修店进行维修,修车师傅根据车的情况(输出的错误数据)来判断可能是某几个位置出现了故障,然后根据车的情况(数据)来对这些假设进行排除或证明,这种思想就是归纳法的调试思想。

修车师傅先不考虑车的现状,将这辆车所有可能出现故障的地位都做出了假设,然后对每一个假设进行测试来一一的排除或证明,这种思想就是演绎法的调试思想。

修车师傅已经知道车的某个功能出现了故障,那么他从这个功能开始测试调用这个功能的部件是否出现了故障,调用这个部件的部件是否出现了故障,这种思想就是回溯法的调试思想。

修车师傅根据测试车中的某个可能出现问题的部件放在另一个功能正常的车或者一个可以正常驱动这个部件的机器上进行测试这两种结果的比较,如果结果与放在正常环境下的结果一样,那么这个部件,以及调用这个部件的其他部件都没有问题,有问题的是另外的部件,通过重复这个方法来找到错误的思想就是原因排除法的调试思想。

修车师傅把车的所有的部件都拿出来检查,再将所有的部件组合起来再检查的思想就是蛮干法的调试思想,这种思想非常消耗时间和经历,因此现实中除了所有的方法都试过还是找不出错误的情况外,是不会有修车师傅这样做的。

可以体现的计算思维

程序设计中的调试体现了计算思维中的仿真特点,通过对产生错误的现象进行模拟,或是用正确的现象代替错误的现象,都有助于分析问题发生的原因,这就是一种仿真思想。