JVM을 원격으로 디버깅 할 수 있도록 설정하는 Java 명령 행 옵션은 무엇입니까?


321

JAVA_OPTSJava 프로그램을 원격으로 디버깅하도록 설정해야한다는 것을 알고 있습니다 .

그들은 무엇이며 무엇을 의미합니까?

답변:


303

내가 가진 이 기사 아래에 자바 5에 대한이 최대 설정에 북마크를.

기본적으로 다음을 실행하십시오 .

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

를 들어 위의 자바 5와 그것을 실행 :

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

19
언급 할만한 가치 *:1044는 어떤 컴퓨터에서든 원격 디버깅을 가능하게하는 것처럼 주소를 구성 할 수 있다는 것입니다.
Herr Derb

6
HerrDerb가 맞습니다. Java 9 "address = 1044"가 모든 인터페이스에서 항상 수신 대기하는 것은 아닙니다. "address = * : 1044"는 Java 9+가 Java 8처럼 동작하도록합니다.
alfonx

459

Java 5.0 이전에는 -Xdebug-Xrunjdwp인수를 사용하십시오 . 이 옵션은 이후 버전에서 계속 작동하지만 JIT 대신 해석 모드로 실행되므로 속도가 느려집니다.

Java 5.0부터는 -agentlib:jdwp단일 옵션 을 사용하는 것이 좋습니다 .

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

옵션 -Xrunjdwp또는 agentlib:jdwp인수는 다음과 같습니다.

  • transport=dt_socket : JVM에 연결하는 데 사용되는 방법을 의미합니다 (소켓을 선택하는 것이 좋습니다. 원격 컴퓨터를 디버깅하는 데 사용할 수 있음).
  • address=8000 : TCP / IP 포트가 노출되어 디버거에서 연결
  • suspend=y : 'y'인 경우 실행을 시작하기 위해 디버거가 연결될 때까지 기다리도록 JVM에 지시하고 그렇지 않으면 ( 'n'인 경우) 즉시 실행을 시작하십시오.

7
정확하게 맞습니다. -Xdebug-Xrunjdwp로 시도했지만 작동하지 않았습니다. -Xrunjdwp 또는 agentlib : jdwp로 시도했을 때 작동합니다. (Java 7)
RoboAlex

따옴표 : 주위에 따옴표를 넣을 때만 나를 위해 일했습니다. 오류 : JDWP 비 서버 전송 dt_socket server = y suspend = y address = 8000 'address ='옵션을 통해 지정된 연결 주소가 있어야합니다
Ring

1
인가 Xrunjdwp되지 않는 (또는 제거?) 왜 우리가 선택할 것 agentlib:jdwp위에?
ArtOfWarfare

2
당신이 틀렸다고 생각합니다. Netbeans는 -Xdebug -XrunjdwpMaven 프로젝트를 디버깅 할 때 사용하며 JIT처럼 실행됩니다.
Aleksandr Dubinsky

78

Java 9.0부터 JDWP는 기본적으로 로컬 연결 만 지원합니다. http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

원격 디버깅을 위해서는 *:in 주소로 프로그램을 실행해야합니다 .

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

1
모든 새로운 Java 버전에 적용되는 중요한 힌트이므로 더 많은 투표를해야합니다.
Sebastian S

1
참고 사항 : 오라클 링크에 따르면 이전과 동일한 동작을 수행하지만 안전하지 않으며 권장하지 않습니다.
Chanseok Oh

9

Java 1.5 이상인 경우 :

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Java 1.4의 경우 :

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Java 1.3의 경우 :

java -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

다음은 간단한 프로그램의 출력입니다.

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled

5

자바

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8001,suspend=y -jar target/cxf-boot-simple-0.0.1-SNAPSHOT.jar

address 디버그 할 수있는 포트를 지정합니다

메이븐

** Maven을 사용한 디버그 스프링 부트 앱 :

mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"

2

가장 쉬운 해결책은 다음과 같습니다.

Maven을 사용하는 경우 많은 환경 특수 구성이 필요합니다. 따라서 maven에서 프로그램을 시작하는 경우 mvnDebug대신 대신 명령을 실행하면 mvn원격 디버깅이 구성된 상태에서 앱을 시작합니다. 이제 포트 8000에서 디버거를 연결할 수 있습니다.

모든 환경 문제를 처리합니다.


1

커맨드 라인

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

그래들

gradle bootrun --debug-jvm

메이븐

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

여기서는 dt_socket 전송이 구성되고 VM이 서버 디버깅 모드에서 실행될 때 기본적으로 활성화되는 소켓 연결 커넥터를 사용합니다.

자세한 내용은 https://stackify.com/java-remote-debugging/을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.