[java] Java 애플리케이션 원격 디버깅

Linux 컴퓨터에서 Java 응용 프로그램을 실행 중입니다. 다음을 사용하여 Java 응용 프로그램을 실행합니다.

java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n

이 Linux 시스템에서 TCP 용 포트 4000을 열었습니다. Windows XP 컴퓨터에서 이클립스를 사용 하고이 응용 프로그램에 연결하려고합니다. 창에서도 포트를 열었습니다.

두 컴퓨터가 모두 LAN에 있지만 디버거를 Java 응용 프로그램에 연결할 수 없습니다. 내가 뭘 잘못하고 있죠?



답변

편집 : 일부 사람들이 여기에서 호출을 잘라 붙여 넣는 것으로 나타났습니다. 원래 답변은 OP에만 해당됩니다. 보다 현대적인 호출 스타일이 있습니다 (보다 일반적인 포트 8000 사용 포함).

java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>

원래 답변은 다음과 같습니다.


이 시도:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp

여기 두 가지 점이 있습니다.

  1. runjdwp옵션에 공백이 없습니다 .
  2. 수업 이름 앞에 옵션이옵니다. 클래스 이름 뒤에 오는 모든 인수는 프로그램에 대한 인수입니다!

답변

JDK 1.3 이하의 경우 :

-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

JDK 1.4의 경우

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

최신 JDK의 경우 :

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006

필요에 따라 포트 번호를 변경하십시오.

에서 자바 기술 정보

5.0부터 -agentlib : jdwp 옵션은 JDWP 에이전트에 옵션을로드하고 지정하는 데 사용됩니다. 5.0 이전 릴리스의 경우 -Xdebug 및 -Xrunjdwp 옵션이 사용됩니다 (5.0 구현은 -Xdebug 및 -Xrunjdwp 옵션도 지원하지만 5.0의 JDWP 에이전트가 JVM TI 인터페이스를 사용하므로 최신 -agentlib : jdwp 옵션이 선호 됨) 이전 JVMDI 인터페이스가 아닌 VM)

JVM 도구 인터페이스 설명서 에서 한 가지 더 참고할 사항은 다음과 같습니다.

JVM TI는 JDK 5.0에서 도입되었습니다. JVM TI는 JDPI 6에서 더 이상 제공되지 않는 JVMPI (Java Virtual Machine Profiler Interface) 및 JVMDI (Java Virtual Machine Debug Interface)를 대체합니다.


답변

단계 :

  1. 위의 게시물에서 설명한 것처럼 디버깅 옵션으로 원격 Java 응용 프로그램을 시작하십시오.
  2. 호스트 및 포트를 지정하여 원격 디버깅을 위해 Eclipse를 구성하십시오.
  3. Eclipse에서 원격 디버깅을 시작하고 연결이 완료 될 때까지 기다리십시오.
  4. 중단 점 및 디버그 설정
  5. 애플리케이션 시작에서 suspend = y를 디버그하려면 Eclipse에서 연결할 때까지 원격 애플리케이션을 일시 중단 상태로 유지합니다.

자세한 내용 은 Java 원격 디버깅에 대한 단계별 안내서를 참조하십시오.


답변

Java> = 9에 대한 답변 :

Java 9+의 경우, JVM 옵션은 주소를 JVM을 호스팅하는 시스템의 IP 주소로 접두어를 추가하거나 약간만 변경하면됩니다 *.

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

이것은 https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435에 명시된 변경 사항 때문 입니다.

Java <9의 경우 포트 번호로 연결하기에 충분합니다.


답변

나는 논쟁의 순서가 중요하다는 것을 강조하고 싶다 .

저에게 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jar명령 은 디버거 포트를 엽니 다 .

그러나 java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000명령 은하지 않습니다 .


답변

다음은 원격 디버깅을 위해 Eclipse Debugger를 설정하는 방법입니다.

이클립스 설정 :

1. Run 버튼을 클릭하십시오
2. Debug Configurations를 선택하십시오
3.“Remote Java Application”을 선택하십시오
4. New Configuration

  • 이름 : GatewayPortalProject
  • 프로젝트 : GatewayPortal- 포틀릿
  • 연결 유형 : 소켓 부착
  • 연결 속성 : i) localhost ii) 8787

JBoss의 경우 :

1. /path/toJboss/jboss-eap-6.1/bin/standalone.confvm에서 다음과 같이 변경하십시오. #을 제거하여 다음 줄의 주석을 해제하십시오.

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"

Tomcat의 경우 :

에서 catalina.bat의 파일 :

1 단계:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

2 단계:

JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"

3 단계 : 다음과 같이 명령 프롬프트에서 Tomcat을 실행하십시오.

catalina.sh jpda start

그런 다음 디버깅하려는 Java 클래스에서 중단 점 을 설정해야합니다 .


답변