2012-07-03 54 views
1

我正在實現一個IDebugContextListener類(eclipse開發人員工具API /庫的一部分)來偵聽調試器中的事件更改。使這種情況發生的方法是:從可變對象表示中抽取一個真實對象

private void contextActivated(ISelection context) { 
     if (context instanceof StructuredSelection) { 
       Object data = ((StructuredSelection) context).getFirstElement(); 
       if (data instanceof IStackFrame) { 
         reciever.setStackFrame((IStackFrame) data); 
       } else { 
         reciever.setStackFrame(null); 
       } 
     } 
} 

基本上調試器給我的程序IStackFrame的,這裏面有IVariables,這給了什麼是正在調試的程序正在進行的典範。據我所知,這些是正在調試的程序上運行的真實變量的數據表示。 IVariables的功能是有限的,因爲它們可以做基本的事情,例如獲取它們代表的變量的名稱並獲得類型等。

這可能是不可能的,但有什麼辦法可以獲得副本它使用IDebugContextListener類表示的實際對象而不是IVariable數據表示形式?

我的目的是我想使用對象的內部功能。使用IVariables,我只能訪問對象內變量的屬性。

回答

1

IDebugContextListener實際返回一個IStackFrame,它具有專門實現IJavaVariable接口的IVariables集合。知道這一點,我們可以從IJavaVariable中獲得一個IJavaValue,IJavaVariable可以被轉換成IJavaObject。

IJavaObject提供了一個名爲sendMessage()的方法,您可以在其中與調試器JVM進行通信,以便執行堆棧上的方法並返回方法返回值的IValue。

這就是我設法解決這個問題的方法。

2

IVariable/IValue接口提供了獲取調試信息的通用語言無關的方式。這意味着,使用這些值直接從調試器獲取當前值是不太可能的。

但是,語言環境(如JDT)提供了第二個特定於語言的層,可幫助獲取該信息,對於JDT,請參閱org.eclipse.jdt.debug project

有關更詳細的示例以獲取Java調試器的值,請參閱source code of the Inspect action。基本上,這段代碼展示瞭如何與調試過的JVM進行通信。

警告:此處介紹的解決方案可能依賴於來自JDT的內部代碼(可能仍然可用於jdt插件之外);並與其他JVM進行通信可能會非常緩慢。小心。

+0

非常感謝您的回答。我想你是在我的另一個問題上發佈的。實際上,我通過仔細檢查eclipse調試可視化器源代碼(因此使用IVariable接口)開始構建我的調試工具。您能否指出或簡要描述檢查操作如何與JVM進行通信?我不確定哪部分代碼是這樣做的。它看起來像它控制表達式視圖。在一天結束的時候,我基本上正在尋找你的可視化器在調試器上做的事情,除了獲取實際的值/對象。謝謝! – KWJ2104

+0

我相信98-99行與JVM的通信有關。對不起,我不知道更多細節 - 前一段時間我正在研究爲可視化插件提供特定邏輯結構的細節,但未能解決我的問題。所以我沒有完整的解決方案。 –