使用IDEA對SpringBoot應(yīng)用進(jìn)行遠(yuǎn)程調(diào)試方式
情境描述
有時候,應(yīng)用開發(fā)完成發(fā)布到服務(wù)器時出現(xiàn)異常,但本地卻無法復(fù)現(xiàn),也無法通過服務(wù)器上的日志定位。
此時可以通過IDEA對部署在服務(wù)器上的SpringBoot應(yīng)用進(jìn)行遠(yuǎn)程調(diào)試。
環(huán)境描述
- 遠(yuǎn)程服務(wù)器: CentOS 7
- 語言環(huán)境:JDK 1.8
- SpringBoot版本:2.3.4.RELEASE
- IDEA版本:2020.2
操作步驟
測試應(yīng)用編寫與發(fā)布
本地使用IDEA寫一個簡單的SpringBoot web應(yīng)用,開放一個接口,代碼如下:
package com.example.remoteapp.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author UV
* @Version 0.1
* @Data 2020/9/29
* @Description
*/
@RestController
public class OpenController {
@GetMapping("/hello")
public void hello() {
System.out.println("此處是斷點");
System.out.println("此處是正常業(yè)務(wù)內(nèi)容");
}
}使用mvn install將應(yīng)用打成jar包,上傳到服務(wù)器上。
IDEA遠(yuǎn)程調(diào)試配置
打開項目配置

添加遠(yuǎn)程應(yīng)用

設(shè)置遠(yuǎn)程應(yīng)用名、debugger模式(Debugger mode)、配置遠(yuǎn)程服務(wù)器地址(Host)、端口(Port)、應(yīng)用模塊(Use module classpath)

此處的Port為遠(yuǎn)程應(yīng)用的遠(yuǎn)程調(diào)試端口,不是應(yīng)用本身的業(yè)務(wù)訪問端口。
配置完成后,復(fù)制下圖中的參數(shù),作為遠(yuǎn)程應(yīng)用的啟動參數(shù)

啟動遠(yuǎn)程應(yīng)用
登陸服務(wù)器,啟動jar包
$ java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar remoteapp-0.0.1-SNAPSHOT.jar
Listening for transport dt_socket at address: 5005. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.4.RELEASE)2020-09-29 02:20:47.247 INFO 798 --- [ main] c.e.remoteapp.RemoteappApplication : Starting RemoteappApplication v0.0.1-SNAPSHOT on migration-plat01.novalocal with PID 798 (/root/remoteapp-0.0.1-SNAPSHOT.jar started by root in /root)
2020-09-29 02:20:47.252 INFO 798 --- [ main] c.e.remoteapp.RemoteappApplication : No active profile set, falling back to default profiles: default
2020-09-29 02:20:49.000 INFO 798 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2020-09-29 02:20:49.024 INFO 798 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-09-29 02:20:49.024 INFO 798 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.38]
2020-09-29 02:20:49.120 INFO 798 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2020-09-29 02:20:49.121 INFO 798 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1773 ms
2020-09-29 02:20:49.428 INFO 798 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-09-29 02:20:49.697 INFO 798 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-09-29 02:20:49.712 INFO 798 --- [ main] c.e.remoteapp.RemoteappApplication : Started RemoteappApplication in 3.297 seconds (JVM running for 3.953)
2020-09-29 02:21:54.307 INFO 798 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-09-29 02:21:54.307 INFO 798 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-09-29 02:21:54.318 INFO 798 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 11 ms
此處是斷點
此處是正常業(yè)務(wù)內(nèi)容
Listening for transport dt_socket at address: 5005
此時可以在日志第一行看到Listening for transport dt_socket at address: 5005證明遠(yuǎn)程調(diào)試接口配置成功。
本地使用IDEA對遠(yuǎn)程應(yīng)用進(jìn)行調(diào)試
在IDEA中打一個斷點,開啟debug

訪問遠(yuǎn)程測試接口

注意點
- 遠(yuǎn)程調(diào)試端口一定要跟應(yīng)用的業(yè)務(wù)端口不一致,否則會因為端口沖突導(dǎo)致應(yīng)用無法啟動
- 本地代碼要與遠(yuǎn)程代碼一致,否則調(diào)試過程會出現(xiàn)異常
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java對象以Hash結(jié)構(gòu)存入Redis詳解
這篇文章主要介紹了Java對象以Hash結(jié)構(gòu)存入Redis詳解,和Java中的對象非常相似,卻不能按照J(rèn)ava對象的結(jié)構(gòu)直接存儲進(jìn)Redis的hash中,因為Java對象中的field是可以嵌套的,而Redis的Hash結(jié)構(gòu)不支持嵌套結(jié)構(gòu),需要的朋友可以參考下2023-08-08
Java基本數(shù)據(jù)類型之間的相互轉(zhuǎn)換詳解
這篇文章主要講解Java中基本數(shù)據(jù)類型的轉(zhuǎn)換,數(shù)據(jù)之間相互轉(zhuǎn)換是經(jīng)常會用到的基礎(chǔ)操作,文中講的很清晰,希望能給大家做一個參考。2022-05-05
spring boot springMVC擴(kuò)展配置實現(xiàn)解析
這篇文章主要介紹了spring boot springMVC擴(kuò)展配置實現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
Java Swing JToggleButton開關(guān)按鈕的實現(xiàn)
這篇文章主要介紹了Java Swing JToggleButton開關(guān)按鈕的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

