序
在日常開發(fā)中蹋肮,app難免會(huì)發(fā)生崩潰吭净。簡(jiǎn)單的崩潰還好說(shuō)访圃,復(fù)雜的崩潰就需要我們通過(guò)解析Crash文件來(lái)分析了替蔬,解析Crash文件在iOS開發(fā)中是比較常見的告私。
獲取崩潰信息方式
在iOS中獲取崩潰信息的方式有很多,比較常見的是使用友盟承桥、云測(cè)驻粟、百度等第三方分析工具,或者自己收集崩潰信息并上傳公司服務(wù)器凶异。下面列舉一些我們常用的崩潰分析方式:
- 使用友盟蜀撑、云測(cè)、百度等第三方崩潰統(tǒng)計(jì)工具剩彬。
- 自己實(shí)現(xiàn)應(yīng)用內(nèi)崩潰收集酷麦,并上傳服務(wù)器。
- Xcode-Devices中直接查看某個(gè)設(shè)備的崩潰信息喉恋。
- 使用蘋果提供的Crash崩潰收集服務(wù)沃饶。(少用)
收集崩潰信息
蘋果給我們提供了異常處理的類母廷,NSException類。這個(gè)類可以創(chuàng)建一個(gè)異常對(duì)象糊肤,也可以通過(guò)這個(gè)類獲取一個(gè)異常對(duì)象琴昆。
這個(gè)類中我們最常用的還是一個(gè)獲取崩潰信息的C函數(shù),我們可以通過(guò)這個(gè)函數(shù)在程序發(fā)生異常的時(shí)候收集這個(gè)異常轩褐。
// 將系統(tǒng)提供的獲取崩潰信息函數(shù)寫在這個(gè)方法中椎咧,以保證在程序開始運(yùn)行就具有獲取崩潰信息的功能
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 將下面C函數(shù)的函數(shù)地址當(dāng)做參數(shù)
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
return YES;
}
// 設(shè)置一個(gè)C函數(shù),用來(lái)接收崩潰信息
void UncaughtExceptionHandler(NSException *exception){
// 可以通過(guò)exception對(duì)象獲取一些崩潰信息把介,我們就是通過(guò)這些崩潰信息來(lái)進(jìn)行解析的勤讽,例如下面的symbols數(shù)組就是我們的崩潰堆棧。
NSArray *symbols = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
}
我們也可以通過(guò)下面方法獲取崩潰統(tǒng)計(jì)的函數(shù)指針:
NSUncaughtExceptionHandler *handler = NSGetUncaughtExceptionHandler();
dSYM 符號(hào)集
- 符號(hào)集是我們對(duì)ipa文件進(jìn)行打包之后拗踢,和.app文件同級(jí)的后綴名為.dSYM的文件脚牍,這個(gè)文件必須使用Xcode進(jìn)行打包才有。
- 每一個(gè).dSYM文件都有一個(gè)UUID巢墅,和.app文件中的UUID對(duì)應(yīng)诸狭,代表著是一個(gè)應(yīng)用。而.dSYM文件中每一條崩潰信息也有一個(gè)單獨(dú)的UUID君纫,用來(lái)和程序的UUID進(jìn)行校對(duì)驯遇。
- 我們?nèi)绻皇褂?dSYM文件獲取到的崩潰信息都是不準(zhǔn)確的。
- 符號(hào)集中存儲(chǔ)著文件名蓄髓、方法名叉庐、行號(hào)的信息,是和可執(zhí)行文件的16進(jìn)制函數(shù)地址對(duì)應(yīng)的会喝,通過(guò)分析崩潰的.Crash文件可以準(zhǔn)確知道具體的崩潰信息陡叠。
我們每次Archive一個(gè)包之后,都會(huì)隨之生成一個(gè)dSYM文件肢执。每次發(fā)布一個(gè)版本枉阵,我們都需要備份這個(gè)文件,以方便以后的調(diào)試预茄。進(jìn)行崩潰信息符號(hào)化的時(shí)候兴溜,必須使用當(dāng)前應(yīng)用打包的電腦所生成的dSYM文件,其他電腦生成的文件可能會(huì)導(dǎo)致分析不準(zhǔn)確的問(wèn)題耻陕。
當(dāng)程序崩潰的時(shí)候昵慌,我們可以獲得到崩潰的錯(cuò)誤堆棧,但是這個(gè)錯(cuò)誤堆棧都是0x開頭的16進(jìn)制地址淮蜈,需要我們使用Xcode自帶的symbolicatecrash工具來(lái)將.Crash和.dSYM文件進(jìn)行符號(hào)化,就可以得到詳細(xì)崩潰的信息已卷。
崩潰分析
- 命令行解析Crash文件
- 通過(guò)Mac自帶的命令行工具解析Crash文件需要具備三個(gè)文件
- symbolicatecrash梧田,Xcode自帶的崩潰分析工具,使用這個(gè)工具可以更精確的定位崩潰所在的位置,將0x開頭的地址替換為響應(yīng)的代碼和具體行數(shù)裁眯。
- 我們打包時(shí)產(chǎn)生的dSYM文件鹉梨。
- 崩潰時(shí)產(chǎn)生的Crash文件,例如:*.crash。
- 或者是手機(jī)通過(guò)iTools導(dǎo)出的*.ips文件(ips文件和crash文件只是后綴名不一樣)
我在解析崩潰信息的時(shí)候穿稳,首先在桌面上建立一個(gè)Crash文件夾存皂,然后將.Crash、.dSYM逢艘、symbolicatecrash放在這個(gè)文件夾中旦袋,這樣進(jìn)入這個(gè)文件夾下,直接一行命令就解決了它改。
symbolicatecrash我們可以在下面路徑下可以找到疤孕,我用的是Xcode8,其他版本Xcode路徑不一樣央拖,請(qǐng)自行Google祭阀。
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
選中archive的版本右擊,選擇Show in Finder就可以選中archived 文件然后顯示包內(nèi)容鲜戒,就可以找到dSYM文件了专控。
將.Crash、.dSYM遏餐、symbolicatecrash三個(gè)文件都放在我們?cè)谧烂娼⒌腃rash文件夾中伦腐。
進(jìn)行解析的工作
開啟命令行工具,進(jìn)入崩潰文件夾crash中
cd /Users/自己MacPro上的名字/Desktop/崩潰文件夾crash
使用命令解析Crash文件境输,*號(hào)指的是具體的文件名
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
如果上面命令不成功蔗牡,使用命令檢查一下環(huán)境變量
xcode-select -print-path
返回結(jié)果:
/Applications/Xcode.app/Contents/Developer/
如果不是上面的結(jié)果,需要使用下面命令設(shè)置一下導(dǎo)出的環(huán)境變量嗅剖,然后重復(fù)上面解析的操作辩越。(這一步很重要)
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
解析完成后會(huì)生成一個(gè)新的.Crash文件,這個(gè)文件中就是崩潰詳細(xì)信息信粮。圖中紅色標(biāo)注的部分就是我們代碼崩潰的部分黔攒。
注意,以下情況不會(huì)有崩潰信息產(chǎn)生:
- 內(nèi)存訪問(wèn)錯(cuò)誤(不是野指針錯(cuò)誤)
- 低內(nèi)存强缘,當(dāng)程序內(nèi)存使用過(guò)多會(huì)造成系統(tǒng)低內(nèi)存的問(wèn)題督惰,系統(tǒng)會(huì)將程序內(nèi)存回收
- 因?yàn)槟撤N原因觸發(fā)看門狗機(jī)制
通過(guò)Xcode查看設(shè)備崩潰信息
除了上面的系統(tǒng)分析工具來(lái)進(jìn)行分析,如果是我們自己直接使用手機(jī)連接崩潰或者崩潰之后連接手機(jī)旅掂,選擇window-> devices -> 選擇自己的手機(jī) -> view device logs 就可以查看我們的崩潰信息了赏胚。
只要手機(jī)上的應(yīng)用是這臺(tái)電腦安裝打包的,這樣的崩潰信息系統(tǒng)已經(jīng)為我們符號(hào)化好了商虐,我們只需要進(jìn)去之后等一會(huì)就行(不要相信這里面的進(jìn)度刷新觉阅,并不準(zhǔn)確)崖疤,如果還是沒(méi)有符號(hào)化完畢 ,我們選擇文件典勇,然后右擊選擇Re-Sysbomlicate就可以劫哼。
如果是使用其他電腦進(jìn)行的打包,我們可以在這里面將Crash文件導(dǎo)出割笙,自己通過(guò)命令行的方式進(jìn)行解析权烧。