异常分析

本文分析了一份标准的iOS应用程序的Crash报告,它通常由以下6个部分组成。

报告头(Header)

报告头包含了应用程序以其运行环境的一些基本信息,下面是报告头的一个例子。
复制代码
Incident Identifier: E6EBC860-0222-4B82-BF7A-2B1C26BE1E85
CrashReporter Key: 6196484647b3431a9bc2833c19422539549f3dbe
Hardware Model: iPhone6,1
Process: TheElements [4637]
Path: /private/var/mobile/Containers/Bundle/Application/5A9E4FC2-D03B-4E19-9A91-104A0D0C1D44/TheElements.app/TheElements
Identifier: com.example.apple-samplecode.TheElements
Version: 1.12
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2015-04-06 09:14:08.775 -0700
Launch Time: 2015-04-06 09:14:08.597 -0700OS
Version: iOS 8.1.3 (12B466)
Report Version: 105

异常代码(Exception Codes)

异常代码可能包含异常类型(Exception Type)、异常子类型(Exception Subtype)、处理器的详细异常代码(processor-specific Exception Codes)和其它能提供更多Crash信息的字段,最后一个字段列出了触发Crash的线程索引。下面是异常代码的示例。
复制代码
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Triggered by Thread: 0
常见的异常类型有以下几种。

  • Bad Memory Access [EXC_BAD_ACCESS // SIGSEGV // SIGBUS]
    此类型的Excpetion是最常见的Crash,通常由访问了无效的内存导致。
    SIGSEGV:访问了无效地址,没有[物理内存]对应该地址,通常由于重复释放对象导致。
    SIGBUS:总线错误,与 SIGSEGV 不同的是,SIGBUS 访问的是[有效地址]),但总线访问异常,通常是访问了未对齐的数据。
    SEGV:代表无效内存地址,比如空指针、未初始化指针、栈溢出等。
  • Abnormal Exit [EXC_CRASH // SIGABRT]
    进程异常退出,造成Crash通常是因为未捕获到Objective-C/C++的异常。
    SIGABRT:收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中等会遇到此类错误。
  • Trace Trap [EXC_BREAKPOINT // SIGTRAP]
    这个异常是为了让一个附加的调试器有机会在执行过程中的某个特定时刻中断进程,我们可以在代码里面添加__builtin_trap()方法手动触发这个异常。如果没有附加调试器,则会生成crash文件。
    较低级别的库(例如libdispatch)会在遇到致命错误时捕获该进程。
    swift代码在遇到下面2种情况的时候也会抛出这个异常:
    一个非可选类型的值为nil
    错误的强制类型转换,如把NSString转换为NSDate等等。
  • Illegal Instruction [EXC_BAD_INSTRUCTION // SIGILL]
    程序尝试的去执行一个非法的或者没有定义的指令。如果配置的函数地址有问题,进程在执行函数跳转的时候,就会发生这个crash。
  • Quit [SIGQUIT]
    该进程在具有管理其生命周期的权限的另一进程的请求下终止。 SIGQUIT并不意味着进程崩溃,但是可以说明该进程存在一些问题。
    比如在iOS中,第三方键盘应用可能在在其他APP中被唤起,但是如果键盘应用需要很长的时间去加载,则会被强制退出。
  • Killed [SIGKILL]
    进程被系统强制结束,通过查看Termination Reason找到crash信息。

    Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
    The exception code 0x8badf00d indicates that an application has been terminated by iOS because a watchdog timeout occurred. The application took too long to launch, terminate, or respond to system events. One common cause of this is doing synchronous networking on the main thread.
    Whatever operation is on Thread 0 needs to be moved to a background thread, or processed differently, so that it does not block the main thread.
    异常代码 0x8badf00d 指示应用程序已终止的 iOS 因为看门狗超时发生。应用程序时间太长,启动、 终止,或对系统事件作出响应。一个常见的原因做在主线程上的同步联网

  • 其它异常类型有些异常类型没有被命名,以16进制数字表示。
    0xbaaaaaad:意味着该Crash log并非一个真正的Crash,它仅仅只是包含了整个系统某一时刻的运行状态,由用户同时按Home键和音量键触发。
    0xbad22222:当VoIP程序在后台太过频繁的激活时,系统可能会终止此类程序。
    0x8badf00d:程序启动或者恢复时间过长被watch dog终止。0xc00010ff:程序执行大量耗费CPU和GPU的运算,导致设备过热,触发系统过热保护被系统终止。
    0xdead10cc:程序退到后台时还占用系统资源(如通讯录)被系统终止。
    0xdeadfa11:程序无响应用户强制退出。当用户长按电源键,直到屏幕出现关机确认画面后再长按Home键,将强制退出应用。我们可以合理认为用户这么做的原因是应用程序没有响应。

关于符号化:http://blog.csdn.net/rainbowfactory/article/details/73332735
关于dsym文件:http://www.cocoachina.com/ios/20141219/10694.html

ips文件中各个线程都是地址,看不到具体的类和方法,需要通过解密,方法如下。

方式一

1.isp文件改为.crash文件
image.png
2.打包时产生的xcarchive包
image.png
3.连接设备使用log
image.png
4.把.crash文件丢进alllogs里
image.png

可以看到最终崩溃在28线程中的UACacheManager中。

方式二

使用dSYM工具

将 dSYM 拉入窗口的第一部分,
双击 dSYM 名称后,右边显示可选archive编译类型,
UUID 是自动的,请对好类型,
根据闪退信息填入对应的内存地址和Slide Address,
点击分析按钮,就会显示可能错误的地方了

方式三

1、找到symbolicatecrash
find /Applications/Xcode.app -name symbolicatecrash -type f
稍等一会就会有路径输出,这个路径就是symbolicatecrash的路径
2、用命令将symbolicatecrash拷贝到crash文件夹里面
3、将ips文件改为.crash文件导入,ipa包解压后的app文件导入,.dSYM文件导入
4、生成解析后文件
./symbolicatecrash .crash路径 .dSYM路径 >log.crash
5、这时候终端有可能会出现:
Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
输入命令:
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容