2013-03-08 16 views
5

Gdy StrictMode systemu Android wykryje naruszenie przecieku obiektu (np. Aktywności), byłoby pomocne, gdybym mógł przechwycić zrzut sterty w danym momencie. Nie ma jednak oczywistego sposobu, aby to skonfigurować. Czy ktoś wie o jakimś triku, który można wykorzystać do jego osiągnięcia, np. sposób na przekonanie systemu do uruchomienia określonego fragmentu kodu tuż przed wywołaniem kary śmierci? Nie sądzę StrictMode zgłasza wyjątek, więc nie mogę użyć trik opisany tutaj: Is there a way to have an Android process produce a heap dump on an OutOfMemoryError?Android StrictMode i zrzuty sterty

Odpowiedz

7

bez wyjątku, ale StrictMode zostanie wydrukowana wiadomość do System.err tuż przed kończy. Tak, jest to hack, ale to działa i jak to tylko będzie włączona debugowania buduje I postać jest w porządku ... :)

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

a klasa, o której mowa :

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

(gdzie app jest statycznym polem w klasie zewnętrznej zawierającej odniesienie do kontekstu aplikacji, dla ułatwienia)

Łańcuch pasuje niezmienione od piernikowego wydania aż do galaretki, ale teoretycznie może się zmienić w przyszłych wersjach, więc warto sprawdzić nowe wydania, aby upewnić się, że nadal używają tej samej wiadomości.

Powiązane problemy