我目前正在实现一个IDebugContextListener类(eclipse开发人员工具API /库的一部分)来监听调试器中的事件更改。实现这一目标的方法是:
private void contextActivated(ISelection context) {
if (context instanceof StructuredSelection) {
Object data = ((StructuredSelection) context).getFirstElement();
if (data instanceof IStackFrame) {
reciever.setStackFrame((IStackFrame) data);
} else {
reciever.setStackFrame(null);
}
}
}
基本上调试器给我的程序IStackFrame,里面有IVariables,它给出了正在调试的程序中正在发生的事情的模型。据我所知,这些是正在调试的程序上运行的真实变量的数据表示。 IVaribles的功能有限,因为它们可以执行基本的操作,例如获取它们所代表的变量的名称并获取类型等。
这可能是不可能的,但有没有办法可以获得它所代表的实际对象的副本而不是使用IDebugContextListener类的IVariable数据表示?
我的目的是想要使用对象的内部功能。使用IVariables,我只能访问对象内部变量的属性。
答案 0 :(得分:2)
IVariable / IValue接口提供了一种通用的,与语言无关的获取调试信息的方法。这意味着,实际上不可能使用这些值直接从调试器获取当前值。
但是,JDT等语言环境提供了第二个特定于语言的层,有助于获取该信息,如果是JDT,请参阅org.eclipse.jdt.debug project。
有关获取Java调试器值的更详细示例,请参阅source code of the Inspect action。基本上,此代码显示了如何与调试的JVM进行通信。
警告:此处提供的解决方案可能依赖于JDT的内部代码(可能仍在jdt插件外部使用);并与其他JVM通信可能会非常慢。小心。
答案 1 :(得分:1)
IDebugContextListener实际上返回一个IStackFrame,它具有一组专门实现IJavaVariable接口的IVariables。知道这一点,我们可以从IJavaVariable获得一个IJavaValue,它又可以被转换为IJavaObject。
IJavaObject提供了一个名为sendMessage()的方法,您可以在其中与调试器JVM进行通信,以便执行堆栈上的方法并返回方法返回值的IValue。
这就是我设法解决这个问题的方法。