ANR基础
转自:http://blog.sina.com.cn/s/blog_c0de2be70102wd1k.html
1、ANR
basic knowledge
ANR分类:
Key Dispatch Timeout
Service Timeout
Broadcast Timeout
关键词:
event log: “am_anr”
trace.txt -java
-native
CPU usage ago
CPU usage later
iowait
“Early ANR” = The first ANR
2、How
to read Event Log
一些信息没有在logcat
log中而是在event
log中,查看event
log对与解决ANR问题很有帮助。
1) event log定义:
event.logtags
( in code path
/system/core/logcat/event.logtags )
( in phone path /system/etc/event-log-tags
)
event.logtags:
30008 am_anr (pid|1|5),(Package
Name|3),(Flags|1|5),(reason|3)
Source Code ActivityManagerService.java:
EventLog.writeEvent(EventLogTags.AM_ANR,
app.pid, app.processName...))
2) Log Example:
I/am_anr ( 1776):
[3274,com.sonyericsson.home,572997,keyDispatchingTimedOut]
3) Event: am_anr
system/core/logcat/event.logtags
52004 binder_sample (descriptor|3),(method_num|1|5),(time|1|3),(blocking_package|3),(sample_percent|1|6)
# Application Not Responding
30008 am_anr (pid|1|5),(Package
Name|3),(Flags|1|5),(reason|3)
I/am_anr ( 1776):
[3274,com.sonyericsson.home,572997,keyDispatchingTimedOut]
4) 重要的event
log标志:
db_sample
content_query_sample
content_update_sample
binder sample
dvm_lock_sample
Activity Event Series:
am_proc_start
am_restart_activity
am_on_resume_called
am_finish_activity
am_pause_activity
am_on_paused_called
am_destroy_activity
5) Database related:
定义:
52000 db_sample
(db|3),(sql|3),(time|1|3),(blocking_package|3), (sample_percent|1|6)
# Database operation samples.
# db: 数据库文件名
# sql: the executed query (without query args)
# time: cpu time millis (not wall time),
including lock acquisition
# blocking_package: if this is on a main
thread, the package name, otherwise ""
# sample_percent: the percent likelihood this
query was logged (based on 500ms)
sample_percent? If time >= 500ms, then
sample_percent show 100.
例子1:
I/db_sample(27898):
[/data/data/com.facebook.katana/databases/fb.db,INSERT INTO
cache(value, timestamp, name) VALUES(?, ?,
?);,99,com.facebook.katana,20]
信息解析:
Database:
/data/data/com.facebook.katana/databases/fb.db
Sql: INSERT INTO cache(value, timestamp, name)
VALUES(?, ?, ?)
Time spent: 99ms
This database operation runs in
com.facebook.katana main thread.
例子2:
I/db_sample(26092):
[/data/data/com.google.android.gm/databases/XX@YY,COMMIT;DELETE FROM
messages WHERE conversation = ? AND synced = ,797,,100]
6) Events : binder_sample
定义:
52004 binder_sample (descriptor|3),(method_num|1|5),(time|1|3),(blocking_package|3),(sample_percent|1|6)
descriptor:接口描述符(任何一个binder都实现一个接口,IPC调用用的API,任何一个接口都有一个描述符,即一个字符串)
method_num:调用的方法的序列号
time:该方法调用耗用的时间
(从client端发起到server端完成并返回)
blocking_package:从哪个进程发起的调用
例子:
I/binder_sample( 520):
[com.android.internal.telephony.ITelephonyRegistry,7,12518,com.android.phone,100]
含义:从com.android.phone主线程发起了一个ITelephonyRegistry接口的第7个方法的binder调用,耗时12s。
(从后面的源代码可知,系统只记录从主线程发起的binder通讯)
查可知有ITelephonyRegistry.aidl,系统编译后会自动生成ITelephonyRegistry.java文件,里面定义了方法的序号。
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/telephony/java/com/android/internal/telephony/ITelephonyRegistry.java
private static final java.lang.String DESCRIPTOR
= "com.android.internal.telephony.ITelephonyRegistry";
static final int TRANSACTION_listen =
(android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_notifyCallState =
(android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
......
static final int
TRANSACTION_notifyDataConnection =
(android.os.IBinder.FIRST_CALL_TRANSACTION + 7);
由此知第7个方法是notifyDataConnection()
7) Events : dvm_lock_sample
定义:
dvm_lock_sample
(process|3),(main|1|5),(thread|3),(time|1|3),(file|3),(line|1|5),(ownerfile|3),(ownerline|1|5),(sample_percent|1|6)
dvm_lock_sample会记录所有线程在java层(即dvm层)获取锁的记录。该log在获取到锁之后输出。
包括:所属进程,是否为主线程,线程名称,获取锁所用的时间,获取锁代码所在的源文件,行号,锁被占有的代码所在的源文件,行号,耗用时间所占比例。
如果ownerfile与file相同,用"-"表示。
Example:
11-25 14:14:24.140 I/dvm_lock_sample( 296):
[system_server,0,Binder Thread #10,12515,
PackageManagerService.java,1719,-,682,100]
含义:Binder
Thread #10 ,非主线程,属于system_server进程,获取锁耗用了12s,
PackageManagerService.java, line
1719获取锁,PackageManagerService.java,line
682占用了锁。
3、OOM
Memory leak will cause ANR. Because when
memory is low, normal operations will be blocked for lack of memory
or wait GC to collect memory, this will make normal operations taking
much more time than before. Low memory will cause system into very
bad performance, ANR occurrence rate will increase greatly in this
condition. You will see many out of memory issues are along with ANR
issues.
If you see frequent ANR occurs in short time
and system is in OOM condition. These ANRs often can be ignored. We
should put effert on fixing memory leak. When the memory leak is
fixed, these ANRs should disappear.
There are 2 kinds of OOM. One is OOM in one
dvm process. Another is system overall memory is not enough.
1) OOM in one dvm process
One process, one dvm, one GC.
Dvm heap limit in ICS: Change from
dalvik.vm.heapsize to dalvik.vm.heapgrowthlimit (64Mb now in ginger
fuji ICS)
D/dalvikvm( 216): GC_CONCURRENT freed 4443K,
54% free 28546K/61347K, paused 4ms+20ms
系统为进程216分配了61347K的dvm
heap,有54%
free,分母代表了历史上对Heap的最大需求。
D/dalvikvm( 3142): GC_BEFORE_OOM freed 10K, 2%
free 64421K/65571K, paused 258msE/dalvikvm-heap( 3142): Out of memory
on a 335888-byte allocation.
2) System overall OOM
Kernel oom killer – when there is no enough
memory for allocating.
内核kernel
log:
init invoked oom-killer: gfp_mask=0xd0, order=2,
oom_adj=-16, oom_score_adj=-941
[] (>] (pgd_alloc+0x14/0xe0)
...... unwind_backtrace+0x0/0x12c) from
[] (dump_header.clone.1+0xd8/0x22c)
]
(dump_header.clone.1+0xd8/0x22c) from []
(oom_kill_process.clone.0+0x40/0x33c)
[]
(oom_kill_process.clone.0+0x40/0x33c) from []
(out_of_memory+0x328/0x458)
[] (out_of_memory+0x328/0x458)
from [] (__alloc_pages_nodemask+0x4a0/0x608)
[]
(__alloc_pages_nodemask+0x4a0/0x608) from []
(__get_free_pages+0x10/0x24)
[] (__get_free_pages+0x10/0x24)
from [
[] (sys_fork+0x28/0x2c) from
[] (ret_fast_syscall+0x0/0x30)
……
Out of memory: Kill process 22591
(ckscreen.uxpnxt) score 754 or sacrifice child
Killed process 22591 (ckscreen.uxpnxt)
total-vm:466932kB, anon-rss:23168kB, file-rss:8396kB
Android Low memory killer – when memory
decrease to some value. So, it doesn’t mean memory is used up.
select 1381 (android.browser), adj 7, size
22194, to kill
select 18759 (ndroid.crashsms), adj 8, size
7129, to kill
ANR基础的更多相关文章
- 谈谈 ANR 之 Service 超时
1. 核心源码 关键类 路径(/frameworks/base/) ActiveServices.java services/core/java/com/android/server/am/Activ ...
- Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式
前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...
- Android源码剖析之Framework层基础版(窗口、linux、token、Binder)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMang ...
- Android基础总结(8)——服务
服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...
- Android UI基础教程 目录
从csdn下载了这本英文版的书之后,又去京东搞了一个中文目录下来.对照着看. 话说,这本书绝对超值.有money的童鞋看完英文版记得去买中文版的~~ Android UI基础教程完整英文版 pdf+源 ...
- Android 系统稳定性 - ANR(一)
文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任.很久之前写的了,留着有点浪费,共享之.编写者:李文栋 如果你是一个Android应用程序开发人员,你的人生中不可避免的三件事情是:死亡.缴 ...
- BroadcastReceiver基础总结
BroadcastReceiver基础总结 BroadcastReceiver是Android四大组件之一,主要负责接收系统或其他程序发出的广播,在开发中,通常用做事件驱动的起源,比如开机就要开启一个 ...
- Android Service基础
Service Service 是一个组件,用来执行长时间的后台操作,不提供用户界面. 另一个应用组件可以启动一个Service,它将持续地在后台运行,即便是用户转移到另一个应用它也不会停止. 另外, ...
- Android基础知识(一)
前言 前言 从软件测试最终目的发现问题缺陷来看,Findyou比较认同一个观念,测试的能力大致可以划分成三个能力层次:发现问题.定位问题.预防问题.有机会探讨一下这个分类. 发现问题各种方式方法,比如 ...
随机推荐
- 一维码ITF 25简介及其解码实现(zxing-cpp)
一维码ITF 25又称交插25条码,常用在序号,外箱编号等应用.交插25码是一种条和空都表示信息的条码,交插25码有两种单元宽度,每一个条码字符由五个单元组成,其中二个宽单元,三个窄单元.在一个交插2 ...
- Codeforces 912 E.Prime Gift (折半枚举、二分)
题目链接:Prime Gift 题意: 给出了n(1<=n<=16)个互不相同的质数pi(2<=pi<=100),现在要求第k大个约数全在所给质数集的数.(保证这个数不超过1e ...
- linux 安全狗安装问题
先下载安装包wget http://download.safedog.cn/safedog_linux64.tar.gz ls tar xzvf safedog_linux64.tar.gz ls c ...
- JAVAWEB dbutils执行sql命令并遍历结果集时不能查到内容的原因
遍历结果集时只遍历bean对象才会只输出第一行那种内容(第一行是输出了UserEntity类实例化的对象),所以这里需要 re.getRepoTableName() 才能通过对象调用相对应的内容 这样 ...
- angularjs 常用方法
一 angular的copy和extend 1.angular.extend() angular.extend():依次将第二个参数及后续的参数的第一层属性(不管是简单的属性还是对象)拷贝,赋给第一个 ...
- java 或者 js 获取项目访问路径(域名)
/** * 获得站点url * @return */ public String getWebUrl(){ String url = getRequest().getScheme() + " ...
- MySQL数据库查询某个库下有几张数据表
如果统计某数据库中存在多少张数据表,使用如下SQL检索语句即可: SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES ...
- selenium select 选择下拉框
实战百度首页设置,浏览偏好设置. 打开首页,在非登录的情况下,查看分析页面元素,我们可以看到,我们首先要点击的是设置, 接着点击,搜索设置, 然后select选择下拉框. select_by_inde ...
- Android Service(下)
阅读本文需要先阅读Android Service(上) 一 为什么需要bindService() 绑定服务就是为了和服务进行通讯 可以调用服务里面的方法 二 bindService()调用服务里面方法 ...
- 用Unity的UGUI实现简单摇杆
1.在Canvas下新建一个空对象作为我们的摇杆,命名为Joystick. 摇杆由背景和杆两部分组成,所以在Joystick下新建一个Image作为摇杆的背景,命名为BG. 在BG下新建一个Image ...