調試的方法雖然千千萬萬,但歸根結底,就是找到引起錯誤的代碼。Eclipse調試器的目標是讓程序員能對本地或遠程程序進行錯誤偵測與診斷。該調試器提供全部標準調試功能,包括進行單步執行、設置斷點和值、檢查變量和值以及暫掛和恢復線程的能力。這篇文章主要講述Eclipse調試器,包括Debug視圖,斷點的設置,Java代碼的調試等等。與一些理論性較強的文章相比,本文更注重實踐,爲讀者提供更加使用的調試技巧。編程
Eclipse 調試器設計模式
Eclipse 平臺的最大特點是插件化(Plugin)。調試是任何程序員都沒法迴避的工做。所以Eclipse的內置插件Java開發工具包(Java Development Toolkit,簡稱JDT)中集成了一個功能強大的Java調試器(Debugger)。實際上,JDT是Eclipse工做平臺(Eclipse Platform Workbench)的基礎工具,除了調試器,還提供透視圖、視圖、編輯器、搜索等Eclipse基礎功能。服務器
因爲Eclipse調試器採用了基於客戶端/服務器的設計模式,遠程應用的調試變得與本地同樣簡單。其工做原理是,本地Eclipse工做平臺充當調試的客戶端,而遠程應用所在的機器則充當了調試服務器的角色。多線程
Debug 視圖框架
Debug視圖做爲Eclipse調試器透視圖的一部分,管理與程序調試相關的功能。如圖所示,Debug視圖呈樹狀結構,每個線程對應一樹節點。圖中顯示的是暫掛線程Main的調試堆棧幀結構。socket
做爲標準的Java調試平臺,Debug視圖提供了許多執行控制命令(Execution Control Commands),用於在程序中設置/取消斷點,單步執行,暫掛與恢復線程。如下是一些經常使用的執行控制命令:編輯器
1. Layout佈局函數
Debug視圖的佈局與斷點調試等主體功能相比,顯得並不那麼乍眼,所以也常被人忽略,不過Eclipse的魅力之一就是它的細節作的特別完美。咱們簡單介紹一下Debug視圖佈局的特色,如圖所示。工具
第一個特色是Automatic功能。選擇菜單選項Layout -> Automatic,能夠實現Debug視圖在樹狀模式與Breadrumb模式之間的自動互換。相信不少編程人員都喜歡Breadrumb模式,向麪包片同樣,一層一層的,直觀,醒目。
Layout菜單的第二個特色Breadrumb模式。選擇菜單選項Layout -> Breadcrumb,打開Breadrumb模式。除此以外,選擇菜單選項Layout -> Auto-Expand Breadcrumb,可實現自動展開Breadrumb模式。當選擇下拉框時,可自動定位到暫掛線程的調試堆棧幀。這個細節對於編程人員來講,也是很是的方便。
2. 調試啓動中止等相關命令
Debug視圖提供了諸多的啓停控制命令,叫法上與其它的調試器可能稍微有些不一樣,具體以下:
啓動調試視圖:Eclipse提供三種方式來啓動程序(Launch)的調試,分別是經過菜單(Run –> Debug)、圖標(「綠色臭蟲」)以及快捷鍵(F11),在這一點上,與其餘命令(例如Run)相似。
中止調試:Eclipse經過Terminate命令終止對本地程序的調試。特別的,對於遠程程序的調試,Eclipse使用 Disconnect命令來終止與遠程JVM的socket鏈接。前面咱們談到,Eclipse調試器採用了基於客戶端/服務器的設計模式,本地 Eclipse工做平臺充當調試的客戶端,而遠程應用所在的JVM則充當了調試服務器的角色。簡單的說,Terminate命令終止本地調試,Disconnect命令終止遠程調試。Terminate/Disconnect All終止全部的調試,包括本地與遠程。
從新啓動調試:Eclipse經過Relaunch命令從新啓動調試。這裏須要指出的是Relaunch支持兩種重啓動模式,一種是針對已經中止的程序調試,另外一種是針對Active的當程序調試。前者不難理解,效果上等同於Terminate+Launch。後者的處理方式有些不一樣,效果上則等同於Launch一個新的Debug項。實際上,針對後一種狀況,咱們一般採用Eclipse的Terminate and Relaunch命令來達到重啓Debug的目的。
刪除調試項:Eclipse支持針對多個程序的調試。咱們稱每一項對應一個Debug Item。Remove命令將某一個Debug Item從當前的Debug視圖中刪除。不過,Remove命令只適用於已中止的Debug Item,而對於運行中的Debug Item,Eclipse提供了Terminate and Remove命令。假如想中止並清除全部的Debug Item,則能夠經過Terminate and Remove All命令。此外,Eclipse還提供了Copy Stack命令或者快捷鍵Ctr+C,可將調試堆棧幀內容拷貝至剪貼板中,這樣效果上就等同於「撤銷」。
以上這些命令雖然有些瑣碎,可是很是能反映Eclipse對細節的把握與控制。
3. 單步執行
相信任何調試人員對單步調試很是的熟悉。Eclipse提供step into、step over、 step return三個命令來支持單步調試。三者的具體區別是:step into(快捷鍵F5)就是單步執行,遇到子函數就進入而且繼續單步執行;step over(快捷鍵F6)是在單步執行時,在函數內遇到子函數時不會進入子函數內單步執行,而是將子函數整個執行完再中止,也就是把子函數整個做爲一步。 step return(快捷鍵F7)就是單步執行到子函數內時,用step return就能夠執行完子函數餘下部分,並返回到上一層函數。說的通俗點就是,step into:進入子函數,step over:越過子函數,但子函數會執行,step return:跳出子函數。
此外,Eclipse還提供了Run to line(快捷鍵Ctr + R)功能,從開始處運行程序,到正在執行的斷點暫停。
4. Drop to Frame
Drop to Frame功能雖然不屬於單步調試的核心,可是該功能很是的適用,它爲調試人員提供了調試回退的機會。Drop to Frame能夠從新跳到當前方法的開始處從新執行,而且全部上下文變量的值也相應回到初始時刻,如圖所示。
5. Step Filters
當在你調試的時候,你只但願查看本身的代碼,而不是從JDK或者是其餘庫中的代碼,甚至是你也想屏蔽本身代碼庫中的框架部分代碼。
針對這樣的需求,Eclipse提供了逐步過濾器(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’.
原理上,Edit Step Filter命令用於配置Step Filter規則,而Filter Type與Filter Package分別指的是過濾的Java類型與Java Package,如圖所示。
6. 聲明選項
Open Declared Type命令會打開當前調試堆棧幀的類型聲明編輯器。而Open Declared Type Hierarchy則展示的是完整的層次結構,如圖所示。
7. 線程的暫掛/恢復
Eclipse經過Suspend與Resume來支持線程的暫掛與恢復。通常來說,Suspend適用於多線程程序的調試,當須要查看某一個線程的堆棧幀及變量值時,咱們能夠經過Suspend命令將該線程暫掛。Resume用於恢復。有兩種Resume須要注意:第一是當在調試過程當中修改程序代碼,而後保存,點擊Resume,此時程序會暫掛於斷點。第二是當程序拋出異常時,運行Resume,程序也會暫掛於斷點。
8. Show Monitor命令
Show Monitor命令可實時顯示變量的值。舉個例子,咱們寫一個簡單的HelloWorld程序。
如下是代碼片斷: /** * Hello World */ public class HelloWorld { public static void main(String[] args) { Line 11: Object mutex = new Object(); synchronized (mutex) { System.out.println("Hello World!"); } } } |