ANR 分析思路浅析

一、引言

ANR问题是android中常见且令人头疼的问题,相当多的时候不易直接分析出原因。

二、ANR的定义  

下面先看下百度百科给ANR的定义:

ANR问题常因在main(主线程)线程执行了复杂耗时的操作,比如文件IO、网络访问、无限循环等,最终无奈地被系统抛出ANR。

三、ANR的一般分析思路

1) 从手机的/data/traces/目录导出traces.txt文件;

2) 从traces.txt文件获取ANR产生的时间点T1;

3) 从traces.txt文件获取main线程的运行状态、调用栈;

4) 查看logcat日志,搜索"ANR in",找出ANR产生的时间点T2,以及时间点T2 前后几秒钟,在系统中运行的各进程CPU耗时占比;

5) 在步骤4)找出目标进程的cpu耗时占比,确认是user占比高,还是kernel占比高,还是iowait占比高;

6) 根据时间点T1、时间点T2,校准ANR产生的时间范围 [T1, T2] 或 [T2, T1];

7) 查看logcat日志,将日志定位到步骤2)中获取的时间点 [T1, T2] 或 [T2, T1]附近;

8) 查看logcat日志在时间点 [T1, T2] 或 [T2, T1]附近前后2分钟的日志,以还原ANR产生前后的场景;

9) 根据以上步骤得出的信息,定位代码中可能的问题代码块;

10) 解决问题,或提出阶段分析结论。

四、ANR的分析示例

产生ANR后,系统会在/data/traces/下生成traces.txt文件,我们首先将该traces.txt文件从手机对应的目录导出。

打开traces.txt后,先确认产生ANR的进程及ANR产生时间,如下图红框所示,产生ANR的进程是cn.evergrande.it.phone,ANR产生的时间是2018-08-16 10:34:43

注意,在ANR分析中,ANR产生的时间点非常重要,是串接traces.txt和logcat相关日志线索的连接线,是推理ANR产生原因的重要线索。

  继续分析traces.txt,找到cn.evergrande.it.phone进程的main线程调用栈快照,如下图所示,main线程在2018-08-16 10:34:43处于Runnable状态,并且正在

执行java层代码以测量layout布局中的RecylerView。

  查看logcat日志,搜索"ANR in",定位到如下图所示的CPU usage from 35958ms to 0ms ago部分的日志,可知 2018-08-16 10:34:07.5462018-08-16 10:34:43.504 时间段,cn.evergrande.it.phone进程并没有较多的cpu占比。

  继续查看CPU usage from 372ms to 893ms later部分的日志,可知在 2018-08-16 10:34:43.8772018-08-16 10:34:44.398 时间段,ANR问题开始出现,

其中cn.evergrande.it.phone进程的grande.it.phone、HDLogicThread-2、ReqTimer三个线程的cpu占比都比较高,可推断是cn.evergrande.it.phone进程引发了ANR。

    综合上述ago、later两部分的ANR日志,基本可以断定ANR产生的源头是cn.evergrande.it.phone进程,

其中,线程grande.it.phone的线程id是20974、HDLogicThread-2的线程id是21000,ReqTimer的线程id是20974,而在traces.txt中,main的线程id是20974,所以可断定是

cn.evergrande.it.phone进程阻塞引发了ANR。

  接下来要确认ANR产生的原因,先校准ANR产生的时间点,

  1) traces.txt给出的时间点是 2018-08-16 10:34:43

  2) logcat给出的时间范围是  2018-08-16 10:34:43.877 到 2018-08-16 10:34:44.398

  综合1)、2)时间(点)的交集,校准后的ANR产生时间范围是 2018-08-16 10:34:43.877 到 2018-08-16 10:34:44.398。

  接下来,查看logcat在 2018-08-16 10:34:43.877 到 2018-08-16 10:34:44.398范围的日志,还原ANR产生时的情景。

  上图日志显示了logcat在 2018-08-16 10:34:43.877 到 2018-08-16 10:34:44.398附近的日志,可还原出此时间段系统正在播放音乐、用户正在操作进度条控制音乐的播放,

但并没有与ANR产生原因相关的线索,由于traces.txt是在main线程Runnable时生成的,所以不能从main的调用栈分析出ANR产生的可能原因。

五、小结

  第四节中举的示例是没有足够数据,以分析出产生ANR的原因,但本文旨在告诉读者一种分析ANR的思路,以供大家借鉴和不断完善。

原文地址:https://www.cnblogs.com/tgltt/p/9849792.html

时间: 2024-11-05 17:18:30

ANR 分析思路浅析的相关文章

多线程_java多线程环境下栈信息分析思路

导读:Java多线程开发给程序带来好处的同时,由于多线程程序导致的问题也越来越多,而且对问题的查找和分析解决对于菜鸟程序原来是是件头疼的事.下面我就项目中使用多线程开发程序过程中遇到的问题做详细的分析和解决思路的分享.本人也属菜鸟,忘大神指点. 项目描述: 工作中要编写一份程序用于爬取某某网站上的大量图片.从HBase里面遍历出所有的爬取任务,开启固定大小的线程池Executors.newFixedThreadPool(100),提交线程,线程每个线程做的事情是使用FileUtils.copyU

CPU利用率异常的分析思路和方法交流探讨

