這樣Debug,排查問題效率大大提升...
Debug是開發(fā)人員必備的基礎(chǔ)技能,伴隨著開發(fā)生涯,只要需要寫代碼,就一定有debug的訴求... 因為大部分開發(fā)同學(xué)都是用Debug來確認程序是不是預(yù)期進行(單元測試也可以)。
Debug一個非常常見的我們以為自己已經(jīng)熟練掌握的技能,有點像說話一樣,每個人都可以把話說出來,但不是每個人都能表達出影響力...
大家都會Debug,不過有些Debug的方式可能確實會效率更高一些,還是直接進入主題吧;
開始Debug
相信大家都知道如何開始Debug:
1、在Idea的某個程序文件的目標行旁邊,點擊一下,設(shè)置個小紅點。即斷點
2、使用Debug按鈕運行程序,如果程序可以走到斷點這里,就開始進入Debug模式。
3、基本操作就是:
- step in 進入方法內(nèi)部
- step over 直接執(zhí)行到下一行
- step out 跳出當(dāng)前的方法
重復(fù)1,2,3步驟,剛開始調(diào)試的時候主要就是這幾個步驟;
下面分享一下一些稍微隱藏一點的調(diào)試方法。
斷點相關(guān)經(jīng)驗
只有滿足某些條件才會進入斷點
如果說Debug的位置是網(wǎng)關(guān)入口,那么流量會很大,各種類型的請求都會走到這個斷點里面,如果不能按照條件進入斷點,會非常影響我們的效率。
因為進入斷點的請求,都不是我們想要的;這個時候可以對斷點設(shè)置條件,當(dāng)前請求中必須有滿足什么條件才會進入Debug模式。
1、點擊程序的目標行旁邊,生成一個小紅點;2、右鍵小紅點,可以在condition那里設(shè)置程序中的條件;
舉個例子,如下當(dāng)用Debug運行的時候,是不會走到斷點的。
而且在設(shè)置完成斷點條件后,斷點旁邊會多出一個?和普通的斷點不同。
Debug斷點只生效一次,同時不阻塞系統(tǒng)
如果說Debug某個正在運行的系統(tǒng),默認情況下會掛起所有的后續(xù)請求,很多人都以為系統(tǒng)死機了... 其實最后發(fā)現(xiàn)是你在調(diào)試。
有什么辦法,可以在調(diào)試的時候不阻塞剩余的請求嗎?1、默認只斷點一次;2、斷點的時候不掛起整個系統(tǒng);
如下,通過斷點管理器器,進入進來,或者右鍵斷點,然后點擊more可以進入進來 設(shè)置掛起選項,只掛起當(dāng)前正在調(diào)試的線程,然后再下面勾選一旦命中移除斷點。
靜態(tài)斷點,只是想看程序會不會運行到這里來(類似于動態(tài)日志)
想確定請求能不能走到某個位置,但是又不想進入debug模式,感覺太重了,能不能如果經(jīng)過這一行就直接打個日志呢?
這對于有時候程序的一些方法沒有打日志,但是又想確認是不是能執(zhí)行到這里有幫助。
在斷點配置里面勾選,命中后打日志,也可以自己加一些其他的輸出:
- 不要掛起程序
- 命中處打日志
分組管理斷點(系統(tǒng)不同鏈路的斷點)
系統(tǒng)常用的鏈路主要就幾條,而常調(diào)試問題的地方也只有幾處,可以把這幾處位置的斷點管理起來,在遇到問題的時候直接把斷點分組管理拿出來就可以了。關(guān)注公眾號:碼猿技術(shù)專欄,回復(fù)關(guān)鍵詞:1111 獲取阿里內(nèi)部Java性能優(yōu)化手冊
遠程服務(wù)器Debug
這里主要是一個配置問題,和本地Debug區(qū)別不大,學(xué)會配置就好了。啟動程序的時候:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -jar 待發(fā)布的程序jar包名稱.jar
在Idea里面:
調(diào)試相關(guān)經(jīng)驗
程序已經(jīng)進入斷點了,這個時候要查問題了,有一些需要了解的嗎。
快速執(zhí)行到某個位置
有時候我們的斷點沒有設(shè)置在某個位置,但是也不想設(shè)置在哪個位置;在Debug的時候想讓程序直接運行到那個位置,怎么處理?
第一種方式:鼠標移動到對應(yīng)的行數(shù),然后按下run to cursor按鈕
第二種方式:直接點擊文件旁邊的數(shù)字即可,運行到對應(yīng)的行哪里
回退重新開始執(zhí)行
在一些復(fù)雜的鏈路中,方法調(diào)用很長,手一抖結(jié)果代碼又運行了幾行,這個時候想去重新開始執(zhí)行這個斷點怎么辦?
常規(guī)操作是再模擬發(fā)出個請求,重新進入斷點;但其實Idea已經(jīng)提供了對應(yīng)的方式,直接撤回當(dāng)前的幀即可,斷點會重新進入方法開始執(zhí)行。
在Frame的位置點擊撤回按鈕,就會重新進入這個方法開始運行
中斷后續(xù)執(zhí)行鏈路
如果說debug到一半發(fā)現(xiàn)可能會往數(shù)據(jù)庫寫入臟數(shù)據(jù),想直接停止當(dāng)前的調(diào)試,怎么做?
同樣在幀的位置,右鍵,可以提前返回不繼續(xù)運行,這個提前返回是針對當(dāng)前的方法的,也可以直接拋出異常;
調(diào)試Strem流
Java8之后的labmda表達式里面一般流程會多一點,也不是很好調(diào)試,Idea也有對應(yīng)的工具,可以直接查看Strem流中的數(shù)據(jù),在Debug Window下發(fā),如果識別到labmda表達式后會展示出來。
斷點的時候運行一些額外代碼
在Debug模式下,Idea提供了一個類似于解釋器的工具,可以輸入一些額外的程序在運行,哪怕和本次debug無關(guān);
當(dāng)然有個店是這個表達式執(zhí)行只會返回最后y一行語句的結(jié)果。
總結(jié)
- debug代碼是一個常用而且很常見的技能,但是不是每個人都能很有效率的debug代碼...
- 有一些idea隱藏的debug方式,雖然一些人不關(guān)注,但是有用并且能極大提升效率
- 文章主要介紹一些一些在實際項目中相對有用的可以提升debug能力的一些經(jīng)驗。最后如果說實在是有問題,但是又沒辦法進入調(diào)試模式,可以考慮arthas的trace和watch。