我在 Windows 下使用 Eclipse Luna,Java 7。情况仍然如所描述的那样:对于紧跟在“NativeMethodAccessorImpl.invoke”框架之后的测试方法,“Drop to frame”被禁用。“Drop to frame”的禁用状态绑定到类中canDropToFrame()
各自的方法,(在我的发行版中)部分。方法 supportsDropToFrame() 检查是否可以丢弃特定帧,并测试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 测试方法中暂停时,“Drop to frame”已启用,正如预期的那样。
但是当实际丢弃帧时,我收到一个错误消息框,上面写着“com.sun.jdi.InternalException: Got error code in reply: 32 occurred popping stack frame”。
我假设这是一个 JDWP 错误代码。因此,这样的“Drop to frame”似乎在 JDK 1.7 中不起作用(不知道 1.8),而且它不是 Eclipse 的东西。