2012-03-20 100 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 2012-03-20 04:13:29

+0

DetectAll.penaltyLog()。penaltyDeath()for both。看看你的回应如下,它看起来像我需要添加“StrictMode”我的日志过滤器:) – copolii 2012-03-20 21:08:00

回答

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()); 

然后你会看到一个更MOR一个有用的消息,如下所示。这将在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) 

如果仔细观察,您会发现此堆栈跟踪会导致您导致严重违规的代码。

+0

注意:这* * *我在做什么,但你的日志条目告诉我,我需要调整我的日志过滤器(这是我在尝试入睡时所怀疑的))。你赢了蛋糕:)谢谢 – copolii 2012-03-20 21:09:33

+0

好吧,它看起来对我没有多大帮助。我怎么知道它崩溃的代码? – Denny 2017-05-08 22:16:12

0

每当我看到像这样的堆栈跟踪,我总是看着我的Activity生命周期事件。检查你的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 2016-03-31 11:51:50