远程调试应用场景:
有时候一个完整的工程没办法在本地跑起来,因为可能需要各种资源,比如rpc,redis,hive,hbase,mysql和其他关联的应用。这时候有问题可能就需要在公司的测试环境上远程调试一下代码了。
之前一直都是直接用的公司配好的tomcat,可以直接远程调试,最近想在自己本地的tomcat上配置下远程调试的功能,google了好多资料,发现每个文章说的都有些差别,决定自己研究明白,做了这篇总结。
以tomcat7.0.79为例:
startup.sh:
tomcat在bin目录中提供了该启动脚本,最后一行是:
exec "$PRGDIR"/"$EXECUTABLE" start "$@"
根据之前定义的变量,实际就是:
catalina.sh start $@
catalina.sh:
tomcat实际的启动脚本是catalina.sh,进入catalina.sh中可以看到这样一段:
if [ "$1" = "jpda" ] ; then
if [ -z "$JPDA_TRANSPORT" ]; then
JPDA_TRANSPORT="dt_socket"
fi
if [ -z "$JPDA_ADDRESS" ]; then
JPDA_ADDRESS="8000"
fi
if [ -z "$JPDA_SUSPEND" ]; then
JPDA_SUSPEND="n"
fi
if [ -z "$JPDA_OPTS" ]; then
JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
fi
CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS"
shift
fi
如果第一个参数是jpda的话,则会在CATALINA_OPTS中额外加上这些启动参数:
agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
这几个参数的意思不细说了,可以google。
最终tomcat启动时的jvm参数是JAVA_OPTS和CATALINA_OPTS
总结:
所以最简单的开启远程调试的方式就是修改startup.sh的最后一行:
exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"
jpda参数都用默认值,想要修改参数就可以根据自己喜好在startup.sh中export参数,或者在catalina.sh中直接指定。
为了统一管理tomcat的额外启动参数,我仿照公司的配置,直接在startup.sh中指定了参数(如上文所说catalina.sh中最后启动tomcat的参数是JAVA_OPTS和CATALINA_OPTS):
export JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=127.0.0.1:9000"
TIPS:
address默认的是8000,这样会不安全,来自任意ip的8000端口都可以访问,所以我设置为127.0.0.1:9000,只有本机的9000端口才可以访问。如果别的机器想要远程调试,可以socat TCP4-LISTEN:9001,fork,range=xxx/32 TCP4:127.0.0.1:9000
,xxx填写别的机器ip,别的机器连接9001端口,然后转发到9000。至于使用idea还是eclipse设置远程调试就可以直接百度了。
至于-Xdebug -Xrunjdwp
和-agentlib
这两种配置方式,主要是jdk版本问题,老版本用第一种,新版本用第二种(第一种也兼容),可以参考这篇文章