一、背景
iOS15以后系统产生的崩溃文件是.ips格式的,不在是之前.crash的格式,不能像以前一样使用symbolicatecrash直接符号化。而是使用Xcode自带的CrashSymbolicator.py脚本来进行符号化。
Xcode 13 Release Notes
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)
二、使用Python脚本CrashSymbolicator.py符号化
1、获取手机崩溃文件
在iPhone手机:设置/隐私与安全性/分析与改进/分析数据的目录中找到自己APP的崩溃文件xxxAPP.ips。
2、获取APP对应版本号和build号的.dSYM文件。
3、找到CrashSymbolicator.py脚本对应的位置
//使用find命令查询文件位置
find /Applications/Xcode.app -name CrashSymbolicator.py -type f
//得到文件
/Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources/CrashSymbolicator.py
4、到CrashSymbolicator.py文件所在的目录执行解析脚本
//例子 python3 CrashSymbolicator.py -d /dSYMs -o /xxxAPP.crash -p /xxxAPP.ips
-d 表示DSMY文件路径,-o 表示符号化路径,-p 表示app内取出的.ips文件
5、查看符号化文件,和传统的崩溃文件格式不一样,符号化后的堆栈是以json格式显示。
//部分堆栈式如下
"queue": "com.apple.main-thread",
"frames": [
{
"imageOffset": 12372,
"symbol": "objc_msgSend",
"symbolLocation": 84,
"imageIndex": 6
},
{
"imageOffset": 41206720,
"imageIndex": 5,
"symbol": "-[xxxSocket .cxx_destruct]",
"symbolLocation": 95671
},
{
"imageOffset": 41182216,
"imageIndex": 5,
"symbol": "-[xxxSocket .cxx_destruct]",
"symbolLocation": 71167
},
{
"imageOffset": 31660904,
"imageIndex": 5,
"symbol": "+[xxxxManagerModule application:continueUserActivity:restorationHandler:]",
"sourceFile": "xxxxManagerModule.m",
"sourceLine": 991,
"symbolLocation": 131
}
...
]
三、常见问题
手机中导出的崩溃文件不是.ips文件格式的崩溃文件,而是.crash文件,则表明是在iOS15之前的系统上崩溃的。需要采用传统的xcode自带symbolicatecrash工具或者atos命令来符号化崩溃
1、使用symbolicatecrash符号化
找到xcode中symbolicatecrash文件的路径
find /Applications/Xcode.app -name symbolicatecrash -type f
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
到symbolicatecrash所在的文件夹中,执行符号化命令:
./symbolicatecrash xxAPP.crash xxAPPDsymPath > xxAPPcrashSymbolFilePath
2、使用atos符号化
atos -arch <Binary Architecture> -o <Path to dSYM file>/Contents/Resources/DWARF/<binary image name> -l <load address> <address to symbolicate>
1.-arch 指定二进制的架构,比如 armv7,armv7s,arm64 等等。
2.-o 指定符号文件,可以是 dSYM 文件,也可以是包含了符号表的可执行文件。
3.-l 是加载地址,由于 Xcode 默认打开 PIE 选项,所以加载地址每次都不一样,所以需要指定,可以在 crash 堆栈的 Binary Image 那段看到应用的加载地址。
4.最后一个参数是需要解析符号的地址。 解析例子:
xcrun atos --arch arm64 -o xx.app.dsym/Contents/Resourses/DWARF/xx -l 0xaabbcc 0x102e523d0
3、UUID 不一致
查看崩溃文件的UUID和DSYM文件UUID是否一样,崩溃文件的UUID可以直接查看到,DSYM文件的的UUID使用dump命令查看
//查看uuid
dwarfdump --uuid dSYM文件路径