问题描述
更新
我在 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 (将#修改为@)