阅读手册
理解系统的基本方法就是阅读手册。我们首先应该阅读手册,而不是等所有办法都不管用之后才去读它。当你买一件东西的时候,手册告诉你怎么操作它,以及它用来干什么的。我们需要一页一页读完手册并理解它,以便用它来完成我们需要做的工作。
如果你是一位工程师,正在调试自己公司的产品,那么你需要读一读内部手册。工程师设计它是用来做什么的?读一下功能说明以及所有的设计规范,研究一下图表、时序图和状态机。分析它们的代码,还要读一下注释。一定要检查产品的设计。查明构建它的工程师打算用它来做什么。
注意,手册上的信息页不可全信。手册可能也是错的。很多难以发现的bug就出现在这里。但你仍需要了解他们的想法。哪怕其中有写信息是很难接受的。
逐字逐句阅读整个手册
人们在调试的时候,通常都不会彻底阅读系统手册。他们采取跳读的方式,查看他们认为重要的一些章节,但是问题的线索可能就隐藏在被略过的那些章节中。
编程指南和API可能非常厚,但你必须深入挖掘它,查找你认为有问题的函数。图表部分可以忽略,它们会干扰你。但是数据表要仔细查看,可能表中不起眼的一行指定了一个模糊的时序参数,而它就是问题所在。
应用说明和实现指南提供了丰富的信息,它们不仅描述了系统是如何工作的,而且专门给出了先前已发生过的问题。
参考设计和样本程序给出了产品的一种使用方式,有时这些就是能获得的全部文档了。但是,在使用这些设计时一定要注意,创建它们的人往往只了解他们的产品。而没有遵循好的设计实践,或者不是为真实应用而设计的。不要照搬这些设计。
知道什么是正常的
当你检查系统时,必须知道系统的正常工作状态。
你必须掌握一些你所工作的技术领域的基础知识。
知道工作流程
当你寻找bug时,必须知道要查找的路线。开始时,你需要猜测在哪里把系统分隔开,以便隔离问题,这种猜测完全取决你对系统功能划分的了解。你至少要大体上知道所有的模块和接口都是做什么的。
你应该知道系统中的所有API和通信接口都是用来交换什么数据的。还应该知道每个模块或者程序如何处理它们通过这些接口收发的数据。如果代码时高度模块化或面向对象的。那么接口将很简单模块也有良好的定义。观察接口就很容易解释你看到的东西是否正确。
当系统有一些部分是'黑盒子"时,这意味着你不知道它内部有什么,但是应该知道它们如何与其他部分交互,这至少可以帮助判断问题是在内部还是外部。如果问题发生在黑盒子内部,你必须更换盒子,但如果问题出现在外部,就可以修复它了。
了解你的工具
调试工具是用来观察系统的眼和耳,你必须选择正确的工具,正确地使用工具,并正确地解释得到的结果。很多工具提供了非常强大的功能,但是只有精通他们的用户才了解。你越是精通工具,就越容易查明系统中发生了什么事情。
我们还必须了解工具的局限性。走查源代码可以显示逻辑错误,但无法显示时序和多线程问题;剖析工具可以暴露时许问题,但显示不出逻辑错误。
你还必须了解开发工具。这当然包括用来编写软件的语言。
查阅手册
不要猜测,要查阅手册。芯片制造商或软件工具的开发人员已经把详细信息写到手册中,而你不应该盲目相信自己的记忆。
小结
理解系统
这是第一条规则,因为它是最重要的。
- 阅读手册。
- 仔细阅读每个细节。
- 掌握基础知识。
- 了解工作流程
- 了解工具。
- 查阅细节。