符号表和 dSYM UUID 确认

什么是符号表?

符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示:

<起始地址> <结束地址> <函数> [<文件名:行号>]

为什么要配置符号表?

为了能快速并准确地定位用户APP发生Crash的代码位置 ,Bugly使用符号表 对APP发生Crash的程序堆栈 进行解析还原

举一个例子:

dSYM文件

什么是dSYM文件?

iOS平台中,dSYM文件是指具有调试信息的目标文件,文件名通常为:xxx.app.dSYM。如下图所示:

为了方便找回Crash对应的dSYM文件和还原堆栈,建议每次构建或者发布APP版本的时候,备份好dSYM文件。

如何定位dSYM文件?

一般情况下,项目编译完dSYM文件跟app文件在同一个目录下,下面以XCode作为IDE详细说明定位dSYM文件。

  • > 进入XCode;
  • > 打开工程(已编译过);
  • > 在左栏找到"Product"项;
  • > 鼠标右键点击编译生成的"xxx.app";
  • > 点击"Show in Finder";

如下图所示:

如果有多个dSYM文件,可以在使用工具时指定输入为dSYM文件所在的目录或者工程目录。

XCode编译后没有生成dSYM文件?

XCode Release编译默认会生成dSYM文件,而Debug编译默认不会生成,对应的Xcode配置如下:

XCode -> Build Settings -> Code Generation -> Generate Debug Symbols -> Yes

XCode -> Build Settings -> Build Option -> Debug Information Format -> DWARF with dSYM File

开启Bitcode之后需要注意哪些问题?

  • 在点"Upload to App Store"上传到App Store服务器的时候需要声明符号文件(dSYM文件)的生成:
  • 在配置符号表文件之前,需要从App Store中把该版本对应的dSYM文件下载回本地(参考"如何找回已发布到App Store的App对应的dSYM文件?"),然后用符号表工具生成和上传符号表文件。
  • 不需要配置自动生成符号表的脚本了,也不要用本地生成的dSYM文件来生成符号表文件,因为本地编译生成的dSYM文件的符号表信息都被隐藏了。如果用本地编译生成的dSYM文件生成符号表文件并配置到Bugly平台之后,还原出来的结果将是类似于"__hiden#XXX"这样的符号。

如何判断dSYM文件是否与Crash的UUID匹配?

Bugly还原Crash堆栈时,需要根据UUID来匹配符号表文件,因此只有上传的符号表文件的UUID与Crash对应APP的UUID一致时,才能准确地对堆栈进行还原。

Bugly v1.0页面

崩溃 ---> Crash issue ---> dSYM UUID

Bugly v2.0页面

崩溃分析 ---> Crash issue ---> 符号表 ---> UUID

如何查看dSYM文件的UUID?

通过命令查看UUID

复制代码
xcrun dwarfdump --uuid <dSYM文件>

通过符号表文件查看UUID

符号表文件的UUID与dSYM文件的UUID是一致的,因此可以通过符号表工具生成的符号表文件来查看dSYM文件的UUID:

生成符号表文件(.zip) ---> 解压符号表文件(.symbol) ---> 使用文本编辑器打开符号表文件

其中符号表文件的"UUID"信息即Debug SO文件的UUID,亦是符号表文件的UUID,如果文件较大,建议使用"Sublime Text"等文本编辑器来打开符号表文件。

如何找回已发布到App Store的App对应的dSYM文件?

通过Xcode找回

  1. 打开 Xcode 顶部菜单栏 -> Window -> Organizer 窗口:

  2. 打开 Xcode 顶部菜单栏,选择 Archive 标签:

  3. 找到发布的归档包,右键点击对应归档包,选择Show in Finder操作:

  4. 右键选择定位到的归档文件,选择显示包内容操作:

  5. 选择dSYMs目录,目录内即为下载到的 dSYM 文件:

通过iTunes Connect找回

  1. 登录iTunes Connect

  2. 进入"我的App(My Apps)"的"活动(Activity)"页面:

  3. 在"所有构件版本(All Builds)"中选择某一个版本,点"下载dSYM(Download dSYM)"下载dSYM文件:

通过mdfind工具找回

在Bugly的issue页面查询到crash对应的UUID:

然后在Mac的Shell中,用mdfind命令定位dSYM文件:

复制代码
mdfind "com_apple_xcode_dsym_uuids == <UUID>"

注意,使用mdfind时,UUID需要格式转换(增加"-"): 12345678-1234-1234-1234-xxxxxxxxxxxx

例如,要定位的dSYM的UUID为:E30FC309DF7B3C9F8AC57F0F6047D65F 则定位dSYM文件的命令如下:

复制代码
mdfind "com_apple_xcode_dsym_uuids == E30FC309-DF7B-3C9F-8AC5-7F0F6047D65F"
                                     |12345678-1234-1234-1234-xxxxxxxxxxxx|

建议每次构建或者发布APP版本的时候,备份App对应的dSYM文件!

mdfind 查看 xxx.app 的 UUID

objectivec 复制代码
# 查看 xx.app 文件的 UUID
dwarfdump --uuid xx.app/xx

# 查看 xx.app.dSYM 文件的 UUID
dwarfdump --uuid xx.app.dSYM

如何上传符号表到bugly平台?

目前只支持通过符号表工具上传,请下载符号表工具上传(内附详细使用说明文档),下载链接:https://bugly.qq.com/v2/downloads

参考链接:

Bugly iOS 符号表配置

iOS 符号化浅析

相关推荐
tangweiguo030519871 天前
SwiftUI布局完全指南:从入门到精通
ios·swift
T1an-11 天前
最右IOS岗一面
ios
坏小虎1 天前
Expo 快速创建 Android/iOS 应用开发指南
android·ios·rn·expo
光影少年1 天前
Android和iOS原生开发的基础知识对RN开发的重要性,RN打包发布时原生端需要做哪些配置?
android·前端·react native·react.js·ios
北京自在科技1 天前
Find My 修复定位 BUG,AirTag 安全再升级
ios·findmy·airtag
Digitally1 天前
如何不用 USB 线将 iPhone 照片传到电脑?
ios·电脑·iphone
Sim14802 天前
iPhone将内置本地大模型,手机端AI实现0 token成本时代来临?
人工智能·ios·智能手机·iphone
Digitally2 天前
如何将 iPad 上的照片传输到 U 盘(4 种解决方案)
ios·ipad
报错小能手2 天前
ios开发方向——swift并发进阶核心 @MainActor 与 DispatchQueue.main 解析
开发语言·ios·swift
LcGero2 天前
Cocos Creator 业务与原生通信详解
android·ios·cocos creator·游戏开发·jsb