握手失败 \- 在 Intellij 中调试 Solr 时连接过早关闭错误

新手上路,请多包涵

所以我打算在 Intellij Community Edition 上调试我的 Solr 过滤器插件。在我使用此命令从命令提示符运行程序后

java -jar start.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8983

我用这个配置启动了我的 Intellij 调试器:

 Transport : socket
Debugger mode : attach
Host : localhost
Port : 8983

但是当我运行调试器时,我得到了这个错误:

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

知道如何解决这个问题吗?

原文由 donthurtme 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

应该是这样的

java "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8983" -jar start.jar

它现在工作

原文由 donthurtme 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试访问 Docker 容器上的调试端口时出现该错误。

如果您尝试访问 Docker 容器内的调试端口,请确保将端口指定为 *:5005

例如

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

这是自 Java 9 以来的变化。

请参阅: 回归:远程调试在 JDK 9 上不起作用

这不是错误。这是一种安全。

在 JDK-8041435 之前

如果你有一台带有 EXT 和 INT 接口的服务器,并且启动地址为 5900 的 Java 进程,它会绑定到这两个接口,并允许全世界的任何人连接到你的 Java 进程,除非你在防火墙上阻止它。

在 JDK-8041435 套接字传输之后尝试猜测本地主机并仅绑定到本地主机。也就是说,默认情况下套接字传输仅在客户端和服务器位于同一台机器上时才有效。猜测正确的本地主机不是一件容易的事。因此,由于网络设置,在某些情况下,同一台机器的配置可能无法正常工作。

您可以使用 *(星号)恢复旧的、不安全的行为,即 -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5900 应该像 JDK-8041435 之前一样工作

但建议在可能的情况下显式指定要绑定的 ip 地址。

JDWP 套接字连接器默认只接受本地连接

JDWP 套接字连接器已更改为仅在代理命令行上未指定 IP 地址或主机名时才绑定到本地主机。星号 (*) 的主机名可用于实现将 JDWP 套接字连接器绑定到所有可用接口的旧行为;这是不安全的,不推荐。

原文由 brass monkey 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题