原文参考:

http://www.cnblogs.com/easy-coding/p/3656685.html

http://www.cnblogs.com/smileEvday/p/Crash1.html

如果想查看文件的庐山真面目,需要找出在上传应用时所发送的.app和.DSYM文件,切记每次发送新版本都要保留这两个文件,不然没有办法解析Crash Log的。可以先把这两个文件拷贝到桌面的某一个文件夹中,然后把.crash的文件也拷贝的同一个文件夹下。

这一解析过程需要使用Symbolicatecrash来完成,首先要找到Symbolicatecrash文件,xcode5.0在 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/ 
Symbolicatecrash文件独立于Xcode,可以拷到刚才放crash log的文件夹中使用,在开始解析之前需要先进行一些校验:
1. 查看xx.app文件的uuid的方法,在命令行中输入:

$ dwarfdump --uuid xxx.app/xxx (xxx工程名)

2. 查看xx.app.dSYM文件的uuid的方法,在命令行输入:

$ dwarfdump --uuid xxx.app.dSYM (xxx工程名)

3.查看.crash的uuid,位于crash日志中的Binary Images:中的第一行。如:armv7s  <13760bde0d073f1eb4d596c3df753f4b>

只有三者的uuid相同才能解析.crash文件,然后在命令行输入:

$ ./symbolicatecrash xxx.crash xxx.app.dSYM > test.log

这样可以将.crash日志转换成test.log,test.log即可读的函数文件。
输入上述命令可能会出现Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 53.这个错误。
如果出现上述错误,输入命令:export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer,
然后继续执行./symbolicatecrash xxx.crash xxx.app.dSYM > test.log可以成功

  开发程序的过程中不管我们已经如何小心,总是会在不经意间遇到程序闪退。脑补一下当你在一群人面前自信的拿着你的App做功能预演的时候,流畅的操作被无情地Crash打断。联想起老罗在发布Smartisan OS的时候说了,他准备了10个手机,如果一台有问题,就换一台,如果10台后挂了他就不做手机了。好了不闲扯了,今天就跟大家一起聊聊iOSCrash文件的组成以及常用的分析工具。

  有一个WWDC 2010的视频推荐大家抽空看看,视频名称“Understanding Crash Reports on iPhone OS”,该视频详细讲解了Crash文件的结构。当然如果你没时间看的话,不妨阅读以下这篇文章。

一、Crash文件结构

当程序运行Crash的时候,系统会把运行的最后时刻的运行信息记录下来,存储到一个文件中,也就是我们所说的Crash文件。iOS的Crash日志通常由以下6各部分组成。

1、Process Information(进程信息)

Incident Idnetifier 崩溃报告的唯一标识符,不同的Crash
CrashReporter Key 设备标识相对应的唯一键值(并非真正的设备的UDID,苹果为了保护用户隐私iOS6以后已经无法获取)。通常同一个设备上同一版本的App发生Crash时,该值都是一样的。
Hardware Model 代表发生Crash的设备类型,上图中的“iPad4,4”代表iPad Air
Process 代表Crash的进程名称,通常都是我们的App的名字, []里面是当时进程的ID
Path 可执行程序在手机上的存储位置,注意路径时到XXX.app/XXX,XXX.app其实是作为一个Bundle的,真正的可执行文件其实是Bundle里面的XXX,感兴趣的可以自己查一下相关资料,有机会我后面也会介绍到
Identifier 你的App的Indentifier,通常为“com.xxx.yyy”,xxx代表你们公司的域名,yyy代表某一个App
Version 当前App的版本号,由Info.plist中的两个字段组成,CFBundleShortVersionString and CFBundleVersion
Code Type 当前App的CPU架构
Parent Process 当前进程的父进程,由于iOS中App通常都是单进程的,一般父进程都是launchd

2、Basic Information

Date/Time Crash发生的时间,可读的字符串
OS Version 系统版本,()内的数字代表的时Bulid号
Report Version Crash日志的格式,目前基本上都是104,不同的version里面包含的字段可能有不同

3、Exception(非常重要)

Exception Type 异常类型
Exception Subtype: 异常子类型
Crashed Thread 发生异常的线程号

4、Thread Backtrace

发生Crash的线程的Crash调用栈,从上到下分别代表调用顺序,最上面的一个表示抛出异常的位置,依次往下可以看到API的调用顺序。上图的信息表明本次Crash出现xxxViewController的323行,出错的函数调用为orderCountLoadFailed。

5、Thread State

Crash时发生时刻,线程的状态,通常我们根据Crash栈即可获取到相关信息,这部分一般不用关心。

6、Binary Images

