iOS dSYM详解和分析crash,ips文件

article/2025/3/1 10:21:12

1.什么是dSYM文件

dSYM 文件是Xcode编译后,我们会看到一个同名的 dSYM 文件,dSYM 是保存 16 进制函数地址映射信息的中转文件,存储应用程序的调试 symbols。每次编译项目或者打包的时候都会生成一个新的 dSYM 文件,当我们软件release模式打包或上线后,不会像我们在Xcode中那样直观的看到用崩溃的错误,所以对于每一个发布版本我们都很有必要保存对应的 Archives 文件。不管你集没集成类似Buyly的三方,要符号化分析crash日志还是得要用到对应的dSYM文件,如果没有生成dSYM文件,可以看一下TARGETS下Build Settings里面有没有设置,如下图


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修改为对应的就行

    dwarfdump --uuid Test.app.dSYM

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

 

 

2、利用symbolicatecrash符号化分析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/crash2 export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"3 ./symbolicatecrash Test.crash Test.app.dSYM > Result.crash

我们可以先来看看Test.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


得到的结果如上,没错就是最后异常回溯的第5行,有没有发现偏移后的地址和第6行的第一个地址是一致的,所以第1个地址是开始地址,第2个地址是基地址,第3个 + 22788就是偏移量 这是十进制的,计算如下 0x1026b4000 + 0x000005904(22788转16进制后的值)= 0x1026B9904 直接百度16进制加减法,大佬可以除外


4、利用CrashSymbolicator.py符号化解析 ips 文件
CrashSymbolicator.py脚本存放在该路径下:

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

如果不一样可能是Xcode名字不一样?可以利用下面的命令去查找,如过你的Xcode就叫Xcode话,不然改成自己Xcode路径:

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

但是这回不能像复制symbolicatecrash工具一样复制出来了,因为这个脚本import其它文件也在同一个目录下,我们可以终端命令进入到这个文件夹下把 dSYM 文件和 ips 文件放入到该文件夹下执行符号化解析命令。

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

 

image.png

image.png

 

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文件就出来了,

image.png

 
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 orderend tell

http://chatgpt.dhexx.cn/article/yQTsuFuY.shtml

相关文章

Xcode骚操作之:解决报错 MapFileParser.sh: Permission denied

MapFileParser.sh: Permission denied Unity项目,需要用Xcode运行,结果报了错误。 解决方案: 1、启动台》其它》选择 终端 ,输入以下命令: chmod空格x空格拖拽这个文件到小黑框 回车 注意:chmod x的意思…

ipa重签名的四种方式

文章为学习hank的视频笔记 一 开发者调试安装app到手机的签名过程 1. Mac电脑生成公钥M和私钥M 2. 公钥M传给苹果服务器,苹果服务器的私钥A对公钥M进行加密生成证书返回给xcode 3. Xcode下载profile等描述文件,用公钥M对app进行加密生成app签名,然后把app签名和证书以及p…

闲聊扯淡 | 微信8.0背景视频合集,笑死我了

微信 8.0 更新已经有几天了,最开始现在 IOS 端推行,昨天在安卓端也可以更新了,没有更新的小可爱快去更新试试吧。 除了重新高清化的表情以及衍生的表情包大战外,各种新玩法也被不断挖掘出来。 值得一提的就是微信 8.0 中是支持视频…

Unity简单操作:获取 apk在 苹果平台 或者 安卓平台,它自身的包名

在运行时返回应用程序标识。在 Apple 平台上为保存在 info.plist 文件中的“bundleIdentifier”,在 Android 平台上为 AndroidManifest.xml 中的“package”。(com.xxxx.xxxx)

iOS 多线程和GCD(Grand Central Dispath) 教程 (一)

iOS 多线程和GCD(Grand Central Dispath) 教程 (一) 本文翻译自 Ray Wenderlich 的博客 点击打开原文链接。全部由本人亲手翻译...童叟无欺~ 你有木有遇见过这样的情况,当你在写app的时候,有时候界面就卡住了,要等很长…

iOS【开发热门游戏_超级猜图Demo】

先看效果图 思路 需求分析 1,搭建界面 1》上半部分,固定的,用Storyboard直接连线(OK) 2》下半部分,根据题目的变化,不断变化和调整,用代码方式实现比较合适(OK) *备选按钮区域(OK) *答案按钮区域(OK)…

unity骚操作之: 解决AVPro Video在安卓移动端播放不了SteramAssecting里面的视频 或者 URL视频

Unity自带VideoPlay用来播放视频有bug,在移动端测试无法正常使用Url播放,所以找到AVProVideo,这个插件很好用,移动端亲测可用,功能也全,这里记录下使用心得 下载地址:支持Unity2019及以上版本AVProVideo1.11.5视频播放插件.zip_avpro安卓11不能播放-C#文档类资源-CSDN下…

unity普通操作:animator播放,暂停,判断播放完成【(增加1个判断如果这个是动画融合的情况)】

1.播放,暂停 anim.CrossFade("s2", 0); anim.speed0;//暂停 anim.speed1;//播放 判断播放完成(Update方式) void Update(){AnimatorStateInfo stateinfo2 anim.GetCurrentAnimatorStateInfo(0);//判断…

猫猫学IOS(五)UI之360等下载管理器九宫格UI

猫猫分享,必须精品 素材下载地址:http://blog.csdn.net/u013357243/article/details/44486651 先看效果 主要是完成了九宫格UI的搭建 代码 - (void)viewDidLoad {[super viewDidLoad]; //九宫格中每个格子的宽 #define kAppViewW 80 //九宫格中每个格…

猫猫学IOS(七)UI之UITextField代理事件_类似QQ登陆窗口的简单实现

猫猫分享,必须精品 素材代码地址: http://blog.csdn.net/u013357243/article/details/44587005 原文地址:http://blog.csdn.net/u013357243/article/details/44571163 先看效果图: 学习代码 // // NYViewController.m // 05-UITextFie…

国行Apple Watch 开启 ECG 心电图功能

国行Apple Watch 开启 ECG 心电图功能 设备要求 1.iphone 升级到最新系统 2.apple watch 升级到最新系统 3.最好有一台备用iphone来保证数据不被泄露 开通原理 1.我们需要有一个已开通ECG功能的appleId 2.登录此appleId到设备 3.同步健康App数据到本地 4.退出账号 5.登…

iOS开发:面向协议编程与 Cocoa 的邂逅 (上)

//联系人:石虎 QQ: 1224614774昵称:嗡嘛呢叭咪哄 喵神原文地址:https://onevcat.com/2016/11/pop-cocoa-1/ 本文是笔者在 MDCC 16 (移动开发者大会) 上 iOS 专场中的主题演讲的文字整理。您可以在这里找到演讲使用的 Keynote,部分示例代码可以在 MDCC …

猫猫学IOS(十三)UI之UITableView学习(下)汽车名牌带右侧索引

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44727225 原文地址:http://blog.csdn.net/u013357243?viewmodecontents 先看效果图 代码 ViewController //ps:新建iOS交流学习群&#xf…

在android上模拟ios阴影效果

update一下,下面方法现在来看很low,其实最简单的是直接自定义一个drawable android上大部分时候阴影是不符合产品需求的,就比如我们就要求实现一个类似ios的圆形图片的阴影??? cardview阴影就挺好,可是他喵了个咪的&#xff0…

猫猫学IOS(六)UI之iOS热门游戏_超级猜图

猫猫分享,必须精品 素材地址:http://blog.csdn.net/u013357243/article/details/44539069 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmodecontents 先看效果图 思路 需求分析…

iOS汇编基础(二)寄存器

以arm64为例 xcode调试汇编1. xcode 查看运行时的汇编代码 debug -> debug workflow -> always show disassembly 2. Xcode改变pc值 register write pc 0x1005d6928 3. 单步运行一步汇编代码:ni 4. 读取某个寄存器 (lldb) register read x0x0 = 0x0000000000000000…

Unity简单操作: DoTween的onCom..回调函数里面执行错误 不返回哪条函数出错的解决方案,与iOS平台为什么需要勾选安全模式

目录 DoTween的onCom..回调函数里面执行错误 不返回哪条函数出错的解决方案 当然 在iOS平台 测试好了的话 需要勾选它,不然iOS机制原因 会导致onComxx回调 没有执行! DoTween的onCom..回调函数里面执行错误 不返回哪条函数出错的解决方案 如下图&…

iOS汇编基础(一)

一 高级语言运行过程 二 汇编语言的特点 可以直接访问、控制各种硬件设备,比如存储器、CPU等,能最大限度地发挥硬件的功能能够不受编译器的限制,对生成的二进制代码进行完全的控制目标代码简短,占用内存少,执行速度快汇编指令是机器指令的助记符,同机器指令一一对应。每一…

STM32cubIDE 黑色主题_主题 | 喵咪旅行日志 VX可爱系列主题 BySasa

今天带来一款Sasa小宝贝儿投稿的可爱系列VX主题,应该也算是可爱系列里偏向简单的了。 鉴于前几次留言总是碰到隔着网线就不需要情商的DS。在前边先申明清楚吧,审美各有差异,不喜欢不用就好了。如果没有素质去diss投稿者作品,那就别…

tp框架怎么连接mysql_tp框架知识 之(链接数据库和操作数据)

框架有时会用到数据库的内容,在"ThinkPhp框架知识"的那篇随笔中提到过,现在这篇随笔详细的描述下。 一、链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写config.php文件 我这里是这样的文件路径 (2)打开这个config.php文…