Eclipse的Debug介紹與技巧

HollisChuang發表於2018-04-09

寫在前面:由於最近手上專案新接入了兩個中介軟體,在接入過程中遇到了很多問題,大部分問題都是由身邊同事以及中介軟體的開發者幫忙解決的,在他們解決的過程中學習到了很多關於debug的技巧。同時結合網上的一些介紹,總結出關於Eclipse的Debug的相關知識。

沒有任何程式設計師能夠一氣呵成的寫出沒有任何BUG的程式碼,所以很多程式設計師有相當一部分時間是花費在Debug上的,程式除錯是每個程式設計師必須面對的工作,如何使用Eclipse進行有效的、尤其是高效的進行程式碼除錯是一個值得學習的技巧。

一、Eclipse除錯介紹

二、Eclipse中和Debug相關的檢視

2.1 Debug View

2.2 Variables View

2.3 Breakpoints View

2.4 Expressions View

2.5 Display View

三、Debug

3.1 設定斷點

3.2 除錯程式

3.2.1 除錯本地 Java 語言程式

3.3.2 遠端除錯


一、Eclipse除錯介紹

使用過Eclipse的人都知道,Eclipse都是自帶Java偵錯程式的,可以提供很多基本的除錯功能。 Eclipse 平臺工作臺及其工具是圍繞 JDT 元件構建的,該元件為 Eclipse 提供了下列特性:

專案管理工具 透檢視和檢視 構造器、編輯器、搜尋和構建功能 偵錯程式


二、Eclipse中和Debug相關的檢視

圖 1. Eclipse Debug 透檢視的一般檢視(該檢視可以在Eclipse介面的右上角位置點選Debug按鈕進入)

DebugView


Debug View:

debug

Debug檢視允許您在工作臺上管理正在除錯和執行的程式,他顯示了你正在除錯的程式中掛起的執行緒的堆疊幀,程式中的每個執行緒作為樹的節點出現。他展示了正在執行的每個目標的程式。如果執行緒被掛起,它的堆疊幀以子元素的形式展示。以下是一些常用的debug按鈕:

skip_brkp

Skip All Breakpoints::將所有斷點設定為被跳過的,設定了Skip All Breakpoints之後,所有斷點上都會有一個斜線,表示斷點將被跳過,執行緒不會在該斷點處被掛起。

drop_to_frame

Drop to Frame: 這個命令可以讓程式回到當前方法的開頭第一行重新開始執行,可以重新執行這個java堆疊幀,可以選擇一個指定的堆疊幀,然後點選 Drop to Frame,這樣就可以重新進入指定的堆疊幀。使用Drop to Frame時候需要注意:

1.不能drop到已經執行過的方法棧中的方法中。

2.drop到stack frame中時,不會改變全域性資料原有的值,比如,一個包含元素的vertor並不會被清空。

stepbystep_co

Step Filters: 這個功能比較簡單,就是當我們在debug的時候想要忽略一些我們不關注的類時,可以開啟Step Filters進行過濾,程式會一直執行直到遇到未經過濾的位置或斷點。Step Filters功能由Use Step FiltersEdit Step FiltersFilter TypeFilter Package四項組成。具體操作如下:

步驟 1: Windows -> Preferences -> Java -> Debug -> Step Filtering.

步驟 2:選擇‘Use Step Filters’.

步驟 3:在螢幕上選中所需的選項。你可以新增你自己程式碼庫中的部分程式碼。

步驟 4:點選‘Apply’.

  原理上,Edit Step Filter命令用於配置Step Filter規則,而Filter TypeFilter Package分別指的是過濾的Java型別與Java Package。

stepreturn_co

Step Return: 跳出當前方法,在被呼叫方法的執行過程中,使用Step Return會在執行完當前方法的全部程式碼後跳出該方法返回到呼叫該方法的方法中。

stepover_co

Step Over: 在單步執行時,在函式內遇到子函式時不會進入子函式內單步執行,而是將子函式整個執行完在停止,也就是把子函式整個作為一步。

stepinto_co

Step Into: 單步執行,遇到子函式就進入並且繼續單步執行

resume_co

Resume: 恢復暫停的執行緒,直接從當前位置跳到下一個斷點位置。

suspend_co

Suspend: 暫停選定的執行緒,這個時候可以進行瀏覽或者修改程式碼,檢查資料等。

Eclipse通過Suspend與Resume來支援執行緒的暫掛與恢復。一般來講,Suspend適用於多執行緒程式的除錯,當需要檢視某一個執行緒的堆疊幀及變數值時,我們可以通過Suspend命令將該執行緒暫掛。Resume用於恢復。有兩種Resume需要注意:第一是當在除錯過程中修改程式程式碼,然後儲存,點選Resume,此時程式會暫掛於斷點。第二是當程式丟擲異常時,執行Resume,程式也會暫掛於斷點。

terminate_co

Terminate: Eclipse通過Terminate命令終止對本地程式的除錯。

disconnect_co

Disconnect: Eclipse使用Disconnect命令來終止與遠端JVM的socket連線。


Variables View :

velue

Variables View顯示與Debug View中選定的堆疊幀相關的變數資訊,除錯Java程式時,變數可以選擇將更詳細的資訊顯示在詳細資訊窗格中。此外,Java物件還可以顯示出其包含的屬性的值。在該視窗中選中變數滑鼠右鍵點選可以進行許多操作,主要操作有以下這些:

All Instances: 開啟一個對話方塊來顯示該java類的所有例項,使用該功能需要java虛擬機器支援例項的檢索。

All References: :開啟一個對話方塊來顯示所有引用了該變數的java物件,