Crash时刻App加载的所有的库,其中第一行是Crash发生时我们App可执行文件的信息,可以看出为armv7,可执行文件的包得uuid位c0f……cd65,解析Crash的时候dsym文件的uuid必须和这个一样才能完成Crash的符号化解析。

二、常见的Crash类型

1、Watchdog timeout

Exception Code:0x8badf00d, 不太直观,可以读成“eat bad food”,意思是don‘t block main thread

紧接着下面会有一段描述:

Application Specific Information:

com.xxx.yyy   failed to resume in time

对于此类Crash,我们应该去审视自己App初始化时做的事情是否正确,是否在主线程请求了网络,或者其他耗时的事情卡住了正常初始化流程。

通常系统允许一个App从启动到可以相应用户事件的时间最多为5S,如果超过了5S,App就会被系统终止掉。在Launch,resume,suspend,quit时都会有相应的时间要求。在Highlight Thread里面我们可以看到被终止时调用到的位置,xxxAppDelegate加上行号。

PS. 在连接Xcode调试时为了便于调试,系统会暂时禁用掉Watchdog,所以此类问题的发现需要使用正常的启动模式。

2、User force-quit

Exception Codes: 0xdeadfa11, deadfall

这个强制退出跟我们平时所说的kill掉后台任务操作还不太一样,通常在程序bug造成系统无法响应时可以采用长按电源键,当屏幕出现关机确认画面时按下Home键即可关闭当前程序。

3、Low Memory termination

跟一般的Crash结构不太一样,通常有Free pages,Wired Pages,Purgeable pages,largest process 组成,同事会列出当前时刻系统运行所有进程的信息。

关于Memory warning可以参看我之前写的一篇文章IOS 内存警告 Memory warning level。

App在运行过程中,系统内存紧张时通常会先发警告,同时把后台挂起的程序终止掉,最终如果还是内存不够的话就会终止掉当前前台的进程。

当接受到内存警告的事后,我们应该释放尽可能多的内存,Crash其实也可以看做是对App的一种保护。

4、Crash due to bugs

因为程序bug导致的Crash通常千奇百怪,很难一概而论。大部分情况通过Crash日志就可以定位出问题,当然也不排除部分疑难杂症看半天都不值问题出在哪儿。这个就只能看功底了,一点点找,总是能发现蛛丝马迹。是在看不出来时还可以求助于Google大神,总有人遇到和你一样的Bug

三、常见的Exception Type & Exception Code

1、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

此类异常通常由于线程执行非法指令导致

3)EXC_ARITHMETIC

除零错误会抛出此类异常

2、Exception Code

0xbaaaaaad 此种类型的log意味着该Crash log并非一个真正的Crash,它仅仅只是包含了整个系统某一时刻的运行状态。通常可以通过同时按Home键和音量键,可能由于用户不小心触发
0xbad22222 当VOIP程序在后台太过频繁的激活时,系统可能会终止此类程序
0x8badf00d 这个前面已经介绍了,程序启动或者恢复时间过长被watch dog终止
0xc00010ff 程序执行大量耗费CPU和GPU的运算,导致设备过热,触发系统过热保护被系统终止
0xdead10cc 程序退到后台时还占用系统资源,如通讯录被系统终止
0xdeadfa11 前面也提到过,程序无响应用户强制关闭

三、获取Crash的途径

1、本机

通过xCode连接测试机器,直接在Device中即可读取到该机器上发生的所有Crash log。

2、itunes connect

通过itunes connect后台获取到用户上报的Crash日志。

3、第三方的Crash收集系统

有很多优秀的第三方Crash收集系统大大的方便了我们收集Crash,甚至还带了符号化Crash日志的功能。比较常用的有Crashlytics,Flurry等。

四、附录

Apple官方文档:Understanding and Analyzing iOS Application Crash Reports

        Technical Note TN2123 CrashReporter

        https://developer.apple.com/library/ios/qa/qa1592/_index.html

WWDC视频:  Understanding Crash Reports on iPhone OS   

  Crash日志记录的时候是将Crash发生时刻,函数的调用栈,以及线程等信息写入文件。一般都是直接写的16进制地址,如果不经过符号化的话,基本上很难获取到有用信息,下一篇我们将聊一聊Crash日志的符号化,通俗点讲就是让Crash日志变成我们可读的格式。

