文章目錄
dSYM
根據 蘋果官方文檔,當編譯器將源代碼
轉爲機械碼
時,會生成調試符號(debug symbols)
,通過這些符號可以將機械碼
映射回到源代碼
的位置,也就是我們常說的符號化解析
。
這些調試符號存儲在二進制文件
中,或者存儲在相應的調試符號(dSYM)文件
中。默認情況下,應用程序的調試
構建將調試符號存儲在編譯後的二進制文件中,而應用程序的發佈(Archive)
構建將調試符號存儲在相應的dSYM文件
中,以減少二進制文件的大小。
通過Archive
生成的包裏面,都會有一個.dSYM
文件
xcode的符號化解析
xcode可以幫我們進行符號化解析
點擊Xcode頂部工具欄->Windows->Devices and Simulators->選中設備->View Device Logs
就可以查看設備中崩潰信息,你也可以拖拽未符號化的.crash
文件到左側欄,xcode
會自動幫你符號化解析.
值得注意的是,文件必須是.crash
後綴纔行,你可以將.txt
等類型文件進行重命名後拖入
由於可執行文件區分各個架構,例如arm64,armv7s,i386
,那麼每個架構也有對應的.dSYM
。
每個架構的符號
符號
是特定於操作系統版本
和設備的CPU架構
的
例如,同一個包,運行iOS 13.1.0
的iPhone
與運行iOS 13.1.2
的iPhone
的符號不一樣。如果您的應用程序運行在支持多種CPU架構(如arm64
和arm64e
)的操作系統版本上,那麼具有arm64
架構的設備將只包含操作系統框架的arm64
版本的符號,它不會有arm64e
設備上的操作系統框架的符號
Bitcode相關
Bitcode
是位於代碼
和機械碼
之間的已編譯代碼的中間形式。
代碼->Bitcode->機械碼
這就意味着使用Bitcode
設置的包,會在上傳後,由App Store
進行編譯,是無法在打包編譯時就獲取到.dSYM
,你可以在上傳後,在Archive
的界面進行下載。見 官方文檔
定位你的dSYM
有時候你想知道對應某個崩潰日誌的.dSYM
文件是否存在在你的Mac
上,你可以這樣定位。
- 首先崩潰日誌信息
這裏如圖,你可以查看崩潰堆棧的倒數第二行對應的App名稱,通過命令查看其UUID
//這裏test.crash爲崩潰日誌名
//TouchCanvas爲app名
grep --after-context=1000 "Binary Images:" test.crash | grep TouchCanvas
//然後輸出爲 - 這裏其實就是文本過濾下
0x1022c0000 - 0x1022effff TouchCanvas arm64 <9cc89c5e55163f4ab40c5821e99f05c6>
對應Binary image
的UUID
,通過格式轉換爲32個大寫字符
,8-4-4-4-12 (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)
,然後通過命令進行查看
mdfind "com_apple_xcode_dsym_uuids == 9CC89C5E-5516-3F4A-B40C-5821E99F05C6"
如果沒有找到,是不會有任何輸出的。如果應用使用Bitcode
,就應該從App store
下載.dSYM
。
如果沒有找到對應的.dSYM
,那麼就無法解析,避免以後無法分析日誌,就應該重新打包上傳。
找到.dSYM
後,還要進行構建的UUID
對比
Build UUID對比
//PathToDSYMFile .dSYM路徑
//BinaryName 二進制文件名,如上述的TouchCanvas
dwarfdump --uuid <PathToDSYMFile>/Contents/Resources/DWARF/<BinaryName>
//PathToBinary 二進制文件路徑
dwarfdump --uuid <PathToBinary>
恢復隱藏的符號表文件
對於Bitcode
打包的app,上傳後下載的.dSYM
中會用_hidden#109_
等表示替換原有的符號,需要進行轉換。
如果是通過xcode
下載(Archive界面的Download Debug Symbols
按鈕下載的)的.dSYM
是自動做了這個操作。
如果是通過網頁App Store
上下載的,就需要手動進行恢復
dsymutil -symbol-map <PathToXcodeArchive>/MyGreatApp.xcarchive/BCSymbolMaps <PathToDownloadedDSYMs>/<UUID>.dSYM
符號化解析操作命令
對於特殊的調試情況,例如LLDB
命令行的崩潰日誌信息,可以通過atos命令
將崩潰報告符號化
atos -arch <BinaryArchitecture> -o <PathToDSYMFile>/Contents/Resources/DWARF/<BinaryName> -l <LoadAddress> <AddressesToSymbolicate>
//BinaryArchitecture 爲架構信息 arm64 ...
//PathToDSYMFile .dSYM文件路徑
//BinaryName 二進制文件名
//LoadAddress 需要解析的地址
//AddressesToSymbolicate 符號表中的地址
例如下面:
atos -arch arm64 -o TouchCanvas.app.dSYM/Contents/Resources/DWARF/TouchCanvas -l 0x1022c0000 0x00000001022df754
//解析得到
ViewController.touchesEstimatedPropertiesUpdated(_:) (in TouchCanvas) + 304
命令行工具 symbolicatecrash 符號化
symbolicatecrash
工具可以將Crash
文件全部符號化,相比 atos
每條解析來說更方便快捷
# 找到 symbolicatecrash 工具並拷貝出來
find /Applications/Xcode.app -name symbolicatecrash -type f
# 會返回幾個路徑,拷貝其中一個
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
# 引入環境變量
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
# 符號解析
./symbolicatecrash appName.crash .dSYM文件路徑 > appName.log
./symbolicatecrash appName.crash appName.app > appName.log
# 將符號化的 crash log 保存在 appName.log 中
./symbolicatecrash appName.crash appName.app > appName.log