通过ObjectReference调用方法后的InvalidStackFrameException#invokeMethod

时间:2014-05-21 11:42:22

标签: java eclipse scala scala-ide jdi

我目前正在开发一个Eclipse插件,它增强了调试的可能性。在调试会话期间,我通过com.sun.jdi.ObjectReference#invokeMethod调用Scala方法,如下所示:

public int callMethod_Reactive_Level(final ObjectReference o) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException, InvocationException {
    final Method m = apiValues.getMethod_Reactive_level(o); // com.sun.jdi.Method
    final IntegerValue intVal = (IntegerValue) o.invokeMethod(thread, m, new LinkedList<Value>(), ObjectReference.INVOKE_SINGLE_THREADED);
    return intVal.intValue();
}

执行此操作后,拨打org.eclipse.debug.core.model.IVariable#getValue会导致InvalidStackFrameException。整个错误消息是:

Status ERROR: org.scala-ide.sdt.debug code=5010 Exception while retrieving variable's value com.sun.jdi.InvalidStackFrameException

如上所示,在调用方法后检查变量视图中的变量时,会显示消息Exception while retrieving variable's value

知道如何解决这个问题吗?我不明白为什么这样有问题,因为JDI明确提供了这样做的可能性。

更新:由于它可能是Scala IDE中的错误,因此有一个讨论和教程如何在Scala IDE dev group中重现该问题。

1 个答案:

答案 0 :(得分:1)

错误消息似乎来自IVariable.getValue的Scala IDE实现。它委托给抛出的JDI StackFrame.getValue。根据{{​​3}},这可能发生&#34;如果此堆栈帧已变为无效。一旦帧的线程恢复,堆栈帧就不再有效了。&#34;

我的猜测是在同一个线程上执行invokeMethod会使堆栈帧无效。