为什么 Debug Information Format 改为 DWARF 可以提高编译速度?

本文探讨了将iOS项目的Debug Information Format改为DWARF以提高编译速度的原因。DWARF是一种调试信息格式,用于在机器码和源代码之间建立桥梁。文章介绍了DWARF的发展历史、使用方法,包括如何通过Clang生成DWARF文件,并通过实验对比了生成DWARF文件与不生成的情况,展示了DWARF在调试和性能上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS 方案之本(Essence of Workaround in iOS) 是我新写的一个专题。在很多大厂的各路优化方案中,只是告诉了我们为了达到目的怎么去做,但是并没有说这个方案的本质原因是什么。这个专栏就是为了格物致知,从原理层面来讲述方案背后的原理。

背景

在很多大厂对外公布的 iOS 提高编译速度的方案中都会有这一种优化方案:

将 Build Setting 的 Debug Information Format 中的 Debug 改成 DWARF。

方案出处:

  • iOS 微信编译速度优化分享

  • HACKERNOON - Speed up Swift compile time[1]

  • AREK HOLKO - Speeding up Development Build Times With Conditional dSYM Generation[2]

    等等。

溯源 DWARF

DWARF 全名是 Debugging with Attribute Record Formats ,是一种调试信息的存放格式。

DWARF 第一版发布于 1992 年,主要是为 UNIX 下的调试器提供必要的调试信息,例如内存地址对应的文件名以及代码行号等信息,通常用于源码级别调试使用。另外通过 DWARF,还能还原运行时的地址成为可读的源码符号(及行号)。

DWARF 调试信息简单的来说就是在机器码和对应的源代码之间建立一座桥梁,大大提高了调试程序的能力。

iOS 中引入 DWARF 这种调试信息格式,其实也是顺应历史的潮流,因为 DWARF 已经在类 UNIX 系统中逐步替换 stabs(symbol table strings),成为一种主流的调试信息格式。使用 GCC 或者 LLVM 系列编译器都可以很方便的生成 DWARF 调试信息。

在 《DWARF详解》[3]这篇博客中,作者给出了一个 DWARF 的发展历史以及它的一些竞品,这里我引用一下:

DWARF 发展历史

DWARF 版本 发布时间 社区
DWARF1 1992 Unix SVR4, PLSIG, UnixInternational
DWARF2 1993 PLSIG
DWARF3 2005 Free Standards Group
DWARF4 2010 DWARF Debugging Format Committee
### 关于 KEIL5 中 ‘Not enough information to list image symbols’ 的解决方案 在 Keil MDK 编译过程中遇到 `Not enough information to list image symbols` 和 `Not enough information to list load addresses in the image map` 错误时,通常是因为链接器无法找到某些必要的符号或地址信息。以下是可能的原因及其对应的解决办法: #### 1. 链接脚本配置不正确 如果链接脚本中的段定义存在冲突或者未正确指定,则可能导致此错误。例如,在引用中提到的错误消息 `L6235E: More than one section matches selector - cannot all be FIRST/LAST.` 表明可能存在多个段匹配同一选择器的情况[^2]。 **解决方法:** 检查 `.sct` 文件(散列文件),确保没有重复定义相同的内存区域或段名。可以尝试清理并重新设置段分配规则。例如: ```c LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; execute region size_region *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; RW data .ANY (+RW +ZI) } } ``` #### 2. 源文件缺失或未正确添加到项目中 当某个源文件未被正确包含到工程中时,可能会导致该类错误。正如引用所描述的内容所示,有时即使设置了路径但仍会遗漏特定的 `.c` 或其他实现文件[^3]。 **解决方法:** 确认所有必需的源文件均已加入到项目的分组列表里,并且这些文件能够正常参与编译过程。可以通过右键点击 Project -> Add Existing Files... 来手动补充丢失的部分。 #### 3. 符号表生成选项关闭 默认情况下,Keil 可能不会自动生成完整的符号表用于调试或其他用途。如果没有启用相应的选项,也可能引发此类警告/错误。 **解决方法:** 进入 **Options for Target -> Output** 页面,勾选 “Create HEX File” 和 “Debug Information”,同时确保选择了合适的格式如 DWARF-2 等来支持更丰富的元数据导出功能[^1]。 通过以上措施应该可以有效缓解乃至彻底消除上述问题的发生几率。当然实际操作还需结合具体应用场景灵活调整参数设定。 ```python # 示例 Python 脚本片段展示如何自动化部分流程(仅作参考) import os def add_files_to_project(project_path, files_list): """批量将文件添加至keil工程项目""" command_template = f'"C:\\Keil_v5\\UV4\\uvprojcmd.exe" -a {{file}} -p "{project_path}"' for file in files_list: full_command = command_template.format(file=file) result = os.system(full_command) add_files_to_project(r"C:\path\to\your_project.uvproj", ["new_module.c"]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值