我正在为 Eclipse 平台开发一个插件。该插件将用于提供有关当前正在调试的 Java 源代码行的信息。
在调试 Java 程序时,当您遇到断点时,Eclipse 会切换到标准的 Debug 透视图。在这个透视图中,除了标准的控制台输出、堆栈跟踪和其他各种视图之外,您还可以看到当前正在调试的 Java 程序的源代码。在此“源代码视图”中,您可以看到突出显示的行,这是当前正在调试/评估的代码行。这个突出显示的代码行是我想要访问的。
假设我知道调试器何时运行(我通过实现的 DebugBreakpointListener 类评估IJavaBreakpointListener
),我需要向调试器“提问”。我想,我需要的是以某种方式直接向调试器询问它当前突出显示/调试/评估的代码行或所述代码行的行号。
我正在对 JDIDebugModel 进行静态访问以添加 Java 断点侦听器:
JDIDebugModel.addJavaBreakpointListener(new DebugBreakpointListener);
我以为我可以使用静态引用访问调试器,JDIDebugPlugin
但我还没有找到我正在寻找的东西。
在本研究论文的第 3 部分,作者建议:
Eclipse Java 调试器建立在 Java 调试接口 (JDI) 的 API 之上,它是 Java 开发工具包的一部分。此 API 支持添加请求以监视 JVM 事件,例如 BreakpointEvent。当事件发生时,调试器会收到通知,并且可以获取发生此事件的线程。对于该线程堆栈跟踪中的每一帧,可以获得以下信息:
• 在该帧中执行的源Java 文件(如果源不可用,则为null)。
• 方法和行号(如果可用)。
• this 对象,如果方法是静态的,则为 null。
遇到断点时,Eclipse 调试器会使用此信息。它在“调试”视图中显示挂起线程的堆栈跟踪。对于此跟踪中选定的帧,Eclipse 在其源文件中突出显示相应的行号,并在“Variables”视图中显示此变量。
这个项目符号列出的东西正是我正在寻找的东西。
不幸的是,我找不到有关如何“插入”调试器的详细文档。
如果有人可以给我信息,给我指点信息或示例代码,或者向我提供 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;
}
使用保存在我的一个对象中的线程和断点对象的指针,我可以查询它们以获取有关帧堆栈状态、线程以及我遇到的特定断点的最新信息。我可以通过调用获取调试器当前正在调试的类的名称 dn 路径:
IStackFrame topStackFrame = thread.getTopStackFrame();
int debuggedLineNumber = topStackFrame.getLineNumber();
String debuggedClassPath = topStackFrame.getLaunch().getSourceLocator().getSourceElement(thread.getTopStackFrame()).toString();
这正是我想要的。我想我将需要手动读取源代码文件,通过将“换行符”字符作为分隔符来通过标记器运行它们,并获取相应的标记来读取该特定行。