在程序開發(fā)過程中,Bug可以說難以避免。如果定位Bug、分析Bug可以說是快速解決問題的關(guān)鍵。
而定位Bug最重要的手段就是調(diào)試了。
Eclipse提供非常強(qiáng)大的調(diào)試工具。包括以前的自己都只是使用了簡單的斷點(diǎn)工具,其實(shí)Eclipse的調(diào)試手段遠(yuǎn)非如此。
Debug視圖
Debug視圖,提供當(dāng)前執(zhí)行的線程、表達(dá)式、變量值等等信息。
條件斷點(diǎn)
再調(diào)試的時(shí)候,經(jīng)常出現(xiàn)在循環(huán)中,某一個(gè)循環(huán)出了問題,而我們希望程序能再出問題的這次循環(huán)掛起。應(yīng)當(dāng)初核操作呢?
Eclipse提供條件斷點(diǎn),即某個(gè)條件之下才執(zhí)行的斷點(diǎn)。
如果在使用條件斷點(diǎn),先設(shè)置斷點(diǎn),然后在短點(diǎn)上右鍵>Breakpoint Properties

即可打開條件斷點(diǎn),設(shè)置窗口:

如果需要設(shè)置條件,勾選
Enable Condition然后輸入表達(dá)式即可,這里的表達(dá)式,即為你Java代碼里需要進(jìn)行條件判斷的表達(dá)式。如:
for (int i = 0; i< 100; i++) {
/**
* 邏輯代碼
*/
System.out.println("i:" + i);
}
如果我們想在i=50的時(shí)候進(jìn)行調(diào)試,則條件斷點(diǎn)的表達(dá)式為i == 50
查看和修改變量值
在Variables視圖,可以查看某個(gè)標(biāo)量的值。
而在另一些情況下,如果想簡單修改某個(gè)變量的值,看看程序的輸出情況,也可以在這里直接修改。
展示邏輯結(jié)構(gòu)
如果你需要在變量視圖查看一個(gè)Map對象或者List對象的值,對于eclipse的默認(rèn)設(shè)置,一般并不是那么容易。假設(shè),你使用的是HashMap,你需要點(diǎn)擊遍歷各個(gè)實(shí)體條目,并面臨各種HashMap的實(shí)現(xiàn)細(xì)節(jié)。但是,在變量視圖上面有一個(gè)叫做“Show Logical Structure”的按鈕。它非常有用,尤其當(dāng)你的對象的toString()方法所展示的信息并不友好的時(shí)候。我的老大在幾周前為我展示了這個(gè)功能。
導(dǎo)航 Drop to Frame
我想任何人都知道“Step Into”, “Step over”,而且可能也知道“Step return”. 這些是調(diào)試時(shí)的基本導(dǎo)航功能。我想提兩個(gè)我非常喜歡的導(dǎo)航的高級方法。第一個(gè)是“Drop to Frame”. 使用這個(gè)特性你可以及時(shí)回退 ;-) 你可以直接回退到運(yùn)行過的java堆棧幀中某一幀。當(dāng)我調(diào)試時(shí),一不小心錯(cuò)過了某個(gè)關(guān)注的代碼行時(shí),我常常用這個(gè)回退一幀。使用“Drop to Frame”這個(gè)特性我可以簡單的重新運(yùn)行某幀代碼。

斷點(diǎn)視圖:Watchpoints
如果改變這個(gè)變量會(huì)有什么結(jié)果?! 有時(shí)候創(chuàng)建一個(gè)watchpoint對于調(diào)試會(huì)非常有用。調(diào)試器會(huì)停止,不管這個(gè)被觀察的字段是被修改還是被讀取 - 你可以自己來配置決定。你只需雙擊一個(gè)字段,然后你就可以在斷點(diǎn)視圖中看到watchpoint,并且可以編輯它的屬性。你甚至可以一個(gè)訪問次數(shù),這意味著當(dāng)變量被訪問的次數(shù)達(dá)到這個(gè)數(shù)量的時(shí)候,調(diào)試器會(huì)停止。這對于普通的斷點(diǎn)也適用。
總結(jié)一下,即當(dāng)我們想在某個(gè)變量在所有改變的時(shí)候、讀取的時(shí)候,進(jìn)入調(diào)試流程,我們不可能在所有使用到這個(gè)變量的地方全部打上斷點(diǎn),這個(gè)時(shí)候,就會(huì)用到Watchpoints.
這里需要說明一下,Watchpoint添加的時(shí)候,需要在Outline視圖中選中某一個(gè)變量,然后在工具欄的Run>Toggle Watchpoints進(jìn)行添加。
友好的可讀的對象
變量視圖是使用對象的toString方法來現(xiàn)實(shí)對應(yīng)的值。因?yàn)檫@個(gè)原因,如果提供友好的toString方法實(shí)現(xiàn),對調(diào)試來說會(huì)非常有用。在javadoc中關(guān)于java.lang.Object的默認(rèn)toString實(shí)現(xiàn),也是這樣推薦的:
返回一個(gè)表示該對象的字符串。通常<code>toString</code>方法返回這么一個(gè)字符串,“字面表示”該對象。返回結(jié)果必須是一個(gè)簡潔卻富含可表示該對象的信息,并且友好可讀取。我們推薦所有的子類都覆蓋這個(gè)方法。
你可以參考commons-lang中的 ToStringBuilder。它提供一些功能來編寫 (引用自javadoc ) "良好并連貫” 的toString方法。
以上這幾段,來自開源中國,因?yàn)榘l(fā)現(xiàn)總結(jié)的很全。
此段來源: http://www.oschina.net/translate/again-10-tips-on-java-debugging-with-eclipse
Debug相關(guān)的快捷鍵
F5 – “單步進(jìn)入”
F6 – “單步執(zhí)行并跳過”
F7 – “單步執(zhí)行并返回”
F8 – “繼續(xù)執(zhí)行”
Ctrl+Shift+B – “添加斷點(diǎn)”
Ctrl+Shift+I – “檢查”