作者:崔志偉
BugHD 是 FIR.im 為開發(fā)者提供的查找崩潰的工具,一些同學(xué)使用后,對于根據(jù)錯誤堆棧查找問題的方法還有一些疑問音同,現(xiàn)在我用一個FIR.imiOS客戶端在BugHD上搜集到的崩潰做例子欠动,帶大家了解一下BugHD:

我解讀一下這份崩潰日志:
進程信息
*** -[__NSArrayI objectAtIndex:]: index 20 beyond bounds [0 .. 0]
是閃退進程的相關(guān)信息贸营。
- 崩潰版本: BugHD 會記錄崩潰產(chǎn)生的具體的 version 和 build 號骇吭,需要了解更多關(guān)于版本號管理的同學(xué)橙弱,可以看一下淺談 iOS 版本號。
- 崩潰總數(shù): 記錄這個原因?qū)е碌谋罎⒖倲?shù)绵跷。
- 發(fā)生設(shè)備: 記錄遇到這一問題的設(shè)備數(shù)量膘螟。
設(shè)備型號

標識設(shè)備類型成福。 如果很多崩潰日志都是來自相同的設(shè)備類型碾局,說明應(yīng)用只在某特定類型的設(shè)備上有問題。從上圖可以看出奴艾,發(fā)生崩潰的設(shè)備為 iPhone4S净当,iOS 操作系統(tǒng)為 7.1.2。
其他設(shè)備信息

錯誤堆棧
從錯誤堆棧中,你可以看到閃退發(fā)生時拋出的異常類型像啼,也可以看到異常編碼和拋出異常的線程俘闯。
<pre><code>
0 CoreFoundation 0x2d6eaf9b <redacted> + 154
1 libobjc.A.dylib 0x37f65ccf objc_exception_throw + 38
2 CoreFoundation 0x2d621a39 <redacted> + 176
<b>3 FIR 0x000f0e97 FIR + 69271</b>
4 UIKit 0x2ff0c4ab <redacted> + 518
5 UIKit 0x2ff0c269 <redacted> + 24
6 UIKit 0x3009836b <redacted> + 634
7 UIKit 0x2ffb5d63 <redacted> + 418
8 UIKit 0x2ffb5b6d <redacted> + 44
9 UIKit 0x2ffb5b05 <redacted> + 184
10 UIKit 0x2ff07d59 <redacted> + 380
11 QuartzCore 0x2fb8562b <redacted> + 142
12 QuartzCore 0x2fb80e3b <redacted> + 350
13 QuartzCore 0x2fb80ccd <redacted> + 16
14 QuartzCore 0x2fb806df <redacted> + 230
15 QuartzCore 0x2fb804ef <redacted> + 314
16 QuartzCore 0x2fb7a21d <redacted> + 56
17 CoreFoundation 0x2d6b6255 <redacted> + 20
18 CoreFoundation 0x2d6b3bf9 <redacted> + 284
19 CoreFoundation 0x2d6b3f3b <redacted> + 730
20 CoreFoundation 0x2d61eebf CFRunLoopRunSpecific + 522
21 CoreFoundation 0x2d61eca3 CFRunLoopRunInMode + 106
22 GraphicsServices 0x32578663 GSEventRunModal + 138
23 UIKit 0x2ff6b14d UIApplicationMain + 1136
24 FIR 0x000e9743 FIR + 38723
25 libdyld.dylib 0x38472ab7 <redacted> + 2
</code></pre>
以上的錯誤堆棧信息是閃退發(fā)生時所有活動幀清,它包含閃退發(fā)生時調(diào)用函數(shù)的清單忽冻。我們收集到的信息有三種情況:
- 已標記錯誤位置的:
3 FIR 0x000000010bfddd8c -[FIRViewController viewDidLoad] + 8588
- 未標記錯誤位置真朗,有基地址的情況:
3 FIR 0x000e3e92 0xd3000 + 69266
這條調(diào)用棧包括下面四部分:
- 模塊號: 這里是3
- 二進制庫名: 這里是 FIR.im
- 調(diào)用方法的地址: 這里是 0x000e3e92
- 第四部分分為兩列,基地址和偏移地址僧诚。此處基地址為 0xd3000遮婶,偏移地址為 69266。
使用下面的命令符號化:
atos -arch armv7 -o FIR -l 0xd3000 0x000e3e92
結(jié)果:
-[FIRViewController viewDidLoad] (FIRViewController.m:156)
可以看到崩潰的類為 FIRViewController湖笨,函數(shù)為 viewDidLoad旗扑,文件名是 FIRViewController.m,行數(shù)是 156 行慈省。
- 未標記錯誤位置臀防,無基地址的情況:
3 FIR 0x000f0e97 FIR + 69271
基地址的計算方法:
-load address = 0x000f0e97 - 69271 =0xe0000
使用下面的命令符號化:
atos -arch armv7 -o FIR -l 0xe0000 0x000f0e97
結(jié)果:
-[FIRViewController viewDidLoad] (FIRViewController.m:156)
可以看到崩潰的類為FIRViewController
,函數(shù)為viewDidLoad
边败,文件名是FIRViewController.m
袱衷,行數(shù)是156行。
這里我們簡單我們看一下 atos 用法:
atos -o dysm文件路徑 -l 模塊load地址 -arch cpu 指令集種類 調(diào)用方法的地址
- dysm 文件路徑:可以在 Xcode Organizer 的 Archives 標簽欄下找到所有已歸檔的應(yīng)用文件放闺。它保存了編譯過程的詳細信息祟昭,其中包括符號信息。
- 模塊 load 地址:模塊加載的基地址怖侦,可以在日志的動態(tài)庫信息中找到對應(yīng)模塊的基地址篡悟。這里為 0xd3000
- cpu 指令集種類:可以為 armv6 armv7 armv7s arm64。具體用哪個匾寝,可以參考對應(yīng)模塊的動態(tài)庫信息中確定搬葬。