Quais são as opções da linha de comandos Java a serem configuradas para permitir que a JVM seja depurada remotamente?

321

Eu sei que há alguns JAVA_OPTSpara definir para depurar remotamente um programa Java.

O que são e o que significam?

paulgreg
fonte

Respostas:

303

Eu tenho este artigo marcado como configuração para Java 5 e abaixo.

Basicamente, execute-o com :

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

Para Java 5 e superior , execute-o com:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044
Hans Sjunnesson
fonte
19
Vale a pena mencionar é que você pode querer configurar o seu endereço como *:1044para permitir a depuração remota de qualquer computador
Herr Derb
6
HerrDerb está certo. Como o Java 9 "address = 1044" nem sempre está escutando em todas as interfaces. "address = *: 1044" faz Java 9+ se comportam como Java 8 ...
alfonx
459

Antes do Java 5.0, uso -Xdebuge -Xrunjdwpargumentos. Essas opções ainda funcionarão em versões posteriores, mas serão executadas no modo interpretado em vez do JIT, que será mais lento.

No Java 5.0, é melhor usar a -agentlib:jdwpopção única:

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

As opções -Xrunjdwpou agentlib:jdwpargumentos são:

  • transport=dt_socket : significa a maneira usada para conectar-se à JVM (o soquete é uma boa escolha, pode ser usado para depurar um computador distante)
  • address=8000 : Porta TCP / IP exposta, para conectar-se a partir do depurador,
  • suspend=y : se 'y', diga à JVM para aguardar até que o depurador seja anexado para iniciar a execução; caso contrário (se 'n'), inicia a execução imediatamente.
paulgreg
fonte
7
Você está exatamente correto. Tentei com -Xdebug e -Xrunjdwp, mas não funcionou. quando tentei com -Xrunjdwp ou agentlib: jdwp Está funcionando. (em Java 7)
RoboAlex
Isso só funcionou para mim quando coloquei aspas, caso contrário, recebi este erro: ERRO: JDWP Transporte não servidor dt_socket server = y suspend = y address = 8000 deve ter um endereço de conexão especificado através da opção 'address ='
Ring
1
É Xrunjdwpobsoleto (ou removido?) Por que nós escolhemos agentlib:jdwpsobre ele?
ArtOfWarfare
2
Eu acho que você está errado. O Netbeans usa -Xdebug -Xrunjdwpao depurar projetos do Maven e eles são executados como se fossem um JIT.
Aleksandr Dubinsky
78

Como o Java 9.0 JDWP suporta apenas conexões locais por padrão. http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

Para depuração remota, deve-se executar o programa com o *:endereço:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000
Antony Shumskikh
fonte
1
Isso deve receber mais votos, pois é uma dica importante que se aplica a todas as novas versões do Java.
Sebastian S
1
Apenas tome nota: o link Oracle diz que isso atingirá o mesmo comportamento antigo, mas não é seguro e não é recomendado.
Chanseok Oh 7/03/19
9

Para java 1.5 ou superior:

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

Para java 1.4:

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

Para java 1.3:

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

Aqui está a saída de um programa simples:

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

Java

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

address especifica a porta na qual permitirá depurar

Maven

** Depure o aplicativo Spring Boot com o Maven:

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

Aqui está a solução mais fácil.

Existem muitas configurações especiais de ambiente necessárias se você estiver usando o Maven. Portanto, se você iniciar o programa a partir do maven, basta executar omvnDebug comando em vez de mvn, ele cuidará de iniciar o aplicativo com a depuração remota configurada. Agora você pode simplesmente conectar um depurador na porta 8000.

Ele cuidará de todos os problemas ambientais para você.

Neves
fonte
1

Linha de comando

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

Gradle

gradle bootrun --debug-jvm

Maven

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
Santosh b
fonte
1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

Aqui, apenas usamos um conector de conexão de soquete, que é ativado por padrão quando o transporte dt_socket está configurado e a VM está sendo executada no modo de depuração do servidor.

Para obter mais detalhes, você pode consultar: https://stackify.com/java-remote-debugging/

Boney
fonte