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

Zombie分析

最近更新时间2023.05.18 17:58:40

首次发布时间2022.06.27 19:46:04

Zombie是僵尸对象,即已经释放的对象重复使用,导致野指针问题。
常见场景的野指针问题,在开发过程中借助Xcode工具可以快速暴露并修复,但是还有一些问题由于触发场景比较复杂,被遗漏到了线上,并且线下也难以复现,而这些野指针导致的崩溃问题,仅根据崩溃时的堆栈难以有效排查问题。为了解决这个痛点,应用性能监控全链路版为开发者提供了线上Zombie检测功能。

注意事项

  • Zombie模块能够暴露线上的野指针问题,并且捕获导致野指针的类以及操作堆栈。
  • 野指针不一定会导致崩溃问题,但是此模块接入后会在野指针访问时主动抛出异常,因此可能导致您的应用崩溃率上升,建议仅在灰度时少量开启。

步骤一:判断应用是否存在野指针

通过筛选项中的崩溃详情快速定位。
崩溃调用栈为Objective-C Runtime方法,例如objc_msgSend,objc_retain,objc_release等。
图片
图片
某些情况下,已经释放的内存被操作系统重新分配,导致内存中的对象不是您期望的对象,触发doesNotRecognizeSelector异常。

步骤二:接入SDK

根据已有信息无法解决野指针问题,可以在SDK引入Zombie模块,并配置zombie对象采样率。通过线上Zombie分析功能获取更多现场信息,来解决野指针问题。

  • 接入Zombie模块。具体请参见Subspecs说明

  • 配置zombie对象采样率。具体请参见SDK上报配置
    zombie相关的指标说明:

    指标

    说明

    zombie对象采样率

    配置此选项可以控制只对线上部分用户开启功能,默认采样率为0。

    zombie对象采集白名单

    配置此选项后,只有配置中指定的类发生了野指针问题,才会抛出异常并且捕获现场信息。如果不配置此选项,则任意类发生野指针问题,都会触发zombie采集策略。

    zombie对象分析白名单

    分析野指针问题时,可能需要知道对象是如何被释放的。配置此选项后,配置中的类的对象释放时,会保存释放的堆栈,如果后续发生了野指针问题,则会将Dealloc堆栈一同上报,可以在崩溃详情页的崩溃信息 > Dealloc堆栈中查看该信息。
    捕获堆栈对性能有影响,建议先不要配置此选项,当线上发现野指针问题,且无法排查到具体原因时,再结合此选项来获取更多信息。

    dealloc堆栈最大数量

    控制SDK最多保存多少个对象的释放堆栈,增加数量可以缓存更多堆栈,避免野指针发生时缓存中没有对象的释放堆栈;减少数量可以降低对内存的影响。

步骤三:消费数据

您可以在崩溃分析中,消费线上zombie分析上报的数据。

  1. 根据Zombie分析堆栈特征,查找Zombie分析上报的崩溃堆栈。
    1. zombie分析上报的崩溃堆栈,堆栈中有一行zombieMsgHandle的调用栈。
      图片
    2. 根据崩溃信息查看是哪个类的对象发生的野指针。
      图片
  2. 堆栈无法定位问题,可以配置zombie对象分析白名单,把触发野指针问题的类添加到白名单中。
    图片
  3. 根据上报的Dealloc堆栈,查看对象被释放的时间点。
    图片
  4. 定位到业务代码。
    图片