IDEA远程调试Java代码
文章目录
- 1 前言
- 2 远程 Debug 调试原理
- 2.1 理论基础
- 2.2 远程调试分类
- 3 主动连接调试
- 3.1 远程服务中开启 Debug 服务
- 3.1.1 对于 SpringBoot
- 3.1.2 对于 Tomcat
- 3.2 IDEA 中指定 Debug 服务器
- 3.3 远程服务器防火墙端口放行
- 4 被动连接调试
- 4.1 对于 Tomcat
- 4.2 对于 SpringBoot
- 5 开始调试
- 6 关闭调试
1 前言
当我们的代码在线上/测试环境运行出现异常需要进行问题定位时,之前的传统做法是:查看异常日志,根据日志定位到出错代码,然后再根据相关参数及异常信息进行推断。但是很多异常问题需要更细致的进行debug才能够更精准的去定位和解决,这种情况下,我们希望能够像在本地调试一样去debug线上/测试环境的代码,这样可以大大提升bug修复的效率。IDEA 远程调试为我们提供了解决方案,像运行本地代码一样调试远程主机上的程序,以排查远程程序的BUG或代码执行流程。
2 远程 Debug 调试原理
在本地远程调试服务器端的代码原理:本地和服务器端建立一个socket连接监听,当客户端访问服务器的时候,服务器端会先去问本地idea有没有断点,如果有会停在当前断点,如果没有就返回给客户端。
2.1 理论基础
JPDA
(Java Platform Debugger Architecture)是Java平台调试体系结构的缩写。由3个规范组成,分别是JVMTI
(JVM Tool Interface),JDWP
(Java Debug Wire Protocol),JDI
(Java Debug Interface) 。
- 1.
JVMTI
定义了虚拟机应该提供的调试服务,包括调试信息(Information譬如栈信息)、调试行为(Action譬如客户端设置一个断点)和通知(Notification譬如到达某个断点时通知客户端),该接口由虚拟机实现者提供实现,并结合在虚拟机中 - 2.
JDWP
定义调试服务和调试器之间的通信,包括定义调试信息格式和调试请求机制 - 3.
JDI
在语言的高层次上定义了调试者可以使用的调试接口以能方便地与远程的调试服务进行交互,Java语言实现,调试器实现者可直接使用该接口访问虚拟机调试服务。
2.2 远程调试分类
远程调试分为主动连接调试,和被动连接调试。
主动连接调试:服务端配置监控端口,本地IDE连接远程监听端口进行调试,一般调试问题用这种方式。
被动连接调试:本地IDE监听某端口,等待远程连接本地端口。一般用于远程服务启动不了,启动时连接到本地调试分析。
3 主动连接调试
3.1 远程服务中开启 Debug 服务
3.1.1 对于 SpringBoot
命令行添加选项,并重启,注意新参数必须在 -jar 之前
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar springbootfirst.jar
3.1.2 对于 Tomcat
启动脚本中添加选项,并重启:
## sudo vim $CATALINA_HOME/bin/catalina.sh
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
3.2 IDEA 中指定 Debug 服务器
点击主窗口菜单
Run / Edit Configurations
,打开Run/Debug Configurations
窗口;点击工具栏上的
+
按钮,下拉菜单中选择Remote
;设置 Host 为远程服务器的域名或IP,保持 Port=5005 无需调整;
Use module classpath
配置为程序模块名称;Command line arguments for remote JVM
配置:配置Debug远程服务的命令行启动参数,形如
-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
,参数说明如下:- -Xdebug:JVM在DEBUG模式下工作;
- -Xrunjdwp:JVM使用(java debug wire protocol)来运行调试环境;
- transport:监听Socket端口连接方式,常用的dt_socket表示使用socket连接;
- server:=y表示当前是调试服务端,=n表示当前是调试客户端;
- suspend:=n表示启动时不中断(如果启动时中断,一般用于调试启动不了的问题);
- address:表示本地监听的地址和端口。
3.3 远程服务器防火墙端口放行
如果调试服务器与远程服务器网络不相通则需要开放端口
### sudo vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5005 -j ACCEPT
### 重启生效: sudo systemctl restart iptables
4 被动连接调试
首先需要IDEA配置监听,如主动连接调试的IDEA配置图片,Debugger mode选择:Listen to remote JVM,配置本地监听端口,比如默认5005。点击Debug开始等待远程连接调试。
4.1 对于 Tomcat
配置远程服务启动脚本:
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:5005,suspend=y"
4.2 对于 SpringBoot
命令行添加选项,并重启,注意新参数必须在 -jar 之前
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:5005,suspend=y -jar springbootfirst.jar
参数含义和主动连接调试一样,只是这里suspend=y表示启动时就中断,需要连接本地IDE调试启动。address=ip:port,ip需要修改为本地的对外IP。
这样远程项目启动时就连接到本地,方便调试项目启动不了的问题。
5 开始调试
- 要求:双方代码一致,否则远程调试无法启动;
- 本地启动刚刚配置的 Remote Server,正常时会看到日志:
Connected to the target VM, address: 'xxx:5005', transport: 'socket'
- 本地 IDEA 代码中设置断点
- 浏览器或手机 HTTP 访问服务器
- IDEA 即可在断点暂停并跟踪
6 关闭调试
服务器上多开放个端口是不安全的,调试完毕后可恢复防火墙设置。
Java 服务器关闭 Debug 服务器的功能,因为debug会影响性能。
IDEA远程调试Java代码相关推荐
- Eclipse远程调试Java代码的三种方法
Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...
- eclipse 远程调试java_Eclipse远程调试Java代码的三种方法
Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...
- eclipse远程调试Java程序
远程调试tomcat服务 配置tomcat在catalina.sh中添加如下 CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler ...
- 使用 Eclipse 远程调试 Java 应用程序
转载地址:使用 Eclipse 远程调试 Java 应用程序 远程调试对应用程序开发十分有用.例如,为不能托管开发平台的低端机器开发程序,或在专用的机器上(比如服务不能中断的 Web 服务器)调试程序 ...
- IDEA远程调试服务器代码
先在idea添加一个remote,host填服务器ip,port填监听服务器端口,默认5005 然后在服务器tomcat catalina.sh 添加(红色部分): JAVA_OPTS="$ ...
- chrome浏览器断点调试js代码 和 idea断点调试java代码
文章目录 chrome调试js代码 idea调试java代码 chrome调试js代码 Chrome调试快捷键总结 快捷键 功能 F10 (step over) 单步调试.步过,遇到函数时也当成一个语 ...
- java计算机毕业设计的小区物业管理系统源程序+mysql+系统+lw文档+远程调试java计算机毕业设计的小区物业管理系统源程序+mysql+系统+lw文档+
java计算机毕业设计的小区物业管理系统源程序+mysql+系统+lw文档+远程调试java计算机毕业设计的小区物业管理系统源程序+mysql+系统+lw文档+ java计算机毕业设计的小区物业管理系 ...
- 【java】jdb调试java代码
jdb调试java代码 Java程序中有逻辑错误,就需要使用JDB来进行调试了.调试程序在IDE中很方便了,比如这篇博客介绍了在Intellj IDEA中调试Java程序的方法. 我们课程内容推荐在L ...
- idea远程调试修改代码_IDEA远程调试(Remote Debug)Java代码指南
前言 当我们的代码在线上/测试环境运行出现异常需要进行问题定位时,之前的传统做法是:查看异常日志,根据日志定位到出错代码,然后再根据相关参数及异常信息进行推断.但是很多异常问题需要更细致的进行debu ...
- grails的controller和action那点事---远程调试groovy代码
最近由于项目需要,用到了grails,这玩意确实好用,生产率高有类型python的速度与简洁.仅第一印象,用的还不深入,说的不对请轻拍. 遇到的几个问题: 1. groovy远程调试 玩Java的应该 ...
最新文章
- Simulink触发子系统使用方法
- 从wait_type入手模拟SQL Server Lock
- 写程序没思路怎么办?
- Qt5学习笔记之计时器
- OSChina 周日乱弹 —— 普通人如何面对持刀歹徒
- python语法学习第十一天--迭代器
- String.format(“0:D2}“,a)字符串格式化
- 如何将pdf文件转换成可以编辑的文档
- 学习笔记HHL:Generalizing a Person Retrieval Model--Hetero-Homogeneous Learning UDA郑良2018
- 软件测试人员是选择大公司好,还是选择小公司更好
- Mac Safari 12.0 升级后无限闪退,提示不支持扩展
- 多元线性回归算法预测房价【人工智能】
- superset汉化
- clickhouse中bitmap在用户标签,访客去重生产中使用及clickhouse建表null值数据类型处理
- 大学生活快要结束了,才想要珍惜~~~
- 分享 outlook 附件被禁止访问的解决方法
- VLOG短视频必备!24个Ins潮流插画风视频短视频模板
- HTML游戏黑屏,“网页游戏黑屏,白屏,无法调出flash.”的解决方案
- html图片苹果无法显示,苹果cms采集的图片不显示解决办法
- Mac用 AVC全能视频转换器免费版