App崩溃原因定位分析
当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崩溃原因定位分析相关推荐
- 移动app崩溃原因及场景
转载于:https://www.cnblogs.com/51benpao/p/4534519.html
- 移动app测试的多样性_移动App测试一些崩溃原因及触发崩溃的场景
移动 App 测试一些崩溃原因及触发崩溃的场景 移动 App 测试与传统台式机测试相比有一定的复杂性.这些复杂性可以被分类为: 环境:大量的设备,各种移动 OSs ,适应频繁 OSs 变化. 设备:触 ...
- app崩溃的原因 和 提前测试流程/方法 和出现崩溃后怎么定位和处理 总结(持续更新中)
首先,崩溃有几种情况: 闪退 提示停止运行 无响应 ( 不同情况虽然没有严格意义上区分开引起原因,但是都有侧重.在之后的工作中,我会实时补充统计.) 1.接口返回值 [直接原因]:app无法解析接口返 ...
- 一次Android App NDK崩溃问题的分析及解决
文章目录 小结 NDK崩溃的问题 通过logcat查看崩溃日志 提取`tombstone`的记录 通过ndk-stack来输出日志 取得的日志 分析并解决 分析 使用add2line定位具体报错的行数 ...
- 如何定位Release程序崩溃原因
[转]如何定位Release程序崩溃原因 Posted on 2011-08-19 10:44 单鱼游弋 阅读(2162) 评论(1) 编辑 收藏 1 案例描述 作为Windows程序员, ...
- android 如何定位anr,ANR产生的原因及其定位分析
记录ANR产生的原因及其定位分析 ANR概述 ANR是Android中一个独有的概念,全称是Application Not Responding(应用程序无响应). ANR的直观体验是用户在操作APP ...
- iOS线上APP崩溃(Crash)分析
这两周一直在研究如何追踪线上的bug,如何快速分析出程序到底崩溃在什么地方,从底层了解Crash是如何产生的.如何传递的.以及是如何分析出来的.虽然项目组并没有对这些要求很严格,但是作为一个高级开发人 ...
- iOS开发-App应用崩溃卡顿分析
文章目录 App崩溃问题 可捕获的崩溃信息收集 PLCrashReporter实现 系统接口 不可捕获的崩溃 iOS后台模式 Runloop 卡顿 Watch Dog 内存达到单个App上限被杀死 J ...
- iOS App 崩溃报告符号化,.ips崩溃报告文件分析
iOS App 崩溃报告符号化,.ips崩溃报告文件分析 2014-09-22, Mon | 评论 本文为翻译整理.来源: Symbolicating iPhone App Crash Reports ...
最新文章
- Git相关二三事(git reflog 和彩色branch)【转】
- Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战
- 从“IBM刀片服务器广告告别电视”说起
- vue常见知识点整理
- Scanner类、Random类、ArrayList类
- Memobus总线光端机产品功能介绍
- 《软件项目管理(第二版)》期中考试试题总结/复习资料
- mysql 命令行批量sql_命令行中执行批量SQL的方法
- 很多人现在还不知道的知识点,Python多进程和多线程详解!
- 【Clickhouse】Connection is currently waiting for an insert operation, check your previous InsertState
- 织梦在哪写html,织梦dedecms模板文件不支持html的解决方法
- 自称世界上最权威监控软件FlexiSpy被黑删库,怎么做到的?
- “安全宝”,云安全服务
- C#(int)中Convert、Parse、TryParse的区别
- 工业读写器行业解决方案
- 转载 提高github下载速度的方法【100%有效】可达到2MB/s
- KGB知识图谱,利用科技解决传统知识图谱问题
- 拉格朗日、牛顿、拟合的应用
- 5G 38.300 Rel15 中文版
- 上海叮咚买菜抢菜程序