一:Crash-本地符號化1:symbolicatecrash
- 1.symbolicatecrash是xcode自帶的符號表工具
- 2: 準(zhǔn)備工作:
2.1: crash文件(沒有符號化的crash文件:16進(jìn)制的字符)
2.2: 復(fù)制dSYM文件
2.3: 準(zhǔn)備symbolicatecrash工具
2.4: copy xcode編譯好的項目.app
二: 操作步驟
1: 導(dǎo)出真機crash文件朦蕴?
1: xcode連接真機 -> window -> Devices and simulators -> View Device Logs
1.png
2.png
說明 :(還有一點就是如果打包的電腦跟你解析crash的電腦是同一個的話螟碎,那么這里導(dǎo)出的日志應(yīng)該是解析好的宫仗,這是因為在打包的時候會建立 .app 及 .dYSM 兩個文件的索引寂祥,所以可以自動解析 crash log 文件,要是沒解析的話估計需要自己按照下面的方法解析了踏枣。)
2: 復(fù)制dSYM文件昌屉?
解讀:其實是一個目錄,在子目錄中包含了一個16進(jìn)制的保存函數(shù)地址映射信息的中轉(zhuǎn)文件茵瀑,所有Debug的symbols都在這個文件中(包括文件名间驮、函數(shù)名、行號等)马昨,所以也稱之為調(diào)試符號信息文件
1: 連接真機 -> window -> Organizer -> 選擇對應(yīng)的archiver的應(yīng)用竞帽、如果沒有archiver項目、請上傳一下鸿捧。
1.png
2.png
3.png
3: 復(fù)制 xcode編譯好的項目.app
解讀:xxx.app(一般這個文件是隱藏后綴名的)
1: 將我們真機編譯出來的app復(fù)制一份出來到桌面
1.png
2.png
2: 方式2: 也如上面DSYM文件獲取一樣:
Xcode->Window->Organizer找到Archives->右擊Show in Finder->右擊.xcarchive文件->顯示包內(nèi)容在Products->Applications文件夾中找到xxx.app
001.png
3: 方式3:修改ipa包后綴名為.zip屹篓,解壓完后的Payload里面就是xxx.app文件(注意:ipa包必須是你出現(xiàn)crash設(shè)備安裝的ipa包)
4: 找到symbolicatecrash工具
1: 首先找到symbolicatecrash工具存放的地址
1.打開終端輸入以下命令:
find /Applications/Xcode.app -name symbolicatecrash -type f
顯示結(jié)果如下:
====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 這幾個最好用空格分開抱虐,路徑用全路徑,解析的結(jié)果就是Log.crash)
cd crash文件夾(剛才自己創(chuàng)建的)
- 3.1 執(zhí)行命令:./symbolicatecrash 拖入準(zhǔn)備符號化的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查詢環(huán)境變量
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要一致
四:優(yōu)秀文章:
五:線上Crash采集:第三方平臺和開源框架?
5.1: 第三方統(tǒng)計crash
1: 國內(nèi)
- 1:友盟(阿里)
- 2:Bugly(騰訊)
- 3:網(wǎng)易云捕
2:國外
- 1:Crashlytics(Twitter)
- 2:Flurry(Yahoo)
5.2 原理懦冰?
1: 均是根據(jù)系統(tǒng)產(chǎn)生的crash日志進(jìn)行一次提取或封裝灶轰、將封裝后的crash文件上傳到對應(yīng)的服務(wù)器進(jìn)行解析并統(tǒng)計展示。
5.3: 開源框架刷钢?
1: iOS常用的crash收集開源框架有:
- 1: PLCrashReporter
- 2: KSCrash
- 3: CrashKit
- 4: Countly
謝謝:具體使用可以直接在github上進(jìn)行查看
六:線上Crash 統(tǒng)計:第三方笋颤?
1: 業(yè)界Crash統(tǒng)計一般有兩種方案
- 1: 自己搭建服務(wù)器、上傳應(yīng)用信息和崩潰數(shù)據(jù)(不推薦: 成本太大)
- 2: 采用第三方平臺内地、進(jìn)行Crash數(shù)據(jù)采集和統(tǒng)計伴澄、包括分析一體化
例如:可以使用國內(nèi)的友盟(阿里)、Bugly(騰訊)阱缓;國外的Crashlytics(Twitter)
七:線上線下Crash 分析非凌?
1: 一份Crash日志是由一下7部分組成:
- 1: 進(jìn)程信息: process info
- 2: 基本信息: Basic info
- 3: 異常信息: Exception info
- 4: 線程回溯: Thread backtracking
- 5: 堆棧信息(核心關(guān)注): Stack info
- 6: 線程狀態(tài):Thread status
- 7: 動態(tài)庫信息: Binary info
7.1 進(jìn)程信息: process info
崩潰進(jìn)程相關(guān)信息
- 1: Incident Idendifier: 這是Crash唯一標(biāo)識ID
如12E38879-3EC9-4F1A-B20C-F0695C514689
- 2: CrashReporter key: 這是映射到設(shè)備的唯一key
如69f2f3e9acd9b5df38d2c8c59844a69adc303149,如果多個Crash擁有相同的key荆针,說明這系列Crash只發(fā)生在一個或少數(shù)幾個設(shè)備上敞嗡。
- 3: Hardware model: 設(shè)備類型
如:iPhone8,2颁糟。如果很多Crash log都來自相同的設(shè)備、說明我們的應(yīng)用在特定設(shè)備上存在問題
- 4: Process: 應(yīng)用名稱
如AlipayWallet [13563]喉悴,里面的數(shù)字代表Crash時的PID
- 5: Path: 應(yīng)用在手機中的路徑
如:/private/var/containers/Bundle/Application/DC064759-9874-448C-AFB9-A4144D36F75D/AlipayWallet.app/AlipayWallet
- 6: Identifier: 應(yīng)用Bundle ID
如:com.alipay.iphoneclient
- 7: Code Type: 代碼類型
如:ARM-64 (Native)
7.2 基本信息: basic info
崩潰設(shè)備基本信息棱貌、包括閃退發(fā)生的日期和時間、設(shè)備的iOS版本等
- 1: Date/Time: Crash發(fā)生時間
如: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 為系統(tǒng)版本婚脱, 16D57位Build號
7.3: 異常信息:Exception info
Crash時異常類型、異常碼和拋出異常的線程
- 1: Exception Type: 異常類型
如:EXC_CRASH (SIGKILL)
- 2: Exception Codes: 異常碼
如:0x0000000000000000, 0x0000000000000000
- 3: Triggered by thread: 異常發(fā)生的線程
7.4: 線程回溯:Thread backtracking
提供應(yīng)用中所有線程的回溯日志
7.5: 堆棧信息:Stack info
我們分析Crash最重要的信息勺像,可以幫助我們快速定位Crash位置和原因障贸,這些信息都保存在.dSYM 文件中
7.6: 線程狀態(tài):Thread state
Crash時寄存器中的值,一般可忽略
如:Thread 0 crashed with ARM Thread State (64-bit):
7.7: 動態(tài)庫信息:Binary info
包括模塊起始地址咏删、模塊結(jié)束地址惹想、動態(tài)庫名稱、指令集種類督函、UUID嘀粱、安裝路徑等信息、在后面符號化時需要用到辰狡。
7.8: Crash符號化分析工具锋叨?
- 1: Xcode IDE
- 2: symbolicationcrash
- 3: 命令行工具atos
格式:atos -o (dsym文件路徑) -l (模塊load地址) -arch (指令集種類調(diào)用方法的地址:如armv6、armv7宛篇、armv7s娃磺、arm64)- 4: 第三方工具:
1: dSYMTools
2: SYM