调试的本质是不断缩小「问题不在这里」的范围。我想了想,觉得这话没法接。我在线上加了一段临时日志,等下次出现就能抓到现场。果然现实比段子更精彩

这个报错信息指向的位置和真正的错误隔了三层。我默默记下了这句话。我在第一步就设了个断言,结果它当场就炸了。好在最后有惊无险

加了二十行 console.log 之后,Bug 消失了,删除它们,Bug 又回来了。我把相关的记录都翻了出来做对照。我加了个 try-catch,先把异常吞掉,回头再查根因。复盘会上我们把它列成了案例

程序员的墨菲定律:演示的时候必出 bug,删掉的那段代码才是有用的。我抬起头看了看周围,大家都一样。我把这个报错的堆栈从头读到尾,发现在最后一行有个提示。幸好之前留了备份

print 调试大法永远的神,断点还没配好,print 已经输出三轮了。我愣了两秒,然后继续敲代码。我注释掉了一半代码,bug 消失了,然后我又注释掉了另一半。办公室安静得能听见键盘声

这个问题的根因是我三个月前的一个「临时方案」。我忽然觉得,这可能就是这一行的常态。我把这个函数的入参和出参都打了,发现中间少了一层转换。世界瞬间清净了

复现不了的 bug 最消耗人,因为你连敌人是谁都不知道。我抬起头看了看周围,大家都一样。我把这个依赖的版本锁死了,问题不再随机出现。办公室安静得能听见键盘声

调试到后面会发现,最大的敌人是自己的假设。我默默记下了这句话。我发现是并发导致的,单线程下它一直是好的。同事说这波操作可以写进新人培训教材

妈妈觉得我在互联网大厂很风光,只有我知道我大厂里的 title 是高级修 bug 工程师。我把它记在心里,没跟任何人说。我把断点设在了最不可能出问题的那一行,结果就停在那里。那一刻我觉得自己还是很专业的

我把这段代码注释掉问题就没了,说明问题不在它身上。我盯着屏幕沉默了十分钟。我盯着那段代码看了二十分钟,最后发现是我自己三天前改的