這樣Debug,排查問題效率大大提升
Debug是開發人員必備的基礎技能,伴隨著開發生涯,只要需要寫程式碼,就一定有debug的訴求... 因為大部分開發同學都是用Debug來確認程式是不是預期進行(單元測試也可以)。
Debug一個非常常見的我們以為自己已經熟練掌握的技能,有點像說話一樣,每個人都可以把話說出來,但不是每個人都能表達出影響力...
大家都會Debug,不過有些Debug的方式可能確實會效率更高一些,還是直接進入主題吧;
開始Debug
相信大家都知道如何開始Debug:
1.在Idea的某個程式檔案的目標行旁邊,點選一下,設定個小紅點。 即斷點:
2.使用Debug按鈕執行程式,如果程式可以走到斷點這裡,就開始進入Debug模式。
3.基本操作就是:
- step in 進入方法內部
- step over 直接執行到下一行
- step out 跳出當前的方法
重複1,2,3步驟,剛開始除錯的時候主要就是這幾個步驟;
下面分享一下一些稍微隱藏一點的除錯方法。
斷點相關經驗
只有滿足某些條件才會進入斷點
如果說Debug的位置是閘道器入口,那麼流量會很大,各種型別的請求都會走到這個斷點裡面,如果不能按照條件進入斷點,會非常影響我們的效率。
因為進入斷點的請求,都不是我們想要的;這個時候可以對斷點設定條件,當前請求中必須有滿足什麼條件才會進入Debug模式。
- 點選程式的目標行旁邊,生成一個小紅點;
- 右鍵小紅點,可以在condition那裡設定程式中的條件;
舉個例子,如下當用Debug執行的時候,是不會走到斷點的。
而且在設定完成斷點條件後,斷點旁邊會多出一個?和普通的斷點不同。
Debug斷點只生效一次,同時不阻塞系統
如果說Debug某個正在執行的系統,預設情況下會掛起所有的後續請求,很多人都以為系統宕機了... 其實最後發現是你在除錯。
有什麼辦法,可以在除錯的時候不阻塞剩餘的請求嗎?
- 預設只斷點一次;
- 斷點的時候不掛起整個系統;
如下,通過斷點管理器器,進入進來,或者右鍵斷點,然後點選more可以進入進來 設定掛起選項,只掛起當前正在除錯的執行緒,然後再下面勾選一旦命中移除斷點。
靜態斷點,只是想看程式會不會執行到這裡來(類似於動態日誌)
想確定請求能不能走到某個位置,但是又不想進入debug模式,感覺太重了,能不能如果經過這一行就直接打個日誌呢?
這對於有時候程式的一些方法沒有打日誌,但是又想確認是不是能執行到這裡有幫助。
在斷點配置裡面勾選,命中後打日誌,也可以自己加一些其他的輸出:
- 不要掛起程式
- 命中處打日誌
分組管理斷點(系統不同鏈路的斷點)
系統常用的鏈路主要就幾條,而常除錯問題的地方也只有幾處,可以把這幾處位置的斷點管理起來,在遇到問題的時候直接把斷點分組管理拿出來就可以了。
遠端伺服器Debug
這裡主要是一個配置問題,和本地Debug區別不大,學會配置就好了。 啟動程式的時候:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -jar 待發布的程式jar包名稱.jar
在Idea裡面:
除錯相關經驗
程式已經進入斷點了,這個時候要查問題了,有一些需要了解的嗎。
快速執行到某個位置
有時候我們的斷點沒有設定在某個位置,但是也不想設定在哪個位置; 在Debug的時候想讓程式直接執行到那個位置,怎麼處理?
第一種方式: 滑鼠移動到對應的行數,然後按下run to cursor按鈕:
第二種方式:直接點選檔案旁邊的數字即可,執行到對應的行哪裡
回退重新開始執行
在一些複雜的鏈路中,方法呼叫很長,手一抖結果程式碼又運行了幾行,這個時候想去重新開始執行這個斷點怎麼辦?
常規操作是再模擬發出個請求,重新進入斷點; 但其實Idea已經提供了對應的方式,直接撤回當前的幀即可,斷點會重新進入方法開始執行。
在Frame的位置點選撤回按鈕,就會重新進入這個方法開始執行
中斷後續執行鏈路
如果說debug到一半發現可能會往資料庫寫入髒資料,想直接停止當前的除錯,怎麼做?
同樣在幀的位置,右鍵,可以提前返回不繼續執行,這個提前返回是針對當前的方法的,也可以直接丟擲異常;
除錯Strem流
Java8之後的labmda表示式裡面一般流程會多一點,也不是很好除錯,Idea也有對應的工具,可以直接檢視Strem流中的資料,在Debug Window下發,如果識別到labmda表示式後會展示出來。
斷點的時候執行一些額外程式碼
在Debug模式下,Idea提供了一個類似於直譯器的工具,可以輸入一些額外的程式在執行,哪怕和本次debug無關;
當然有個店是這個表示式執行只會返回最後y一行語句的結果。
總結
- debug程式碼是一個常用而且很常見的技能,但是不是每個人都能很有效率的debug程式碼...;
- 有一些idea隱藏的debug方式,雖然一些人不關注,但是有用並且能極大提升效率;
- 文章主要介紹一些一些在實際專案中相對有用的可以提升debug能力的一些經驗。最後如果說實在是有問題,但是又沒辦法進入除錯模式,可以考慮arthas的trace和watch。
- Spring中實現非同步呼叫的方式有哪些?
- 帶引數的全型別 Python 裝飾器
- 整理了幾個Python正則表示式,拿走就能用!
- SOLID:開閉原則Go程式碼實戰
- React中如何引入CSS呢
- 一個新視角:前端框架們都卷錯方向了?
- 編碼中的Adapter,不僅是一種設計模式,更是一種架構理念與解決方案
- 手寫程式語言-遞迴函式是如何實現的?
- 一文搞懂模糊匹配:定義、過程與技術
- 新來個阿里 P7,僅花 2 小時,做出一個多執行緒永動任務,看完直接跪了
- Puzzlescript,一種開發H5益智遊戲的引擎
- @Autowired和@Resource到底什麼區別,你明白了嗎?
- CSS transition 小技巧!如何保留 hover 的狀態?
- React如此受歡迎離不開這4個主要原則
- LeCun再炮轟Marcus: 他是心理學家,不是搞AI的
- Java保證執行緒安全的方式有哪些?
- 19個殺手級 JavaScript 單行程式碼,讓你看起來像專業人士
- Python 的"self"引數是什麼?
- 別整一坨 CSS 程式碼了,試試這幾個實用函式
- 再有人問你什麼是MVCC,就把這篇文章發給他!