2012-03-20 22 views
9

私のアプリでStrictModeを有効にしましたが、予想通りにクラッシュを引き起こしています。 私のコードのどこにこれらのポリシーに違反しているのかを知るにはどうすればよいですか?StrictModeポリシーに違反しているものを見つける

これは、スタックトレースです:

E/AndroidRuntime(19523): FATAL EXCEPTION: main 
E/AndroidRuntime(19523): android.os.StrictMode$StrictModeViolation: policy=95 violation=2 
E/AndroidRuntime(19523):  at android.os.StrictMode.executeDeathPenalty(StrictMode.java:1326) 
E/AndroidRuntime(19523):  at android.os.StrictMode.access$1300(StrictMode.java:111) 
E/AndroidRuntime(19523):  at android.os.StrictMode$AndroidBlockGuardPolicy.handleViolation(StrictMode.java:1319) 
E/AndroidRuntime(19523):  at android.os.StrictMode$AndroidBlockGuardPolicy$1.run(StrictMode.java:1206) 
E/AndroidRuntime(19523):  at android.os.Handler.handleCallback(Handler.java:605) 
E/AndroidRuntime(19523):  at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(19523):  at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(19523):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
E/AndroidRuntime(19523):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(19523):  at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(19523):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 
E/AndroidRuntime(19523):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 
E/AndroidRuntime(19523):  at dalvik.system.NativeStart.main(Native Method) 

しかし、あなたが見ることができるように...それは私が理由を知っている必要があり、私は私のアプリを殺した人知っている...非常に便利ではありません!

ありがとうございました。

+0

どのようにSrictModeを有効にしましたか?私たちが検査できるようにコードを貼り付けてください。 – louielouie

+0

DetectAll.penaltyLog()。両方のpenaltyDeath()。下のあなたの回答を見ると、私は "StrictMode"をログフィルターに追加する必要があるように見えます:) – copolii

答えて

14

あなたのStrictMode.ThreadPolicy.BuilderでpenaltyLog()に電話する必要があります。これにより、基本的な理由とアプリケーションの停止が表示されます。ここで

あなたはおそらく、現在持っているものです。

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
.detectDiskReads() 
.detectDiskWrites() 
.detectNetwork() 
.penaltyDeath() 
.build()); 

あなたは、メインスレッド上でネットワークを呼び出した場合、あなたが理解するのは難しいです、この例外を取得します:

E/AndroidRuntime(8752): android.os.StrictMode$StrictModeViolation: policy=71 violation=4 
E/AndroidRuntime(8752):  at android.os.StrictMode.executeDeathPenalty(StrictMode.java:1311) 

あなたの場合は、 penaltyLog()をポリシーに追加してください...

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
.detectDiskReads() 
.detectDiskWrites() 
.detectNetwork() 
.penaltyLog() 
.penaltyDeath() 
.build()); 

以下のような有益なメッセージです。これはLogCatの出力に表示されます。

D/StrictMode(8810): StrictMode policy violation; ~duration=2956 ms: android.os.StrictMode$StrictModeNetworkViolation: policy=87 violation=4 
D/StrictMode(8810):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1090) 

詳細を見ると、このスタックトレースによってStrictMode違反の原因となっているコードが表示されることがわかります。

+0

注:これは私がやっていることですが、あなたのログエントリは私に私のログフィルター(これは私が眠りに落ちようとしている間に疑っていたものです:))。あなたはケーキに勝つ:)ありがとう – copolii

+0

まあ、それは私にもっと役立つように見えません。どのコードがクラッシュするのかをどのように知るのですか? – Denny

0

このようなスタックトレースが表示されるたびに、私は常に自分のアクティビティライフサイクルイベントを調べます。 onCreate、onResume、onPauseメソッドで何が起きているのかをチェックします(もっとライフサイクルイベントがありますが、これは一般的なイベントです)。これらのメソッドにブレークポイントを設定し、この致命的なメッセージで終了するものを確認してください。それからそこから取り出してください。

これは、この問題をデバッグするためのかなり良い出発点でなければなりません

protected void onResume() { 
    super.onResume(); 
    try { 
    codeThatCrashesBecauseOfStrictMode(); 
    } catch(Throwable tr) { Log.e(tr); } 
} 

を使用して、このエラーをキャッチしてみます。

0

StrictMode(android.os.StrictMode)クラスを使用して、チェックしたり報告したりできるさまざまなポリシーを有効にして適用することができます。

これは、メインUIスレッドでディスク書き込みを実行しているときに発生するディスク書き込み違反を実行する際のStrictMode違反となります。これを解決するには、ディスクの書き込みをメインスレッドから移動する必要があります。

この時点でコードを移動できない場合は、コードの一部のチェックを無効にすることができます。

問題のコードが実行される直前に特定のルール違反のチェックを停止し、問題のコードが完了した後でそのルールの検出を再度有効にするコードを明示的に追加します。

StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy(); 
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old) 
    .permitDiskWrites() 
    .build()); 
doCorrectStuffThatWritesToDisk(); 
StrictMode.setThreadPolicy(old); 
+0

私はあなたがそのコードを取った答えを参照する必要があると思います: http://stackoverflow.com/a/13323445/1372202 – Jannik