Ram*_*esh 12 java eclipse debugging junit
环境:Linux,Eclipse Juno,Java 7,JUnit
当一个简单的应用程序(带有main方法的java类)在调试模式下运行时,"Drop to Frame"功能在Eclipse中运行良好.但是,如果从junit测试用例调用相同的方法,则在Eclipse中禁用"Drop to Frame"功能.从文档中
请注意,此命令仅在当前VM支持逐帧且所选堆栈帧不是顶部帧或本机方法中的帧时可用.
正如我们在调试窗口中的堆栈帧中看到的那样,当运行junit测试用例时,有一个本机的"NativeMethodAccessorImpl.invoke"框架.我假设这是"Drop to Frame"被禁用的原因.
如果这个推理是正确的,请告诉我,如果是,可以使用任何解决方法来解决这个问题.
我在Windows下使用Eclipse Luna,Java 7.情况仍然如下所述:对于紧跟在"NativeMethodAccessorImpl.invoke"框架之后的测试方法,禁用"Drop to frame"."Drop to frame"的禁用状态绑定到类中的canDropToFrame()各个方法(在我的发行版中)的一部分.方法supportsDropToFrame()检查是否可以删除特定的帧,并进行测试supportsDropToFrame()org.eclipse.jdt.internal.debug.core.model.JDIStackFrameplugins/org.eclipse.jdt.debug_3.8.102.v20150115-1323/jdimodel.jar
所以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;
}
}
Run Code Online (Sandbox Code Playgroud)
评论表明它是用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的东西.
| 归档时间: |
|
| 查看次数: |
2778 次 |
| 最近记录: |