2019-05-09: Crash本地符號化一:symbolicatecrash

一: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)秀文章:

完整文章1

dSYM解析工具1

Crash文件結(jié)構(gòu)說明1

debug編譯符號表怎么獲取

atos工具使用格式



五:線上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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叫倍,隨后出現(xiàn)的幾起案子偷卧,更是在濱河造成了極大的恐慌,老刑警劉巖吆倦,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件听诸,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚕泽,警方通過查閱死者的電腦和手機晌梨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來须妻,“玉大人仔蝌,你說我怎么就攤上這事』睦簦” “怎么了敛惊?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長司倚。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么霉咨? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任惰瓜,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好奠滑,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妒穴,像睡著了一般宋税。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讼油,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天杰赛,我揣著相機與錄音,去河邊找鬼矮台。 笑死乏屯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘦赫。 我是一名探鬼主播辰晕,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼确虱!你這毒婦竟也來了含友?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤校辩,失蹤者是張志新(化名)和其女友劉穎窘问,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宜咒,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡南缓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荧呐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡纸镊,死狀恐怖倍阐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逗威,我是刑警寧澤峰搪,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凯旭,受9級特大地震影響概耻,放射性物質(zhì)發(fā)生泄漏使套。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一鞠柄、第九天 我趴在偏房一處隱蔽的房頂上張望侦高。 院中可真熱鬧,春花似錦厌杜、人聲如沸奉呛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞧壮。三九已至,卻和暖如春匙握,著一層夾襖步出監(jiān)牢的瞬間咆槽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工圈纺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秦忿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓赠堵,卻偏偏與公主長得像小渊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茫叭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容