1

在 Eclipse 中,我可以在任何异常上设置断点选项,这样我就可以在抛出异常时调试应用程序状态。

情况1

在第一个示例中,一切正常。它显示了完整的调用堆栈,我可以单击调用堆栈的任何级别并查看崩溃时的局部变量。

在此处输入图像描述


案例2

但是,如果我在代码的其他部分(UI 线程或 GLSurfaceView 线程上的任何内容)遇到异常,我会得到完全无用的行为。强制关闭后,我可以在 logcat 中看到异常:

05-30 20:18:10.905: E/AndroidRuntime(23982): FATAL EXCEPTION: GLThread 13
05-30 20:18:10.905: E/AndroidRuntime(23982): java.lang.NullPointerException
05-30 20:18:10.905: E/AndroidRuntime(23982):    at x.x.x.Graphics.MyRenderer.drawSubRenderable(MyRenderer.java:237)
05-30 20:18:10.905: E/AndroidRuntime(23982):    at x.x.x.Graphics.MyRenderer.onDrawFrame(MyRenderer.java:181)
05-30 20:18:10.905: E/AndroidRuntime(23982):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1363)
05-30 20:18:10.905: E/AndroidRuntime(23982):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)



但我无法在崩溃时停止应用程序。应用程序停止,但我只得到这个(我在调用堆栈中看不到我自己的代码):

在此处输入图像描述



案例3

最后,如果我在 UI 线程上抛出异常,我会得到这个怪物,但我的抛出异常的代码仍然无处可寻:

在此处输入图像描述

问题

为什么我不能在所有情况下都让代码在我的实际代码上断点,以便我可以检查抛出异常的原因?为什么它在某些情况下有效,而在其他情况下无效?如果我安装了android源代码会有帮助吗?(目前,当我遇到异常时,只会收到“找不到源”消息)

4

1 回答 1

0

所以我做了更多的研究,我想我可以猜到发生了什么。

我目前只捕获未捕获的异常,我猜想在 android 回调中发生的任何异常都会被处理并重新抛出,从而从活动堆栈跟踪中删除我的源。

如果我捕获所有捕获的异常,那么在所有情况下,我都会在调用堆栈中找到我想要的代码。

不幸的是,如果我捕获所有捕获的异常,我可能会中断 100 多个在 android 框架内部生成和处理的异常,这使得捕获异常的中断有点无用。

希望这里有更好的解决方案,如果您有任何了解,请回答!

于 2012-05-31T07:03:16.863 回答