2013-03-08 5 views
5

Wenn Android StrictMode eine Verletzung des ausgelaufenen Objekts (z. B. Aktivität) erkennt, wäre es hilfreich, wenn ich zu diesem Zeitpunkt einen Heap-Dump erfassen könnte. Es gibt jedoch keinen offensichtlichen Weg, dies zu konfigurieren. Kennt jemand einen Trick, der dazu verwendet werden kann, z. eine Möglichkeit, das System dazu zu bringen, kurz vor der Einleitung der Todesstrafe einen bestimmten Code auszuführen? Ich glaube nicht, StrictMode eine Ausnahme auslöst, so kann ich nicht den Trick hier beschrieben verwenden: Is there a way to have an Android process produce a heap dump on an OutOfMemoryError?Android StrictMode und Heap-Dumps

Antwort

7

keine Ausnahme, aber StrictMode hat eine Nachricht an System.err drucken, kurz bevor es endet. Also, das ist ein Hack, aber es funktioniert und wie es nur geht auf Debug aktiviert sein baut ich meine, es ist in Ordnung ... :)

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

und die Klasse bezeichnet :

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

(wo app ist ein statisches Feld in der äußeren Klasse einen Verweis auf den Anwendungskontext, zur Vereinfachung der Bezugnahme enthält)

der String es hat sich vom Lebkuchen-Release bis zum Jelly Bean unverändert erhalten, aber es könnte sich theoretisch in zukünftigen Versionen ändern, so dass es sich lohnt, neue Releases zu überprüfen, um sicherzustellen, dass sie immer noch dieselbe Nachricht verwenden.

Verwandte Themen