我在调试应用程序时遇到问题。这是一个数据收集应用程序,每个“工作”大约需要15分钟才能完成,其中快速连续完成的多个工作是正常使用情况。是如何调试ANR
我看到的症状如下:应用程序显示一个ANR消息
应用程序已经运行了20分钟和90之间后。我说20和90之间,因为ANR出现的时间是可变的;有时会在第二份工作中弹出,有时候你可以在弹出之前找到工作8。
一旦ANR出现,我选择“等待”,对话框被解除,所以我继续工作......现在每隔5分钟(没有失败!)ANR不断重新出现。每当我选择“等待”,5分钟后它就会回来。
在我的应用程序中没有postLayed或AlarmManager或TimerTask,它们在5分钟的时间内触发。 ANR消息明确说“SHADE没有响应”,我的应用程序被称为SHADE,所以Android肯定认为它是我的应用程序导致的问题。
我遵循了打开StrictMode的建议,但无济于事,日志在ANR时间附近的任何地方都没有任何StrictMode违规。
10-16 17:11:28.390 D/StrictMode(29898): StrictMode policy violation; ~duration=8 ms: android.os.StrictMode$StrictModeDiskWriteViolation: policy=2335 violation=1
10-16 17:14:09.180 D/CrashAnrDetector( 869): Subject: Executing service com.ancoris.shade/.ShadeService
10-16 17:19:22.560 D/CrashAnrDetector( 869): Subject: Executing service com.ancoris.shade/.ShadeService
10-16 17:24:30.010 D/CrashAnrDetector( 869): Subject: Executing service com.ancoris.shade/.ShadeService
10-16 17:29:39.860 D/CrashAnrDetector( 869): Subject: Executing service com.ancoris.shade/.ShadeService
10-16 17:34:46.860 D/CrashAnrDetector( 869): Subject: Executing service com.ancoris.shade/.ShadeService
最后的违规发生在ANR之前。而且我不知道如何确定导致ANR发生的原因。
我只能够复制我们的目标设备上的问题: 三星Galaxy Tab活动4 16GB
三星/ rubensltexx/rubenslte:4.4.4/KTU84P/T365XXU1AOA3:用户/发布密钥
Nexus 7或Nexus 9(均运行5.1.1)不会发生此问题。
更新: 好了,我已经使用DDMS获得方法轮廓,下面的文件被捕获在约10分钟内,其中在年底通过,然后显示一个ANR消息中途再次,两次我都按下“等待”信息。
该配置文件似乎没有提及我的任何com.ancoris.shade文件或方法。
https://drive.google.com/file/d/0B8JuL0rVSQEKZUJPYmFIR3dDMkE/view?usp=sharing
更新2:
我刚看到这在日志(数据/ ANR/traces.tx)之一。这是正常的还是这是我的问题的原因?如果是这样,当堆栈跟踪中甚至没有提到我的代码时,我应该如何调试这样的东西?
"main" prio=5 tid=1 SUSPENDED
| group="main" sCount=1 dsCount=0 obj=0x4188cea0 self=0x4177c008
| sysTid=16094 nice=0 sched=0/0 cgrp=apps handle=1074479444
| state=S schedstat=(0 0 0) utm=8522 stm=1572 core=0
at android.widget.TextView.restartMarqueeIfNeeded(TextView.java:~5762)
at android.widget.TextView.onDraw(TextView.java:6474)
at android.view.View.draw(View.java:15551)
at android.view.View.draw(View.java:15436)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15434)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15434)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15554)
at android.widget.FrameLayout.draw(FrameLayout.java:472)
at android.widget.ScrollView.draw(ScrollView.java:2418)
at android.view.View.draw(View.java:15436)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15434)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15434)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15434)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15434)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15434)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15434)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15434)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15554)
at com.android.internal.widget.ActionBarOverlayLayout.draw(ActionBarOverlayLayout.java:471)
at android.view.View.draw(View.java:15436)
at android.view.ViewGroup.drawChild(ViewGroup.java:3366)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3202)
at android.view.View.draw(View.java:15554)
at android.widget.FrameLayout.draw(FrameLayout.java:472)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2623)
at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2956)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2869)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2707)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2275)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1297)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6775)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813)
at android.view.Choreographer.doCallbacks(Choreographer.java:613)
at android.view.Choreographer.doFrame(Choreographer.java:583)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5756)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
at dalvik.system.NativeStart.main(Native Method)
使用Traceview来确定您在主应用程序线程上的时间和方式。 – CommonsWare
所有的时间似乎都花在MessageQueue.nativePollOnce上。我附上了上面的跟踪文件。 – John