我需要將jdb調試會話附加到正在遠程主機中執行的Java應用程序,但我無法執行此操作。我正在開發linux,使用openjdk 1.8.0_65,64位服務器虛擬機。嘗試附加到使用jdb的進程時出現問題
我已經試過
爲了使端口監聽,我已經運行Java應用程序中添加以下參數的命令行:
-Xdebug -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:8000,server=y,suspend=n
顯示在控制檯下面的消息:
Listening for transport dt_socket at address: 8000
然後應用程序開始正常運行。
然後,從遠程主機,我執行以下命令:
> jdb -connect com.sun.jdi.SocketAttach:hostname=<remote_host>,port=8000
失敗,輸出爲:
java.net.ConnectException: Conexión rehusada
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
[...]
Fatal error:
Unable to attach to target VM.
我已經檢查
爲了檢查該端口實際上是開放的,我可以從遠程主機連接到它,我已經執行了以下操作:
讓我們調用執行java應用程序的主機。 hostA
,和一個從我婉附上jdb
hostB
,則:
檢查,實際上是有在hostA的
> netstat -tualpn | grep :8000
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 1399/<app_name>
在hostA上的監聽端口8000的插座,檢查我可以連接到端口8000(換句話說,試圖從本地主機連接)
> nc -vz localhost 8000
nc: connect to localhost port 8000 (tcp) failed: Connection refused
Connection to localhost 8000 port [tcp/irdmi] succeeded!
隨着telnet
,它似乎可以連接,但連接一旦建立就關閉,可能是因爲JVM正在等待某種請求?
> telnet localhost 8000
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
java app。顯示在telnet連接被關閉了以下消息:
Debugger failed to attach: timeout during handshak
,hostB上,確認我可以連接到玉簪,端口8000
> nc -vz hostA 8000
nc: connect to hostA port 8000 (tcp) failed: Connection refused
通過telnet:
> telnet hostA 8000
Trying 172.17.10.127...
telnet: connect to address 172.17.10.127: Connection refused
所以,我無法通過端口8000從hostA
連接到hostB
,儘管JVM正在偵聽8000端口,01端口。
由於上述失敗,我已檢查防火牆是否導致連接被拒絕。
在hostA
:
# First kill the java app (otherwise the port is busy), then:
> nc -l 8000
在hostB
:
> nc -vz <hostA> 8000
Connection to hostA 8000 port [tcp/irdmi] succeeded!
據我明白,上述意味着沒有防火牆(I已經通過使用NC命令來完成它或等同)阻塞端口。
編輯
當然,我試圖做jdb -attach
但即使失敗做它hostA
。
您是否嘗試連接到它來自同一臺計算機? –
是的,這是步驟「在主機A中,檢查我可以連接到端口8000」 – Dan
我明白了。我不太熟悉nc命令;在hostA中,'nc -vz localhost 8000'如何失敗,然後成功? –