同事改Bug飛快,原來掌握了這些程式碼Debug技巧
引言
程式碼Debug除錯是研發工程師日常工作中必不可少的重要組成部分。進行程式碼Debug除錯的目的無非就兩個,一個是自我檢查程式碼邏輯是否有問題,便於自己將Bug消滅在測試介入之前;另一個是進行線上問題排查定位,找到實際在跑業務的過程中出現的Bug。但是無論是哪個目的,高效率的進行程式碼Debug除錯必定會提高我們碼程式碼的效率以及定位問題解決問題的效率,從而實現程式碼白盒化自我觀測。本文主要羅列了10個常用的Debug技巧,可以讓我們定位程式碼問題事半功倍。
Debug除錯場景
回到上一步
進行程式碼除錯的過程中,有的時候由於自己點選下一步的速度比較快,可能之前打的斷點命中後直接跳過去了進入到某個方法的內部,但是我們還是想看回頭看之前斷點中的情況,那麼此時可以使用這個回到上一步功能即Drop Frame,快速定位到之前的程式碼執行位置。我們都知道JVM透過棧幀儲存方法呼叫地址的,因此實際上這部分的功能可以理解為捨棄當前的呼叫棧回到原來的呼叫處。
欄位斷點
當我們需要知道類中某個屬性值到底什麼時候被修改的時候,如果要從最起始的地方進行除錯實在太過麻煩,因為有的時候我們可能並不知道屬性賦值的起始點到底在哪裡,特別是在閱讀框架原始碼的時候。那麼此時可以嘗試在類的欄位進行斷點,勾選上在屬性訪問或者屬性修改的時候將執行到屬性修改發生的地方或者屬性被訪問的地方,這樣可以大大提高我們找到屬性修改再沈地方被修改的效率。
Stream除錯
Lambda表示式是JDK1.8的新特性,在實際的專案編碼也會被經常使用到來簡化一些迴圈操作的程式碼。但是Lambda表示式並不好進行除錯,因此不太方便檢視stream流內部的值執行情況,此時我們需要藉助於Java Stream Debuger這個外掛,這樣我們在進行stream流debug的時候就可以看到內部各個值執行的流程以及最終結果,方便我們進行問題定位。
表示式結果檢視
在進行Debug的過程中,在程式碼的右側一般會預設展示一些變數當前的值,但是對於一些表示式的值並不會預設展示,而我們有的時候需要關注一下表示式在計算過程中的資料是否正確。此時便可以透過滑鼠選中需要計算的程式碼表示式然後結合(Alt+F8)快捷鍵檢視錶達式的計算結果。
debug篩選條件
在一些迴圈條件中,比如某個List中有100個String物件,但是我們在除錯的時候希望快速找到滿足條件的物件,而不是在不關注的物件上面浪費時間進行debug,這個時候我們就可以使用debug篩選條件快速過濾出我們需要的物件,大大提升我們debug的效率。
異常斷點
進行斷點除錯的時候,除了閱讀框架原始碼理解技術原理或者熟悉新業務,大部分情況進行斷點除錯都是出現了異常需要進一步定位具體原因。但是一般情況下當發生異常的時候,丟擲來的異常要麼被框架捕捉了,進入框架的原始碼當中,要麼被自己業務程式碼中的try catch捕捉了,影響問題定位。因此我們想要當異常發生的時候可以停在拋異常的地方,方便我們進行問題定位。
1、在任意斷點處點選滑鼠右鍵進行更多debug設定,找到Java Exception Breakpoints新增自帶的Exception型別或者自定義的業務異常。
2、此時進入debug模式執行程式碼,當程式碼邏輯產生之前新增的異常型別後,程式碼會停留在發生異常的地方,這樣異常除錯就更加方便了。
遠端除錯
在實際的專案開發中,經常會遇到本地除錯沒毛病,但是部署到預釋出環境或者生產環境中就會出現Bug的問題,這個時候我們只能透過遠端除錯來具體定位問題到底是什麼。
1、在debug模式配置中選擇Remote模式
2、配置遠端環境
服務以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。
從執行結果可以看得出來,加法的程式碼邏輯實際並沒有執行,而是透過強制返回後直接執行了後面的業務邏輯。
執行時修改變數
在debug的過程中,有時候我們需要按照我們預想的邏輯進行問題排查定位,這種場景下我們可能需要修改某些變數的值以便於程式碼走入不同的預想的業務邏輯。透過Alt + F8快捷鍵修改獲取指定變數的值,右鍵Set Value設定新的值。
輸入新的變數值後進行回車設定,如此變數值被改變了,原先的業務邏輯發在條件發生改變之後也發生了改變。
多執行緒除錯
Idea預設的Debug模式下會阻塞所有的執行緒,只有噹噹前的除錯執行緒邏輯走完之後才會進入其他的執行緒。那如果想要除錯多執行緒場景下的業務邏輯應該怎麼辦呢? 實際上在設定斷點的時候,滑鼠右擊斷點,我們可以選擇Thread除錯模式。
這樣我們在Debugger中就可以透過切換不同的執行緒來進行業務邏輯除錯。
重用快捷鍵
1、F8:Step Over 程式執行到下一步
2、F7:Step Into 進入方法內部
3、 Alt+Shift+F7:強制進入方法內部,主要針對F7無法進入的方法內部的情況
4、Shift+F8:進入方法之後,不希望再一步步執行剩下的程式碼,可以透過此快捷鍵跳出
5、Alt+F10:如果當前滑鼠游標不在程式碼執行處,透過此快捷鍵可以將游標迴歸到程式碼執行處
6、Alt+F9:滑鼠游標在何處,可以直接透過此快捷鍵跳轉執行到游標處,無需斷點
7、Alt+F8:計算表示式的值,用滑鼠選擇需要計算的表示式之後,透過此快捷鍵可以計算表示式的值
8、Ctrl+F5:比如改了某些程式碼需要重新執行程式,可以使用此快捷鍵
9、F9:如果一段程式碼中打了兩個斷點,當debug到第一個斷點後,按F9後程式碼執行到第二個斷點處,如果再按F9則執行完所有的程式碼,也就是說如果當前斷點後還有斷點則可以透過F9跳轉,如果沒有則執行完程式碼邏輯。
10、Ctrl+Shift+F8:檢視所有的當前所有的斷點
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2924975/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 這些appium常用元素定位技巧,你掌握了幾種?APP
- spring 掌握這些就夠了Spring
- 掌握這些技巧,角色原畫和建模再也不會打架了
- 程式碼Bug太多?給新人Code Review頭都大了?快來試試SpotBugsView
- Pandas 資料顯示不全?快來了解這些設定技巧! ⛵
- 原來 GitHub 不僅能學程式碼,還有這些東西Github
- 看看這些被同事噴的JS程式碼風格你寫過多少JS
- 掌握這些程式碼安全檢視方法,提升你的程式碼質量
- 短視訊如何運營,教你這些技巧,讓你掌握流量密碼!密碼
- Nature盤點:從Fortran、arXiv到AlexNet,這些程式碼改變了科學界
- 這些手寫程式碼會了嗎?少年
- 這些Python程式碼技巧,你肯定還不知道Python
- 這樣規範寫程式碼,同事直呼“666”
- 學習Linux,這些命令你都掌握了嗎?Linux
- 同事每天早下班,原來是用了這8個開發工具
- 爆火的ChatGPT太強了!寫程式碼、改bug,網友:可取代Stack Overflow了ChatGPT
- 這些辦公技巧值得你來學習
- 想要4個9?掌握這些監控告警的關鍵技巧
- 百億資料量下,掌握這些Redis技巧你就能Hold全場Redis
- 學了Python能做什麼 都需要掌握這些技能Python
- 因為這幾個TypeScript程式碼的壞習慣,同事被罰了500塊TypeScript
- 原來word中還有這些小技巧!
- 使用 github 做程式碼管理,知道這些就夠了Github
- 一個新手怎麼做自媒體?這些個人技巧快點學起來
- @程式設計師,請掌握這些核心生存技能程式設計師
- 想做長期的 AB 實驗?快來看看這些坑你踩了沒
- 掌握這些技巧,讓Excel批次資料清洗變得簡單高效!Excel
- 史上最全的Word技巧大全 掌握這些你也能成為Word高手
- C指標的這些使用技巧,掌握後立刻提升一個Level指標
- 【轉載】GDB高階技巧:邊Debug邊修復BUG,無需修改程式碼,無需重新編譯編譯
- 這些高階的函式技術,你掌握了麼函式
- java web開發這些細節你真的掌握了嗎JavaWeb
- 寫了這麼多年 JavaScript ,竟然還不知道這些技巧?JavaScript
- Golang寫的程式注入一些版本資訊,Debug速度自然快不少Golang
- 知道了這些 MongoDB設計技巧,提升效率50%MongoDB
- 百億資料量下,掌握這些Redis技巧你大概就穩住了全場Redis
- 程式碼混淆不再愁:一篇掌握核心技巧
- Reviewbot 開源 | 這些寫 Go 程式碼的小技巧,你都知道嗎?ViewGo