關於Hockey app 裏的Crash 分析

首先上一張Hockey裏的crash記錄

 

Incident Identifier:崩潰報告的唯一標識符,不同的Crash日誌該標示符也不同。

CrashReporter Key:設備標識相對應的唯一鍵值(並非真正的設備的UDID,蘋果爲了保護用戶隱私iOS6以後已經無法獲取)。通常同一個設備上同一版本的App發生Crash時,該值都是一樣的。

Hardware Model :代表發生Crash的設備類型。

Process:代表系統Crash的進程名稱,通常都是我們的App的名字, [ ]裏面是當時進程的ID。

Path:App的所在路徑。

Identifier:我們App的Indentifier,就是你app的bundle Indentifier。

AppVersion:當前App的版本號,由Info.plist中的兩個字段組成,CFBundleShortVersionString and CFBundleVersion。

Code Type:當前App的CPU架構。

Parent Process:當前進程的父進程,由於iOS中App通常都是單進程的,一般父進程都是launchd。

Date/Time:發生crash的時間

Launch Time:啓動App的時間

OS Version:iOS系統固件版本

Report Version:日誌版本

Exception Type: 這個信息非常重要,它就像是這個crash的名字。

Crashed Thread: 問題發生的thread

我一般都直接看最後的thread 然後找到對應的crash的thread

一般這個thread 後都會跟着crash。 然後從下往上是堆棧信息,這裏左邊數字後跟着你們項目的Target 說明是代碼裏的問題 如果是Foundation 或者 其他的,可以忽略。找到最後你們Target那一條目,然後後邊跟着的方法 以及類裏多少行,方便你去定位錯誤位置。

 

但是有些問題只看這裏,是解決不了的!

這時候就需要Exception Type 還有其他的地方來配合看了。

1. 首先有一些常見的Exception code,https://en.wikipedia.org/wiki/Hexspeak  請自行查看。

2. Exception Type

1)EXC_BAD_ACCESS

此類型的Excpetion是我們最長碰到的Crash,通常用於訪問了不改訪問的內存導致。一般EXC_BAD_ACCESS後面的"()"還會帶有補充信息。

SIGSEGV:通常由於重複釋放對象導致,這種類型在切換了ARC以後應該已經很少見到了。

SIGABRT:收到Abort信號退出,通常Foundation庫中的容器爲了保護狀態正常會做一些檢測,例如插入nil到數組中等會遇到此類錯誤。

SEGV:(Segmentation  Violation),代表無效內存地址,比如空指針,未初始化指針,棧溢出等;

SIGBUS:總線錯誤,與 SIGSEGV 不同的是,SIGSEGV 訪問的是無效地址,而 SIGBUS 訪問的是有效地址,但總線訪問異常(如地址對齊問題)

SIGILL:嘗試執行非法的指令,可能不被識別或者沒有權限

2)EXC_BAD_INSTRUCTION

此類異常通常由於線程執行非法指令導致。

1.在代碼中修改了storyboard與outlet的對應關係,但是storyboard沒有更新時發生過此crash。

2.與第三方庫中方法衝突時發生過此crash。

3.調用系統方法時傳入了不恰當的指針類型。

3)EXC_ARITHMETIC

代碼中做除法時分母爲零了會發生此問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章