如何看懂iOS的Crash報告

本文分析了一份標準的iOS應用程序的Crash報告,它通常由以下6個部分組成。

1. 報告頭(Header)

報告頭包含了應用程序以其運行環境的一些基本信息,下面是報告頭的一個例子。

復制代碼

Incident Identifier: E6EBC860-0222-4B82-BF7A-2B1C26BE1E85

CrashReporter Key: 6196484647b3431a9bc2833c19422539549f3dbe

Hardware Model: iPhone6,1

Process: TheElements [4637]

Path: /private/var/mobile/Containers/Bundle/Application/5A9E4FC2-D03B-4E19-9A91-104A0D0C1D44/TheElements.app/TheElements

Identifier: com.example.apple-samplecode.TheElements

Version: 1.12

Code Type: ARM (Native)

Parent Process: launchd [1]

Date/Time: 2015-04-06 09:14:08.775 -0700

Launch Time: 2015-04-06 09:14:08.597 -0700

OS Version: iOS 8.1.3 (12B466)

Report Version: 105

2. 異常代碼(Exception Codes)

異常代碼可能包含異常類型(Exception Type)、異常子類型(Exception Subtype)、處理器的詳細異常代碼(processor-specific Exception Codes)和其它能提供更多Crash信息的字段,最后一個字段列出了觸發Crash的線程索引。下面是異常代碼的示例。

復制代碼

Exception Type: EXC_CRASH (SIGABRT)

Exception Codes: 0x0000000000000000, 0x0000000000000000

Triggered by Thread: 0

常見的異常類型有以下幾種。

