2017-03-13 4 views
1

원격 호스트에서 실행중인 Java 응용 프로그램에 jdb 디버그 세션을 연결해야하지만 수행 할 수 없습니다. Openjdk 1.8.0_65, 64 비트 서버 VM을 사용하여 Linux에서 작업하고 있습니다.jdb를 사용하여 프로세스에 연결하려고 할 때의 문제점

-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 

출력은 :

그런 다음, 원격 호스트로부터, I는 다음의 명령을 실행

I를 확인하기 위해서

체크 것을
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를 연결 완있는 사람 :

실제로 호스트 A에서

> netstat -tualpn | grep :8000 
tcp  0  0 127.0.0.1:8000   0.0.0.0:*    LISTEN  1399/<app_name> 

호스트 A에서 포트 8000에서 수신 대기 소켓이 있음을

확인, 그 I를 확인 포트 8000에 연결할 수 있습니다 0,123,971,685,646으로

> nc -vz localhost 8000 
nc: connect to localhost port 8000 (tcp) failed: Connection refused 
Connection to localhost 8000 port [tcp/irdmi] succeeded! 

을 (즉, 로컬 호스트에서 연결을 시도), 그것은 연결할 수있는 것 같지만 연결이 JVM이 일종의 요청을 기대하고 있기 때문에 아마 stablished되는 즉시 닫힙니다?

> 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. 

자바 응용 프로그램입니다. hostB의에서

Debugger failed to attach: timeout during handshak 

, 내가 호스트 A에 연결할 수 있는지 확인 텔넷으로 8000

> nc -vz hostA 8000 
nc: connect to hostA port 8000 (tcp) failed: Connection refused 

포트 : 그래서

> 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! 

는 지금까지 내가 이해, 위에서 방화벽이없는 것을 의미한다 (필자는 노스 캐롤라이나 명령을 사용하여 수행 한 또는 이와 동등한) 포트를 차단합니다. 물론

편집

, 나는 jdb -attach 할 시도했지만 그것도 hostA에서 그 일을 실패합니다.

+0

당신이 연결 시도 되세요 같은 컴퓨터에서 가져 왔어? –

+0

예, "hostA에서 8000 포트에 연결할 수 있는지 확인하십시오"라고 표시됩니다. – Dan

+0

입니다. 나는 nc 명령에 익숙하지 않다. hostA에서'nc -vz localhost 8000'이 어떻게 실패하고 성공할 수 있습니까? –

답변

0

연결 문제를 발견했습니다.

하기 전에 : 나는 자바 응용 프로그램을 실행하는 데 사용하는 명령에서, 나는 다음과 같은 주소 매개 변수를 변경 한

-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, 일시 중지 = n

??

[편집] 당신은 이미 이것을 고려하고있을 것입니다. 또한 127.0.0.1에서 듣고 있다면 원격 컴퓨터에서 연결하지 않을 수도 있습니다. 의심의 여지 당신이 실제 주소를 사용하고 여기에 그것을 포함하지 않았다 ...

+0

예, 사실 ** 서버 **를 사용하고 있습니다. 잘못 복사했습니다. 사과. – Dan