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


254

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

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

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

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




전혀 중복되지 않습니다. 첫째, 이것은 오래된 질문입니다. 둘째,이 질문에 대한 답은 디버깅 환경에 무관심해야합니다.
애디슨

답변:


476

편집 : 일부 사람들이 여기에서 호출을 잘라 붙여 넣는 것으로 나타났습니다. 원래 답변은 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. 수업 이름 앞에 옵션이옵니다. 클래스 이름 뒤에 오는 모든 인수는 프로그램에 대한 인수입니다!


2
@DJGummikuh 니스! -agentlib잘라 내기 및 붙여 넣기의 즐거움을 위해 최신 스타일 옵션 을 사용하도록 게시물을 업데이트했습니다 . :-)
Chris Jester-Young

원격 디버깅을 수행하는 컴퓨터에 항상 원격 앱의 소스 코드가 있어야합니까?
MasterJoe2

소스 코드 를 알아야 합니다. .java 파일이 있거나 디 컴파일러와 결합 된 .jar / .class 파일이 있습니다. Eclipse와 같은 IDE에는 JDecompiler와 같은 디 컴파일러가 설치되어있어 .class 파일을 .java 파일 인 것처럼 (주석 제외) 디버그 할 수 있습니다.
Iwan Satria

1
stackoverflow.com/a/138518/500902 의 의견을 반복 할 가치가 있습니다 . "Java 9"address = 1044 "가 모든 인터페이스에서 항상 수신되는 것은 아닙니다."address = * : 1044 "는 Java 9+가 Java 8처럼 동작하도록합니다. 다른 호스트에서 디버깅 허용
Marvin

84

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)를 대체합니다.


다음은 Eclipse의 기본 설정에서 작동합니다. -agentlib : jdwp = transport = dt_socket, server = y, address = 8000
Sundae

29

단계 :

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

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



8

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

저에게 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명령 은하지 않습니다 .


3
나는 두 번째 예에서, 모든 "app.jar"후 main 메소드에 인자로 전달되기 때문에 즉 거라 생각
XOX 제우스 XOX

트윗 담아 가기 예, 인수로 전달되었습니다. 언급 해 주셔서 감사합니다.
MrBlack

1

다음은 원격 디버깅을 위해 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 클래스에서 중단 점 을 설정해야합니다 .


Java 8에서 JDK는 JAVA_TOOL_OPTIONS 환경 변수를 지원 하므로 사용해야하는 모든 Java 응용 프로그램에 대해 디버거를 활성화 할 수 있습니다 JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n .
Nathan Niesen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.