无法通过 IntelliJ 打开调试器端口

Unable to open debugger port through IntelliJ

我在 DigitalOcean 上有一个服务器 运行 和一个我想要调试的 JAR 文件。我首先使用

在远程服务器上启动 JAR
java -jar Server.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

但在控制台上我看不到像 "listening on port 5005...".

这样的输出

当我在 IntelliJ 中按下调试时,它显示

unable to open debugger port (198.xxx.xxx.xx:5005): java.net.ConnectException "Connection refused"

这是我的 IntelliJ 配置:

我也试过 -Xdebug 但还是不行。

如果我设置 suspend=y 它应该等到连接调试器,但相反,它启动时没有问题。

在调试模式下启动远程 Java 进程的命令看起来是正确的。如果您在启动服务器 JAR 时没有看到 "Listening to Port blah",那么这可能意味着调试参数没有被拾取。另一种快速检查的方法是在执行服务器 JAR 的机器上使用 telnet localhost 5005 进行测试。如果该端口未被使用,telnet 将失败。

我建议您尝试以下方法,因为参数的顺序可能很重要(我稍后会为此添加一些官方证据):

java "agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" -jar Server.jar

这个命令对我有用:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar Server.jar 

在我的例子中,这是因为在设置 -> 构建、执行、部署 -> 调试器下,我有一个内置服务器 运行 在我试图将我的调试器附加到的相同端口上原因。

这个命令对我有用:

export JAVA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005'

默认idea远程对话框提示:

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

改为:

'agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005'

并发布端口 5005。

感谢 suifengpiao14 但我会更详细地描述问题。

我检查了很多东西,最后找到了原因:实际上,就像 restful 服务一样,我们希望可以从服务器外访问我们 运行 我们应该将 0.0.0.0 设置为名称服务器,这里我们应该做一个类似的。 我检查了我可以远程调试的服务器和我不能远程调试的服务器之间的区别。使用 netstat 命令:

对于我满意的服务器:

tcp        0      0 0.0.0.0:5005            0.0.0.0:*               LISTEN      8323/java

我遇到问题的服务器:

tcp        0      0 127.0.0.1:5005            0.0.0.0:*               LISTEN      8323/java

因此,使用以下 jvm 选项应该会有所帮助:

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

对于像我这样有时忘记阅读的人...

Copy and paste the arguments to the command line when JVM is started
说的是IntelliJ中的Run/Debug配置,直接在:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

表示: 复制此行并转到您的 docker 配置。添加环境变量(修改选项下拉列表)。将其粘贴到 JAVA_OPTS= 前面。

现在当你每一项都做对了,你会得到
Listening for transport dt_socket at address: 5005

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

这就是我解决的问题...

我重现了类似的问题:

Unable to open debugger port (localhost:5005): java.net.ConnectException "Connection refused (Connection refused)" 

我在 运行 调试器中使用 Run/Debug 配置远程 JVM 的命令行参数:

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

通过 attaching IDE 使用公开的调试代理服务器。

因为我使用了 Kubernetes 集群,原因 是:

once the pod has been created and was running as expected,我需要继续使用 kubectl port-forward 命令设置端口转发,在 [=52= 之前将端口公开给来自应用程序 的流量]调试器.

基于kubectl port-forward syntax:

kubectl port-forward <resource-type/resource-name> [local_port]:<pod_port>

format喜欢:

kubectl port-forward <pod-name> -n <namespace> 5005:5005

或更短的形式:

kubectl port-forward <pod-name> 5005:5005

The client listens on port 5000 locally and forwards to 5000 in the pod.

因此,为 Kubernetes 集群配置了 entrypoint.sh 服务文件和以下命令:

java -Djava.security.egd.=file:/dev/./urandom -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -Xmx400m -jar /service.jar

结果,运行 port-forward 在调试器解决问题之前。