iOS_crash文件的获取及符号化(解析)
文章目录
- 1. 使用 symbolicatecrash 解析 .ips 文件:
- 2. 使用 CrashSymbolicator.py 解析 ips 文件
- 3. 使用 atos 解析 crash 文件
- 4. Helps
- 4.1 .ips 文件获取
- 4.2 .crash 文件获取
- 4.3 获取 .dSYM 和 .app 文件
- 4.4 使用 dwarfdump 查询 uuid
- 5. Tips
- 6. 总结
1. 使用 symbolicatecrash 解析 .ips 文件:
symbolicatecrash是Xcode自带的crash日志分析工具
步骤1. 找到symbolicatecrash,打开Terminal执行:
find /Applications/Xcode.app -name symbolicatecrash -type f
稍等一会,就会输出路径,然后将路径复制,右键 Finder -> 前往文件夹 -> 粘贴 -> 回车,就能找到symbolicatecrash,将symbolicatecrash拷贝出来备用
步骤2. 将./symbolicatecrash、crash和dSYM文件放在同一文件夹里
步骤3. 执行解析命令
./symbolicatecrash 《crash文件绝对路径》 《拖入xx.app.dSYM里的xx文件》 > log.crash 回车
可能会报错:
错误1:Error: "DEVELOPER_DIR" is not defined at /Users/yourname/Downloads/crash/symbolicatecrash line 69.
解决:执行export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer后重试
错误2:No crash report version in /xxx.crash at ./symbolicatecrash line 1365.
原因:Apple 在 Xcode13.3 已经废弃了symbolicatecrash
解决:如果需要使用,需要将.ips转化为之前的格式。可以使用 AppleCrashScripts 进行转化
步骤:
- 下载
AppleCrashScripts项目,进入到项目目录下 - 将
.ips文件复制到AppleCrashScripts-master文件夹下: - 执行:
swift convertFromJSON.swift -i xxx.ips -o log.crash
生成的log.crash就是旧格式的文件了,再用 ./symbolicatecrash 进行解析。
2. 使用 CrashSymbolicator.py 解析 ips 文件
步骤1. 找到CrashSymbolicator.py文件,
find /Applications/Xcode.app -name CrashSymbolicator.py -type f
结果:
/Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources/CrashSymbolicator.py
步骤2. 使用CrashSymbolicator.py和.dSYM 对.ips文件进行解析
python3 《CrashSymbolicator.p文件路径》 -d xxx.dSYM -p xxx.ips
运行结果会直接显示在terminal里,需要的可以复制出来保存一下。
步骤3. 分析
...
"queue": "com.apple.main-thread",
"frames": [{"imageOffset": 117622764,"imageIndex": 0,"symbol": "__57-[QNBUALiveFeedCategoryChannelViewController viewDidLoad]_block_invoke","sourceFile": "QNBUALiveFeedCategoryChannelViewController.m","sourceLine": 80,"symbolLocation": 32},...]
...
找到了崩溃时主线程正在执行的代码,invoke了一个空的block。
3. 使用 atos 解析 crash 文件
命令格式:
atos -arch <Binary Architecture> -o <Path to dSYM file>/Contents/Resources/DWARF/<binary image name> -l <load address> <address to symbolicate>
操作:
atos -arch arm64 -o 《拖入xxx.app.dSYM里的xxx文件》 -l 《基地址》《偏移后的地址》
Tips: xxx 为项目名
如1:
atos -arch arm64 -o ~/xxx.app.dSYM/Contents/Resources/DWARF/xxx 0x10b3e47ec 0x1043b8000atos -arch arm64 -o ~/xxx.app.dSYM/Contents/Resources/DWARF/xxx 0x104885ec0 0x1043b8000-[TTAttributedLabel encodeWithCoder:] (in xxx) (TTAttributedLabel.m:1534)
-[QNBUAPosterVerticalPaddingPicViewModel posterBackgroundOperation] (in xxx) (QNBUAPosterVerticalPaddingPicViewModel.m:115)
4. Helps
4.1 .ips 文件获取
- 设备 -> 设置 -> 隐私与安全性 -> 分析与改进 -> 分析数据 -> (对应app名+时间点)
- TestFlight 的可以在 iTunes Connect 获取到崩溃日志
iTunes Connect -> Manage Your Applications -> 对应app -> View Detail -> Crash Reports(已符号化) - Xcode -> Window -> Origanizer -> Crash 获取 (需登录开发者账号)
需要用户共享分享,才能获取到他的崩溃日志
官方提供的崩溃信息不是实时的,只能查看两天前的崩溃信息,需要试试可以使用第三方工具
4.2 .crash 文件获取
设备连接电脑 XCode -> Windows -> Device and Simulator -> View Device Logs -> (对应app名+时间点) -> 右键 Export Log
4.3 获取 .dSYM 和 .app 文件
.dSYM是十六进制函数地址映射信息的中转文件,调试的symbols会包含在这个文件中,symbols即类名、函数名等。
- 在
Archives打包时,应该保存每个正式版的dSYM和app文件,以备定位线上问题使用
Window -> Organizer -> Archives -> 右键(需要的包) -> Show in Finder -> 右键 .xcarchive 显示包内容
Tips:Archives包文件路径为:~/Library/Developer/Xcode/Archives
- debug模式获取
修改设置:Xcode -> Targets -> Build Setting
2.1:Debug Infomation Format -> DWARF -> DWARF with dSYM File
2.2:Generate Debug Symbols -> YES
用真机编译就能生成.dSYM和.app文件了,在项目工程的Products文件夹里,右键 xxx.app 文件 -> Show in Finder -> 就能找到
4.4 使用 dwarfdump 查询 uuid
查询.dSYM的uuid,确保跟.ips或.crash文件的uuid一致
dwarfdump -u <dSYM所在文件路径>
5. Tips
- Tips1: Apple deprecated symbolicatecrash at Xcode13.3, use atos instead
- Tips2: 有些
app有很多dSYM文件,需要把所有dSYM文件都拷贝到待解析文件同一文件夹下 - Tips3:
simulator不会生成crash文件 - Tips4:
XCode设置生成dSYM文件,并跑到真机上,此时app产生的.ips文件会自动符号化
6. 总结
CrashSymbolicator.py解析结果显示在 Terminal 里,且 没有保持原来的堆栈格式atos效率好低,只能一个地址一个地址的解析symbolicatecrash被废弃了,但文件进过转换还能用,且会解析一整个文件,还保留原来的堆栈格式(推荐使用)
参考:
Diagnosing issues using crash reports and device logs
Acquiring crash reports and diagnostic logs
Understanding Crashes and Crash Logs
iOS Debugging Magic
iOS Crash 分析攻略
本文的描述很难不掺杂作者的主观意见,如果对文章中的内容有疑问,欢迎评论区提出不同的意见进行讨论
相关文章:
iOS_crash文件的获取及符号化(解析)
文章目录 1. 使用 symbolicatecrash 解析 .ips 文件:2. 使用 CrashSymbolicator.py 解析 ips 文件3. 使用 atos 解析 crash 文件4. Helps4.1 .ips 文件获取4.2 .crash 文件获取4.3 获取 .dSYM 和 .app 文件4.4 使用 dwarfdump 查询 uuid 5. Tips6. 总结 1. 使用 sym…...
STM32定时器TIM控制
一、CubeMX的设置 1、新建工程,进行基本配置 2、配置定时器TIM2 1)定时器计算公式:(以下两条公式相同) Tout ((ARR1) * PSC1)) / Tclk TimeOut ((Prescaler 1) * (Period 1)) / TimeClockFren Tout TimeOut&…...
网络请求中,token和cookie有什么区别
HTTP无状态,每次请求都要携带cookie,以帮助识别用户身份; 服务端也可以向客户端set-cookie,cookie大小限制为4kb; cookie默认有跨域限制,不跨域共享和传递,例如: 现代浏览器开始禁…...
Javaweb_xml
文章目录 1.xml是什么?2.xml的用途 1.xml是什么? xml 是可扩展的标记性语言 2.xml的用途 1、用来保存数据,而且这些数据具有自我描述性 2、它还可以做为项目或者模块的配置文件 3、还可以做为网络传输数据的格式(现在 JSON 为主…...
http相关知识点
文章目录 长链接http周边会话保持方案1方案2 基本工具postmanFiddlerFiddler的原理 长链接 一张网页实际上可能会有多种元素组成,这也就说明了网页需要多次的http请求。可由于http是基于TCP的,而TCP创建链接是有代价的,因此频繁的创建链接会…...
【SA8295P 源码分析】68 - Android 侧用户层 输入子系统获取 /dev/input/event0 节点数据 代码流程分析
【SA8295P 源码分析】68 - Android 侧用户层 输入子系统获取 /dev/input/event0 节点数据 代码流程分析 一、EventHub.cpp 监听 /dev/input/event0 节点流程二、EventHub.cpp 读取 /dev/input/event0 节点数据流程系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总…...
走出迷宫(多组输入bfs)
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。 小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#…...
Linux系统编程-终端、进程组、会话
一、终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),进程中,控制终端是保存在PCB中的信息,而fork会复制PCB中的信息…...
Linux部分文件操作记录
问题描述 多级文件夹下,有多个同名文件,以及其他无关文件,为了减轻体量,遍历目录,只保留对应文件 首先open terminal here find . -type f \( ! -name algo_imu.bin -a ! -name post_gnss_only_error.log -a ! -name…...
Android系统-进程-Binder2-Java层
引言: 对于Android系统,一般是从java层到native层,再到kernel驱动层,形成一个完整的软件架构。Android系统中的Binder IPC通信机制的整体架构,从java层到底层驱动层是怎么样的一个架构和原理的呢? 概念与…...
体渲染原理及WebGL实现【Volume Rendering】
体渲染(Volume Rendering)是NeRF神经场辐射AI模型的基础,与传统渲染使用三角形来显示 3D 图形不同,体渲染使用其他方法,例如体积光线投射 (Volume Ray Casting)。本文介绍体渲染的原理并提供Three.js实现代码ÿ…...
VUE3组件
组件基础 {#components-basics} 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构: 这和我们嵌套 HTML 元素的方式类似,Vue 实现了自己的组件…...
【iOS】autoreleasepool
来说一下最近在了解的autoreleasepool吧,我们可能平时书写过许多脑残代码,其有很多的缺陷但是我们可能当时学的比较浅就也不太了解,就像下面这样的: for (int i 0; i < 1000000; i) {NSNumber *num [NSNumber numberWithInt…...
0基础学习VR全景平台篇 第80篇:Insta360 影石如何直播推流
一、下载Insta360 Pro APP 1、手机进入Insta360官网Insta360 | Action Cameras | 360 Cameras | VR Cameras,页面往下滑动到Insta360 Pro2相机处,点击相机图片进入详情页。详情页继续下滑到到手机APP处,根据自己的手机系统选择对应的客户端进…...
大语言模型之三 InstructGPT训练过程
大语言模型 GPT历史文章中简介的大语言模型的的发展史,并且简要介绍了大语言模型的训练过程,本篇文章详细阐述训练的细节和相关的算法。 2020年后全球互联网大厂、AI创业公司研发了不少AI超大模型(百亿甚至千亿参数),…...
ChatGPT在自动化报告和数据分析中的应用如何?
ChatGPT在自动化报告和数据分析领域的应用正日益受到关注,这种强大的语言模型不仅可以加速报告生成的过程,还可以辅助数据分析,从而帮助企业和个人更高效地处理信息和做出决策。以下将详细探讨ChatGPT在自动化报告和数据分析中的应用。 **自…...
面试热题(三数之和)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 输入&…...
在idea运行python文件
在idea运行python文件 如果在idea运行python文件而没有弹出run的选项,则点击File->Settings…->Plugins,在里面搜索python,如果没有显示则在Maketplace进行搜索, 接着Install,然后restart...
SQL - limit
介绍: limit 是限制的意思, 用于限制返回的查询结果的行数(可以通过limit指定查询多少行数据). MySQL支持limit语法, 用来完成分页. 用法: select 字段1, 字段2, ... from table_name limit offset, length;参数说明: offset: 起始行数, 从0开始计数, 如果省略, 则默认为…...
11. Redis基础知识
文章目录 一、概述二、数据类型STRINGLISTSETHASHZSET 三、数据结构字典跳跃表 四、使用场景计数器缓存查找表消息队列会话缓存分布式锁实现其它 五、Redis 与 Memcached数据类型数据持久化分布式内存管理机制 六、键的过期时间七、数据淘汰策略八、持久化RDB 持久化AOF 持久化…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
