iOS錯誤堆棧查找崩潰原因的方法

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

liebiao.png
liebiao.png

我解讀一下這份崩潰日志:

進程信息

*** -[__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è)備型號

shebei.png
shebei.png

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

其他設(shè)備信息

qita.png
qita.png

錯誤堆棧

從錯誤堆棧中,你可以看到閃退發(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ù)的清單。我們收集到的信息有三種情況:

  1. 已標記錯誤位置的:
3   FIR        0x000000010bfddd8c -[FIRViewController viewDidLoad] + 8588
  1. 未標記錯誤位置,有基地址的情況:
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 行。

  1. 未標記錯誤位置,無基地址的情況:
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)用方法的地址
  1. dysm 文件路徑:可以在 Xcode Organizer 的 Archives 標簽欄下找到所有已歸檔的應(yīng)用文件。它保存了編譯過程的詳細信息,其中包括符號信息。
  2. 模塊 load 地址:模塊加載的基地址,可以在日志的動態(tài)庫信息中找到對應(yīng)模塊的基地址。這里為 0xd3000
  3. cpu 指令集種類:可以為 armv6 armv7 armv7s arm64。具體用哪個,可以參考對應(yīng)模塊的動態(tài)庫信息中確定。

詳情 http://blog.fir.im/2014/ios_crash/

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

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

  • 轉(zhuǎn)自http://www.raywenderlich.com/zh-hans/30818/ios應(yīng)用崩潰日志揭秘 ...
    RunSnails閱讀 4,633評論 2 22
  • 當你寫一個應(yīng)用程序,你將不可避免地犯錯誤。 更糟糕的是,您的應(yīng)用程序設(shè)計中會時不時地出現(xiàn)錯誤。 Xcode 的調(diào)試...
    titvax閱讀 779評論 0 0
  • 前言 iOS分析定位崩潰問題有很多種方式,但是發(fā)布到AppStore的應(yīng)用如果崩潰了,我們該怎么辦呢?通常我們都會...
    xh_0129閱讀 471評論 2 2
  • crash捕獲介紹 如果對crash捕獲不太了解,可以先參考這篇文章,本文進行Mach異常+Unix信號方式捕獲c...
    xiaoyi6409閱讀 10,651評論 14 14
  • 演出陣容:鄭嘉穎、謝天華、呂良偉、譚耀文、黎耀祥、鄭丹瑞、閻奕格、胡琳 “金鱗豈是池中物,一遇風(fēng)云便化龍” 一句預(yù)...
    孤鹿Grouplus閱讀 706評論 0 0

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