1.什么是dSYM文件

dSYM 文件是Xcode编译后,咱们会看到一个同名的 dSYM 文件,dSYM 是保存 16 进制函数地址映射信息的中转文件,存储应用程序的调试 symbols。每次编译项目或许打包的时分都会生成一个新的 dSYM 文件,当咱们软件release形式打包或上线后,不会像咱们在Xcode中那样直观的看到用溃散的过错,所以关于每一个发布版别咱们都很有必要保存对应的 Archives 文件。不论你集没集成类似Buyly的三方,要符号化剖析crash日志仍是得要用到对应的dSYM文件,假如没有生成dSYM文件,能够看一下TARGETS下Build Settings里边有没有设置,如下图,文章或许有点啰嗦,请耐心阅读。

iOS Crash 堆栈还原

2.什么时分会用到dSYM文件

1、APP提交审核,有闪退bug被拒,审核人员基本会上传crash文件给你,这时分就要自己符号化剖析了。

2、你们编译给测验搭档的包,假如你们联系好,大概率会重现一遍给你看,否则或许便是导出一个ips文件直接丢给你了,也或许还有一些不太好复现的crash。

3、自己有时分调试的时分或许会用到。

注: ips 文件和crash文件不一样,Xcode13,iOS15以前设备ips文件改后缀成crash如同能够,可是之后 Apple 对符号化文件格式进行了 JSON 支持, 所以针对 iOS 15 以上产生的溃散文件, 写入方式应该是做了调整, 所以在对 iOS 15 以上溃散文件进行符号化时, ips改后缀会呈现符号化失败, 报错 No crash report version in file 的问题,改为直接运用 CrashSymbolicator.py下面会讲到。

注:假如是发布 Testflight 版别,有些公司 APP 更新前会先提交Testflight版别 公测 一下,然后许多crash的日志能够经过Apple Store Connect里边对应的应用,Testflight下的反应溃散里边看到,能够直接Xcode翻开,直接到Window->Organize->Crashes下直观看到溃散过错


3.dSYM,ips,crash文件怎么拿到

1、dSYM

编译后Xcode13以前应该在项目的Products文件夹下,右键Show in Finder。

Xcode13后坐落(/Users/用户名/Library/Developer/Xcode/DerivedData/对应的应用程序/Build/Products/Debug-iphoneos)。

打包的话坐落(/Users/用户名/Library/Developer/Xcode/Archives)目录下,也能够在Xcode挑选Window->Organize->Archives,Show in Finder。

2、crash

手机插上电脑Xcode挑选Window->Devices and Simulators,找到对应的iphone,View Device Logs,右键Export Log。

3、ips

或许是测验搭档或许其它搭档或许用户,手机不能连接到电脑,能够在手机设置->隐私->剖析与改进->剖析数据,能够查找对应的.ips.sycned文件然后检查导出修改成.ips的后缀就行,假如不是一眼能看到就直接搜项目姓名。

4.详细怎么使用dSYM符号化剖析

注:dSYM文件要和crash, ips 等文件一一对应,否则符号化会失败,比如你1.0.1产生的crash,ips文件要和1.0.1编译的dSYM文件匹配,注意每次编译都会生成新的dSYM文件

1、怎么检查dSYM和ips,crash文件是否一一对应

笔者创立的项目叫Test,检查crash,ips直接双击翻开检查,在下面例子图有符号,dSYM运用终端指令检查如下,Test.app.dSYM修改为对应的就行

iOS Crash 堆栈还原

例子如下,终端显示的是符号 – 拼接的,crash和ips文件都是连起来的。

iOS Crash 堆栈还原

iOS Crash 堆栈还原

iOS Crash 堆栈还原

2、使用symbolicatecrash符号化剖析crash文件

注:创立文件夹和文件夹放在哪都能自己看着办只需用到对应文件途径的时分,途径能对应就能够了,以下是笔者自己创立的方式。

iOS Crash 堆栈还原

首先在桌面创立一个dsym文件夹,里边再创立一个crash文件夹,dYSM文件和.crash文件拖入进去,symbolicatecrash仿制进去(假如不仿制东西出来,能够把文件仿制到东西文件夹下履行指令),Result.crash是符号化剖析后的产品,Makefile是一个用AppleScript写的一个脚本,翻开履行就能得到Result.crash(前提里边写的一些途径得一一对应),还能够保存成一个应用程序双击翻开履行,详细更多好玩的得自己去了解一下。symbolicatecrash东西存放在该途径下:

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources

假如不一样或许是Xcode姓名不一样?能够使用下面的指令去查找,如过你的Xcode就叫Xcode话,否则改成自己Xcode途径:

find /Applications/Xcode.app -name symbolicatecrash -type f

当三个文件都在同一个文件夹下后,咱们能够经过指令来得到符号化剖析后的crash文件,顺次履行,指令如下:注:假如不履行第二条指令会有意想不到的成果

 1 cd Desktop/dsym/crash
 2 export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer" 
 3 ./symbolicatecrash Test.crash Test.app.dSYM > Result.crash