a. Bad Memory Access [EXC_BAD_ACCESS // SIGSEGV // SIGBUS]

此類型的Excpetion是最常見的Crash,通常由訪問了無效的內存導致。

SIGSEGV:訪問了無效地址,沒有物理內存對應該地址,通常由于重復釋放對象導致。

SIGBUS:總線錯誤,與 SIGSEGV 不同的是,SIGBUS 訪問的是有效地址,但總線訪問異常,通常是訪問了未對齊的數據。

SEGV:代表無效內存地址,比如空指針、未初始化指針、棧溢出等。

b. Abnormal Exit [EXC_CRASH // SIGABRT]

進程異常退出,造成Crash通常是因為未捕獲到Objective-C/C++的異常。

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

c. 其它異常類型

有些異常類型沒有被命名,以16進制數字表示。

0xbaaaaaad:意味著該Crash log并非一個真正的Crash,它僅僅只是包含了整個系統某一時刻的運行狀態,由用戶同時按Home鍵和音量鍵觸發。

0xbad22222:當VoIP程序在后臺太過頻繁的激活時,系統可能會終止此類程序。

0x8badf00d:程序啟動或者恢復時間過長被watch dog終止。

0xc00010ff:程序執行大量耗費CPU和GPU的運算,導致設備過熱,觸發系統過熱保護被系統終止。

0xdead10cc:程序退到后臺時還占用系統資源(如通訊錄)被系統終止。

0xdeadfa11:程序無響應用戶強制退出。當用戶長按電源鍵,直到屏幕出現關機確認畫面后再長按Home鍵,將強制退出應用。我們可以合理認為用戶這么做的原因是應用程序沒有響應。

3. 應用詳情(Application Specific Information)

有些Crash出現時,會產生額外的信息,這些信息能幫助用戶更好地了解應用程序終止時的運行環境。示例如下。

復制代碼

Application Specific Information:

MyApp[134] was suspended with locked system files:

/private/var/mobile/Library/AddressBook/AddressBook.sqlitedb

4. 回溯(Backtrace)

這部分列出了發生Crash時線程的調用棧。示例如下。

復制代碼

Thread 0 name: Dispatch queue: com.apple.main-thread

Thread 0 Crashed:

0? TheElements? ? ? ? ? ? ? 0x0000000100063fdc -[AtomicElementViewController myTransitionDidStop:finished:context:] (AtomicElementViewController.m:201)

1? UIKit? ? ? ? ? ? ? ? ? ? 0x000000018ca5c2ec -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 184

2? UIKit? ? ? ? ? ? ? ? ? ? 0x000000018ca5c1f4 -[UIViewAnimationState animationDidStop:finished:] + 100

3? QuartzCore? ? ? ? ? ? ? ? 0x000000018c380f60 CA::Layer::run_animation_callbacks(void*) + 292

4? libdispatch.dylib? ? ? ? 0x0000000198fb9368 _dispatch_client_callout + 12

5? libdispatch.dylib? ? ? ? 0x0000000198fbd97c _dispatch_main_queue_callback_4CF + 928

6? CoreFoundation? ? ? ? ? ? 0x000000018822dfa0 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8

7? CoreFoundation? ? ? ? ? ? 0x000000018822c048 __CFRunLoopRun + 1488

8? CoreFoundation? ? ? ? ? ? 0x00000001881590a0 CFRunLoopRunSpecific + 392

9? GraphicsServices? ? ? ? ? 0x00000001912fb5a0 GSEventRunModal + 164

10? UIKit? ? ? ? ? ? ? ? ? ? 0x000000018ca8aaa0 UIApplicationMain + 1484

11? TheElements? ? ? ? ? ? ? 0x000000010005d800 main (main.m:55)

12? libdyld.dylib? ? ? ? ? ? 0x0000000198fe2a04 start + 0

Thread 1 name: Dispatch queue: com.apple.libdispatch-manager

Thread 1:

0? libsystem_kernel.dylib? ? 0x00000001990e0c94 kevent64 + 8

1? libdispatch.dylib? ? ? ? 0x0000000198fc897c _dispatch_mgr_invoke + 272

2? libdispatch.dylib? ? ? ? 0x0000000198fbb3b0 _dispatch_mgr_thread + 48

...

5. 線程狀態(Thread State)

這部分列出了發生Crash的線程的狀態,即寄存器和寄存器的值。示例如下。

復制代碼

Thread 0 crashed with ARM Thread State (64-bit):

x0: 0x0000000000000000? x1: 0x0000000000000000? x2: 0x0000000000000000? x3: 0x00000001995f8020

x4: 0x0000000000000000? x5: 0x0000000000000001? x6: 0x0000000000000000? x7: 0x0000000000000000

x8: 0x0000000000000000? x9: 0x0000000000000015? x10: 0x0000000199601df0? x11: 0x0000000b0000000f

x12: 0x00000001741e8700? x13: 0x000001a5995f5779? x14: 0x0000000000000000? x15: 0x0000000044000000

x16: 0x00000001989724d8? x17: 0x0000000188176370? x18: 0x0000000000000000? x19: 0x00000001701dda60

x20: 0x0000000000000001? x21: 0x0000000136606e20? x22: 0x00000001000f6238? x23: 0x0000000000000000

x24: 0x000000019cc640a8? x25: 0x0000000000000020? x26: 0x0000000000000000? x27: 0x0000000000000000

x28: 0x000000019cc577c0? fp: 0x000000016fd1a8d0? lr: 0x00000001000effcc

sp: 0x000000016fd1a860? pc: 0x00000001000effdc cpsr: 0x60000000

6. 二進制映像(Binary Images)

這部分列出了當Crash發生時被裝載進進程內存空間的依賴庫或者模塊。示例如下。

復制代碼

Binary Images:

0x100058000 - 0x10006bfff TheElements arm64 <77b672e2b9f53b0f95adbc4f68cb80d6> /var/mobile/Containers/Bundle/Application/CB86658C-F349-4C7A-B73B-CE3B4502D5A4/TheElements.app/TheElements

參考資料

a. 《Understanding and Analyzing iOS Application Crash Reports 》,iOS Crash分析官方文檔

b. 《iOS Crash文件的解析(一)》,一篇中文博客

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容