先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!

作為程序大家都知道,寫代碼和調試的時間是差不多9:1,也就是說90% 的時間大家都在調試代碼,怎麼樣才能最快的發現bug?

調試是開發中最重要的解決問題的方法,在開發中也看到很多同事只會簡單的使用調試,因此寫下這篇文章。正所謂 工欲善其事必先利其器,好的調試技巧讓你在開發中如魚得水。

調試從大的方面來講主要是本地調試 和遠程調試。本地調試就是在本地使用IDE的debug按鈕啟動項目,

遠程調試一般是指調試其他機器上的程序。下面從這兩個方面分開講一下。因為我開發中使用的是idea,所以下面的實例和截圖都來自idea。調試的技巧是一樣的,用eclipse的同學可以自己遷移到eclipse上。

1、斷點分類

先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!


  1. 行斷點
  2. 顧名思義,行斷點就是在代碼的左邊單擊,紅色的圓點就代表斷點成功,在代碼運行到這一行的時候會觸發。
  3. 方法斷點
  4. 方法斷點就是斷點在方法簽名上,在調用這個方法時會觸發斷點。如上圖菱形紅點
  5. field斷點
  6. 字段斷點就是在字段的定義的地方加斷點,任何訪問或者寫入的地方都會觸發斷點。
  7. 異常斷點
  8. 異常斷點在debug視圖下,點擊兩個小圓點,打開斷點界面,然後點擊“+”號,選擇Java Exception Breakpoints,輸入你想斷點的異常名字。比如常用的NullPointerException,只要程序運行的時候拋出這個異常,都會觸發斷點。


先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!


2、管理斷點

先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!


  1. 點擊圖中1位置,為取消所有斷點,也就是所有的斷點都不觸發。
  2. 點擊圖中2的位置,打開斷點管理界面,勾選斷點則代表斷點起作用,不勾選則表示不起作用。


先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!


3、條件斷點

條件斷點太牛了,前面的斷點每個寫代碼的應該都知道,是入門的。這部分是今天的重點,也是精華所在。

1.Enable 斷點是否起作用,沒什麼可講的,一般的時候會啟用。

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,如下圖:

先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!


4、技巧

  1. drop frame 回退堆棧。
  2. 在開發中,和客戶端調協議的時候,有時候客戶端操作了一下,斷點到了,但是有些變量沒注意到,這個時候可以保持斷點,然後到Frames選中想要重看的函數,右鍵 drop frame。可以回退堆棧,重新運行一次函數。在使用的時候要注意,上一次已經修改了的全局變量,無法回滾。
先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!

  1. alt + f8 運行時計算

在運行到一段斷點代碼的時候,想看一下其他變量的值,可以使用這個快捷鍵。當然也可以使用這個方式修改內存的值。比如 this.setName(" 香菜"),只要你輸入的代碼不報錯都可以。

先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!


3.修改變量值

在調試的時候有些特殊條件不好出現,但是又想觀察特殊條件下的程序行為,這個時候就可以通過修改變量,調整代碼運行流程。

先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!


選擇需要修改的變量,右鍵setValue 或者F2,輸入需要修改的值,回車即可,這樣對象的值就會被修改。這種修改是影響對象的整個生命週期的。

4.移動斷點

選擇斷點,然後按住alt ,鼠標拖動斷點,就可以移動斷點的位置,整個斷點的屬性都會遷移。完美!

5.熱更新

熱更新就是在應用不重啟的情況下將新改的代碼應用。有以下限制:

1.函數參數格式不能修改。

2.不能為類添加函數。

3.不能為類添加變量。

4.只能修改函數內部的邏輯。

5.不能減少類的方法。

修改完代碼之後,可以 ctrl + shift + F9,熱更代碼,在信息欄能看到更新成功,並且更新了幾個類。

這個是在開發中很常用的功能,省去了一直重啟的痛苦。

先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!


5、遠程調試

當代碼部署到測試服的時候,有些測試問題會爆出來,但是本地沒有,或者因為數據環境,或者因為賬號的特殊問題。這時候想要調試。遠程調試出場的機會到了。

想要遠程調試,第一步 首先必須在遠程應用上打開調試端口,加入啟動命令中,然後啟動應用。

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

第二步 在本機中,idea中,運行-->Edit Configurations --> +號 -->在下拉列表中選擇Remote,然後輸入遠程機器的ip 和 啟動的端口。

第三步 遠程代碼和本地代碼連接成功之後,就可以和調試本地代碼一樣了。

先學會這些調試技巧,再寫代碼,效率提高十倍以上!吐血整理!


你還知道哪些調試技巧,記得留言給我。

原創不易,基本兩週才能寫好一篇文章,求分享,點個在看,求關注。謝謝支持。


分享到:


相關文章: