这里主要介绍 symbolicatecrash
和 atos
以及 iOS15 兼容 Json 格式后,新出的 CrashSymbolicator.py
工具的使用,三个工具都是 Xcode 自带,使用 sh 脚本写的,symbolicatecrash
实际上也是基于 atos
来进行符号化的,atos
可以针对模块方法进行符号化解析,symbolicatecrash
是针对整个文件进行符号化。
目前有 3 种符号化的方法,最简单方便的是直接把崩溃文件拖拽到 Xcode -> Device -> View Device Log
里面,但是这里这种符号化有一个局限性,就是当前崩溃的包必须是在当前机器打出来的,系统才可以进行符号化。
一般 dev/beta/product/ 包可能都不是在自己电脑 Arch 的,所以我们需要把每次打出来包的 dsym 文件保存到统一的远程服务器,这样每个开发可以去直接下载对应版本的 dsym,在结合下面介绍的 2 个工具进行符号化。
一、symbolicatecrash
首先通过终端找到 symbolicatecrash
路径,通过 symbolicatecrash 结合 dsym 和提供的 crash/ips/beta 文件来进行符号化。
查找 symbolicatecrash 路径
find /Applications/Xcode.app -name symbolicatecrash -type f
终端会输出当前 symbolicatecrash
不同系统平台路径,我们使用 SharedFrameworks/DVTFoundation.framework/Versions/A/Resources
里面的 symbolicatecrash
。
使用
symbolicatecrash crashFilePath dsymPath > crashSymbolFilePath
脚本 -> 产生崩溃文件路径 -> dsym 路径 > 输出符号化文件路径
遇到的问题
1、Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
这是因为脚本有执行需要依赖环境宏定义。
执行 export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
即可。
2、No crash report version in file
最近在符号化 iOS 15 以上的崩溃时,总是提示找不到崩溃版本,很诡异,最后查了一下原因是 iOS 15 crash log 格式做了更新,需要用到下面的 CrashSymbolicator.py
来进行符号化。
3、UUID 不一致
当不确定当前崩溃是否跟拿到的 dsym 是否为想对应的包时, 使用 dwarfdump --uuid dSYM 文件路径。
查看 dsym UUID:dwarfdump --uuid dSYM 文件路径
。
二、atos
atos 命令将十六进制地址转换为源代码中可识别的函数名称和行号。
使用方法
atos -arch <Binary Architecture> -o <Path to dSYM file>/Contents/Resources/DWARF/<binary image name> -l <load address> <address to symbolicate>
atos -arch 指令集 -0 dsym -l 调用地址 符号模块地址
*// explain parameters* load adress:可执行指令部分相对镜像文件中的起始加载地址 address to symbolicate:调用函数的地址
atos -o xxx.app.dSYM/Contents/Resources/DWARF/xxx -l 0x00000001c4fe7000 -arch arm64
atos -arch arm64 -o xxx.app.dSYM/Contents/Resources/DWARF/xxx -l 0x00000001c4fe7000 0x00000001a2d6e29c
*// extension about xcrun* *// xcrun can accept address to symbolicate on the way in command line.*
xcrun atos -o xxx.app.dSYM/Contents/Resources/DWARF/xxx -l 0x1040dc000 -arch arm64 0x1052c0464 __63-[GCDAsyncUdpSocket asyncResolveHost:port:withCompletionBlock:]_block_invoke.118 (in xxx) (GCDAsyncUdpSocket.m:1209) 0x104ba9094 -[BDAboutController tapButton:atIndex:] (in xxx) (BDAboutController.m:251)
三、CrashSymbolicator.py
因为崩溃文件是 iOS 15 产生,原来不知道 Apple 做了这一项调整,一直在用 symbolicatecrash 进行解析,终端报错 No crash report version in file
,查了下资料才发现新的文件格式得使用 CrashSymbolicator.py
解析。
To support the new JSON-format crash logs generated in macOS Monterey and iOS 15, Instruments includes a new CrashSymbolicator.py script. This Python 3 script replaces the symbolicatecrash utility for JSON-format logs and supports inlined frames with its default options. For more information, see: CrashSymbolicator.py --help. CrashSymbolicator.py is located in the Contents/SharedFrameworks/CoreSymbolicationDT.framework/Resources/ subdirectory within Xcode 13. (78891800)
iOS 15 之后 Apple 对符号化文件格式进行了 JSON 支持,所以针对 iOS 15 以上产生的崩溃文件,写入方式应该是做了调整,所以在对 iOS 15 以上崩溃文件进行符号化时,直接使用 CrashSymbolicator.py
来解析,否则会出现符号化失败,报错 No crash report version in file
的问题。
查找
find /Applications/Xcode.app -name CrashSymbolicator.py -type f
和使用 symbolicatecrash
方式类似,先找到其路径,系统列出不同平台 sh,切换到最后一个 /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources
稍微和 symbolicatecrash
不同的是,其调用方式可以支持参数的方式来排列文件顺序,并且其是用 python 写的脚本,所以要使用 python3 来进行调用,否则会报错。
-d '符号表路径' -o '输出符号化路径' -p '苹果给的崩溃日志'
使用
python3 CrashSymbolicator.py -d /dSYMs -o /xxxSymbo.crash -p /xxxCrash.ips
参考资料
本文为原创文章,版权归字节时代所有,欢迎分享本文,转载请保留出处!