如何查看崩溃日志

 目录

描述

思路

查看ipa包崩溃日志

简单查看手机崩溃信息几种方式

方式1:手机设置查看崩溃日志

方式2: Xocde工具

方式3: 第三方软件克魔助手

环境配置

实时日志

奔溃日志分析

方式四:控制台资源库

线上崩溃日志

线上监听crash的几种方式

方式1: 三方平台的SDK

方式2: 自己实现异常监听,然后提交后台

常见的造成的崩溃的情况

1.数组越界

2.多线程问题

3.主线程无响应

4.野指针

信号可捕获的崩溃日志收集

信号捕获的原理

信号不可捕获的崩溃日志收集

iOS 后台保活的 5 种方式

采集过程原理

崩溃日志分析


描述

模拟器和真机调试运行正常,但是导出ipa包安装运行出现奔溃。记录一下提醒一下遇到同样问题的人少走弯路。

思路

首先遇到问题,头脑要保持清醒。思考为什么会出现这样的问题?

  • 模拟器和真机调试运行正常,模拟器和真机调试是在DeBug模式下运行的
  • 导出ipa包的环境是Release模式下

所以可以重点是在Release模式下查看崩溃信息才能定位问题。

查看ipa包崩溃日志

手机数据线连接电脑,借助克魔助手就可以看,Xcode -> Window-> Devices and Simulator


进入后,选择【View Device Logs

日志文件看的好难受,好像也没有办法定位具体问题,接着分析

刚才不是分析在Release模式下出现的问题嘛,所以可以直接将本地调试的Dudeg的模式修改为Relese模式,然后运行。
默认是Debug模式,选择Release模式,然后本地调试的时候就和导出的ipa环境一致啦。
同时记得要勾选 【Zombie Ojects】,可以定位出野指针和僵尸对象。然后运行Xcode,可以定位到具体问题啦,同时控制台也输出了使用的对象提前释放导致的问题。

简单查看手机崩溃信息几种方式

方式1:手机设置查看崩溃日志

步骤:【设置】-> 【隐私】 -> 【分析与改进】-> 【分析数据】

方式2: Xocde工具

手机数据线连接电脑,借助Xcode就可以看,Xcode -> Window-> Devices and Simulator,具体和上面一致,请参照上图示例。

方式3: 第三方软件克魔助手

通过数据线连接 iOS 手机和电脑

在iOS应用开发过程中,调试日志和奔溃日志是开发者必不可少的工具。然而,使用Xcode Console等工具查看日志可能不够方便,而且处理奔溃日志也相当繁琐。克魔助手的出现为开发者带来了极大的便利,本文将详细介绍其功能和使用方法。 克魔助手会提供两种日志,一种是实时的,一种的是崩溃的。(由于崩溃日志的环境很麻烦,目前只展示实时日志操作步骤)

环境配置

  • 电脑一台(台式和笔记本都OK)

  • iPhone 手机一台

  • 下载克魔助手

  • 下载爱思助手或者itunes驱动

实时日志

克魔助手提供了实时日志功能,能够在电脑上实时查看设备的日志信息。 下面是操作步骤:

1.先将 iPhone 通过数据线连接上电脑,iOS 手机上一定要信任这次连接




 

2.在电脑上打开克魔助手-实时日志。




 

3.因为你已经通过数据线连接了电脑和手机,所以此时在控制台的左侧工具栏里会显示你的设备,如果此时直接点击 开始日志那将输出的是此设备的所有日志,那么如果想要查看某一App的日志查看起来是非常繁琐的,那我就需要对App继续筛选过滤再输出。




 

4.选择需要查看iPhone里面的App(可以通过 command+ 空格,搜索应用),然后点击 开始日志,将会输出关于此App的所有日志




 




 

5.如果需要对App里面的关键字继续过滤处理,可关键字那直接输入后点击清空日志,再点击空白处即可过滤成功




 

6.当你过滤出来了错误信息后,你可以将这些错误日志存储起来,形成一个 errorlog 提交给到开发,点击 导出日志即可生成一个文件夹。




 

奔溃日志分析

克魔助手还提供了奔溃日志分析查看模块,可以方便地导出和查看iOS设备上的奔溃日志,并对其进行符号化、格式化和分析。 操作如下:

1.选择需要查看的奔溃日志。




 

2.点击“导出日志”,即可生成一个包含奔溃日志的文件夹,便于提交给开发团队进行分析。

