Lmsgsendnilself

Uninhibited Soul, Free Craziness

记一奇葩至极的bug

| Comments

新版本上线了,依然像往日每次上线一样,期待新版本的用户使用情况。

然而,第二天刚坐上班车,打开微信一看,产品经理发了appstore截图,几个用户反馈app崩溃,不科学吧?测试也没问题呀,难道是偶现。赶紧查着fabric,由于用户体量不小,唰唰的crash在暴增,崩溃率也降至98%。我可是对自己的代码质量和管理规范非常有信心的,而且历史一直如此,难道失足了? 赶紧分析量最大的几个crash,然而涉及貌似不只一处:导航栏的问题、内存泄漏问题、图片问题、移除view的问题、广告相关的问题 ?
(详细崩溃栈太长 请参考https://forums.developer.apple.com/thread/69035,这是在下文解决问题中发现的和我们遇到的问题相似的堆栈)

匆匆忙忙到了公司,这时候crash还在飞速增加,app之前一直长期都是保持在99.8%左右,这影响用户可大了,淡定,收拾下心情,排查。

1 测试还没上班。自己赶紧用手头的两台台机器测了测,依然没问题,很正常。问题无法复现。
2 赶紧让pm在qq群微博等平台联系出问题的用户。
3 同时边研究边google相关崩溃日志,尝试寻找问题。但是仍无头绪。依然无法复现
4 pm告诉我qq群用户没一个人反馈闪退问题,这就怪了。怎么应该也得出一两个有问题的吧? 不一会,pm又告诉我微博有一个用户留言新版本崩溃。赶紧赶紧联系。

与此同时,几个测试也在各种测测测。

又回归到了fabric,一个个过着里面的crash log,感觉整个app就像牵一发动全身,虽然两三个是量最大的,但是其他的bug量也不小,不科学啊 ,一个app到处闪退,这难以想象。又看了下所有bug的机型,全集中在iOS9.0,iOS9.1,iOS9.2,以上版本都没问题。

总结思考了下,大胆给bug下了两个特点:1随机触发 2仅限iOS9.3以下

赶紧告诉测试这两点,负责测试的同事说手头iOS9版本的手机只有iOS9.3以上,并没有iOS9.0,iOS9.1,iOS9.2,我去,赶紧去跟测试组其他产品线的借。同时在这期间,用模拟器调试,一切都很正常,好吧模拟器并不能完全对等真机。

借来一个iOS9.2的,测试同事一测果然崩溃。赶紧借过来手机,跟代码联调,竟然又完全没事,什么鬼?难道是release和debug包的区别?于是release模式下打了一个pyger的包,仍然用起来没有任何问题。奇葩,得不出问题使得和xcode无法联调。即使尝试性修改代码也无法验证到底有没有准确定位改好。

赶紧用真机又安了个appstore版本,试图找到一些特征。大量尝试使用之后发现,有至少一半是在广告展示的时候崩溃的,其他有一启动就崩溃,还有进入到app主页,然后随便点点也会崩溃。总之,广告时崩溃最多的,那难道和广告有关系?排查了下广告代码,至少从代码层面没看出什么问题。

仔细回顾了下,又根据测试提出另一个特征:线上崩溃,线下的没问题。虽然我内心对这个特征是持怀疑态度的。但是来不及由于,赶紧告诉同事这些特点,一起google找找有没有类似情况。最后找到下面这篇发:
https://forums.developer.apple.com/thread/69035

bug描述很相似,关键是bug的崩溃栈也很像!赶紧看下面的分析:

终于有了些眉目,症状很像,应该八九不离十,Assets.car 里面图片格式有问题。

至此,总算有一定依据的找到了疑凶。

抓紧了解相关的问题:
http://stackoverflow.com/questions/39404285/xcode-8-build-crash-on-ios-9-2-and-below
https://forums.developer.apple.com/thread/60919
http://openradar.appspot.com/radar?id=6164844138987520

看了一堆文章发现,这个问题在上传包到itune connect的时候是有错误提示的。
那为什么我们的app验证上传都通过了呢?

在查找过程中看到这么一段话:

‘If your Deployment Target is set to either 8.3 or 8.4 and you have an asset catalog then you will receive this same error message, even if you do not actually have 16-bit or P3 assets. In this case you will either need to lower your Deployment Target to 8.2, or move it up to 9.x.’

也就是说 deployment target 的设置版本不同会导致问题是否提示,好坑啊。我们的deployment target 是7.0。不幸,这个版本当时上传包的时候没有提示。

好吧,继续看。

某位开发者在遇到类似问题后处理的方案。
赶紧按里面的步骤执行脚本尝试一下,
果然,Assets.json里面一搜,有几处P3,并且同为同一张图片,就是广告的跳过按钮!
更加验证的原因是广告跳过按钮新版本确实换了一张图片。

至此,bug总算有一条完整的犯罪证据链支撑。虽然仍是有疑虑,赶紧处理了下,因为上文提到了之后testflight和appstore的包才会触发bug,提交了testflight。

itunes connect对ipa包处理好后,赶紧内部测试,一通测试之后,iOS9.2的机子没有发生任何闪退,总算找到了谁的锅。

赶紧hotfix了一下,解决了这个古怪至极的bug,中午饭都没顾上吃,终于可以好好吃顿饭了。

后来和其他组的两个老司机又聊了聊这个问题解决方案,仍觉得很神奇,从未遇到过这个问题。好吧,也算是个幸运,遇到一个如此奇葩的bug也是不容易。

Comments