在本教程中,我們將看到使用Eclipse調(diào)試Java應(yīng)用程序。調(diào)試可以幫助我們識(shí)別和解決應(yīng)用程序中的缺陷。我們將重點(diǎn)放在運(yùn)行時(shí)間的問題,而不是編譯時(shí)錯(cuò)誤。有提供像gdb的命令行調(diào)試器。在本教程中,我們將集中在基于GUI的調(diào)試,我們把我們最喜愛的IDE Eclipse來運(yùn)行,通過本教程。雖然我們說的Eclipse,點(diǎn)大多是通用的,適用于調(diào)試使用的IDE像NetBeans。
在看這篇文章前,我推薦你看一下Eclipse 快捷鍵手冊,你也可以到這兒:下載PDF文件我的eclipse版本是4.2 Juno。
0.三點(diǎn)特別提醒:
- 不要使用System.out.println作為調(diào)試工具
- 啟用所有組件的詳細(xì)的日志記錄級別
- 使用一個(gè)日志分析器來閱讀日志
[
(System.out.println()對開發(fā)人員來說,有時(shí)候也許可以是一種調(diào)試手段,但是項(xiàng)目一旦完成他就沒有什么用途了,就變成垃圾了,得必須注釋或刪除掉,這樣會(huì)比較麻煩。啟用所有組件的詳細(xì)日志記錄級別,運(yùn)用日志分析器來記錄詳細(xì)系統(tǒng)運(yùn)行狀態(tài),這對后期網(wǎng)站的優(yōu)化和維護(hù)會(huì)有很多作用。)這僅僅是個(gè)人理解,僅供參考!
]
1.條件斷點(diǎn)
想象一下我們平時(shí)如何添加斷點(diǎn),通常的做法是雙擊行號(hào)的左邊。在debug視圖中,BreakPoint View將所有斷點(diǎn)都列出來,但是我們可以添加一個(gè)boolean類型的條件來決定斷點(diǎn)是否被跳過。如果條件為真,在斷點(diǎn)處程序?qū)⑼V梗駝t斷點(diǎn)被跳過,程序繼續(xù)執(zhí)行。

2.異常斷點(diǎn)
在斷點(diǎn)view中有一個(gè)看起來像J!的按鈕,我們可以使用它添加一個(gè)基于異常的斷點(diǎn),例如我們希望當(dāng)NullPointerException拋出的時(shí)候程序暫停,我們可以這樣:

3.觀察點(diǎn)
這是一個(gè)很好的功能,他允許當(dāng)一個(gè)選定的屬性被訪問或者被更改的時(shí)候程序執(zhí)行暫停,并進(jìn)行debug。最簡單的辦法是在類中聲明成員變量的語句行號(hào)左邊雙擊,就可以加入一個(gè)觀察點(diǎn)。

4.查看變量
在選中的變量上使用Ctrl+Shift+d 或者 Ctrl+Shift+i可以查看變量值,另外我們還可以在Expressions View中添加監(jiān)視。

5.更改變量的值
我們可以在Debug的時(shí)候改變其中變量的值。在Variables View中可以按下圖所示操作。

6.在主方法停止
在Run/Debug設(shè)置中,我們可以按如下圖所示的啟用這個(gè)特性。程序?qū)?huì)在main方法的第一行停住

7.環(huán)境變量
我們可以很方便的在Edit Conriguration對話框中添加環(huán)境變量

8.跳出函數(shù)到選定層
這個(gè)功能非常酷,是我第二個(gè)非常喜歡的功能,Drop to frame就是說,可以重新跳到當(dāng)前方法的開始處重新執(zhí)行,并且所有上下文變量的值也回到那個(gè)時(shí)候。不一定是當(dāng)前方法,可以點(diǎn)擊當(dāng)前調(diào)用棧中的任何一個(gè)frame跳到那里(除了最開始的那個(gè)frame)。主要用途是所有變量狀態(tài)快速恢復(fù)到方法開始時(shí)候的樣子重新執(zhí)行一遍,即可以一遍又一遍地在那個(gè)你關(guān)注的上下文中進(jìn)行多次調(diào)試(結(jié)合改變變量值等其它功能),而不用重來一遍調(diào)試到哪里了。當(dāng)然,原來執(zhí)行過程中產(chǎn)生的副作用是不可逆的(比如你往數(shù)據(jù)庫中插入了一條記錄)。

9.分步過濾
當(dāng)我們在調(diào)試的時(shí)候摁F5將進(jìn)入方法的內(nèi)部,但這有個(gè)缺點(diǎn)有的時(shí)候可能會(huì)進(jìn)入到一些庫的內(nèi)部(例如JDK),可能并不是我們想要的,我們可以在Preferences中添加一個(gè)過濾器,排除指定的包。

10.跳入,跳過和返回
其實(shí)這個(gè)技巧是debug最基本的知識(shí)。
- F5-Step Into:移動(dòng)到下一步,如果當(dāng)前的行是一個(gè)方法調(diào)用,將進(jìn)入這個(gè)方法的第一行。(可以通過第九條來排除)
- F6-Step Over:移動(dòng)到下一行。如果當(dāng)前行有方法調(diào)用,這個(gè)方法將被執(zhí)行完畢返回,然后到下一行。
- F7-Step Return:繼續(xù)執(zhí)行當(dāng)前方法,當(dāng)當(dāng)前方法執(zhí)行完畢的時(shí)候,控制將轉(zhuǎn)到當(dāng)前方法被調(diào)用的行。
- F8-移動(dòng)到下一個(gè)斷點(diǎn)處。