Xcode编译疾如风-3.浅谈 dwarf 和 dSYM
小菜:本文是《Xcode编译疾如风-4.BuildSettings》的其中的Debug Information Format
配置项的背景知识前置科普文。
老鸟:《Xcode编译疾如风-4.BuildSettings》这篇文章在哪呢?
小菜:别急,别急,还在写。因为每一个设置项,我都会介绍其底层原理,部分还需要测试验证,所以写起来会花费不少时间。
老鸟:别跳票就行!
小菜:不会滴^^
认识 dwarf 和 dSym
dwarf 的全称是 Debugging with Attribute Record Formats,说人话,就是一种源码调试信息的记录格式,主要用于源码级调试,如 gdb、llvm 调试或者在 Xcode 进行断点调试。
dSym指的是 Debug Symbols。也就是调试符号,我们常常称为符号表文件。
符号对应着类、函数、变量等,这个符号表文件是内存与符号如函数名,文件名,行号等的映射,在崩溃日志分析方面起到了举足轻重的作用。无论是自己手动解析,脚本自动解析,还是使用三方平台比如 Bugly、听云、Fabric,都离不开这个文件。
dSYM 的文件构成:
代码语言:javascript复制MyDemo.app.dSYM
└── Contents
├── Info.plist
└── Resources
└── DWARF
└── MyDemo
我们使用dwarfdump
命令来查看DWARF
调试信息:
dwarfdump MyDemo.app.dSYM/Contents/Resources/DWARF/MyDemo
随便抽取一个映射看看:
简单解释下
代码语言:javascript复制DW_AT_low_pc表示函数的起始地址
DW_AT_high_pc表示函数的结束地址
DW_AT_frame_base表示函数的栈帧基址
DW_AT_object_pointer表示对象指针地址
DW_AT_name表示函数的名字
DW_AT_decl_file表示函数所在的文件
DW_AT_decl_line表示函数所在的文件中的行数
DW_AT_prototyped为一个 Bool 值, 为 true 时代表这是一个子程序/函数(subroutine)
DW_AT_type表示函数的返回值类型
DW_AT_artificial为一个Bool值,为true时代表这是一个由编译器生成而不是源程序显式声明
dwarf 与 dSYM 的生成
在汇编产生的目标文件中,包含着 dwarf 信息,如果我们在 Debug 模式下打包且选择了Debug Information Format
为DWARF
,那么最终的 App Mach-O 文件中则会包含 dwarf 信息。如果我们在 Release 模式下打包且选择了Debug Information Format
为DWARF with dSYM File
,那么则会通过 dsymutil 根据 mach-o 文件中的 dwarf 信息生成 dSYM 文件,然后通过 strip 命令去除掉 mach-o 中的调试符号化信息,以减少包体积以及不必要的源码隐私泄漏。
Generate Debug Symbols
这个项默认是开启的,如果设置为NO,那么调试符号根本不会产生,也就没有 dwarf 和 dSYM 什么事了,就连我们在 Xcode 打断点调试时,断点都不会中断。这点需要注意下。
无论 Debug 还是 Release,我们都建议是开启状态。开启时,源文件在编译的时候,编译参数会多一个-g
和-gmodules
选项,然后生成的目标文件中就会包含 dwarf 信息,所以目标文件会比没开启的时候稍微大点,最终 dwarf 会被包含在 mach-o 中或者生成的 dSym 中。
最后
- 主项目的多个Target,必要时都可以对 Debug/Release 模式下要不要生成 dSYM 做调整,以减少 Debug 模式下的编译耗时。
- 对于静态库,不会生成 dSYM 文件,即使设为DWARF with dSYM File。
更多阅读
- Building Your App to Include Debugging Information[1]
- Xcode工程中关于Debug Symbols的设置[2]
- DWARF Debugging Information Format[3]
- Xcode中和symbols有关的几个设置[4]
- Exploring the DWARF debug format information[5]
参考资料
[1]
Building Your App to Include Debugging Information: https://developer.apple.com/documentation/xcode/building-your-app-to-include-debugging-information
[2]
Xcode工程中关于Debug Symbols的设置: https://www.jianshu.com/p/0ffbcec6a76e
[3]
DWARF Debugging Information Format: http://dwarfstd.org/doc/dwarf-2.0.0.pdf
[4]
Xcode中和symbols有关的几个设置: https://www.jianshu.com/p/11710e7ab661
[5]
Exploring the DWARF debug format information: https://developer.ibm.com/technologies/systems/articles/au-dwarf-debug-format/