PS:数据连接时,先将 iPhone 通过数据线连接上电脑,iOS 手机上一定要信任这次连接,(开启WiFi调试时,无需数据线)

方式四:控制台资源库

可以看到所有和该电脑同步过的设备的崩溃日志(.crash文件)

输入下方的文件地址:

~/Library/Logs/CrashReporter/MobileDevice

找到自己手机设备的日志信息

开发程序过程也会出现程序crash的情况,那么这时生成的文件目录为:

~/Library/Logs/DiagnosticReports/

线上崩溃日志

线上监听crash的几种方式

方式1: 三方平台的SDK

例如:腾讯Bugly、crashlytics、友盟SDK

方式2: 自己实现异常监听,然后提交后台

自己实现异常监听的方式稍微复杂点,需要异步监听任务,不能影响到主进程的任务体验

常见的造成的崩溃的情况

1.数组越界

在取数据索引时越界,App 会发生崩溃。还有一种情况,就是给数组添加了 nil 会崩溃

2.多线程问题

在子线程中进行 UI 更新可能会发生崩溃。多个线程进行数据的读取操作,因为处理时机不一致,比如有一个线程在置空数据的同时另一个线程在读取这个数据,可能会出现崩溃情况。

3.主线程无响应

如果主线程超过系统规定的时间无响应,就会被 Watchdog 杀掉。这时,崩溃问题对应的异常编码是 0x8badf00d。

4.野指针

野指针指向一个已删除的对象访问内存区域时,会出现野指针崩溃。野指针问题是需要我们重点关注的,因为它是导致 App 崩溃的最常见,也是最难定位的一种情况

信号可捕捉信号不可捕捉
KVO问题后台任务超时
NSNotification线程问题内存打爆
数组越界主线程卡顿超阀值
野指针....

信号可捕获的崩溃日志收集

打开 Xcode 的菜单选择 Product -> Archive
然后,在提交时选上“Upload your app’s symbols to receive symbolicated reports from Apple”,以后你就可以直接在 Xcode 的 Archive 里看到符号化后的崩溃日志了。

但是这种查看日志的方式,每次都是纯手工的操作,而且时效性较差。所以,目前很多公司的崩溃日志监控系统,都是通过克魔助手这样的第三方开源库捕获崩溃日志,然后上传到自己服务器上进行整体监控的。

信号捕获的原理

在崩溃日志里,你经常会看到下面这段说明:

Exception Type: EXC_BAD_ACCESS (SIGSEGV)

它表示的是,EXC_BAD_ACCESS 这个异常会通过 SIGSEGV 信号发现有问题的线程。虽然信号的种类有很多,但是都可以通过注册 signalHandler 来捕获到。
其实现代码,如下所示:

void registerSignalHandler(void) {signal(SIGSEGV, handleSignalException);signal(SIGFPE, handleSignalException);signal(SIGBUS, handleSignalException);signal(SIGPIPE, handleSignalException);signal(SIGHUP, handleSignalException);signal(SIGINT, handleSignalException);signal(SIGQUIT, handleSignalException);signal(SIGABRT, handleSignalException);signal(SIGILL, handleSignalException);
}void handleSignalException(int signal) {NSMutableString *crashString = [[NSMutableString alloc]init];void* callstack[128];int i, frames = backtrace(callstack, 128);char** traceChar = backtrace_symbols(callstack, frames);for (i = 0; i <frames; ++i) {[crashString appendFormat:@"%s\n", traceChar[i]];}NSLog(crashString);
}

上面这段代码对各种信号都进行了注册,捕获到异常信号后,在处理方法 handleSignalException 里通过 backtrace_symbols 方法就能获取到当前的堆栈信息。堆栈信息可以先保存在本地,下次启动时再上传到崩溃监控服务器就可以了。

信号不可捕获的崩溃日志收集

App 退到后台后,即使代码逻辑没有问题也很容易出现崩溃。而且,这些崩溃往往是因为系统强制杀掉了某些进程导致的,而系统强杀抛出的信号还由于系统限制无法被捕获到。

iOS 后台保活的 5 种方式

  • Background Mode
  • Background Fetch
  • Silent Push
  • PushKit
  • Background Task (App 退后台后,默认都会使用这种方式)

采集过程原理

Background Task 这种方式,就是系统提供了beginBackgroundTaskWithExpirationHandler 方法来延长后台执行时间,可以解决你退后台后还需要一些时间去处理一些任务的诉求。

