2

更新

我在 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-Bit Server VM (AdoptOpenJDK)(build 25.282-b08, 混合模式)

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

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

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

网络统计-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: The system cannot find the file specified at com.sun.tools.jdi.SharedMemoryTransportService.attach0(Native Method) at 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。 com.sun.tools.example.debug.tty.TTY.main(TTY.java:1083) 处的 example.debug.tty.Env.init(Env.java:63)
致命错误:无法附加到目标 VM。

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

jdb -connect com.sun.jdi.SocketAttach:主机名=10.20.20.40,端口=8787

现在一切看起来都很好。

linux 服务器上的 netstat 显示已建立状态:

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

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

网络统计-a | findstr 5344
TCP 10.20.30.51:5344 10.20.20.40:8787 已建立

等待几秒钟,然后:

内部异常:com.sun.tools.jdi.TargetVM.waitForReply(TargetVM.java:307) 上 com.sun.tools.jdi.VirtualMachineImpl.waitForTargetReply(VirtualMachineImpl.java:1030) 上的 com.sun.jdi.VMDisconnectedException .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) at com.sun.tools.example.debug.tty.Commands.resolveNow(Commands.java:1125) at 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)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)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

但客户端已断开连接

网络统计-a | 发现str 5344

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

4

0 回答 0