软件调试技巧
一、软件调试方法
软件调试有很多种方法。
常用的有4种,即强行排错法、回溯排错法、归纳排错法和演绎排错法。
1.强行排错法
这种方法需要动脑筋动的地方比较少,因此叫强行排错。
通常有以下3种表现形式:
●打印内存变量的值。
在执行程序时,通过打印内存变量的数值,将该数值同预期的数值进行比较,判
断程序是否执行出错。
对于小程序,这种方法很有效。
但程序较大时,由于数据量大,逻辑关系复杂,效果较差。
●在程序关键分支处设置断点,如弹出提示框。
这种方法对于弄清多分支程序的流向很有帮助,可以很
快锁定程序出错发生的大概位置范围。
●使用编程软件的调试工具。
通常编程软件的IDE集成开发环境都有调试功能,使用最多的就是单步调
试功能。
它可以一步一步地跟踪程序的执行流程,以便发现错误所在。
2.回溯排错法
这是在小程序中常用的一种有效的调试方法。
一旦发现了错误,可以先分析错误现象,确定最先发现该错误的位置。
然后,人工沿程序的控制流程,追踪源程序代码,直到找到错误根源或确定错误产生的范围。
3.归纳排错法
归纳法是一种从特殊推断一般的系统化思考方法。
归纳法调试的基本思想是,从一些线索(错误的现象)着手,通过分析它们之间的关系来找出错误,为此可能需要列出一系列相关的输入,然后看哪些输入数据的运行结果是正确的,哪些输入数据的运行结果有错误,然后加以分析、归纳,最终得出错误原因。
4.演绎排错法
演绎法是一种从一般原理或前提出发,经过排除和精化的过程来推导出结论的思考方法。
调试时,首先根据错误现象,设想及枚举出所有可能出错的原因作为假设。
然后再使用相关数据进行测试,从中逐个排除不可能正确的假设。
最后,再用测试数据验证余下的假设是否是出错的原因。
二、调试的原则
调试能否成功一方面在于方法,另一方面很大程度上取决于个人的经验。
但在调试时,通常应该遵循以下一些原则。
1.确定错误的性质和位置的原则
用头脑去分析思考与错误征兆有关的信息,避开死胡同。
调试工具只是一种辅助手段。
利用调试工具可以帮助思考,但不能代替思考。
通常避免使用试探法,最多只能将它当作最后的手段,毕竟小概率事件有时也会发生。
2.修改错误的原则
在出现错误的地方,很可能还有别的错误。
修改错误的一个常见失误是只修改了这个错误的征兆或这个错误的表现,而没有修改错误本身。
当新修正一个错误的同时又引入新的错误。
三、有效减少调试时间
1.绘制程序流程图
一些程序员认为,绘制程序流程图是件繁琐的事,而且浪费时间。
其实不然,当读者对着偌大的程序一筹莫展时,面对纷纭复杂的关系理不出头绪时,使用程序流程图绝对可以事半功倍。
因此建议在编制程序前先绘制流程图,这样编程的思路有条理,调试时同样会有条不紊。
若编制程序之前没有绘制流程图,当排错没有进展时,可以马上编写流程图。
你会发现,程序中某些分支或细节被忽略了,这些细节可能就是程序出错的地方。
2.不要过多地依赖单步调试
有些程序对时间很敏感。
数据只在那么一瞬间有效,可谓稍纵即逝。
所以等到单步执行到那里时,
数据早已更改了。
当然调试也就不会得到什么有意义的结果。
3.变量的定义
变量名一定要意义。
而且同一个程序中,同一个变量只让它做一件事。
不要为了节省空间,一“物”
多用。
现在的计算机内存足够大,多几个变量不会对程序的性能有本质的影响。
4.程序的结构
合理的设计程序结构。
在面向对象的程序设计中,将相关的功能做成一个成员函数,尽量降低各成员函数间的耦合性。
其实,在过程化程序设计中,这就是代码模块化的表现。
5.修改代码的原则
在程序彻底正常运行前,决不要轻易删除一段代码,即使当时认为这段代码肯定是错的。
现在的集成开发环境都提供了注释工具,将暂时认为错误的代码注释要优于直接删除。
若同一段代码修改多次,还应该在代码后面注明修改的时间及修改的原因。
这些信息在后续的调试中会给你带来帮助。
6.检查循环语句
循环语句经常是造成程序没有任何响应的罪魁祸首。
详细检查程序中使用的每一个循环语句,尤其是while()循环语句。
7.与外部设备打交道
程序中,当操作文件时,一定要编写出错处理的代码。
因为这些外部设备随时、随机都有可能不满足编制程序时的条件。
8.数组下标和循环的上下限
为简化程序的编制,对于大量的、有规律的数据处理,通常都会选择采用数组和循环来实现。
那么,此时要小心了,设置的数组下标是否满足实际数据需要,循环的上下限是否漏掉了数据的两个端点值。
9.屏蔽无关的代码
当调试某个功能的代码时,为缩小查找范围,可以注释掉与其无关的其他代码,或者注释掉该段代码的某个分支,这样会加快找到问题的根源。