IOS如何通过友盟上报的错误,使用dSYM查看报错的代码

2024-03-25 21:20

本文主要是介绍IOS如何通过友盟上报的错误,使用dSYM查看报错的代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们在集成友盟APM插件之后,将会在后台查看我们App的奔溃异常日志了,一般对于奔溃的记录,都是记录的内存地址,那么我们应该如何将内存地址映射到咋们App对应的代码中呢,这篇文章我们从头到尾简单梳理一下。

首先,对于集成APM插件,我们就不讲了,直接可以通过官方文档,过程应该不会太过于复杂了。

当我们获取到一个崩溃记录时,类似于下面的逻辑:

可以看到,这是二进制内存地址,那么如何查询报错的地址呢?

这时候,我们就需要用到 dSYM文件了。在iOS中,dSYM文件一个特殊的调试符号文件,用于存储编译后应用程序的调试信息。dSYM的全称是"Debug SYMbol"。当应用程序编译并链接成一个可执行文件时,编译器会生成这个文件。它包含了能够帮助我们在程序奔溃时可以知道奔溃的函数名称,行号和文件名。

那么应该如何生成 dSYM文件时,在Xcode中设置时,设置Build OptionsDebug Information FormatRelease 中设置DWARF with dSYM File即可,如下图所示:

然后我们即可打包,包打完之后,我们可以在xCode的window -> Organizer中看到我们的 App档案了,如下图所示:

在这里插入图片描述

拿一个最新的包,然后右键在Finder中查看,然后右键显示包内容
在这里插入图片描述

然后就可以看到我们的 dSYM文件夹了:
在这里插入图片描述

然后直接获取到我们的 dSYM 文件地址,假如我们的地址为:

/Users/user_name/Desktop/3-20-dsym/dSYMs/Demo.app.dSYM/Contents/Resources/DWARF/Demo

待我们获取到打包之后的dSYM地址之后,剩下的就需要靠 atos了。

那么什么是 atos 呢?

atos是一个命令行工具,用于将奔溃日志中的地址(通常是十六进制的内存地址)转换成文件名、函数名和源代码行号,这样更有助于开发者理解奔溃时发生的上下文。要使用 atos 命令时,需要注意以下信息:

  • 符号化的应用程序的二进制文件(通常是.app包中的可执行文件)
  • 产生奔溃的设备的体系结构(例如 arm64)
  • 奔溃时的内存地址
  • 相关的dSYM文件,它包含了调试符号。

下面是一个基本的 atos 使用实例:

atos -o <dSYM文件或者应用程序的路径> -l <加载地址> <奔溃地址>

其中

  • -o 参数后跟的是应用程序的dSYM文件或者是未剥离符号的可执行文件
  • -l 参数后跟的是加载地址(load address),即奔溃日志中的二进制映像的起始地址(它通常是出现在奔溃日志的Binary Images部分)
  • 最后一个地址是我们希望解析的内存地址

在这里插入图片描述

例如,当我们再次去看图一时,我们可以查询到我们的加载地址是0x104b44000, 那为啥不是前面的 0x000000010581dbfc呢?因为我们可以看到有前面的四个地址都是不同的,唯一相同的地址是后面的0x104b44000,所以我们可以推论出0x104b44000就是我们的加载地址,那么0x000000010581dbfc 就是我们的解析地址。然后,按照我们现在的逻辑,直接按部就班在终端输入如下命令:

xcrun atos -arch arm64 -o  /Users/root/Desktop/3-20-dsym/dSYMs/Demo.app.dSYM/Contents/Resources/DWARF/Demo -l 0x102b94000 0x0000000102f8633c 0x0000000103afcb3c  0x0000000103afccbc

如图,我们可以看到:

在这里插入图片描述

我们可以看到,这里的XXXController.startXXX() 即是我们的出问题所在代码。

通过找到出现问题的代码之后,那么接下来分析一下就容易多了。

这篇关于IOS如何通过友盟上报的错误,使用dSYM查看报错的代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846282

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —