前语
关于iOS开发来说,日常闲暇做得最多的事(除了摸鱼)便是处理上报的crash了。有的crash的处理还是十分检测能力的,处理完疑问crash也十分有成就感。所以想记载自己在处理crash过程中的思路和进程。一是期望通过量变来提高自己的能力,二是期望其他人假如有相似的crash能提供一些处理问题的创意。后续也会更新,乃至会把没有处理的crash也放出来,期望看到的小伙伴能够给我点建议,互相沟通。
UI相关
事例一:
Exception Type: EXC_CRASH (SIGABRT)
Crashed Thread: 0 Application Specific Information:*** Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘UICollectionViewLayoutAttributes: -setFrame: requires finite coordinates <UICollectionViewLayoutAttributes: 0x12801c1d0; index path: (0-0); frame = (0 0; 0 0)> – {{nan, 0}, {64, 64}}’
难度:✭✭✭✩✩
溃散仓库信息:
剖析: 根据仓库不能得到有用信息。检查其用户活动页面,在其页面中找到UICollectionView,而且itemSize为 {64, 64}},能够看到是x坐标算出来一个nan的原因,cell的x坐标的核算肯定是和contetnEdge,minimumLineSpacing,检查代码发现刻意代码:
假如count为1的话分母为0核算会有问题,增加判断后,即可修复。
总结:
一个float类型的值除了一个为0的数,得到的+inf(正无量),关于后续的对+inf的float值做的加减乘除的操作会遇到nan。
事例二:
Exception Type: EXC_CRASH (SIGABRT)
Crashed Thread: 0,Application Specific Information:*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘Application tried to present modally a view controller <_SFAppAutoFillPasswordViewController: 0x10750dd10> that is already being presented by <UIKeyboardHiddenViewController_Autofill: 0x10750e2b0>.’
难度:✭✭✭✩✩
溃散仓库信息:
剖析: 这个溃散仓库信息没有任何有用信息,异常原因里边有说到2个Controller,查阅材料发现是体系的,有一个是主动填充密码的。然后再通过用户页面记载看,是在登录页面,那么目前已经定位到了溃散的页面,之后我又检查了其他几个溃散信息,发现体系版别都是16.1.1!!莫非是体系坑我?当我找到这个的时分,我确信了我内心的猜测。
苹果爸爸坑我,你不仁就别怪我不义了。
NSString *versionStr = [UIDevice currentDevice].systemVersion;
/// 该体系版别会产生crash,在此版别去除该功用(暂行)
if (![versionStr isEqualToString:@"16.1.1"]) {
_pwdTextField.secureTextEntry = YES;
}
假如是16.1.1就暂时封闭主动填充功用。为了溃散率,只能这样了。
内存相关
事例一:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Crashed Thread: 0
难度:✭✭✩✩✩
溃散仓库信息:
溃散代码:
剖析:在刚看到这个代码的时分我十分纳闷,天王老子来了,这段代码也没毛病。直到我看到了一个十分要害的信息 —- 这个View类没有被强引证,只是在被需要的时分add到Key Window 上了。有了这个要害的信息,其实就比较好理解了。这里使用了weakify-strongify,但self的引证计数为0,改动不了self被回收的命运,但其被回收,self.timer的内存再次被使用。就会报坏内存拜访异常。
未处理
事例一
Exception Type: EXC_CRASH (SIGABRT)
Crashed Thread: 0
难度:✭✭✭✭✭✭
crash仓库:
其他信息:
溃散之前的页面信息:
查阅材料,发现这个 有可能是同一个问题。其中16.1.1版别的仓库和处理方案里边的仓库是一样的。16.5.1的仓库是上面截图的仓库。测验谈论区的处理方案。因为不能复现,只能等下版别上线才能看到效果。别的这种处理方案会影响交互效率,做了埋点来验证其有用性,假如不能起到防护的效果,还是要去除的。