序
在日常開發(fā)中,app難免會發(fā)生崩潰翁涤。簡單的崩潰還好說形庭,復雜的崩潰就需要我們通過解析Crash文件來分析了,解析Crash文件在iOS開發(fā)中是比較常見的埋酬。
獲取崩潰信息方式
在iOS中獲取崩潰信息的方式有很多哨啃,比較常見的是使用友盟、云測写妥、百度等第三方分析工具拳球,或者自己收集崩潰信息并上傳公司服務(wù)器。
下面列舉一些我們常用的崩潰分析方式:
- 使用友盟珍特、云測祝峻、百度等第三方崩潰統(tǒng)計工具。
- 自己實現(xiàn)應(yīng)用內(nèi)崩潰收集扎筒,并上傳服務(wù)器莱找。
- Xcode-Devices中直接查看某個設(shè)備的崩潰信息。
- 使用蘋果提供的Crash崩潰收集服務(wù)嗜桌。(少用)
收集崩潰信息
蘋果給我們提供了異常處理的類宋距,NSException類。這個類可以創(chuàng)建一個異常對象症脂,也可以通過這個類獲取一個異常對象谚赎。
這個類中我們最常用的還是一個獲取崩潰信息的C函數(shù),我們可以通過這個函數(shù)在程序發(fā)生異常的時候收集這個異常诱篷。
// 將系統(tǒng)提供的獲取崩潰信息函數(shù)寫在這個方法中壶唤,以保證在程序開始運行就具有獲取崩潰信息的功能
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 將下面C函數(shù)的函數(shù)地址當做參數(shù)
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
return YES;
}
// 設(shè)置一個C函數(shù),用來接收崩潰信息
void UncaughtExceptionHandler(NSException *exception){
// 可以通過exception對象獲取一些崩潰信息棕所,我們就是通過這些崩潰信息來進行解析的闸盔,例如下面的symbols數(shù)組就是我們的崩潰堆棧。
NSArray *symbols = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
}
我們也可以通過下面方法獲取崩潰統(tǒng)計的函數(shù)指針:
NSUncaughtExceptionHandler *handler = NSGetUncaughtExceptionHandler();
dSYM 符號集
- 符號集是我們對ipa文件進行打包之后琳省,和.app文件同級的后綴名為.dSYM的文件迎吵,這個文件必須使用Xcode進行打包才有。
- 每一個.dSYM文件都有一個UUID针贬,和.app文件中的UUID對應(yīng)击费,代表著是一個應(yīng)用。而.dSYM文件中每一條崩潰信息也有一個單獨的UUID桦他,用來和程序的UUID進行校對蔫巩。
- 我們?nèi)绻皇褂?dSYM文件獲取到的崩潰信息都是不準確的。
- 符號集中存儲著文件名、方法名圆仔、行號的信息垃瞧,是和可執(zhí)行文件的16進制函數(shù)地址對應(yīng)的,通過分析崩潰的.Crash文件可以準確知道具體的崩潰信息坪郭。
我們每次Archive一個包之后个从,都會隨之生成一個dSYM文件。每次發(fā)布一個版本歪沃,我們都需要備份這個文件嗦锐,以方便以后的調(diào)試。進行崩潰信息符號化的時候绸罗,必須使用當前應(yīng)用打包的電腦所生成的dSYM文件,其他電腦生成的文件可能會導致分析不準確的問題豆瘫。
當程序崩潰的時候珊蟀,我們可以獲得到崩潰的錯誤堆棧,但是這個錯誤堆棧都是0x開頭的16進制地址外驱,需要我們使用Xcode自帶的symbolicatecrash工具來將.Crash和.dSYM文件進行符號化育灸,就可以得到詳細崩潰的信息。
崩潰分析
- 命令行解析Crash文件
通過Mac自帶的命令行工具解析Crash文件需要具備三個文件
- symbolicatecrash昵宇,Xcode自帶的崩潰分析工具磅崭,使用這個工具可以更精確的定位崩潰所在的位置,將0x開頭的地址替換為響應(yīng)的代碼和具體行數(shù)瓦哎。
- 我們打包時產(chǎn)生的dSYM文件砸喻。
- 崩潰時產(chǎn)生的Crash文件,例如:*.crash。
我在解析崩潰信息的時候蒋譬,首先在桌面上建立一個Crash文件夾割岛,然后將.Crash、.dSYM犯助、symbolicatecrash放在這個文件夾中癣漆,這樣進入這個文件夾下,直接一行命令就解決了剂买。
symbolicatecrash我們可以在下面路徑下可以找到惠爽,我用的是Xcode7,其他版本Xcode路徑不一樣瞬哼,請自行Google婚肆。
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
選中archive的版本右擊,選擇Show in Finder就可以選中archived 文件然后顯示包內(nèi)容坐慰,就可以找到dSYM文件了旬痹。
將.Crash、.dSYM、symbolicatecrash三個文件都放在我們在桌面建立的Crash文件夾中两残。
進行解析的工作
開啟命令行工具永毅,進入崩潰文件夾crash中
cd /Users/自己MacPro上的名字/Desktop/崩潰文件夾crash
使用命令解析Crash文件,*號指的是具體的文件名
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
如果上面命令不成功人弓,使用命令檢查一下環(huán)境變量
xcode-select -print-path
返回結(jié)果:
/Applications/Xcode.app/Contents/Developer/
如果不是上面的結(jié)果沼死,需要使用下面命令設(shè)置一下導出的環(huán)境變量,然后重復上面解析的操作崔赌。(這一步很重要)
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
解析完成后會生成一個新的.Crash文件意蛀,這個文件中就是崩潰詳細信息。圖中紅色標注的部分就是我們代碼崩潰的部分健芭。
注意县钥,以下情況不會有崩潰信息產(chǎn)生:
- 內(nèi)存訪問錯誤(不是野指針錯誤)
- 低內(nèi)存,當程序內(nèi)存使用過多會造成系統(tǒng)低內(nèi)存的問題慈迈,系統(tǒng)會將程序內(nèi)存回收
- 因為某種原因觸發(fā)看門狗機制
通過Xcode查看設(shè)備崩潰信息
除了上面的系統(tǒng)分析工具來進行分析若贮,如果是我們自己直接使用手機連接崩潰或者崩潰之后連接手機,選擇window-> devices -> 選擇自己的手機 -> view device logs 就可以查看我們的崩潰信息了痒留。
只要手機上的應(yīng)用是這臺電腦安裝打包的谴麦,這樣的崩潰信息系統(tǒng)已經(jīng)為我們符號化好了,我們只需要進去之后等一會就行(不要相信這里面的進度刷新伸头,并不準確)匾效,如果還是沒有符號化完畢 ,我們選擇文件恤磷,然后右擊選擇Re-Sysbomlicate就可以面哼。
如果是使用其他電腦進行的打包,我們可以在這里面將Crash文件導出扫步,自己通過命令行的方式進行解析精绎。