1. 基本过程
查找、定位和解决问题就是软件调试。软件调试从一开始实际上就包含了定位错误和去除错误这两个基本步骤。进一步讲,一个完整的软件调试过程是一个循环过程,它由以下几个步骤组成。
1.1. 重现故障
通常是在用于调试的系统上重复导致故障的步骤,使要解决的问题出现在被调试的系统中。
1.2. 定位根源
即综合利用各种调试工具,使用各种调试手段寻找导致软件故障的根源(rootcause)。通常测试人员报告和描述的是软件故障所表现出的外在症状,比如界面或执行结果中所表现出的异常;或者是与软件需求(requirement)和功能规约(function specification)不符的地方,即所谓的软件缺欠(defect)。而这些表面的缺欠总是由于一个或多个内在因素导致的,这些内因要么是代码的行为错误,要么是不行为错误(该做而未做)。定位根源就是要找到导致外在缺欠的内因。
1.3. 探索和实现解决方案
即根据寻找到的故障根源、资源情况、紧迫程度等设计和实现解决方案。
1.4. 验证方案
在目标环境中测试方案的有效性,又称回归(regress)测试。如果问题已经解决,那么就可以关闭问题。如果没有解决,则回到第三步调整和修改解决方案。
2. 基本特征
2.1. 难度大
软件调试时一项复杂度高、难度大的任务。一下是导致这种复杂性的几个主要因素。
第一,如果把查找和定位问题看作是一种特别的搜索问题,那么它通常是个很复杂的搜索问题。首先,被搜索的目标空间是软件问题发生的系统,从所包含的信息量来看,这个空间通常是很庞大的,因为一个典型的计算机系统中包含着几十个硬件部件、数千个软件模块,每个模块又包含着以KB或MB为单位的大量指令(代码)。另一方面,这个搜索问题并没有明确的目标和关键字,通常只知道不是非常明确的外在症状,必须通过大量的分析,才能逐步接近真正的内在原因。
第二,为了查找定位问题的根源,很多时候必须深入到被调试模块或系统的底层,研究内部的数据和代码。与顶层不同,底层的数据大多是以原始状态存在的,理解和分析的难度比顶层要大。举例来说