陈其锋,腾讯软件开发工程师,主要负责iOS平台音视频功能开发,热衷于移动开发,以及各类APP体验。
是的,你没有看错,现在要说的就是提高Crash率!
欲让其灭亡先让其疯狂,我们当然不是人为制造Crash,准确地说,是使隐藏的随机性Crash暴露出来,提高测试时的Crash率,从而降低版本发布后的Crash率。
写C、C++代码的同学应该都清楚,Crash最多的原因通常有两种,一种是多线程,一种是野指针。这两种Crash都带随机性,而且这两种Crash有相当一部分都很难区分,甚至大量的Crash只有系统栈,如果不能根据日志重现,几乎是无解,让人非常蛋疼。
本文主要讨论的方向是Obj-C的野指针。Obj-C的野指针最常见的一种栈是objc_msgSend,从Bugly上报的Crash数据来看,objc_msgSend的量占了五分之一,这其中大多数是Obj-C野指针。当然也有相当多的Obj-C野指针不是这种表现,所以野指针的Crash体量非常惊人。
为什么Obj-C野指针的Crash那么多?
我们有这么多自动化和人工测试流程,而且还有几轮的灰度过程,其实很多Crash场景都应该已经覆盖到了,但随机性意味着,测试的时候它没有问题,等用户用了才有问题,这种情况该怎么办?!
我觉得关键在于它的随机性,随机性问题我初略地分为两类:
第一类是跑不进出错的逻辑,执行不到出错的代码,这种可以提高测试场景覆盖度来解决。