远程调试原理

Java 程序是运行在Java 虚拟机(JVM )上的,Java程序统一以字节码的形式在JVM中运行,

因为都是类字节码文件,只要本地代码和远程服务器上的类文件相同,两个JVM通过调试协议进行通信,

被调试的服务器需要开启调试模式,服务器端的代码和本地代码必须保持一致,则会造成断点无法进入的问题。

只要确保本地的Java的源代码与目标应用程序一致,本地的Java的源码就可以用插座连接到远端的JVM,进而执行调试。本地只需要有源码,本地的Java的应用程序根本不用启动。

传输方式,默认为Socket

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

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

远程调试包括两个步骤:

  1. 启动Tomcat启用远程调试
  2. 用 IDE (这里用IntelliJ IDEA)要能够调试远程Tomcat应用

传递特定的启动参数给 JVM,让它启用远程调试(remote debugging)。

JVM 激活远程调试的启动参数有 JPDA_OPTS, CATALINA_OPTS 和 JAVA_OPTS

服务器端开启调试模式,增加JVM启动参数,以支持远程调试

服务器端的Tomcat的安装目录下catalina.sh文件,在第一行添加参数配置如下:


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

配置添加之后,重启tomcat即可生效(shutdown.sh /startup.sh

address=ip:8089,所在服务器ip端口8089

各参数解释

  • -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的执行。
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