iOS 僵尸对象调试

题材讲述

近年,发现Xcode的模拟器越来越不借助于不鸣金收兵了,应用开发了,在模拟器上面各种流畅各种运行得意外从,但是安装及真机之后,就完蛋了,是闪退啊!~~o(>_<)o
~~

以模拟器上面无问题,但是装到真机的时节,发现闪退,这样于难以定位到因。
措施要有些,问题吧毕竟能迎刃而解之。
方法一致:我们兴许由此采集手机的日志,查看崩溃日志;
术二:通过集成第三正值的插件来追踪bug(例如:腾讯的bugly、友盟),不过建议只有所以同寒的,因为大多下之均等打用,可能会见产生任何问题;
主意三:真机调试。

以快速定位并解决问题,最终还是挑选了方法三,并且最后化解了问题。

1. 真机调试

于Xcode7之后,真机调试已经是绝非另外秘诀了,我们一味需要报一个苹果之开发者账号就可以不管证明也得以真机调试,操作如下:

先是步、打开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 – > 点击信任

由来,真机调试之过程尽管做好了,是休是于原先简单多矣

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就没有问题,这个还值得探讨。

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对象造成的。

相关文章