详解tomcat远程调试配置

远程调试应用场景:

有时候一个完整的工程没办法在本地跑起来,因为可能需要各种资源,比如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_OPTSCATALINA_OPTS


总结:

所以最简单的开启远程调试的方式就是修改startup.sh的最后一行:

exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"

jpda参数都用默认值,想要修改参数就可以根据自己喜好在startup.sh中export参数,或者在catalina.sh中直接指定。

为了统一管理tomcat的额外启动参数,我仿照公司的配置,直接在startup.sh中指定了参数(如上文所说catalina.sh中最后启动tomcat的参数是JAVA_OPTSCATALINA_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版本问题,老版本用第一种,新版本用第二种(第一种也兼容),可以参考这篇文章

肥肥小浣熊

推荐阅读更多精彩内容