当iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上。crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈跟踪信息和内存映像,这样就能够通过解析这些信息进而定位crash发生时的代码逻辑,从而找到App闪退的原因。通常来说,crash产生来源于两种问题:违反iOS系统规则导致的crash和App代码逻辑BUG导致的crash,下面分别对他们进行分析。

违反iOS系统规则产生crash的三种类型

(1) 内存报警闪退

当iOS检测到内存过低时,它的VM系统会发出低内存警告通知,尝试回收一些内存;如果情况没有得到足够的改善,iOS会终止后台应用以回收更多内存;最后,如果内存还是不足,那么正在运行的应用可能会被终止掉。在Debug模式下,可以主动将客户端执行的动作逻辑写入一个log文件中,这样程序童鞋可以将内存预警的逻辑写入该log文件,当发生如下截图中的内存报警时,就是提醒当前客户端性能内存吃紧,可以通过Instruments工具中的Allocations和 Leaks模块库来发现内存分配问题和内存泄漏问题。

(2) 响应超时

当应用程序对一些特定的事件(比如启动、挂起、恢复、结束)响应不及时,苹果的Watchdog机制会把应用程序干掉,并生成一份相应的crash日志。这些事件与下列UIApplicationDelegate方法相对应,当遇到Watchdog日志时,可以检查上图中的几个方法是否有比较重的阻塞UI的动作。
application:didFinishLaunchingWithOptions:
applicationWillResignActive:
applicationDidEnterBackground:
applicationWillEnterForeground:
applicationDidBecomeActive:
applicationWillTerminate:

(3) 用户强制退出

一看到“用户强制退出”,首先可能想到的双击Home键,然后关闭应用程序。不过这种场景一般是不会产生crash日志的,因为双击Home键后,所有的应用程序都处于后台状态,而iOS随时都有可能关闭后台进程,当应用阻塞界面并停止响应时这种场景才会产生crash日志。这里指的“用户强制退出”场景,是稍微比较复杂点的操作:先按住电源键,直到出现“滑动关机”的界面时,再按住Home键,这时候当前应用程序会被终止掉,并且产生一份相应事件的crash日志。

应用逻辑的Bug

大多数闪退崩溃日志的产生都是因为应用中的Bug,这种Bug的错误种类有很多,比如
SEGV:(Segmentation Violation,段违例),无效内存地址,比如空指针,未初始化指针,栈溢出等;

SIGABRT:收到Abort信号,可能自身调用abort()或者收到外部发送过来的信号;

SIGBUS:总线错误。与SIGSEGV不同的是,SIGSEGV访问的是无效地址(比如虚存映射不到物理内存),而SIGBUS访问的是有效地址,但总线访问异常(比如地址对齐问题);

SIGILL:尝试执行非法的指令,可能不被识别或者没有权限;

SIGFPE:Floating Point Error,数学计算相关问题(可能不限于浮点计算),比如除零操作;

SIGPIPE:管道另一端没有进程接手数据;

常见的崩溃原因基本都是代码逻辑问题或资源问题,比如数组越界,访问野指针或者资源不存在,或资源大小写错误等。

crash的收集

在Mac 系统上,只需要打开xcode->windows->devices,选择device logs进行查看,如下图,这些crash文件都可以导出来,然后再单独对这个crash文件做处理分析。

看日志

市场上已有的商业软件提供crash收集服务,这些软件基本都提供了日志存储,日志符号化解析和服务端可视化管理等服务:

Crashlytics (www.crashlytics.com)

Crittercism (www.crittercism.com)

Bugsense (www.bugsense.com)

HockeyApp (www.hockeyapp.NET)

Flurry(www.flurry.com)

开源的软件也可以拿来收集crash日志,比如Razor,QuincyKit(Git链接)等,这些软件收集crash的原理其实大同小异,都是根据系统产生的crash日志进行了一次提取或封装,然后将封装后的crash文件上传到对应的服务端进行解析处理。很多商业软件都采用了Plcrashreporter这个开源工具来上传和解析crash,比如HockeyApp,Flurry和crittercism等。

crash信息

由于自己的crash信息太长,找了一张示例:
1) crash标识是应用进程产生crash时的一些标识信息,它描述了该crash的唯一标识(E838FEFB-ECF6-498C-8B35-D40F0F9FEAE4),所发生的硬件设备类型(iphone3,1代表iphone4),以及App进程相关的信息等;

2)基本信息描述的是crash发生的时间和系统版本;

3)异常类型描述的是crash发生时抛出的异常类型和错误码;

4)线程回溯描述了crash发生时所有线程的回溯信息,每个线程在每一帧对应的函数调用信息(这里由于空间限制没有全部列出);

5)二进制映像是指crash发生时已加载的二进制文件。以上就是一份crash日志包含的所有信息,接下来就需要根据这些信息去解析定位导致crash发生的代码逻辑, 这就需要用到符号化解析的过程(洋名叫:symbolication)。

