2013-03-08 4 views
5

Android'in StrictMode sızan bir nesneyi (örneğin, etkinlik) ihlal ettiğinde, o anda bir yığın öbeği yakalayabilmem yararlı olur. Bununla birlikte, bunu yapmak için yapılandırmak için açık bir yol yoktur. Bunu başarmak için kullanılabilecek bazı numaralar var mı? Ölüm cezası verilmeden önce sistemi belirli bir kod parçasını çalıştırmaya ikna etmenin bir yolu var mı? Ben StrictMode bir istisna atar sanmıyorum, bu yüzden burada açıklanan trick kullanamazsınız: Is there a way to have an Android process produce a heap dump on an OutOfMemoryError?Android StrictMode ve öbek döküntüleri

cevap

7

Hiçbir istisna, ama StrictMode o sonlandırır hemen önce System.err bir mesaj yazdırmak yapar. Yani, bu kesmek, ama çalışıyor ve sadece hata ayıklama etkin olması için gidiyor olarak :)

onCreate() ... Ben gayet anlamaya oluşturur:

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

ve sevk sınıf :

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

dizisi (app referans kolaylığı için uygulama bağlamında bir başvuru içeren dış sınıfının içindeki bir sabit alanı, olduğu) Bu eşleşmeler, zencefilli çöreklerden jöle fasülyesine kadar değişmeden hayatta kaldı, ancak teorik olarak gelecekteki sürümlerde değişebiliyordu, bu yüzden hala aynı mesajı kullandıklarından emin olmak için yeni sürümleri kontrol etmeye değer.