性能调优、测试

iOS Crash异常捕获及快速分析

2020-10-16  本文已影响0人  格雷s

1.前言

  • 一套系统、一款app、一个功能、甚至一行代码都可能会出现crash,crash伴随着我们的日常生活,如果我们正在玩游戏,LOL打团时,游戏闪退、电脑死机,那就想要跳起来砸键盘了。质量太差的产品,会导致产品负面评价越来越多,用户流失越来越严重,如果在关键环节出现了crash,比如下单、支付等,那就会造成直接损失。作为技术开发,我们对于这种问题要抱有零容忍的态度,虽然我们不可能做到 0 crash,但是我们要尽量避免项目中存在的crash
  • crash的原因有很多,在工作中我们也有很多方法去避免造成crash,比如自定义一个安全处理方法,做好异常crash因素判断。但是为什么没有一个0crash的系统呢,就不能提供给我们绝对稳定可靠的API吗?
  • 个人认为,每个API的设计都有其作用价值。比如iOS系统提供的[NSAarray objectAtIndex:]方法,如果出现越界就会crash,在项目中也有[NSArray safetyObjctAtIndex:]这样的自定义安全处理方法,越界时返回nil,但是返回nil,就一定是安全的吗?一定是符合所有场景需求的吗?比如某一个代码异常时,后面的代码是否应该执行,执行是否会带来其他的负面影响

2.异常指标

当开发阶段出现crash时,我们可以直接通过xcode定位crash堆栈,在测试阶段crash时,我们勉强还可以直接拿到测试机连接xcode查看日志,但是线上用户或者拿不到crash测试机的情况下,我们需要自己收集crash日志

造成crash的异常主要类型

NSArray *arr = @[@1,@2];
@try {
  [arr objectAtIndex:3];
} @catch (NSException *exp){

} @finally {

}
NSMutableData *mData = [[NSMutableData alloc] initWithCapacity:1];
NSUInteger len = 1844674407370955161;
[mData increaseLengthBy:len];


*** Terminating app due to uncaught exception 'NSMallocException', 
reason: 'Failed to grow buffer'
static const int g_fatalSignals[] =
{
 SIGABRT,//调用abort生成的信号,有可能是NSException也有可能是Mach
 SIGBUS,//非法地址
 SIGFPE,//算术运算错误
 SIGILL,//执行非法指令
 SIGPIPE,//进程间通信产生,通信管道破裂
 SIGSEGV,//非法访问地址,比如野指针,通常是对象的异常释放,指针未清空
 SIGSYS,//非法的系统调用
 SIGTRAP,//断点指令,一般出现在debug调试时
};

3.crash收集

4.Crash快速分析

线上有个偶现的crash,crash Type为SIGSEGV,且thread不定,子线程,主线程都会存在,但是代码段相同,由于SIGSEGV是野指针异常类型,且由于在多线程中都会触发,说明问题基本上是多线程的对象读写安全问题

5.参考资料

上一篇 下一篇

猜你喜欢

热点阅读