调试九法读书笔记(五)
第八章 保持审计跟踪
在侦探学的所有分支中,没有比足迹学者们艺术更重要而又易被人忽视的了
——福尔摩斯,《血字的研究》
对软件开发来说如果能够进行debug调试,那么大部分问题都很容易定位解决。但是这种情况只有在我们本地开发环境中比较容易实现,在正式生产环境很难去debug调试。这时候追踪系统内部的状态了解系统的运行路径就是一件非常重要的事情。
8.1 记下你的每步操作,顺序和结果
保持审计跟踪。在检查某问题时,要记下你所做的事,做事的顺序,以及发生的结果。每次都要完成这些记录。你是在检测测试步骤,就像检测软硬件一样。必须清楚每一个步骤和每步执行的结果,以此确定在调试时应重点关注哪一步。
对于软件内部来说,打印软件输入和输出,执行的路径。必要的时候在每个模块中都打印这些信息。
当你发生食物过敏时,过敏症专科医师会问你吃了什么,试着把食物和你的反应关联起来,以便确定哪种食物引起过敏。如果食物和你的反应之间关联不明显,医生就需要更多的细节。这就是一种审计跟踪记录,只管且简单。
保持审计跟踪,这种方式不仅仅在软硬件领域,在我们的生活中,解决问题常常也使用这种方法。
8.2 魔鬼隐藏在细节中
遗憾的是,虽然审计跟踪的价值已经被普遍认可了,但所需的详细程度却没有被接受,以为很多信息都被忽略了。正在运行的系统是什么类型的?导致失败的时间序列是什么?有时甚至连具体是什么故障也没有说清楚。只是出错了,不能工作了(但是其实是机器没有插电源)。
我们需要失败日志,但是报告bug的人发来三份日志,到底哪个是故障日志?翻遍三份都没有找到故障信息是最糟糕的。
假如你记录你的食物过敏日志,但你只记录了你吃过的食物,却没有记录你发病的时间和症状,那么医生也束手无策。
关键是在记录调试跟踪或日志的同时,也要把那些没有日志中出现的所有条件和症状记录下来。一定要有时间戳!
另外描述事情的时候要具体且一致。一个食物,不能用在不同的地方使用不同的别名。不要使用模糊的词汇,使用准确且具体的单词。
8.3 关联
把事件以某种方式关联起来。这种方式根据自己的需要决定,就像数据的指标和纬度。对软件系统来说,大部分事件都是以发生的时间顺序排列关联起来的。如果是一个提供服务的系统,一般还会以一次请求到返回为维度聚合所有事件。孤立的事件能提供的意义很小,把多个时间关联起来才能为我们提供价值。
8.4 用户设计的审计跟踪在测试中也非常有用
对于现代的devops系统和ci系统来说,我们可以很方便的比较两个版本之间的修改。如果有规范的提交日志的话,还能找到对应功能变化。把过去的版本出现bug的版本比较,我们就很容易找到哪些代码修改引起啦问题,并从这些地方入手解决问题。
8.5 好记性不如烂笔头
在细节方便,永远不要相信你的记忆,而要把它写下来。最好使用计算机记录,这样可以进行备份,并把它附加到bug报告后面,这样就很容易发给其他人,甚至可以用自动分析工具来过滤它。
8.6 小结
保持审计跟踪
不要只是在心里记住保持审计跟踪这条规则,而要把它写下来。
- 把你的操作、操作的顺序和结果全部记录下来。你上次喝咖啡是什么时候?你的头痛是什么时候开始的。
- 要知道,任何细节都可能是重要的。视频压缩芯片的崩溃竟然是由于格子衬衫造成的(书中提到的一个例子)
- 把事件关联到一起。“它发出噪声,从21:04:53开始,持续4秒”比仅仅说“它发出噪声”要好得多。
- 用户设计的审计跟踪在测试中也非常有用。软件配置控制工具可以告诉你哪次修订引入了bug
- 把事情记录下来!五路那个时刻多么恐怖,都要把它记到备忘录中,这样你才不会忘记。