Depuração Remota de um Aplicativo Java

254

Eu tenho um aplicativo java em execução na máquina linux. Eu executo o aplicativo java usando o seguinte:

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

Abri a porta 4000 para TCP nesta máquina Linux. Eu uso o eclipse da máquina Windows XP e tento conectar-me a este aplicativo. Eu abri a porta no Windows também.

Ambas as máquinas estão na LAN, mas não consigo conectar o depurador ao aplicativo Java. O que estou fazendo de errado?

dzidzitop
fonte
Nem uma duplicata. Primeiro, essa é uma pergunta antiga. Segundo, a resposta a esta pergunta deve ser independente do ambiente de depuração.
Addison

Respostas:

476

Edit: notei que algumas pessoas estão cortando e colando a invocação aqui. A resposta que dei originalmente era relevante apenas para o OP. Aqui está um estilo de chamada mais moderno (incluindo o uso da porta mais convencional do 8000):

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

A resposta original segue.


Tente o seguinte:

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

Dois pontos aqui:

  1. Não há espaços na runjdwpopção.
  2. As opções vêm antes do nome da classe. Quaisquer argumentos que você tem após o nome da classe são argumentos para o seu programa!
Chris Jester-Young
fonte
2
@DJGummikuh Nice! Atualizei a postagem para usar a -agentlibopção de estilo mais recente para o seu prazer de cortar e colar. :-)
Chris Jester-Young
Sempre precisamos que o código fonte do aplicativo remoto esteja presente na máquina em que fazemos a depuração remota?
MasterJoe2
Você precisa saber o código fonte. Você tem os arquivos .java ou os arquivos .jar / .class combinados com o descompilador. IDE como o Eclipse pode ter um descompilador, como o JDecompiler instalado, para que você possa depurar o arquivo .class como se fosse um arquivo .java (excluindo os comentários).
Iwan Satria
1
Vale a pena repetir um comentário deste stackoverflow.com/a/138518/500902 , "Como o endereço Java 9" = 1044 "nem sempre está escutando em todas as interfaces." Address = *: 1044 "faz com que o Java 9+ se comporte como o Java 8" para permitir depuração de host diferente
Marvin
84

Para o JDK 1.3 ou anterior:

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

Para JDK 1.4

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

Para o JDK mais recente:

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

Altere o número da porta com base nas suas necessidades.

De java technotes

A partir do 5.0, a opção -agentlib: jdwp é usada para carregar e especificar opções para o agente JDWP. Para liberações anteriores à 5.0, as opções -Xdebug e -Xrunjdwp são usadas (a implementação 5.0 também suporta as opções -Xdebug e -Xrunjdwp, mas a opção mais recente -agentlib: jdwp é preferível, pois o agente JDWP na versão 5.0 usa a interface JVM TI para a VM em vez da interface JVMDI mais antiga)

Mais uma coisa a ser observada, na documentação da interface da JVM Tool :

A JVM TI foi introduzida no JDK 5.0. A JVM TI substitui a JVMPI (Java Virtual Machine Profiler Interface) e a JVMDI (Java Virtual Machine Debug Interface) que, a partir do JDK 6, não são mais fornecidas.

Sairam Krish
fonte
O seguinte funciona com as configurações padrão do Eclipse: -agentlib: jdwp = transport = dt_socket, server = y, endereço = 8000
Sundae
29

Passos:

  1. Inicie seu aplicativo Java remoto com opções de depuração, como dito na postagem acima.
  2. Configure o Eclipse para depuração remota especificando host e porta.
  3. Inicie a depuração remota no Eclipse e aguarde o êxito da conexão.
  4. Configurar ponto de interrupção e depuração.
  5. Se você deseja depurar a partir do início do aplicativo, use suspend = y, isso manterá o aplicativo remoto suspenso até você se conectar a partir do eclipse.

Consulte o guia Passo a passo sobre depuração remota do Java para obter detalhes completos.

Gaurav
fonte
16

Resposta que abrange Java> = 9:

Para Java 9+, a opção JVM precisa de uma pequena alteração prefixando o endereço com o endereço IP da máquina que hospeda a JVM, ou apenas *:

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

Isso ocorre devido a uma alteração observada em https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 .

Para Java <9, o número da porta é suficiente para conectar.

M Anouti
fonte
8

Eu gostaria de enfatizar que a ordem dos argumentos é importante .

Para mim, o java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarcomando abre a porta do depurador ,

mas o java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000comando não .

Senhor preto
fonte
3
Eu acho que é porque no seu segundo exemplo, tudo depois de "app.jar" é passado como argumentos para o seu método principal
xoX Zeus Xox 13/11/19
@xoXZeusXox ha ha. Sim, passou como argumentos. Obrigado por mencionar.
perfil completo de Alex Black
1

É assim que você deve configurar o Eclipse Debugger para depuração remota:

Configurações do Eclipse:

1.Clique no botão Run
2.Selecione as configurações de depuração
3.Selecione “Remote Java Application”
4.New Configuration

  • Nome: GatewayPortalProject
  • Projeto: GatewayPortal-portlet
  • Tipo de conexão: Socket Attach
  • Propriedades da conexão: i) localhost ii) 8787

Para o JBoss:

1. Altere /path/toJboss/jboss-eap-6.1/bin/standalone.confna vm da seguinte maneira: Remova o comentário da seguinte linha removendo o #:

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

Para o Tomcat:

No arquivo catalina.bat :

Passo 1:

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

Passo 2:

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

Etapa 3: Execute o Tomcat no prompt de comando, como abaixo:

catalina.sh jpda start

Então você precisa definir pontos de interrupção nas classes Java que deseja depurar.

Pritam Banerjee
fonte
No Java 8, o JDK suporta uma variável de ambiente JAVA_TOOL_OPTIONS , para ativar o depurador para qualquer aplicativo Java que você precise usar: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps desculpe pelas edições, lutando com o formatador.
Nathan Niesen