本节书摘来自华章计算机《Effective Debugging:软件和系统调试的66个有效方法》一书中的第2章,第11节,作者[希]迪欧米迪斯·斯宾奈里斯(Diomidis Spinellis),爱飞翔 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
第11条:修改完代码之后,要能够尽快看到结果
调试通常是一种循序渐进的过程。在每一轮中,我们都要花时间去构建并运行软件,而且要看着它发生故障,这些环节会占用很多时间,而且这些时间并没有用来解决软件中的问题。因此,我们要提前进行准备,设法缩短每一轮调试所花费的时间。
首先从软件的构建入手。我们应该能通过一条命令(如make或mvn compile)或一个按键(如F5)把发生故障的软件迅速构建出来。构建过程应该能够记录文件之间的依赖关系,使得我们在修改了某处代码之后只有少数几个文件需要重新编译。能够达到这种效果的构建工具包括make、Ant及Maven。
高效地部署与运行软件也是相当重要的,然而各个项目的具体实现方式有很大的区别。我们可能要在远程主机上面部署文件、要重启应用程序服务器、要清除缓存,或要重新初始化某个数据库,为此,可以使用项目的构建系统,或编写一些脚本来自动执行该流程(参见第12条)。如果安装软件之前需要花很长时间来对分配文件进行构建,而且软件安装得也比较慢,那么可以考虑设置一种快捷的安装途径,使得我们只需把改动之后的那些文件复制到适当的位置即可。
最后,要确保软件能够尽快暴露出故障(参见第55条)。如果发生故障的代码可以进行单元测试,或是可以放在回归测试框架中进行测试,那就构建一个能够展示故障的测试用例(参见第10条),然后通过采用IDE或测试环境所提供的特性来运行这个测试用例。例如,如果代码是用Maven来管理的,那么可以通过下面这条命令来运行名为TestFetch的用例:
如果要调试的程序在处理某个特定的文件时会发生故障,那就构建一个能够引发该故障的最简文件。为了重现GUI应用程序中的问题,我们可以通过软件自动化应用程序来完成,例如,适用于网页浏览器的Selenium、适用于Windows系统的AutoHotkey、适用于OS X系统的Automator,以及适用于Linux系统的AutoKey。
要点
- 设法在修改代码之后尽快看到其结果,以提升调试的效率。
- 配置一套快速的自动化构建及部署流程。
- 测试软件时,要令其尽快地将故障暴露出来。