Zombie是僵尸对象,即已经释放的对象重复使用,导致野指针问题。
常见场景的野指针问题,在开发过程中借助Xcode工具可以快速暴露并修复,但是还有一些问题由于触发场景比较复杂,被遗漏到了线上,并且线下也难以复现,而这些野指针导致的崩溃问题,仅根据崩溃时的堆栈难以有效排查问题。为了解决这个痛点,应用性能监控全链路版为开发者提供了线上Zombie检测功能。
通过筛选项中的崩溃详情快速定位。
崩溃调用栈为Objective-C Runtime方法,例如objc_msgSend,objc_retain,objc_release等。
某些情况下,已经释放的内存被操作系统重新分配,导致内存中的对象不是您期望的对象,触发doesNotRecognizeSelector异常。
根据已有信息无法解决野指针问题,可以在SDK引入Zombie模块,并配置zombie对象采样率。通过线上Zombie分析功能获取更多现场信息,来解决野指针问题。
接入Zombie模块。具体请参见Subspecs说明。
配置zombie对象采样率。具体请参见SDK上报配置。
zombie相关的指标说明:
指标 | 说明 |
---|---|
zombie对象采样率 | 配置此选项可以控制只对线上部分用户开启功能,默认采样率为0。 |
zombie对象采集白名单 | 配置此选项后,只有配置中指定的类发生了野指针问题,才会抛出异常并且捕获现场信息。如果不配置此选项,则任意类发生野指针问题,都会触发zombie采集策略。 |
zombie对象分析白名单 | 分析野指针问题时,可能需要知道对象是如何被释放的。配置此选项后,配置中的类的对象释放时,会保存释放的堆栈,如果后续发生了野指针问题,则会将Dealloc堆栈一同上报,可以在崩溃详情页的崩溃信息 > Dealloc堆栈中查看该信息。 |
dealloc堆栈最大数量 | 控制SDK最多保存多少个对象的释放堆栈,增加数量可以缓存更多堆栈,避免野指针发生时缓存中没有对象的释放堆栈;减少数量可以降低对内存的影响。 |
您可以在崩溃分析中,消费线上zombie分析上报的数据。