平常环境和预发环境遇到问题时,能够用远程调试的方法本地打断点,在本地调试。生产环境因为网络隔离和系统稳定性考虑,不能进行远程代码调试。java
总体过程是经过修改远程服务JAVA_OPTS参数,而后本地经过Eclipse或IDEA等工具调试。windows
下面简单介绍下理论。tomcat
JPDA(Java Platform Debugger Architecture)是Java平台调试体系结构的缩写。由3个规范组成,分别是JVMTI(JVM Tool Interface),JDWP(Java Debug Wire Protocol),JDI(Java Debug Interface) 。网络
远程调试分为主动链接调试,和被动链接调试。这里以Eclipse为例。eclipse
主动链接调试:服务端配置监控端口,本地IDE链接远程监听端口进行调试,通常调试问题用这种方式。socket
被动链接调试:本地IDE监听某端口,等待远程链接本地端口。通常用于远程服务启动不了,启动时链接到本地调试分析。工具
首先须要远程服务配置启动脚本:ui
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"
若是是启动jar包,指令:插件
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar test.jar
这里-Xdebug是通知JVM工做在DEBUG模式下,-Xrunjdwp是通知JVM使用(java debug wire protocol)来运行调试环境。transport是监听Socket端口链接方式(也能够dt_shmem共享内存方式,但限于windows机器,而且服务提供端和调试端只能位于同一台机)。server=y表示当前是调试服务端,=n表示当前是调试客户端。suspend=n表示启动时不中断(若是启动时中断,通常用于调试启动不了的问题)。address=8000表示本地监听8000端口。debug
远程服务(tomcat/jboss)启动成功后,本地Eclipse对须要调试的地方打上断点,而后项目右键启动远程调试:Debug as->Debug Configurations->Remote Java Application。Host为远程主机IP,Port为远程监听调试端口,Connection Type为:Standard(Socket Attach),如图:
点击Debug,而后打断点,远程服务运行到断点处本地就会中断,而后进行调试。
首先须要Eclipse配置监听,如主动链接调试的Eclipse配置图片,Connection Type选择:Standard(Socket Listen),配置本地监听端口,好比默认8000。点击Debug开始等待远程链接调试。
而后配置远程服务启动脚本:
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y"
若是是调试jar包,指令:
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y -jar remoting-debug.jar
参数含义和主动链接调试同样,只是这里suspend=y表示启动时就中断,须要链接本地IDE调试启动。address=ip:port,ip须要修改成本地的对外IP。
这样远程项目启动时就链接到本地,方便调试项目启动不了的问题。
另外除了在启动脚本如上配置外,还能够用这种方式配置:
启动时:sh catalina.sh jpda start。修改启动时是否中断或本地监听端口,设置变量值:JPDA_SUSPEND=y JPDA_ADDRESS=9999。