xxleyi / learning_list

聚集自己的学习笔记
10 stars 3 forks source link

有趣的 debug 两例 #284

Open xxleyi opened 3 years ago

xxleyi commented 3 years ago

昨天的工作是花了大半天搞定一个 bug。

今天的工作也是花了大半天搞定一个 bug。

可谓价值千金的 bug 了。

分别是什么 bug 呢?

昨天的 bug 最诡异,可以说是我职业生涯以来最有趣的 bug 了。这个 bug 的特点是:没有运行时报错,而且是在代码未被调用的情况下就造成 bug。所有的事情都看起来没啥问题,但最终的表现却不正常。背后原因是项目的复杂性延伸到 AST 的操作上。

由于项目特殊性质,项目总体分为两部分:

因为 AST 操作这一中间层的加入,项目维护者需要考虑的事情变多了,能用的 debug 手段和信息却变少了,这要求解决棘手问题时需要了解基本的代码编译原理,考虑一些 AST 操作上的 bug 带来的离奇问题。

最终,昨天的问题便是此类问题,虽然经过层层排除定位并绕过了 bug 点,但产生 bug 的根源依然是未知。

今天的 bug 相对来说就好很多,但问题是我对微信小程序比较陌生,加上客户使用了 uniapp 这个跨端框架,以及报错信息的不友好,导致真正的问题迟迟不能被定位到。

这个时候就要不放弃,不死磕,灵活出击,轮番头脑小风暴,反复尝试,在尝试中寻找更多灵感,抓住更多信息。

最终抓到真正的问题点之后,bug 迎刃而解:客户的跨端小程序产生的组件并非原生组件,不支持 page.setState 方法。

解决方法也很简单:自定义 setState 方法。

这是两个典型的不友好 bug,突破常理,信息匮乏,背景知识不牢靠。但最终将它们解决掉还是蛮有意思的一件事。