Skip to main content

异常退出分析

iOS 异常退出分析包含了 App 进程的所有退出情况,包括异常和正常的退出。Bugly 原有监控下,与进程退出相关的指标有 Crash、ANR 和 FOOM 三类退出。

  • Crash 是指程序崩溃导致退出的情况,在 iOS 系统中,crash 是指程序运行过程中出现了严重错误而终止运行的情况;
  • ANR 是指 App 在响应用户或系统事件时超时,被系统通过 SIGKILL 信号终止进程的情况;
  • FOOM 是指 App 进程占用了过多内存,触发到系统内存上限后,被系统通过 SIGKILL 信号终止的情况。

但在实践中发现,除此以上情况外,还有其他因素导致 App 进程异常退出。而上述类型未考虑到这类情况,部分退出不是被错误归类到其他类型中,就是丢弃无感知了。为了将这些情况都监控起来,Bugly 新增了异常退出分析能力。

异常退出类型​

在异常退出中,Bugly 会在每一次进程启动时,检查上一次进程退出前的最后状态,以判读上一次退出的原因。因此,理论上每一次进程的退出,都可以在异常退出中找到其进程退出前的最后信息。

按照进程最后信息进行分类判断,目前情况下,Bugly 将退出进行了以下分类:

  • 异常退出

    • Crash(可捕获):传统的 crash 退出;
    • ANR:主线程卡死超时,被系统杀死;
    • FOOM:触发到系统内存限制,被系统杀死;
    • 启动超时:启动超时,被系统杀死(也可以理解为启动阶段卡死);
    • 键盘启动超时:键盘创建超时退出,仅适用于键盘 Extension,App 进程无此项;
    • 其他:其他未判断出的退出情况;
  • 正常退出

    • 用户退出:用户杀进程;
    • 设备重启/升级:设备重启或 App 更新导致的进程重启动;
    • 后台被杀:App 在后台被系统杀死(基于 iOS 进程管理方式,后台回收资源等情况杀死 App 进程);

异常退出数据​

每一次进程退出的上报,会包含如下信息:

appexit_example

基本信息​

基本信息与 Bugly 中的其他个例上报类似,包含基本信息,如用户ID、设备ID 等,此处不再赘述。与该监控相关的信息只有退出原因一条,其取值为对应的退出原因,时上述退出类型的枚举值之一。

上报信息​

上报信息也会类似,包含的是退出的基本信息,如上报时间、发生时间等,不再赘述。有两点不同需要格外强调:

  • 发生时间:由于退出事件的特殊,例如被 SIGKILL 杀死或着后台挂起进程的退出等,无法直接获得其发生的时间,Bugly 会取监控到的最后活跃时间作为事件发生时间;
  • 关联异常:若此次退出为 Crash、ANR 或 FOOM,这类已监控到的类型,此处会展示其对应链接,可点击跳转到对应事件的详细信息查看;

退出附件​

退出附件中包含的信息为目前 Bugly 为监控 App 退出收集到的各类信息,因此并非每一条信息都与当前的退出有直接的关联,此处提供仅是为了方便查看和作为判定的参考作用。

tick info​

tick info 包含的是 Bugly 周期监控采集到 App 中的最后状态,其主要字段和含义如下:

  • last_vc: 最后一次采集到的 ViewController 名称,若业务通过 +[Bugly setSecene:] 设置了自定义场景,则此处为设置的对应值;
  • last_app_state: App 最后状态,为 int 枚举值,其取值与 UIApplicationState 一致;
  • app_state_update_time: App 最后状态更新时间,标准 UNIX 时间戳,单位为秒;
  • app_fg_active_time: App 前台活跃时常,单位为秒。需要注意的是,此值在 App 退后台时才会更新,因此当前表现的值为上一次退后台前的活跃时长,若一直未进入后台,则此值为 0;
  • last_enter_fg_time: App 上一次进入前台的时间,标准 UNIX 时间戳,单位为秒。使用最后活跃时间 last_active_time 减去此值,便可以获得最后一次在前台的活跃时长,即可用这种方式更新 app_fg_active_time;
  • last_active_time: App 最后活跃时间,标准 UNIX 时间戳,单位为秒;
  • main_thread_tick_last_time: 主线程最后活跃时间,标准 UNIX 时间戳,单位为秒;
  • main_thread_tick_times: 主线程活跃次数,在主线程的每一个 runloop 中,进行一次活跃检查,记录最后活跃时间,并统计此次数;
  • looper_monitor_tick_last_time: 卡顿监控线程的最后活跃时间,标准 UNIX 时间戳,单位为秒;
  • looper_monitor_tick_times: 卡顿监控线程活跃次数,在卡顿监控线程的每一个检查周期中,更新其最后活跃时间,并统计此次数;

