同事改Bug飛快,原來掌握了這些程式碼Debug技巧

ITPUB社群 發表於 2022-11-24


引言

程式碼Debug除錯是研發工程師日常工作中必不可少的重要組成部分。進行程式碼Debug除錯的目的無非就兩個,一個是自我檢查程式碼邏輯是否有問題,便於自己將Bug消滅在測試介入之前;另一個是進行線上問題排查定位,找到實際在跑業務的過程中出現的Bug。但是無論是哪個目的,高效率的進行程式碼Debug除錯必定會提高我們碼程式碼的效率以及定位問題解決問題的效率,從而實現程式碼白盒化自我觀測。本文主要羅列了10個常用的Debug技巧,可以讓我們定位程式碼問題事半功倍。

Debug除錯場景

回到上一步

進行程式碼除錯的過程中,有的時候由於自己點選下一步的速度比較快,可能之前打的斷點命中後直接跳過去了進入到某個方法的內部,但是我們還是想看回頭看之前斷點中的情況,那麼此時可以使用這個回到上一步功能即Drop Frame,快速定位到之前的程式碼執行位置。我們都知道JVM透過棧幀儲存方法呼叫地址的,因此實際上這部分的功能可以理解為捨棄當前的呼叫棧回到原來的呼叫處。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

欄位斷點

當我們需要知道類中某個屬性值到底什麼時候被修改的時候,如果要從最起始的地方進行除錯實在太過麻煩,因為有的時候我們可能並不知道屬性賦值的起始點到底在哪裡,特別是在閱讀框架原始碼的時候。那麼此時可以嘗試在類的欄位進行斷點,勾選上在屬性訪問或者屬性修改的時候將執行到屬性修改發生的地方或者屬性被訪問的地方,這樣可以大大提高我們找到屬性修改再沈地方被修改的效率。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

Stream除錯

Lambda表示式是JDK1.8的新特性,在實際的專案編碼也會被經常使用到來簡化一些迴圈操作的程式碼。但是Lambda表示式並不好進行除錯,因此不太方便檢視stream流內部的值執行情況,此時我們需要藉助於Java Stream Debuger這個外掛,這樣我們在進行stream流debug的時候就可以看到內部各個值執行的流程以及最終結果,方便我們進行問題定位。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

表示式結果檢視

在進行Debug的過程中,在程式碼的右側一般會預設展示一些變數當前的值,但是對於一些表示式的值並不會預設展示,而我們有的時候需要關注一下表示式在計算過程中的資料是否正確。此時便可以透過滑鼠選中需要計算的程式碼表示式然後結合(Alt+F8)快捷鍵檢視錶達式的計算結果。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

debug篩選條件

在一些迴圈條件中,比如某個List中有100個String物件,但是我們在除錯的時候希望快速找到滿足條件的物件,而不是在不關注的物件上面浪費時間進行debug,這個時候我們就可以使用debug篩選條件快速過濾出我們需要的物件,大大提升我們debug的效率。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

異常斷點

進行斷點除錯的時候,除了閱讀框架原始碼理解技術原理或者熟悉新業務,大部分情況進行斷點除錯都是出現了異常需要進一步定位具體原因。但是一般情況下當發生異常的時候,丟擲來的異常要麼被框架捕捉了,進入框架的原始碼當中,要麼被自己業務程式碼中的try catch捕捉了,影響問題定位。因此我們想要當異常發生的時候可以停在拋異常的地方,方便我們進行問題定位。

1、在任意斷點處點選滑鼠右鍵進行更多debug設定,找到Java Exception Breakpoints新增自帶的Exception型別或者自定義的業務異常。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

2、此時進入debug模式執行程式碼,當程式碼邏輯產生之前新增的異常型別後,程式碼會停留在發生異常的地方,這樣異常除錯就更加方便了。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

遠端除錯

在實際的專案開發中,經常會遇到本地除錯沒毛病,但是部署到預釋出環境或者生產環境中就會出現Bug的問題,這個時候我們只能透過遠端除錯來具體定位問題到底是什麼。

1、在debug模式配置中選擇Remote模式

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

2、配置遠端環境

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

服務以Jar形式執行

在服務啟動的時候需要增加啟動引數

 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar business.jar 

服務在Tomcat容器中

tomcat 的bin目錄下的catalina.sh檔案中增加配置

JAVA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'

服務在Docker容器中

需要在dockerfile配置ENTRYPOINT,也就是服務的啟動引數。

注意:

遠端除錯需要確保原生程式碼合遠端程式碼的完全一致,否則程式碼行數匹配不上無法達到除錯的效果。

強制返回

我們進行debug問題排查,有的時候只是想確認業務邏輯有沒有問題,並不想真正去執行一些耗費資源、或者改變資料的操作,那麼在這種場景下,我們可以藉助於強制返回的功能,不執行方法後面的程式碼而指定一個返回值來繼續後續的業務邏輯debug。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

從執行結果可以看得出來,加法的程式碼邏輯實際並沒有執行,而是透過強制返回後直接執行了後面的業務邏輯。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

執行時修改變數

在debug的過程中,有時候我們需要按照我們預想的邏輯進行問題排查定位,這種場景下我們可能需要修改某些變數的值以便於程式碼走入不同的預想的業務邏輯。透過Alt + F8快捷鍵修改獲取指定變數的值,右鍵Set Value設定新的值。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

輸入新的變數值後進行回車設定,如此變數值被改變了,原先的業務邏輯發在條件發生改變之後也發生了改變。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

多執行緒除錯

Idea預設的Debug模式下會阻塞所有的執行緒,只有噹噹前的除錯執行緒邏輯走完之後才會進入其他的執行緒。那如果想要除錯多執行緒場景下的業務邏輯應該怎麼辦呢?  實際上在設定斷點的時候,滑鼠右擊斷點,我們可以選擇Thread除錯模式。  

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

這樣我們在Debugger中就可以透過切換不同的執行緒來進行業務邏輯除錯。

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

重用快捷鍵

1、F8:Step Over 程式執行到下一步

2、F7:Step Into 進入方法內部

3、 Alt+Shift+F7:強制進入方法內部,主要針對F7無法進入的方法內部的情況

4、Shift+F8:進入方法之後,不希望再一步步執行剩下的程式碼,可以透過此快捷鍵跳出

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

5、Alt+F10:如果當前滑鼠游標不在程式碼執行處,透過此快捷鍵可以將游標迴歸到程式碼執行處

6、Alt+F9:滑鼠游標在何處,可以直接透過此快捷鍵跳轉執行到游標處,無需斷點

7、Alt+F8:計算表示式的值,用滑鼠選擇需要計算的表示式之後,透過此快捷鍵可以計算表示式的值

同事改Bug飛快,原來掌握了這些程式碼Debug技巧

8、Ctrl+F5:比如改了某些程式碼需要重新執行程式,可以使用此快捷鍵

9、F9:如果一段程式碼中打了兩個斷點,當debug到第一個斷點後,按F9後程式碼執行到第二個斷點處,如果再按F9則執行完所有的程式碼,也就是說如果當前斷點後還有斷點則可以透過F9跳轉,如果沒有則執行完程式碼邏輯。

10、Ctrl+Shift+F8:檢視所有的當前所有的斷點

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2924975/,如需轉載,請註明出處,否則將追究法律責任。