全书以bug为中心,围绕调试维护进行组织。
1 bug
1.1 关于bug
1、作为一个词,bug被软件开发组织用来描述一些需要修复的问题。
2、Bug的定义
- 简单定义:bug是未预料到的系统行为。
- 严格定义:bug是系统中的这样一个现象,即本来应该有的功能却没有。
- 以人为本的定义:bug是系统没有实现软件开发人员(开发者、测试人员、项目管理者)和用户之间达成一致的行为。
3、软件缺陷(defect)
软件缺陷是一个软件系统中的需求、体系结构、设计和应用上的错误。
bug是软件缺陷的实际证明。
4、调试(debugging)
调试是理解系统的行为以利于去除bug的过程。
5、Bug是如何产生的
- 对软件做修改,主要原因是对被修改的软件理解力不够。文档是一个书面报告,能够帮助描述软件系统的使用、设计、目标和描述。代码是软件的最后仲裁工具,所以源代码也是文档的一部分。所以修改代码,也应该同步修改代码中相应的注释。
- 一个不正确的描述会导致不正确的实现,从而导致bug。
6、Bug的种类
- 大量研究表明,需求阶段的bug修复代价最高,跟踪难度最大。理由很简单,如果一个bug存在于需求阶段,那就没有“问题代码”可以检测。
- 设计阶段的bug比需求阶段的bug更容易捕捉,但最后的修复代价很高。设计上的bug的修复代价高的主要原因是它们作为一个整体来影响系统。
- 实现阶段的bug是系统中最普通、最一般、最容易修复的bug。
- 处理阶段的bug,比如被破坏的数据库。
- 编译的bug:编译时出现的bug是因为编译过程中出现错误,或编译引擎出现了一个导致产品失效的错误。
- 配置的bug,比如在一个配置bug中,软件是正确的,编译过程是正确的,但最后的软件安装不正确。
- 未来计划bug:如果设计者或开发人员能够看得长远一点,则未来计划bug就要可以避免。
- 文档bug,系统与文档描述不一致。
7、Bug的分类
- 内存或资源泄漏:指一个内存由操作系统或内部存储器”池”分配,但用完后从未收回。症状往往是系统变慢或者突然崩溃以及其它奇怪的症状。
- 逻辑错误:即代码的语法正确却没有做到期望的事情。
- 循环错误:死循环。
- 条件错误:条件错误可以是对布尔代数的误解或条件嵌套错误造成的。
- 多线程错误:在一个实现了多线程的程序中,两个线程试图同时访问或修改相同的存储器地址。
- 存储错误:这是在永久存储设备遇到错误不能再进行时发生的问题。
- 集成错误:是指两个子系统已经分别测试和验证,组合后在其交互时出现了问题。
- 转换错误:转换错误发生在将一个类型的数据转换为另一类型发生错误时。
- 版本bug:版本bug是在软件的两个版本之间改变了功能和文件存储格式时,结果向后不兼容或在将来的发布中没有正确处理。
- 不恰当地重用bug:大量的bug是因为对代码或组件在新系统中不正确地重用而造成的。
- 布尔bug:最明显的症状就是程序做了与期望相反的事情。
2 调试工具及使用时机
1.1 测试和调试环境
1、第一个调试工具是测试环境。测试环境包括一套硬件、软件和测试实例,可用于模拟、调查和重现用户所看到的问题。没有固定的方法来判断问题的实质,只能是在黑暗中摸索寻找错误的原因。测试实例应该是让bug最容易重现的实例。根据这个思想,可以利用每一个bug作为新的测试实例。一般情况下,测试实例是根据要求和设计规范写成的。
2、如果想知道应用程序如何工作,以及程序各段如何组织在一起时,