所以我打算在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"
知道如何解决这个问题吗?
答案 0 :(得分:34)
尝试访问Docker容器上的调试端口时遇到了该错误。
如果您尝试访问Docker容器内的调试端口,请确保将端口指定为*:5005
例如
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
这是自Java 9以来的变化。
请参阅:REGRESSION: Remote debugging does not work on JDK 9
这不是错误。这是一种安全。
在JDK-8041435之前
如果您有一台具有EXT和INT接口的服务器,并使用address = 5900启动Java进程,则它将绑定到这两个接口,并允许全世界的任何人连接到Java进程,除非您在防火墙上将其阻止。
在JDK-8041435套接字传输之后,尝试猜测localhost并仅绑定到localhost。即默认情况下,套接字传输仅在客户端和服务器都位于同一台计算机上时才起作用。猜测适当的本地主机并非易事。因此在某些情况下,由于网络设置,同一台机器可能无法正常工作。
您可以使用*(星号)恢复旧的,不安全的行为 即 -agentlib:jdwp = transport = dt_socket,server = y,suspend = y,address = *:5900 应该与JDK-8041435之前的版本完全一样
但是,建议尽可能明确指定要绑定的IP地址。
还有JDWP socket connector accept only local connections by default
仅当在代理命令行上未指定IP地址或主机名时,JDWP套接字连接器已更改为绑定到localhost。主机名星号(*)可用于实现将JDWP套接字连接器绑定到所有可用接口的旧行为。这是不安全的,不建议这样做。
答案 1 :(得分:12)
应该是这样的,
java "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8983" -jar start.jar
现在正在使用
答案 2 :(得分:2)
您忘记在-Xdebug
命令行上指定java
。
编辑:在
中java -jar start.jar -Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8983
答案 3 :(得分:0)
答案 4 :(得分:0)
它对我有帮助,至少在 Intellij IDEA 中是这样:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=0.0.0.0:5005
尝试添加 ip 0.0.0.0
。