最近給bug搞得焦頭爛額的,也看了不少Crash Report,這里就簡(jiǎn)單的介紹下怎么讀Crash Report,下面以一個(gè)Crash Report為例慨飘, 一步一步解讀:
app 信息:
Incident Identifier: 119A5EDA-7C12-43BB-A1F8-D81BXXXXXXXX
CrashReporter Key: d7117df4fcbf4a0ca5f374cc70436e46XXXXXXXX
Hardware Model: iPhone7,2
Process: 應(yīng)用名 [2468]
Path: /private/var/containers/Bundle/Application/9B528EB4-2D07-433F-ACAA-27A0DD1BD576/應(yīng)用名.app/應(yīng)用名
Identifier: com.xxx.xxx
Version: 1.810.2 (1.810)
Code Type: ARM-64 (Native)
Parent Process: launchd [1]
基本信息
Date/Time: 2016-09-20 11:53:02.02 +0800
Launch Time: 2016-09-20 11:51:48.48 +0800
OS Version: iOS 9.3.5 (13G36)
Report Version: 105
異常信息(非常重要)
Exception Type: EXC_CRASH (SIGABRT) (異常類(lèi)型)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 0 (發(fā)生異常的線(xiàn)程號(hào))
back trace (非常非常重要)
Last Exception Backtrace:
0 CoreFoundation 0x18403adb0 __exceptionPreprocess + 124
1 libobjc.A.dylib 0x18369ff80 objc_exception_throw + 56
2 CoreFoundation 0x183f1e708 -[__NSArrayM insertObject:atIndex:] + 808
3 應(yīng)用名 0x1016ae5f4 -[EventContent getEventToUsernameList] + 340
4 應(yīng)用名 0x1002e38ec -[ThreadViewModel checkAndGenerateThreadModelDispalyInfo] (ThreadViewModel.m:95)
5 應(yīng)用名 0x100b70754 -[TableViewCell bindWithViewModel:] (TableViewCell.m:115)
6 應(yīng)用名 0x100d59ae8 -[ViewController tableView:cellForRowAtIndexPath:] (ViewController.m:361)
7 UIKit 0x1894f3030 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 692
8 UIKit 0x1894f3198 -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 80
9 UIKit 0x1894e2298 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2360
10 UIKit 0x1894f7c64 -[UITableView _performWithCachedTraitCollection:] + 104
······省略部分無(wú)關(guān)重要的內(nèi)容·······
21 CoreFoundation 0x183fee8fc __CFRunLoopRun + 928
22 CoreFoundation 0x183f18c50 CFRunLoopRunSpecific + 384
23 GraphicsServices 0x185800088 GSEventRunModal + 180
24 UIKit 0x189206088 UIApplicationMain + 204
25 應(yīng)用名 0x1000c8d14 main (main.m:63)
26 libdyld.dylib 0x183ab68b8 start + 4
發(fā)生Crash時(shí)的線(xiàn)程的Crash調(diào)用棧,從start開(kāi)始洞渔,從下向上調(diào)用套媚,可以看出 API 的調(diào)用順序,最上面的一個(gè)表示拋出異常的位置磁椒。上面中報(bào)的異常是-[__NSArrayM insertObject:atIndex:] + 808,這種情況一般都是兩種可能玫芦,第一是傳了nil浆熔,第二就是數(shù)組越界。你可以看到出現(xiàn)異常的是[EventContent getEventToUsernameList]桥帆,說(shuō)明是EventContent類(lèi)里面的getEventToUsernameList出現(xiàn)了異常医增,然后可以根據(jù)下面的內(nèi)容找出這個(gè)方法調(diào)用的位置,看到這里老虫,基本上就能定位到crash的位置和原因了叶骨。
thread back trace
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x0000000183bd411c __pthread_kill + 8
1 libsystem_pthread.dylib 0x0000000183ca0ef8 pthread_kill + 112
2 libsystem_c.dylib 0x0000000183b45dc8 abort + 140
3 libc++abi.dylib 0x00000001836793f4 __cxa_bad_cast + 0
4 libc++abi.dylib 0x0000000183692f60 std::__terminate(void (*)()) + 44
5 libc++abi.dylib 0x0000000183692b10 __cxa_rethrow + 144
6 libobjc.A.dylib 0x00000001836a0120 objc_exception_rethrow + 44
7 CoreFoundation 0x0000000183f18cf8 CFRunLoopRunSpecific + 552
8 GraphicsServices 0x0000000185800088 GSEventRunModal + 180
9 UIKit 0x0000000189206088 UIApplicationMain + 204
10 應(yīng)用名 0x00000001000c8d14 main (main.m:63)
11 libdyld.dylib 0x0000000183ab68b8 start + 4
Thread 1 name: Dispatch queue: com.apple.libdispatch-manager
Thread 1:
0 libsystem_kernel.dylib 0x0000000183bd54d8 kevent_qos + 8
1 libdispatch.dylib 0x0000000183a987d8 _dispatch_mgr_invoke + 232
2 libdispatch.dylib 0x0000000183a87648 _dispatch_source_invoke + 0
Thread 2 name: WebThread
Thread 2:
0 libsystem_kernel.dylib 0x0000000183bb8fd8 mach_msg_trap + 8
1 libsystem_kernel.dylib 0x0000000183bb8e54 mach_msg + 72
2 CoreFoundation 0x0000000183ff0c60 __CFRunLoopServiceMachPort + 196
3 CoreFoundation 0x0000000183fee964 __CFRunLoopRun + 1032
4 CoreFoundation 0x0000000183f18c50 CFRunLoopRunSpecific + 384
5 WebCore 0x0000000187f0a108 RunWebThread(void*) + 456
6 libsystem_pthread.dylib 0x0000000183c9fb28 _pthread_body + 156
7 libsystem_pthread.dylib 0x0000000183c9fa8c _pthread_body + 0
8 libsystem_pthread.dylib 0x0000000183c9d028 thread_start + 4
這里省略~~~~~~
Crash時(shí)線(xiàn)程的狀態(tài)
Thread 0 crashed with ARM Thread State (64-bit):
x0: 0x0000000000000000 x1: 0x0000000000000000 x2: 0x0000000000000000 x3: 0x000000014094c361
x4: 0x0000000183696ba2 x5: 0x000000016fd7b9a0 x6: 0x000000000000006e x7: 0x0000000000000019
x8: 0x0000000008000000 x9: 0x0000000004000000 x10: 0x0000000000000001 x11: 0x0000000048088000
x12: 0x0000000008088000 x13: 0x0000000008088000 x14: 0x00000000ffffffff x15: 0x00000000fffffffb
x16: 0x0000000000000148 x17: 0x0000000000000000 x18: 0x0000000000000000 x19: 0x0000000000000006
x20: 0x00000001a2114000 x21: 0x000000016fd7b9a0 x22: 0x000000013ed112b0 x23: 0x00000001a2120150
x24: 0x0000000000000001 x25: 0x7a00e65462337053 x26: 0x000000013ed0bbf0 x27: 0x0000000000000000
x28: 0x0000000000000001 fp: 0x000000016fd7b900 lr: 0x0000000183ca0ef8
sp: 0x000000016fd7b8e0 pc: 0x0000000183bd411c cpsr: 0x00000000
通常根據(jù) Last Exception Backtrace 就可以獲得到相關(guān)信息,這部分一般不用關(guān)心祈匙。
Crash時(shí)刻App加載的所有的庫(kù)
Binary Images:
0x100084000 - 0x101a63fff 應(yīng)用名 arm64 <7d34c3f838e53c24b17b63a6f6bb3aff> /var/containers/Bundle/Application/9B528EB4-2D07-433F-ACAA-27A0DD1BD576/應(yīng)用名.app/應(yīng)用名
0x120000000 - 0x12002ffff dyld arm64 <a1862e29910f3f069a363730df77dad7> /usr/lib/dyld
0x183620000 - 0x183621fff libSystem.B.dylib arm64 <5bb501a091dc3a22a5544d34a4312de1> /usr/lib/libSystem.B.dylib
0x183624000 - 0x183676fff libc++.1.dylib arm64 <9ec0d9dcf728349582c26a7da72f0364> /usr/lib/libc++.1.dylib
0x183678000 - 0x183697fff libc++abi.dylib arm64 <aaa40b7f52513cf79c6f814b133556a7> /usr/lib/libc++abi.dylib
0x183698000 - 0x183a04fff libobjc.A.dylib arm64
...略...
第一行是可執(zhí)行文件的信息忽刽,指令集為 arm64天揖,<7d34c3f838e53c24b17b63a6f6bb3aff> 為可執(zhí)行文件的包的 uuid。下面的內(nèi)容就是 crash 時(shí)加載的所有庫(kù)跪帝。
寫(xiě)在最后
其實(shí)我心感覺(jué)挺愧疚的今膊,在iOS SDK 開(kāi)發(fā) -- 入微一星里說(shuō)會(huì)在一兩天內(nèi)更新下一篇文章,結(jié)果拖到現(xiàn)在還沒(méi)有寫(xiě)完伞剑,這個(gè)也是沒(méi)有辦法斑唬,前面也說(shuō)了,給bug搞死了黎泣,每次發(fā)新版恕刘,新功能基本沒(méi)有什么bug出現(xiàn),測(cè)試到的都不知道是那個(gè)朝代遺留下來(lái)的bug~~~~新SDK開(kāi)發(fā)的文章已經(jīng)寫(xiě)了一半抒倚,盡量快更新上來(lái)褐着,有興趣的可以關(guān)注下。