又成功捕获一个已经成精的BUG

最近上架的APP [ 6F ] ,  为了优化性能,修改了上百处代码。突然,在某种情况下,界面全部卡死,没有任何异常抛出, 也没有任何死锁或死循环,最奇怪的是主线程run loop还正常运行,但是,整个界面没有任何反应。

这种无任何出错或异常提示的bug真是要了老命啊!!!!!!

经过一天一夜的艰苦抗战,分析每一个变量数据,疑神疑鬼的做了几十种可能性猜测,可是每一步断点调试都是没有任何问题。也许你会说,那一直调试到出现卡住的地方啊,可是,关键是调试的代码没有任何地方出现卡住的现象,一路通畅,就是界面仿佛冻结住一般,并且!还能响应触摸事件。

甚至恢复了历史代码,做代码差异化比较( 这种方法真是狗急跳墙的方法,这么多年经验告诉我,这种方法找到bug的可能性微乎其微)。

在极其深度的一行行代码研究后( 几乎涉及到2000多行代码,每一行都仔细分析),最终!!!找到一个fat finger的错误:

这里有一个自己写的宏:

_forbid_animation_begin

它主要目的是取消iOS对图层设置颜色,线条等属性时系统自动产生的动画,提高效率。

这个宏我是这样写的:


它是系统定义的一个事务,我自己写的这个宏必须要成对出现

_forbid_animation_begin

_forbid_animation_end

而我恰恰粗心忘记了 _forbid_animation_end

也就意味着代码中出现了系统的[CATransaction begin] ( 也就是告诉系统,现在开始做CALayer的变化事务了。。。),但是最终没有事务的提交。也就导致后面所有对图层的操作,系统都认为是一个未完成的事务,也就仿佛整个屏幕被“冻结”了一般。。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容