Jvm Debug

 

当我们在本地写代码的时候,我们可以在编辑器开启debug模式,快速定位bug. 当代码跑在服务器上的时候,也是可以进行远程debug的.快速进行bug定位.

说明:

  • remote debug 是jvm 原生支持的功能 即JPDA
  • 需要本地的java类和服务器上的class版本一致 否则会错行
  • 服务器要监听一个端口 保证本地到此端口 网络通

JAVA8架构图

服务端配置

web应用(EE) remote dubug

以tomcat为例,weblogic没折腾过,但是只要在合适的位置添加(修改)合适的java启动参数肯定是可以的

  1. 登录服务器
  2. cd TOMCAT_HOME/bin
  3. 修改catalina.sh
  4. JPDA_ADDRESS="localhost:8000"修改为JPDA_ADDRESS="0.0.0.0:8000"(说明:如果不修改此处,只能本机访问)
  5. ./shutdown.sh
  6. ./catalina.sh jpda start(不要使用startup.sh启动)

说明:

  • 端口可以自定义,只要将8000修改为你想要的就可以(>1024)即可

jar应用(SE) remote debug

eg:

之前的bash

java -cp agent2.jar com.hfvast.App 8888 47.94.6.183 22

改造后的脚本

java -Xdebug -Xrunjdwp:transport=dt_socket,address=8012,server=y,suspend=n -cp agent2.jar com.hfvast.App 8888 47.94.6.183 22
-Xdebug是通知JVM工作在DEBUG模式下

-Xrunjdwp是通知JVM使用(java debug wire protocol)来运行调试环境。该参数同时了一系列的调试选项:

transport指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另有dt_shmem指用共享内存方式,其中,dt_shmem只适用于Windows平台。
server参数是指是否支持在server模式的VM中.
onthrow指明,当产生该类型的Exception时,JVM就会中断下来,进行调式。该参数可选。
launch指明,当JVM被中断下来时,执行的可执行程序。该参数可选
suspend指明,是否在调试客户端建立起来后,再执行JVM.当jar非守护性 则需要设置suspend=y
onuncaught(=y或n)指明出现uncaught exception 后,是否中断JVM的执行.
同样端口也是可以自定义的

客户端配置(IDE)

IDEA

IntelliJ远程调试教程

Eclipse

使用Eclipse进行远程调试