什么是符號(hào)表?
符號(hào)表是內(nèi)存地址與函數(shù)名、文件名、行號(hào)的映射表。符號(hào)表元素如下所示:
<起始地址> <結(jié)束地址> <函數(shù)> [<文件名:行號(hào)>]
為什么要配置符號(hào)表?
為了能快速并準(zhǔn)確地定位用戶APP發(fā)生Crash的代碼位置,Bugly使用符號(hào)表對(duì)APP發(fā)生Crash的程序堆棧進(jìn)行解析和還原。
舉一個(gè)例子:
自動(dòng)配置:XCode + sh腳本
自動(dòng)配置請(qǐng)首先下載和解壓自動(dòng)配置符號(hào)表工具包,然后選擇上傳方式并配置Xcode的編譯執(zhí)行腳本。
上傳方式
使用腳本自動(dòng)配置支持兩種上傳方式:
方式一:直接上傳dSYM文件(默認(rèn)方式 )
方式二:提取dSYM文件的符號(hào)表文件并上傳
其中,使用方式二需要額外操作以下幾步:
下載符號(hào)表提取工具依賴的Java運(yùn)行環(huán)境(JRE或JDK版本需要>=1.6)
把工具包buglySymbolIOS.jar保存在用戶主目錄(Home)的bin目錄下(沒有bin文件夾,請(qǐng)自行創(chuàng)建):
配置Xcode編譯執(zhí)行腳本
在Xcode工程對(duì)應(yīng)Target的Build Phases中新增Run Scrpit Phase
打開工具包中的dSYM_upload.sh,復(fù)制所有內(nèi)容,在新增的Run Scrpit Phase中粘貼修改新增的Run Scrpit中的為您的App ID,為您的App Key,為App的Bundle Id
腳本默認(rèn)在Debug模式及模擬器編譯情況下不會(huì)上傳符號(hào)表,在需要上傳的時(shí)候,請(qǐng)修改下列選項(xiàng)
Debug模式編譯是否上傳,1=上傳 0=不上傳,默認(rèn)不上傳
UPLOAD_DEBUG_SYMBOLS=0
模擬器編譯是否上傳,1=上傳 0=不上傳,默認(rèn)不上傳
UPLOAD_SIMULATOR_SYMBOLS=0
至此,自動(dòng)上傳符號(hào)表腳本配置完畢,Bugly 會(huì)在每次 Xcode 工程編譯后自動(dòng)完成符號(hào)表配置工作。
手動(dòng)配置
手動(dòng)配置的流程如下:
下載最新版Bugly iOS符號(hào)表工具,其中工具包中包括:
符號(hào)表工具JAR包(buglySymboliOS.jar)
Windows的腳本(buglySymboliOS.bat)
Shell腳本(buglySymboliOS.sh)
默認(rèn)符號(hào)表配置文件(settings.txt)
符號(hào)表工具iOS版-使用指南
根據(jù)Crash的UUID定位dSYM文件
使用工具生成符號(hào)表文件(zip文件)
在頁面上傳符號(hào)表文件
其他說明
Bugly iOS符號(hào)表工具2.3.0及以上版本增加了上傳功能,2.5.0及以上版本支持dSYM文件的上傳;
定位dSYM文件的方法和工具的使用方法請(qǐng)參考:“符號(hào)表工具iOS版-使用指南”。
符號(hào)表上傳接口
Bugly提供了上傳符號(hào)表的HTTP和HTTPS(請(qǐng)使用POST方式上傳)接口。
HTTP接口
iOS符號(hào)表接口:http://bugly.qq.com/upload/dsym
參數(shù)說明
上傳接口的參數(shù)說明如下:
屬性 說明
pid 平臺(tái)ID,固定為2
app App ID
key App Key
bid 包名(Package)
ver 版本號(hào)(Version Name)
n 符號(hào)表文件名)
其中包名、版本號(hào)和符號(hào)表文件名需要做URL Encode。
Content‐Type:
上傳.zip 文件:application/zip
例子:使用Curl上傳
使用Curl工具來上傳的例子如下:
curl -L --header "Content-Type: application/zip" --data-binary @symbol.zip
'http://bugly.qq.com/upload/dsym?pid=2&app=xxxxxx&key=xxxxxx&bid=com.demo.test&ver=1.0.1&n=symbol.zip' --verbose
HTTPS接口
HTTPS接口:https://api.bugly.qq.com/openapi/file/upload/symbol
HTTPS接口支持上傳dSYM文件(需要壓縮成Zip文件)和符號(hào)表文件(Symbol)。
參數(shù)說明
上傳接口的參數(shù)說明如下:
屬性 說明
api_version API版本,固定為1
app_id App ID
app_key App Key
symbolType 符號(hào)表類型,iOS為2
bundleId 包名(Package)
productVersion 版本號(hào)(Version Name)
fileName 符號(hào)表文件名
file 符號(hào)表文件
其中包名、版本號(hào)和符號(hào)表文件名需要做URL Encode。
例子:使用Curl上傳
使用Curl工具來上傳的例子如下:
上傳dSYM文件
curl -k "https://api.bugly.qq.com/openapi/file/upload/symbol?app_key=xxxxxx&app_id=xxxxxx" --form "api_version=1" --form "app_id=xxxxxx" --form "app_key=xxxxxx" --form "symbolType=1"? --form "bundleId=com.demo.test" --form "productVersion=1.0" --form "channel=xxx" --form "fileName=app.dSYM.zip" --form "file=@app.dSYM.zip" --verbose
上傳符號(hào)表文件(Symbol文件)
curl -k "https://api.bugly.qq.com/openapi/file/upload/symbol?app_key=xxxxxx&app_id=xxxxxx" --form "api_version=1" --form "app_id=xxxxxx" --form "app_key=xxxxxx" --form "symbolType=2"? --form "bundleId=com.demo.test" --form "productVersion=1.0" --form "fileName=symbol.zip" --form "file=@symbol.zip" --verbose
dSYM文件
什么是dSYM文件?
iOS平臺(tái)中,dSYM文件是指具有調(diào)試信息的目標(biāo)文件,文件名通常為:xxx.app.dSYM。如下圖所示:
為了方便找回Crash對(duì)應(yīng)的dSYM文件和還原堆棧,建議每次構(gòu)建或者發(fā)布APP版本的時(shí)候,備份好dSYM文件。
如何定位dSYM文件?
一般情況下,項(xiàng)目編譯完dSYM文件跟app文件在同一個(gè)目錄下,下面以XCode作為IDE詳細(xì)說明定位dSYM文件。
-> 進(jìn)入XCode;
-> 打開工程(已編譯過);
-> 在左欄找到“Product”項(xiàng);
-> 鼠標(biāo)右鍵點(diǎn)擊編譯生成的“xxx.app”;
-> 點(diǎn)擊“Show in Finder”;
如下圖所示:
如果有多個(gè)dSYM文件,可以在使用工具時(shí)指定輸入為dSYM文件所在的目錄或者工程目錄。
XCode編譯后沒有生成dSYM文件?
XCode Release編譯默認(rèn)會(huì)生成dSYM文件,而Debug編譯默認(rèn)不會(huì)生成,對(duì)應(yīng)的Xcode配置如下:
XCode -> Build Settings -> Code Generation -> Generate Debug Symbols -> Yes
XCode -> Build Settings -> Build Option -> Debug Information Format -> DWARF with dSYM File
開啟Bitcode之后需要注意哪些問題?
在點(diǎn)“Upload to App Store”上傳到App Store服務(wù)器的時(shí)候需要聲明符號(hào)文件(dSYM文件)的生成:
在配置符號(hào)表文件之前,需要從App Store中把該版本對(duì)應(yīng)的dSYM文件下載回本地(參考“如何找回已發(fā)布到App Store的App對(duì)應(yīng)的dSYM文件?”),然后用符號(hào)表工具生成和上傳符號(hào)表文件。
不需要配置自動(dòng)生成符號(hào)表的腳本了,也不要用本地生成的dSYM文件來生成符號(hào)表文件,因?yàn)楸镜鼐幾g生成的dSYM文件的符號(hào)表信息都被隱藏了。如果用本地編譯生成的dSYM文件生成符號(hào)表文件并配置到Bugly平臺(tái)之后,還原出來的結(jié)果將是類似于“__hiden#XXX”這樣的符號(hào)。
如何判斷dSYM文件是否與Crash的UUID匹配?
Bugly還原Crash堆棧時(shí),需要根據(jù)UUID來匹配符號(hào)表文件,因此只有上傳的符號(hào)表文件的UUID與Crash對(duì)應(yīng)APP的UUID一致時(shí),才能準(zhǔn)確地對(duì)堆棧進(jìn)行還原。
查看符號(hào)表文件的UUID(“如何查看dSYM文件的UUID?”)
查看Crash對(duì)應(yīng)的APP的UUID
Bugly v1.0頁面
崩潰 ---> Crash issue ---> dSYM UUID
Bugly v2.0頁面
崩潰分析 ---> Crash issue ---> 符號(hào)表 ---> UUID
如何查看dSYM文件的UUID?通過命令查看UUIDxcrun dwarfdump --uuid通過符號(hào)表文件查看UUID
符號(hào)表文件的UUID與dSYM文件的UUID是一致的,因此可以通過符號(hào)表工具生成的符號(hào)表文件來查看dSYM文件的UUID:
生成符號(hào)表文件(.zip) ---> 解壓符號(hào)表文件(.symbol) ---> 使用文本編輯器打開符號(hào)表文件
其中符號(hào)表文件的“UUID”信息即Debug SO文件的UUID,亦是符號(hào)表文件的UUID,如果文件較大,建議使用“Sublime Text”等文本編輯器來打開符號(hào)表文件。
如何找回已發(fā)布到App Store的App對(duì)應(yīng)的dSYM文件?
通過Xcode找回
打開 Xcode 頂部菜單欄 -> Window -> Organizer 窗口:
打開 Xcode 頂部菜單欄,選擇 Archive 標(biāo)簽:
找到發(fā)布的歸檔包,右鍵點(diǎn)擊對(duì)應(yīng)歸檔包,選擇Show in Finder操作:
右鍵選擇定位到的歸檔文件,選擇顯示包內(nèi)容操作:
選擇dSYMs目錄,目錄內(nèi)即為下載到的 dSYM 文件:
通過iTunes Connect找回
登錄iTunes Connect;
進(jìn)入“我的App(My Apps)”的“活動(dòng)(Activity)”頁面:
在“所有構(gòu)件版本(All Builds)”中選擇某一個(gè)版本,點(diǎn)“下載dSYM(Download dSYM)”下載dSYM文件:
通過mdfind工具找回在Bugly的issue頁面查詢到crash對(duì)應(yīng)的UUID:然后在Mac的Shell中,用mdfind命令定位dSYM文件:mdfind "com_apple_xcode_dsym_uuids =="
注意,使用mdfind時(shí),UUID需要格式轉(zhuǎn)換(增加“-”): 12345678-1234-1234-1234-xxxxxxxxxxxx
例如,要定位的dSYM的UUID為:E30FC309DF7B3C9F8AC57F0F6047D65F 則定位dSYM文件的命令如下:
mdfind "com_apple_xcode_dsym_uuids == E30FC309-DF7B-3C9F-8AC5-7F0F6047D65F"
|12345678-1234-1234-1234-xxxxxxxxxxxx|
建議每次構(gòu)建或者發(fā)布APP版本的時(shí)候,備份App對(duì)應(yīng)的dSYM文件!
文章來源:https://bugly.qq.com/docs/user-guide/symbol-configuration-ios/?v=1492997248592#top