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