IntelliJ IDEA 配置远程调试及原理
转自:https://www.cnblogs.com/zhangzhonghui/articles/12185863.html
参考:https://www.cnblogs.com/sunweiye/p/12003733.html
配置步骤如下:
- 打开 IDEA 中的 Run/Debug Configurations
- 选择顶部的 “+” 按钮,找到选项中的 Remote
- 进行远程调试配置
- ①:随便对当前服务取个名称(非必须,可使用默认的)
- ②:Host:远程服务的 IP(具体部署项目的服务器IP),
- ③:Port:远程服务的端口(切记不要重复)若将项目部署到 Linux 需要 使用 lsof -i :端口 查看一下端口是否别占用,这一步重要。
- ④:最后 点击 Apply 进行保存(Apply 与 OK 的区别 ,一个是保存并运用,Ok 只是保存)。
对于为什么这里要配置重新配置ip 和端口 我一开始也不知道,后面慢慢又想通了,首先是两个服务,要进行通信不配置“链接”,怎么去实时监控呢?是不是这个道理。
- 启动服务(Linux 部署项目)
- 核心参数:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=端口(上一步中③中配置的端口)。
-
远程调试启动配置:nohup java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=端口 *.jar &
- 普通的启动配置:nohup java -jar *.jar & 。
- 本地启动远程调试
- 和启动 Springboot 项目 类似
- 启动日志,并不是很多
- 进行测试(这里需要注意的是,本地代码和服务器上的代码需要保持一致,否则断点失败)。
- 在本地代码上 加入断点
- 为了方便,我使用 测试环境上的 swagger 进行测试
- 测试成功,成功进入本地代码的断点测试中。
为什么可以进行远程调试,背后的原理是什么
首先,了解下的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的执行
相关文章
- Idea使用记录--添加Problems&&解决Autowired报错could not autowire
- IDEA配置Gradle
- Idea配置sbt(window环境)
- idea中git git pull push需要反复输入密码
- IntelliJ IDEA 14.x 的 project 和 module 是啥关系?
- IDEA的一些个性化配置
- Intellij IDEA 安装和配置jrebel进行项目的热部署
- idea 配置热部署
- idea 配置tomcat(包含tomcat Server找不到的配置方法)
- IntelliJ IDEA 设置Output (输出窗口)窗口字体大小
- idea svn 设置忽略 文件
- IDEA使用Statistic插件统计代码数量
- 使用intellij idea打包并部署到外部的tomcat
- idea怎么配置maven
- idea设置多行tab显示已打开的文件
- idea下java项目的打包与使用
- Android Studio / IDEA 中.android 文件夹移动出默认位置
- idea 本地调用zookeeper配置
- 成功解决IDEA中建立新项目Maven会默认选择配置(图解详细说明)
- idea 快速生成代码的快捷键
- Spring MVC 学习总结(一)——MVC概要与环境配置(IDea与Eclipse示例)
- idea-java项目配置
- ECLIPSE IDEA 调音 1
- IntelliJ IDEA中自动生成MyBatis代码
- idea-debug启动会卡住不动,BeanPostProcessors (for example: not eligible for auto-proxying),报错解决
- 在idea里面配置git的方法
- Intellij IDEA插件之自动生成时序图(Sequence Diagram)
- IntelliJ IDEA中的神仙插件