5

当 Android 的 StrictMode 检测到泄漏对象(例如活动)违规时,如果我能在那个时刻捕获堆转储将会很有帮助。但是,没有明显的方法可以将其配置为执行此操作。有谁知道一些可以用来实现它的技巧,例如,一种说服系统在调用死刑之前运行特定代码的方法?我认为 StrictMode 不会引发异常,因此我不能使用此处描述的技巧:Is there a way to have an Android process generate a heap dump on an OutOfMemoryError?

4

1 回答 1

9

也不例外,但会在它终止之前StrictMode打印一条消息。System.err所以,这是一个 hack,但它可以工作,因为它只会在调试版本中启用,我认为这很好...... :)

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

和提到的类:

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

(其中app是外部类中的静态字段,其中包含对应用程序上下文的引用,以便于参考)

它匹配的字符串从姜饼版本一直到 jelly bean 一直保持不变,但理论上它可能会在未来的版本中发生变化,因此值得检查新版本以确保它们仍然使用相同的消息。

于 2013-03-08T20:37:26.040 回答