iOS Crash文件符号化

1,445 阅读1分钟
  • App发生crash时系统会生成crash report,未被符号化的crash report 无法帮助我们进一步分析定位问题。

  • 通过dSYM和其它工具将crash文件中用16进制数表示的内存地址转换成源码里的文件名、函数名和行号,这个过程就叫做符号化。

一、dSYM符号集

  • dSYM符号集中包括:

    • 文件名
    • 函数名
    • 行号
    • 内存地址映射表
  • dSYM文件和app二进制文件是一一对应,且每次构建都不相同。

建议,每次上架新版本,备份归档文件.xcarchive

1. dSYM的生成

  • Target > Build Settings > Build Options > Debug information Format

    • 选择:DWARF with dSYM File
  • Target > Apple Clang - Code Generation > Generate Debug Symbols

    • 设置为YES

2. 获取方法:

  • 方法一:

    • Release:Window > Organizer > Archives > 找到指定.xcarchive文件 右键Show in Finder > 右键显示包内容 > xxx.app.dSYM

    • Debug:编译项目 > 项目Products文件夹 > 找到.app文件 > 右键Show in Finder > xxx.app.dSYM

  • 方法二:

    • 如果项目开启了Bitcode,Apple可能会进行二次编译生成不一样的dSYM文件,需要下载最新的dSYM文件。

    • Xcode下载:Window > Organizer > Archives > 找到指定.xcarchive文件 > Download Debug Symbols

    • appstoreconnect.apple.com下载:进入指定App详情页面 > 活动 > 进入指定构建版本详情 > 下载dSYM

      //appstoreconnect下载下来的dSYM文件需要再通过如下命令解析(Xcode下载的已经自动处理过则不需要):
      
      $ xcrun dsymutil -symbol-map 文件路径xxx.xcarchive/BCSymbolMaps 文件路径xxx/xxx.dSYM
      

二、校验文件

  • 即校验.crash.dSYM是否匹配,匹配上才能正确符号化crash文件。

  • 编译后的得到的.dSYM文件中的UUID是唯一的,如果和.crash文件中的UUID一致,则表示匹配成功

  • 获取.crash文件的UUID

方法一:

例如文件名为CrashDemo.crash

$ cd 到.crash文件位置
$ grep "CrashDemo arm64" CrashDemo.crash

输出:
0x1049d8000 - 0x1049dffff CrashDemo arm64  <95e0e1627bd8338e871e894ff3055fc6> /var/containers/Bundle/Application/1B54C1E3-4C58-4F6C-BE75-FE2A9A472CCD/CrashDemo.app/CrashDemo

其中 <95e0e1627bd8338e871e894ff3055fc6> 表示UUID。
方法二:
在.crash文件中找到`Binary Images`

对应值为:
0x1049d8000 - 0x1049dffff CrashDemo arm64  <95e0e1627bd8338e871e894ff3055fc6> /var/containers/Bundle/Application/1B54C1E3-4C58-4F6C-BE75-FE2A9A472CCD/CrashDemo.app/CrashDemo
  • 获取.dSYM的UUID
例如文件名为CrashDemo.app.dSYM

$ cd 到.dSYM文件目录
$ dwarfdump --uuid CrashDemo.app.dSYM

输出:
95E0E162-7BD8-338E-871E-894FF3055FC6 (arm64) CrashDemo.app.dSYM/Contents/Resources/DWARF/CrashDemo

  • 获取.app的UUID
例如文件名为CrashDemo.app

$ cd 到.app文件目录
$ dwarfdump --uuid CrashDemo.app/CrashDemo

输出
UUID: 95E0E162-7BD8-338E-871E-894FF3055FC6 (arm64) CrashDemo.app/CrashDemo

三、符号化

  1. 获取symbolicatecrash工具

    打开Finder,快捷键 Command+Shift+G,输入:
    
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
    
  2. 创建一个文件夹

    symbolicatecrash工具.dSYM.crash三个文件放到该文件夹中

  3. 指定Xcode环境变量

    $ export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
    
    //查看环境变量
    $ echo $DEVELOPER_DIR
    
  4. 符号化crash文件

    $ cd 到文件夹目录
    $ ./symbolicatecrash xxx.crash xxx.dSYM > newSym.crash