我在Windows下使用Eclipse Luna,Java 7。情况仍然如前所述:对于紧跟在“NativeMethodAccessorImpl.invoke”帧之后的测试方法,“拖放到帧”被禁用。“拖放到帧”的禁用状态绑定到 类 中相应的方法,(在我的发行版中)部分。方法支持DropToFrame() 检查是否可以删除特定帧,并进行测试canDropToFrame()
supportsDropToFrame()
org.eclipse.jdt.internal.debug.core.model.JDIStackFrame
plugins/org.eclipse.jdt.debug_3.8.102.v20150115-1323/jdimodel.jar
- JVM 必须支持丢帧
- 框架不能是最上面的框架
- 框架不能是本机的
- 前一帧不得为本机
因此,拉梅什的假设是正确的。这是测试 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 测试方法中暂停时,如预期的那样,启用了“拖放到帧”。
但是当实际删除帧时,我收到一个错误消息框,其中指出“com.sun.jdi.InternalException:在回复中收到错误代码:32发生弹出堆栈帧”。
我假设这是一个JDWP错误代码。因此,这样的“Drop to frame”似乎在JDK 1.7中不起作用(不知道1.8),而且它不是Eclipse的事情。