idea远程debug参考一

发布时间 2023-06-22 20:25:38作者: 哩个啷个波

参考一:https://blog.csdn.net/publicv/article/details/126130834

服务器操作:

1:服务器执行命令:10005是 idea和服务器连接socket的端口号 ,和项目本身的端口无关

nohup java -jar  -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10005    xx.jar &
1

2:确认一下,远程服务器安全组是否开放 10005端口

idea操作

1:打开idea edit Configurations

在这里插入图片描述

2:新建一个 Remote JVM Debug在这里插入图片描述

3:填写刚刚部署的 服务器IP和端口 在这里插入图片描述

4:点击debug图标,简易建立拦截远程连接在这里插入图片描述

5:console 提示:Connected to the target VM, address: ‘120.25.106.25:10005’, transport: ‘socket’ 代表连接上了远程服务器

在这里插入图片描述

6:找一个接口打断点进行测试,发现远程服务器打断点成功

在这里插入图片描述

注意事项

  • 服务器代码和本地代码要保持一致
  • 不要在正式环境用这个,因为端口开放后谁都可以连接。安全性问题
  • 命令中 address=10005 这个端口号可以随意取,但是不能和你的项目端口号一致, 这个端口号是 和你idea 建立连接的socket端口
  • 安全组端口号记得要开放
  • 偶发会出现 idea 提示已经连接,或者连接不上,可以重启idea再试一下,基本解决问题。 如果还是不行,请按照错误信息排查
  • 需按照顺序来,先启动服务器应用,在启动idea

参考二:https://blog.csdn.net/qq_39654446/article/details/122476496

1,远程DEBUG的必要性

由于部署环境的差异性,相信很多朋友都碰到过开发环境正常测试过的功能在测试环境甚至生产环境下出现bug的情况。一般情况下,生产环境可以采取的手段比较单一,即通过日志的方式获取运行中的环境上下文,分析日志文件并尝试重现bug。这会带来的问题还是不少的,首先,日志的分析是一项比较耗时的工作;其次,现有的日志记录不一定能反映出问题,你可能需要多次重复这个过程(分析日志->猜测问题->加日志->部署->获取日志)来慢慢逼近问题。倘若是测试环境,我们还多了一项可供选择的手段——远程调试——将程序在测试环境中以debug模式启动,在本机使用IDEA在工程中设置断点进行调试。
2,IDEA构建SpringBoot测试Demo

新建SpringBoot测试项目remote-debug,只需要web依赖支持即可;版本选用2.2.6.RELEASE(注意,别用2.5.1版本,有坑,亲测)
pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.java1234</groupId>
	<artifactId>remote-debug</artifactId>
	<version>v1.0</version>
	<name>remote-debug</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

简单搞个TestController,提供一个Rest接口

package com.java1234.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
    @PostMapping("/test")
    public String test(Integer id,String name){
        System.out.println("id="+id);
        System.out.println("name="+name);
        if(id>0){
            return "success "+name;
        }else{
            return "fail";
        }
    }
}

我们启动项目,用postman测试下:
测试接口:http://localhost/test 加入Body form-data 参数 id=1,name=marry,Send 测试,返回 success marry,测试OK;
3,测试Demo项目配置支持远程调试**

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n</jvmArguments>
			</configuration>
		</plugin>
	</plugins>
</build>

加了此配置后,打包后的项目发布服务器,可支持远程DEBUG;
具体参数详解:
-Xdebug 通知JVM工作在DEBUG模式下;
-Xrunjdwp 通知JVM使用(Java debug wire protocol)运行调试环境。该参数同时包含了一系列的调试选项;
**transport **指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另有dt_shmem指用共享内存方式,其中,dt_shmem只适用于Windows平台;
address 调试服务器的端口号,客户端用来连接服务器的端口号;
server=y/n VM 是否需要作为调试服务器执行;
suspend=y/n 是否在调试客户端建立连接之后启动 VM;
4,IDEA打包jar

我们打包jar包;
img

打包后,在target目录下,会生成一个jar包;我们把它复制出来即可;
img

5,启动jar并且带启动参数支持远程调试

我们把remote-debug-v1.0.jar放D盘根目录;
我们启动jar,并且支持远程DEBUG;
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar remote-debug-v1.0.jar

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RERGHClm-1623688298225)(image-20210613225414441.png)]

启动OK,监听socket 5005端口
6,IDEA远程DEBUG配置

IDEA要进行远程DEBUG,需要进行配置;
1,启动项下拉,选择 Edit Configurations...编辑配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3UGDXNMD-1623688298228)(image-20210613225801811.png)]
2,点击+,选择Remote,添加远程DEBUG配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rzwtdYm-1623688298229)(image-20210613230023399.png)]
3,添加远程DEBUG配置项,Host和Port,配置后,点击Apply和OK按钮
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l0edF9KU-1623688298231)(image-20210613230200362.png)]

7,IDEA远程DEBUG测试

1,打测试断点
我们直接在TestController类里的test方法上打点断;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2MqDENbp-1623688298232)(image-20210613230809384.png)]
2,选择远程debug启动项,然后点击测试调试按钮启动;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWmN2f6b-1623688298234)(image-20210613230646749.png)]
3,postman测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VJrvld2D-1623688298236)(image-20210613231151240.png)]
4,成功进入断点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeCKrJS3-1623688298238)(image-20210613231235544.png)]
我们走完断点;
5,启动的jar包打印信息,测试OK

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-waIbt2vf-1623688298241)(image-20210613231336792.png)]

参考三:https://blog.csdn.net/qq_48804275/article/details/126021431

远程debug,简单三步

这里默认你已经打好了jar包

  • 第一步,编辑idea配置
    1.1 点击edit configurations
    在这里插入图片描述
    1.2 点击 “ + ” 号选择Remote JVM Debug
    在这里插入图片描述
    1.3 进行配置,如图:
    在这里插入图片描述
    1.4 然后点击Apply应用
  • 第二步,启动jar服务,这步是重点
#使用如下命令启动
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1000 -Dserver.port=9206 -jar /opt/sitesupport-manager/sitesupport-manager-0.0.1-SNAPSHOT.jar

#参数使用说明,简单两句话
① -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1000是1.3中配置完后复制的,在Command line argument for remote JVM下边
②-Dserver.port : 这个就有意思了,假如你的application.yml中配置的启动端口是6666,但是你想以8888启动,那么使用这个参数就可以实现。使用Dserver.port的优先级高于server.port
123456

这样你就部署好了服务,并且连接好了本地的idea,现在开始debug!

  • 第三步
    在本地idea打断点,这里打印一下,看看断成功没有,然后点击debug按钮
    在这里插入图片描述
    在自己的服务上测试对应的接口,我这里演示一下,这里的部署就是刚才我打断点的位置,我点击

在这里插入图片描述
成功拦截
在这里插入图片描述

失败原因
① 部署的代码和debug的代码不一致
② 服务器对应监听端口没开启,或者直接关闭防火墙