ACCESSiOS 僵尸对象调试

难点讲述

近年,发现Xcode的模拟器越来越不靠不住了,应用开发完,在模拟器上边种种流畅各类运行得飞起,可是安装到真机之后,就夭折了,是闪退啊!~~o(>_<)o
~~

在模拟器上边小意思,不过装到真机的时候,发现闪退,那样相比难定位到原因。
艺术仍然有的,难题也总能解决的。
办法一:大家也许通过搜集手机的日记,查看崩溃日志;
方法二:通过集成第三方的插件来追踪bug(例如:腾讯的bugly、友盟),可是指出只用一家的,因为多家的一起用,可能会有其余难题;
办法三:真机调试。

为了火速定位并解决难点,最终照旧选项了方法三,并且最终解决了难题。

1. 真机调试

从Xcode7之后,真机调试已经是未曾其余秘诀了,我们只必要登记一个苹果的开发者账号即可以无证件也足以真机调试,操作如下:

ACCESS,先是步、打开Xcode 选用屏幕左上角Xcode-> PReferencese

设置.png

第二步:选用Account 点击左下角的+按钮登陆Apple ID
其三步:登陆你的Apple ID
第四步:登陆成功以后,在左边会显得小伙伴的账号在iOS和Mac上都是free的,双击这一列(或者点击选取view
details)
第五步:那里须求自然时间取得你的Apple ID的开发者音讯,点击iOS
Development 前面的create ,然后稍等片刻,直到create按钮不见了。

添加Apple ID.png

第六步:到了那边大致已经完工—-开端真机测试:打开必要真机测试的花色插上手机(Xcode第一遍链接手机会很慢,可以拔取Xcode菜单栏中的window->devices查看手机是或不是准备妥当了),拔取品种文件->
General – > Team -> 选用你属于你的Apple ID ,再点击Team 下边的fix
issue修复Team 正下方的警示。

第七步:最后一个标题,你最后会发现Xcode会弹出一个框(process launch
failed: Security),那里须求开辟你手机的装置->通用- >
描述文件-> 选用你的Apple ID – > 点击信任

由来,真机调试的历程就搞好了,是或不是比从前不难多了

3. 例子

为了可以更进一步详细地说明调试僵尸对象,并固定到崩溃的来由,上面列出一个简约的例证来验证:

先创立一个
DebugViewController,然后里面创建一个数组,然后释放,在Controller将要出现的时候,向该数组发送一个音信:

<pre>#import "DebugViewController.h"
@interface DebugViewController ()
@end
@implementation DebugViewController
/*定义一个数组*/
static NSMutableArray*array;
-(void)viewDidLoad
{
[super viewDidLoad];
array= [[NSMutableArray alloc]initWithCapacity:5];
[array release];//释放掉该数组
}

  • (void)viewWillAppear:(BOOL)animated{
    [array addObject:@”Hello”];//使用释放掉的数组
    }
    @end
    </pre>

在大家预料之中,程序崩溃了,报错音信如下:

崩溃新闻.png

俺们用LLDB po大家的数组array对象,同样没有重回

po数组对象

开辟“活动监视器”,在过程列表中找到测试APP对应的进度号PID(Xcode启用调试后会在进程列表中找到对应APP的经过)

挪动监视器.png

从地点标下划线的地点,大家收获多个第一的新闻:

APP进程ID:21122

崩溃地址:0x60008170cfd0

打开“终端”,输入以下命令:

sudo malloc_history 21122 0x60008170cfd0

得到错误日志,那样就能一定到最终调用的那行代码

终端.png

就是大家地方的release释放掉了array对象造成的。

2. 怎么调节僵尸对象

透过地点的真机调试之后,发现大家的次第崩在了一个主意里,并且报错 “Thread
1:EXC_BAD_ACCESS(code=1,address=0x4000)”,那种不当经常是内存管理的难点,一般是访问了一度刑满释放的对象造成的,可以打开僵尸对象(Zombie
Objects)来定位难题。

率先步:仍旧打开Xcode 拔取显示器左上角Xcode->
PReferencese,不过大家这次是要设置一下输出音信,调试的时候输出更加多的新闻,如下截图,勾上:

设置.png

其次步:再对环境变量举办安装:菜单Product > Scheme > Edit Scheme

把粉色圈里面的多个挑选都勾上

勾上

敞开该接纳后,程序在运作时,如果访问了一度刑满释放的目标,则会提交较规范的原则性音讯,可以协助确定难点所在。

该功能的原理是,在目的释放(retainCount为0)时,使用一个放置的Zombie对象,替代原先被假释的目的。无论向该对象发送什么音讯(函数调用),都会触发卓殊,抛出调试新闻。

记得在标题被修复后,关闭该意义!!

其三步:设置好后调试程序,在输出界面发现了-[CFString retain]: message
sent to deallocated instance错误日志

到此处,就曾经很强烈看出来是哪些来头造成程序崩溃的了,然后再去分析代码,静下心来肯定能缓解难点的了。

我那边是因为向一个空的NSString类型发送音讯导致崩溃的,但是这一个标题只在iOS9版本崩溃,iOS10就没难点,这么些还值得深究。

相关文章