You need to enable JavaScript to run this app.
导航

iOS崩溃防护

最近更新时间2023.10.12 18:00:09

首次发布时间2021.11.25 18:35:30

崩溃防护提供异常崩溃的保护,可以有效避免用户闪退,规避常规问题的大规模崩溃,增加App稳定性,提升用户体验。异常防护的集成对业务代码没有任何侵入性,能够有效的防止问题的发生,并将问题上报到平台,帮助您及时发现问题。

崩溃防护配置

崩溃防护子模块开关

崩溃防护子模块包括:USEL、Container、Notification、KVO、KVC、NSUserefaults。各个模块与值的对应关系:

子模块功能

下发值

含义

USEL

1(1<<0)

Unrecognized Selector防护。
防护因调用未实现方法造成的崩溃。

Container

2(1<<1)

容器防护。
防护Foundation基础类型(NSString、NSMutableString、NSAttributedString、NSMutableAttributedString、NSArray、NSMutableArray、NSDictionary、NSMutableDictionary)的常用方法,可以防护由于传参不当(比如:数组越界、参数为空等)导致的崩溃。

Notification

4(1<<2)

通知中心防护。

KVO

8(1<<3)

系统提供的监听某一对象属相变化的功能,但在使用中可能存在诸多隐藏问题,KVO防护就是针对该类型的防护。

KVC

16(1<<4)

利用运行时获取和设置参数的一种方式,使用中若操作的对象不存在对应的key则会造成崩溃,KVC防护就是针对该类型的防护。

NSUserefaults

32(1<<5)

对NSUserefaults进行防护,防止因写入非标准类型造成的崩溃。

开启所有功能值计算公式为:
finalValue = 开启功能1的下发值+开启功能2的下发值+···+开启功能6的下发值
例如:

  • 开启所有功能:finalValue=63(0b 0011 1111)
  • 关闭所有功能:finalValue=0(0b 0000 0000)
  • 只关闭容器防护:finalValue=61(0b 0011 1101)

数组防护逻辑规则

在数据创建时,如果传入对象有nil时,系统会产生崩溃。崩溃防护接入后系统不会产生崩溃,但默认情况下,返回的数组为nil。

模式

平台字段

默认状态

严格模式

优先保证数组索引的正确性。创建数组时,若传入的值包含空值,则创建的数组为空。

NSString *strValue = nil;
NSArray *arr = @[strValue, @"str1"];
// arr的结果为nil

兼容模式

优先保证数组创建成功。创建数组时,若传入的值包含空值,则剔除其中的空值,并创建数组。

NSString *strValue = nil;
NSArray *arr = @[strValue, @"str1"];
// arr的结果为@[@"str1"]

崩溃防护

崩溃防护中的统计数据可以帮助应用拦截的异常,但后续仍需要对issue做处理和修复。

前提条件

  • 已接入崩溃防护。Podfile中增加CrashProtector模块。详情请参见iOS SDK接入
  • 已配置崩溃防护采样率、崩溃防护子模块开关和数组创建防护逻辑规则。详情请参见SDK上报配置崩溃防护配置

筛选条件

您可以通过以下筛选条件进行iOS系统的数据筛选:
时间、崩溃详情、设备ID、User ID、issue新增状态、前后台、越狱状态、系统版本、机型、APP版本、APP小版本号、APM SDK版本、下载渠道、省份、使用时长、解析情况、APP页面、issue状态、处理人、标签、自定义维度、PV自定义维度。

崩溃拦截趋势

崩溃拦截趋势展示了筛选条件下崩溃拦截指标的趋势图,您也可以将趋势图按照分组维度展示。指标数据的右侧可以查看与上一周期相比崩溃拦截数据的变化。
图片
指标说明:

指标

说明

拦截崩溃次数

已成功拦截的崩溃的次数

拦截崩溃率

筛选条件下的拦截崩溃次数/筛选条件下的总launch数

拦截崩溃人数

筛选条件下的去重拦截崩溃人数

拦截崩溃用户比例

筛选条件下发生拦截崩溃错误的去重UV数/筛选条件下的去重总UV数

用户数

筛选条件下已拦截崩溃的去重UV数

崩溃拦截分布

