应用程序崩溃时是否有一种方法可以进行内存转储?

5

我正在忙着编写一款应用程序,但有时会崩溃。当它崩溃并且我回到电脑前时,我只有堆栈跟踪。

是否有办法在应用程序崩溃时获取内存转储?

谢谢!

3个回答

4
如果你调用android.os.Debug.dumpHprofData(String fileName),你可以捕获一个HPROF dump,可以用jhat或MAT查看。你需要以某种方式捕获异常(try/catch或指定自己的全局默认异常处理程序),如果你想写入/sdcard,你需要WRITE_EXTERNAL_STORAGE权限。
另请参见Dalvik堆分析

谢谢,这应该很有用尽管它不是一个内存转储 :) - Jason
您可以查看字符串、对象中字段的值等内容。您需要的是什么,这里没有提供吗? - fadden
它接近于完整的转储,但您不能像将其加载到内存中并继续运行它一样执行操作。(除非我弄错了) - Jason
啊,这需要保存Linux进程的完整状态,因为应用程序可能依赖于从本地代码分配的资源或与未附加到VM的线程交互。还需要一种重新连接进程到应用程序框架IPC、重新分配任何系统资源等的方法。您需要转储更多内容才能重新启动它。在崩溃时调用android.os.Debug.waitForDebugger(),然后稍后附加调试器可以解决大部分问题。(但这可能会触发ANR检测器。) - fadden

1

不是内存转储,而是ACRA(Android应用程序崩溃报告)http://code.google.com/p/acra/非常擅长记录正在发生的信息。最详细的信息是堆栈跟踪。

仅凭调试信息可能并不是非常有用,但您可以修改他们的代码,在应用程序崩溃时执行并发送logcat,以便获取更多有关正在发生的情况的详细信息。我认为出于隐私/安全原因,他们默认不这样做,但查看崩溃周围的logcat会更有用。

除此之外,您需要使用调试器进行调试。


如果READ_LOGS权限可用,logcat将在下一个版本中添加到ACRA。还会有很多其他的功能,所以很抱歉您需要再等待几周;-) - Kevin Gaudin

1
有没有办法在应用程序崩溃时获取内存转储?据我所知没有,抱歉!

是的,我在这方面也没有找到任何信息。将其添加到 SDK 中是个不错的想法,也许可以考虑加入 3.0 版本中。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接