一、什麼是符號表?xcode
符號表就是指在Xcode項目編譯後,在編譯生成的二進制文件.app的同級目錄下生成的同名的.dSYM文件。.dSYM文件實際上是一個目錄,在子目錄中包含了一個16進制的保存函數地址映射信息的中轉文件,全部Debug的symbols都在這個文件中(包括文件名、函數名、行號等),因此也稱之爲調試符號信息文件。架構
通常地,Xcode項目每次編譯後,都會生成一個新的.dSYM文件。所以,App的每個發佈版本,都須要備份一個對應的.dSYM文件,以便後續調試定位問題。app
注意:
項目每一次編譯後,.app和.dSYM成對出現,而且兩者有相同的UUID值,以標識是同一次編譯的產物。
UUID值可使用dwarfdump —uuid來檢查:iphone
$ dwarfdump --uuid XX.app.dSYM
函數
$ dwarfdump --uuid XX.app/XX
ui
二、符號表的做用:若是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導出
若是開發者使用Xcode的Archive導出功能打包,能夠切換到Organizer的Projects視圖,查看對應項目的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