当前位置: 首页 > news >正文

IOS崩溃文件符号化实践

1.背景与项目难点

1.1 背景

由于公司之前使用的友盟要收费,filebase服务由谷歌提供,存在数据合规风险。需要实现稳定性分析功能,通过支持app崩溃信息实时采集、实时上报、实时自动解析并定位出代码问题,帮助研发同学及时定位崩溃原因并修复;同时对崩溃信息进行统计和可视化展示,通过数据辅助研发和PM同学进行产品功能迭代决策。

1.2 难点

ios端崩溃文件未经符号化且端上无法直接将符号化后的文件上传发送到服务端, 因此需要设计一套自动流程采集打包产生的dsym,实时采集ios上报后的崩溃文件,文件符号化后存储崩溃数据,对崩溃信息进行统计和可视化展示,在稳定性分析模块以供数据研发定位代码问题和PM进行产品功能迭代。

2. crash日志的分析与收集

2.1 如何获取dsym文件

dysm生成:dsym文件在触发打包过程中生成,生成后的文件存储在打包机上,因此第一步是将打包机上的dsym文件发送到崩溃解析服务器上。

2.1.1 初始方案

采用ftp文件传输,编写python脚本,在打包过程生成dsym文件后,发送到崩溃解析服务器。

产生问题:

由于公司使用的ios打包机安装在一台mac电脑上,mac电脑所在的集群网络和崩溃解析服务器所在的集群网络不通,且无法将mac电脑加入到崩溃解析服务器所在的集群,通过ftp方式上传文件无法满足此需求。因此需要引入中间文件存储工具,使用http的方式将文件上传到崩溃解析服务器上。

2.1.2 file browser引入

file browser:https://github.com/filebrowser/filebrowser
file browser可以创建属于自己的云的软件,可以在其中将其安装在服务器上,将其定向到一个路径,然后通过一个 Web 界面访问您的文件。filebrowser 提供指定目录下的文件管理界面,可用于上传、删除、预览、重命名和编辑文件。它允许创建多个用户,每个用户可以有自己的目录。它可以用作独立的应用程序。

基于filebrowser的以上功能,在崩溃解析服务器上安装filebrowser,用于保存dsym文件和crash文件。
在这里插入图片描述

2.1.3 最终方案

将filebrowser安装在崩溃解析服务器上,通过http请求filebrowser提供的上传文件接口,将打包上增加python脚本,生成的dsym文件后,调用filebrowser上传文件接口发送到崩溃解析服务器。

2.2 崩溃解析流程

2.2.1获取dsym文件流程

请添加图片描述

打包机将文件上传到崩溃解析服务器的具体流程为:
1.打包触发python脚本,通过脚本将dsym文件发送到崩溃解析服务器内的filebrowser
2.启动watch dog监听文件变更,监听到创建新的dsym文件,解析出dsym的uuid,并将文件发送到dsym存储表,以供展示平台可视化展示。

2.2.2 crash文件上报过程

请添加图片描述
1.crash信息通过SDK上报到埋点平台,我们通过Flink监听到crash信息的上报,flink任务将crash文件并把它写入数据库。
2.Flink是实时计算平台提供的用来实时消费上报的数据的程序,支持大并发量的数据。

2.2.3 分析crash文件方法

crash日志结构

基本信息
请添加图片描述

崩溃原因
请添加图片描述

线程
请添加图片描述
Binary Images
请添加图片描述

分析crash日志的方法symbolicatecrash

需要文件
1.有crash崩溃文件
2.有app.dsym文件
需要软件
Xcode
执行命令
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash yourCrashLog.crash yourAppName.app.dSYM > outputFileName.txt

2.2.4 符号化过程

请添加图片描述
1.客户端通过sdk上报crash文件到埋点服务器
2.埋点服务器将未符号化的crash文件存放到filebrowser中
3.运行在崩溃解析服务器上的watchdog监听到有新的crash文件创建,则去匹配和crash文件版本一致&uuid一致的dsym文件,执行symbolicatecrash解析命令
4.将符号化以后的文件存储在filebrowser并且发送到flink任务
5.flink任务将crash数据存入埋点数据库
6.可视化平台对崩溃数据查询

