- 有時(shí)候我們調(diào)試代碼需要到遠(yuǎn)程服務(wù)器上才可以調(diào)試,比如調(diào)用微信、支付寶等支付業(yè)務(wù),普通的做法是在代碼里關(guān)鍵點(diǎn)打印日志矿瘦,通過(guò)查看遠(yuǎn)程服務(wù)器日志一步步調(diào)試,但如果沒(méi)有打印需要的日志愿卒,就需要重新修改代碼匪凡,然后重新部署到服務(wù)器再次調(diào)試,操作不太方便掘猿。
- 解決辦法就是遠(yuǎn)程調(diào)試病游,讓你能夠像在本地調(diào)試一樣 Debug 遠(yuǎn)程服務(wù)器。
必須保證本地代碼和服務(wù)器上運(yùn)行的代碼是一樣的稠通。
1 寫(xiě)一個(gè)簡(jiǎn)單的springboot項(xiàng)目用于演示
1.1 用idea創(chuàng)建一個(gè)新項(xiàng)目
1.2 選擇Spring Initializr,然后next
1.3 然后next
1.4 簡(jiǎn)單演示衬衬,只選spring web就行了
1.5 改了一下項(xiàng)目名,然后finish
1.6 一個(gè)springboot項(xiàng)目就創(chuàng)建完畢了
1.7 設(shè)置端口號(hào)(我的服務(wù)器是阿里云的改橘,端口需要在阿里云配置安全組滋尉,我這里設(shè)置一個(gè)可以訪(fǎng)問(wèn)的端口號(hào))
server.port=9550
1.8 寫(xiě)一個(gè)用于測(cè)試的接口(name不是必傳,用于模擬當(dāng)出現(xiàn)bug的時(shí)候調(diào)試)
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(@RequestParam(required = false)String name){
return "hello," + name.toUpperCase();
}
}
1.9 本地debug調(diào)試飞主,確保是我們想要的效果
注意控制臺(tái)打印的前兩行
/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50918,suspend=y,server=n
Connected to the target VM, address: '127.0.0.1:50918', transport: 'socket'
1.9.1 正常訪(fǎng)問(wèn)
1.9.2 錯(cuò)誤訪(fǎng)問(wèn)狮惜,不傳name
1.9.3 打斷點(diǎn),再次訪(fǎng)問(wèn)碌识,是我們想要的效果
1.10 打jar包
1.11 將jar包上傳到服務(wù)器
2 在服務(wù)器上運(yùn)行jar包
2.1 啟動(dòng)命令中需要添加jvm啟動(dòng)參數(shù)
# jdk1.5之前采用-Xdebug -Xrunjdwp,transport=dt_socket,server=y,suspend=n,address=9560
# jdk1.5之后采用-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9560 當(dāng)然上面那種也支持
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9560 -jar demo-0.0.1-SNAPSHOT.jar
2.2 參數(shù)說(shuō)明
2.2.1 jdwp
JDWP 是 Java Debug Wire Protocol 的縮寫(xiě)碾篡,它定義了調(diào)試器(debugger)和目標(biāo)虛擬機(jī)(target vm)之間的通信協(xié)議。Target vm 中運(yùn)行著我們要調(diào)試的 Java 程序筏餐,它與一般運(yùn)行的 JVM 沒(méi)有什么區(qū)別开泽,只是在啟動(dòng)時(shí)加載了 JDWP Agent 從而具備了調(diào)試功能。而 debugger 就是我們本地的調(diào)試器魁瞪,它向運(yùn)行中的 target vm 發(fā)送指令來(lái)獲取 target vm 運(yùn)行時(shí)的狀態(tài)和控制遠(yuǎn)程 Java 程序的執(zhí)行穆律。Debugger 和 target vm 分別在各自的進(jìn)程中運(yùn)行,他們之間通過(guò) JDWP 通信協(xié)議進(jìn)行通信导俘。
2.2.2 transport=dt_socket
表示使用socket通信協(xié)議
2.2.3 server=y
表示該JVM用于調(diào)試
2.2.4 suspend=n
表示JVM 立即執(zhí)行峦耘,不要等待調(diào)試者連接
2.2.5 address
連接的端口
3 直接訪(fǎng)問(wèn)服務(wù)器接口地址,看是否可以請(qǐng)求成功
4 idea開(kāi)啟遠(yuǎn)程調(diào)試
4.1 Edit Configurations...
4.2 點(diǎn)擊左上角?
4.3 選擇remote
4.4 設(shè)置服務(wù)器ip和端口旅薄,端口是服務(wù)器啟動(dòng)jar包時(shí)設(shè)置的address
4.5 本地idea開(kāi)啟debug,選擇剛才添加的遠(yuǎn)程配置辅髓,沒(méi)改名字,所以是unnamed
看控制臺(tái)打印可以看出已經(jīng)連接上遠(yuǎn)程
4.6 訪(fǎng)問(wèn)服務(wù)器接口
4.6.1 正常訪(fǎng)問(wèn)
4.6.2 錯(cuò)誤訪(fǎng)問(wèn)
4.7 驗(yàn)證確實(shí)是訪(fǎng)問(wèn)的遠(yuǎn)程,訪(fǎng)問(wèn)本地接口發(fā)現(xiàn)被拒絕
到此,遠(yuǎn)程調(diào)試就演示完畢了利朵。