作為一名應用開發者,相信你經常碰到以下情景:
在你將應用提交到App Store之前,想必你已經做了大量的測試工作,在你的設備上它也運行的很好,然而,還是會出現使用時閃退的情況。相信大家已經做好了Crash log的收集工作。
Crash log主要分為兩種情況:
1.連接真機進行調試
2.App Store上應用的Bug追蹤
本文主要講的是App Store上bug的分析。
上圖正是Apple給的崩潰日志,下面我們逐步分析一下日志的內容。
1.進程信息
Incident Identifier
:crash的id
CrashReporter Key
:crash的設備id
Hardware Model
:手機型號
Process
:[app名字] [進程ID]
Path
:app的位置
Identifier
:bundle ID
Version
:版本號
AppStoreTools
Code Type
:arm64
Role
:app處于前臺
Parent Process
Coalition
2.基本信息
Date/Time
:crash發生時間
Launch Time
:app啟動時間
OS Version
:iOS版本
Release Type
Baseband Version
Report Version
3.異常信息
Exception Type
:異常類型
Exception Codes
:異常地址
Exception Note
:描述
Triggered by Thread
:異常發生的線程
4.異常回溯
發生異常時的線程堆棧
分析工具symbolicatecrash和atos
我們發現crash log上都是一些地址,根本不是我們所熟悉的代碼,這時候我們就要借助
symbolicatecrash
和atos
進行分析。
在分析之前需要準備dSYM
文件,crash log
和symbolicatecrash
(Xcode自帶的崩潰分析工具)。
什么是dSYM文件?
Xcode編譯項目后,我們會看到一個同名的 dSYM 文件,dSYM 是保存 16 進制函數地址映射信息的中轉文件,我們調試的 symbols 都會包含在這個文件中,并且每次編譯項目的時候都會生成一個新的 dSYM 文件,位于 /Users/用戶名/Library/Developer/Xcode/Archives
目錄下,對于每一個發布版本我們都很有必要保存對應的 Archives
文件
dSYM文件作用
我們可以通過crash log中出錯的函數地址去查詢 dSYM 文件中程序對應的函數名和文件名
symbolicatecrash
1.在桌面新建一個文件夾crashtemp
- 找到
symbolicatecrash
工具 終端輸入
find /Applications/Xcode.app -name symbolicatecrash -type f
找到"symbolicatecrash" 文件, 拷貝到剛才創建的 "crashtemp" 文件夾里。
3.Xcode->Window->Organizer->Archives
顯示包內容獲取dSYM文件拷貝到剛才創建的 "crashtemp" 文件夾里。
4.crash log文件拷貝到crashtemp
里。
5.打開終端進入crashtemp
文件夾:
cd /Users/username/Desktop/crashtemp
6.檢驗crash、dSYM文件是否匹配
每一個xx.app.dSYM 文件都有對應的 UUID,crash 文件也有自己的 UUID,只要這三個文件的 UUID 一致,我們就可以通過他們解析出正確的錯誤函數信息了。
在 terminal 中輸入以下命令,查看UUID:
dwarfdump --uuid xx.app/xx //查看.app的UUID(xx代表你的項目名)
dwarfdump --uuid xx.app.dSYM // 查看.dSYM的UUID
crash 文件內第一行 Incident Identifier 就是該 crash 文件的 UUID
7.輸入以下命令
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash //*是文件名
這時候終端將會進行處理......
生成一個新的文件symbol.crash
,這就是我們認識的crash文件。
atos
有時候通過symbolicatecrash
并不能解析出來崩潰信息,或者APP自身的堆棧能解析出來,但是系統的堆棧解析不出來。
可以通過atos
命令逐行解析,通過這個命令可以解析指定的某一行堆棧。
atos -o yourAppName.app.dSYM/Contents/Resources/DWARF/yourAppName -arch arm64/armv7 -l <load-address> <address>
load-address:報錯地址
address:鏡像的首地址