2017-03-13 85 views
1

我需要將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,和一個從我婉附上jdbhostB,則:

檢查,實際上是有在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

+0

您是否嘗試連接到它來自同一臺計算機? –

+0

是的,這是步驟「在主機A中,檢查我可以連接到端口8000」 – Dan

+0

我明白了。我不太熟悉nc命令;在hostA中,'nc -vz localhost 8000'如何失敗,然後成功? –

回答

0

我發現了連接問題。在我用它來啓動Java應用程序的命令,我已經改變了地址參數如下:

前:

-Xdebug -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:8000,server=y,suspend=n 

後(見address):

-Xdebug -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n 
1

我沒有足夠的評論意見。所以我把這個作爲答案。它確實不是。但是:

-Xdebug -agentlib:JDWP = =運輸dt_socket,地址127.0.0.1 =:8000,SERV = Y,暫停= N

是不是它應該是:

-Xdebug -agentlib:jdwp = transport = dt_socket,address = 127.0.0.1:8000,serv er = y,suspend = n

??

[編輯]你可能已經考慮到了這一點 - 但是,如果你正在127.0.0.1上進行監聽,那麼你就不能從遠程計算機進行連接。毫無疑問,你正在使用一個實際的地址,只是沒有在這裏包括它...

+0

是的,其實我正在使用**服務器**,我已經複製它錯了。道歉。 – Dan

相關問題