做爲程序你們都知道,寫代碼和調試的時間是差很少9:1,也就是說90% 的時間你們都在調試代碼,怎麼樣才能最快的發現bug?java
調試是開發中最重要的解決問題的方法,在開發中也看到不少同事只會簡單的使用調試,所以寫下這篇文章。正所謂 工欲善其事必先利其器,好的調試技巧讓你在開發中如魚得水。bash
調試從大的方面來說主要是本地調試 和遠程調試。本地調試就是在本地使用IDE的debug按鈕啓動項目,多線程
遠程調試通常是指調試其餘機器上的程序。下面從這兩個方面分開講一下。由於我開發中使用的是idea,因此下面的實例和截圖都來自idea。調試的技巧是同樣的,用eclipse的同窗能夠本身遷移到eclipse上。eclipse
顧名思義,行斷點就是在代碼的左邊單擊,紅色的圓點就表明斷點成功,在代碼運行到這一行的時候會觸發。socket
方法斷點就是斷點在方法簽名上,在調用這個方法時會觸發斷點。如上圖菱形紅點ide
字段斷點就是在字段的定義的地方加斷點,任何訪問或者寫入的地方都會觸發斷點。函數
異常斷點在debug視圖下,點擊兩個小圓點,打開斷點界面,而後點擊「+」號,選擇Java Exception Breakpoints,輸入你想斷點的異常名字。好比經常使用的NullPointerException,只要程序運行的時候拋出這個異常,都會觸發斷點。測試
條件斷點太牛了,前面的斷點每一個寫代碼的應該都知道,是入門的。這部分是今天的重點,也是精華所在。this
1.Enable 斷點是否起做用,沒什麼可講的,通常的時候會啓用。lua
2.Suspend 掛起。後面有兩個選項,選項All表示暫停當前應用的全部線程,Thread表示掛起當前正在運行代碼的線程。通常在調試多線程的時候,選擇thread,這樣不會影響其餘的線程,能夠調試多線程問題。
3.Condition 懂點英文的都知道這個單詞的意思,條件。這一部分的核心。
當勾選了這個選項時,會運行Condition框內的代碼,只能返回true 或者false。當爲true時會觸發斷點。false的時候則不觸發。條件輸入的時候可使用當前上下文的代碼。以下圖中,i== 1 就是條。,當i = 1時斷點會觸發。在調試的時候能夠斷點特定狀況下的問題。也是最經常使用的功能。
4.Log 也很簡單——日誌,也就是斷點時執行Evaluate and log 內的代碼,在代碼框內你能夠調用日誌系統或者直接控制檯打印,避免修改代碼打印輸出,若是你只想打印,不想掛起線程,能夠把Suspend取消,這樣斷點只會觸發,不會將應用暫停。若是勾選stack trace 會打印調用堆棧,能夠看到斷點的觸發來源。是否是很贊?
5.remove once hit 很簡單,若是斷點觸發過一次,下次就會自動失效刪除。
6.Disable until hitting the following breakpoint 這個選項的意思就是直到下面選中的的斷點觸發時纔會觸發激活當前斷點,主要是爲了調試順序。能夠選中已經打的斷點。
7.after hit 斷點觸發以後的操做,繼續不可用,或者一直可用,看需求。
8.instance filter 勾選以後,只有輸入的instanceId 運行到代碼纔會觸發,用處不大。由於首先你要知道instance id。這個是運行時觀察變量區@後面的id。
9.class filter 過濾類,只有特定的類纔會斷點。不經常使用。
10.pass count 運行多少次以後觸發斷點,通常用在循環內,特定次數以後觸發斷點。經常使用。避免查看不想看的循環代碼。
11.caller filter 調用者過濾。只有某個方法調用的時候纔會觸發。針對一個方法被多個地方調用,可是隻想斷點個別的調用的時候。這個雖然看起來比較好用,可是比較坑的是須要輸入方法的全簽名,可使用條件斷點解決的儘可能不使用這個。相似:org.pdool.reflect.Player.addString(Ljava/lang/String;)V,以下圖:
在開發中,和客戶端調協議的時候,有時候客戶端操做了一下,斷點到了,可是有些變量沒注意到,這個時候能夠保持斷點,而後到Frames選中想要重看的函數,右鍵 drop frame。能夠回退堆棧,從新運行一次函數。在使用的時候要注意,上一次已經修改了的全局變量,沒法回滾。
在運行到一段斷點代碼的時候,想看一下其餘變量的值,可使用這個快捷鍵。固然也可使用這個方式修改內存的值。好比 this.setName(" 香菜"),只要你輸入的代碼不報錯均可以。
3.修改變量值
在調試的時候有些特殊條件很差出現,可是又想觀察特殊條件下的程序行爲,這個時候就能夠經過修改變量,調整代碼運行流程。
選擇須要修改的變量,右鍵setValue 或者F2,輸入須要修改的值,回車便可,這樣對象的值就會被修改。這種修改是影響對象的整個生命週期的。
4.移動斷點
選擇斷點,而後按住alt ,鼠標拖動斷點,就能夠移動斷點的位置,整個斷點的屬性都會遷移。完美!
5.熱更新
熱更新就是在應用不重啓的狀況下將新改的代碼應用。有如下限制:
1.函數參數格式不能修改。
2.不能爲類添加函數。
3.不能爲類添加變量。
4.只能修改函數內部的邏輯。
5.不能減小類的方法。
修改完代碼以後,能夠 ctrl + shift + F9,熱更代碼,在信息欄能看到更新成功,而且更新了幾個類。
這個是在開發中很經常使用的功能,省去了一直重啓的痛苦。
當代碼部署到測試服的時候,有些測試問題會爆出來,可是本地沒有,或者由於數據環境,或者由於帳號的特殊問題。這時候想要調試。遠程調試出場的機會到了。
想要遠程調試,第一步 首先必須在遠程應用上打開調試端口,加入啓動命令中,而後啓動應用。
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
第二步 在本機中,idea中,運行-->Edit Configurations --> +號 -->在下拉列表中選擇Remote,而後輸入遠程機器的ip 和 啓動的端口。
第三步 遠程代碼和本地代碼鏈接成功以後,就能夠和調試本地代碼同樣了。
你還知道哪些調試技巧,記得留言給我。
原創不易,基本兩週才能寫好一篇文章,求分享,點個在看,求關注。謝謝支持。
每日一句 想了想,一個好人,怎麼活都活很差。好了好了好了,見好就收。--倉央嘉措