使用JUnit运行测试用例时,Eclipse Debug中禁用了Drop to framefunction

环境:Linux,Eclipse Juno,Java 7,JUnit

当一个简单的应用程序(带有main方法的java类)在调试模式下运行时,“Drop to Frame”function在Eclipse中运行良好。 但是,如果从junit测试用例调用相同的方法,则在Eclipse中禁用“Drop to Frame”function。 从文档中

请注意,此命令仅在当前VM支持逐帧且所选堆栈帧不是顶部帧或本机方法中的帧时可用。

正如我们在调试窗口中的堆栈帧中看到的,当运行junit测试用例时,有一个本机的“NativeMethodAccessorImpl.invoke”框架。 我假设这是“Drop to Frame”被禁用的原因。

如果这个推理是正确的,请告诉我,如果是,可以使用任何解决方法来解决这个问题。

我在Windows下使用Eclipse Luna,Java 7。 情况仍然如下所述:对于紧跟在“NativeMethodAccessorImpl.invoke”帧之后的测试方法,禁用“Drop to frame”。 “Drop to frame”的禁用状态绑定到方法canDropToFrame()各自的supportsDropToFrame()org.eclipse.jdt.internal.debug.core.model.JDIStackFrame ,(在我的发行版中) plugins/org.eclipse.jdt.debug_3.8.102.v20150115-1323/jdimodel.jar一部分plugins/org.eclipse.jdt.debug_3.8.102.v20150115-1323/jdimodel.jar 。 方法supportsDropToFrame()检查是否可以删除特定的帧,并进行测试

  1. JVM必须支持丢帧
  2. 框架不得是最顶部的框架
  3. 框架不能是原生的
  4. 先前的帧不能是原生的

所以Ramesh的假设是正确的。 这是测试3 + 4的原始代码段:

 int index = 0; JDIStackFrame frame = null; while (index < frames.size()) { frame = (JDIStackFrame) frames.get(index); index++; if (frame.isNative()) { return false; } if (frame.equals(this)) { if (jdkSupport) { // JDK 1.4 VMs are currently unable to pop the // frame directly above a native frame if (index < frames.size() && ((JDIStackFrame) frames.get(index)) .isNative()) { return false; } } return true; } } 

评论表明它是用JDK编写的1.4倍,所以也许在此期间JVM现在也可以将帧丢弃到原生帧之上。

我创建了一个修补版本的JDIStackFrame,它跳过了测试4.现在,当在Junit测试方法中暂停时,“Drop to frame”已按预期启用。

但是当实际丢弃帧时,我收到一个错误消息框,上面写着“com.sun.jdi.InternalException:得到错误代码回复:32发生了弹出堆栈帧”。

我假设这是一个JDWP错误代码。 因此,似乎这样的“Drop to frame”在JDK 1.7中不起作用(不知道1.8),并且它不是Eclipse的东西。