2013-03-08 16 views
5

Khi StrictMode của Android phát hiện một đối tượng bị rò rỉ (ví dụ: hoạt động) vi phạm, sẽ rất hữu ích nếu tôi có thể ghi lại một đống dữ liệu tại thời điểm đó. Không có cách nào rõ ràng, tuy nhiên, để cấu hình nó để làm điều này. Có ai biết về một số thủ thuật có thể được sử dụng để đạt được nó hay không, ví dụ: một cách để thuyết phục hệ thống chạy một đoạn mã cụ thể ngay trước khi án tử hình được triệu tập? Tôi không nghĩ StrictMode ném ngoại lệ, vì vậy tôi không thể sử dụng mẹo được mô tả ở đây: Is there a way to have an Android process produce a heap dump on an OutOfMemoryError?Android StrictMode và heap dumps

Trả lời

7

Không ngoại lệ, nhưng StrictMode không in trước khi chấm dứt. Vì vậy, đây là một hack, nhưng nó hoạt động, và khi nó chỉ sẽ được kích hoạt trên debug xây dựng tôi con số đó là tốt ... :)

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

và lớp gọi :

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

(nơi app là một lĩnh vực tĩnh trong các lớp bên ngoài chứa một tham chiếu đến bối cảnh ứng dụng, để dễ tham khảo)

chuỗi nó phù hợp đã tồn tại không thay đổi từ việc phát hành bánh gừng lên đến đậu thạch, nhưng về mặt lý thuyết có thể thay đổi trong các phiên bản sau, vì vậy nó đáng để kiểm tra các phiên bản mới để đảm bảo chúng vẫn sử dụng cùng một thông điệp.