斷點(diǎn)與調(diào)試
1. 前言
通過前面章節(jié)的介紹,我們已經(jīng)知道如何運(yùn)行 Java 程序了。
現(xiàn)在讓我們看看當(dāng)程序運(yùn)行達(dá)不到我們的預(yù)期的時(shí)候,我們?nèi)绾芜M(jìn)行調(diào)試,以便找出其中的 BUG。
Eclipse 中的 Java開發(fā)工具包(JDT)為我們提供了一個(gè)調(diào)試器(debugger)。
調(diào)試器可以幫助我們查找代碼中的問題,它帶來了設(shè)置斷點(diǎn),掛起運(yùn)行中的程序,檢查變量的內(nèi)容等功能。
要使用調(diào)試器對(duì)我們的代碼進(jìn)行調(diào)試,我們首先需要知道斷點(diǎn)是什么以及如何設(shè)置斷點(diǎn)。
知道如何設(shè)置了斷點(diǎn)后,我們還需要去熟悉 Debug 視圖中的執(zhí)行控制命令,這樣,我們才知道如何進(jìn)行調(diào)試。
下面,讓我們從了解斷點(diǎn)開始,學(xué)習(xí)如何在 Eclipse 中進(jìn)行調(diào)試。
2. 斷點(diǎn)
2.1 斷點(diǎn)是什么
斷點(diǎn)是 Eclipse 為我們提供的一個(gè)功能,它可以讓我們把運(yùn)行中的程序掛起(暫停)。
當(dāng)我們進(jìn)行調(diào)試時(shí),程序遇到斷點(diǎn)的時(shí)候會(huì)被掛起(暫停),此時(shí),我們可以對(duì)程序進(jìn)行檢查。這也是斷點(diǎn)的作用。
那么,在Eclipse中,斷點(diǎn)是什么樣子的呢?
通常,我們會(huì)通過 Java編輯器中的標(biāo)尺設(shè)置斷點(diǎn),如下圖所示:
上圖中紅色框起來的位置就是我們的標(biāo)尺區(qū)域。
同時(shí)如果設(shè)置了斷點(diǎn),將會(huì)顯示一個(gè)藍(lán)色的圓圈,它代表了我們?cè)?Eclipse 中的斷點(diǎn)。
2.2 添加斷點(diǎn)
添加斷點(diǎn),我們有兩種方法:
- 直接雙擊標(biāo)尺中的行號(hào)
- 鼠標(biāo)右鍵標(biāo)尺中的行號(hào),在彈出的菜單中進(jìn)行選擇。
第一種方法直接雙擊行號(hào)后,就可以為該行代碼添加斷點(diǎn)了(行號(hào)左邊出現(xiàn)藍(lán)色圓圈)。
如果要取消斷點(diǎn),只需要再次雙擊該行號(hào)。
第二種方法,在我們鼠標(biāo)右鍵標(biāo)尺中的行號(hào)后,在彈出的菜單中選擇 Toggle Breakpoint 選項(xiàng)后,將為該行添加斷點(diǎn)。如下圖所示:
如果要取消斷點(diǎn),只需要再次選擇 Toggle Breakpoint 選項(xiàng)。
如菜單中所示,我們還可以通過 Shift + Command + B (如果是非Mac系統(tǒng),則是 Shift + Ctrl + B)來操作,該操作將直接為我們光標(biāo)所在的行添加或取消斷點(diǎn)。
2.3 禁用斷點(diǎn)
除了通過再次操作添加斷點(diǎn)的方式取消斷點(diǎn)外,我們還可以禁用斷點(diǎn)。
斷點(diǎn)如果禁用,那么該行代碼將不會(huì)被掛起。
在斷點(diǎn)處鼠標(biāo)右鍵,此時(shí)的出現(xiàn)的菜單將可以選擇 Disable Breakpoint 選項(xiàng),如下圖所示:
如菜單中所示,我們還可以通過 Shift + 雙擊鼠標(biāo)左鍵 來禁用斷點(diǎn)。
選擇 Disable Breakpoint 選項(xiàng)后,斷點(diǎn)將由藍(lán)色的圓圈,變成白色的圓圈:
同樣,如果要恢復(fù),只需要再次執(zhí)行一遍該操作即可。
3. 調(diào)試
了解斷點(diǎn)后,讓我們來看看如何對(duì)我們的 Java 代碼進(jìn)行調(diào)試。
3.1 打斷點(diǎn)
首先,如果要調(diào)試代碼,我們要在需要調(diào)試的代碼位置打上斷點(diǎn):
打上斷點(diǎn)后,我們就可以開始啟動(dòng)調(diào)試了。
3.2 啟動(dòng)調(diào)試
啟動(dòng)調(diào)試有 3 種途徑:
- 在 Java 文件的空白處點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單中選擇 Debug As 選項(xiàng)。
- 鼠標(biāo)右鍵我們的 java 文件,在彈出的菜單中選擇 Debug As 選項(xiàng)。
- 在工具欄中找到 Debug 圖標(biāo),在彈出的菜單中選擇 Debug As 選項(xiàng)。
不管選擇哪種,我們都可以啟動(dòng)我們的調(diào)試,下圖是通過在工具欄中選擇 Debug 圖標(biāo)的方式:
選擇 Debug As -> 1 Java Application 后,我們將看到詢問我們是否切換到 Debug 透視圖的窗口,如下圖所示:
如果我們已經(jīng)處于 Debug 透視圖 那么就不會(huì)出現(xiàn)該彈窗。
我們選擇 Switch,這將幫我們打開 Debug 透視圖,如下圖所示:
Debug 透視圖中默認(rèn)有兩個(gè)視圖,分別是左邊的 Debug 視圖,右邊的變量視圖。
3.3 Debug 透視圖
3.3.1 Debug 視圖
Debug 視圖顯示的是我們正在調(diào)試過程中被掛起的線程的堆棧信息。
其中每個(gè)線程在視圖中被顯示為樹中的一個(gè)節(jié)點(diǎn),如下圖紅框所標(biāo)示的就是一個(gè)節(jié)點(diǎn):
和 Debug視圖 相關(guān)聯(lián)的還有一些常用的按鈕,如下圖所示:
其中 2,3,4,5 是我們的調(diào)試中的 執(zhí)行控制命令,圖中標(biāo)示的按鈕如下:
- 這是個(gè)開關(guān)選項(xiàng),如果選擇打開,則跳過所有的斷點(diǎn)。
- 恢復(fù)掛起的線程(Resume)。
- 終止被選擇的調(diào)試目標(biāo)(Terminate)。
- 進(jìn)入當(dāng)前被高亮的語句(Step Into)。
- 開始執(zhí)行被高亮語句的下一個(gè)語句(Step Over) 。
- 這是個(gè)開關(guān)選項(xiàng),如果選擇打開,則開始使用步驟過濾器(Use Step Filters)。
除此之外我們還有三個(gè)按鈕沒有被亮起,這是三個(gè)也是屬于調(diào)試中的執(zhí)行控制命令:
- 可以掛起線程,以便我們?yōu)g覽或修改代碼,檢查數(shù)據(jù),執(zhí)行步驟等(Suspend)。
- 此按鈕用于遠(yuǎn)程調(diào)試用,點(diǎn)擊時(shí)將斷開連接(Disconnect)。
- 將跳出當(dāng)前的方法(Step Return)。
現(xiàn)在,讓我們點(diǎn)擊 Step Over 按鈕,把程序運(yùn)行到第 12 行,如下圖所示:
接下來,讓我們把關(guān)注點(diǎn)放到變量視圖中。
3.3.2 變量視圖
變量視圖顯示的是調(diào)試中相關(guān)的變量信息:
我們可以看出來,變量視圖分為上下兩部分。
上部分就是變量的信息,包括變量名和變量值。
下部分其實(shí)一個(gè)詳細(xì)窗格,在我們選擇變量后,可以用于更全面地顯示變量的信息。
我們這里只有一個(gè)值,但是如果是一個(gè)數(shù)組,該窗格能體現(xiàn)更多的作用。
3.4 完成調(diào)試
通過一行一行地執(zhí)行我們的代碼,我們就可以完成對(duì)我們代碼的調(diào)試。
通常我們會(huì)通過前面介紹的 Debug 視圖中的執(zhí)行控制命令來一步步地控制語句的運(yùn)行,然后觀察變量視圖中的內(nèi)容。
調(diào)試中,高亮的語句是當(dāng)前被掛起的地方。
我們可以使用 Step Into 或者 Step Over 按鈕進(jìn)行下一條語句的執(zhí)行。
當(dāng)整個(gè)程序執(zhí)行完,或者我們自己點(diǎn)擊終止按鈕時(shí),調(diào)試結(jié)束。
5. 小結(jié)
本文中講解了斷點(diǎn)和調(diào)試的內(nèi)容。
其中的重點(diǎn)是,我們需要了解如何設(shè)置斷點(diǎn)和熟悉 Debug 視圖。
多去使用 Debug 視圖是掌握 Eclipse 調(diào)試的好辦法。