iOS crash 闪退日志

前言

查看闪退日志的步骤
(1)获取闪退日志
(2)获取symbolicatecrash 脚本
(3)获取闪退日志对应的符号表(.dSYM 文件)
(4)解析闪退日志

苹果官网关于闪退日志的介绍:

https://developer.apple.com/library/content/technotes/tn2151/_index.html

Understanding and Analyzing Application Crash Reports

When an application crashes, a crash report is created which is very useful for understanding what caused the crash. This document contains essential information about how to symbolicate, understand, and interpret crash reports.

理解以及分析闪退日志:

当app发生闪退的时候,会创建闪退日志,这对于我们查找闪退原因是非常有用的。

一、获取iOS 设备上闪退日志

tn2151_crash_flow.png

1、(windows 电脑)使用pp助手获取闪退日志 将iOS 设备和winwods电脑连接,打开pp助手,查看闪退日志,将闪退日志导出,导出后会得到一个后缀为ips的文件。修改后缀名为.crash。
2、(MAC电脑)将设备连接到电脑,进入 ~/Library/Logs/CrashReporter/MobileDevice 文件夹可以获得闪退日志。
3、通过Xcode 获取闪退日志 :打开Xcode > window > Devices > view device logs 就可以查看闪退日志。
4、获取已经发布到appStore上和上传到testflight 上的包,在用户和测试员设备上发生的闪退日志。打开Xcode>Window>organizer 选择 crashes 标签。然后我们就可以看见一个闪退日志列表。选中某一个闪退日志右键显示包内容,然后进入DistributionInfos>all>logs。就可以看见闪退日志了。 (⚠️ 如果发布的时.dysm 文件也上传到了apple 的服务器,一般点击 open in project 就会直接定位到项目闪退的位置。
苹果官网关于发布到市场和testflight 上的闪退日志的介绍
https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/AnalyzingCrashReports/AnalyzingCrashReports.html

二、闪退日志的组成

 {"app_name":"XXXAPP",    
 "app_version":"6.0.0",  
"bundleID":"com.XXXAPP.app",  
"adam_id":0,"os_version":  
"iPhone OS 8.3 (12F70)",  
"slice_uuid":"xxxxxx",  
"share_with_app_devs":false,"build_version":"17040602528","is_first_party":false,"bug_type":"109","name":"XXXAPP"}
Incident Identifier: A7427996-4DA4-457E-B868-990F0EF557F8
 CrashReporter Key:   0bc6652b6f3c9d95786ce42bd4746d49fe7071a6
 Hardware Model:      iPhone7,1
 Process:             XXXAPP [12119]
 Path:                /private/var/mobile/Containers/Bundle/Application/271EC22E-C2EC-4256-A7DD-480F78C1EE52/XXXAPP.app/XXXAPP
 Identifier:          com.XXXAPP.app
 Version:             17040602528 (6.0.0)
 Code Type:           ARM-64 (Native)
 Parent Process:      launchd [1]
 
 Date/Time:           2017-04-10 13:35:15.100 +0800
 Launch Time:         2017-04-10 13:18:14.005 +0800
 OS Version:          iOS 8.3 (12F70)
 Report Version:      105
 
 Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
 Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000010
 Triggered by Thread:  0
 
 Thread 0 name:  Dispatch queue: com.apple.main-thread
 Thread 0 Crashed:
 0   libobjc.A.dylib                0x0000000194453bd0 0x194438000 + 113616
 1   XXXAPP                 0x0000000100944330 0x10006c000 + 9274160
 2   XXXAPP                 0x0000000100935014 0x10006c000 + 9211924
 3   XXXAPP                 0x0000000100952be4 0x10006c000 + 9333732
 4   XXXAPP                 0x000000010099af78 0x10006c000 + 9629560
 5   XXXAPP                 0x00000001009af4a0 0x10006c000 + 9712800
 6   UIKit                          0x000000018766bfbc 0x187644000 + 163772
 7   UIKit                          0x00000001876d82d4 0x187644000 + 606932
 8   UIKit                          0x00000001876d823c 0x187644000 + 606780
 9   UIKit                          0x0000000187648710 0x187644000 + 18192
 10  CoreFoundation                 0x0000000182bcc2a0 0x182aec000 + 918176
 11  CoreFoundation                 0x0000000182bc922c 0x182aec000 + 905772
 12  CoreFoundation                 0x0000000182bc960c 0x182aec000 + 906764
 13  CoreFoundation                 0x0000000182af52d0 0x182aec000 + 37584
 14  GraphicsServices               0x000000018c30b6f8 0x18c300000 + 46840
 15  UIKit                          0x00000001876bafa8 0x187644000 + 487336
 16  XXXAPP                 0x00000001006c6468 0x10006c000 + 6661224
 17  libdyld.dylib                  0x0000000194abea04 0x194abc000 + 10756
关键字 含义
Incident Idnetifier 闪退的唯一标示
CrashReporter Key 设备标识相对应的唯一键值(并非真正的设备的UDID,苹果为了保护用户隐私iOS6以后已经无法获取)。通常同一个设备上同一版本的App发生Crash时,该值都是一样的。
Hardware Model 设备类型
Version 当前App的版本号,由Info.plist中的两个字段组成,CFBundleShortVersionString and CFBundleVersion
buildnum.png

Code Type | 当前App的CPU架构
Exception Types | 异常类型
Exception Subtype | 异常子类型

⚠️ 每次打包的时候,一定要确保 Version的唯一性。

常见的异常类型

异常 描述 注释
EXC_BAD_ACCESS Bad Memory Access Access to “bad” memory address. The “bad” can be either “the address does not exist” or “the app does not have privilege to access to”. So it usually ties to SIGBUS and SIGSEGV.
EXC_CRASH Abnormal Exit Usually tie to SIGABRT, meaning the app exits abnormally by detecting some uncaught exceptions through the code.
EXC_BREAKPOINT Trace / breakpoint Trap Usually tie to SIGTRAP. Can be triggered either by your own code or NSExceptions being thrown.
EXC_GUARD Violated Guarded Resource Protection Be triggered by violating a guarded resource protection, like “certain file descriptor”.
EXC_BAD_INSTRUCTION Illegal Instruction Usually related to certain illegal or undefined instruction or operand.
EXC_RESOURCE Resource Limit App crashes by hitting resource consumption limit.
00000020 Hexadecimal Exception Type Not “OS Kernel” exception.

参考文章
http://www.5neo.be/understanding-ios-exception-types/

三、符号化闪退日志

1、获取symbolicatecrash 工具

打开终端输入下面的命令

find /Applications/Xcode.app -name symbolicatecrash -type f

或者

find /Applications/Xcode.app -name symbolicatecrash

我们会得到这样一个路径

/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash

打开finder 前往这个路径


sy.png

拷贝 symbolicatecrash

2、获取 .dysm 文件

打开Xcode 选择 window > organizer > 选择Archives 标签 。我们可以看到我们打完包的一个列表。我们可以看见闪退日志的信息里面有这样一个版本号的信息 Version: 17040602528 (6.0.0),,找到打包列表里面和这个 build 号相对应的.xcarchive文件,然后右键show in finder

显示包内容进入dSYMs 文件夹>拷贝项目相应的 .dsyM 文件

3、将.crash 文件 和 拷贝出来的 symbolicatecrash 脚本 以及 闪退日志对应的 .dsyM 文件拷贝到同一个文件夹里面。然后打开终端进入这个文件夹。

123123.png

[图片上传中...(213123123.png-912e98-1513584168018-0)]

cd /Users/StarHui/Desktop/20170417crash/crash1

注释:cd /Users/你电脑的用户名/存放上述三个文件的文件夹路径

然后输入(只需要输入一次)

export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"

然后输入

./symbolicatecrash crash1.crash xxx.app.dSYM > crashLog3.txt

等命令执行完成之后,我们可以在刚才的文件夹下面发现 crashLog3.txt 符号化后的闪退日志。

 crash1.crash    闪退日志
 xxx.app.dSYM    dySM 文件
 符号化后的日志  crashLog3.txt

我们可以在已经符号化后的闪退日志里面看到我们代码出错的地方。(可以直接定位到闪退发生在那个文件的那一行代码)

213123123.png

总结:写的有不好的地方希望大家指出,我会修正的,大家有什么看不明白的也可以在评论里面提问,我会尽力解答。

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

推荐阅读更多精彩内容