手把手教你IDEA進行遠程Debug調(diào)試的來龍去脈
一、前言
我們在測試環(huán)境時,遇到一些bug,看上下文的日志,還是無法判斷出問題所在時,此時需要Debug來解決。
為了更方便、更高效地定位和解決問題,遠程調(diào)試成為一種常見的實踐方式。
這個還是不建議在生產(chǎn)中使用,可以在測試環(huán)境走和生產(chǎn)一樣的單據(jù)來Debug。要是生產(chǎn)環(huán)境忘記去掉斷點,直接炸了!
「還是不到萬不得已不要在生產(chǎn)使用,使用完也要把本地的斷點全部取消掉!」
二、JPDA
在實戰(zhàn)之前,我們可以了解一下JPDA!能夠遠程Debug就是使用這個技術(shù)實現(xiàn)的!
1、概念
JPDA(Java Platform Debugger Architecture)是 Java 平臺調(diào)試體系結(jié)構(gòu)的縮寫,它是 Java 開發(fā)工具包(JDK)中提供的一組 API 和協(xié)議,用于支持 Java 程序的調(diào)試。
2、核心組件
Java 虛擬機工具接口(JVMTI): JVMTI 提供了在 Java 虛擬機 (JVM) 中運行時監(jiān)視和檢測的一組 API。它允許調(diào)試器在運行時獲取有關(guān)類、對象、線程等信息,并在程序執(zhí)行時進行干預(yù)。
Java 調(diào)試器接口(JDI): JDI 是在 JPDA 中用于編寫調(diào)試器的 Java API。它允許開發(fā)者通過 Java 語言編寫調(diào)試器,實現(xiàn)與 JVM 的通信和控制。
Java 虛擬機調(diào)試協(xié)議(JDWP): JDWP 是 JVM 與調(diào)試器之間通信的協(xié)議。它定義了調(diào)試器如何與 JVM 進行通信,包括斷點設(shè)置、變量檢查、執(zhí)行控制等。
3、調(diào)試功能
斷點設(shè)置: 在代碼中設(shè)置斷點,以便在執(zhí)行到特定代碼行時暫停程序的執(zhí)行。
變量檢查: 查看和修改程序中的變量值。
單步執(zhí)行: 逐步執(zhí)行程序,以便更詳細地檢查代碼的執(zhí)行過程。
異常處理: 在程序拋出異常時停止執(zhí)行,以進行異常處理。
三、Idea實戰(zhàn)
非常的簡單就是運行Jar包的時候加上命令,在Idea配置上遠程調(diào)試就行了!
1、Jar包準備
新建一個項目或者使用公司的項目,打成Jar包。為了模擬真實性,我們在windows里運行Jar包一次,然后上傳到虛擬機里運行一次!
自己寫一個Controller,接收請求,多寫幾行方便打斷點:
/**
* @author wangzhenjun
* @date 2023/11/28 15:54
*/
@RequestMapping("/test")
@RestController
public class TestController {
@GetMapping("/list")
public String list (){
System.out.println("======1======");
System.out.println("======2======");
System.out.println("======3======");
System.out.println("======4======");
return "成功";
}
}
2、Idea配置遠程監(jiān)聽
此時Idea已經(jīng)把運行Jar包的命令給我們了!
3、運行Jar包
找到j(luò)ar所在位置,執(zhí)行命令:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8088 -jar demo-0.0.1-SNAPSHOT.jar
我們來解釋一下命令的意義:
-agentlib:jdwp:啟用 JDWP 調(diào)試支持。
transport=dt_socket:指定 JDWP 調(diào)試器和 JVM 之間的通信方式為 socket 傳輸。
transport 參數(shù)有兩種常見的模式,分別是 dt_socket 和 dt_shmem。
「dt_socket:使用 socket 傳輸模式,一般用于調(diào)試服務(wù)器運行 dt_shmem:使用共享內(nèi)存?zhèn)鬏斈J剑话阌糜诒镜卣{(diào)試,因為共享內(nèi)存需要在同一臺物理機器上才能正常工作?!?/p>
server=y:表示 JVM 將作為調(diào)試服務(wù)器運行,等待調(diào)試器連接。
suspend=n:指定 JVM 在啟動后是否暫停等待調(diào)試器連接。n 表示不暫停,即 JVM 在啟動后立即執(zhí)行應(yīng)用程序。如果設(shè)置為 y,則 JVM 啟動后會等待調(diào)試器連接,直到調(diào)試器連接上為止。
address=8088: 指定調(diào)試器連接的端口號,和Idea監(jiān)聽的端口一致。
我們先訪問一下,控制臺是可以打印我們的日志!
4、測試
我們啟動Idea配置好的監(jiān)聽,然后再打上斷點!
訪問接口,成功攔截到請求!
放行后,查看控制臺正常輸出:
此時我們使用虛擬機里的Jar包啟動!
「需要我們把Idea中的本地IP換成虛擬機的IP」
重新訪問,沒有問題,我們放行后正常打??!
四、總結(jié)
是不是非常的簡單,大家可以自己試一下,這里還是在測試環(huán)境玩玩就行。
這種方式還有弊端,現(xiàn)在一般都是容器化部署,這種命令就不太好使了,感興趣的可以試試使用docker容器來發(fā)布!
是不是發(fā)布完之后,把Jar包掛載出來,然后再運行一遍專門來Debug的!