IDEA 2019 远程调试Tomcat具体配置步骤

前言

有时候web应用在运行过程中通过日志无法查找到问题,为了便于定位和解决已经部署在服务器中的web应用,Tomcat提供了远程Debug调试功能,使用IDEA配置后即可通过本地代码远程调试服务器上的Web应用。本文主要通过自己查阅的资料和实践做一个总结。

环境参数

  • IDEA 2019.2.3
  • Tomcat 8.5
  • JDK 8
  • window service 2008 r2

具体步骤

1.配置Tomcat容器参数

右键编辑tomcat/bin目录下的catalina.bat文件,加入如下参数:

set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8009

注意:监听的端口address可以为任意没有被占用的端口号,在此为8009 

操作步骤下图所示 

IDEA 2019 远程调试Tomcat具体配置步骤_第1张图片

IDEA 2019 远程调试Tomcat具体配置步骤_第2张图片

配置添加之后,重启tomcat即可生效,注意:调试模式启动Tomcat会引发安全和性能风险,正式环境下不建议启用。

IDEA 2019 远程调试Tomcat具体配置步骤_第3张图片

参数说明:

JPDA_TRANSPORT:指的是调试者与被调试者的交互方式,dt_socket是通过网络socket的方式,dt_shmem(共享内存),很明显这种的适合调试本机的JVM,此处我们用socket连接方式,参数应填写dt_socket。

JPDA_ADDRESS:调试启动地址,即访问tomcat的地址,此处填写8009。

JPDA_SUSPEND:suspend指的是启动过程是否加载暂停,如果选择y的话,那我们的调试是从tomcat还没被加载开始的,有tomcat的代码的话可以调试tomcat的源码,此处填写N。

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

2.配置IDEA的Remote相关参数

点击Run -> Edit Configuration,按照下图步骤并输入参数:

IDEA 2019 远程调试Tomcat具体配置步骤_第4张图片

IDEA 2019 远程调试Tomcat具体配置步骤_第5张图片

IDEA 2019 远程调试Tomcat具体配置步骤_第6张图片

调试模式,默认为Attach to remoote JVM

  • Attach:此种模式下,调试服务端(被调试远程运行的机器)启动一个端口等待我们(调试客户端)去连接;
  • Listen: 此种模式下,是我们(调试客户端)去监听一个端口,当调试服务端准备好了,就会进行连接。

 

3.启动远程调试

在IDEA中,选择自己刚才配置的Remote的Name,之后点击Debug,如果控制台输出“Connected to the target VM, address: 'X.X.X.X:8009', transport: 'socket'”,

下图表示连接成功,可以进行断点调试了

IDEA 2019 远程调试Tomcat具体配置步骤_第7张图片

调试时在相应代码处打上断点即可

IDEA 2019 远程调试Tomcat具体配置步骤_第8张图片

注意事项

(1)Remote Debug导致会整个Web应用挂起

    当远程Debug目标Web应用,会导致服务器上整个Web应用挂起,如果此时他人访问该应用,即使访问的页面资源目标并没有在自己设的端点上,也则会导致他人等待,直到自己Debug的端点放开,他人才能继续正常访问Web应用。

(2)两端的端口号不能被其他应用占用,端口号不能是Tomcat的端口,并且两端的Debug端口号要一致,还要保证这些设置的端口在防火墙中是开放状态;

(3)Debug模式启动tomcat远程调试会影响WEB应用的性能,且会暴露端口,建议只在测试服务器使用。

调试原理

Java 调试体系JPDA简介
JPDA(Java Platform Debugger Architecture):即Java平台调试体系架构。Java虚拟机设计的专门的API接口供调试和监控虚拟机使用

JPDA按照抽象层次,又分为三层,分别是:

JVM TI(Java VM Tool Interface):虚拟机对外暴露的接口,包括debug和profile。
JDWP(Java Debug Wire Protocol):调试器和应用之间通信的协议。
JDI(Java Debug Interface):Java库接口,实现了JDWP协议的客户端,调试器可以用来和远程被调试应用通信

JDWP简介

JDWP(Java DEbugger Wire Protocol):即Java调试线协议,是一个为Java调试而设计的通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。说白了就是JVM或者类JVM的虚拟机都支持一种协议,通过该协议,Debugger 端可以和 target VM 通信,可以获取目标 VM的包括类、对象、线程等信息,在调试Android应用程序这一场景中,Debugger一般是指你的 develop machine 的某一支持 JDWP协议的工具例如 Android Studio 或者 JDB,而 Target JVM是指运行在你mobile设备当中的各个App(因为它们都是一个个虚拟机 Dalvik 或者 ART),JDWP Agent一般负责监听某一个端口,当有 Debugger向这一个端口发起请求的时候,Agent 就转发该请求给 target JVM并最终由该 JVM 来处理请求,并把 reply 信息返回给 Debugger 端。
参考资料:https://www.ibm.com/developerworks/cn/java/j-lo-jpda3/

 

 

你可能感兴趣的:(java,IDEA)