2013-03-08 10 views
5

AndroidのStrictModeがリークされたオブジェクト(アクティビティなど)の違反を検出すると、その時点でヒープダンプを取得できると便利です。しかし、これを行うように設定する明白な方法はありません。誰かがそれを達成するために使用できるいくつかのトリックを知っていますか?死刑が発動される直前に特定のコードを実行するようにシステムを納得させる方法はありますか?私はStrictModeが例外をスローしないと思うので、私はここでは説明のトリックを使用することはできません。Is there a way to have an Android process produce a heap dump on an OutOfMemoryError?Android StrictModeとヒープダンプ

答えて

7

ない例外を、それが終了する直前にSystem.errにメッセージを印刷しStrictModeありません。だから、...これはハックですが、それは動作しますが、唯一のデバッグを有効にするために起こっていることは、私はそれが罰金の姿構築するよう:)

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は、参照を容易にするために、アプリケーション・コンテキストへの参照を含む外側のクラスの静的フィールドである)

ストリングそれはジンジャーブレッドからジンジャンビーンズまでずっと生き残っていますが、理論的には将来のバージョンで変更される可能性があるので、新しいリリースをチェックしても同じメッセージを使用することを確認する価値があります。

関連する問題