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

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

作者头像
ChildhoodAndy
发布于 2021-05-11 07:15:31
发布于 2021-05-11 07:15:31
4.6K00
代码可运行
举报
文章被收录于专栏:小菜与老鸟小菜与老鸟
运行总次数:0
代码可运行

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
代码运行次数:0
运行
AI代码解释
复制
MyDemo.app.dSYM
└── Contents
    ├── Info.plist
    └── Resources
        └── DWARF
            └── MyDemo 

我们使用dwarfdump 命令来查看DWARF 调试信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dwarfdump MyDemo.app.dSYM/Contents/Resources/DWARF/MyDemo

随便抽取一个映射看看:

简单解释下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Xcode中和symbols有关的几个设置
其实被这个问题困扰了好久,不过秉承着三分钟热度的新年新气象,还是要多弄懂一点(⊙_⊙)ゞ
且行且珍惜_iOS
2022/05/13
2.1K0
Xcode中和symbols有关的几个设置
Xcode 常见 CLI 工具
在咱们日常开发中,或多或少都会用到 Xcode 内置的一些CLI工具,但是大部分小伙伴可能只是会用到一些具体的命令,今天我们就一起来聊一聊 Xcode 内置的常见Command Lines Tool。
CoderStar
2022/09/23
3.8K0
iOS符号化浅析
十一去云南(丽江、大理、昆明)玩了一趟,怎么说呢,可能我想象中的云南是西双版纳、香格里拉那样子的,所以这次云南之行跟想象中还是有一定差异的。
CoderStar
2022/09/23
2.1K0
iOS符号化浅析
美团 iOS 工程 zsource 命令背后的那些事儿
今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC大鱼丨新浪微博丨新浪看点丨百度百家丨博客中国丨趣头条丨腾讯云·云+社区
数据猿
2019/08/15
9240
XCode日常使用备忘录
0. Introduction        XCode是macOS上开发app不可缺少的开发者工具,不管是开发macOS上的应用,还是iOS上的应用,都离不开XCode环境。尽管其易用性广受诟病,但由于苹果app开发的封闭性,众多开发者也不有苦不能言。近年来微软针对macOS平台发布了Visual Studio Code和Visual Studio for Mac这两款开发工具,但是其目的显然只是作为XCode的一种补充,要全盘替代XCode目前还不太现实。平时工作中由于负责开发维护Windows和Mac
24K纯开源
2018/01/18
1.9K0
XCode日常使用备忘录
iOS_crash文件的获取及符号化(解析)
稍等一会,就会输出路径,然后将路径复制,右键 Finder -> 前往文件夹 -> 粘贴 -> 回车,就能找到symbolicatecrash,将symbolicatecrash拷贝出来备用
mikimo
2023/10/18
2.6K1
编译与链接过程的思考
前言 最近遇到一个错误,如下 在解决过程中,回顾了很多知识,于是有了这篇文章。 关键词:预处理、编译、汇编、链接、动态链接库、静态链接库、真机调试。 正文 以.c文件的编译流程为例,如下图
落影
2018/04/27
1.3K1
编译与链接过程的思考
iOS逆向之Mach-O文件
阅读笔者的其他文章,我们了解了编译过程中的预处理、词法分析、语法分析、编译、链接等步骤。经常和编译型语言打交道的开发者对于可执行文件的编译过程肯定不陌生。我们用 Xcode 构建一个程序的过程中,会把源文件 (.m 和 .h) 文件转换为一个可执行文件。这个可执行文件中包含的字节码将会被 CPU (iOS 设备中的 ARM 处理器或 Mac 上的 Intel 处理器) 执行。
VV木公子
2021/03/07
11.2K0
iOS逆向之Mach-O文件
iOS 优化 - 瘦身
iOS 优化将是一个专题,其中会包括包体积优化(瘦身)、启动时间优化、UI 优化等等。那么这个专题的开篇就从瘦身开始吧。
CoderStar
2022/08/24
2.8K0
iOS 优化 - 瘦身
【IOS开发基础系列】Xcode工具使用技巧
Unable to open lib launch_sim.dylib Try reinstalling Xcode or the simulator runtime.
江中散人_Jun
2023/10/16
6120
【IOS开发基础系列】Xcode工具使用技巧
iOS崩溃堆栈符号化,定位问题分分钟搞定!
最近一段时间,在跟开发者沟通过程中,萝莉发觉有些开发者对iOS的应用符号表还不是很清楚,除了咨询关于符号表生成、配置的问题以外,对Bugly崩溃分析需要配置符号表也存在疑问。 在这里,萝莉就给大家分享下关于iOS符号表的一些内容。 首先,进行常识“脑补”。 1. 符号表是什么? 符号表就是指在Xcode项目编译后,在编译生成的二进制文件.app的同级目录下生成的同名的.dSYM文件。 .dSYM文件其实是一个目录,在子目录中包含了一个16进制的保存函数地址映射信息的中转文件,所有Debug的symbols都
腾讯Bugly
2018/03/22
5K0
正经分析iOS包大小优化
包大小优化是项目开发中不可避免会遇到的,网上关于包大小优化的文章很多,每篇文章说的都不尽相同,笔者曾经根据网上的文章做过包大小优化,但效果不尽人意;因此笔者想根据已有的文章、知识结合自己的理解、实践,做一份总结梳理,整理自己的包大小优化逻辑,不光要知道怎么做可以让包大小变化,还要知道为什么这么做能产生效果,所以就有了这篇文章。
莫空9081
2021/05/28
6.2K0
​iOS Class Guard github用法、工作原理和安装详解及使用经验总结
iOS Class Guard是一个用于OC类、协议、属性和方法名混淆的命令行工具。它是class-dump的扩展。这个工具会生成一个symbol table,这个table在编译期间会包含进工程中。iOS-Class-Guard能有效的隐藏绝大多数的类、协议、方法、属性和 实例变量 名。iOS-Class-Guard不是应用安全的最终解决方案,但是它绝对能让攻击者更难读懂你的程序。iOS-Class-Guard会加大代码分析和runtime检查的难度,这个工具可以认为是一个简单基础的混淆方法。由于OC的架构决定了iOS应用程序的剖析相当简单,check out一下链接就知晓了:
iOS Magician
2023/12/02
4300
​iOS Class Guard github用法、工作原理和安装详解及使用经验总结
(5)初识Mach-O
APP从开发到安装到手机的过程1 MJRefreshExample.app中的MJRefreshExample文件是iOS中的可执行文件,文件格式是Mach-O APP从开发到安装到手机的过程2 逆向
czjwarrior
2018/05/28
1.2K0
Xcode 单步调试 WebRTC
最近使用 WebRTC 开发一个实时直播项目,在调试的时候发现一个特别奇怪的现象,将编译好的 WebRTC 静态库文件加入到我们自己的工程里之后无法进行单步调试。每次调到 WebRtc 里都会变成汇编语言,如果如下:
音视频_李超
2020/04/02
2.9K0
GDB实现原理和使用范例
这篇文章为了让你深入了解gdb的工作原理,以及如何在linux环境下使用强大的gdb调试程序功能。
mariolu
2018/11/18
5.4K0
atos命令解析iOS/Mac 崩溃日志
这里简单介绍下怎么通过atos命令来解析iOS/Mac 崩溃日志,适合拿到一份未经符号化的crash日志需要开发人员手动符号化的场景
zqh
2024/01/23
1.9K0
减包-删除无用的代码
使用开源工具 LSUnusedResources 检查重复图片,但是可能会有误报,比如 [@”image%d”, index] 这种引用方式无法检查到,需要人工在核对一边。
Helloted
2022/06/08
1.5K0
减包-删除无用的代码
iOS编译原理
LLVM的编译过程相当复杂,iOS代码运行需要经过:预处理、编译、汇编、链接四个关键阶段,具体的流程如下图:
梧雨北辰
2021/11/24
1.8K0
iOS编译原理
Bugly iOS自动导入符号表
      最近在处理Bugly问题的时候顺便解决了下符号表上传的问题,使用最新的上传工具包,也是顺便整理了下可以使用的脚本添加到了项目中,把这个过程中遇到的问题总结出来,脚本也会给出来,实测是没有问题的,希望可以帮助到有需要的小伙伴。首先关于什么是符号表,符号表是用来干什么的,在哪里找自己的符号表这些问题我们不在这里说,Bugly文档里面说的很详细也很清楚,需要的小伙伴直接去看官方文档。
Mr.RisingSun
2022/10/05
1.5K0
Bugly iOS自动导入符号表
相关推荐
Xcode中和symbols有关的几个设置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验