[TOC]
概述
JVM本身提供可调试运行在虚拟机中的代码的功能。远程调试大致流程为:
- 在启动的时候设置启动参数以开启和配置调试功能
- 设置ip白名单或者关闭防火墙,让远端可以访问JVM所在机器
- IDE中配置远程调试信息
- 重启Tomcat,在IDE中启动远端调试
Java调试架构
JPDA(Java Platform Debugger Architecture)是Java平台调试体系结构的缩写。由3个规范组成,分别是:
- JVMTI(JVM Tool Interface)
- JDWP(Java Debug Wire Protocol)
- JDI(Java Debug Interface)
- JVMTI定义了虚拟机应该提供的调试服务,包括调试信息(Information譬如栈信息)、调试行为(Action譬如客户端设置一个断点)和通知(Notification譬如到达某个断点时通知客户端),该接口由虚拟机实现者提供实现,并结合在虚拟机中
- JDWP定义调试服务和调试器之间的通信,包括定义调试信息格式和调试请求机制
- JDI在语言的高层次上定义了调试者可以使用的调试接口以能方便地与远程的调试服务进行交互,Java语言实现,调试器实现者可直接使用该接口访问虚拟机调试服务。 java调试工具jdb,就是sun公司提供的JDI实现。eclipse IDE,它的两个插件org.eclipse.jdt.debug.ui和org.eclipse.jdt.debug与其强大的调试功能密切相关,其中前者是eclipse调试工具界面的实现,而后者则是JDI的一个完整实现。
Tomcat设置
- 修改catalina配置文件
/opt/apache-tomcat/bin/catalina.sh
第一行增加如下配置:
CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
- 防火墙增加白名单
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source
address="10.30.63.181" port protocol="tcp" port="5005" accept"
- 重启tomcat
/opt/apache-tomcat/sbin/tomcat.service restart
- 重启防火墙
firewall-cmd --reload
- 检查白名单是否添加成功
firewall-cmd --zone=public --list-rich-rules
IDE设置
- Run/Debug Configuration增加 Remote JVM Debug
- name:随便
- host&port:
- commond:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
- 点击debug
控制台输出如下,说明配置正确Connected to the target VM, address: '10.30.73.52:5005', transport: 'socket'
问题
- Error running '7352': Unable to open debugger port (10.30.73.52:5005): java.net.ConnectException "Connection refused: connect"
检查是否可以 ping 通,检查白名单是否添加成功。