Eclipse – 当Android应用程序引发未处理的exception时,中断用户代码

我的问题很简单:

我知道我可以在断点视图(NullPointerException..Throwable …)中为特定的exception设置一个断点,但我想打破所有未处理的。 我知道我可以通过在Javadebugging选项中设置“步骤filter”来过滤debugging,但在我的情况下,这并不适用于所有exception。

编辑

在debugging视图下面的图像中,当引发exception时(在我的代码中除以零)

在这里输入图像说明

和主线程的堆栈,如果我设置一个默认的未捕获exception处理程序exception后引发。

在这里输入图像说明

Solutions Collecting From Web of "Eclipse – 当Android应用程序引发未处理的exception时,中断用户代码"

您可以先validation是否启用了Eclipse中的此设置。

窗口 – >首选项 – > Java – >debugging – >挂起对未捕获exception的执行

如果启用此设置,那么任何未捕获的exception都会在其引发的位置正好挂起JVM,包括使用reflection调用的类。 这是没有添加任何断点 ,但提供了它的未处理 ,即你的代码甚至不被try-catch的外部代码调用。

例如

int a = 0, b= 0; System.out.println(a/b); // ArithmeticException 

即使这个代码是从reflection调用的代码中调用的,eclipse也会在sysout中挂起,所有variables在堆栈中仍然可用。

然而在Android的启动类 ZygoteInit有这样一行:

  catch (Throwable t) { Log.e(TAG, "Error preloading " + line + ".", t); if (t instanceof Error) { throw (Error) t; } if (t instanceof RuntimeException) { throw (RuntimeException) t; } throw new RuntimeException(t); } 

这样的代码将打破Eclipsedebugging的原因是, RuntimeException 现在不再未处理的 。 你的UncaughtExceptionHandler实际上可能会捕获启动类而不是你的用户代码。 这是常规的Eclipse。

解决scheme1:

  1. 转到运行 – >添加Javaexception断点 – > Throwable
  2. 点击断点视图中的Throwable
  3. 右键点击 – >断点属性 – > 添加包 – >确定
  4. 检查这个exception的选项子类

在这里输入图像说明

注意:这可以稍微捕获一个java.lang.OutOfMemoryError但绝对不能捕获java.lang.StackOverflowError

解决scheme2 🙁 只有在捕获的例外太多的情况下,不要另行推荐

  1. com.android.internal.os.ZygoteInit的源代码复制到一个新的项目中,比如MyBootstrap
  2. 修改catch (Throwable t)块只捕获Error

      } catch (Error t) { Log.e(TAG, "Error preloading " + line + ".", t); throw t; } 
  3. 转到debuggingconfiguration – >类path – >点击引导条目 – >添加项目 – > MyBootstrap 。 将这个项目移到顶部

在这里输入图像说明

基本上,如果我正确地理解了你,你想要设置一个断点,如果这个exception不会被随后处理的话,将会在抛出exception的地方触发这个断点。

如果这是你的意思,那么你所要求的基本上是不可能的。

  1. 在引发exception的时候,debugging器不能分辨是否会发生exception。

  2. 在发生exception的地方,从抛出点到捕获点的状态(即堆栈帧,variables等)将被丢弃。

  3. Javadebugging器API不支持debugging器可以使用的“倒回和重放”机制。


在我看来,最好的办法是1)确定你怀疑没有被捕获的exception,2)在它的构造函数或适当的超类构造函数上设置一个断点,3)找出一些条件来过滤这些情况这些都不是很有意思,4)通过代码来查看exception是否被捕获。

注意:exception可能在实例化的不同位置抛出或重新抛出,所以exception构造函数断点并不总是有帮助的。 但它通常会。