iOS dsym符号表详解

简介

在 iOS 开发过程中,我们经常会遇到崩溃的情况。为了方便调试和分析崩溃日志,iOS 提供了一个重要的工具,即 dsym 符号表。本文将详细介绍 dsym 符号表的概念、作用以及如何生成和使用。

什么是dsym符号表?

在 iOS 开发中,编译器将 Objective-C 或 Swift 代码转换为机器码。这些机器码被打包到 iOS 应用程序的可执行文件中。当应用程序崩溃时,系统会生成一个崩溃日志(crash log)。这个日志包含了应用程序崩溃时的堆栈信息,堆栈信息中的每一个方法都是一个地址,而不是方法的名称。

为了将这些地址转换为方法名称,iOS 开发工具链使用了 dsym 符号表。dsym 符号表是一个包含了应用程序的符号信息的文件,可以将地址转换为方法名称和行号。通过 dsym 符号表,我们可以更方便地调试和分析崩溃日志,定位问题的原因。

生成dsym符号表

iOS 开发工具链会自动为我们生成 dsym 符号表,在编译应用程序时,会生成一个包含符号信息的 dSYM 文件。我们可以通过以下方式生成 dSYM 文件:

  1. 在 Xcode 中,打开项目的 "Build Settings"。
  2. 搜索 "Debug Information Format" 设置。
  3. 将 "Debug" 配置下的 "Debug Information Format" 设置为 "DWARF with dSYM File"。

经过上述设置后,每次编译应用程序时,Xcode 会自动为我们生成 dSYM 文件,并将其存储在应用程序的构建目录中。

使用dsym符号表

解析崩溃日志

当应用程序发生崩溃时,系统会生成一个崩溃日志。我们可以通过崩溃日志来定位崩溃的原因。下面是一个崩溃日志的示例:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

Last Exception Backtrace:
0   CoreFoundation              0x0000000107d4d5bb __exceptionPreprocess + 331
1   libobjc.A.dylib             0x00000001063fb735 objc_exception_throw + 48
2   MyApp                       0x00000001043b9e2e -[ViewController viewDidLoad] + 302
3   UIKitCore                   0x000000010b3d88e6 -[UIViewController loadViewIfRequired] + 1183
4   UIKitCore                   0x000000010b3d8d97 -[UIViewController view] + 27
...

崩溃日志中的堆栈信息显示了应用程序崩溃时的方法调用顺序。但是,方法名被转换为了地址。我们需要将这些地址转换为方法名称和行号。这就是 dsym 符号表的作用。

使用atos命令解析

atos 命令是一个用于将地址转换为符号信息的命令行工具。我们可以使用以下命令来解析崩溃日志中的地址:

atos -arch <架构> -o <dSYM文件路径> <地址>

下面是一个使用 atos 命令解析崩溃日志的示例:

atos -arch arm64 -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp 0x00000001043b9e2e

执行上述命令后,会输出对应地址的方法名称和行号。

自动解析崩溃日志

为了更方便地解析崩溃日志,我们可以将解析过程自动化。可以编写一个脚本,自动解析崩溃日志中的地址,并输出对应的符号信息。下面是一个使用 Python 编写的自动解析脚本的示