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

相关文章

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器