我正在開發Eclipse平臺的插件。該插件將用於提供有關當前正在調試的Java源代碼行的信息。如何從插件訪問Eclipse Java調試器?
調試Java程序時,當您遇到斷點時,Eclipse將切換到標準的Debug透視圖。在這個角度看,除了標準的控制檯輸出,堆棧跟蹤和其他各種視圖之外,您可以看到當前正在調試的Java程序的源代碼。在這個'源代碼視圖'中,你可以看到一個突出顯示的行,它是當前正在調試/評估的代碼行。突出顯示的這段代碼就是我想訪問的內容。
假設我知道調試器何時運行(我通過一個實現IJavaBreakpointListener
的DebugBreakpointListener類來評估),我需要向調試器提問。我想,我需要的是,以某種方式直接向調試器詢問當前突出顯示/調試/評估的代碼行或所述代碼行的行號。
我正在給JDIDebugModel靜態訪問添加Java斷點監聽器:
JDIDebugModel.addJavaBreakpointListener(new DebugBreakpointListener);
我以爲我可以訪問靜態引用調試器JDIDebugPlugin
,但我還沒有找到我」尋找。
截至this研究論文第三部分中,作者認爲:
Eclipse的Java調試器是基於Java的調試接口(JDI),它是Java開發工具包的一部分的API構建的。該API支持添加請求以監控JVM事件,如BreakpointEvent。當一個事件發生時,調試器會得到一個通知,並且可以獲得發生此事件的線程。對於此線程堆棧跟蹤中的每個幀,可以獲得以下信息:
•在此幀執行的源Java文件已發生(如果源不可用,則爲null)。
•方法和行號(如果可用)。
•此對象或null如果方法是靜態的。
當調試斷點時,Eclipse調試器使用這些信息。它在「調試」視圖中顯示暫停線程的堆棧跟蹤。對於此跟蹤中選定的幀,Eclipse會在其源文件中突出顯示相應的行號,並在「變量」視圖中顯示此變量。
這個bulletpoint列出的東西正是我要找的東西。
不幸的是,我找不到有關如何「插入」調試器的詳細文檔。
如果有人能夠給我提供信息,指向我的信息或示例代碼,或者向我提供來自Eclipse JDI項目的某人的聯繫信息,我將非常感激。
在此先感謝。
------ 更新&答: ------
格雷格-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();
這正是我一直在尋找。我想我需要手動讀取源代碼文件,通過使用「換行符」作爲分隔符並通過令牌生成器運行它們,並獲取相應的令牌以讀取該特定行。
謝謝你的回答,你讓我找到了解決辦法。我正在更新描述我是如何做到這一點的問題。 – aemreunal