什么是野指针
维基百科里给的定义:
当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称迷途指针(即通常说的野指针)。
若操作系统将这部分已经释放的内存重新分配给另外一个进程,而原来的程序重新引用现在的迷途指针,则将产生无法预料的后果。
因为此时迷途指针所指向的内存现在包含的已经完全是不同的数据。
野指针分类:
引用腾讯bugly团队的一张图解
背景
目前国际美居APP存在大量零散的野指针闪退
野指针所指向的内容存在很大的不确定,可能是未使用的内存,也可能是已经被覆盖的内存。
同时野指针还有崩溃堆栈延时、随机、不必现等特性造成了crash的难以准确定位以及修复
解决思路
目前xcode提供两种野指针检测的方法:Malloc scribbie 和 Zombie Objects
Malloc scribbie
根据苹果官方文档显示,Malloc scribbie主要在释放内存 dealloc 在内存上填 0x55
当访问到对象内存中填充的是0x55时,程序就会出现异常
Zombie Objects
把释放的对象,全都转为僵尸对象【苹果文档】
当僵尸对象再次被访问时,将进入消息转发的流程,开始处理僵尸对象访问,输出日志并发生 Crash
推荐Zombie Objects方式:
鉴于我们项目大部分代码都是OC代码,c\c++比较少
方案预研
主要考虑以下几点
监控策略:
全量监控
自定义对象监控
黑名单
白名单
内存回收策略:
最大僵尸内存空间
内存预警处理
FIFO
僵尸对象处理策略:
crash上报(sit/uat)
error上报(线上,降低crash率)
降级策略:
热修复,关闭僵尸监控
oss配置文件,APP启动读取配置
监控流程
开启检测
dealloc替换
参考文档