Eclipse的Debug介紹與技巧
寫在前面:由于最近手上項目新接入了兩個中間件,在接入過程中遇到了很多問題,大部分問題都是由身邊同事以及中間件的開發者幫忙解決的,在他們解決的過程中學習到了很多關于debug的技巧。同時結合網上的一些介紹,總結出關于Eclipse的Debug的相關知識。
</blockquote>沒有任何程序員能夠一氣呵成的寫出沒有任何BUG的代碼,所以很多程序員有相當一部分時間是花費在Debug上的,程序調試是每個程序員必須面對的工作,如何使用Eclipse進行有效的、尤其是高效的進行代碼調試是一個值得學習的技巧。
2.1 Debug View
2.2 Variables View
2.3 Breakpoints View
2.4 Expressions View
2.5 Display View
</blockquote>3.2.1 調試本地 Java 語言程序
3.3.2 遠程調試
</blockquote> </blockquote> </blockquote>
一、Eclipse調試介紹
使用過Eclipse的人都知道,Eclipse都是自帶Java調試器的,可以提供很多基本的調試功能。 Eclipse 平臺工作臺及其工具是圍繞 JDT 組件構建的,該組件為 Eclipse 提供了下列特性:
項目管理工具 透視圖和視圖 構造器、編輯器、搜索和構建功能 調試器
</blockquote>
二、Eclipse中和Debug相關的視圖
圖 1. Eclipse Debug 透視圖的一般視圖(該視圖可以在Eclipse界面的右上角位置點擊Debug按鈕進入)
Debug View:
Debug視圖允許您在工作臺上管理正在調試和運行的程序,他顯示了你正在調試的程序中掛起的線程的堆棧幀,程序中的每個線程作為樹的節點出現。他展示了正在運行的每個目標的進程。如果線程被掛起,它的堆棧幀以子元素的形式展示。以下是一些常用的debug按鈕:
Skip All Breakpoints::將所有斷點設置為被跳過的,設置了Skip All Breakpoints之后,所有斷點上都會有一個斜線,表示斷點將被跳過,線程不會在該斷點處被掛起。
Drop to Frame:這個命令可以讓程序回到當前方法的開頭第一行重新開始執行,可以重新執行這個java堆棧幀,可以選擇一個指定的堆棧幀,然后點擊Drop to Frame,這樣就可以重新進入指定的堆棧幀。使用Drop to Frame時候需要注意:
1.不能drop到已經執行過的方法棧中的方法中。
2.drop到stack frame中時,不會改變全局數據原有的值,比如,一個包含元素的vertor并不會被清空。
</blockquote>Step Filters:這個功能比較簡單,就是當我們在debug的時候想要忽略一些我們不關注的類時,可以開啟Step Filters進行過濾,程序會一直執行直到遇到未經過濾的位置或斷點。Step Filters功能由Use Step Filters,Edit Step Filters,Filter Type,Filter Package四項組成。具體操作如下:
步驟 1: Windows -> Preferences -> Java -> Debug -> Step Filtering.
步驟 2:選擇‘Use Step Filters’.
步驟 3:在屏幕上選中所需的選項。你可以添加你自己代碼庫中的部分代碼。
步驟 4:點擊‘Apply’.
</blockquote>原理上,Edit Step Filter命令用于配置Step Filter規則,而Filter Type與Filter Package分別指的是過濾的Java類型與Java Package。
Step Return:跳出當前方法,在被調用方法的執行過程中,使用Step Return會在執行完當前方法的全部代碼后跳出該方法返回到調用該方法的方法中。
Step Over:在單步執行時,在函數內遇到子函數時不會進入子函數內單步執行,而是將子函數整個執行完在停止,也就是把子函數整個作為一步。
Step Into:單步執行,遇到子函數就進入并且繼續單步執行
Resume:恢復暫停的線程,直接從當前位置跳到下一個斷點位置。
Suspend:暫停選定的線程,這個時候可以進行瀏覽或者修改代碼,檢查數據等。
Eclipse通過Suspend與Resume來支持線程的暫掛與恢復。一般來講,Suspend適用于多線程程序的調試,當需要查看某一個線程的堆棧幀及變量值時,我們可以通過Suspend命令將該線程暫掛。Resume用于恢復。有兩種Resume需要注意:第一是當在調試過程中修改程序代碼,然后保存,點擊Resume,此時程序會暫掛于斷點。第二是當程序拋出異常時,運行Resume,程序也會暫掛于斷點。
</blockquote>Terminate:Eclipse通過Terminate命令終止對本地程序的調試。
Disconnect:Eclipse使用Disconnect命令來終止與遠程JVM的socket連接。
Variables View :
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 :
Breakpoints View將列出你在當前工作區間里設置的所有斷點,雙擊斷點可以進入到程序中該斷點的位置。還可以啟用或禁用斷點,刪除,添加新的,根據工作組或點命中計數給他們分組。在使用斷點是有以下兩個技巧是十分有用的:
Hit Count: 是指定斷點處的代碼段運行多少次,最典型的就是循環,如果要讓一個循環執行10次就線程掛起,則指定Hit Count值為10,那么當前的循環執行到第九次的時候就會掛掉。
Conditional:顧名思義,就是條件判斷,例如我們需要循環變量i==10時,線程掛起,則條件設定為i==10,選擇Suspend when “true”。
那如果上面的Hit Count和Conditional都選擇的話,如果表達式和值設置不合理則會實效。如果選擇Suspend when value changes,那么可能在Conditional在變量值發生改變的時候就掛起。
</blockquote>
Expressions View :
要在 Debug 透視圖的編輯器中求表達式的值,選中設置有斷點的一整行,并在上下文菜單中選擇 Inspect 選項。表達式是在當前堆棧幀的上下文中求值的,其結果顯示在 Display 窗口的 Expressions 視圖中。 比如我想要計算變量a+b的值,那么就可以在表達式視圖中加一個表達式:a+b
Display View :
可以使用這個視圖,輸入或者演算一些新的代碼。這些代碼在當前的調試位置的上下文環境中被執行,這意味著,你可以使用所有變量甚至是內容助手。要執行你的代碼的話,只需標記它,并使用右鍵菜單或者CTRL+U(執行)或者 CTRL+SHIFT+I (檢查).
三、Debug
設置斷點
在源代碼文件中,在想要設置斷點的代碼行的前面的標記行處,雙擊鼠標左鍵就可以設置斷點,在相同位置再次雙擊即可取消斷點。有的時候我們還有這樣的需要,就是我并不想一行一行的執行代碼,比如一個for循環會循環1000多遍,我只想在第500遍的時候讓線程掛起進行調試,這個時候我們可以使用條件斷點。 設置條件斷點:我們可以給該斷點設置觸發條件,一旦滿足某條件是才開始調試,可以在斷點處點擊鼠標右鍵,選擇Breakpoint Properties進入斷點設置頁面,剛剛在講斷點視圖的時候我們學到過Hit Count和Conditional的用法,這里可以設置條件和執行次數。
調試程序
1、調試本地 Java 語言程序
在所有調試中,調試一個Java程序是最簡單的,主要有設置斷點、啟動調試、單步執行、結束調試幾步。
設置斷點:前面已經說過。
啟動調試:Eclipse提供四種方式來啟動程序(Launch)的調試,分別是通過菜單(Run –> Debug)、圖標(“綠色臭蟲”)、右鍵->Debug As以及快捷鍵(F11),在這一點上,與其他命令(例如Run)類似。
單步執行:主要使用前面講過的幾個視圖進行調試,其中debug視圖中的幾個按鈕有快捷鍵:
Step Retuen(F7)
Step Over (F6)
Step Into (F5)
</blockquote>結束調試:通過Terminate命令終止對本地程序的調試。
2、遠程調試
遠程調試主要用于調試非本地Java程序,這里的非本地并不是只在其他人的機器上才叫非本地。運行在本機上的Web服務器上的程序在調試時也需要使用遠程調試。遠程調試的大致步驟和調試本地Java語言程序基本一直,只是在設置上有些不同。
Eclipse 調試器可以調試遠程應用程序。它可以連接到一個運行Java應用程序的遠程VM,將自己連接到該應用程序上去。使用遠程調試會話與使用本地調試會話大致相同。但是,遠程調試配置需要在Run > Debug窗口中配置一些不同的設置。需要在左側視圖中先選擇Remote Java Application選項,然后單擊New。這樣就創建了一個新的遠程啟動配置,會顯示出三個選項卡:Connect、Source和Common。
在 Connect 選項卡的Project字段,選擇在啟動搜索源代碼時要引用的項目。在 Connect 選項卡的Host字段,輸入運行 Java 程序的遠程主機的 IP 地址或域名。在 Connect 選項卡的Port字段,輸入遠程 VM 接收連接的端口。通常,該端口在啟動遠程 VM 時指定。如果想讓調試器決定在遠程會話中Terminate命令是否可用,可以選擇Allow termination of remote VM選項。如果希望可以終止連接的 VM,則選擇該選項。現在,在選擇Debug選項時,調試器會嘗試連接到指定地址或端口的遠程 VM,結果會在 Debug 視圖中顯示出來。
參考資料:
Eclipse Help : http://help.eclipse.org/luna/index.jsp
使用 Eclipse 平臺進行調試 : http://www.ibm.com/developerworks/cn/opensource/os-ecbug/
使用 Eclipse 遠程調試 Java 應用程序 : http://www.ibm.com/developerworks/cn/opensource/os-eclipse-javadebug/
使用Eclipse調試Java程序的10個技巧 : http://developer.51cto.com/art/201304/388155_all.htm
Eclipse 調試器:零距離接觸實戰技巧 : http://hb.qq.com/a/20111125/000136.htm
來自:http://www.hollischuang.com/archives/365