vagrant debug 无法从主机访问调试端口 8000

vagrant debug can't access debug port 8000 from host machine

从主机到端口 8000 的连接不起作用(连接被拒绝),但在来宾计算机上可以进行本地调试。

我 运行 tomcat 8.5 在一个带有 centos 图像和自签名证书的流浪盒子里。主机是 运行 windows 7. 我可以使用 https 在安全端口 8443 上访问 tomcat 的管理器应用程序,我也可以使用 https 在安全端口 8443 上访问我的 webapp . 8443 没有转发。非安全连接也可以在主机端口 8080 上工作,该端口被转发到 vagrant box 上的访客端口 80。

关闭 tomcat、bin/shutdown.sh 并通过 bin/catalina.sh jpda start 在调试模式下重新启动后,我可以通过 jdb -attach 8000 在端口 8000 上附加 jdb,并且我可以查看线程和 类,在设置断点并在安全的 8443 上点击应用程序后,我可以单步执行。

我已经尝试在 Vagrantfile 中将主机端口 9000 转发到访客端口 8000,并且还尝试了在 tomcat 的 bin/server.xml 中设置的各种连接器以允许端口上的连接8000。为了允许远程连接,我必须在 tomcat 的 conf/Catalina/localhost 中添加上下文文件,其中包含 tomcat 的管理器应用程序以及我的应用程序的以下文本:

<Context privileged="true" antiResourceLocking="false"
         docBase="${catalina.home}/webapps/manager">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
  </Context>

我觉得我可能还需要为 tomcat 做一些其他事情以允许在端口 8000 上进行远程连接,但是我花了几个小时 google 找不到它搜索和实验。

我想通了。

在catalina.sh中,JPDA 变量是在if 语句中设置的。我允许这些变量定义如何连接。 JPDA_ADDRESS 被设置为 JPDA_ADDRESS="localhost:8000" 我删除了 "localhost:" 所以它现在被设置为 JPDA_ADDRRESS="8000"。我现在可以从主机上的 STS 连接。下面是来自 catalina.sh 的 if 语句,我将其更改为允许客户机外部的连接。

if [ "" = "jpda" ] ; then
  if [ -z "$JPDA_TRANSPORT" ]; then
    JPDA_TRANSPORT="dt_socket"
  fi
  if [ -z "$JPDA_ADDRESS" ]; then
    JPDA_ADDRESS="8000" // only this line changed. was set to "localhost: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

catalina.sh 可能不是更改 JPDA_ADDRESS 的最佳位置。其他帖子建议在 setenv.sh 中定义 JPDA 变量,或者使用适当的命令调用 catalina.sh 的自定义脚本以在调试模式下启动。

除了这个答案之外,我还找到了另一个问题的答案,它帮助我找出问题所在。 Antony Shumskikh 对 What are Java command line options to set to allow JVM to be remotely debugged? 的回答很有帮助。