野指针检测

什么是野指针

维基百科里给的定义:

当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称迷途指针(即通常说的野指针)。

若操作系统将这部分已经释放的内存重新分配给另外一个进程,而原来的程序重新引用现在的迷途指针,则将产生无法预料的后果。

因为此时迷途指针所指向的内存现在包含的已经完全是不同的数据。

野指针分类:

引用腾讯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替换

参考文档

iOS-底层原理36:内存优化(一) 野指针探测

iOS Zombie Objects(僵尸对象)原理探索

iOS野指针定位总结

你可能感兴趣的:(野指针检测)