CPU利用率异常的分析思路和方法交流探讨在生产运行当中,经常会遇到CPU利用率异常或者不符合预期的情况,此时,往往暗示着系统性能问题.那么究竟是核心应用的问题?是监控工具的问题?还是系统.硬件.网络层面的问题?在上线前的测试过程中,经常会遇到新版本应用的CPU占用率比旧版本高,那么到底是新增的或者变更的什么模块导致呢?面对这种情况,我们应该如何定位和诊断问题的根本原因? 本期专题讨论会分享采用什么样的分析思路.分析方法和分析工具进行CPU使用情况的分析:并帮助大家解答以下问题: 1. CPU利用

第一次OllyDbg逆向记录(分析思路和注意点&其他文章)

OllyDbg 操作菜单栏.工具栏.快捷键 C++调用加强 目录 OllyDbg 操作菜单栏.工具栏.快捷键    1 一.    载入观察    1 1.静态载入观察:    1 2.OD动态观察    1 二.    初步尝试下断查找目标    1 1.如何下断    1 2.接下来有两个选择:    1 2.1手动F9运行目标    1 2.2设条件断点    1 2.3 CALL调用时堆栈小解    1 3.初步断点目标 (条件触发情况)    1 三.调用栈回溯    1 1.回溯到无

性能测试通用分析思路和报告编写技巧

1. 通用分析思路 观察现象-->层层递进-->缩小范围-->推理分析-->不断验证-->确定结论 观察现象:现象只要是指页面的表现.服务器的资源表现.各类中间件的健康度.log日志. 各类软件的参数.各类数据库的健康度等. 需要关注的公共指标:响应时间.TPS.QPS.成功率.CPU.MEMORY.IO.连接数.进程\线程数.缓存命中率.流量等: 除了公共指标外,还有一些针对具体系统软件需要监控的指标.比如,JVM中各内存代的回收情况以及GC的情况,PHP-FPM中的max

性能测试-服务端瓶颈分析思路

概述 性能测试中,对服务端的指标监控也是很重要的一个环节.通过对各项服务器性能指标的监控分析,可以定位到性能瓶颈. 后端性能指标有CPU,内存,网络,I/O等等 分析思路 整体系统CPU利用率 内存利用率 磁盘I/O的利用率和延迟 网络利用率 CPU定位分析 CPU利用率大于50%,需要注意:大于70%,需要密切关注:高于90%,情况比较严重. 监控命令:vmstat.sar.dstat.mpstat.top.ps 类型 度量方法 衡量标准 利用率 1.vmstat 统计1-%idle 2.sa

思维四:常用主题的商业分析思路分享

接着上一篇,如何设计商业仪表版的故事线,今天也为大家分享一下我们通常碰到的商业分析思路-销售主题.对于销售主题而言,最重要的就是业绩,那在分析中,我们如何通过数据来诠释业绩呢?业绩做了多少?做的好还是不好?有没有潜在的什么问题需要规避?这些问题的影响大不大呢?今天我们就围绕这如何解答这些问题,来设计一个仪表板. 首先,要回答这些问题,一定要有方法,而数据分析最常用也是最有效的方法就是计算和对比,计算也就是用DAX写度量值,但度量值不在于多,而在于重要,也就是大家通常所说的KPI-关键绩效指标,比

性能瓶颈分析思路

性能瓶颈分析思路 性能分析是一个大课题,不同的架构.不同的应用场景.不同的程序语言分析的方法各有差异,抽象一下大致分为二类: 自底向上:通过监控硬件及操作系统性能指标(CPU.内存.磁盘.网络等硬件资源的性能指标)来分析性能问题(配置.程序等的问题).因为用户请求最终是由计算机硬件设备来完成的,做事的是 CPU. 自顶向下:通过生成负载来观察被测试的系统性能,比如响应时间.吞吐量:然后从请求起点由外及里一层一层的分析,从而找到性能问题所在. 不管是自底向上还是自顶向下,关键点就是生成负载.监控性

常见的内存问题分析思路

一 系统内存不足 Java 应用一般都有单机或者集群的内存水位监控,如果单机的内存利用率大于 95%,或者集群的内存利用率大于80%,就说明可能存在潜在的内存问题(注:这里的内存水位是系统内存). 除了一些较极端的情况,一般系统内存不足,大概率是由 Java 应用引起的.使用 top 命令时,我们可以看到 Java 应用进程的实际内存占用,其中 RES 表示进程的常驻内存使用,VIRT 表示进程的虚拟内存占用,内存大小的关系为:VIRT > RES > Java 应用实际使用的堆大小.除了堆内

SPSSAU数据分析思维培养系列3:分析思路

本文章为SPSSAU数据分析思维培养的第3期文章. 上文讲解如何选择正确的分析方法,除了有正确的分析方法外,还需要把分析方法进行灵活运用.拿到一份数据,应该如何进行分析,总共有几个步骤,第一步第二步应该做什么,需要有个宏观把控,只有这样才能有规范的研究科学的思维和逻辑. 本文章首先阐述数据的整体思维,即整体把控住应该如何剖析一份数据做到心理有数,接着针对常见的问卷进行思维剖析,并且提供思路框架,期许为大家带来一丝丝帮助. 第一部分 把控数据思维 如果想要把控好数据思维,简单来讲在拿到一份数据后如