ACCESSiOS Crash分析

       在iOS开发被,Crash无疑是App的沉重杀手。作为一个小心的iOS
开发人员来说,写起美的康泰的无Crash代码至关重要。但是随着工程代码量的升迁,功能的迭代,以及协作开发的模式,难免会生出Crash的出。在起Crash时,我们承诺迅速定位问题,解决问题,将Crash几率降到低于。

1 Crash 收集

     
 当程序运行发生Crash的时候,系统会将运行的结尾时刻的程序运行记录保留下来,存储到一个.crash文件中,也就是我们经常说的Crash日志。

同等、
 在支付被,最常遇到的Crash就是Debug状态下了,此时咱们是万幸的,因为此bug我们团结一心首领悟,我们得以在旁人发现她前面把其改变好。而且,Xcode
会提供给我们最为明显的Crash信息,直接定位到Crash
的那么行代码,并会打印出Crash Reason 及调用栈信息。

仲、如果我们数稍差有,在支付被自测App没有意识任何Crash问题,但是测试童鞋或者其他机构的童鞋在测试用中窥见了Crash,但愿不要吃老板发现o(╯□╰)o。无论这底crash是必现还是非必现,我们都得以将到测试童鞋的Crash设备,拿到装备导出Crash日志吧~

老三、最为难了之,无疑是自测没觉察,测试童鞋也从没察觉,但是公众的眼的鲜亮的,我们密切用户遇到了这老大难的Crash,这绝差的用户体验十分有或给用户粉转黑,怎么收拾?做一个Crash收集器势在必行!!!~

有关Crash收集的框架,已经发于成熟之开源框架,KSCrash、CrashKit等于,也闹第三正在的Crash统计产品,如Crashlytics,Hockeyapp,友盟,Bugly等等。

引进一首@念茜的章http://nianxi.net/ios/ios-crash-reporter/。

       
当App发生Crash时一旦达到传Crash日志,之后我们可由此服务端自己之Crash收集器拿到Crash文件,或者因第三方服务用到Crash文件。

2 Crash 分析

        拿到了Crash日志,我们欠自乌着手呢?

       
Crash日志会提供被咱很多信,我们只要以其间领取出好帮助我们快定位问题的音讯。

        首先我们来看这几实施信息,

Incident Identifier:崩溃报告的唯一标识符,不同之Crash日志该标示符也差。

CrashReporter Key:设备标识相对应之绝无仅有键值(并非真的的配备的UDID,苹果为掩护用户隐私iOS6过后都力不从心赢得)。通常与一个装置上同版本的App发生Crash时,该值都是相同的。

Hardware Model :代表有Crash的设备项目。

Process:代表网Crash的历程名称,通常还是我们的App的名, [
]里凡是及时历程的ID。

Path:App的所在路径。

Identifier:我们App的Indentifier,通常也“com.xxx.yyy”,xxx代表公司的域名,yyy代表之一一个App标识。

AppVersion:当前App的版号,由Info.plist中之简单只字段组成,CFBundleShortVersionString and CFBundleVersion。

Code Type:当前App的CPU架构。

Parent Process:当前历程的父进程,由于iOS中App通常都是才进程的,一般大进程都是launchd。

Date/Time:发生crash的时间

Launch Time:启动App的时间

OS Version:iOS系统固件版本

Report Version:日志版本

Exception Type:
这个消息非常重要,它就如是是crash的讳,我们了解了它们的名,解决其还难以乎?

Exception
Subtype:它就是crash的小名,当她的芳名满足不了咱们的时段,google它的乳名,你势必会来获取!~

Triggered by Thread: 问题发的thread

俺们再来拘禁线程信息,在日记中找到crash thread,问题虽闹在这边,

有些情况下,Crashed Thread
的调用栈中会强烈的报我们是实行到哪个类中哪行代码时出了问题,这种场面下我们死爱看清问题由以及修改问题。但是多数场面下,调用栈里显示我们Crash在了一个体系的库里,我们看不到代码,所以没办法规定是哪的操作导致了问题,于是,我们得举行点工作,将crash日志文件符号化。

以解析crash日志,我们用三独东西:

1.crash文件

2.符号文书:.dsymb格式

3.应用程序文件:.app格式

接下来我们用拿立即三个文件放到同一目录下,用atos命令来号化crash日志的某某平等行:

开辟终端,输入

xcrun atos -o appName.app/appName -arch armv7

然后重新输入你一旦符号化的那么一行后面的调用栈地址,例如:0x000000018a650b38

然即便足以赢得结果:

哪怕可知稳定到实际是代码的啦一行来了问题。

