【腾讯TMQ】Crash 之防测漏篇

作者介绍:陈永洋

做Android/iOS测试也有一段时间了,随着项目壮大,版本crash问题也越来越突出。如何有效地对crash进行预防拦截呢?请看下文。

1.APP闪退背后的秘密

以下画面相信负责过APP项目一定见过,它是怎么出现的呢?

以下为基于Android源码分析的完整代码调用关系:

主流程如下:

使用try...catch语句,那么如果没有有效catch exception,此时系统便会来进行捕获,并进入crash流程(分为六大流程):

1.首先发生crash所在进程,在创建之初便准备好了defaultUncaughtHandler,用来来处理Uncaught Exception,并输出当前crash基本信息;

2.调用当前进程中的AMP.handleApplicationCrash;经过binder ipc机制,传递到system_server进程;

3.接下来,进入system_server进程,调用binder服务端执行AMS.handleApplicationCrash;经过一系列的调用最终痛过mUiHandler发送消息SHOW_ERROR_MSG,弹出crash对话框;

4.到此,system_server进程执行完成。回到crash进程开始执行杀掉当前进程的操作;

5.当crash进程被杀,通过binder死亡通知,告知system_server进程来执行appDiedLocked();

6.最后,执行清理应用相关的activity/service/ContentProvider/receiver组件信息。 可以尝试自己下载最新的源码并查看分析,相关源文件:

RuntimeInit.java

ActivityManagerNative.java

ActivityManagerService.java

ProcessRecord.java

WindowManagerService.java

