gpt4 book ai didi

Android StrictMode 和堆转储

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:27:21 27 4
gpt4 key购买 nike

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

最佳答案

没有异常(exception),但是 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 是外部类中的静态字段,包​​含对应用程序上下文的引用,以便于引用)

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

关于Android StrictMode 和堆转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15292383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com