對於使用Eclipse進行日常編程工作的工程師來說,調試是每天都在進行的工作。針對一般意義上的調試過程,相信每一位工程師朋友都熟練掌握了。這里介紹幾個調試中比較實用的高級功能。
Eclipse遠程調試
Java自身支持調試功能,並提供了一個簡單的調試工具--JDB,類似於功能強大的GDB,JDB也是一個字符界面的調試環境,並支持設置斷點,支持線程線級的調試。
由於部署環境的差異性,相信很多朋友都碰到過開發環境正常測試過的功能在測試環境甚至生產環境下出現bug的情況。一般情況下,生產環境可以采取的手段比較單一,即通過日志的方式獲取運行中的環境上下文,分析日志文件並嘗試重現bug。這會帶來的問題還是不少的,首先,日志的分析是一項比較耗時的工作;其次,現有的日志記錄不一定能反映出問題,你可能需要多次重復這個過程(分析日志->猜測問題->加日志->部署->獲取日志)來慢慢逼近問題。倘若是測試環境,我們還多了一項可供選擇的手段——遠程調試——將程序在測試環境中以debug模式啟動,在本機使用Eclipse在工程中設置斷點進行調試。
【具體步驟】
- 修改服務器啟動參數
在服務器上的進程啟動參數中添加:
-Xdebug -Xrunjdwp:transport=dt_socket,address=6666,server=y,suspend=n
連接到myhost:6666提供的調試服務。
-Xdebug通知JVM工作在DEBUG模式下,
-Xrunjdwp通知JVM使用(Java debug wire protocol)運行調試環境。該參數同時包含了一系列的調試選項:
transport指定了調試數據的傳送方式;
dt_socket是指用SOCKET模式;
server=y/n VM 是否需要作為調試服務器執行;
suspend=y/n 是否在調試客戶端建立連接之后啟動 VM 。
設置完成后,啟動服務端。
2. 啟動本地代碼
設置 Debug configurations-->Remote Java Application

注意在點擊【Debug】按鈕之前,一定不要多次“啟動本地程序”,否則就會出現"Failed to connect to remote VM. Connection refused"異常,如下圖所示:

3. 調試遠程客戶端
點擊【Debug configurations】中的debug按鈕,運行效果如下,接下來,就和本地調試一模一樣了。在調試過程中,日志打印在遠程服務器,本地console中看不到日志信息。調試的時候需要一個Http客戶端發起請求,比如postman等等。

條件斷點
如果需要對循環中的數據進行調試,使用條件斷點是個不錯的選擇。將斷點設置在指定的位置上,右鍵進一步設置斷點屬性,如下:

調試時,程序會中斷在符合條件的代碼處。
異常斷點
斷點不僅可以設置在某一行,也可以針對整個工程進行設置。假設你知道程序會在某個地方拋出NullPointerException,可是並不是每一次運行都會出現,就可以為工程設置異常斷點,如下:

備注轉自如下兩篇博文,稍作修改。
1. http://greatestrabit.github.io/2016/06/23/debug/.
2. https://www.cnblogs.com/zjrodger/p/6947058.html.
