通過本文了解如何使用 Eclipse 平臺的內置功能來調試軟件項目。調試是編程人員必須面對的工作。調試的方法有很多種,但是歸根結底,就是找出有 bug 的代碼。例如:Linux應用程序中最常見的一個錯誤就是段錯誤(segmentation fault)。在程序試圖訪問沒有分配給它的內存時,會因為段越界而終止,這時就發生了這個錯誤。為了修復這類錯誤,需要找到觸發錯誤的那行代碼。找到出現問題的代碼以后,了解發生錯誤的上下文、相關值、變量和方法也很有用。使用調試器找出這些信息非常簡單。
Eclipse 調試器和 Debug 視圖
Eclipse SDK 是針對 Java™ 開發工具(Java™ Development Tools,JDT)的項目,它具有一個內置的 Java 調試器,可以提供所有標準的調試功能,包括分步執行、設置斷點和值、檢查變量和值、掛起和恢復線程的功能。除此之外,還可以調試遠程機器上運行的應用程 序。Eclipse 平臺很健壯,因為其他編程語言可以將該平臺提供的調試工具用于各自的語言運行時。正如下文所示,同一個 Eclipse Debug 視圖也可以用于 C/C++ 編程語言。
Eclipse 平臺工作臺及其工具是圍繞 JDT 組件構建的,該組件為 Eclipse 提供了下列特性:
l 項目管理工具
l 透視圖和視圖
l 構造器、編輯器、搜索和構建功能
l 調試器
Eclipse 調試器本身是 Eclipse 內的一個標準插件集。Eclipse 還有一個特殊的 Debug 視圖,用于在工作臺中管理程序的調試或運行。它可以顯示每個調試目標中掛起線程的堆棧框架。程序中的每個線程都顯示為樹中的一個節點,Debug 視圖顯示了每個運行目標的進程。如果某個線程處于掛起狀態,其堆棧框架顯示為子元素。
在使用 Eclipse 調試器之前,假定您已經安裝了合適的 Java SDK/JRE(我推薦使用 Java VM V1.4)和 Eclipse Platform SDK V3.3,而且兩者的運行都沒問題。一般來說,先用 Eclipse 示例測試一下調試選項比較好。如果想開發和調試 C/C++ 項目,還需要獲得并安裝 C/C++ 開發工具(C/C++ Development Tools,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. 編輯器左側看到的兩個斷點
現在,從 Run > Debug 菜單啟動調試會話。最好不要將多條語句放在一行上,因為會無法單步執行,也不能為同一行上的多條語句設置行斷點。

圖 4. 視圖中左側空白處的箭頭指示當前正在執行的行
還有一個方便的斷點視圖來管理所有的斷點。

圖 5. 斷點視圖
條件斷點
一旦了解到錯誤發生的位置,您可能想要知道在程序崩潰之前,程序在做什么。一種方法就是單步執行程序的每行語句。一次執行一行,直到運行到可疑的那行代碼。 有時,最好只運行一段代碼,在可疑代碼處停止運行,在這個位置檢查數據。還可以聲明條件斷點,它在表達式值發生變化時觸發(請參見圖 6)。除此之外,在輸入條件表達式時,也可以使用代碼幫助。

圖 6. 設置條件斷點觸發器
計算表達式的值
為了在 Debug 透視圖的編輯器中計算表達式的值,選擇設置了斷點的那行代碼,在上下文菜單中,通過 Ctrl+Shift+I 或右鍵單擊您感興趣的變量(參見圖 7)選擇 Inspect 選項。在當前堆??蚣艿纳舷挛闹袝嬎惚磉_式的值,在 Display 窗口的 Expressions 視圖中會顯示結果。

圖 7. 通過 Inspect 選項計算表達式的值
剪切活動代碼
Display 視圖允許您以剪切類型的方式處理活動代碼(參見圖 8)。要處理一個變量,在 Display 視圖中輸入變量名即可,視圖會提示您一個熟悉的內容助手。

圖 8. Display 視圖
當調試器停止在一個斷點處時,您可以從 Debug 視圖工具欄(參見圖 9)中選擇 Step Over 選項,繼續調試器會話。該操作會越過高亮顯示的那行代碼,繼續執行同一方法中的下一行代碼(或者繼續執行調用當前方法的那個方法的下一行代碼)。執行上一 步后發生改變的變量會用某種顏色高亮顯示(默認是黃色)。顏色可以在調試首選項頁面中改變。

圖 9. 改變顏色的變量
要在 Debug 視圖中掛起執行線程,選擇一個運行線程,單擊 Debug 視圖工具欄中的 Suspend。 該線程的當前調用堆棧就會顯示出來,當前執行的代碼行就會在 Debug 透視圖中的編輯器中高亮顯示。掛起一個線程時,將鼠標放在 Java 編輯器中的變量上,該變量的值就會在一個小的懸停窗口中顯示出來。此時,該線程的頂部堆棧框架也會自動選中,其中的可視變量也會在 Variables 視圖中顯示出來。您可以通過單擊 Variables 視圖中合適的變量名來檢查變量。
熱交換錯誤修正:動態代碼修正
如果運行的是 Java 虛擬機(Java Virtual Machine,JVM)V1.4 或更高的版本,Eclipse 支持一個叫做熱交換錯誤修正(Hotswap Bug Fixing)的功能,JVM V1.3 或更低的版本不支持該功能。該功能允許在調試器會話中改變源代碼,這比退出應用程序、更改代碼、重新編譯、然后啟動另一個調試會話更好。要利用該功能,在 編輯器中更改代碼后重新調試即可。由于 JVM V1.4 與 Java 平臺調試器架構(Java Platform Debugger Architecture,JPDA)兼容,所以才有可能具備該功能。JPDA 實現了在運行的應用程序中替換經過修改的代碼的功能。如果應用程序啟動時間較長或執行到程序失敗的地方時間很長,那么這一點特別有用。
如果在完成調試時,程序還沒有全部執行一遍,在 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。圖 10 顯示了一個遠程調試會話的連接屬性設置。

圖 10. 設置一個遠程調試會話的連接屬性
調試其他語言
盡管 Java 語言是 Eclipse 使用的最廣泛的語言,但是 Eclipse 是一個可擴展的平臺,可以支持許多其他的語言。Eclipse 可以通過 C/C++ 開發工具(CDT)支持 C/C++ 。CDT 擴展了標準的 Eclipse Debug 視圖,添加了調試 C/C++ 代碼的功能,CDT Debug 視圖可以在工作臺中管理 C/C++ 項目的調試過程。CDT 中沒有內部的調試器,但是它提供了一個 GNU GDB 調試器的前端,該調試器必須在本地可用。還有其他項目可以提供各自的調試器,例如 PHP 開發工具(PHP Development Tools ,PDT),請參見圖 11。

圖 11. PHP 調試器
結束語
Eclipse 平臺提供了一個內置 Java 語言調試器,它帶有標準的調試功能,包括分步執行、設置斷點和值、檢查變量和值以及掛起和恢復線程功能。它還可以用來調試運行在遠程機器上的應用程序。 Eclipse 平臺主要是一個 Java 開發環境,但是其中的 Eclipse Debug 視圖還可以用于 C/C++、PHP 和許多其他的編程語言。
轉自IBM中國:http://www.ibm.com/developerworks/cn/linux/opensource/os-ecbug/index.html
posted on 2008-07-29 20:31
胖胖泡泡 閱讀(853)
評論(0) 編輯 收藏