Intellij Idea 如何在vagrant VM上远程调试java应用程序?

dsf9zpds  于 2023-08-03  发布在  Java
关注(0)|答案(1)|浏览(225)

我正在运行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从主机连接到远程进程。

  1. This question是类似的,但它是我想要的相反。我在主机上运行调试器,在客户机上运行Java应用程序。
    有没有想过我可能错过了什么?
w80xi6nr

w80xi6nr1#

如果您使用的是Java 9+版本,以下命令将在localhost接口上绑定调试器服务器:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
Vagrant端口转发可能期望外部接口正常工作。
由于您无法更改Java调试器选项(使用address=*:5005),因此解决方法是使用socat将端口从外部接口转发到VM内的localhost,如下所示:

socat tcp-listen:5006,reuseaddr,fork tcp:localhost:5005

字符串
现在你可以在Vagrant中将端口5005转发到5006,它应该可以工作。

相关问题