远程调试:OpenJDK 11 上的 Wildfly 14 在端口 8787 上没有连接

Posted

技术标签:

【中文标题】远程调试:OpenJDK 11 上的 Wildfly 14 在端口 8787 上没有连接【英文标题】:Remote debugging: No connection to Wildfly 14 on OpenJDK 11 at port 8787 【发布时间】:2019-04-11 10:24:38 【问题描述】:

我正在尝试将我的调试器连接到在 Open JDK 11 上运行的 Wildlfy。

尽管 Wildfly 说:

Listening for transport dt_socket at address: 8787

我的 IDE(IntelliJ IDEA CE 2018.1)声称它没有任何连接:

Unable to open debugger port (localhost:8787): java.io.IOException "handshake failed - connection prematurally closed".

我通过standalone.sh --debug 启动Wildfly,结果如下JAVA_OPTS

-server
-Xms64m
-Xmx512m
-XX:MetaspaceSize=96M
-XX:MaxMetaspaceSize=256m
-Djava.net.preferIPv4Stack=true
-Djboss.modules.system.pkgs=org.jboss.byteman
-Djava.awt.headless=true
-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED
--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
--add-exports=jdk.unsupported/sun.reflect=ALL-UNNAMED
--add-modules=java.se

Java 9/10/11 有什么变化吗?使用 Oracle JDK 8 时,使用完全相同的设置进行远程调试可以正常工作。

使用 telnet 我可以确认,端口8787 确实无法访问。

更新在阅读@ehsavoie 的评论后:netstat -ln 在运行 Wildfly 的服务器上显示:

Proto Recv-Q Send-Q Local Address           Foreign Address         State   
tcp        0      0 127.0.0.1:8787          0.0.0.0:*               LISTEN 

显然,在 OpenJDK 11 中,调试端口现在默认绑定到 localhost。

【问题讨论】:

一般来说很少有疑问 - 顺便说一句,这适用于任何其他端口吗? standalone.sh的内容是什么?跟踪任何失败日志怎么样? standalone.sh 是unpatched file from Wildfly 14.0.1。像其他什么端口? Wildfly 可通过 8080、8443 和 9990 访问。在上述 JAVA_OPTS 中,8787 明显作为调试端口公开。 如果您将暂停设置为yes (y),启动是否暂停?只需检查 JVM 是否考虑了调试选项 @ehsavoie 在登录Listening for transport dt_socket at address: 8787 后,Wildfly 确实挂起。但是我的 IDE(IntelliJ Idea)仍然显示Unable to open debugger port (localhost:8787): java.io.IOException "handshake failed - connection prematurally closed" netstat -ln 显示什么? 【参考方案1】:

在我的例子中,我在我的机器上使用 Java 8,但远程 Wildfly 实例在 Java 11 上运行。

当我将 Java 版本更改为 11 时,它可以正常工作。

【讨论】:

【参考方案2】:

对于jdk 11,你应该使用

-agentlib:jdwp=transport=dt_socket,address=*:8787,server=y,suspend=n

改为。

【讨论】:

似乎在 java8 地址中可能只是端口,而 java11 地址表示具有多个接口的系统的地址和端口,我想。谢谢你。【参考方案3】:

原因在于 Java 9 根据this answer 更改的默认行为:从 Java 9 开始,JVM 只接受本地连接,除非另有说明。

因此解决方案相当简单:

虽然对于 Java 8,使用 --debug 启动 Wildfly 就足够了,对于 Java 9,我需要将其更改为 --debug *:8787

【讨论】:

以上是关于远程调试:OpenJDK 11 上的 Wildfly 14 在端口 8787 上没有连接的主要内容,如果未能解决你的问题,请参考以下文章

在 VS2019 中调试远程服务器上的 Windows 服务

x64 Windows Server 2003 上的远程调试

PyCharm 上的远程调试

在远程服务器上的Docker内部进行Xdebug远程调试

x64 上的 x86 远程调试器服务

远程 Azure 服务器上的 Visual Studio 2022 调试