zl程序教程

您现在的位置是:首页 >  工具

当前栏目

IntelliJ IDEA 配置远程调试及原理

IDEA配置调试原理 远程 Intellij
2023-09-11 14:19:34 时间

转自:https://www.cnblogs.com/zhangzhonghui/articles/12185863.html

参考:https://www.cnblogs.com/sunweiye/p/12003733.html

配置步骤如下:

  • 打开 IDEA 中的 Run/Debug Configurations
  1. 选择顶部的 “+” 按钮,找到选项中的 Remote

 

  •  进行远程调试配置
  1. ①:随便对当前服务取个名称(非必须,可使用默认的)
  2. ②:Host:远程服务的 IP(具体部署项目的服务器IP),
  3. ③:Port:远程服务的端口(切记不要重复)若将项目部署到 Linux 需要 使用 lsof -i :端口 查看一下端口是否别占用,这一步重要。
  4. ④:最后 点击 Apply 进行保存(Apply 与 OK 的区别 ,一个是保存并运用,Ok 只是保存)。对于为什么这里要配置重新配置ip 和端口 我一开始也不知道,后面慢慢又想通了,首先是两个服务,要进行通信不配置“链接”,怎么去实时监控呢?是不是这个道理。

 

  •  启动服务(Linux 部署项目)
  1. 核心参数:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=端口(上一步中③中配置的端口)。
  2. 远程调试启动配置:nohup java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=端口 *.jar & 

  3. 普通的启动配置:nohup java -jar *.jar & 。
  • 本地启动远程调试
  1. 和启动 Springboot 项目 类似
  2. 启动日志,并不是很多
  • 进行测试(这里需要注意的是,本地代码和服务器上的代码需要保持一致,否则断点失败)。
  1. 在本地代码上 加入断点 
  2. 为了方便,我使用 测试环境上的 swagger 进行测试 
  3. 测试成功,成功进入本地代码的断点测试中。

 为什么可以进行远程调试,背后的原理是什么

首先,了解下的Java程序的执行过程- 分为以下几个步骤:Java的文件 - - 编译生成的类文件(class文件) - - JVM加载类文件 - - JVM运行类字节码文件 - - JVM翻译器翻译成各个机器认识的不同的机器码。

远程调试原理
   众所周知,Java 程序是运行在Java 虚拟机(JVM )上的,具有良好跨平台性,是因为Java程序统一以字节码的形式在JVM中运行,不同平台的虚拟机都统一使用这种相同的程序存储格式。因为都是类字节码文件,只要本地代码和远程服务器上的类文件相同,两个JVM通过调试协议进行通信(例如通过插座在同一个端口进行通信),另外需要注意的时,被调试的服务器需要开启调试模式,服务器端的代码和本地代码必须保持一致,则会造成断点无法进入的问题。

<code>Java</code>的调试器架构

1.这个架构其实质还是JVM,只要确保本地的Java的源代码与目标应用程序一致,本地的Java的的的的源码就可以用插座连接到远端的JVM,进而执行调试。因此,在这种插座连接模式(下文介绍)下,本地只需要有源码,本地的Java的应用程序根本不用启动。

传输方式,默认为Socket ;

套接字:MACOS,Linux的系统使用此种传输方式;

共享内存:WINDOWS系统使用此种传输方式。

调试模式:默认为Attach ;

  Attach :此种模式下,调试服务端(被调试远程运行的机器)启动一个端口等待我们(调试客户端)去连接;

  Socket :此种模式下,是我们(调试客户端)去监听一个端口,当调试服务端准备好了,就会进行连接。

配置属性说明补充

文本:

  CATALINA_OPTS="-Xdebug  -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8089"

2.各参数解释:
-Xdebug:通知JVM工作在调试模式下
-Xrunjdwp:通知JVM使用(java debug wire protocol)来运行调试环境。参数同时有一系列的调试选项:
<code>session</code>:指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另外dt_shmem指用共享内存方式,其中dt_shmem只适用于窗口平台.server  参数是指是否支持在服务器模式的虚拟机中。
onthrow:指明当产生该类型的异常时,JVM就会中断下来,进行调式该参数任选。
<code>release</code>:指明当JVM被中断下来时,执行的可执行程序该参数可选
<code>suspend</code><:指明:是否在调试客户端建立起来后,再执行 JVM。
onuncaught(= y或n)指明出现未捕获的异常后,是否中断JVM的执行