iOS開發-dSYM文件

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.0iPhone與運行iOS 13.1.2iPhone的符號不一樣。如果您的應用程序運行在支持多種CPU架構(如arm64arm64e)的操作系統版本上,那麼具有arm64架構的設備將只包含操作系統框架的arm64版本的符號,它不會有arm64e設備上的操作系統框架的符號

Bitcode相關

Bitcode是位於代碼機械碼之間的已編譯代碼的中間形式。

代碼->Bitcode->機械碼

這就意味着使用Bitcode設置的包,會在上傳後,由App Store進行編譯,是無法在打包編譯時就獲取到.dSYM,你可以在上傳後,在Archive的界面進行下載。見 官方文檔

在這裏插入圖片描述

定位你的dSYM

有時候你想知道對應某個崩潰日誌的.dSYM文件是否存在在你的Mac上,你可以這樣定位。

  1. 首先崩潰日誌信息

在這裏插入圖片描述

這裏如圖,你可以查看崩潰堆棧的倒數第二行對應的App名稱,通過命令查看其UUID

//這裏test.crash爲崩潰日誌名
//TouchCanvas爲app名
grep --after-context=1000 "Binary Images:" test.crash | grep TouchCanvas
//然後輸出爲 - 這裏其實就是文本過濾下
0x1022c0000 - 0x1022effff TouchCanvas arm64  <9cc89c5e55163f4ab40c5821e99f05c6>

對應Binary imageUUID,通過格式轉換爲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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章