如何从插件访问 Eclipse Java 调试器?

Posted

技术标签:

【中文标题】如何从插件访问 Eclipse Java 调试器?【英文标题】:How can I access the Eclipse Java debugger from a plug-in? 【发布时间】:2013-11-02 23:57:40 【问题描述】:

我正在为 Eclipse 平台开发一个插件。该插件将用于提供有关当前正在调试的 Java 源代码行的信息。

在调试 Java 程序时,当您遇到断点时,Eclipse 会切换到标准的 Debug 透视图。在这个透视图中,除了标准的控制台输出、堆栈跟踪和其他各种视图之外,您还可以看到当前正在调试的 Java 程序的源代码。在此“源代码视图”中,您可以看到突出显示的行,这是当前正在调试/评估的代码行。这行突出显示的代码就是我想要访问的。

假设我知道调试器何时运行(我通过实现IJavaBreakpointListener 的 DebugBreakpointListener 类评估),我需要向调试器“提问”。我想,我需要的是以某种方式直接向调试器询问它当前突出显示/调试/评估的代码行或所述代码行的行号。

我正在对 JDIDebugModel 进行静态访问以添加 Java 断点侦听器:

JDIDebugModel.addJavaBreakpointListener(new DebugBreakpointListener);

我以为我可以使用对 JDIDebugPlugin 的静态引用来访问调试器,但我还没有找到我要查找的内容。

在this 研究论文的第 3 部分,作者建议:

Eclipse Java 调试器建立在 Java 调试接口 (JDI) 的 API 之上,它是 Java 开发工具包的一部分。此 API 支持添加请求以监视 JVM 事件,例如 BreakpointEvent。当事件发生时,调试器会收到通知,并且可以获取发生此事件的线程。对于该线程的堆栈跟踪中的每一帧,可以获得以下信息:

• 在该帧执行的源 Java 文件(如果源不可用,则为 null)。

• 方法和行号(如果可用)。

• this 对象或 null 如果方法是静态的。

Eclipse 调试器在遇到断点时使用此信息。它在“调试”视图中显示挂起线程的堆栈跟踪。对于此跟踪中选定的帧,Eclipse 在其源文件中突出显示相应的行号,并在“变量”视图中显示此变量。

这个要点列出的东西正是我正在寻找的东西。

很遗憾,我找不到有关如何“插入”调试器的详细文档。

如果有人可以给我信息、指向我的信息或示例代码,或者可能向我提供 Eclipse JDI 项目中某人的联系信息,我们将不胜感激。

提前致谢。

-----更新和回答:-----

在 greg-449 的回答的帮助下,我做了我想做的事。这是我所做的:

上面我写的断点监听器实现了接口方法breakpointHit,如下:

@Override
public int breakpointHit(IJavaThread thread, IJavaBreakpoint breakpoint) 
    System.out.println("Just hit a breakpoint!");
    // Save pointers to the thread & breakpoint for future use.
    return 0;

使用保存在我的一个对象中的指向线程和断点对象的指针,我可以查询它们以获取有关帧堆栈、线程和我已设置的特定断点的状态的最新信息打。我可以通过调用获取调试器当前正在调试的类的名称a dn 路径:

IStackFrame topStackFrame = thread.getTopStackFrame();
int debuggedLineNumber = topStackFrame.getLineNumber();
String debuggedClassPath = topStackFrame.getLaunch().getSourceLocator().getSourceElement(thread.getTopStackFrame()).toString();

这正是我想要的。我想我需要手动读取源代码文件,通过将“换行符”字符作为分隔符通过标记器运行它们,并获取相应的标记来读取该特定行。

【问题讨论】:

【参考方案1】:

在传递给IJavaBreakpointListenerbreakpointHit 方法的IJavaThreadIJavaBreakpoint 参数中提供了大量信息,其中应该包含这些信息。

我认为对于具有行号的断点(并非所有),IJavaBreakpoint 参数也实现了包含行信息的ILineBreakpoint

【讨论】:

感谢您的回答,您引导我找到解决方案。我正在更新描述我是如何做到的问题。

以上是关于如何从插件访问 Eclipse Java 调试器?的主要内容,如果未能解决你的问题,请参考以下文章

需要从eclipse插件代码访问JavaFX

Eclipse & Grade 如何生成 jar 以便调试器可以访问源代码?

如何从 Eclipse 插件提供 Flash 策略文件?

调试Java代码(Eclipse)汇总

调试java程序时如何在eclipse中执行某些功能?

xampp + eclipse 环境下如何调试PHP