1

我正在为 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();

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

4

1 回答 1

3

传递给应该包含这些信息的方法的参数IJavaThread和参数中有大量可用信息。IJavaBreakpointbreakpointHitIJavaBreakpointListener

我认为对于具有行号(并非全部)的断点,该IJavaBreakpoint参数还实现ILineBreakpoint包含行信息。

于 2013-11-03T09:47:26.893 回答