为什么我可以查看某些例外的实时调用堆栈,而不是其他异常?

时间:2012-05-31 03:43:21

标签: java android eclipse debugging exception

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

案例1

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

enter image description here

<小时/>

案例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)



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

enter image description here

<小时/> <小时/>

案例3

最后,如果我在UI线程上抛出一个异常,我会得到这个怪物,但是我的代码再次抛出异常无处可见:

enter image description here

问题

为什么我无法在所有情况下获取代码到我的实际代码断点,以便我可以检查为什么抛出异常?为什么它在某些情况下有效,而在其他情况下无效?如果我安装了android源码会有帮助吗? (当我得到例外时,目前只是获得“未找到来源”消息)

1 个答案:

答案 0 :(得分:0)

所以我做了一些研究,我想我可以猜到发生了什么。

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

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

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

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