前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Xcode编译疾如风-3.浅谈 dwarf 和 dSYM

Xcode编译疾如风-3.浅谈 dwarf 和 dSYM

作者头像
ChildhoodAndy
发布2021-05-11 15:15:31
4K0
发布2021-05-11 15:15:31
举报
文章被收录于专栏:小菜与老鸟

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 调试信息:

代码语言:javascript
复制
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 FormatDWARF,那么最终的 App Mach-O 文件中则会包含 dwarf 信息。如果我们在 Release 模式下打包且选择了Debug Information FormatDWARF 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/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小菜与老鸟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Xcode编译疾如风-3.浅谈 dwarf 和 dSYM
  • 认识 dwarf 和 dSym
  • dwarf 与 dSYM 的生成
  • Generate Debug Symbols
  • 最后
  • 更多阅读
    • 参考资料
    相关产品与服务
    Elasticsearch Service
    腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档