ios崩潰日誌收集 iOS崩潰日誌收集與解析

2021-10-12 14:08:57 字數 3055 閱讀 5506

收集crash日誌方式

1.裝置上直接檢視

路徑:設定 -> 隱私 -> 分析 -> 分析資料

2.xcode獲取裝置上資訊

路徑:xcode選單欄window -> devices and simulators -> 選中裝置 -> view device logs

3.xcode獲取發布版本崩潰資訊

路徑:xcode選單欄window -> organizer -> 選擇專案 -> tab選擇crashes

下圖中:

1為崩潰資訊列表;

2可選擇發布版本;

3為具體崩潰堆疊資訊;

4可選擇源**,跟蹤具體崩潰位置。

image.png

4.**捕捉崩潰資訊

1.第三方平台:bugly、友盟;

2.**捕獲crash,監聽nssetuncaughtexceptionhandler和signal事件,可借助第三方工具kscrash、plcrashreporter等。

**捕獲crash

crash的型別

crash的捕獲的方式

mach 異常捕獲。基於mach核心程式設計,需要對核心有一定了解.

unix 訊號捕獲。對於mach 異常,作業系統會將其轉換為對應的 unix訊號,可以通過註冊signalhandler的方式來做訊號異常。

signal(sigabrt, signalexceptionhandler)

n***ception 捕獲。應用層,通過 nsuncaughtexceptionhandler 捕獲,因為堆疊中不會有出錯**,所以需要獲取n***ception物件中的reason,name,callstacksymbols。然後把細節寫入crash日誌,上傳到後台做資料分析.

nssetuncaughtexceptionhandler(uncaughtexceptionhandler)

debug模式下,signal監聽無效問題

在debug模式下,如果你觸發了signal崩潰,那麼應用會直接崩潰到主函式,斷點都沒用,此時沒有任何log資訊顯示出來,如果你想看log資訊的話,你需要在會crash的那行**上打斷點,然後在console中輸入pro hand -p true -s false sigabrt命令(sigabrt只是示例,應輸對應的訊號錯誤),然後下一步,不然你啥也看不到。

image.png

image.png

衝突當專案中存在多個crash收集框架時往往會存在衝突。

因為不管是對於 signal 捕獲還是 n***ception 捕獲都會存在 handler 覆蓋的問題,應該先判斷handler是否存在,如果存在剛 儲存handler,處理完自己的 handler 後,再把這個 handler 丟擲去,供前面的註冊者處理,詳情見demo。

堆疊收集

無論unix 訊號捕獲,還是n***ception 捕獲,都只能獲取到當前執行緒的堆疊,如果想獲取所有執行緒的堆疊,可以考慮用這個框架:

堆疊符號解析

無論是採用何種方式收集到的崩潰資訊,都會面臨同乙個問題,堆疊大概率是沒有被符號化過的,對於開發者來說,是根本看不懂的,那就無從談起問題的定位了。這個時候就需要進行堆疊符號化了。

堆疊符號化還原有三種常見的方法:

1.symbolicatecrash

2.mac 下的 atos 工具

3.通過 dsym 檔案提取位址和符號的對應關係,進行符號還原

獲取dsym檔案:xcode選單欄window -> organizer -> 選擇專案 -> tab選擇crashes -> achieve包 -> show in finder -> 右鍵顯示包內容 -> 開啟dsyms資料夾

// 未符號化前

thread 0 crashed:

0 libobjc.a.dylib 0x000000018b816f30 0x18b7fc000 + 110384 (objc_msgsend + 16)

1 uikit 0x0000000192e0a79c 0x192c05000 + 2119580 ( + 72)

2 uikit 0x0000000192c4db48 0x192c05000 + 297800 ( + 312)

3 uikit 0x0000000192c4d988 0x192c05000 + 297352 ( + 160)

4 quartzcore 0x00000001900d6404 0x18ffc5000 + 1119236 ( + 260)

// 符號化後

thread 0 crashed:

0 libobjc.a.dylib 0x000000018b816f30 objc_msgsend + 16

1 uikit 0x0000000192e0a79c -[uisearchdisplaycontroller _senddelegatedidbegindidendsearch] + 72

2 uikit 0x0000000192c4db48 -[uiviewanimationstate senddelegateanimationdidstop:finished:] + 312

3 uikit 0x0000000192c4d988 -[uiviewanimationstate animationdidstop:finished:] + 160

4 quartzcore 0x00000001900d6404 ca::layer::run_animation_callbacks(void*) + 260

注:xcode的organizer內建了symbolicatecrash,所以我們才可以直接看到符號化的崩潰堆疊日誌。

資料:實戰ios崩潰堆疊的符號化解析

crash防護

crash型別

1.unrecognized selector crash

2.kvo crash

3.nsnotification crash

4.nstimer crash

5.container crash(陣列越界,插nil等)

6.nsstring crash (字串操作的crash)

7.ui not on main thread crash (非主線程刷ui(機制待改善))

防護

IOS崩潰日誌

1.普通崩潰日誌 參考 1 程序資訊 incident identifier 30e46451 53fd 4965 896a 457fc11ad05f 崩潰報告的唯一識別符號 是與裝置標識相對應的唯一鍵值。雖然它不是真正的裝置識別符號,但也是乙個非常有用的情報 如果你看到100個崩潰日誌的crash...

iOS應用崩潰(三) 崩潰日誌

當我們在模擬器上除錯時,可能經常遇到下面的記憶體訪問錯誤 該錯誤是對乙個已經釋放的物件進行操作,定位如下 2 終端輸入 info malloc history 命令,即可得到堆疊資訊,從而分析具體問題所在 gdb info malloc history 0x12e4b0 3 也可輸入如下資訊 gdb...

iOS程式崩潰日誌

void uncaughtexceptionhandler n ception exception 當然你還要在以下方法中新增呼叫 nssetuncaughtexceptionhandler uncaughtexceptionhandler 錯誤日誌收集 下面時陣列越界時返回的錯誤日誌 arr 0 ...