野指针定位

Posted by 杜文杰 on 2022-09-16

什么是野指针:

C语言中的野指针:
定义1个指针变量.没有初始化.这个指针变量的值是1个垃圾值,指向1块随机的空间.指针指向的地址没有初始化。这样的指针就是野指针。
char *a;
OC中的野指针:
指针指向的对象已经被回收了.这样的指针就叫做野指针.
// 悬垂指针:
__unsafe_unretained Person *p1;
@autoreleasepool {
Person *person = [[Person alloc] init];
p1 = person;
}
[p1 run];

野指针的分类:

野指针引发了哪些问题:

1,上线前没有发现,上线后crash。
2,crash日志看不到有用信息

解决思路:

1,让随机变的不随机、提高测试覆盖场景。
2,跟踪真实被销毁对象的堆栈信息。

工具:

Zombie Object
Address Sanitizer
Malloc scribble

Address Sanitizer

原理:当程序创建变量分配一段内存时,将此内存后面的一段内存也冻结住,标识为中毒内存。

(黄色是变量所占内存,紫色是冻结的中毒内存)
当程序访问到中毒内存时(越界访问),就会抛出异常,并打印log,如果变量释放了,变量所占内存也会标识为中毒内存,这时候访问就会抛异常

Malloc scribble

原理:原理:在对象申请内存后,在申请的内存上填入0xAA,内存释放后填上0x55;如果内存未被初始化就被访问,或者释放后被访问,抛出异常。

Zombie Object

原理:用生成的僵尸对象来替换dealloc的实现,当对象引用计数为0的时候,将需要dealloc的对象转化为僵尸对象,如果之后再给这个僵尸对象发消息,则抛出异常,并打印相应的信息。

僵尸对象:一个对象已经解除了它的引用,已经被释放掉,但是仍然可以接受消息,这个对象就是僵尸对象。

嵌入app:

系统的工具无法嵌入app,需要手动实现类似zombie object。如果要安装到手机上,那么需要考虑到性能问题,可以从下面两方面来着手处理:

1,30秒后释放.
2,白名单机制(比如NSString,UIView等系统类创建,释放非常频繁,而这些实例发生野指针概率非常低;其他会造成崩溃的NSBundle;自身相关的类,否则循环调用)


欢迎访问我的微博留言:肚子吃撑的杜