更新
我在 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套接字是否有一些超时设置?