Change Value: :更改變數的值,該功能可以和Drop to Frame聯合使用進行程式的除錯。使用這兩個功能就可以代替重新debug

Copy Variables: 複製變數的值,尤其在變數值很長(比如json資料)的時候,這個功能就派上用場了。

Find: 有的時候一個類中變數特別多的時候,可以進行查詢。


Breakpoints View :

break

Breakpoints View將列出你在當前工作區間裡設定的所有斷點,雙擊斷點可以進入到程式中該斷點的位置。還可以啟用或禁用斷點,刪除,新增新的,根據工作組或點命中計數給他們分組。在使用斷點是有以下兩個技巧是十分有用的:

Hit Count: 是指定斷點處的程式碼段執行多少次,最典型的就是迴圈,如果要讓一個迴圈執行10次就執行緒掛起,則指定Hit Count值為10,那麼當前的迴圈執行到第九次的時候就會掛掉。

Conditional: 顧名思義,就是條件判斷,例如我們需要迴圈變數i==10時,執行緒掛起,則條件設定為i==10,選擇Suspend when "true"。

那如果上面的Hit Count和Conditional都選擇的話,如果表示式和值設定不合理則會實效。如果選擇Suspend when value changes,那麼可能在Conditional在變數值發生改變的時候就掛起。


Expressions View :

express

要在 Debug 透檢視的編輯器中求表示式的值,選中設定有斷點的一整行,並在上下文選單中選擇 Inspect 選項。表示式是在當前堆疊幀的上下文中求值的,其結果顯示在 Display 視窗的 Expressions 檢視中。 比如我想要計算變數a+b的值,那麼就可以在表示式檢視中加一個表示式:a+b


Display View :

disp

可以使用這個檢視,輸入或者演算一些新的程式碼。這些程式碼在當前的除錯位置的上下文環境中被執行,這意味著,你可以使用所有變數甚至是內容助手。要執行你的程式碼的話,只需標記它,並使用右鍵選單或者CTRL+U(執行)或者 CTRL+SHIFT+I (檢查).


三、Debug

設定斷點

在原始碼檔案中,在想要設定斷點的程式碼行的前面的標記行處,雙擊滑鼠左鍵就可以設定斷點,在相同位置再次雙擊即可取消斷點。有的時候我們還有這樣的需要,就是我並不想一行一行的執行程式碼,比如一個for迴圈會迴圈1000多遍,我只想在第500遍的時候讓執行緒掛起進行除錯,這個時候我們可以使用 條件斷點

設定條件斷點:我們可以給該斷點設定觸發條件,一旦滿足某條件是才開始除錯,可以在斷點處點選滑鼠右鍵,選擇Breakpoint Properties進入斷點設定頁面, 剛剛在講斷點檢視的時候我們學到過Hit CountConditional的用法,這裡可以設定條件和執行次數。


除錯程式

1、除錯本地 Java 語言程式

在所有除錯中,除錯一個Java程式是最簡單的,主要有 設定斷點啟動除錯單步執行結束除錯 幾步。

設定斷點: 前面已經說過。

啟動除錯: Eclipse提供四種方式來啟動程式(Launch)的除錯,分別是通過選單(Run –> Debug)、圖示(“綠色臭蟲”)、右鍵->Debug As以及快捷鍵(F11),在這一點上,與其他命令(例如Run)類似。

單步執行: 主要使用前面講過的幾個檢視進行除錯,其中debug檢視中的幾個按鈕有快捷鍵:

Step Retuen(F7)

Step Over (F6)

Step Into (F5)

結束除錯: 通過Terminate命令終止對本地程式的除錯。


2、遠端除錯

遠端除錯主要用於除錯非本地Java程式,這裡的非本地並不是只在其他人的機器上才叫非本地。執行在本機上的Web伺服器上的程式在除錯時也需要使用遠端除錯。遠端除錯的大致步驟和除錯本地Java語言程式基本一直,只是在設定上有些不同。

Eclipse 偵錯程式可以除錯遠端應用程式。它可以連線到一個執行 Java 應用程式的遠端 VM,將自己連線到該應用程式上去。使用遠端除錯會話與使用本地除錯會話大致相同。但是,遠端除錯配置需要在 Run > Debug 視窗中配置一些不同的設定。需要在左側檢視中先選擇 Remote Java Application 選項,然後單擊 New。這樣就建立了一個新的遠端啟動配置,會顯示出三個選項卡:ConnectSourceCommon

QQ截圖20150314215010

在 Connect 選項卡的 Project 欄位,選擇在啟動搜尋原始碼時要引用的專案。在 Connect 選項卡的 Host 欄位,輸入執行 Java 程式的遠端主機的 IP 地址或域名。在 Connect 選項卡的 Port 欄位,輸入遠端 VM 接收連線的埠。通常,該埠在啟動遠端 VM 時指定。如果想讓偵錯程式決定在遠端會話中 Terminate 命令是否可用,可以選擇 Allow termination of remote VM 選項。如果希望可以終止連線的 VM,則選擇該選項。現在,在選擇 Debug 選項時,偵錯程式會嘗試連線到指定地址或埠的遠端 VM,結果會在 Debug 檢視中顯示出來。


Eclipse的Debug介紹與技巧

參考資料:

Eclipse Help : help.eclipse.org/luna/index.…

使用 Eclipse 平臺進行除錯 : www.ibm.com/developerwo…

使用 Eclipse 遠端除錯 Java 應用程式 : www.ibm.com/developerwo…

使用Eclipse除錯Java程式的10個技巧 : developer.51cto.com/art/201304/…

Eclipse 偵錯程式:零距離接觸實戰技巧 : hb.qq.com/a/20111125/…

相關文章