如何看懂iOS的Crash報(bào)告

本文分析了一份標(biāo)準(zhǔn)的iOS應(yīng)用程序的Crash報(bào)告,它通常由以下6個(gè)部分組成。

1. 報(bào)告頭(Header)

報(bào)告頭包含了應(yīng)用程序以其運(yùn)行環(huán)境的一些基本信息,下面是報(bào)告頭的一個(gè)例子。

復(fù)制代碼

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)、處理器的詳細(xì)異常代碼(processor-specific Exception Codes)和其它能提供更多Crash信息的字段,最后一個(gè)字段列出了觸發(fā)Crash的線程索引。下面是異常代碼的示例。

復(fù)制代碼

Exception Type: EXC_CRASH (SIGABRT)

Exception Codes: 0x0000000000000000, 0x0000000000000000

Triggered by Thread: 0

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

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

此類型的Excpetion是最常見的Crash,通常由訪問了無效的內(nèi)存導(dǎo)致。

SIGSEGV:訪問了無效地址,沒有物理內(nèi)存對(duì)應(yīng)該地址,通常由于重復(fù)釋放對(duì)象導(dǎo)致。

SIGBUS:總線錯(cuò)誤,與 SIGSEGV 不同的是,SIGBUS 訪問的是有效地址,但總線訪問異常,通常是訪問了未對(duì)齊的數(shù)據(jù)。

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

b. Abnormal Exit [EXC_CRASH // SIGABRT]

進(jìn)程異常退出,造成Crash通常是因?yàn)槲床东@到Objective-C/C++的異常。

SIGABRT:收到Abort信號(hào)退出,通常Foundation庫中的容器為了保護(hù)狀態(tài)正常會(huì)做一些檢測,例如插入nil到數(shù)組中等會(huì)遇到此類錯(cuò)誤。

c. 其它異常類型

有些異常類型沒有被命名,以16進(jìn)制數(shù)字表示。

0xbaaaaaad:意味著該Crash log并非一個(gè)真正的Crash,它僅僅只是包含了整個(gè)系統(tǒng)某一時(shí)刻的運(yùn)行狀態(tài),由用戶同時(shí)按Home鍵和音量鍵觸發(fā)。

0xbad22222:當(dāng)VoIP程序在后臺(tái)太過頻繁的激活時(shí),系統(tǒng)可能會(huì)終止此類程序。

0x8badf00d:程序啟動(dòng)或者恢復(fù)時(shí)間過長被watch dog終止。

0xc00010ff:程序執(zhí)行大量耗費(fèi)CPU和GPU的運(yùn)算,導(dǎo)致設(shè)備過熱,觸發(fā)系統(tǒng)過熱保護(hù)被系統(tǒng)終止。

0xdead10cc:程序退到后臺(tái)時(shí)還占用系統(tǒng)資源(如通訊錄)被系統(tǒng)終止。

0xdeadfa11:程序無響應(yīng)用戶強(qiáng)制退出。當(dāng)用戶長按電源鍵,直到屏幕出現(xiàn)關(guān)機(jī)確認(rèn)畫面后再長按Home鍵,將強(qiáng)制退出應(yīng)用。我們可以合理認(rèn)為用戶這么做的原因是應(yīng)用程序沒有響應(yīng)。

3. 應(yīng)用詳情(Application Specific Information)

有些Crash出現(xiàn)時(shí),會(huì)產(chǎn)生額外的信息,這些信息能幫助用戶更好地了解應(yīng)用程序終止時(shí)的運(yùn)行環(huán)境。示例如下。

復(fù)制代碼

Application Specific Information:

MyApp[134] was suspended with locked system files:

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

4. 回溯(Backtrace)

這部分列出了發(fā)生Crash時(shí)線程的調(diào)用棧。示例如下。

復(fù)制代碼

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. 線程狀態(tài)(Thread State)

這部分列出了發(fā)生Crash的線程的狀態(tài),即寄存器和寄存器的值。示例如下。

復(fù)制代碼

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. 二進(jìn)制映像(Binary Images)

這部分列出了當(dāng)Crash發(fā)生時(shí)被裝載進(jìn)進(jìn)程內(nèi)存空間的依賴庫或者模塊。示例如下。

復(fù)制代碼

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文件的解析(一)》,一篇中文博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容