2013-03-08 17 views
5

Quando StrictMode di Android rileva una violazione di un oggetto trapelato (ad esempio attività), sarebbe utile se riuscissi a catturare un dump dell'heap in quel momento. Non c'è un modo ovvio, tuttavia, per configurarlo per farlo. Qualcuno sa di qualche trucco che può essere utilizzato per ottenerlo, ad es. un modo per convincere il sistema a eseguire un particolare codice prima che la pena di morte venga invocata? Non credo StrictMode genera un'eccezione, quindi non posso usare il trucco descritto qui: Is there a way to have an Android process produce a heap dump on an OutOfMemoryError?StrictMode Android e discariche di heap

risposta

7

Nessuna eccezione, ma StrictMode lo fa stampare un messaggio a System.err appena prima che termina. Quindi, questo è un hack, ma funziona, e come è solo andare a essere abilitato su build di debug Immagino che va bene ... :)

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

e la classe di cui :

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

(dove app è un campo statico nella classe esterna contenente un riferimento al contesto applicativo, per comodità di riferimento)

la stringa le corrispondenze sono sopravvissute invariate dal rilascio del pan di zenzero fino a Jelly Bean, ma potrebbe teoricamente cambiare nelle versioni future, quindi vale la pena controllare le nuove versioni per assicurarsi che continuino a utilizzare lo stesso messaggio.

Problemi correlati