摘自:《代码大全2》第23章 调试 Debugging
概念:调试是确定错误根本原因并纠正错误的过程。
科学的调试方法:
1. 通过可重复的试验收集数据
2. 通过相关数据的统计构造一个假说
3. 设计一个实验来证明或反证这个假说
4. 证明或反证假说
5. 根据需要重复进行上面的步骤
找出缺陷的有效方法:
1) 将错误状态稳定下来
2) 确定错误的来源(即那个失误“fault”)--
a) 收集产生缺陷的相关数据
b) 分析所收集的数据,并构造对缺陷的假设
c) 确定怎样去证实或伪证这个假设,可以对程序进行测试或是通过检查代码
d) 按照c)确定的方法对假设做出最终的结论
3) 修补缺陷
4) 对所修补的地方进行测试
5) 查找是否还有类似的错误
寻找缺陷的小建议:
1. 在构造假设时考虑所有的可用数据
2. 提炼产生错误的测试用例
3. 在自己的单元测试族中测试代码
4. 利用可用的工具
5. 采用多种不同的方法重现错误
6. 用更多的数据生成更多的假设
7. 利用否定性测试用例的结果
8. 对可能的假设尝试头脑风暴
9. 在桌上放一个记事本,把需要尝试的事情逐条列出
10. 缩小嫌疑代码的范围
11. 对之前出现过缺陷的类和子程序保持警惕
12. 检查最近修改过的代码
13. 扩展嫌疑代码的范围
14. 增量式集成:一次只对系统添加一个代码片段
15. 检查常见缺陷
16. 同其他人讨论问题:“忏悔式调试”
17. 抛开问题,休息一下
蛮力(被认为乏味、费神、耗时但最终能解决问题的方法)调试:
u 对崩溃代码的设计和编码进行彻底检查
u 抛弃有问题的代码,从头开始设计和编程
u 抛弃整个程序,从头开始设计和编程
u 编译代码时生成全部的调式信息
u 在最为苛刻的警告级别中编译代码,不放过任何一个细微的编译器警告
u 全面执行单元测试,并将新的代码隔离起来单独测试
u 开发自动化测试工具,通宵达旦地对代码进行测试
u 在调式器中手动地遍历一个大的循环,直到发现错误条件
u 在代码中加入打印、显示和其他日志记录语句
u 用另一个不同的编译器来编译代码
u 在另一个不同的环境里编译和运行程序
u 在代码运行不正确的时候,使用能够产生警告信息的特殊库或者执行环境来链接和运行代码
u 复制最终用户的完整系统配置信息
u 将新的代码分小段进行集成,对每段集成的代码段进行完整的测试。
总结:
本文目前仅停留在理论层面,希望自己能在以后的工程去实践,摸索出适用于自己的一套高效的调试方法···