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文件:

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不陌生.
- 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.
- DSYM文件->顯示包內(nèi)容->...,我們可以找到里面是有
DWARF的文件.
DWARF是一種類似抽象語法樹的調(diào)試格式文件,里面包含了符號表、調(diào)試信息等,可以通過MachOView打開來查看。在Debug時,我們有l(wèi)ldb調(diào)試器與DWARF配合,所以不需要dSYM;在Release時,需要生成dSYM,因為DWARF內(nèi)容是包含在dSYM文件中的,以便于后續(xù)Crash信息符號還原。
- 我們上傳到Bugly的符號表文件實際上是對dSYM文件提取輕量符號表生成的文件
具體可以參看文章:
iOS dSYM詳解和分析crash,ips文件
dwarf格式
DWARF文件初探——提取輕量符號表