2015-10-16 75 views
0

我在調試應用程序時遇到問題。這是一個數據收集應用程序,每個「工作」大約需要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) 
+1

使用Traceview來確定您在主應用程序線程上的時間和方式。 – CommonsWare

+0

所有的時間似乎都花在MessageQueue.nativePollOnce上。我附上了上面的跟蹤文件。 – John

回答

1

剖析通過添加當您運行與分析您的應用程序2的方法調用在應用程序中,生成.trace文件的地方進行。

要添加的代碼: Debug.startMethodTracing("profileName"); //放置您要開始分析的位置,即。應用。的onCreate

Debug.stopMethodTracing(); //您要跟蹤結束

運行你的應用程序把這個您停止個人資料到(它會運行,而輪廓。

相當慢的應用已經得到了過去後點終端並運行

adb pull /sdcard/profileName.trace

打開Android設備監視器(在工作室:工具 - > Android-> Android裝置監視器)

文件打開跟蹤

觀察跟蹤,單擊一行可以讓您深入到子呼叫,這將有助於識別減速。