1. 程式人生 > >iOS崩潰捕獲以及收集原理

iOS崩潰捕獲以及收集原理

通過崩潰捕獲和收集,可以收集到已釋出應用(遊戲)的異常,以便開發人員發現和修改bug,對於提高軟體質量有著極大的幫助,本文主要介紹iOS平臺下崩潰捕獲和收集的原理及步驟。

要實現崩潰捕獲和收集的步驟如下:

      1、捕獲崩潰

      2、獲取堆疊資訊

      3、符號表還原

      4、伺服器上傳

捕獲異常

iOS中引發崩潰的程式碼本質上就兩類,一個是c++語言層面的錯誤,屬於比較底層的錯誤,比如野指標,除零,記憶體訪問異常等等,這一類的錯誤可以通過訊號機制來捕獲(signal或者是sigaction),即任何系統錯誤都會丟擲一個錯誤訊號,我們可以通過設定一個回撥函式,然後在回撥函式裡面進行自己的處理;另一類是未捕獲異常(Uncaught Exception),iOS下面最常見的就是objective-c的NSException,比如,陣列訪問元素越界。這些異常如果沒有在最上層try住,那麼程式就崩潰了。

針對NSException的捕獲,通過呼叫NSSetUncaughtExceptionHandler來捕獲,系統錯誤通過註冊signal來捕獲,一般產生一個NSException的異常的時候,同時也會丟擲一個signal的訊號。

如果要做得全面,除了處理Object-C專案,還需要處理Swift語言編寫的專案,另外還有就是U3D的工程,移動遊戲開發很多都是使用這個。

獲取堆疊資訊

但捕獲到程式的異常後,我們需要解析app崩潰時的環境,即崩潰堆疊。

NSException的異常比較簡單,直接獲取崩潰name,reason和callstack;signal的堆疊的處理就比較麻煩些;另外,還就是需要分析APP的當前執行緒資訊以及所有的執行緒資訊或者更加深一步的暫存器資訊。

不過這個時候拿到的堆疊是地址的形式,還需要第三步的符號表還原功能才能定位到程式碼行號。

 

注意:在分析堆疊資訊時需要區分32位和64位,以及分別處理真機和模擬器的堆疊,因為一個是arm架構,一個是x86_ 64。

符號表還原

符號表還原包括系統符號表和App自己的符號表這兩類。

系統符號表的話,比較坑爹,需要有不同系統版本的手機,分別拿到他們的系統符號表,解析出來,沒有找到一個Apple提供的統一系統symbol檔案下載地址;App的符號表,Build的時候都會生成。通過分析dwarf檔案架構,解析出對應的符號表,然後和第二步的結果比照還原

 

伺服器上傳

這個就比較簡單了,略過。

如果想完整的實現整個流程還是比較費時費力,需要SDK的開發,伺服器後臺、前段的支援,最好使用已經現成的東東,比如網易雲捕啥的,關鍵是還免費,多方便啊。