depuração remota de um aplicativo Java
-
13-09-2019 - |
Pergunta
Eu tenho um aplicativo java em execução na máquina linux. Eu executar o aplicativo java usando o seguinte:
java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n
Eu abri a porta 4000 para TCP nesta máquina Linux. Eu uso eclipse da máquina Windows XP e tentar conectar-se a esta aplicação. Eu abri a porta no Windows também.
Ambas as máquinas estão na LAN, mas eu não consigo conectar o depurador para o aplicativo Java. O que estou fazendo de errado?
Solução
Editar: notei que algumas pessoas estão cortando e colando a invocação aqui. A resposta que deu originalmente era relevante apenas para o OP. Aqui está um estilo de invocação mais moderno (incluindo usando a porta mais convencional de 8000):
java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>
resposta Original segue.
Tente isto:
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp
Dois pontos aqui:
- Não há espaços na opção
runjdwp
. - Opções de vir antes do nome da classe. Todos os argumentos que você tem após o nome da classe são argumentos a seu programa!
Outras dicas
Para 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 mais recente JDK:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006
Por favor, altere o número da porta com base em suas necessidades.
A partir java technotes
De 5.0 em diante, o -agentlib: JDWP opção é usada para carga e especificar opções para o agente JDWP. Para versões anteriores à 5.0, o -Xdebug e opções -Xrunjdwp são utilizadas (a implementação 5.0 também suporta as opções -Xdebug e -Xrunjdwp mas o mais recente -agentlib: opção JDWP é preferível como o agente JDWP em 5,0 usa a interface JVM TI para o VM em vez da interface JVMDI mais velho)
Mais uma coisa a nota, a partir JVM Tool documentação da interface :
JVM TI foi introduzido no JDK 5.0. JVM TI substitui o Java Virtual Machine Profiler Interface (JVMPI) eo Debug Interface Java Virtual Machine (JVMDI) que, a partir de JDK 6, já não são fornecidos.
Passos:
- Inicie a aplicação java remoto com a depuração opções como disse no post acima.
- Configurar o Eclipse para depuração remota especificando host e porta.
- Iniciar remoto depuração no Eclipse e esperar por conexão para ter sucesso.
- ponto de interrupção de Configuração e de depuração.
- Se você deseja depurar do início de uso do aplicativo suspender = y, isso irá manter o aplicativo remoto suspenso até que você se conectar de eclipse.
guia passo a passo em Java remoto depuração para maiores detalhes.
Resposta cobrindo Java> = 9:
Para Java 9 +, a opção JVM precisa de uma ligeira mudança prefixando o endereço com o endereço IP da máquina que hospeda o JVM, ou apenas *
:
-agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,suspend=n
Isto é devido a uma mudança notável na https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 .
Para Java <9, o número da porta é suficiente para se conectar.
Isto é como você deve configurar Eclipse Debugger para depuração remota:
Configurações Eclipse:
1.Click no botão Executar
2.Selecione o Configurações Debug
3.Selecione o “Java Remoto Aplicação”
Configuração 4.New
- Nome: GatewayPortalProject
- Project: GatewayPortal-portlet
- Tipo de Conexão: Soquete Anexar
- Propriedades de conexão: i) localhost ii) 8787
Para JBoss:
1.alterar o /path/toJboss/jboss-eap-6.1/bin/standalone.conf
em sua vm como segue:
Uncomment a seguinte linha, removendo o #:
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"
Para Tomcat:
Em catalina.bat arquivo:
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"
Passo 3: Executar Tomcat a partir do prompt de comando como abaixo:
catalina.sh jpda start
Em seguida, você precisa definir breakpoints nas classes Java que você deseja depurar.
Eu gostaria de enfatizar que ordem dos argumentos é importante .
Para mim java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jar
comando abre a porta depurador ,
mas o comando java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
não .
A melhor opção de depuração é criar registros e analisar logs. Mas em alguns casos precisamos aplicação web debug implantado no servidor.
Veja remotamente depurar ligação de uma aplicação web java . fluxo completo de depuração remota é descrito aqui. Espero que isso vai ajudar.