Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

日志与调试

复习

  • 契约、错误与异常:错误应明确暴露
  • 网络故障诊断:分层排查问题
  • 从算法到软件:软件要正确,也要能被验证

TL;DR

  • 调试是从现象出发,逐步缩小错误范围
  • 日志是程序留下的“现场记录”
  • 先提出假设,再用证据验证
  • 好的日志让问题可被重现和定位

正文

  无论写得多小心,程序总会有 bug。调试(debugging)就是找出并修掉它们的过程。而日志(logging),是让这件事变得容易的关键工具。

调试的思路

  调试最忌讳的,是“凭感觉乱改代码”。更有效的做法是科学一点

  1. 观察现象:到底哪里不对、什么时候不对
  2. 提出假设:猜一个可能的原因
  3. 设计验证:怎么用最小的实验,证明或推翻这个假设
  4. 缩小范围:根据结果,把问题可能存在的范围砍掉一半,重复

  这和前面网络故障诊断里的“分层排查”是一个思路:每次都把可能性砍掉一大块,而不是四处瞎猜。 范围越小,离真相越近。

让问题可重现

  调试里有一句话:能稳定重现的问题,就等于解决了一半。 因为只有能重现,你才能反复试验、验证假设。

  如果一个 bug 时有时无,那多半和某些特定条件有关——特定的输入、特定的时序、特定的环境。找到这些条件,让它稳定重现,往往比直接改代码更重要。

日志:程序的现场记录

  如果程序已经跑在用户那里、无法直接调试呢?这时日志就派上用场了。

  日志是程序运行时留下的“现场记录”:它记下发生了什么、在哪一步、关键数据是什么。有了它,即使问题发生在别人的机器上,你也能“回放”出事发前后的情况。

  好的日志有几个要点:

  • 有级别:比如“普通信息 / 警告 / 错误”,便于按需查看
  • 有上下文:记录足够的信息(时间、位置、关键变量),而不只是“出错了”
  • 不泄露敏感信息:密码、密钥之类绝不能写进日志

  日志的价值,在于它把“事后无法复现的问题”,变成“有据可查的线索”。 平时可能不起眼,出事时就是救命稻草。

思考题 1

  调试时,为什么“先提出假设再验证”比“乱改代码”更有效?

思考题 2

  为什么说“好的日志”能大幅缩短排查时间?

小结

知识点

  • 调试是观察、假设、验证、缩小范围的过程
  • 让问题稳定重现往往事半功倍
  • 日志记录程序运行时的关键信息
  • 日志应有级别、有上下文且不泄露敏感信息

参考资料

  1. Wikipedia(zh):调试:定位并修复程序错误
  2. Wikipedia(zh):日志文件:程序运行时记录的信息

思考题答案(仅供参考)

思考题 1

  因为“先假设再验证”能让每一步都有依据地缩小问题范围,方向明确、可累积。乱改代码则可能掩盖真因、引入新问题,即便偶然修好也不知道为什么,效率低且不可靠。

思考题 2

  因为日志记录了程序运行时的现场信息。当问题难以直接复现(比如发生在用户处)时,日志能帮助还原出事的条件与经过,从而快速定位线索,避免“两眼一抹黑”地猜测。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