2009-10-09 43 views
1

我只是有一個想法,我想知道在java中是否可能。比方說,在使用eclipse或netbeans進行調試時,您可以記錄一個對象並保存它。然後,當經過第二輪調試時,再次保存該對象。現在你可以比較第一個記錄的對象和第二個對象的所有屬性,並找出任何差異。這可能嗎?很酷的調試對象

+1

Eclipse在調試時做了一些與此相關的工作 - 它將突出顯示斷點之間更改的值/引用 - 請參閱http://www.ibm.com/developerworks/java/library/os-ecbug/ – Nate 2009-10-09 10:28:26

回答

5

你可以用普通的Java代碼(假設你的對象是Serializable)做到這一點,但我認爲任何調試器都沒有內置此功能。

這只是在調試運行期間序列化第一個對象的情況(如果您有靜態方法這樣做,您通常可以從調試器調用)並將其保存在某處。然後,在第二次運行期間,調用另一種方法從它的序列化表單重新構建對象 - 然後比較對象(或者與它們的equals()方法或一些更爲定製的比較方法)。

實際上,儘管我發現每當我想要做到這一點,我只是在一張紙上塗抹相關屬性並手動比較它們。我很少看到成千上萬的可能在跑步之間發生變化的屬性;如果你考慮到你所看到的症狀和對象的行爲,通常可以很好地理解甚至在啓動調試器之前會發生什麼變化,然後使用後者來確認你的假設並回溯到看到價值「出錯」的地方。

+0

的圖9我喜歡你做什麼以及在紙上寫下來。並尋找更專業的方式做到這一點 – cometta 2009-10-10 10:03:16

1

給你的對象一個有用的toString()方法,然後使用單元測試來比較結果和你的期望。

但我同意:用於遠程調試的有線協議可以序列化任何對象,因此應該可以編寫一個自動執行此操作的程序。

OTOH,不打算序列化的對象可能是危險的。如果你不小心在類加載器上使用它,你會得到所有的對象和類以及所有的東西。所以你需要一種方法來停止序列化,以確保它不會在深對象樹中運行混亂。

最重要的是,我想要一個功能來保存應用程序的當前狀態,並能夠及時回溯。

1

我不認爲任何調試器可以保存對象以便稍後進行比較。你雖然可以做的是建立在變量表變量,但與Apache公地ToStringBuilder()包裹它,並在控制檯傾倒,像這樣:

System.out.println(ToStringBuilder.reflectionToString(object)); 

每到達斷點,時間對象的內容將顯示在控制檯中。你甚至可以看到私人數據。

因此,您不需要直接修改對象的toString()方法(例如,這對於庫對象很有用)。然後您可以比較兩次傳球的輸出。

+0

看起來很酷的技術給我。感謝指出這一點 – cometta 2009-10-10 10:04:52