iOS Crash 分析(文三)- 符號化崩潰日誌
iOS Crash 分析(文三)- 符號化崩潰日誌
未符號化的崩潰日誌就象一本天書,看不懂,更別談分析崩潰原因了。所以我們在分析日誌之前,要把日誌翻譯成我們可以看得懂的文字。這一步我們稱之為符號化。
在iOS Crash分析(文一)中已經提到過符號化的兩種方式:
1.利用Xcode符號化2.利用symbolicatecrash指令碼符號化
其實這兩種分析方式都使用了同一個工具符號化:***atos***。
atos是蘋果提供的符號化工具,在Mac OS系統下預設安裝。
使用***atos***符號化需要dsym檔案。dsym檔案是在編譯工程的時候產生的,可以在Xcode Organizer的Archives標籤欄下找到所有已歸檔的應用檔案。它儲存了編譯過程的詳細資料,其中包括符號資訊。
注意: 你必需同時保留應用二進位檔案和.dSYM檔案才能將崩潰日誌完整符號化。每次提交到iTunes Connect的構建都必需歸檔。.dSYM檔案和二進位檔案是特定綁定於每一次構建和後續構建的,即使來自相同的原始碼檔案,每一次構建也與其他構建不同,不能相互替換。如果你使用Build 和 Archive 命令,這些檔案會自動放在適當位置。 如果不是使用Build 和 Archive命令,放在Spotlight能夠搜尋到的位置(比如Home目錄)即可。
下面我們用***atos***對一條Crash進行符號化
還是看下面的例子:
### 1.進程資訊 ###Incident Identifier: E4201F10-6F5F-40F9-B938-BB3DA8ED7D50CrashReporter Key: TODOHardware Model: iPhone4,1Process: Taobao4iPhone [3538]Path: /var/mobile/Applications/E3B51E77-D44D-4B3E-8767-B7DC2008D138/Taobao4iPhone.app/Taobao4iPhoneIdentifier: com.taobao.taobao4iphoneVersion: 4.8.1Code Type: ARMParent Process: launchd [1]### 2.基本資料 ###Date/Time: 2014-09-16 21:39:30 +0000OS Version: iPhone OS 7.1.2 (11D257)Report Version: 104### 3.異常資訊 ###Exception Type: SIGSEGVException Codes: SEGV_ACCERR at 0xa2400db3Crashed Thread: 0### 4.線程回溯 ###Thread 0 name: Dispatch queue: com.apple.main-thread### 5.Crash呼叫堆疊 ###Thread 0 Crashed:0 libobjc.A.dylib 0x3838760c 0x38375000 + 752761 Taobao4iPhone 0x012c03e1 0x66000 + 192440012 Taobao4iPhone 0x012c054f 0x66000 + 192443673 Foundation 0x2e4de163 0x2e419000 + 8072674 CoreFoundation 0x2dac9167 0x2da2a000 + 6516235 CoreFoundation 0x2dac8d7f 0x2da2a000 + 6506236 CoreFoundation 0x2dac711b 0x2da2a000 + 6433557 CoreFoundation 0x2da31ebf 0x2da2a000 + 324478 CoreFoundation 0x2da31ca3 0x2da2a000 + 319079 GraphicsServices 0x3298b663 0x32982000 + 3849910 UIKit 0x3037e14d 0x30310000 + 45089311 Taobao4iPhone 0x0006b349 0x66000 + 2132112 Taobao4iPhone 0x0006a5e8 0x66000 + 17896Thread 1:0 libsystem_kernel.dylib 0x38928808 0x38928000 + 20561 libdispatch.dylib 0x38869e03 0x3885f000 + 44547### 5.動態庫資訊 ###Binary Images: 0x66000 - 0x19cdfff +Taobao4iPhone armv7 <43ebe409980f31fd9be165a64b002af5> /var/mobile/Applications/E3B51E77-D44D-4B3E-8767-B7DC2008D138/Taobao4iPhone.app/Taobao4iPhone 0x9fa9000 - 0x9fb4fff QuickSpeak armv7 /System/Library/AccessibilityBundles/QuickSpeak.bundle/QuickSpeak0x2c667000 - 0x2c669fff AXSpeechImplementation armv7 /System/Library/AccessibilityBundles/AXSpeechImplementation.bundle/AXSpeechImplementation
我從中選出一條調用進行符號化:
1 Taobao4iPhone 0x012c03e1 0x66000 + 19244001
使用下面的命令符號化:
atos -arch armv7 -o "Taobao4iPhone.app.dSYM" -l 0x66000 0x012c03e1
結果:
1 Taobao4iPhone 0x012c03e1 -[TBSNSPagesContainerView subviewLayoutPage:] (in Taobao4iPhone) (TBSNSPagesContainer.m:227)
可以看到崩潰的類為TBSNSPagesContainerView,函數為subviewLayoutPage,檔案名稱是TBSNSPagesContainer.m,行數是227行。
我們返回來看一下atos用法:
atos -o dysm檔案路徑 -l 模組load地址 -arch cpu指令集種類 調用方法的地址
dysm檔案路徑:可以在Xcode Organizer的Archives標籤欄下找到所有已歸檔的應用檔案。它儲存了編譯過程的詳細資料,其中包括符號資訊。
模組load地址:模組載入的基地址,可以在日誌的***動態庫資訊***中找到對應模組的基地址。這裡為0x66000
cpu指令集種類:可以為armv6 armv7 armv7s arm64。具體用哪個,可以參考對應模組的***動態庫資訊***中確定。如
0x66000 - 0x19cdfff +Taobao4iPhone armv7 <43ebe409980f31fd9be165a64b002af5> /var/mobile/Applications/E3B51E77-D44D-4B3E-8767-B7DC2008D138/Taobao4iPhone.app/Taobao4iPhone
那麼Taobao4iPhone模組的cpu指令集為armv7
調用方法的地址:這裡是0x012c03e1,在iOS Crash分析(文二)中做過解釋