原文鏈接:http://www.jianshu.com/p/0b6f5148dab8
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。
序
在日常開發中,app難免會發生崩潰。簡單的崩潰還好說,復雜的崩潰就需要我們通過解析Crash文件來分析了,解析Crash文件在iOS開發中是比較常見的。
獲取崩潰信息方式
在iOS中獲取崩潰信息的方式有很多,比較常見的是使用友盟、雲測、百度等第三方分析工具,或者自己收集崩潰信息並上傳公司服務器。
下面列舉一些我們常用的崩潰分析方式:
- 使用友盟、雲測、百度等第三方崩潰統計工具。
- 自己實現應用內崩潰收集,並上傳服務器。
- Xcode-Devices中直接查看某個設備的崩潰信息。
- 使用蘋果提供的Crash崩潰收集服務。(少用)
收集崩潰信息
蘋果給我們提供了異常處理的類,NSException類。這個類可以創建一個異常對象,也可以通過這個類獲取一個異常對象。
這個類中我們最常用的還是一個獲取崩潰信息的C函數,我們可以通過這個函數在程序發生異常的時候收集這個異常。
// 將系統提供的獲取崩潰信息函數寫在這個方法中,以保證在程序開始運行就具有獲取崩潰信息的功能 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 將下面C函數的函數地址當做參數 NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler); return YES; } // 設置一個C函數,用來接收崩潰信息 void UncaughtExceptionHandler(NSException *exception){ // 可以通過exception對象獲取一些崩潰信息,我們就是通過這些崩潰信息來進行解析的,例如下面的symbols數組就是我們的崩潰堆棧。 NSArray *symbols = [exception callStackSymbols]; NSString *reason = [exception reason]; NSString *name = [exception name]; }
我們也可以通過下面方法獲取崩潰統計的函數指針:
NSUncaughtExceptionHandler *handler = NSGetUncaughtExceptionHandler();
dSYM 符號集
- 符號集是我們對ipa文件進行打包之后,和.app文件同級的后綴名為.dSYM的文件,這個文件必須使用Xcode進行打包才有。
- 每一個.dSYM文件都有一個UUID,和.app文件中的UUID對應,代表着是一個應用。而.dSYM文件中每一條崩潰信息也有一個單獨的UUID,用來和程序的UUID進行校對。
- 我們如果不使用.dSYM文件獲取到的崩潰信息都是不准確的。
- 符號集中存儲着文件名、方法名、行號的信息,是和可執行文件的16進制函數地址對應的,通過分析崩潰的.Crash文件可以准確知道具體的崩潰信息。
我們每次Archive一個包之后,都會隨之生成一個dSYM文件。每次發布一個版本,我們都需要備份這個文件,以方便以后的調試。進行崩潰信息符號化的時候,必須使用當前應用打包的電腦所生成的dSYM文件,其他電腦生成的文件可能會導致分析不准確的問題。

當程序崩潰的時候,我們可以獲得到崩潰的錯誤堆棧,但是這個錯誤堆棧都是0x開頭的16進制地址,需要我們使用Xcode自帶的symbolicatecrash工具來將.Crash和.dSYM文件進行符號化,就可以得到詳細崩潰的信息。
崩潰分析
- 命令行解析Crash文件
通過Mac自帶的命令行工具解析Crash文件需要具備三個文件
- symbolicatecrash,Xcode自帶的崩潰分析工具,使用這個工具可以更精確的定位崩潰所在的位置,將0x開頭的地址替換為響應的代碼和具體行數。
- 我們打包時產生的dSYM文件。
- 崩潰時產生的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 文件然后顯示包內容,就可以找到dSYM文件了。

將.Crash、.dSYM、symbolicatecrash三個文件都放在我們在桌面建立的Crash文件夾中。

進行解析的工作
開啟命令行工具,進入崩潰文件夾crash中
cd /Users/自己MacPro上的名字/Desktop/崩潰文件夾crash
使用命令解析Crash文件,*號指的是具體的文件名
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
如果上面命令不成功,使用命令檢查一下環境變量
xcode-select -print-path
返回結果:
/Applications/Xcode.app/Contents/Developer/
如果不是上面的結果,需要使用下面命令設置一下導出的環境變量,然后重復上面解析的操作。(這一步很重要)
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
解析完成后會生成一個新的.Crash文件,這個文件中就是崩潰詳細信息。圖中紅色標注的部分就是我們代碼崩潰的部分。

注意,以下情況不會有崩潰信息產生:
- 內存訪問錯誤(不是野指針錯誤)
- 低內存,當程序內存使用過多會造成系統低內存的問題,系統會將程序內存回收
- 因為某種原因觸發看門狗機制
通過Xcode查看設備崩潰信息
除了上面的系統分析工具來進行分析,如果是我們自己直接使用手機連接崩潰或者崩潰之后連接手機,選擇window-> devices -> 選擇自己的手機 -> view device logs 就可以查看我們的崩潰信息了。

只要手機上的應用是這台電腦安裝打包的,這樣的崩潰信息系統已經為我們符號化好了,我們只需要進去之后等一會就行(不要相信這里面的進度刷新,並不准確),如果還是沒有符號化完畢 ,我們選擇文件,然后右擊選擇Re-Sysbomlicate就可以。
如果是使用其他電腦進行的打包,我們可以在這里面將Crash文件導出,自己通過命令行的方式進行解析。