Generate Debug Symbols編譯設(shè)置

Xcode工程中有個編譯設(shè)置Generate Debug Symbols,翻譯為'生成調(diào)試符號', 默認設(shè)置是為YES的??吹竭@個設(shè)置我們可能會思考??:如果設(shè)置release環(huán)境下為NO,不生成調(diào)試符號的話,包體積會不會更小呢?畢竟我們發(fā)布到App Store上的版本是不需要調(diào)試的。帶著這樣的出發(fā)點,于是去了解了一番。

一、官方文檔說明

Boolean value. Specifies whether the binary includes debug symbols.
YES: Binary includes debugging symbols.
NO: Binary does not include debugging symbols.
官文

二、自己的實踐總結(jié)

1. 在設(shè)置里面找到Generate Debug Symbols, 改為NO.

首先,在項目的target下打斷點后,運行 ==》程序遇到斷點不會停。

然后,這個情況下在項目的pod庫子工程打斷點會不會停呢?
因為項目中使用Pod進行庫管理,并且Podfile中寫了generate_multiple_pod_projects: true, 所以Pod庫會生成一個子工程。在Pod庫中打斷點,運行 ==> 程序遇到斷點會停住,底部調(diào)試臺左邊的變量也會顯示,但是po命令打印時會有兩種情況:

// 1.如果pod庫是靜態(tài)庫,那么這個時候po打印會報錯
(lldb) po self
error: Couldn't realize type of self.
// 2.如果pod庫是動態(tài)庫,那么這個時候po打印是正常的
(lldb) po self
  ? name : Optional<String>
    - some : "碧波花園"

最后,我們現(xiàn)在把子工程中的Generate Debug Symbols, 改為NO,斷點也是不會停住的?。?!

2. 對比主工程中設(shè)置為YES和NO的區(qū)別

對于上述的結(jié)果,我們首先想到的是動態(tài)庫在生成打包生成ipa時是會獨立生成可執(zhí)行文件的,而靜態(tài)庫是直接打包進主工程二進制文件中的。

所以接下來,我們在release模式下運行一次,對比Generate Debug Symbols設(shè)置為YES和NO的區(qū)別:

2.1 編譯到運行的時間=》設(shè)置為YES時更長

本人的demo工程編譯到運行的對比:
YES時:42s左右
NO時 :38s左右

2.2 設(shè)置為YES相比NO,產(chǎn)物多了dSYM文件

兩種設(shè)置下分別打開Product(這個需要 xcode中導入了pod庫才會生成,并且換設(shè)置時別忘了clean一下),對比發(fā)現(xiàn), 設(shè)置為YES會多出dSYM文件:

設(shè)置為YES會多出dSYM.png

2.3 編譯的過程不同

調(diào)試符號是在編譯時生成的。在Xcode中查看構(gòu)建過程,可以發(fā)現(xiàn),當Generate Debug Symbols選項設(shè)置為YES時,每個源文件在編譯成.o文件時,編譯參數(shù)多了-g和-gmodules兩項。但鏈接等其他的過程沒有變化。

Clang文檔對-g的描述是:

Generate complete debug info.

三、了解了這些后在項目中有什么作用?

項目中我們一般是默認要生成調(diào)試符號的,即Generate Debug Symbols = YES。因為我我們需要dSYM才能定位Crash,其次是對于APP來說ipa的體積并沒有減?。?/p>

對于項目中集成了Bugly的同行們應該對于dSYM不陌生.

  1. dSYM 是保存 16 進制函數(shù)地址映射信息的中轉(zhuǎn)文件,存儲應用程序的調(diào)試 symbols, 在XCode項目編譯設(shè)置Generate Debug Symbols = YES;然后Debug Infomation Format = DWARF with dSYM File后會生成,一般我們debug下設(shè)置DWARF,release下設(shè)置DWARF with dSYM File.
  1. DSYM文件->顯示包內(nèi)容->...,我們可以找到里面是有DWARF的文件.
  1. DWARF是一種類似抽象語法樹的調(diào)試格式文件,里面包含了符號表、調(diào)試信息等,可以通過MachOView打開來查看。在Debug時,我們有l(wèi)ldb調(diào)試器與DWARF配合,所以不需要dSYM;在Release時,需要生成dSYM,因為DWARF內(nèi)容是包含在dSYM文件中的,以便于后續(xù)Crash信息符號還原。
  1. 我們上傳到Bugly的符號表文件實際上是對dSYM文件提取輕量符號表生成的文件

具體可以參看文章:
iOS dSYM詳解和分析crash,ips文件
dwarf格式
DWARF文件初探——提取輕量符號表

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容