解析app出现闪退,解析.crash文件相关推荐

  1. android 签名包闪退,解决APP连续闪退的方案,你还不知道的签名方式

    原标题:解决APP连续闪退的方案,你还不知道的签名方式 用户在使用APP检测到连续闪退后,接下来要尝试对闪退进行修复,这里先分析可能的闪退原因: 闪退原因 连续闪退,可能是 App 启动关键路径中执行 ...

  2. h5+app Android上架华为应用市场被拒原因“拒绝获取手机权限后app会闪退“以及隐私政策问题

    h5+app Android上架华为应用市场被拒原因"拒绝获取手机权限后app会闪退" 华为应用市场报错:拒绝获取手机权限后app会闪退,此问题解决方案如下: 在manifest. ...

  3. 关于app的闪退问题

    今天以前测试时安装的app出现闪退,打不开的情况.很多帖子问题是因为都是IOS9,需要信任文件,但是也有另外的情况. 软件环境:xcode7.299$企业开发者账号 一.BUG描述. 测试时安装的ap ...

  4. axure怎么做手机app界面_iPhone11手机APP频繁闪退怎么办?

    任何手机,任何系统,都可能会出现闪退的问题,苹果iPhone也不例外.偶尔闪退属正常现象,如果很多APP都闪退,而且非常频繁怎么办呢?iPhone11手机APP频繁闪退怎么办?如何修复? 我们先了解下 ...

  5. lightroom 闪退_苹果iPhone11手机APP频繁闪退怎么办?如何修复?

    今天分享的是苹果iPhone11手机APP频繁闪退的解决方法. 我们先了解下iPhone11手机闪退的原因: 1.插件影响程序的正常运行,而导致APP闪退: 2.下载的软件与手机系统版本的不匹配,比如 ...

  6. Android Studio 使用Profiler时App崩溃闪退

    问题 今天想使用AS的Profiler测App的CPU等数据 于是启动App并打开Profiler窗口 当App运行到模型运算的部分时,App竟然闪退了 而不使用Profiler时App是能正常运行的 ...

  7. 【踩坑记录】—— app运行闪退(Mac版)

    目录 一.故事开始 二.问题分析 三.无脑排查 四.总结 一.故事开始 2022/3/27 一个风和日丽的下午☀️☀️ 近期在学做一些入门级的小项目,写了个小工具的脚本之后,想拓展一下,用PYQT5做 ...

  8. 如果你的App发生闪退,一般是什么原因造成的?

    这个面试题,是一道考验你实际开发经验的面试题. 一般App闪退是由于以下几个原因造成的. 1.缓存垃圾过多 由于安卓系统的特性,如果长时间不清理垃圾文件.会导致越来越卡.也会出现闪退情况. 2. 运行 ...

  9. android视频闪退,安卓 app 视频闪退问题

    第一个问题: 视频图片列表页分页加载,只要有一个视频预加载报错,安卓端app就会闪退,ios正常 第二个问题:onPageScroll 用户滚动时播放当前的视频,视频过多安卓端app就会闪退,ios正 ...

最新文章

  1. Class中isAssignableFrom() 方法
  2. Java高级工程师必备数据结构算法高效查找算法原理分析与实现
  3. BASIC-1 闰年判断
  4. java学习(33):巩固练习
  5. 日志服务与SIEM(如Splunk)集成方案实战
  6. 一年级abb式词语并造句_一年级语文ABB式词语专项练习附答案,考考孩子!
  7. E20180715-hm
  8. poj 1035 Spell checker【字符串】
  9. C# WinForm禁止改变大小 最大化最小化隐藏 最大化最小化隐藏
  10. 基于Python的DELMIA二次开发(三):人体建模
  11. 硬盘分区整数计算器(如何让硬盘容量成整数)
  12. matlab的梯形公式推导公式,用MATLAB作数值积分例.计算1)矩形公式和梯形公式将(0,4)-Read.ppt...
  13. 分享知识-快乐自己:oracle12c创建用户提示ORA-65096:公用用户名或角色无效
  14. python计算三角形面积题目
  15. hw1-浅谈Dota2设计元素
  16. error LNK2019 ,error LNK2001:无法解析的外部符号,LINK : fatal error LNK1104: 无法打开文件
  17. Vue + ElementUI 实现后台管理系统模板 -- 前端篇(四):定义主页面
  18. 明解C语言(入门)——初识C语言
  19. unity3d实现第一人称射击游戏之CS反恐精英(六)(朝准星位置发射子弹,更换弹夹 )
  20. win10php环境配置教程,Windows10系统下如何去配置PHP开发环境

热门文章

  1. 使用python爬取抖音app视频
  2. window查看进程,杀掉进程
  3. 织梦dedecms5.7栏目添加缩略图
  4. 我的世界怎么修改服务器刷怪率,《我的世界》地图刷怪率变高方法详解
  5. python基础训练 day1
  6. 难得一见的win 7 蓝屏
  7. 【秋招机试真题】荣耀机试0916-3-可重复选元素组合问题
  8. Head First 设计模式——装饰者模式
  9. 【南京Meetup】华泰证券Elasticsearch在日志搜索、日志分析、链路管理系统方面的应用实践...
  10. QQ空间伤感日志_其实放手不是不爱你