調試是程序員無法回避的工作。調試方法有許多種,但歸根結底,就是找到引發錯誤的代碼。舉例來說,在 Linux 應用程序中,分段故障被認為是最常見的錯誤之一。當程序嘗試訪問未分配給它的內存並因為分段違例而終止時,將產生這種錯誤。
要修正這種錯誤,您需要找到引發該行為的那行代碼。一旦找到有問題的代碼行,這對於知道引發錯誤的上下文及其相關的值、變量和方法也是有所幫助的。使用調試器將使查找這些信息變得相當簡單。
Eclipse 調試器及 Debug 視圖
Eclipse 平台的特色在於內置了 Java 調試器,該調試器提供所有標准調試功能,包括進行單步執行、設置斷點和值、檢查變量和值以及暫掛和恢復線程的能力。此外,您還可以調試在遠程機器上運行的應用程序。Eclipse 平台主要是一個 Java 開發環境,但其體系結構同時也向其它編程語言開放。如以下您將看到的,同一個 Eclipse 的 Debug 視圖也可用於 C 和 C++ 編程語言。
Eclipse 平台工作台(Eclipse Platform Workbench)及其工具是基於 Java 開發工具(JDT)組件所構建的。這些組件向 Eclipse 提供以下功能:
1、項目管理工具
2、透視圖和視圖
3、構建器、編輯器、搜索和構建功能
4、調試器
Eclipse 調試器本身是作為 Eclipse 二進制文件中包含的標准插件而存在的。Eclipse 還有一個特別的 Debug 視圖,允許您在工作台中管理程序的調試和運行。它為調試中的每個目標顯示其暫掛線程的堆棧幀。程序中的各個線程以作為樹的節點出現,而 Debug 視圖則顯示運行中的各目標的進程。如果暫掛一個線程,則其堆棧幀顯示為子元素。
在您開始使用 Eclipse 調試器之前,假定您已經安裝了適當的 Java SDK/JRE(我推薦您使用 Java VM 1.4)和 Eclipse 平台 SDK 2.0/2.1,且兩者都工作正常。
一般來說,先使用 Eclipse 樣本來測試一下調試選項是一個好主意。如果您要開發和調試 C/C++ 項目,您還需要得到並安裝 C/C++ 開發工具(C/C++ Development Tool,CDT)。有關 Java SDK/JRE、Eclipse 平台和樣本以及 CDT 的鏈接,圖1顯示了 Debug 用戶界面的常規視圖。
圖 1. Eclipse Debug 視圖用戶界面的常規視圖
調試 Java
在您能調試您的項目之前,需要先完整地編譯和運行代碼。您首先需要為您的應用程序創建運行配置並確認其正常啟動。之後,您需要使用 Run > Debug...菜單,以同樣的方式設置調試配置。您還需要選擇作為主 Java 類的由調試器使用的類(也請參閱 圖 2)。對一個項目,您希望有幾種調試配置就可以有幾種。當調試器啟動後(通過 Run > Debug...),會在一個新窗口打開它,您可以准備開始調試。
圖 2. 在調試配置中設置項目的主 Java 類
以下是最常見的 Eclipse 調試操作的示例指示信息:
設置斷點
當您啟動應用程序以進行調試時,Eclipse 自動切換到 Debug 透視圖。無庸置疑,最常見的調試過程就是設置斷點,以允許檢查在條件語句和循環中的變量和值。要在 Java 透視圖的 Package Explorer 視圖中設置斷點,雙擊所選的源代碼文件,在編輯器中打開它。遍歷全部代碼,將光標放置在含有可疑代碼的那一行的標記欄上(在編輯器區域的左側)。雙擊以設置斷點(也請參閱 圖 3)。
圖 3. 在編輯器左側邊緣可看到兩個斷點標記
現在通過 Run > Debug...菜單啟動調試會話。有一點很重要,不要把數條語句放在同一行,因為您不能在同一行的多條語句上單步跳過或設置行斷點(也請參閱 圖 4)。
圖 4. 視圖通過左側邊緣的箭頭指出當前正在執行的行
條件斷點
一旦您找到出錯的地方,您會想要了解在崩潰前程序在干些什麼。完成該工作的一種方法是單步執行程序中的每條語句,一次一句,直到到達出問題的地方。有時候更好的方法是僅運行某段代碼並在出問題的地方終止其執行,這樣就可以檢查該位置上的數據。要實現這一點,可能要聲明每當表達式的值更改時就被觸發的條件斷點(請參閱 圖 5)。此外,在輸入條件表達式時還可以使用代碼輔助。
圖 5. 設置條件斷點觸發器
對表達式求值
要在 Debug 透視圖的編輯器中求表達式的值,選中設置有斷點的一整行,並在上下文菜單中選擇 Inspect 選項(請參閱 圖 6)。表達式是在當前堆棧幀的上下文中求值的,其結果顯示在 Display 窗口的 Expressions 視圖中。
圖 6. 用 Inspect 選項求表達式的值
查看變量
Variables 視圖(在 Display 窗口中)顯示了選中的堆棧幀中的變量值(請參閱 圖 7)。要查看所請求的變量,只需展開 Variables 視圖中的樹直到您看到所請求的元素為止。您也可以在 Debug 視圖中單步執行代碼的同時,在 Variables 視圖中查看變量。
圖 7. 在 Display 窗口中查看變量
當調試器在斷點上停止時,您可以通過在 Run > Debug...菜單上選擇 Step Over 選項來繼續調試器會話(請參閱 圖 8)。這將單步跳過突出顯示的代碼行並執行同一個方法中的下一行(或者它在調用當前方法的方法中繼續)。作為最後一步的結果而發生更改的變量用顏色突出顯示(缺省值是紅色),所用顏色可在“Changed Variable Value Color”首選項(由 Debug Variable Views 指定)中指定。
圖 8. Run... 菜單中的調試器命令
要在 Debug 視圖中暫掛線程的執行,選擇一個運行中的線程並單擊 Debug 視圖工具欄中的 Suspend按鈕。會顯示該線程的當前調用堆棧,並且在 Debug 透視圖的編輯器中突出顯示當前執行的行。
暫掛線程時,將光標放置到 Java 編輯器中的變量上,該變量的值顯示在一個小懸浮窗口中。同樣,該線程的頂部堆棧幀被自動選中,該堆棧幀中的可視變量顯示在 Variables 視圖中。可以通過在 Variables 視圖中單擊變量名來檢查相應的變量。
熱交換錯誤修正:實時代碼修正如果您運行的是 JVM 1.4(Java 虛擬機,Java Virtual Machine),Eclipse 2.0.2 和 2.1 提供一個叫做熱交換錯誤修正(Hotswap Bug Fixing)的新功能(無法用於 JVM 1.3 或更低版本 - 也請參閱 圖 9)。
它允許在調試器會話過程中更改源代碼,這要比“退出應用程序,更改源代碼,重新編譯,再啟動另一個調試會話”的一系列步驟好多了。要使用該功能,只需在編輯器中更改代碼並恢復調試。由於 JVM 1.4 與 Java 平台調試器體系結構(Java Platform Debugger Architecture,JPDA)兼容,所以能使用該功能。
JPDA 實現了在運行中的應用程序中用經過修改的代碼進行替換的能力。當然,當啟動您的應用程序或找到出錯點需要花費很長時間的時候,該功能極其有用。
圖 9. 熱交換錯誤修正功能不能在JVM1.3及更低版本中使用
如果您完成調試時程序還沒有被完整地執行過,請在 Debug 視圖中的上下文菜單中選擇 Terminate 選項。一個常見的錯誤是您在調試器會話中使用了 Debug 或 Run 而不是 Resume。這樣將會啟動另一個調試器會話,而不是繼續當前的會話。
遠程調試
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 視圖中顯示結果。
如果啟動器無法連接至指定位置上的 VM,將顯示錯誤消息。一般來說,遠程調試功能的可用性完全取決於遠程主機上運行的 Java VM(虛擬機,Virtual Machine)。 圖 10顯示了遠程調試會話的連接屬性的設置。
圖 10. 設置遠程調試會話的連接屬性
調試其它語言
Java 是 Eclipse 平台的主語言。然而,Eclipse 平台同時也是一個可支持許多其它語言的可擴展平台,而其中最重要的就是支持 C/C++(因為其流行性)。Eclipse 通過用 C/C++ 開發工具(CDT)支持 C/C++。請參閱 參考資料以獲取相關鏈接。
CDT 通過調試 C/C++ 代碼的功能擴展了標准的 Eclipse Debug 視圖,同時 CDT Debug 視圖允許您在工作台中管理 C/C++ 項目的調試。CDT 不包含其內部調試器,但它向必須可在本地使用的 GNU GDB 調試器提供了一個前端。
下載並安裝了 CDT 之後,只需切換到 Debug 視圖,您就可以開始調試當前的 C/C++ 項目了(請參閱 參考資料,以獲取一篇介紹如何安裝 CDT 的文章的鏈接)。這樣您可以設置(並在執行過程中任何時候更改)代碼中的斷點,並且跟蹤變量和寄存器。
Eclipse 調試器顯示您調試中各個目標的暫掛線程的堆棧幀。程序中的各個線程作為樹的節點出現。它顯示了運行中各目標的進程。請記住當 GNU GDB 調試一個帶有調試符號鏈接的程序時,它最有效。這是在編譯過程中由命令行參數 -g 來實現的。需要更多的信息請使用 -ggdb 開關,該參數包含有特定於 GNU GDB 的調試符號。
如果您要調試 servlet,使用 Sysdeo Eclipse Tomcat Launcher。該插件使您能夠管理 Tomcat 4.x/3.3 servlet 容器(通過創建和導入一個 Tomcat WAR 項目)。它同時在一個內部 Java Eclipse 調試器中注冊一個 Tomcat 進程,這樣您就能方便地調試 Tomcat 應用程序了。還有其它幾個 Eclipse 插件,使我們能夠對 servlet 使用內部 Eclipse 調試器,比如 Cactus 的 Eclipse 插件,Resin 插件和 X-Parrots ServletExec 插件。
結束語
Eclipse 平台提供了內置的 Java 調試器,該調試器具有標准調試功能,包括進行單步執行、設置斷點和值、檢查變量和值以及暫掛和恢復線程的能力。它還可以用於調試在遠程機器上運行的應用程序。Eclipse 平台主要是一個 Java 開發環境,但是同一個 Eclipse 的 Debug 視圖也可用於 C 和 C++ 編程語言。