詳解Eclipse斷點(diǎn)
大家肯定都用過Eclipse的調(diào)試的功能,在調(diào)試的過程中自然也無法避免要使用斷點(diǎn)(breakpoint),但不知是否對(duì)Eclipse中各類斷點(diǎn)都有所了解。本篇圖文并茂地介紹了Eclipse中全部類型的斷點(diǎn),及其設(shè)置,希望對(duì)大家有所幫助。(2011.11.20)1. 示例程序
BreakpointDemo是一個(gè)臆造的應(yīng)用程序,只是為了便于講解Eclipse中各類斷點(diǎn)的使用罷了。其代碼如下圖所示,

BreakpointDemo主要包含兩個(gè)方法:
[1]setValue,該方法根據(jù)指定的次數(shù)(count),對(duì)成員變量value進(jìn)行賦值,值的范圍為0-9的隨機(jī)整數(shù)。
[2]printValue,該方法會(huì)調(diào)用setValue()對(duì)value進(jìn)行賦值,并打印出value的值;但,如果value能被3整除,那么就會(huì)拋出IllegalArgumentException異常。
2. Line Breakpoint
Line Breakpoin是最簡(jiǎn)單的Eclipse斷點(diǎn),只要雙擊某行代碼對(duì)應(yīng)的左側(cè)欄,就對(duì)該行設(shè)置上斷點(diǎn)。此處,對(duì)第20行代碼設(shè)置上Line Breakpoint,如下圖所示,

可以為Line Breakpoint設(shè)置一個(gè)條件,那么當(dāng)程序運(yùn)行到該斷點(diǎn)時(shí),只有滿足設(shè)定的條件,才會(huì)被中斷。右鍵點(diǎn)擊第20行的斷點(diǎn),選擇"Breakpoint Properties..."
在彈出的屬性對(duì)話框中,勾選上"Conditional",然后在文本框中輸入"count % 2 == 0"。
該條件表示,當(dāng)程序運(yùn)行到第20行時(shí),只有當(dāng)count為偶數(shù)時(shí),程序才會(huì)被中斷。細(xì)心地話,你會(huì)發(fā)現(xiàn)該斷點(diǎn)的圖標(biāo)發(fā)生了改變,多了一個(gè)問號(hào)。
3. Watchpoint
Line Breakpoint關(guān)注于程序運(yùn)行的"過程",大家也常把使用這種斷點(diǎn)的調(diào)試稱為單步調(diào)試。但有時(shí)候,我們對(duì)程序的運(yùn)行過程不太了解,可能也不太關(guān)心,不能確定在什么地方設(shè)置斷點(diǎn)比較合適,而可能比較關(guān)注某個(gè)關(guān)鍵變量的變化或使用。此時(shí),就可以為該變量設(shè)置一種特殊的斷點(diǎn)--Watchpoint。在此示例,我們最關(guān)心的就是成員變量value的值,那么就可以為它設(shè)置一個(gè)Watchpoint,雙擊第9行代碼對(duì)應(yīng)的左側(cè)欄就可以了。
使用在2中所提及的方法,查看該斷點(diǎn)的屬性,
默認(rèn)地,當(dāng)該變量被訪問或它的值被修改時(shí),程序都會(huì)被中斷。但在本示例中,只希望當(dāng)對(duì)value的值進(jìn)行修改時(shí)程序才需要被中斷,所以取消對(duì)"Access"的勾選。
這時(shí),我們會(huì)發(fā)現(xiàn)原來的Watchpoin圖標(biāo)也有變化了。
4. Method Breakpoint
與關(guān)注對(duì)某個(gè)變量的訪問與修改一樣,我們也可以關(guān)注程序?qū)δ硞€(gè)方法的調(diào)用情況,即,可以設(shè)置Method Breakpoint。在此處,設(shè)置針對(duì)方法setValue的Method Breakpoint。同理,雙擊第11行代碼對(duì)應(yīng)的左側(cè)欄即可。
仍然要查看該斷點(diǎn)的屬性。默認(rèn)地,只勾選了"Entry",而沒有勾選"Exit"。
這表示,當(dāng)剛進(jìn)入該方法(調(diào)用開始)時(shí),程序會(huì)被中斷;而,離開該方法(調(diào)用結(jié)束)時(shí),程序并不會(huì)被中斷。在本示例中,需要同時(shí)勾選上"Exit"。
點(diǎn)擊OK之后,可以看到該斷點(diǎn)的圖標(biāo)也有所改變。
根據(jù)這里的設(shè)置,當(dāng)程序運(yùn)行到第20行后會(huì)在第12行被中斷,盡管這里沒有顯式的斷點(diǎn),但這就是setValue()方法的入口(Entry)。必須注意地是,程序在運(yùn)行到第16行時(shí)不會(huì)被中斷,盡管它看起來像是setValue()方法的出口(Exit)。實(shí)際上,程序會(huì)在第17行被中斷,這里才是setValue()調(diào)用結(jié)束的地方。
5. Exception Breakpoint
如果,我們期望某個(gè)特定異常發(fā)生時(shí)程序能夠被中斷,以方便查看當(dāng)時(shí)程序所處的狀態(tài)。通過設(shè)置Exception Breakpoint就能達(dá)到這一目標(biāo)。本示例故意在第23行拋出了IllegalArgumentException異常,我們期望程序運(yùn)行到此處時(shí)會(huì)被中斷。但我們不直接為此行代碼設(shè)置Line Breakpoint,而是為IllegalArgumentException設(shè)置Exception Breakpoint。設(shè)置Exception Breakpoint的方法與其它類型斷點(diǎn)都不同,它不能通過雙擊左側(cè)欄的方式在代碼編輯器上直接進(jìn)行設(shè)置。點(diǎn)擊Breakpoints視圖右上角形如Ji的圖標(biāo),
會(huì)彈出如下所示的對(duì)話框,
在其中選中IllegalArgumentException,并點(diǎn)擊OK,這時(shí)一個(gè)Exception Breakpoint就設(shè)置好了。
當(dāng)value為3的倍數(shù)時(shí),程序會(huì)在第23行被中斷,這時(shí)我們就能使用調(diào)試器來看看value具體是等于0,3或6。
6. Class Load Breakpoint
還有一種大家平時(shí)可能不太用的斷點(diǎn)--Class Load Breakpoint,即當(dāng)某個(gè)類被加載時(shí),通過該斷點(diǎn)可以中斷程序。
小結(jié)
上述的Eclipse斷點(diǎn),我們?cè)诂F(xiàn)實(shí)工作中肯定都有意或無意地使用過其中的幾種,只是不一定十分了解內(nèi)情罷了。使用好Eclipse的各種斷點(diǎn),可以把很好地幫助我們分析程序,定位問題。