跳转到内容
pstack 中文学习站

principle-fix-root-causes

你在看 pstack 0.15.27 时的版本,最新版在这里

调试时,要修故障本身,而不是它暴露出来的位置。症状是错误状态显现出来的地方。根因是系统第一次做了不该做的事,或第一次没有处理本应处理的状态的地方。

原因: 修复症状会掩盖证据,故障仍会在别处暴露。每修一次症状,系统就更难推理,因为代码里多了临时处理,却没人说清它针对哪个 bug。

模式:

  • 先复现。
  • 在每一步都问「为什么」,直到答案指向代码里的错误决策,而不是更早决策造成的后果。
  • 卡住时就插桩。读取实际错误和实际状态。不要猜。
  • 先问触发症状的状态是否合法。如果系统可能处于这种状态,在这种状态下出错的代码就是根因,在那里处理这种状态就是修复。如果这种状态根本不应存在,在出错处加检查只会掩盖 bug。找出产生这种状态的代码。守卫、重试、吞掉错误、钳制数值和丢弃状态,都是常见的 bug 掩盖方式。
  • 只在重启后失败时,先怀疑持久化状态:配置文件、缓存、锁文件、序列化状态。
  • 查模式,不只查实例。找出所有存在相同故障的地方,一并修复。
  • 如果临时处理需要一长段注释才能自圆其说,代码就是错的。修代码,不是修注释。
  • 若决定性的事实要深挖才找得到,就提出一条便宜、一直开着的信号,让人第一眼就能看见它。