[Java] 將本機VSCode的debugger連接至遠端服務debug

Java程式語言

在當前採用微服務的架構下想要對特定服務 debug 除了在本機將服務啟起來然後仿照其他服務打 API 請求過來外,也可以採用將本機的 debugger 連接至遠端服務進行遠端 debug 下斷點。

在 dev 環境與其他人串接流程找問題時我自己滿常用這招的,畢竟如果要在本地 debug 不太可能將整套微服務都啟一遍。

首先要允許 dev 遠端環境的服務被 debugger 連接的話,我們需要調整一下服務的啟動指令加入以下參數。

agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:55001
  • agentlib:jdwp: 告訴 JVM 我們要載入 jdwp (Java Debug Wire Protocol) 這個本地 debug 用的 library。

  • transport=dt_socket: 與 dev 遠端環境溝通是透過網路連線,所以這邊指定使用 socket 模式。

  • server=y: 設定為 debugger server。

  • suspend=n: 設定當沒有 debugger 連接時不用將程式暫停,程式會繼續運行就如同以往一樣。

  • address=0.0.0.0:55001: 設定給 debugger 連接的 port 為 55001,並且允許所有來源連接。

完整服務啟動的指令會長這樣:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:55001 -jar thirdparty-service-1.0.0.jar

重新佈署一次 dev 服務後,服務就會進入允許 debugger 連接的狀態,我們可以使用 netstat 指令確認一下剛剛的55001 port 是否正在 listen。

root@dev-dockerhost-srv01(02:58:13)[~]# netstat -anop | grep 55001
tcp  0  0 0.0.0.0:55001  0.0.0.0:*  LISTEN  32580/java  off  (0.00/0/0)
root@dev-dockerhost-srv01(02:59:03)[~]#

 
接下來我們要來設定怎麼從 VSCode 去連接遠端服務。打開服務的專案中的 VSCode 啟動設定檔 (在 .vscode/launch.json,沒有看到的話就自己創一個),然後在 configurations 底下多補上一項使用 attach 模式啟動的方式,dev 的 host 及 port 可以自行調整。

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        // 略...
        {
            "type": "java",
            "name": "SpringBoot App Debug",
            "request": "attach",
            "projectName": "thirdparty-service",
            "hostName": "192.168.101.191",
            "port": 55001
        },
        // 略...
    ]
}

保存後下拉選單就會出現剛剛新增的啟動方式,按下綠色三角形將本地 debugger 連接至遠端服務。

可以看到遠端服務目前正在運行的 thread 已經出現在 call stack 中了。

這時就可以仿照本地 debug 的方式對程式碼下斷點,然後在 dev 環境正常走一遍流程,讓程式碼執行到斷點處。

可以看到 debugger 如我們預期的去中斷了程式碼,讓我們預覽當下的變數及物件的值,是不是很方便呢。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *