iOS app 崩潰日誌符號化及代碼定位

一、什麼是符號表?xcode

符號表就是指在Xcode項目編譯後,在編譯生成的二進制文件.app的同級目錄下生成的同名的.dSYM文件。.dSYM文件實際上是一個目錄,在子目錄中包含了一個16進制的保存函數地址映射信息的中轉文件,全部Debugsymbols都在這個文件中(包括文件名、函數名、行號等),因此也稱之爲調試符號信息文件。架構

通常地,Xcode項目每次編譯後,都會生成一個新的.dSYM文件。所以,App的每個發佈版本,都須要備份一個對應的.dSYM文件,以便後續調試定位問題。app

注意:
項目每一次編譯後,.app.dSYM成對出現,而且兩者有相同的UUID值,以標識是同一次編譯的產物。
UUID值可使用dwarfdump —uuid來檢查:iphone

 $ dwarfdump --uuid XX.app.dSYM函數

 $ dwarfdump --uuid XX.app/XXui

二、符號表的做用:若是App發佈上線,開發者不可能進行調試,只能經過分析系統記錄的崩潰日誌來定位問題,在這份崩潰日誌文件中,會指出App出錯的函數內存地址,而這些函數地址是能夠在.dSYM文件中找到具體的文件名、函數名和行號信息的,這正是符號表的重要做用所在。調試

三、如何生成符號表:日誌

一、使用xcodebuild編譯打包code

Xcode中編譯項目後,會在工程目錄下的build/ConfigurationName-iphoneos目錄下生成.app.app.dSYM文件。ip

若是使用xcodebuild命令進行編譯打包,則能夠指定編譯結果的存儲路徑,一樣會有.app.app.dSYM生成。

通常地,咱們推薦打包發佈時,使用xcodebuild編譯打包,方便.app.app.dSYM的匹配存儲,避免.app.dSYM文件丟失的狀況。

二、使用Xcode的Archive導出

若是開發者使用XcodeArchive導出功能打包,能夠切換到OrganizerProjects視圖,查看對應項目的Derived Data路徑,在其中能夠找到當前導出過程產生的.app.app.dSYM文件。

4:如何使用終端進行.dSYM分析

$ xcrun atos -o(.dSYM 文件路徑) -arch (崩潰架構) -l loadAddress
  address ...

說明:

loadAddress 表示函數的動態加載地址,對應崩潰地址堆棧中 + 號前面的地址,即0x000ef000

address 表示運行時地址、對應崩潰地址堆棧中第一個地址,即0x0010143b

實際上,崩潰地址堆棧中+號先後的地址相加便是運行時地址,即0x000ef000 + 74808 = 0x0010143b

例如:

xcrun atos -o /Users/user/Desktop/JDMobile\ 15-5-28\ 下午6.38.xcarchive/dSYMs/JDMobile.app.dSYM/Contents/Resources/DWARF/JDMobile -arch arm64 -l 0x1000e4000 0x000000010020e118 

相關文章
相關標籤/搜索