iOS Xcode13基于dSYM和ips文件Crash奔溃堆栈解析

本文详细介绍了在日常iOS开发中,如何处理真机测试时遇到的应用崩溃问题。针对开发者本人手机崩溃和非本人手机崩溃两种情况,分别提供了详细的步骤来解析和定位堆栈信息。包括使用Xcode导出crash日志、使用symbolicatecrash工具以及分析非本人手机的ips文件。通过这些方法,开发者可以有效地诊断和解决iOS应用的崩溃问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

日常迭代开发中,我们用真机测试过程遇到崩溃问题时,有时候因为没有线上堆栈的监控日志,需要人工手动去解析定位堆栈信息

场景

需要手工解析日志一般有两种场景,一种是我们开发者自己的手机闪退了;另一种是别人的手机闪退了。两者主要的区别就是前者是开发者有自带的Xcode,后者可能是测试或用户不太方便连接到Xcode。

方案

开发者本人手机崩溃堆栈分析

针对第一种场景,即崩溃的手机即是开发者本人手机,相对就比较简单。

1、连接手机通过Xcode导出crash日志文件

在MAC电脑中打开Xcode开发工具,选择设备和模拟器(Devieces and Simulators)

2、选中真机设备,查看设备日志

3、选中崩溃的应用导出奔溃日志

导出生成一个xxx.crash

4、查找symbolicatecrash崩溃分析二进制可执行文件

通过在终端执行:find /Applications/Xcode.app -name symbolicatecrash -type f

我们真机设备,使用/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash的文件。

5、xxx.dSYM、xxx.crash和symbolicatecrash统一存放

首先在桌面建一个demo的文件夹用于存放crash相关的文档,然后将导出的xxx.crash文件、应用的xxx.dSYM和symbolicatecrash保存到电脑桌面的demo文件夹中。

6、进入demo文件夹执行symbolicatecrash分析命令

打开终端进入demo文件夹根目录,执行 ./symbolicatecrash xxx.crash xxx.dSYM 命令。此时终端会显示解析后的堆栈。

如果提示 Error: DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69。

需要先在打开的终端中先执行命令: export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer

 以上就是解析后,定位到的具体堆栈信息。

非本人手机崩溃分析

针对第二种场景,应该是遇到的概率比较多,经常是其他用户或测试真机遇到了奔溃,这时往往需要他们提供给我们用真机导出来的ips文件。

1、用户真机导出ips文件

引导用户通过真机路径的设置->隐私->分析->分析数据,找到对应崩溃应用的日志并导出发送给我们。

 2、将ips文件和xxx.dSYM文件存放统一存放

3、 找到CrashSymbolicator.py文件

在Xcode13中MAC电脑可分析ips文件是采用CrashSymbolicator.py文件进行分析,因此我们需要找到CrashSymbolicator.py程序的存储路径,通过find命令查找到路径是/Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources/CrashSymbolicator.py

4、执行分析命令CrashSymbolicator命令

因为CrashSymbolicator.py有其他模块的路径依赖,因此防止依赖报错,我们不将CrashSymbolicator.py复制到我们的demo文件夹中,而是直接执行用python3 执行CrashSymbolicator.py文件,具体命令如下。

python3 /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources/CrashSymbolicator.py -d xxx.dSYM -p xxx.ips

5、查看崩溃堆栈结果

最后,我们就可以在终端看到,崩溃的具体堆栈啦。

 因为CrashSymbolicator.py分析输出JSON格式信息,我们看到的堆栈信息也是JSON格式的。

### OData 批处理实现与示例 OData (Open Data Protocol) 是一种用于查询更新数据的协议。它允许客户端通过 HTTP 请求来操作服务器端的数据资源。批处理功能使得多个请求可以被组合成单个 HTTP 请求发送给服务端,从而提高效率并减少网络开销。 #### 创建批量请求 为了创建一个 OData 批次请求,通常会遵循如下结构: 1. **定义边界字符串**:批次请求中的每条消息都由特定边界的分隔符区分。 2. **构建变更集或独立操作**:可以根据需求将多条修改命令放入同一个变更集中执行原子提交;也可以作为单独的操作依次调用不同实体集合上的方法。 下面是一个简单的 Python 实现例子,展示如何利用 `requests` 库向支持 OData 的 Web API 发送包含两个 POST 请求的批处理请求: ```python import requests boundary = "batch_369_C4FF7FAB-A5BF-4D30-9A8E-BDA5C8B8FDDE" headers = { 'Content-Type': f'multipart/mixed; boundary={boundary}', } body_parts = [ '--' + boundary, 'Content-Type: application/http', 'Content-Transfer-Encoding: binary', '', 'POST /api/Customers HTTP/1.1', 'Content-Type: application/json', '{"Name": "Alice"}', # First request payload ] # Add second part to body parts list... body_parts.extend([ '--' + boundary, 'Content-Type: application/http', 'Content-Transfer-Encoding: binary', '', 'POST /api/Orders HTTP/1.1', 'Content-Type: application/json', '{"CustomerID": 1, "Amount": 100}', # Second request payload ]) # Close the multipart message with a final boundary line. body_parts.append('--' + boundary + '--') response = requests.post( url='http://example.com/$batch', headers=headers, data='\r\n'.join(body_parts), ) print(response.text) ``` 此代码片段展示了怎样构造一个多部分 MIME 消息体,并将其作为单一 HTTP POST 请求的一部分发送到 `$batch` 终结点上[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值