1

我目前正在实现一个 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,它给出了正在调试的程序中正在发生的事情的模型。据我所知,这些是在被调试程序上运行的真实变量的数据表示。IVariables 的功能有限,因为它们可以做一些基本的事情,例如获取它们所代表的变量的名称并获取类型等。

这可能是不可能的,但是有什么方法可以获取它表示的实际对象的副本,而不是使用 IDebugContextListener 类的 IVariable 数据表示?

我的目的是我想使用对象的内部功能。使用 IVariables,我只能访问对象内变量的属性。

4

2 回答 2

2

IVariable/IValue 接口提供了一种通用的、独立于语言的方式来获取调试信息。这意味着,实际上不可能使用这些值直接从调试器中获取当前值。

但是,语言环境(例如 JDT)提供了第二个特定于语言的层来帮助获取该信息,如果是 JDT,请参阅org.eclipse.jdt.debug 项目

有关获取 Java 调试器值的更详细示例,请参阅Inspect 操作的源代码。基本上,这段代码展示了如何与被调试的 JVM 通信。

警告:这里介绍的解决方案可能依赖于来自 JDT 的内部代码(可能仍然可以在 jdt 插件之外使用);并且与其他 JVM 的通信可能会很慢。当心。

于 2012-07-09T21:03:57.920 回答
1

IDebugContextListener 实际上返回一个 IStackFrame,其中包含一组专门实现 IJavaVariable 接口的 IVariable。知道了这一点,我们就可以从 IJavaVariable 中得到一个 IJavaValue,然后再将它转换成一个 IJavaObject。

IJavaObject 提供了一个名为 sendMessage() 的方法,您可以在其中与调试器 JVM 通信以执行堆栈上的方法并返回方法返回值的 IValue。

这就是我设法解决这个问题的方法。

于 2012-07-13T02:20:53.113 回答