至此,符号化解析过程完毕,该方案在开发和测试过程中还暴露出一些问题

  1. 崩溃解析服务器的macos环境是由虚拟机搭建,开发过程中会出现由于macos系统版本的问题,导致crash文件解析失败,后续更换macos版本问题解决,但不确定该问题是否会随着xcode版本升级或者ios系统版本升级等变化再次出现。
  2. crash文件解析还需维护系统符号表,由于崩溃解析服务器存储空间限制,目前仅维护用户使用量较高的几个版本,并且目前系统符号表只能由人工上传维护。

3.总结

至此,我们完成了从crash文件上传、符号化解析到最终可视化界面平台展示的全流程的设计。
有了此功能,能够极大的提高了研发排查、解决线上问题的效率,提升了App的稳定性,也能够帮助PM进行产品功能迭代。

参考
简述分析crash日志的方法之symbolicatecrash
iOS 用symbolicatecrash符号化崩溃日志中系统库方法堆栈

相关文章:

IOS崩溃文件符号化实践

1.背景与项目难点 1.1 背景 由于公司之前使用的友盟要收费,filebase服务由谷歌提供,存在数据合规风险。需要实现稳定性分析功能,通过支持app崩溃信息实时采集、实时上报、实时自动解析并定位出代码问题,帮助研发同学及时定位崩溃…...

设计模式之适配器模式与桥接模式详解和应用

目录1 适配器模式1.1 定义1.2 应用场景1.3 适配器角色1.4 类适配器1.5 对象适配器1.5 接口适配器1.6 实战1.7 源码1.8 适配器与装饰器的对比1.9 适配器模式的优缺点1.10 总结2 桥接模式2.1 原理解析2.2 角色2.3 通用写法2.4 应用场景2.5 业务场景中的运用2.6 源码2.7 桥接模式优…...

Winform控件开发(14)——NotifyIcon(史上最全)

