天天看點

iOS App崩潰日志分析

APP新版本上線之前,一般都會經過測試團隊的反複測試,确認無bug後才會釋出。釋出那刻作為開發人員的你,估計欣喜若狂吧,自豪吧!!。釋出後線上運作好長一段時間,均安然無恙,可突然有一天你們家CEO說,自家APP崩了,出現閃退了。那一刻在CEO面前感覺弱爆了的感覺有木有啊?着急了吧,抓狂了吧,F**K it, 怎麼解決呢?君不必太過憂傷,且聽我給你細說。

擷取iOS APP崩潰日志

你造嗎,iOS系統會生成各APP閃退的崩潰日志?“哦,在哪裡?長什麼樣?”要過去iOS系統生成的Crash日志,請将發生崩潰異常的Apple裝置連接配接到你的Mac電腦,打開Xcode->Window->Devices菜單,出現如下界面: 

點選View Device Logs按鈕可以檢視接入手機中所有的Crash日志,選擇相應APP的某條Crash日志點選右鍵導出該日志并命名為myCrash.crash:

查找該日志對應的dSYM檔案和APP包

剛才導出的日志有如天書般讓人雲裡霧裡,要想将其翻譯成易懂的文字,我們需要兩個檔案的幫助,該日志對應的dSYM檔案和該App ipa檔案,根據導出日志裡的App 版本号可以從你的XcodeArchive記錄裡可以找到當時釋出該版本的xcarchive檔案: 

選擇相應的xcarchive檔案,右鍵在Finder中顯示,接着右鍵顯示包内容: 

将該dSYM拷貝到myCrash.crash同目錄下;同理将該Products下的XXX.app拷貝到myCrash.crash同目錄下: 

檔案彙總如下圖:

将Crash日志Symbolicate

1)确定三個檔案的UUID一緻 

使用dwarfdump指令可以檢視XXX.app以及dSYM檔案的UUID:

crash Johnkui$ dwarfdump --uuid XXX.app/XXX 

UUID: 9E4C94C4-DBA8-3E13-AE4D-75654E1FEC18 (armv7) XXX.app/XXX

UUID: 956EA55D-0CF2-335D-8DAC-7537216DDD78 (arm64) XXX.app/XXX

crash Johnkui$ dwarfdump --uuid XXX.app.dSYM/

UUID: 9E4C94C4-DBA8-3E13-AE4D-75654E1FEC18 (armv7) XXX.app.dSYM/Contents/Resources/DWARF/XXX

UUID: 956EA55D-0CF2-335D-8DAC-7537216DDD78 (arm64) XXX.app.dSYM/Contents/Resources/DWARF/XXX

1

2

3

4

5

6

崩潰日志myCrash.crash的UUID可以在日志檔案裡的Binary Images:中第一行尖括号内, 

arm64 <956ea55d0cf2335d8dac7537216ddd78>,和上面兩個檔案的UUID比對,是以三者UUID一緻。

2)使用symbolicatecrash工具 

Xcode有自帶的symbolicatecrash工具,可以通過dSYM檔案将crash檔案中的16進制位址轉換成可讀的函數位址,在Xcode中,搜尋該工具的位置,不同版本的Xcode該工具的位置不太一樣:

crash Johnkui$  find /Applications/Xcode.app/ -name symbolicatecrash

1

Xcode 8位于:

/Applications/Xcode.app//Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

1

将該工具拷貝到/urs/bin/目錄下,但是Mac OS 11後系統關閉了root權限,可以通過重新啟動Mac,同僚按住Command+R,然後打開Terminal, 輸入csrutil disable開啟root權限,然後重新開機設定DEVELOPER_DIR系統變量:

crash Johnkui$ cd ~/

~ Johnkui$ vi .bash_profile

輸入:

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

儲存後:

~ Johnkui$ source .bash_profile 

...

crash Johnkui$ symbolicatecrash XXX.crash XXX.app.dSYM>XXX.txt

1

2

3

4

5

6

7

8

最後打開該XXX.txt檔案,即可檢視bug出現在哪行代碼了。

iOS