如何调试ANR

时间:2015-10-16 17:02:32

标签: java android

我在调试应用程序时遇到问题。它是一个数据收集应用程序,每个“工作”大约需要15分钟才能完成,其中快速连续完成多个工作是一个正常的用例。

我看到的症状如下:

应用程序运行20到90分钟后,应用程序显示ANR消息。我说在20到90之间,因为ANR出现的时间是可变的;有时它会在第二份工作期间弹出,有时候你可以在弹出之前找到工作8。

一旦ANR出现我选择“等待”并且对话框被解除,所以我继续工作......现在每5分钟(没有失败!)ANR不断重现。每当我选择“等待”,5分钟后它就会回来。

我的应用程序中没有postDelayed或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 Active 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:

我刚刚在其中一个日志(data / 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)

1 个答案:

答案 0 :(得分:1)

通过向应用程序中的某个位置添加2个方法调用来完成性能分析,当您使用性能分析运行应用程序时会生成.trace文件。

要添加的代码: Debug.startMethodTracing("profileName"); //放在你要开始分析的位置即。 application.onCreate

Debug.stopMethodTracing(); //将此位置放在您希望跟踪结束的位置

运行你的应用程序(配置文件时运行速度会相当慢。

在应用程序超过您停止配置文件的位置后,转到终端并运行

adb pull /sdcard/profileName.trace

打开Android设备监视器(在Studio中:工具 - > Android-> Android设备监视器)

文件打开跟踪

观察跟踪,单击一行将允许您深入查看有助于识别减速的子呼叫。