更多记化crash文件的方,可参考链接。http://wufawei.com/2014/03/symbolicating-ios-crash-logs/

3 Crash 处理

一、Watchdog timeout

Exception Code:0x8badf00d

足读作“eat bad food”,我吃了挺东西,不能够延续为汝办事了。是无是异常形象?

当我们的App
在启动、退出、或者在应系统事件的当儿等待了无限长时,系统会直接杀进程。Its
Not A Crash~

俺们应当查看App是否在主线程请求了网,或者其它耗时的作业卡住了正规初始化流程。

平凡系统允许一个App从启动暨好对应用户事件的日子太多呢5S,如果跨越了5S,App就见面于网已掉。在Launch,resume,suspend,quit时犹见面生出相应的年月要求。在Highlight
Thread里面我们得以看到让停止时调用到之岗位,xxxAppDelegate加上行号。

PS.
在连接Xcode调试时为了方便调试,系统会暂时禁用掉Watchdog,所以此类问题之觉察用采用正规的启航模式。

老二、用户强制退出

Exception Codes: 0xdeadfa11, deadfall

以及正规退出杀死App不同,这种景象或是用户强制关机或者系强制关机等造成。

老三、低外存闪退

当系统来低内存闪退时,很有或咱们以不至外的Crash信息日志,但App的的确确是闪退了。好好做生检讨吧,是不是哪出内存泄露?用工具好好测试下。

假定我们能够拿到日志,会意识它们跟一般的Crash日志不顶相同,通常有Free
pages,Wired Pages,Purgeable pages,largest process
组成,同时会列出当前系统调用栈信息。

设我们因此底凡MRC,首先静态分析一下,是勿是何忘记了release ? dealloc
写的是不是正确?
然后使用Instruments检查下内存以状态,看看哪的内存占用比较高?是否内存泄露?通常大量底图样未能够就放出内存空间的时段会要内存占用飚升。

内存警告通常在咱们debug的早晚便见面发觉,及时的清理掉不用底内存,否则内存占用越来越强,超过系统限制就会见被网杀死。

四、Crash due to bugs

为程序bug导致的Crash通常千奇百怪,很麻烦一概而论。大部分景象经Crash日志就可以固定来题目,当然也非排除有些疑难杂症看半天且不犯问题有在哪里。这个就是只能看功底了,一点点物色,总是能够觉察蛛丝马迹。是以看不出来时还好求助于Google大神,总有人遇到跟你同的Bug

五、Exception Type

1)EXC_BAD_ACCESS

此类型的Excpetion是咱们最丰富碰到的Crash,通常用于访问了无转移访问的内存导致。一般EXC_BAD_ACCESS后面的”()”还会蕴藏补充信息。

SIGSEGV:常见由还释放对象造成,这种类型在切换了ARC以后该既坏少看到了。

SIGABRT:接收Abort信号退出,通常Foundation库中的器皿为了维护状态正常会举行片检测,例如插入nil到数组中等会逢此类错误。

SEGV:(Segmentation  Violation),代表无效内存地址,比如空指针,未初始化指针,栈溢出当;

SIGBUS:总线错误,与 SIGSEGV 不同之是,SIGSEGV 访问的凡杯水车薪地址,而
SIGBUS 访问的凡立竿见影地址,但总线访问异常(如地址指向共同问题)

SIGILL:品推行非法的授命,可能不给辨认或无权力

2)EXC_BAD_INSTRUCTION

该类异常通常由线程执行非法命令导致。

1.于代码中修改了storyboard与outlet的对应关系,但是storyboard没有创新时发出了这个crash。

2.同第三正库中方法冲突时常来了是crash。

3.调用系统方法时传出了不合适的指针类型。

3)EXC_ARITHMETIC

代码中开除法时分母为零星了会晤来这个题材。

6、Exception Code

0xbaaaaaad以此种档次的log意味着该Crash
log并非一个着实的Crash,它仅仅只是包含了全副系统之一平随时的运转状态。通常可以由此并且按照Home键和音量键,可能由于用户不小心点

0xbad22222当VOIP程序于后台太过数的激活时,系统可能会见终止此类程序

0x8badf00d斯前面已经介绍了,程序启动或恢复日了长被watch
dog终止

0xc00010ff程序执行大量消耗CPU和GPU的演算,导致设备了烫,触发系统了热保护于网已

0xdead10cc次退交后台时还占有系统资源,如通讯录被网已

0xdeadfa11前吧涉及了,程序无响应用户强制关闭

又多支出中遇到的错误码可以参见链接https://en.wikipedia.org/wiki/Hexspeak

接订阅我的ACCESS个人主页~

乍浪微博:@小花哥哥是天赋

相关文章