一:Crash-本地符号化1:symbolicatecrash
- 1.symbolicatecrash是xcode自带的符号表工具
- 2: 准备工作:
2.1: crash文件(没有符号化的crash文件:16进制的字符)
2.2: 复制dSYM文件
2.3: 准备symbolicatecrash工具
2.4: copy xcode编译好的项目.app
二: 操作步骤
1: 导出真机crash文件?
1: xcode连接真机 -> window -> Devices and simulators -> View Device Logs
1.png
2.png
说明 :(还有一点就是如果打包的电脑跟你解析crash的电脑是同一个的话,那么这里导出的日志应该是解析好的,这是因为在打包的时候会建立 .app 及 .dYSM 两个文件的索引,所以可以自动解析 crash log 文件,要是没解析的话估计需要自己按照下面的方法解析了。)
2: 复制dSYM文件?
解读:其实是一个目录,在子目录中包含了一个16进制的保存函数地址映射信息的中转文件,所有Debug的symbols都在这个文件中(包括文件名、函数名、行号等),所以也称之为调试符号信息文件
1: 连接真机 -> window -> Organizer -> 选择对应的archiver的应用、如果没有archiver项目、请上传一下。
1.png
2.png
3.png
3: 复制 xcode编译好的项目.app
解读:xxx.app(一般这个文件是隐藏后缀名的)
1: 将我们真机编译出来的app复制一份出来到桌面
1.png
2.png
2: 方式2: 也如上面DSYM文件获取一样:
Xcode->Window->Organizer找到Archives->右击Show in Finder->右击.xcarchive文件->显示包内容在Products->Applications文件夹中找到xxx.app
001.png
3: 方式3:修改ipa包后缀名为.zip,解压完后的Payload里面就是xxx.app文件(注意:ipa包必须是你出现crash设备安装的ipa包)
4: 找到symbolicatecrash工具
1: 首先找到symbolicatecrash工具存放的地址
1.打开终端输入以下命令:
find /Applications/Xcode.app -name symbolicatecrash -type f
显示结果如下:
====WatchSimulator
/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
====AppleTV
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
====iPhoneSimulator
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
====看作真机
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
我们获取到最后一条:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
5: 开始合成新的符号化的crash日志report
1: 将上述4个文件放在一个新目录下,比如桌面新建一个文件为crash文件夹,都放在这里面:
1.png
2: 确保三个文件的uuid是一致的
dwarfdump --uuid xxx.app/xxx
dwarfdump --uuid xxx.app.dSYM
crash文件打开后Binary Images:后面第一个大长串就是crash文件的uuid
1: dwarfdump --uuid DSYM文件或者文件路径
dwarfdump --uuid TestCrashDemo.app.dSYM/
2: dwarfdump --uuid dwarfdump --uuid TestCrashDemo.app/TestCrashDemo
3: Binary Images: 后面第一个大长串就是crash文件的uuid:c011521c6f073688935b713e85e4631c
Binary Images:
0x104938000 - 0x1080affff BMWOne arm64 <c011521c6f073688935b713e85e4631c> /var/containers/Bundle/Application/8C2636F3-99A8-4D9A-A773-DC04BF1E67D5/BMWOne.app/BMWOne
111.png
222.png
3: 三个UUID一致的话就可以利用下面的命令解析:(./symbolicatecrash+.crash文件路径+.app.dSYM路径+>+Log.crash 这几个最好用空格分开,路径用全路径,解析的结果就是Log.crash)
cd crash文件夹(刚才自己创建的)
- 3.1 执行命令:./symbolicatecrash 拖入准备符号化的crash文件 拖入DSYM文件 > 新的log文件名
如:
/symbolicatecrash /Users/我的电脑名/Desktop/crash/CrashDemo\ \ 2019-5-9\ 下午11-23.crash /Users/我的电脑名/Desktop/crash/CrashDemo.app.dSYM > log.crash
- 3.2: 显示报错:Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
- 3.3查询环境变量
xcode-select -print-path
显示"/Applications/Xcode.app/Contents/Developer/"
在终端输入命令:
export DEVELOPER_DIR=”/Applications/XCode.app/Contents/Developer”
export DEVELOPER_DIR=”/Applications/XCode.app/Contents/Developer”
- 3.4: 重新操作3.1步骤,成功生成新的log文件(符号化之后的日志文件)
三:注意事项:
1: 【xxx.app.dSMY xxx.app xxx.crash】uuid要一致
四:优秀文章:
五:线上Crash采集:第三方平台和开源框架?
5.1: 第三方统计crash
1: 国内
- 1:友盟(阿里)
- 2:Bugly(腾讯)
- 3:网易云捕
2:国外
- 1:Crashlytics(Twitter)
- 2:Flurry(Yahoo)
5.2 原理?
1: 均是根据系统产生的crash日志进行一次提取或封装、将封装后的crash文件上传到对应的服务器进行解析并统计展示。
5.3: 开源框架?
1: iOS常用的crash收集开源框架有:
- 1: PLCrashReporter
- 2: KSCrash
- 3: CrashKit
- 4: Countly
谢谢:具体使用可以直接在github上进行查看
六:线上Crash 统计:第三方?
1: 业界Crash统计一般有两种方案
- 1: 自己搭建服务器、上传应用信息和崩溃数据(不推荐: 成本太大)
- 2: 采用第三方平台、进行Crash数据采集和统计、包括分析一体化
例如:可以使用国内的友盟(阿里)、Bugly(腾讯);国外的Crashlytics(Twitter)
七:线上线下Crash 分析?
1: 一份Crash日志是由一下7部分组成:
- 1: 进程信息: process info
- 2: 基本信息: Basic info
- 3: 异常信息: Exception info
- 4: 线程回溯: Thread backtracking
- 5: 堆栈信息(核心关注): Stack info
- 6: 线程状态:Thread status
- 7: 动态库信息: Binary info
7.1 进程信息: process info
崩溃进程相关信息
- 1: Incident Idendifier: 这是Crash唯一标识ID
如12E38879-3EC9-4F1A-B20C-F0695C514689
- 2: CrashReporter key: 这是映射到设备的唯一key
如69f2f3e9acd9b5df38d2c8c59844a69adc303149,如果多个Crash拥有相同的key,说明这系列Crash只发生在一个或少数几个设备上。
- 3: Hardware model: 设备类型
如:iPhone8,2。如果很多Crash log都来自相同的设备、说明我们的应用在特定设备上存在问题
- 4: Process: 应用名称
如AlipayWallet [13563],里面的数字代表Crash时的PID
- 5: Path: 应用在手机中的路径
如:/private/var/containers/Bundle/Application/DC064759-9874-448C-AFB9-A4144D36F75D/AlipayWallet.app/AlipayWallet
- 6: Identifier: 应用Bundle ID
如:com.alipay.iphoneclient
- 7: Code Type: 代码类型
如:ARM-64 (Native)
7.2 基本信息: basic info
崩溃设备基本信息、包括闪退发生的日期和时间、设备的iOS版本等
- 1: Date/Time: Crash发生时间
如:2019-05-09 22:08:59.3018 +0800
- 2: Launch Time: App 启动时间
如:2019-05-09 22:08:51.7129 +0800
- 3: OS Version: iOS 版本
如:iPhone OS 12.1.4 (16D57),12.1.4 为系统版本, 16D57位Build号
7.3: 异常信息:Exception info
Crash时异常类型、异常码和抛出异常的线程
- 1: Exception Type: 异常类型
如:EXC_CRASH (SIGKILL)
- 2: Exception Codes: 异常码
如:0x0000000000000000, 0x0000000000000000
- 3: Triggered by thread: 异常发生的线程
7.4: 线程回溯:Thread backtracking
提供应用中所有线程的回溯日志
7.5: 堆栈信息:Stack info
我们分析Crash最重要的信息,可以帮助我们快速定位Crash位置和原因,这些信息都保存在.dSYM 文件中
7.6: 线程状态:Thread state
Crash时寄存器中的值,一般可忽略
如:Thread 0 crashed with ARM Thread State (64-bit):
7.7: 动态库信息:Binary info
包括模块起始地址、模块结束地址、动态库名称、指令集种类、UUID、安装路径等信息、在后面符号化时需要用到。
7.8: Crash符号化分析工具?
- 1: Xcode IDE
- 2: symbolicationcrash
- 3: 命令行工具atos
格式:atos -o (dsym文件路径) -l (模块load地址) -arch (指令集种类调用方法的地址:如armv6、armv7、armv7s、arm64)- 4: 第三方工具:
1: dSYMTools
2: SYM
网友评论