Android中处理崩溃异常和分析日志的两种思路

前言:在Android开发app中,想要及时了解线上app的运行情况,须要采集样本日志,也就是常说的log,今天由“懂你行云”授权本公众号独家发布,分享他的《处理崩溃异常和分析日志的两种思路》,懂你行云的blog链接为:http://blog.csdn.net/zhangteng22。下方阅读原文可看他的原文。正文如下:

我们写程序的时候都希望能写出一个没有任何Bug的程序,期望在任何情况下都不会发生程序崩溃。不过理想是丰满的,现实是骨感的。没有一个程序员能保证自己写的程序绝对不会出现异常崩溃。特别是针对用户数达到几十万几百万的程序,当你用户数达到一定数量级后,就算你的程序出现个别异常崩溃情况也不用惊讶。此时及时收集用户的日志成了解决问题的关键。本文从两种方式分析查看日志的方式:

1、在自测阶段或者交给测试部测试阶段出现了:

1,程序异常退出 , uncaused exception 2,程序强制关闭 ,Force Closed (简称FC) 3,程序无响应 , Application No Response (简称ANR) , 顺便,一般主线程超过5秒么有处理就会ANR

将终端的/data/anr/traces.txt文件取出(命令如:adb pull /data/anr/traces.txt C:\)拿到日志文件打开后一看"哇"好长,但是不要害怕log日志虽长,但其实它由三大块儿组成:

1、系统基本信息 ,包括 内存,CPU ,进程队列 ,虚拟内存 , 垃圾回收等信息 。 Heap: 4% free, 66MB/69MB; 164920 objects Dumping cumulative Gc timings Total number of allocations 617049 Total bytes allocated 86MB Free memory 3MB Free memory until GC 3MB Free memory until OOME 189MB Total memory 69MB Max memory 256MB Total mutator paused time: 0 Total time waiting for GC to complete: 598.247us 2、时间信息 , 也是我们主要分析的信息 。 ----- pid 17845 at 2016-10-19 10:59:32 ----- 3、虚拟机信息 , 包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方 。 ----- pid 17845 at 2016-10-19 10:59:32 ----- Cmd line: com.XX.XX

从这么多大堆栈里如何分析出关键问题呢:

1,如果是ANR问题 , 则搜索“ANR”关键词 。 快速定位到关键事件信息 。 2,如果是ForceClosed 和其它异常退出信息,则搜索"Fatal" 关键词, 快速定位到关键事件信息 。 3,定位到关键事件信息后 , 如果信息不够明确的,再去搜索应用程序包的虚拟机信息 ,查看具体的进程和线程跟踪的日志,来定位到代码

该方式适合能够及时拿到终端的情况下进行日志分析,那如果是用户的终端该如何及时分析bug日志呢,采用第二种方法如下

2、应用程序出现问题时采用HTTP的方式将日志及时上报到后台进行分析:

看了网上大部分是采用日志收集的第三方jar包来完成的,还有一种是自定义一个自己的CrashHandler实现UncaughtExceptionHandler接口来捕获闪退信息然后上传到自己的服务器。这样的实现方式总觉得如果用户误删了闪退的日志文件那么就会导致无法及时上报闪退日志,也就无从分析隐藏的Bug了,于是采用另一种实现思路,即:在程序发生异常时提醒用户发生了什么样的异常,同时把本次捕获的Exception的字段写入到自己定义的log文件中,然后上报异常字段到自己的异常服务器上,从手机端或者后台都可以看到发生的异常堆栈。日志记录系统不借助与任何第三方jar包。说干就干,

项目目录如下:

关键代码如下:

1、定义IExceptionHandler接口

2、定义ExceptionHandler实现自IExceptionHandler

3、在AndroidManifest.xml里面配置自己的Application:IApplication,并在里面初始化app日志文件目录

4、采用HTTP方式将实时catch的异常发送到异常服务器,并将异常的堆栈信息写入到SDcard中

5、使用方式:在程序里面采用try catch捕获可能会出现的异常的代码块(界面给出提示,程序不闪退),另一种是没有进行try catch应用程序直接闪退

这样友好的提示也给了用户,异常信息也及时上报了。但是该方式也有自己的缺点:大量的try catch会导致代码的效率不高。

详细代码点击下载(http://download.csdn.net/detail/zhangteng22/9666912)

原文发布于微信公众号 - 何俊林(DriodDeveloper)

原文发表时间:2016-11-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏栗霖积跬步之旅

java并发编程的艺术——第一章总结

并发编程的挑战 1.1上下文切换 1.1.1多线程一定快吗 1.1.2测试上下文切换次数和时长 1.1.3如何减少上下文切换 1.1.4减少上下文切换实战   ...

22760
来自专栏butterfly100

Chris Richardson微服务翻译:微服务之事件驱动的数据管理

Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 ...

29590
来自专栏jessetalks

Windows平台分布式架构实践 - 负载均衡

概述   最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linu...

36270
来自专栏IT大咖说

分布式内存数据库新架构,极速OLTP应用新利器

内容来源:2018 年 11 月 10 日,Oracle 数据库首席产品经理杨琳在“2018 SOUG年度数据库技术峰会”进行《Oracle TimesTen ...

25220
来自专栏java思维导图

缓存在高并发场景下的常见问题

当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策...

14630
来自专栏开源优测

Robot Framework | 01 源码初探

概述 Robot Framework是一个通用的验收测试和验收测试驱动开发自动化测试框架(ATDD)。 它具有易于使用的表格测试数据语法,并使用关键字驱动测试方...

47580
来自专栏JAVA高级架构

缓存架构之防雪崩设计

缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,但是出于容错的考虑,如果从存储层查不到数据则不写入缓存层

16830
来自专栏码神联盟

缓存 | redis和memecache的异同以及应用场景

缓存就是数据交换的缓冲区Cache。当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存...

36390
来自专栏IT技术精选文摘

聊聊C10K问题及解决方案

1 C10K问题 大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个小群体的集合。互联网还不够普及,用户也不多。一台服务器同时在线100个用户估计在当...

66190
来自专栏JetpropelledSnake

Web负载均衡学习笔记之实现负载均衡的几种实现方式

负载均衡(Load Balance)是集群技术(Cluster)的一种应用。负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力。目前最常见的负载均衡...

14050

扫码关注云+社区

领取腾讯云代金券