更多详情可参考这里(http://gityuan.com/2016/06/24/app-crash/)。

2.全面认知Crash

Crash后,我们首先能做些什么呢?测试怎么入手?

最先能想到的是收集crash日志信息:

For Android

Native 程序异常后,会生成tombstone 文件位于路径 /data/tombstones/ 下

Java异常可以在Logcat(adblogcat)日志中看到;

ANR日志会存在系统目录/data/anr/traces.txt

For iOS:

可以连接Mac,通过Xcode->Window->Devices导出对应的crash日志文件。如iPhone设备的CrashLog位置位

于:var/mobile/Library/Logs/CrashReporter

实际项目中都接入了Bugly,APP crash后,会自动上报到分析平台,crash相关的信息相对比较丰富,并可以自动还原异常时调用栈信息(栈还原 加固 混淆 符号化等相关问题都可解决)。

日志信息中,比较关键的信是错误类型。这里带大家了解一下目前移动端关于异常的整体分类情况。

对Android来说主要有以下几种:

iOS下crash大致可如下划分:

除了错误类型信息,还有哪些测试需要重点关注呢?接下来看一下

3.Crash基本分析

对于测试来说,接到crash报告后面临的问题有:

1、crash产生的原因初步分析

2、疑难crash的重现

对于错误信息及栈比较明确的crash,定位起来一般没有什么难度。

如图,栈信息及代码行可以很容易定位到出问题的子模块,排查起来难度不大。

比较复杂的问题可能集中在crash的栈都是系统信息或者第三方库,或者多个模块存在耦合的代码,排查起来难度比较大。

如图,栈里面都是android自己的内容:

对于这类问题,从项目角度可以从提升定位效率及快速重现方面入手:

如目前iOS项目中已经加入了点击流上报,可以辅助定位crash栈中无app代码的疑难问题。

Crash基本分析完成了,是否有办法从源头来减少crash问题呢?当然有↓↓↓

4.Crash之阻击战

随着版本量越来越大,对crash的预估是否力不从心?如何有效地对crash问题进行拦截阻击呢?

以下是crash跟进总结过程中的一些可深入的点,如:

1.体验类问题

体验类问题,如保证异常后的恢复无明显异常:

2.代码质量提升

crash分析总结中,可以把常见的坑,提取成静态扫描规则加入到代码扫描中;

3.通用异常点总结

通过对异常场景的收集总结完善测试分析,规避异常路径未覆盖导致的crash

4.测试覆盖率分析

5.自动化随机测试

6.动态调试

常用于快速复现crash及检测内存相关问题。

5.Crash拦截测试效果一览

通过以上crash拦截手段,也取得了一些效果:

1.Klocwork代码扫描

2.iOS目前接入Infer

iOS目前接入Infer,扫描问题100+:

3.自定义扫描规则

自定义扫描规则,扫描问题200+:

4.Monkey等随机点击测试

Monkey等随机点击测试,发现问题10+;

6.常见Crash列表补充

下面是一些常见的crash列表,供参考

7.一些参考资料

1、【Android】Android Crash之异常信息反馈机制

http://blog.csdn.net/u010119170/article/details/38236991

2、 理解Android Crash处理流程

http://gityuan.com/2016/06/24/app-crash/#handleApplicationCrashInner

3、 理解Native Crash处理流程

http://gityuan.com/2016/06/25/android-native-crash/

4、 iOS崩溃crash大解析

http://www.jianshu.com/p/1b804426d212

5、 Throwable、Error、Exception、RuntimeException 区别 联系

http://blog.csdn.net/liuj2511981/article/details/8524418

6、 Android的crash的类型及原因

http://blog.csdn.net/wtyvhreal/article/details/45146531

7、 Android NDK Tombstone/Crash 分析

http://woshijpf.github.io/2016/06/14/Android-NDK-Tombstone-Crash-分析/

8、 分析iOS Crash文件:符号化iOS Crash文件的3种方法

http://wufawei.com/2014/03/symbolicating-ios-crash-logs/

9、 iOS 启动连续闪退保护方案

https://wereadteam.github.io/2016/05/23/GYBootingProtection/

10、 Throwable

https://developer.android.com/reference/java/lang/Throwable.html

11、 iOS调试之 crash log分析

http://www.jianshu.com/p/12a2402b29c2

12、 分析iOS Crash文件:符号化iOS Crash文件的3种方法

http://www.cocoachina.com/industry/20140514/8418.html

13、 Understanding iOS Exception Types

http://www.5neo.be/understanding-ios-exception-types/

14、 Unix signal

https://en.wikipedia.org/wiki/Unix_signal

15、 Handling unhandled exceptions and signals

https://www.cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html

您是否也曾为线上crash问题烦恼呢?如果有,您是如何应对的呢?

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏达摩兵的技术空间

app中的webview通识篇(上)

如果你还是第一次与app合作开发webview的页面,那么对于如何调试,可能有哪些问题可能是不够了解的。本文尝试性的根据自己的经验给大家一个入门级别的了解,如果...

2042
来自专栏Grace development

PHP程序员如何简单的开展服务治理架构(二)

服务治理 治理的绝笔是服务,在一家公司有玩各种语言的程序员,如何去统一管理他们开发的服务,这是一个问题。

1322
来自专栏鹅厂优文

鹅厂优文 | 企点PC端性能测试-UI卡顿分析

本文以一个企点融合工作台测试中发现的案例说明如何获得UI卡顿数据,以及如何分析数据,定位问题。

99912
来自专栏腾讯移动品质中心TMQ的专栏

Crash之防测漏篇

做Android/iOS测试也有一段时间了,随着项目壮大,版本crash问题也越来越突出。如何有效地对crash进行预防拦截呢?请看下文。 1 APP闪退背后...

2428
来自专栏芋道源码1024

10 分钟不全面了解 Redis 5.0 新特性

来源:https://www.jianshu.com/p/fa989a228d59

1040
来自专栏程序人生

深入了解IAM和访问控制

本文为InfoQ中文站特供稿件,首发地址为:http://www.infoq.com/cn/articles/aws-iam-dive-in。 访问控制,换句话...

4477
来自专栏phodal

哪个才是最适合你的 Web UI 自动化测试框架

最近,项目上出于系统性稳定性、减少测试工作量考虑,打算在 Web 前端引入 BDD。由于上一个项目写了一定的 Cucumber 代码(BDD 测试框架之一),这...

6947
来自专栏信安之路

用powershell下载文件的姿势你研究过吗?

PowerShell 的最大优势在于以 .NET 框架为基础。 .NET 框架在脚本领域几乎是无所不能,这是一个优点,也有可能成为一个方便黑客攻击的一个强大的便...

2210
来自专栏云瓣

用 Node.js 把玩一番 Alfred Workflow

作为 Mac 上常年位居神器榜第一位的软件来说,Alfred 给我们带来的便利是不言而喻的,其中 workflow(工作流) 功不可没,在它上面可以轻松地查找任...

3813
来自专栏FreeBuf

跨平台版中国菜刀Cknife发布

Burp已经成了绿帽子门必不可少的工具,相信大家都装有Java环境,本软件支持1.7+以及所有安装了环境的系统。1.6后续会考虑兼容。 一直都有想写一款真正...

5447

扫码关注云+社区