从 Windows 机器在 Linux 上调试远程 WildFly

问题描述

更新

我在 Linux (RedHat 7.9) 服务器上调试远程 WildFly 应用程序时遇到问题。我的 IDE Intellij Idea 2020.1 在 Windows 10 下运行。

在 Linux 服务器上:

openjdk 版本“1.8.0_282”
OpenJDK 运行时环境(构建 1.8.0_282-b08)
OpenJDK 64 位服务器 VM(构建 25.282-b08,混合模式)

在 Windows 客户端机器上:

openjdk 版本“1.8.0_282”
OpenJDK 运行时环境 (AdoptOpenJDK)(build 1.8.0_282-b08)
OpenJDK 64 位服务器虚拟机(采用 OpenJDK)(构建 25.282-b08,混合模式)

我使用 --debug 选项启动 WildFly。它强制 jvm 使用以下选项启动 WF:

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

然后我看到调试端口 8787 没问题并监听:

netstat -ln | grep 87
tcp 0 0 0.0.0.0:8787 0.0.0.0:* 听

我可以使用 jdb其他 Linux 服务器连接到这台机器,一切正常:

jdb -attach 10.20.20.40:8787
正在初始化 jdb ...

但是当我尝试从带有 Idea 的 Windows 工作站连接到调试端口时 - 连接失败。 在服务器上使用 netstat 我看到调试端口正在侦听我的客户端机器。所以尝试从 Win 连接到 Linux 调试端口会导致客户端连接失败。但在服务器端端口保持连接。我必须重新启动 WildFly 才能再次打开调试端口。

当我尝试使用 Windows 机器上的 jdb 连接时,也会发生同样的事情。

这里共享内存传输根本不起作用。

jdb -attach 10.20.20.40:8787
java.io.IOException: shmemBase_attach Failed: 系统找不到指定的文件 在 com.sun.tools.jdi.SharedMemoryTransportService.attach0(本机方法) 在 com.sun.tools.jdi.SharedMemoryTransportService.attach(SharedMemoryTransportService.java:108) 在 com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116) 在 com.sun.tools.jdi.SharedMemoryAttachingConnector.attach(SharedMemoryAttachingConnector.java:63) 在 com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519) 在 com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328) 在 com.sun.tools.example.debug.tty.Env.init(Env.java:63) 在 com.sun.tools.example.debug.tty.TTY.main(TTY.java:1083)
致命错误: 无法附加到目标 VM。

所以我们应该尝试使用套接字。

jdb -connect com.sun.jdi.socketAttach:hostname=10.20.20.40,port=8787

现在一切看起来都不错。

Linux 服务器上的 Netstat 显示 ESTABILISHED 状态:

sudo netstat -nlp -a | grep 8787
tcp 0 644 10.20.20.40:8787 10.20.30.51:5344 已建立 15480/java

同时在 win 客户端上,我看到连接已建立:

netstat -a | findstr 5344
TCP 10.20.30.51:5344 10.20.20.40:8787 已建立

等待几秒钟,然后:

内部异常: com.sun.jdi.VMdisconnectedException 在 com.sun.tools.jdi.TargetVM.waitForReply(TargetVM.java:307) 在 com.sun.tools.jdi.VirtualMachineImpl.waitForTargetReply(VirtualMachineImpl.java:1030) 在 com.sun.tools.jdi.PacketStream.waitForReply(PacketStream.java:69) 在 com.sun.tools.jdi.JDWP$EventRequest$Set.waitForReply(JDWP.java:6910) 在 com.sun.tools.jdi.JDWP$EventRequest$Set.process(JDWP.java:6875) 在 com.sun.tools.jdi.EventRequestManagerImpl$EventRequestImpl.set(EventRequestManagerImpl.java:201) 在 com.sun.tools.jdi.EventRequestManagerImpl$EventRequestImpl.setEnabled(EventRequestManagerImpl.java:166) 在 com.sun.tools.jdi.EventRequestManagerImpl$EventRequestImpl.enable(EventRequestManagerImpl.java:151) 在 com.sun.tools.example.debug.tty.EventRequestSpec.resolveEagerly(EventRequestSpec.java:139) 在 com.sun.tools.example.debug.tty.EventRequestSpecList.addEagerlyResolve(EventRequestSpecList.java:98) 在 com.sun.tools.example.debug.tty.Commands.resolveNow(Commands.java:1125) 在 com.sun.tools.example.debug.tty.Commands.commandCatchException(Commands.java:810) 在 com.sun.tools.example.debug.tty.VMConnection.setEventRequests(VMConnection.java:427) 在 com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:337) 在 com.sun.tools.example.debug.tty.Env.init(Env.java:63) 在 com.sun.tools.example.debug.tty.TTY.main(TTY.java:1083)

服务器端口状态保持建立,直到服务重启:

sudo netstat -nlp -a | grep 8787
tcp 0 644 10.20.20.40:8787 10.20.30.51:5344 已建立 15480/java

但是客户端断开了

netstat -a | findstr 5344

那么是否可以使用 Windows IDE 在 Linux 上调试 wildfly 或 java?
为什么客户端调试会话可以在连接尝试后关闭
jdb 套接字是否有一些超时设置?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...