自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 前端
本文主要羅列了10個常用的Debug技巧,可以讓我們定位代碼問題事半功倍。

引言

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

Debug調(diào)試場景

回到上一步

進(jìn)行代碼調(diào)試的過程中,有的時候由于自己點擊下一步的速度比較快,可能之前打的斷點命中后直接跳過去了進(jìn)入到某個方法的內(nèi)部,但是我們還是想看回頭看之前斷點中的情況,那么此時可以使用這個回到上一步功能即Drop Frame,快速定位到之前的代碼運行位置。我們都知道JVM通過棧幀保存方法調(diào)用地址的,因此實際上這部分的功能可以理解為舍棄當(dāng)前的調(diào)用?;氐皆瓉淼恼{(diào)用處。

圖片

字段斷點

當(dāng)我們需要知道類中某個屬性值到底什么時候被修改的時候,如果要從最起始的地方進(jìn)行調(diào)試實在太過麻煩,因為有的時候我們可能并不知道屬性賦值的起始點到底在哪里,特別是在閱讀框架源碼的時候。那么此時可以嘗試在類的字段進(jìn)行斷點,勾選上在屬性訪問或者屬性修改的時候?qū)⑦\行到屬性修改發(fā)生的地方或者屬性被訪問的地方,這樣可以大大提高我們找到屬性修改再沈地方被修改的效率。

圖片

Stream調(diào)試

Lambda表達(dá)式是JDK1.8的新特性,在實際的項目編碼也會被經(jīng)常使用到來簡化一些循環(huán)操作的代碼。但是Lambda表達(dá)式并不好進(jìn)行調(diào)試,因此不太方便查看stream流內(nèi)部的值運行情況,此時我們需要借助于Java Stream Debuger這個插件,這樣我們在進(jìn)行stream流debug的時候就可以看到內(nèi)部各個值執(zhí)行的流程以及最終結(jié)果,方便我們進(jìn)行問題定位。

圖片

表達(dá)式結(jié)果查看

在進(jìn)行Debug的過程中,在代碼的右側(cè)一般會默認(rèn)展示一些變量當(dāng)前的值,但是對于一些表達(dá)式的值并不會默認(rèn)展示,而我們有的時候需要關(guān)注一下表達(dá)式在計算過程中的數(shù)據(jù)是否正確。此時便可以通過鼠標(biāo)選中需要計算的代碼表達(dá)式然后結(jié)合(Alt+F8)快捷鍵查看表達(dá)式的計算結(jié)果。

圖片

debug篩選條件

在一些循環(huán)條件中,比如某個List中有100個String對象,但是我們在調(diào)試的時候希望快速找到滿足條件的對象,而不是在不關(guān)注的對象上面浪費時間進(jìn)行debug,這個時候我們就可以使用debug篩選條件快速過濾出我們需要的對象,大大提升我們debug的效率。

圖片

異常斷點

進(jìn)行斷點調(diào)試的時候,除了閱讀框架源碼理解技術(shù)原理或者熟悉新業(yè)務(wù),大部分情況進(jìn)行斷點調(diào)試都是出現(xiàn)了異常需要進(jìn)一步定位具體原因。但是一般情況下當(dāng)發(fā)生異常的時候,拋出來的異常要么被框架捕捉了,進(jìn)入框架的源碼當(dāng)中,要么被自己業(yè)務(wù)代碼中的try catch捕捉了,影響問題定位。因此我們想要當(dāng)異常發(fā)生的時候可以停在拋異常的地方,方便我們進(jìn)行問題定位。

1、在任意斷點處點擊鼠標(biāo)右鍵進(jìn)行更多debug設(shè)置,找到Java Exception Breakpoints添加自帶的Exception類型或者自定義的業(yè)務(wù)異常。

圖片

2、此時進(jìn)入debug模式運行代碼,當(dāng)代碼邏輯產(chǎn)生之前添加的異常類型后,代碼會停留在發(fā)生異常的地方,這樣異常調(diào)試就更加方便了。

圖片

遠(yuǎn)程調(diào)試

在實際的項目開發(fā)中,經(jīng)常會遇到本地調(diào)試沒毛病,但是部署到預(yù)發(fā)布環(huán)境或者生產(chǎn)環(huán)境中就會出現(xiàn)Bug的問題,這個時候我們只能通過遠(yuǎn)程調(diào)試來具體定位問題到底是什么。

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

圖片

2、配置遠(yuǎn)程環(huán)境

圖片

服務(wù)以Jar形式運行

在服務(wù)啟動的時候需要增加啟動參數(shù)

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

服務(wù)在Tomcat容器中

tomcat 的bin目錄下的catalina.sh文件中增加配置

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

服務(wù)在Docker容器中

需要在dockerfile配置ENTRYPOINT,也就是服務(wù)的啟動參數(shù)。

注意:

遠(yuǎn)程調(diào)試需要確保本地代碼合遠(yuǎn)程代碼的完全一致,否則代碼行數(shù)匹配不上無法達(dá)到調(diào)試的效果。

強制返回

我們進(jìn)行debug問題排查,有的時候只是想確認(rèn)業(yè)務(wù)邏輯有沒有問題,并不想真正去執(zhí)行一些耗費資源、或者改變數(shù)據(jù)的操作,那么在這種場景下,我們可以借助于強制返回的功能,不執(zhí)行方法后面的代碼而指定一個返回值來繼續(xù)后續(xù)的業(yè)務(wù)邏輯debug。

圖片

從運行結(jié)果可以看得出來,加法的代碼邏輯實際并沒有執(zhí)行,而是通過強制返回后直接執(zhí)行了后面的業(yè)務(wù)邏輯。

圖片

運行時修改變量

在debug的過程中,有時候我們需要按照我們預(yù)想的邏輯進(jìn)行問題排查定位,這種場景下我們可能需要修改某些變量的值以便于代碼走入不同的預(yù)想的業(yè)務(wù)邏輯。通過Alt + F8快捷鍵修改獲取指定變量的值,右鍵Set Value設(shè)置新的值。

圖片

輸入新的變量值后進(jìn)行回車設(shè)置,如此變量值被改變了,原先的業(yè)務(wù)邏輯發(fā)在條件發(fā)生改變之后也發(fā)生了改變。

圖片

多線程調(diào)試

Idea默認(rèn)的Debug模式下會阻塞所有的線程,只有當(dāng)當(dāng)前的調(diào)試線程邏輯走完之后才會進(jìn)入其他的線程。那如果想要調(diào)試多線程場景下的業(yè)務(wù)邏輯應(yīng)該怎么辦呢?  實際上在設(shè)置斷點的時候,鼠標(biāo)右擊斷點,我們可以選擇Thread調(diào)試模式。  

圖片

這樣我們在Debugger中就可以通過切換不同的線程來進(jìn)行業(yè)務(wù)邏輯調(diào)試。

圖片

重用快捷鍵

1、F8:Step Over 程序執(zhí)行到下一步

2、F7:Step Into 進(jìn)入方法內(nèi)部

3、 Alt+Shift+F7:強制進(jìn)入方法內(nèi)部,主要針對F7無法進(jìn)入的方法內(nèi)部的情況

4、Shift+F8:進(jìn)入方法之后,不希望再一步步執(zhí)行剩下的代碼,可以通過此快捷鍵跳出

圖片

5、Alt+F10:如果當(dāng)前鼠標(biāo)光標(biāo)不在代碼運行處,通過此快捷鍵可以將光標(biāo)回歸到代碼運行處

6、Alt+F9:鼠標(biāo)光標(biāo)在何處,可以直接通過此快捷鍵跳轉(zhuǎn)運行到光標(biāo)處,無需斷點

7、Alt+F8:計算表達(dá)式的值,用鼠標(biāo)選擇需要計算的表達(dá)式之后,通過此快捷鍵可以計算表達(dá)式的值

圖片

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

9、F9:如果一段代碼中打了兩個斷點,當(dāng)debug到第一個斷點后,按F9后代碼運行到第二個斷點處,如果再按F9則執(zhí)行完所有的代碼,也就是說如果當(dāng)前斷點后還有斷點則可以通過F9跳轉(zhuǎn),如果沒有則執(zhí)行完代碼邏輯。

10、Ctrl+Shift+F8:查看所有的當(dāng)前所有的斷點

責(zé)任編輯:武曉燕 來源: 慕楓技術(shù)筆記
相關(guān)推薦

2020-03-08 16:58:51

Chrome瀏覽器代碼

2018-04-10 14:36:18

數(shù)據(jù)庫MySQL優(yōu)化技巧

2017-07-19 16:34:44

筆記本拆解技巧

2020-10-16 09:09:56

代碼業(yè)務(wù)模型

2024-08-29 13:16:51

2020-11-09 07:25:20

函數(shù) JavaScript數(shù)據(jù)

2020-03-23 10:51:40

面試技巧技術(shù)

2019-09-25 09:05:52

Python 機器學(xué)習(xí)編程語言

2021-12-03 11:57:27

代碼##語言

2022-07-21 14:42:33

Windows 11BUG微軟

2020-04-13 08:33:39

高并發(fā)秒殺系統(tǒng)

2022-12-05 15:03:01

2023-12-31 16:23:39

KubernetesPod容器

2019-02-12 15:00:32

Javascript命令式編程前端

2018-01-25 14:53:20

iPhone技巧刪除照片

2023-05-10 07:42:26

Java多線程編程

2019-12-24 08:46:49

Redis技巧數(shù)據(jù)量

2023-12-29 14:13:41

PyTorch模型開發(fā)

2021-06-09 08:00:00

Python編程語言開發(fā)

2020-03-18 14:20:25

shellLinux命令
點贊
收藏

51CTO技術(shù)棧公眾號