iOS開發(fā)時經常需要接觸符號表的概念累贤,本文主要分享符號表相關知識,包括什么是符號表矗晃,符號表的作用仑嗅,符號表的產生過程,如何查找符號表文件张症,如何查找符號表文件的uuid仓技。
iOS符號表(dSYM)知識總結
什么是符號表 以及 為什么需要使用符號表
iOS構建時產生的符號表,它是內存地址與函數名俗他,文件名脖捻,行號的映射表。 符號表元素如下所示:
類似于android構建release包時的mapping文件兆衅,我們利用mapping文件可以將混淆后的APP運行時的現成堆棧信息還原成混淆前的堆棧信息(利用retrace 工具)地沮。所以當應用crash時,我們可以利用crash時的堆棧信息得到對應到源代碼的堆棧信息羡亩,還能看到出錯的代碼在多少行摩疑,所以能快速定位出錯的代碼位置,以便快速解決問題畏铆。
而iOS應用crash時也有堆棧雷袋,release版的應用,crash時的堆棧信息辞居,全是二進制的地址信息楷怒。
android至少還能看到函數名字,雖然是混淆的瓦灶,還能看到系統(tǒng)函數的名字鸠删,所以相對來說還好一點)
如果利用這些二進制的地址信息來定位問題是不可能的,因此我們需要將這些二進制的地址信息還原成源代碼種的函數以及行號贼陶,這時候就需要符號表了刃泡。 舉個例子:
而debug版本的應用巧娱,crash時的堆棧信息有時能看到函數名字,但是也看不到對應的源代碼文件的行號捅僵,這樣也沒法定位問題家卖。 debug版本崩潰時的堆棧如下所示:
因此如果我們將產品提供給項目成員體驗時,不管是debug版本還是release版本都需要符號表來幫我們將crash的堆棧信息還原成源代碼文件對應的信息庙楚,以便快速定位問題
如果使用bugly來做crash上報管理上荡,只需要將構建時的符號表上傳到bugly,當應用crash時,bugly會將crash信息上報到bugly馒闷,然后會自動替我們將原始的crash的二進制堆棧信息還原成包含行號的源代碼文件信息酪捡,我們就可以快速定位問題
符號表如何產生
看一下ios項目的歸檔構建流程:
準備構建環(huán)境,構建目錄
編譯主工程依賴的Pods工程的靜態(tài)庫或者Framework (=== BUILD TARGET Aspects OF PROJECT Pods WITH CONFIGURATION Debug ===)
編譯主工程的源代碼文件 (CompileC)
鏈接生成主工程對應的可執(zhí)行文件 (Ld)
拷貝圖片纳账,localized字符串等資源文件 (CpResource)
編譯storyboard文件 (CompileStoryboard)
CompileAssetCatalog
處理pinfo.list文件 (ProcessInfoPlistFile)
生成符號表文件(GenerateDSYMFile)
鏈接StoryBoard(LinkStoryboards)
執(zhí)行配置的腳本文件(PhaseScriptExecution)
打包生成app文件逛薇,不是ipa文件(ProcessProductPackaging)
簽名 (CodeSign)
校驗 (Validate)
像Bugly要求我們在工程配置的Build Phases里添加它的腳本,用于將生成的符號表上傳到bugly疏虫。根據歸檔構建流程永罚,我們知道生成符號表的步驟是在處理pinfo.plst文件之后,所以我們配置的bugly的執(zhí)行腳本必須放在鏈接這個步驟之后卧秘,否則會導致找不到符號表文件呢袱。另外最初生成的符號表并不是在我們看到的歸檔文件內部,而是放在構建的一個臨時目錄中翅敌,最后才拷貝到歸檔目錄下的羞福,最初生成的符號表文件的存放目錄類似于如下:
其實第1步~第11步就是我們?yōu)橹鞴こ讨鱐arget配置的構建步驟,如下所示:
注意:
debug配置默認不會生成符號表
如果想生成符號表蚯涮,可參看:XCode編譯后沒有生成dSYM文件治专?
每次構建時都會產生不同的符號表,這個和android的mapping文件很不一樣遭顶,每個符號表都有一個唯一的uuid张峰,和每次構建對應
通過歸檔構建流程得到的是xarchive歸檔文件,如果要生成ipa文件還必須通過歸檔文件導出ipa文件 命令行歸檔的命令如下
命令行導出ipa文件的命令如下所示:
如何定位dSYM文件
dSYM文件其實是一個帶后綴的文件夾形式的文件棒旗,內容如下所示:
真實的符號表文件其實是1個二進制文件喘批,bugly提供了腳本將這個二進制文件轉為文本形式的文件,文件的內容其實就是二進制地址對和源代碼文件嗦哆,行號以及函數名字的對應關系
如何查看dSYM文件的uuid
iOS App崩潰時會有此次構建的uuid信息谤祖,如果要將崩潰堆棧還原成對應的源代碼文件信息婿滓,需要根據這個uuid找到對應的符號表的uuid老速,這樣才能正確還原
總結下來有2種方式:
通過命令查看
通過bugly腳本導出符號表文件查看uuid
如何找回已發(fā)布到App Store的App對應的dSYM文件?
參看如何找回已發(fā)布到App Store的App對應的dSYM文件
參考資料
備注
后續(xù)再總結開發(fā)時崩潰的堆棧如何還原凸主,理論上來說應該有兩個步驟:
監(jiān)聽ios app崩潰橘券, 并打印崩潰堆棧信息至文件里
將崩潰堆棧信息還原成源文件對應的信息
原文鏈接:www.cloudchou.com