握手失败 - 在 Intellij 中调试 Solr 时连接预先关闭错误

2022-08-31 15:25:20

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

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"

任何想法如何解决这个问题?


答案 1

当我尝试访问Docker容器上的调试端口时,我遇到了这个错误。

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

例如:

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

自Java 9以来,情况发生了变化。

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

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

在 JDK-8041435 之前

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

在 JDK-8041435 套接字传输之后,请尝试猜测本地主机并仅绑定到本地主机。即,默认情况下,仅当客户端和服务器都位于同一台计算机上时,套接字传输才有效。猜测正确的本地主机并非易事。因此,由于网络设置,同一台计算机的配置在某些情况下可能不起作用。

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

但建议尽可能显式指定要绑定的 IP 地址。

默认情况下,JDWP 套接字连接器仅接受本地连接

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


答案 2

它应该是这样的东西,

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

它现在正在工作