第七章:软件构造的健壮性.
第四节:调试(Debugging)
问题一:什么是bug
- 程序中的错误,导致程序以非预期或未预料到的方式执行。
- 一个包含大量bug和/或严重干扰其功能的bug的程序被称为buggy。
- 报告程序中的bug通常被称为bug报告、故障报告、问题报告、故障报告、缺陷报告等。
问题二:常见的bug的类型
- 数学bug:例如 零除法,算术溢出
- 逻辑bug:例如 无线循环和无限递归
- 源头bug:例如 使用了为被定义的变量、资源泄漏,其中有限的系统资源如内存或文件句柄通过重复分配耗尽而不释放。缓冲区溢出,其中程序试图将数据存储在分配存储的末尾。
- 团队工程bug:例如 评论过时或者评论错误、文件与实际产品的区别
问题三:调试的过程
过程:重现(Reproduce)-->诊断(Diagnose/Locating)-->修复(Fix)-->反思(Reflect)
1.重现(Reproduce)
含义:寻找一种可靠、方便地再现需求问题的方法
2.诊断(Diagnose/Locating)
含义:构建假设,并通过进行实验来检验它们,直到你确信你已经确定了bug的根本原因
方法:"Wolf fence" algorithm 防狼围栏算法
3.修复(Fix)
含义:设计和实施解决问题的变更,避免引入回归,维护或提高软件的整体质量。
4.反思(Reflect)
含义:学习错误的教训。事情出了什么问题?是否有同样的问题需要修复?你能做些什么来确保同样的问题不会再次发生?
问题四:调试的方法和工具的种类
- 暴力调试
- 递归调试
- 演绎调试
- 回溯调试
- 测试调试
问题五:暴力测试
1.看内存导出文件
2.看栈的轨迹(stack trace)
3.到处打印(Printf)
- 在程序内部各部分展示程序执行时的动态信息,比使用静态的dump分析更有效。
- 一旦软件对外发布,所有用于debug的printf语句都要去除或禁用。
4.日志(log)
- 通过设定日志级别来确定要log哪些信息
- log结果可被多种渠道加以处理,可通过设定条件进行过滤,并输出为多种格式
- 可使用层次化的多个日志记录器