2013-11-02 31 views
1

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

這正是我一直在尋找。我想我需要手動讀取源代碼文件,通過使用「換行符」作爲分隔符並通過令牌生成器運行它們,並獲取相應的令牌以讀取該特定行。

回答

3

IJavaThreadIJavaBreakpoint傳遞給IJavaBreakpointListenerbreakpointHit方法的參數的大量信息應包含此信息。

我認爲對於具有行號的斷點(不是全部),IJavaBreakpoint參數也實現了包含行信息的ILineBreakpoint

+0

謝謝你的回答,你讓我找到了解決辦法。我正在更新描述我是如何做到這一點的問題。 – aemreunal