英文原文: Again! – 10 Tips on Java Debugging with Eclipse,編譯:oschina
你應該看過一些如《關於除錯的N件事》這類很流行的帖子 。假設我每天花費1小時在除錯我的應用程式上的話,那累積起來的話也是很大量的時間。由於這個原因,用這些時間來重視並瞭解所有使我們除錯更方便的功能。那能為你省下一些時間,也將會使你的生活更安逸、輕鬆。同時也表明其它關於此主題的帖子也是很有價值的。
第1條:不要除錯太多
一個關於除錯的瘋狂宣告作為開頭。但它必須是要說的!嘗試切分一下你那複雜的邏輯成多個獨立的單元,並編寫單元測試來檢測你程式碼的正確性。我想像如下這樣的流程應該是發生得非常頻繁的—-一些人通過大型web應用程式點選、填寫多個表單、切換到不同的頁面、正在最後的頁面上檢測工個計算邏輯和實現這個除錯檢視中的大部分邏輯。在啟動你的tomcat之前總是問你自己:有沒有方法使用一個單元測試來檢測這些行為?你在過去這些時間可以不知道或已忘記這些,但從現在開始,我們將要關注一些eclipse的除錯技巧,你會發現有大量的關於良好程式碼設計的好東西。
– 斷點檢視 : 條件斷點
如果你只對應用中的某部分感興趣的話,這個功能非常有用。例如,如果你要在第13次迴圈的時候檢查程式,或者在一個抽象父類中除錯某些功能,而你只關注其中一個具體的實現。你可以在斷點檢視中設定條件,或者通過程式碼旁邊的藍色斷點標記的右鍵選單(”Breakpoint Properties”)設定。你可以在條件程式碼片段為true的時候暫停程式,或者當程式碼片段的值改變的時候掛起程式。
(點選可檢視大圖,下同)
– 變數檢視:展示邏輯結構
如果你需要在變數檢視檢視一個Map物件或者List物件的值,對於eclipse的預設設定,一般並不是那麼容易。假設,你使用的是HashMap,你需要點選遍歷各個實體條目,並面臨各種HashMap的實現細節。但是,在變數檢視上面有一個叫做“Show Logical Structure”的按鈕。它非常有用,尤其當你的物件的toString()方法所展示的資訊並不友好的時候。我的老大在幾周前為我展示了這個功能。你知道,他經常跟PowerPoint或者Excel打交道。對於我這麼一個開發人員,多丟臉哦
未開啟“Show Logical Structure”
– 變數檢視:更改變數值…
當你需要稍微更改輸入資訊的時候,不需要重新開始除錯會話,只需在一個表格中輸入新的資訊,你可以在除錯階段直接修改你的變數的值。有寫時候,你可以節省一些時間,你可以通過這個功能,更加簡單的模擬一些怪異的情況。
– Display檢視
你知道“Display檢視”嗎?你可以在除錯過程中,通過“Window” -> “Show View” -> “Display”來啟用它。現在,你的eclipse應該是一個空白的新檢視。你可以使用這個檢視,輸入或者演算一些新的程式碼。這些程式碼在當前的除錯位置的上下文環境中被執行,這意味著,你可以使用所有變數甚至是內容助手。要執行你的程式碼的話,只需標記它,並使用右鍵選單或者CTRL+U(執行)或者 CTRL+SHIFT+I (檢查).
– 導航: Drop to Frame
我想任何人都知道“Step Into”, “Step over”,而且可能也知道“Step return”. 這些是除錯時的基本導航功能。我想提兩個我非常喜歡的導航的高階方法。第一個是“Drop to Frame”. 使用這個特性你可以及時回退 你可以直接回退到執行過的java堆疊幀中某一幀。當我除錯時,一不小心錯過了某個關注的程式碼行時,我常常用這個回退一幀。使用“Drop to Frame”這個特性我可以簡單的重新執行某幀程式碼。
– 導航: Step into Selection
第二個是“Step into Selection”. 這也是很簡單,但很多人使用的一個。要使用它,你只需要按 Ctrl+Alt 同時點選一個你想執行到的方法名。非常方便,非常快速。相比“Step Into”這個非常方便,想想你像跟蹤進一個有很多引數的函式,如果用“Step Into”你必須進入,退出每個引數計算過程,才能進入到你真正想進的函式。“Run to line”也是很棒的特性。只需要把游標放在你想執行到的哪一行前面,然後按“CTRL+R”就可以了。
如果避免使用滑鼠的話,你的操作速度會更快。你至少應該如下的快捷鍵:
- F5 – “單步進入”
- F6 – “單步執行並跳過”
- F7 – “單步執行並返回”
- F8 – “繼續執行”
- Ctrl+Shift+B – “新增斷點”
- Ctrl+Shift+I – “檢查”
– 斷點檢視:Watchpoints
如果改變這個變數會有什麼結果?! 有時候建立一個watchpoint對於除錯會非常有用。偵錯程式會停止,不管這個被觀察的欄位是被修改還是被讀取 – 你可以自己來配置決定。你只需雙擊一個欄位,然後你就可以在斷點檢視中看到watchpoint,並且可以編輯它的屬性。你甚至可以一個訪問次數,這意味著當變數被訪問的次數達到這個數量的時候,偵錯程式會停止。這對於普通的斷點也適用。
– 友好的可讀的物件
變數檢視是使用物件的toString方法來現實對應的值。因為這個原因,如果提供友好的toString方法實現,對除錯來說會非常有用。在javadoc中關於java.lang.Object的預設toString實現,也是這樣推薦的:
返回一個表示該物件的字串。通常<code>toString</code>方法返回這麼一個字串,“字面表示”該物件。返回結果必須是一個簡潔卻富含可表示該物件的資訊,並且友好可讀取。我們推薦所有的子類都覆蓋這個方法。
你可以參考commons-lang中的 ToStringBuilder。它提供一些功能來編寫 (引用自javadoc ) “良好並連貫” 的toString方法。
預設的ToString
預設的ToStringBuilder例子
如果你不能修改toString實現,例如你現在使用框架或者一個外部的API,你可以有另外一個選擇,在Eclipse中建立一個“Detail Formatter”。你需要在變數檢視中右擊一個物件,並點選“New Detail Formatter…”。然後你就可以輸入一些程式碼,用於展現這個物件。