一、插装——开发人员编写的额外代码,来提高程序的可观察性和可控制性。
二、发现bug的机会:
(1)可调试的源代码(2)插装(3)宏定义(4)编译器标志(5)静态检查器
(6)选择的库(7)链接器选项(8)代码插装工具(9)测试用例/输入数据
(10)调试器:源代码、剖析、内存读取、操作系统调用跟踪器(如truss和strace)
三、用户态调试器——查看调试目标状态
1、运行中的线程、内存、寄存器以及在进程空间中打开的内核对象
2、修改调试目标状态:改变线程的执行顺序,修改寄存器的内容,修改内存的内容,接收在目标进程中发生的特定事件。
3、分析包含进程快照的转储文件
4、cdb.exe——CDB,基于字符界面的控制台程序
5、ntsd.exe——一个GUI程序并可创建自己的控制台(NTSD)
6、windbg.exe——图形界面调试器
四、调试规则
1、理解需求2、制造失败3、简化测试用例4、读取恰当的错误信息5、检查易见的问题
6、从解释中分离出事实7、分而治之8、工具要与bug匹配9、一次只做一项更改
10、保持审计跟踪11、获得全新观点12、bug不会自动修复13、回归测试来检查bug修复
回归测试——通常是一组脚本的集合,它执行稳步增加的测试集,结果是两个清单,一个列出通过的测试,一个失败的测试。每次添加新功能或修复了一个bug时,都应该增加测试。
分而治之——(1)整理一份清单,列出潜在问题以及如何调试他们。
(2)将环境更改和源代码更改区分开。
(3)放大并治之。(同步比较两个版本的数据、日志文件和控制流)
黑盒——验证组件。预期功能。忽略实际实现,很好的移植性。
白盒——测试实际边界情况。
1、自己尝试再现相同的bug——分析错误描述和日志文件。
2、现场调试——源代码文件,在函数中设置断点,走查程序的运行,获取栈的跟踪信息,获取或设置变量。
3、远程连接——WebEx,VNC,客户机运行可调试的软件,源代码在调试者电脑上。
符号