如何从插件访问 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】:在传递给IJavaBreakpointListener
的breakpointHit
方法的IJavaThread
和IJavaBreakpoint
参数中提供了大量信息,其中应该包含这些信息。
我认为对于具有行号的断点(并非所有),IJavaBreakpoint
参数也实现了包含行信息的ILineBreakpoint
。
【讨论】:
感谢您的回答,您引导我找到解决方案。我正在更新描述我是如何做到的问题。以上是关于如何从插件访问 Eclipse Java 调试器?的主要内容,如果未能解决你的问题,请参考以下文章