调试

来源:互联网 发布:消防三知四会一联通 编辑:程序博客网 时间:2024/06/05 05:20

摘自:《代码大全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 将新的代码分小段进行集成,对每段集成的代码段进行完整的测试。 

总结:

本文目前仅停留在理论层面,希望自己能在以后的工程去实践,摸索出适用于自己的一套高效的调试方法···