咱们能够先来看看Test.crash日志符号化前后最终反常回溯长什么姿态:

iOS Crash 堆栈还原

iOS Crash 堆栈还原

3、使用atos指令定位问题

其实除了symbolicatecrash东西,atos指令也能简略的剖析一下,Test.app.dSYM/Contents/Resources/DWARF/Test 这儿就存着详细符号

atos -o 项目名.app.dSYM/Contents/Resources/DWARF/项目名 -l 基地址 偏移后的地址
笔者运用的指令参阅如下
atos -o Test.app.dSYM/Contents/Resources/DWARF/Test -l 0x1026b4000 0x1026B9904

iOS Crash 堆栈还原

得到的成果如上,没错便是最终反常回溯的第5行,有没有发现偏移后的地址和第6行的第一个地址是一致的,所以第1个地址是开端地址,第2个地址是基地址,第3个 + 22788便是偏移量 这是十进制的,计算如下 0x1026b4000 + 0x000005904(22788转16进制后的值)= 0x1026B9904 直接百度16进制加减法 或许计算器切换16进制,大佬能够在外

iOS Crash 堆栈还原

4、使用CrashSymbolicator.py符号化解析 ips 文件 (用此方法解析成功了 测验切换服务器的溃散日志)

CrashSymbolicator.py脚本存放在该途径下:

/Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/

假如不一样或许是Xcode姓名不一样?能够使用下面的指令去查找,如过你的Xcode就叫Xcode话,否则改成自己Xcode途径:

find /Applications/Xcode.app -name CrashSymbolicator -type f

可是这回不能像仿制symbolicatecrash东西一样仿制出来了,因为这个脚本import其它文件也在同一个目录下,咱们能够终端指令进入到这个文件夹下把 dSYM 文件和 ips 文件放入到该文件夹下履行符号化解析指令。

iOS Crash 堆栈还原

下面先看两个文件的对比。

iOS Crash 堆栈还原

iOS Crash 堆栈还原

iOS Crash 堆栈还原

iOS Crash 堆栈还原

CrashSymbolicator.py 操作稍微和 symbolicatecrash 会有些不同,因为是用 python 写的脚本,所以要运用 python3 来进行调用,否则会报错。(肯定有一大波人默默的在终端输入python检查版别号发现仍是2.7左右的版别,内心一顿XXX,其实python3早已经安装了,不信你们终端直接输入python3试试,假如没有那得自己安装了……

python3 CrashSymbolicator.py -d /xxx.app.dSYM -o /xxx.crash -p /xxx.ips

-d ‘符号表途径’ -o ‘输出符号化途径’ -p ‘苹果给的溃散日志’

假如是在 CrashSymbolicator.py 文件夹下操作,dSYM 和 ips 文件需求仿制到该脚本文件夹下,指令如下:

1 cd /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources
2 sudo python3 CrashSymbolicator.py -d Test.app.dSYM -o Result.ips -p Test.ips

5.使用AppleScript脚本快速进行符号化剖析

上述在文件夹里边履行指令尽管能够完成,可是比较麻烦,笔者做了个脚本履行,下面就看看脚本里边的代码(其实便是封装了几条指令)

相同首先在之前桌面的dsym文件夹下创立一个 ips 文件夹,dYSM文件和 .ips 文件拖入进去,Makefile脚本准备好,翻开履行,Result.ips文件就出来了,

iOS Crash 堆栈还原

Makefile.scpt代码如下: (详细语法这儿就不做讲解了,用户名需求替换成自己的用户名,途径能够自行根据需求更改)

# 翻开终端APP
tell application "Terminal"
    # 拼接导出ips成果指令 在此处替换对应的途径
    set pythonOrderStart to "python3 CrashSymbolicator.py"
    # 三个途径的前面的空格不要疏忽了
    set dSYMPath to " -d /Users/用户名/Desktop/dsym/ips/Test.app.dSYM"
    set outfilePath to " -o /Users/用户名/Desktop/dsym/ips/Result.ips"
    set ipsPath to " -p /Users/用户名/Desktop/dsym/ips/Test.ips"
    set pythonOrderEnd to ";"
    # 第一条指令 进入CrashSymbolicator.py对应的文件夹下履行操作 因为CrashSymbolicator.py相关其它的库也在这个文件夹内
    set order1 to "cd /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources;"
    # 第二条指令 剖析导出ips成果文件
    set order2 to pythonOrderStart & dSYMPath & outfilePath & ipsPath & pythonOrderEnd
    # 第三条指令 翻开剖析的成果文件
    set order3 to "open Result.ips"
    # 拼接多条指令
    set order to order1 & order2 & order3
    #多条指令履行用;分割
    do script order
end tell

链接:www.jianshu.com/p/88c915cd0…