天天看点

调试

调试

调试是执行一次成功的测试用例之后所要进行的工作。所谓成功的测试,是指它可以证明程序没有实现预期的功能,调试包含两个错误。一:确定程序中可疑错误的准确性质和位置。二:修改错误。

暴力法调试(分三种类型)

  1. 利用内存信息输出来调试
  2. 根据一般的额“在程序中插入打印语句”建议来调试
  3. 使用自动化的调试根据进行调试

第一种类型是最缺乏效率的暴力调试法

●难以在内存区域与源程序的变量之间建立联系

●即使对于复杂程度较低的程序,内存信息也会产生数量非常庞大的数据,好多数据都与调试无关。

●内存信息只能显示程序的静态快照,仅能显示出某一时刻程序的状态,为了发现错误还需要研究动态状态。

●内存信息输出很少可以精确地在错误发生的地方,因此无法显示错误发生的时序状态,错误发生到输出信息这段时间执行的活动,可能会掩盖掉发现错误所需要的线索。

第二种类型,可能比内存信息输出要好一些,因为可能显示程序的的动态状态。但是同样存在很多缺点。

●它不是鼓励我们去思考程序中的问题,只要是碰运气的方法

●它所产生的需求分析数量非常庞大

●可能对小程序有效,但如果应用到大程序成本就相当高。

●它要求我们修改程序这些修改可能会掩盖掉错误、改变关键的时序关系,或者会引入新的错误。

第三种类型自动化调试工具的工作机制类似于在程序中插入打印语句,但不是修改程序本身。可以使用编程语言的调试功能,或使用特殊交互调试工具来分析程序动态状态。调试工具的一个共同的功能是设置断点,使程序在执行到某条特定的语句或改变了某个特定变量的值是暂停执行。然后程序员就可以检查程序的当前状态了。

暴力法调试的主要问题在于他们忽略了思考的过程

归纳法调试

归纳法是一种特殊的思考过程,可以从细节到全局,也就是线索出发。归纳法调试步骤如下:

  1. 确定相关数据。调试人员犯的主要错误是未能将所有数据考虑进去第一步是列举出所有知道程序执行的正确和不正确之处。不正确之处就是症状。未能引起症状出现的测试用例提供了额外的有价值的线索。
  2. 组织数据。归纳就是从特殊到一般,第二部就是组织相关数据,以便观察线索的模式。
  3. 做出假设。研究线索之间的联系,利用线索结构里可能的模式做出一个或多个关于错误原因的假设。如果还无法退出错误,则需要更多的假设。
  4. 证明假设。

演绎法调试

演绎过程是从一个普遍的理论和前提出发,使用排除和精炼过程达到一个结论

  1. 列出所有可能的原因或假设。
  2. 利用数据排除所有可能的原因
  3. 提炼剩下的假设
  4. 证明剩下的假设

回朔法调试

沿着程序的逻辑结构回溯不正确的结果。直到找到程序逻辑出错的位置。使用这个过程,可以确定程序中从状态符合预期值的位置点,到第一个状态不符合预期值的位置点。

测试法调试

考虑两种类型的测试用例:1.供测试的测试用例,目的是暴露出以前尚未发生的错误。2.供调试的测试用例目的是提供有用的信息,供定位某个被怀疑的错误之处。

话句话说,当发现某个被怀疑的错误的症状之后,需要编写测试用例,尽量确定错误的位置。

调试的原则

调试原则其实也是心理学原则。由于调试过程有两部分组成,即定位错误与修改错误。

定位错误的原则

  1. 动脑筋
  2. 如果遇到了僵局,就留到稍后解决
  3. 如果遇到了困境,就把问题描述给他人听
  4. 仅将测试工具作为第二种手段
  5. 避免使用实验法——仅将其作为最后的手段

继续阅读