前言: 先看个气泡提示框的效果: 代码如下: 在一个button中注册click事件,当我们点击button1时,就能显示气泡 private void button1_Click(object sender, EventArgs e){notifyIcon1.Visible = true;notifyIcon1...

Verilog 学习第四节(从计数器到可控制线性序列机——LED实验进化六部曲)

从计数器到可控制线性序列机——LED实验进化六部曲一:让LED灯按照亮0.25s,灭0.75s的状态循环亮灭二:让LED灯按照亮0.25s,灭0.5s,亮0.75s,灭1s的状态循环亮灭三:让LED灯按照指定的亮灭模式亮灭&a…...

操作SSH无密登录配置

例如小编有三台服务器需要相互访问,就需要配置三台,这三台分别是hadoop102,hadoop103 , hadoop1041.打开三个服务器,分别生成hadoop102,hadoop103 , hadoop104的公钥和私钥输入命令,然后一直回车,这时候什么…...

Websocket详细介绍

需求背景 在某个资产平台,在不了解需求的情况下,我突然接到了一个任务,让我做某个页面窗口的即时通讯,想到了用websocket技术,我从来没用过,被迫接受了这个任务,我带着浓烈的兴趣,就…...

大数据书单(100本)

大数据书单(100本) 序号 书名 作者 出版社 1 Hadoop权威指南:大数据的存储与分析(第4版)(修订版)(升级版) Tom White 清华大学出版社 2 Hive编程指南 卡普廖洛 (Edward Capriolo) / 万普勒 (Dean Wampler) / 卢森格林 (Jason Rutherglen) / 曹坤 人民邮…...

python实战应用讲解-【语法基础篇】初识Python(附示例代码)

目录 前言 Python基础 基本概念: 为什么使用Python? Python2.x与3.x版本区别...

【2023保研夏令营】网安、CS(西交、华师、科、南等)

文章目录一、基本情况二、投递和入营情况三、考核情况1. 西交软院(面试)2. 川大网安(笔试面试)3. 华东师范数据学院(机试面试)4. 人大信息学院专硕(机试面试,保密)5. 南大…...

Qt COM组件导出源文件

文章目录摘要dumpcpp.exe注册COM组件COM 组件转CPP参考关键字: Qt、 COM、 组件、 源文件、 dumpcpp摘要 由于厂家提供的库不是纯净C库,是基于COM组件开的库,在和厂家友好交流无果下,只能研究下Qt 如何调用,好在Qt 的…...

各数据库数据类型的介绍和匹配

各数据库数据类型的介绍和匹配1. Oracle的数据类型2. Mysql的数据类型3. Sql server的数据类型4. 类型匹配5. Awakening1. Oracle的数据类型 数据类型介绍 VARCHAR2 :可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749; NCHAR :根据字符集而定的固定长度字…...

Rancher 部署 MySQL

文章目录创建 pvc部署 MySQL前置条件:安装 rancher,可参考文章 docker 部署 rancher 创建 pvc MySQL 数据库是需要存储的,所以必须先准备 pvc 创建 pvc 自定义 pvc 名称选择已经新建好的 storageclass,storageclass 的创建可参考…...

Python语言零基础入门教程(二十五)

Python OS 文件/目录方法 Python语言零基础入门教程(二十四) 39、Python os.openpty() 方法 概述 os.openpty() 方法用于打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 语法 openpty()方法语法格式如下: os.openpty()参数 无 返…...

蓝桥杯算法训练合集十五 1.打翻的闹钟2.智斗锅鸡3.文件列表

目录 1.打翻的闹钟 2.智斗锅鸡 3.文件列表 1.打翻的闹钟 问题描述 冯迭伊曼晚上刷吉米多维奇刷的太勤奋了,几乎天天迟到。崔神为了让VonDieEman改掉迟到的坏毛病,给他买了个闹钟。 一天早上,老冯被闹钟吵醒,他随手将闹钟按掉丢…...

CPU扫盲-CPU与指令集

指令集架构就像是特定的CPU的设计图纸,它规定了这个CPU需要支持那些指令、寄存器有那些状态以及输入输出模型。根据指令集结构的设计,在CPU上通过硬件电路进行实现,就得到了支持该指令集的CPU。指令集就像是我们编程语言中的接口,…...

VINS-Mono/Fusion与OpenCV去畸变对比

VINS中没有直接使用opencv的去畸变函数,而是自己编写了迭代函数完成去畸变操作,主要是为了加快去畸变计算速度 本文对二者的结果精度和耗时进行了对比 VINS-Mono/Fusion与OpenCV去畸变对比1 去畸变原理2 代码实现2.1 OpenCV去畸变2.2 VINS去畸变3 二者对…...

jmx prometheus引起的一次cpu飙高

用户接入了jmx agent进行prometheus监控后,在某个时间点出现cpu飙高 排查思路: 1、top,找到java进程ID 2、top -Hp 进程ID,找到java进程下占用高CPU的线程ID 3、jstack 进程ID,找到那个高CPU的线程ID的堆栈。 4、分析堆…...

Android 虚拟 A/B 详解(六) SnapshotManager 之状态数据

本文为洛奇看世界(guyongqiangx)原创,转载请注明出处。 原文链接:https://blog.csdn.net/guyongqiangx/article/details/129094203 Android 虚拟 A/B 分区《AAndroid 虚拟 A/B 分区》系列,更新中,文章列表: Android 虚拟分区详解(一) 参考资料推荐Android 虚拟分区详解(二…...

Python快速入门系列之一:Python对象

Python对象1. 列表(list)2. 元组(tuple)3. 字典(dict)4. 集合(set)5. 字符串(string)6. BIF (Built-in Function)7. 列表、集合以及字…...

【博客626】不同类型的ARP报文作用以及ARP老化机制

不同类型的ARP报文作用以及ARP老化机制 1、ARP协议及报文 2、不同类型的ARP报文作用 3、ARP工作原理 4、ARP老化机制 5、Linux ARP老化机制 ARP状态机: 在上图中,我们看到只有arp缓存项的reachable状态对于外发包是可用的,对于stale状态的…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦&#xff0…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...