浅谈iOS Crash(一)
一、僵尸对象(Zombie Objects)
1、概述
- 僵尸对象:已经被释放掉落的对象。一般来说,拜访已经释放的对象或向它发消息会引起缺点。因为指针指向的内存块认为你无权拜访或它无法履行该消息,这时刻内核会抛出一个异常( EXC ),注解你不克不及拜访该存储区域(BAD ACCESS)。(EXC_BAD_ACCESS类型缺点)
- 调试解决该类问题一般采取NSZombieEnabled(开启僵尸模式)。
2、应用NSZombieEnabled
- Xcode供给的NSZombieEnabled,经由过程生成僵尸对象来调换dealloc的实现,当对象引用计数为0的时刻,将须要dealloc的对象转化为僵尸对象。如不雅之后再给这个僵尸对象发消息,则抛出异常。先选中Product -> Scheme -> Edit Scheme -> Diagnostics -> 勾选Zombie Objects 项,显示如下:

设置NSZombieEnabled.png
- 然后在Product -> Scheme -> Edit Scheme -> Arguments设置NSZombieEnabled、MallocStackLoggingNoCompact两个变量,且值均为YES。显示如下:

设置NSZombieEnabled和MallocStackLoggingNoCompact.png
- 仅设置Zombie Objects的话,如不雅Crash产生在当前调用栈,体系可以把崩溃原因定位到具体代码中;然则如不雅Crash不是产生在当前调用栈,体系仅仅告诉崩溃地址,所以我们须要添加变量MallocStackLoggingNoCompact,让Xcode记录每个地址alloc的汗青,然后经由过程敕令将地址还原出来。
- Xcode 6之前还可以应用gdb,可以应用info malloc-history address敕令来将产生崩溃的地址还原成具体的代码行,Xcode 7之后只能应用lldb,应用敕令bt来打印调用客栈。下面是某Crash经由过程僵尸模式调试,应用bt查看的效不雅。

bt效不雅.png
解释:发版前要将僵尸对象检测这些设置都去掉落,不然每次经由过程指针拜访对象时,都去检查指针指向的对象是否为僵尸对象,这就影响效力了。
3、代码中的留意事项

在ARC时代,避免拜访释放掉落的内存,代码须要留意的处所有:
- 检查代码1 :不克不及应用assgin或 unsafe_unretained润饰指向OC对象的指针
assgin和unsafe_unretained表示不持对象,是弱引用。如不雅指针指向的对象被释放了,它们就变成了野指针,很有可能产生Crash。
建议1: assign仅用于润饰NSInteger等OC基本类型,以及short、int、double、构造体等C数据类型,不润饰对象指针;
建议2: OC对象属性一般应用strong关键字(默认)润饰。
Core Foundation等底层操作它们不支撑ARC,还须要手动内存治理。
建议: 留意CF对象的创建和释放。
1、概述
- 野指针是指向一个已删除的对象 或 未申请拜访受限内存区域的指针。而这里的野指针主如果对象释放后,指针未置空导致的野指针。该类Crash产生比较随机,找出来比较费劲,比较常见的做法是,在开辟阶段,进步这类Crash的复现率,尽可能得将其发明并解决。
- 向OC对象发出release消息,只是标记对象占用的那块内存可以被释放,体系并没有急速收回内存;如不雅此时还向该对象发送其他消息,可能会产生Crash,也可能没有问题。下图是 拜访野指针(指向已删除对象的指针)可能产生的情况。

拜访野指针可能产生的情况图.png
- 大年夜上图可以知道,野指针造成的Crash的随机性比较大年夜,然则被随机填入的数据是弗查拜访的情况下,Crash是必现的。我们的思路是:想办法给 野指针指向的内存填写弗查拜访的数据,让随机的Crash变成必现的Crash。
设置了Enable Scribble,在对象申请内存后在申请的内存上填0xaa,内存释放后在释放的内存上填0x55;如不雅内存未被初始化就被拜访,或者释放后被拜访,Crash必现。
2、设置Malloc Scribble
Xcode供给的Malloc Scribble,可以将对象释放后在内存上填上弗查拜访的数据,将随机产生变成不随机产生的工作,选中Product->Scheme->Edit Scheme ->Diagnostics – >勾选 Malloc Scribble项,结不雅如下:

设置Malloc Scribble.png
解释:该办法必须连接Xcode运行代码才发明,不合适测试人员应用。可以基于fishhook ,选择hook对象释放的接口(C的free函数),达到和设置Enable Scribble一样的效不雅。详情参考若何定位Obj-C野指针随机Crash(一):先辈步野指针Crash率、若何定位Obj-C野指针随机Crash(二):让非必现Crash变成必现 和若何定位Obj-C野指针随机Crash(三):加点黑科技让Crash自报家门
推荐阅读
深度进修:几何视角关于深度进修最令人吃惊的事实莫过于它的简单程度。10 年前,没人想到我们会应用简单的梯度降低参数模型在机械认知范畴取得如斯卓越的成就。如今,只须要在足够多的样>>>详细阅读
本文标题:浅谈iOS Crash(二)
地址:http://www.17bianji.com/lsqh/36391.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示