tick info 中的信息主要用于判定 App 的最后状态。例如 App 最后状态是在前台还是后台,主线程是否正常活跃,最有状态是否与监控线程同步活跃而非卡死等信息。

exit info​

exit info 包含的是监控到 App 退出相关的信息,其主要字段和含义如下:

  • signal: Crash 监控到的 signal 信号,该值与 <sys/signal.h> 中的 SIGXXX 一致;
  • exception: Crash 监控到的 exception 值,该值与 <mach/exception_types.h> 中的 EXC_XXX_XXX 一致;
  • exc_code: exception 对应的 code 值,其包含两个值 code1 与 code2,详细定义可查看 ux_exception.c 中定义(XNU内核源码);
    • code1
    • code2
  • is_deadlock: 是否是 deadlock(ANR),由 Bugly 卡顿监控模块提供;
  • is_crash: 是否是已捕获 crash,由 Bugly Crash 监控模块提供;
  • is_exit: 是否是调用 exit() 产生的退出,该退出为进程正常退出;
  • is_terminate: 是否是用户手动杀进程,该值由 UIKit 中 UIApplicationWillTerminate 提供;
  • cpu_wakeups: cpu wakeups 信息,由 Bugly 周期采集获得;
    • wakeups_count:
    • interrupt_wakeups_count:
    • timer_wakeups_count:
    • wakeups_duration: 对应 wakeups 信息的持续时间,单位为秒;
  • last_update_time: exit info 最后更新时间,标准 UNIX 时间戳,单位为秒;

exit info 中的信息主要是程序执行过程中的异常信息,如触发内存错误时的 signal 信号等。cpu_wakeups 的信息主要是程序执行过程中的 CPU 唤醒信息,在 iOS 系统中,高 wakeups 的情况,会触发系统告警或杀死进程。

在目前收集到的系统 wakeups 报告中,wakeups 的限制为 300s 内平均 150 次每秒。

vmmap info​

vmmap info 提供进程活跃期间,最高内存峰值时采集的 vmmap 信息。其信息的含义与展示方式与 FOOM 中的 vmmap info 相同。

vmmap 信息的目的是提供 App 进程活跃期间的内存峰值大致情况,对于部分 FOOM 但未被准确判定的问题可能有一定的帮助。

统计分析​

异常退出分析更重要的作用是提供给业务各退出问题的占比情况,因此统计分析的意义更大。

appexit_analysis

Bugly 目前提供“数据概览”、“上报趋势”、“异常退出原因分析”及“统计分布”几项分析能力。所有的统计分析,都是展示当前筛选条件下筛选出的数据的统计情况。

与其他指标和个例类似,Bugly 提供了丰富的筛选条件可供选择,除了基础类型外,在异常退出分析中,提供了退出原因筛选条件,可以多选,以便筛选出需要关注的退出类型。

数据概览​

数据概览展示当前选中数据中的整体情况,包括“异常退出次数”、“影响用户数”、“影响设备数”、“异常退出率”、“正常退出次数”。各个指标的含义和计算如下:

  • 总退出次数:总共上报的退出次数(因内存指标为每次启动报上一次的退出数据,可以理解为上报的次数,除未开启监控部分);
  • 异常退出次数:前述中属于异常退出类型的数量;
  • 正常退出次数:前述中属于正常退出类型的数量;
  • 异常退出率:异常退出次数/总退出次数;
  • 总退出设备数:总退出次数按照设备id去重;
  • 总退出用户数:总退出次数按照用户id去重;
  • 异常退出设备数:异常退出按照设备id去重;
  • 异常退出用户数:异常退出按照用户id去重;
  • 异常退出设备率:异常退出设备数/总退出设备数;
  • 异常退出用户率:异常退出用户数/总退出用户数;

需要注意的是,此处所有的计算,都是基于上面筛选条件进行的统计。意味着若是选中的退出原因中都是异常退出,则此处的异常退出率可能为 100%。

上报趋势​

上报趋势中,会将数据概览中的各项指标,按照时间粒度统计,展示其对应的趋势变化情况。

异常退出原因分析​

异常退出原因分析,则是将现选中数据中的退出,按照退出类型进行统计,可以选择对应的指标进行展示。

统计分布​

统计分布则是对应数据在不同维度下的分布情况,例如当前数据下,按照应用版本统计,看各个版本中的占比。可在“设置”中选择需要展示的维度,此处支持的维度选择和其他统计分布类似。