ANR调试过程分析
2016-02-16 10:26
281 查看
1 anr 类型
ANR: Application Not Responding
Include 3 types:
1.1 Key Dispatching timeout ANR(5s)
The input event don’t responding in specified time which is defined in ActivityManagerService.java such as 5 second and then ANR happened. At this time the main thread must been blocked, maybe it try to do a network access such as check update or send http request in ui thread, or do database operation or do some work like image convert.
How to solve the problem? Maybe you need a dependent thread to do these time consuming work or use handler to do connection work between UI thread and other threads. And avoided the use sleep(), wait() api or synchronized methods in main thread.
1.2 Broadcast timeout ANR(10s)
The main thread can’t execute the OnReceive function on specified time such as 10s for foreground application and 20s for background application.
1.3 Service execution timeout ANR(20s)
In this case, the anr happened means that the main thread can’t execute the OnCreate or On StartCommand of Service finish in 20s
2 Main thread
include:
1). Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc
2). AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc
3). Mainthread handler: handleMessage(), post*(runnable r), etc
4.) other
3 Debug SOP
I always follow the steps to debug ANR issue.
1) get the lagcat information and focus on the log that 10 seconds before ANR was happened.
2) Analysis the call stack from trace.txt
3) Get the real reason of ANR, such as iowait?Block?Memoryleak?
4) Review the relative code
4 ANR Case
4.1 Case 1:
ContentResolver in AsyncTask onPostExecute, high iowait
Do database operation
4.2 Case 2
R/W internet data block the ui thread
Set timeout or move the network operate to a new thread
4.3 Case 3
Memeryleak: createbitmap that case the gc happened and then ANR
ANR: Application Not Responding
Include 3 types:
1.1 Key Dispatching timeout ANR(5s)
The input event don’t responding in specified time which is defined in ActivityManagerService.java such as 5 second and then ANR happened. At this time the main thread must been blocked, maybe it try to do a network access such as check update or send http request in ui thread, or do database operation or do some work like image convert.
How to solve the problem? Maybe you need a dependent thread to do these time consuming work or use handler to do connection work between UI thread and other threads. And avoided the use sleep(), wait() api or synchronized methods in main thread.
1.2 Broadcast timeout ANR(10s)
The main thread can’t execute the OnReceive function on specified time such as 10s for foreground application and 20s for background application.
1.3 Service execution timeout ANR(20s)
In this case, the anr happened means that the main thread can’t execute the OnCreate or On StartCommand of Service finish in 20s
2 Main thread
include:
1). Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc
2). AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc
3). Mainthread handler: handleMessage(), post*(runnable r), etc
4.) other
3 Debug SOP
I always follow the steps to debug ANR issue.
1) get the lagcat information and focus on the log that 10 seconds before ANR was happened.
2) Analysis the call stack from trace.txt
3) Get the real reason of ANR, such as iowait?Block?Memoryleak?
4) Review the relative code
4 ANR Case
4.1 Case 1:
ContentResolver in AsyncTask onPostExecute, high iowait
Do database operation
Process:com.android.email Activity:com.android.email/.activity.MessageView Subject:keyDispatchingTimedOut CPU usage from 2550ms to -2814ms ago: 5%187/system_server: 3.5% user + 1.4% kernel / faults: 86 minor 20major 4.4% 1134/com.android.email: 0.7% user + 3.7% kernel /faults: 38 minor 19 major 4% 372/com.android.eventstream: 0.7%user + 3.3% kernel / faults: 6 minor 1.1% 272/com.android.phone:0.9% user + 0.1% kernel / faults: 33 minor 0.9%252/com.android.systemui: 0.9% user + 0% kernel 0%409/com.android.eventstream.telephonyplugin: 0% user + 0% kernel /faults: 2 minor 0.1% 632/com.android.devicemonitor: 0.1% user + 0%kernel 100%TOTAL: 6.9% user + 8.2% kernel +84%iowait -----pid 1134 at 2010-12-17 17:46:51 ----- Cmd line:com.android.email DALVIK THREADS: (mutexes: tll=0 tsl=0tscl=0 ghl=0 hwl=0 hwll=0) "main" prio=5 tid=1 WAIT |group="main" sCount=1 dsCount=0 obj=0x2aaca180self=0xcf20 | sysTid=1134 nice=0 sched=0/0 cgrp=[fopen-error:2]handle=1876218976 at java.lang.Object.wait(Native Method) -waiting on <0x2aaca218> (a java.lang.VMThread) atjava.lang.Thread.parkFor(Thread.java:1424) atjava.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) atsun.misc.Unsafe.park(Unsafe.java:337) atjava.util.concurrent.locks.LockSupport.park(LockSupport.java:157) atjava.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:808) atjava.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:841) atjava.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1171) atjava.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:200) atjava.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) atandroid.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:378) atandroid.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:222) atandroid.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53) atandroid.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356) atandroid.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1235) atandroid.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1189) atandroid.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1271) atcom.android.email.provider.EmailProvider.query(EmailProvider.java:1098) atandroid.content.ContentProvider$Transport.query(ContentProvider.java:187) atandroid.content.ContentResolver.query(ContentResolver.java:268) atcom.android.email.provider.EmailContent$Message.restoreMessageWithId(EmailContent.java:648) atcom.android.email.Controller.setMessageRead(Controller.java:658) atcom.android.email.activity.MessageView.onMarkAsRead(MessageView.java:700) atcom.android.email.activity.MessageView.access$2500(MessageView.java:98) atcom.android.email.activity.MessageView$LoadBodyTask.onPostExecute(MessageView.java:1290) atcom.android.email.activity.MessageView$LoadBodyTask.onPostExecute(MessageView.java:1255) atandroid.os.AsyncTask.finish(AsyncTask.java:417) atandroid.os.AsyncTask.access$300(AsyncTask.java:127) atandroid.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) atandroid.os.Handler.dispatchMessage(Handler.java:99) atandroid.os.Looper.loop(Looper.java:123) atandroid.app.ActivityThread.main(ActivityThread.java:3652) atjava.lang.reflect.Method.invokeNative(Native Method) atjava.lang.reflect.Method.invoke(Method.java:507) atcom.android.internal.os.ZygoteIn |
R/W internet data block the ui thread
Set timeout or move the network operate to a new thread
ANRin process: com.android.mediascape:PhotoViewer (last incom.android.mediascape:PhotoViewer) Annotation:keyDispatchingTimedOut CPU usage: Load: 6.74 / 6.89 / 6.12 CPUusage from 8254ms to 3224ms ago: ovider.webmedia: 4% = 4% user +0% kernel / faults: 68 minor system_server: 2% = 1% user + 0%kernel / faults: 18 minor re-initialized>: 0% = 0% user + 0%kernel / faults: 50 minor events/0: 0% = 0% user + 0%kernel TOTAL:7% = 6% user + 1% kernel DALVIKTHREADS: ""main"" prio=5 tid=3 NATIVE |group=""main"" sCount=1 dsCount=0 s=Yobj=0x4001b240 self=0xbda8 | sysTid=2579 nice=0 sched=0/0cgrp=unknown handle=-1343993184 atorg.apache.harmony.luni.platform.OSNetworkSystem.receiveStreamImpl(NativeMethod) atorg.apache.harmony.luni.platform.OSNetworkSystem.receiveStream(OSNetworkSystem.java:478) atorg.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:565) atorg.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:87) atorg.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection$LimitedInputStream.read(HttpURLConnection.java:303) atjava.io.InputStream.read(InputStream.java:133) atjava.io.BufferedInputStream.fillbuf(BufferedInputStream.java:157) atjava.io.BufferedInputStream.read(BufferedInputStream.java:346) atandroid.graphics.BitmapFactory.nativeDecodeStream(Native Method) atandroid.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459) atcom.android.mediascape.activity.PhotoViewerActivity.getPreviewImage(PhotoViewerActivity.java:4465) atcom.android.mediascape.activity.PhotoViewerActivity.dispPreview(PhotoViewerActivity.java:4406) atcom.android.mediascape.activity.PhotoViewerActivity.access$6500(PhotoViewerActivity.java:125) atcom.android.mediascape.activity.PhotoViewerActivity$33$1.run(PhotoViewerActivity.java:4558) atandroid.os.Handler.handleCallback(Handler.java:587) atandroid.os.Handler.dispatchMessage(Handler.java:92) atandroid.os.Looper.loop(Looper.java:123) atandroid.app.ActivityThread.main(ActivityThread.java:4370) atjava.lang.reflect.Method.invokeNative(Native Method) atjava.lang.reflect.Method.invoke(Method.java:521) atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) atdalvik.system.NativeStart.main(Native Method) |
Memeryleak: createbitmap that case the gc happened and then ANR
相关文章推荐
- Objective-C中new与alloc/init的区别
- 磁盘性能分析二:IO负载高的来源定位
- JAVA项目中发布WebService服务——简单实例
- 利用network filter限制虚拟机上外网实例
- 自定义控件之NumberTextBox
- linux命令分享一:压缩命令
- Java使用MyEclipse构建webService简单案例
- 编译osgcal
- JAVA开发WebService实例整理
- C#中的System.Speech命名空间初探
- 怎么将导航栏始终固定在窗口顶部,类似bootstrap 的navbar-fixed-top
- source insight 中文注释为乱码解决
- C#中的System.Speech命名空间初探
- Android4.0.x Home键事件拦截监听的方法
- 自定义广播、广播接受者优先级、拦截广播
- 面向对象设计6大原则之四(依赖倒置原则)-让项目拥有变化的能力
- 应用系统之间数据传输的几种方式
- SUID SGID SBIT
- 1071. Speech Patterns (25)
- 学习asp.net里的HttpModule