我目前正在开发一个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中重现该问题。
答案 0 :(得分:1)
错误消息似乎来自IVariable.getValue
的Scala IDE实现。它委托给抛出的JDI StackFrame.getValue
。根据{{3}},这可能发生&#34;如果此堆栈帧已变为无效。一旦帧的线程恢复,堆栈帧就不再有效了。&#34;
我的猜测是在同一个线程上执行invokeMethod
会使堆栈帧无效。