我正在运行IntelliJ IDEA 2023.1.2(Community Edition),在远程调试运行在vagrant VM上的Java应用程序时遇到了问题。我认为这是某种网络问题。我的vagrant VM运行的是Ubuntu 20.04。
问题是,当我运行远程调试器时,我在Intellij中看到以下错误
Unable to open debugger port (localhost:5005): java.net.SocketException "Connection reset"
字符串
其中一个连接失败后,流浪虚拟机上的系统日志显示以下内容
Aug 01 19:14:43 ubuntu2004.localdomain sshd[2095]: debug3: channel 0: waiting for connection
Aug 01 19:14:43 ubuntu2004.localdomain sshd[2095]: debug1: channel 0: connection failed: Connection refused
Aug 01 19:14:43 ubuntu2004.localdomain sshd[2095]: error: connect_to 192.168.121.118 port 5005: failed.
型
当我尝试连接jdb
时,我看到以下错误
$> jdb -attach localhost:5005
java.io.IOException: handshake failed - connection prematurally closed
at jdk.jdi/com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:142)
at jdk.jdi/com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:255)
at jdk.jdi/com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:119)
at jdk.jdi/com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:83)
at jdk.jdi/com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519)
at jdk.jdi/com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328)
at jdk.jdi/com.sun.tools.example.debug.tty.Env.init(Env.java:63)
at jdk.jdi/com.sun.tools.example.debug.tty.TTY.main(TTY.java:1095)
Fatal error:
Unable to attach to target VM.
型
以下是一些补充意见:
1.在VM上运行的Java应用程序启用了调试(即,它在进程中包含java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
)。我意识到新版本的java建议使用address=*:5005
,但由于各种原因,我无法更改该进程的Java选项。
1.我已经验证了进程确实在VM上的端口5005上侦听。netstat
显示进程正在侦听5005。
1.我已经将端口转发到主机的端口5005,并且可以在主机上看到端口转发已启用。
1.我可以通过nc localhost 5005
从主机连接到远程进程。
- This question是类似的,但它是我想要的相反。我在主机上运行调试器,在客户机上运行Java应用程序。
有没有想过我可能错过了什么?
1条答案
按热度按时间w80xi6nr1#
如果您使用的是Java 9+版本,以下命令将在
localhost
接口上绑定调试器服务器:java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
个Vagrant端口转发可能期望外部接口正常工作。
由于您无法更改Java调试器选项(使用
address=*:5005
),因此解决方法是使用socat
将端口从外部接口转发到VM内的localhost,如下所示:字符串
现在你可以在Vagrant中将端口5005转发到5006,它应该可以工作。