- (void)applicationDidEnterBackground:(UIApplication *)application {self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^( void) {//你的任务逻辑[self yourTask];}];
}

在这段代码中,yourTask 任务最多执行 3 分钟,3 分钟内 yourTask 运行完成,你的 App 就会挂起。 如果 yourTask 在 3 分钟之内没有执行完的话,系统会强制杀掉进程,从而造成崩溃,这就是为什么 App 退后台容易出现崩溃的原因。

采用 Background Task 方式时,我们可以根据 beginBackgroundTaskWithExpirationHandler 会让后台保活 3 分钟这个阈值,先设置一个计时器,在接近 3 分钟时判断后台程序是否还在执行。如果还在执行的话,我们就可以判断该程序即将后台崩溃,进行上报、记录,以达到监控的效果。

崩溃日志分析

我们采集到的崩溃日志,主要包含的信息为:进程信息、基本信息、异常信息、线程回溯。

  • 进程信息:崩溃进程的相关信息,比如崩溃报告唯一标识符、唯一键值、设备标识;
  • 基本信息:崩溃发生的日期、iOS 版本;
  • 异常信息:异常类型、异常编码、异常的线程;
  • 线程回溯:崩溃时的方法调用栈。
    一些被系统杀掉的情况,我们可以通过异常编码来分析。
    常见的就是如下三种:
  • 0x8badf00d,表示 App 在一定时间内无响应而被 watchdog 杀掉的情况。
  • 0xdeadfa11,表示 App 被用户强制退出。
  • 0xc00010ff,表示 App 因为运行造成设备温度太高而被杀掉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何启用Windows电脑的内置Administrator账户

前言 不知道从什么时候开始&#xff0c;新电脑或者新系统开机之后都会出现一个界面让你创建一个账户&#xff0c;但这个账户有可能是本地账户&#xff08;Windows10&#xff09;还有强制你登录微软账户的&#xff08;Windows11&#xff09;。 好像曾经熟悉的电脑Administrator…

Taro +vue3 中 实现 选择城市页面 主要逻辑市 选择了某个城市返回之前的页面

1.需求 当我选中了某个城市 这个页面肯定 从某个页面跳转过来的 此时我先选择了城市 再跳转回去 所以有一个问题就是如何写这个逻辑 2.实现 //当前城市页面 onMounted(() > {const instance: any Taro.getCurrentInstance();if (instance.router.params.url) {sourceUr…

Uncaught (in promise) ReferenceError: require is not defined

在 Vue3 中加载项目路径下的资源图片,起初按照之前 vue 的写法 require 但浏览器却抛出了异常 Uncaught (in promise) ReferenceError: require is not defined 因为 require 采用的 webpack 加载方式,而 vue3 中通过 vite 的方式,两者存在差异,所以才产生了刚开始的一目; vu…

C++中的虚函数

前言 本篇文章讲述C的虚函数 定义 在C语言中&#xff0c;基类将类型相关的函数和派生类不做改变直接继承的函数区分开来。对于有些函数&#xff0c;基类希望派生类各自定义适合自身的版本。那么基类就会将这些函数标记为virtual&#xff0c;这些被标记的函数就是虚函数。 下…

2024年如何使用WordPress构建克隆Udemy市场

您想创建像 Udemy 这样的学习管理 (LMS) 网站吗&#xff1f;最好的学习管理系统工具LifterLMS将帮助您制作像Udemy市场这样的 LMS 网站。 目录 Udemy市场是什么&#xff1f; 创建 Udemy 克隆所需的几项强制性技术&#xff1a; 步骤 1) 注册您的域名 步骤 2) 获取虚拟主…

springboot git配置文件自动刷新失败问题排查

http://{ip}:{port}/refresh 说明&#xff1a;springBoot版本是1.5.9&#xff0c;接口路径与2.x&#xff0c;不同 路径区别&#xff1a;/refresh VS /actuator/refresh 用postman调用refresh接口刷新git配置&#xff0c;报错如下&#xff0c;没有权限 在服务本地启动&#…

微信私密朋友圈被吐槽有BUG

日前&#xff0c;大量网友在各社交媒体上讨论微信私密朋友圈出现 Bug 的话题&#xff0c;起因是跨年期间一个网友发布了一条”私密朋友圈&#xff0c;但不一会就收到朋友发来的信息&#xff0c;”又偷偷发朋友圈了&#xff1f;“&#xff0c;估计此时网友可能已经”寒毛四起、汗…

D3篇之色卡

学习传送门&#xff1a;Sequential scales | D3 by Observable 1.scaleSequential(domain, interpolator)&#xff08;连续比例尺&#xff09; 是一种在D3.js中用于将一个范围内的连续值射到另一个范围内的连续值的方法。该比例尺通常用于将数值型数据映射到图表元素的属性上…

jenkins忘记密码后的操作

1、先停止 jenkins 服务 systemctl stop jenkins 关闭Jenkins服务 或者杀掉进程 ps -ef | grep jenkins &#xff5c;awk {print $2} | grep -v "grep" | xargs kill -9 2、找到 config.xml 文件 find /root -name config.xml3、备份config.xml文件 cp /root/.jen…

Java面试——框架篇

1、Spring框架中的单例bean是线程安全的吗&#xff1f; 所谓单例就是所有的请求都用一个对象来处理&#xff0c;而多例则指每个请求用一个新的对象来处理。 结论&#xff1a;线程不安全。 Spring框架中有一个Scope注解&#xff0c;默认的值就是singleton&#xff0c;单例的。一…

【STM32】STM32学习笔记-USART串口外设(26)

00. 目录 文章目录 00. 目录01. 串口简介02. 串口协议03. USART简介04. USART框图05. USART基本结构06. 数据帧07. 起始位侦测08. 数据采样09. 波特率发生器10. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式&#xff0c;因为它简单便…

基于FPGA的RLC测试仪

1. 系统设计 以FPGA为控制器&#xff0c;实现RLC(电阻、电容、电感)的检测&#xff0c;其测量电路如下&#xff1a;

性能优化-OpenMP基础教程(四)-Android上运行OpenMP

本文主要介绍如何在一个常规的Android手机上调试OpenMP程序&#xff0c;包括Android NDK的环境配置和使用JNI编写一个OpenMP程序运行在Android手机中。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#…

2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

微服务彻底改变了应用程序开发世界&#xff0c;将大型整体系统分解为更小、更易于管理的组件。这种架构风格的特点是独立、松散耦合的服务&#xff0c;带来了从可扩展性、模块化到更高的灵活性等众多优势。 DevOps 团队如何最好地利用这种方法来实现最高效率&#xff1f;答案在…

vue中短时间内多次点击同一个按钮会向后端发送多个请求

在vue中&#xff0c;我们可能会遇到以下问题&#xff1a; 我们有两种方法解决&#xff1a; &#xff08;1&#xff09;可以通过设置一个标志位来防止用户在短时间内多次点击同一个按钮导致向后端发送多个请求。具体实现方式如下&#xff1a; 定义一个 isFetching变量来表示当…

欧盟食品接触材料测试1935/2004/EC介绍

欧盟官方公报(OJ)发布与食品接触的塑料制品法规(EU)10/2011的修订法规(EU)2017/752。欧盟食品级塑料法规从(EU)10/2011发布以来&#xff0c;已历经7次修订&#xff0c;前5次的修订版本均是针对EU10/2011法规里的附录1授权物质清单进行修订。第6次修订法规(EU)2016/1416澄清和纠…

寻找两个相交链表的相交节点

分析&#xff1a; 如图所示&#xff0c; A 长度为mkB长度为nk张三&#xff0c;李四两人分别从A和B的起始点相同速度出发&#xff0c;无论谁到达终点时&#xff0c;都从另一条队列的起点再次出发。假定起始&#xff0c;张三沿着A走&#xff0c;李四沿着B走。当李四到达终点后&a…

thinkadmin列表多图点击放大

头像展示 原型 {field: images, title: 图片, align: center, minWidth: 200,

云原生技术专题 | 解密2023年云原生的安全优化升级,告别高危漏洞、与数据泄露说“再见”(安全管控篇)

背景介绍 2023年&#xff0c;我们见证了科技领域的蓬勃发展&#xff0c;每一次技术革新都为我们带来了广阔的发展前景。作为后端开发者&#xff0c;我们深受其影响&#xff0c;不断迈向未来。 随着数字化浪潮的席卷&#xff0c;各种架构设计理念相互交汇&#xff0c;共同塑造了…

73应急响应-Web分析phpjavaWeb自动化工具

我感觉学完渗透自然就会应急响应&#xff0c;之前又发过应急响应的文章 应急响应笔记就开始比较潦草 应急响应基础知识 应急响应流程 保护阶段&#xff08;断网&#xff0c;避免继续渗透&#xff1b;备份&#xff09;&#xff0c;分析阶段&#xff08;分析攻击行为&#xf…