前言
- 在部署線上項目時,相信大家都會遇到一個問題,線上的 Bug 但是在本地不會復現,多么無奈。
- 此時最常用的就是取到前端傳遞的數據用接口測試工具測試,比如 POSTMAN,復雜不,難受不?
- 今天陳某教你一招,讓你輕松調試線上的 Bug。文章目錄如下:
什么是 JPDA?
-
JPDA
(Java Platform Debugger Architecture),即 Java 平台調試體系,具體結構圖如下圖所示。 -
其中實現調試功能的主要協議是
JDWP
協議,在Java SE 5
以前版本,JVM 端的實現接口是JVMPI
(Java Virtual Machine Profiler Interface),而在Java SE 5
及以后版本,使用JVMTI
(Java Virtual Machine Tool Interface) 來替代 JVMPI。 -
因此,如果使用 Java SE 5 之前版本,使用調試功能的命令為:
java -Xdebug -Xrunjdwp:...
- 而
Java SE 5
及之后版本,使用調試功能的命令為:
java -agentlib:jdwp=...
調試命令
- 現在開發中最常見的一條遠程調試的的命令如下:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9091 -jar xxx.jar
參數說明
- 基於前面的調試命令,我們來分析一下基本的參數代表什么意思。
transport
- 指定運行的被調試應用和調試者之間的通信協議,它由幾個可選值:
dt_socket
:主要的方式,采用socket
方式連接。dt_shmem
:采用共享內存方式連接,僅支持 Windows 平台。
server
- 指定當前應用作為調試服務端還是客戶端,默認為
n
。 - 如果你想將當前應用作為被調試應用,設置該值為
y
,如果你想將當前應用作為客戶端,作為調試的發起者,設置該值為n
。
suspend
- 當前應用啟動后,是否阻塞應用直到被連接,默認值為
y
。 - 在大部分的應用場景,這個值為
n
,即不需要應用阻塞等待連接。一個可能為y
的應用場景是,你的程序在啟動時出現了一個故障,為了調試,必須等到調試方連接上來后程序再啟動。
address
- 暴露的調試連接端口,默認值為
8000
。 - 此端口一定不能與項目端口重復,且必須是服務器開放的端口。
onthrow
- 當程序拋出設定異常時,中斷調試。
onuncaught
- 當程序拋出未捕獲異常時,是否中斷調試,默認值為 n。
launch
- 當調試中斷時,執行的程序。
timeout
- 該參數限定為
java -agentlib:jdwp=…
可用,單位為毫秒ms
。 - 當
suspend = y
時,該值表示等待連接的超時;當suspend = n
時,該值表示連接后的使用超時。
參考命令
-
-agentlib:jdwp=transport=dt_socket,server=y,address=8000
:以 Socket 方式監聽 8000 端口,程序啟動阻塞(suspend 的默認值為 y)直到被連接。 -
-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000
:以 Socket 方式監聽 8000 端口,當程序啟動后 5 秒無調試者連接的話終止,程序啟動阻塞(suspend 的默認值為 y)直到被連接。 -
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
:選擇可用的共享內存連接地址並使用 stdout 打印,程序啟動不阻塞。 -
-agentlib:jdwp=transport=dt_socket,address=myhost:8000
:以 socket 方式連接到myhost:8000
上的調試程序,在連接成功前啟動阻塞。 -
-agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
:以 Socket 方式監聽 8000 端口,程序啟動阻塞(suspend 的默認值為 y)直到被連接。當拋出 IOException 時中斷調試,轉而執行usr/local/bin/debugstub
程序。
IDEA 遠程調試示例
- 首先打包 SpringBoot 項目,在服務器上運行,執行以下命令:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9190 -jar debug-demo.jar
-
出現下圖的界面,表示運行成功:
-
然后在 IDEA 中,點擊
Edit Configurations
,在彈框中點擊+
號,然后選擇Remote
。 -
填寫服務器的地址及端口,點擊 OK 即可。
-
配置完畢后,DEBUG 調試運行即可。
-
配置完畢后點擊保存即可,因為我配置的 suspend=n,因此服務端程序無需阻塞等待我們的連接。我們點擊 IDEA 調試按鈕,當我訪問某一接口時,能夠正常調試。
小福利
- 作者為大家准備了接近 10M 的面試題,涵蓋后端各個技術維度,老規矩,公眾號內回復關鍵詞
JAVA面試題
即可免費獲取。 - 關注微信公眾號回復關鍵詞: