天天看點

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的目前線程資訊以及所有的線程資訊或者更加深一步的寄存器資訊。不過這個時候拿到的堆棧是位址的形式,還需要第三步的符号表還原功能才能定位到代碼行号。

iOS崩潰捕獲以及收集原理捕獲異常擷取堆棧資訊符号表還原伺服器上傳

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

符号表還原

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

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

iOS崩潰捕獲以及收集原理捕獲異常擷取堆棧資訊符号表還原伺服器上傳

伺服器上傳

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

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