解决线上闪退

首先保证,发布前充分测试。发布后依然有闪退现象,查看崩溃日志,及时修复并发布。

App崩溃原因定位分析相关推荐

  1. 移动app崩溃原因及场景

    转载于:https://www.cnblogs.com/51benpao/p/4534519.html

  2. 移动app测试的多样性_移动App测试一些崩溃原因及触发崩溃的场景

    移动 App 测试一些崩溃原因及触发崩溃的场景 移动 App 测试与传统台式机测试相比有一定的复杂性.这些复杂性可以被分类为: 环境:大量的设备,各种移动 OSs ,适应频繁 OSs 变化. 设备:触 ...

  3. app崩溃的原因 和 提前测试流程/方法 和出现崩溃后怎么定位和处理 总结(持续更新中)

    首先,崩溃有几种情况: 闪退 提示停止运行 无响应 ( 不同情况虽然没有严格意义上区分开引起原因,但是都有侧重.在之后的工作中,我会实时补充统计.) 1.接口返回值 [直接原因]:app无法解析接口返 ...

  4. 一次Android App NDK崩溃问题的分析及解决

    文章目录 小结 NDK崩溃的问题 通过logcat查看崩溃日志 提取`tombstone`的记录 通过ndk-stack来输出日志 取得的日志 分析并解决 分析 使用add2line定位具体报错的行数 ...

  5. 如何定位Release程序崩溃原因

    [转]如何定位Release程序崩溃原因 Posted on 2011-08-19 10:44 单鱼游弋 阅读(2162) 评论(1) 编辑 收藏 1       案例描述 作为Windows程序员, ...

  6. android 如何定位anr,ANR产生的原因及其定位分析

    记录ANR产生的原因及其定位分析 ANR概述 ANR是Android中一个独有的概念,全称是Application Not Responding(应用程序无响应). ANR的直观体验是用户在操作APP ...

  7. iOS线上APP崩溃(Crash)分析

    这两周一直在研究如何追踪线上的bug,如何快速分析出程序到底崩溃在什么地方,从底层了解Crash是如何产生的.如何传递的.以及是如何分析出来的.虽然项目组并没有对这些要求很严格,但是作为一个高级开发人 ...

  8. iOS开发-App应用崩溃卡顿分析

    文章目录 App崩溃问题 可捕获的崩溃信息收集 PLCrashReporter实现 系统接口 不可捕获的崩溃 iOS后台模式 Runloop 卡顿 Watch Dog 内存达到单个App上限被杀死 J ...

  9. iOS App 崩溃报告符号化,.ips崩溃报告文件分析

    iOS App 崩溃报告符号化,.ips崩溃报告文件分析 2014-09-22, Mon | 评论 本文为翻译整理.来源: Symbolicating iPhone App Crash Reports ...

最新文章

  1. Git相关二三事(git reflog 和彩色branch)【转】
  2. Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战
  3. 从“IBM刀片服务器广告告别电视”说起
  4. vue常见知识点整理
  5. Scanner类、Random类、ArrayList类
  6. Memobus总线光端机产品功能介绍
  7. 《软件项目管理(第二版)》期中考试试题总结/复习资料
  8. mysql 命令行批量sql_命令行中执行批量SQL的方法
  9. 很多人现在还不知道的知识点,Python多进程和多线程详解!
  10. 【Clickhouse】Connection is currently waiting for an insert operation, check your previous InsertState
  11. 织梦在哪写html,织梦dedecms模板文件不支持html的解决方法
  12. 自称世界上最权威监控软件FlexiSpy被黑删库,怎么做到的?
  13. “安全宝”,云安全服务
  14. C#(int)中Convert、Parse、TryParse的区别
  15. 工业读写器行业解决方案
  16. 转载 提高github下载速度的方法【100%有效】可达到2MB/s
  17. KGB知识图谱,利用科技解决传统知识图谱问题
  18. 拉格朗日、牛顿、拟合的应用
  19. 5G 38.300 Rel15 中文版
  20. 上海叮咚买菜抢菜程序

热门文章

  1. 从创新到主流选择,英特尔傲腾为用户输出了更多价值
  2. RS笔记:深度推荐模型之SIM长短期兴趣网络(基于搜索的超长行为序列上的用户长期兴趣建模)[CIKM 2020, 阿里妈妈广告团队]
  3. 树莓派使用sim800过程中的一些小结
  4. 深度操作系统Deepin V20正式版
  5. 简易个人信息登记系统(基于广义表,单链表)
  6. 实战:在电子邮件中使用数字签名和加密
  7. 三菱FX5U 模拟量采集FC (ST语言)
  8. SHA512/384 原理及C语言实现(附源码)
  9. 拜年神器php,Biu神器手机版
  10. 一些关于界面设计的技巧