AndroidのStrictModeがリークされたオブジェクト(アクティビティなど)の違反を検出した場合、その時点でヒープダンプをキャプチャできると便利です。ただし、これを行うように構成する明確な方法はありません。死刑が発動される直前に特定のコードを実行するようにシステムを説得する方法など、それを達成するために使用できるいくつかのトリックを知っている人はいますか?StrictModeが例外をスローするとは思わないので、ここで説明するトリックを使用することはできません。AndroidプロセスにOutOfMemoryErrorでヒープダンプを生成させる方法はありますか?
質問する
2970 次
1 に答える
9
例外ではありませんが、終了する直前までStrictMode
メッセージを出力します。System.err
したがって、これはハックですが、機能します。デバッグビルドでのみ有効になるため、問題ないと思います... :)
でonCreate()
:
//monitor System.err for messages that indicate the process is about to be killed by
//StrictMode and cause a heap dump when one is caught
System.setErr (new HProfDumpingStderrPrintStream (System.err));
および参照されるクラス:
private static class HProfDumpingStderrPrintStream extends PrintStream
{
public HProfDumpingStderrPrintStream (OutputStream destination)
{
super (destination);
}
@Override
public synchronized void println (String str)
{
super.println (str);
if (str.equals ("StrictMode VmPolicy violation with POLICY_DEATH; shutting down."))
{
// StrictMode is about to terminate us... don't let it!
super.println ("Trapped StrictMode shutdown notice: logging heap data");
try {
android.os.Debug.dumpHprofData(app.getDir ("hprof", MODE_WORLD_READABLE) + "/strictmode-death-penalty.hprof");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
(ここapp
で、参照を容易にするために、アプリケーション コンテキストへの参照を含む外部クラスの静的フィールド)
一致する文字列は、ジンジャーブレッドのリリースからジェリー ビーンまで変更されずに残っていますが、理論的には将来のバージョンで変更される可能性があるため、新しいリリースでも同じメッセージが使用されていることを確認する価値があります。
于 2013-03-08T20:37:26.040 に答える