文章目錄
本文非原創,點擊查看原帖
本文寫給那些像幾年前的我一樣剛剛走出校門,及一些未使用過這些進階些的調試技巧的人。
記得剛剛畢業的時候,自己連斷點也不會打,當時還在用JCreate ,就連畢業設計也是用 System.out 找 Bug 的,想想真的很笨。開始工作後,一個星期過去了,在一個 1 、 2 百萬行的系統中找 Bug ,我依然在用 System.out ,當時最痛苦的就是修改代碼,每次找到疑似 Bug ,就輸出一下,然後重啟(那時也不知道代碼熱替換),直到有一天帶我的導師發現了這樣笨笨的調試 Bug ,才讓我第一次認識了斷點,也知道了代碼修改完了可以進行熱替換, 我這個中國教育的半犧牲品才算向美好生活邁進了一小步。
1、 條件斷點
斷點大家都比較熟悉,在Eclipse Java 編輯區的行頭雙擊就會得到一個斷點,代碼會運行到此處時停止。
條件斷點,顧名思義就是一個有一定條件的斷點,只有滿足了使用者佈建的條件,代碼才會在運行到斷點處時停止。
在斷點處點擊滑鼠右鍵,選擇最後一個"Breakpoint Properties"
斷點的屬性介面及各個選項的意思如,
2、 變數斷點
斷點不僅能打在語句上,變數也可以接受斷點,
就是一個變數的打的斷點,在變數的值初始化,或是變數值改變時可以停止,當然變數斷點上也是可以加條件的,和上面的介紹的條件斷點的設定是一樣的。
3、 方法斷點
方法斷點就是將斷點打在方法的入口處,
方法斷點的特別之處在於它可以打在 JDK的源碼裡,由於 JDK 在編譯時間去掉了調試資訊,所以普通斷點是不能打到裡面的,但是方法斷點卻可以,可以通過這種方法查看方法的調用棧。
4、 改變變數值
代碼停在了斷點處,但是傳過來的值不正確,如何修改一下變數值保證代碼繼續走正確的流程,或是說有一個異常分支老是進不去,能不能調試時改一下條件,看一下異常分支代碼是否正確?
在Debug 視圖的 Variables 小視窗中,我們可以看到 mDestJarName 變數的值為 " F:\Study\eclipsepro\JarDir\jarHelp.jar "
我們可以在變數上右鍵,選擇"Change Value..." 在彈出的對話方塊中修改變數的值,
或是在下面的值查看視窗中修改,保用Ctr+S 儲存後,變數值就會變成修改後的新值了。
5、 重新調試
這種調試的回退不是萬能的,只能在當前線程的棧幀中回退,也就說最多隻能退回到當前線程的調用的開始處。
回退時,請在需要回退的線程方法上點右鍵,選擇 "Drop to Frame"
6、 遠端偵錯
用於調試不在本機上的程式,有兩種方式,
1、本機作為用戶端
2、本機作為服務端
使用遠端偵錯的前提是伺服器端和用戶端的代碼是一致的。
本機作為用戶端
本機作用戶端比較常用,需要在遠端的伺服器上的java程式在啟動時開啟遠端偵錯開關,
伺服器端需要加上虛擬機器參數
1.5以前版本(1.5以後也可用):【-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 】
1.5及以上版本:【 -agentlib:jdwp=transport=dt_socket,server=y,address=8000】
F:\Study\eclipsepro\screensnap>java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar screensnap3.jar
串連時遠程伺服器時,需要在Eclipse中建立一個遠端偵錯程式
這裡有一個小地方需注意,串連上的時候貌似不能自動切換到Debug視圖,不要以為原生偵錯工具沒有串連到伺服器端。
本機作為服務端
同本機作為用戶端相比,只需要修改一下“Connection Type”
這時Eclipse會進入到等待串連的狀態
串連程式使用如下參數即可串連本機伺服器,IP地址請用實現IP替換~~
【-agentlib:jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:8000】
F:\Study\eclipsepro\screensnap>java -agentlib:jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:8000 -jar screensnap3.jar
遠端偵錯時本地的代碼修改可同步到遠程,但不會寫到遠端檔案裡,也就是說本地修改會在下次啟動遠程程式時就沒有了,不會影響到下次使用時的遠程代碼。
有關遠端偵錯更詳細點的介紹請參考【使用 Eclipse 遠端偵錯 Java 應用程式】
好像漏了一個斷點,異常斷點,補一下。
7、異常斷點
經常遇見一些異常,然後程式就退出來了,要找到異常發生的地方就比較難了,還好可以打一個異常斷點,
中我們增加了一個NullPointException的異常斷點,當異常發生時,代碼會停在異常發生處,定位問題時應該比較有協助。