崩溃拦截分布通过多维分析来了解已拦截的异常崩溃的分布情况以定义问题。
图片

  • 悬停在分布图上可以查看当前分类的全称,以及在该指标类型中的占比。
  • 默认以系统版本机型APP版本APP小版本号4个维度展示已拦截的崩溃的分布情况,支持单击设置按钮选择其他维度,例如APM SDK版本、前后台、下载渠道等等。
  • 默认根据上报量展示错误的分布情况,您也可以配置为根据用户量展示拦截崩溃的分布。

拦截异常崩溃列表

拦截异常崩溃列表中展示了同一类已拦截的异常崩溃聚合后的issue数据,包括影响用户数、发生次数、崩溃率、最近发生时间、日志上报时间、状态、处理人。
图片

  • 崩溃说明:单击可以跳转到崩溃详情中查看更多崩溃信息。
  • 影响用户数:单击数字后的图标可以预览趋势图,悬浮趋势图可以查看对应的时间。
  • 发生次数:单击数字后的图标可以预览趋势图,悬浮趋势图可以查看对应的时间。
  • 崩溃率:该类拦截异常崩溃的崩溃次数/总launch数。
  • 最新发生时间:最近一次拦截异常崩溃的时间。
  • 日志上报时间:该拦截异常崩溃信息到服务端的时间。
    例如,拦截异常崩溃的发生是在version 1.0版本,但是上报是在version 1.2版本,为了避免信息差,列表会把问题发生时和上报时所有的现场信息进行上报。
  • 排序:列表默认按照影响用户数、发生次数、崩溃率降序排序。单击最近发生时间日志上报时间,可以按照时间降序或者升序排序。
  • 下载:单击右上角下载按钮,下载前100条数据,以.xlsx的文件格式展示列表中的数据。
  • 设置:单击右上角设置按钮,可以自定义列表展示的列数据。除了默认的列数据,您还可以配置:同比发生次数、同比影响用户数、同比崩溃率、影响用户率、同比影响用户率、起止版本。

崩溃详情

issue概述

图片

拦截崩溃趋势

详情拦截崩溃趋势展示了该类issue的崩溃数和影响用户数两个指标的变化趋势。
详情拦截崩溃趋势图和列表拦截崩溃趋势不同,区别如下:

  • 列表拦截崩溃趋势:时间范围内所有已拦截的异常崩溃。
    例如,7天为时间周期,1小时为聚合粒度,可以看到7天内每小时的拦截崩溃趋势,崩溃次数20。
  • 详情拦截崩溃趋势:时间范围内所有已拦截的异常崩溃的聚合。
    例如,7天为时间周期,1小时为聚合粒度,崩溃列表中有5个崩溃项,即系统将20次崩溃分类为5个崩溃项,打开其中一个崩溃项,详情拦截崩溃趋势是同一类崩溃项在7天内的崩溃趋势。

详细信息

详细信息可以查询单次crash的各字段属性。
图片

  • 显示自定义维度:单击可以展示自定义维度。
  • 追查:单击设备标识ID或UserID旁的追查可跳转至**日志查询,**以查询完整的上下文日志流。
  • 通过右上角,可切换crash。

原始堆栈&Retrace

图片

  • 原始堆栈展示的原始堆栈信息,即客户端上传的原始日志中的堆栈信息。
  • Retrace展示的是经过符号化之后的堆栈。
    • 系统堆栈会被处理。
    • 如果未上传符号表,客户端堆栈不会被处理。
    • 如果已上传符号表,客户端堆栈仍未处理,可能是符号表未全部上传。
  • 如果符号表或解析有误,可以重新上传符号表,然后在Retrace的界面单击重试Retrace
  • 复制堆栈便于互相配合分析堆栈信息。

崩溃信息

图片
参数说明:

Key

Value

reason

根据现场情况分析给的结果

protect_type

防护崩溃的类型所在的子模块

符号表

在符号表页面,手动上传符号表。
图片
上传符号表后效果如下:
图片

现场数据

现场数据展示了发生崩溃防护时的程序运行状态。
图片

自定义日志

自定义日志支持回捞、上报自定义的日志内容,包括进程-线程信息、日志级别、日志详情内容,并支持检索筛选。
图片