A depuração remota pode ser útil para desenvolvimento de aplicativo, por exemplo, o desenvolvimento de um programa para uma máquina popular que não possa hospedar a plataforma de desenvolvimento ou depurar programas em máquinas dedicadas como servidores da Web, cujos serviços não possam ser encerrados. Outros exemplos incluem aplicativos Java executando com memória limitada ou capacidade de CPU, como dispositivos móveis ou desenvolvedores que desejam separar os ambientes de aplicativo ou desenvolvimento etc.
Se ainda não tiver feito isso, faça download do Eclipse V3.4 (Ganymede). No Ganymede, o conector de atendimento do soquete foi incluído no tipo de configuração de ativação do aplicativo Java remoto. O novo conector de atendimento do soquete permite que você inicie o depurador Java, que atende a uma conexão em um soquete específico. O programa que está sendo depurado pode ser iniciado com as opções de linha de comando para se conectar ao depurador. Antes do release do Ganymede, somente um conector de acoplamento de soquete era fornecido e o programa em depuração tinha de ser um host de depuração que estava conectado ao depurador. Não é prático que dispositivos móveis sejam host devido à insuficiência de memória e capacidade de CPU.
Para usar depuração remota, a Java Virtual Machine (JVM) V5.0 ou posterior deve ser usada, por exemplo, o IBM® J9 ou o Java SE Development Kit (JDK) da Sun Microsystems. Neste artigo, nosso enfoque será a depuração remota, em vez de detalhar cada um dos recursos de depuração do Eclipse. Consulte Resource para obter informações sobre como depurar com o Eclipse e onde localizar o software mencionado acima.
A tecnologia Java Platform Debugger Architecture (JPDA) da Sun Microsystems é uma arquitetura que permite depurar aplicativos Java facilmente em todas as situações. A JPDA é composta por duas interfaces (JVM Tool Interface e JDI, respectivamente), um protocolo (Java Debug Wire Protocol) e dois componentes de software que estão vinculados (backend e front-end). É projetada para ser usada por depuradores em qualquer ambiente. A JPDA não é apenas para sistemas de desktop, mas também funciona bem com sistemas incorporados.
A JVM Tool Interface (JVMTI) define o que uma VM deve fornecer para depuração. (Nota do editor: A partir do Java V5, a JVMTI substituiu a JVMDI, que foi usada no Java V1.4.) O Java Debug Wire Protocol (JDWP) descreve o formato das informações de depuração e solicitações transferidas entre o processo que está sendo depurado e um font-end do depurador, que implementa a JDI, como Eclipse, Borland JBuilder e muitos outros. O programa que está sendo depurado é frequentemente denominado debuggee (programa depurado) na especificação do JPDA da Sun. A JDI é uma interface de alto nível para definir as informações e solicitações usadas para depuração remota. A arquitetura é estruturada com segue.
Listagem 1. A Java Platform Debugger Architecture
Componentes Interfaces do Depurador
/ |--------------|
/ | VM |
debuggee -----( |--------------| <---- JVMTI - Java VM Tool Interface
\ | back-end |
\ |--------------|
/ |
canal com. --( | <------------ JDWP - Java Debug Wire Protocol
\ |
/ |--------------|
/ | front-end |
depurador-----( |--------------| <---- JDI - Java Debug Interface
\ | UI |
\ |--------------|
|
Assim, quaisquer ferramentas de terceiros e a VM baseada em JPDA devem trabalhar juntos sem reclamação. Essa arquitetura cliente-servidor permite que você depure um programa Java em uma estação de trabalho local executando a plataforma, ou o depure usando inclusive um computador remoto na rede.
Antes de falar sobre as coisas do cenário de depuração, é necessário introduzir dois termos usados na especificação da JPDA: conector e transporte. Um conector é uma abstração da JDI usado para estabelecer uma conexão entre um aplicativo depurador e uma VM de destino. Um transporte define como os aplicativos acessam e transmitem dados entre o front-end e o backend. Os conectores "mapeiam" aos tipos de transporte disponíveis e aos modos de conexão. Na implementação de referência do JPDA, da Sun, dois mecanismos de transporte são fornecidos no Microsoft® Windows®: transporte de soquete e transporte de memória compartilhada. Conectores disponíveis:
- Conector de acoplamento do soquete
- Conector de acoplamento da memória compartilhada
- Conector de atendimento do soquete
- Conector de atendimento da memória compartilhada
- Conector de ativação da linha de comandos
No estabelecimento de uma conexão entre um aplicativo do depurador e a VM de destino, um lado atua como servidor e atende a uma conexão. Algum tempo depois, o outro lado se conecta ao listener e estabelece uma conexão. As conexões permitem que o aplicativo do depurador ou a VM de destino atue como um servidor. As comunicações entre processos podem estar executando em uma ou diferentes máquinas.
O problema de depurar um programa Java remotamente não está no front-end do depurador, mas no backend Java remoto. Infelizmente, não há muita informação sobre isso no sistema de ajuda do Eclipse. Na verdade, a JDI e a JVMTI são implementadas pelo Eclipse e o ambiente do tempo de execução Java, respectivamente. A única coisa com que estamos preocupados é o JDWP, que contém as informações para se comunicar com a JVMTI e a JDI. O JDWP contém muitos argumentos que foram incluídos para chamar o aplicativo para o aplicativo java remoto. Seguem alguns argumentos usados neste artigo.
- -Xdebug
- Ativa os recursos de depuração.
- -Xrunjdwp:<subopções>
- Carrega a implementação do JDWP na VM de destino. Usa um transporte e o protocolo JDWP para se comunicar com um aplicativo separado do depurador. As subopções específicas estão descritas abaixo.
A partir da Java V5, é possível usar a opção -agentlib:jdwp em vez de -Xdebug e -Xrunjdwp. Mas, se tiver de se conectar à VM antes da V5, -Xdebug e -Xrunjdwp serão a única opção. Seguem algumas breves descrições das subopções -Xrunjdwp.
- transport
- Geralmente, o transporte do soquete é usado. Mas o transporte de memória compartilhada também pode ser usado na plataforma Windows, se disponível.
- servidor
- Se o valor for y, o aplicativo de destino atende a um aplicativo do depurador a ser conectado. Caso contrário, ele se conecta a um aplicativo do depurador no endereço especificado.
- address
- Esse é o endereço de transporte da conexão. Se o servidor estiver n, tente se conectar a um aplicativo do depurador nesse endereço. Caso contrário, atenda a uma conexão nessa porta.
- suspender
- Se o valor for y, a VM de destino será suspensa até que o aplicativo do depurador se conecte.
Para explicações detalhadas para cada configuração de depuração, consulte a documentação do JPDA (consulte Recursos).
A Listagem 2 mostra um exemplo de como ativar uma VM no modo de depuração e atender a uma conexão de soquete na porta 8765.
Listagem 2. A VM de destino atua como um servidor de depuração
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765 |
A Listagem 3 mostra como se conectar a um aplicativo do depurador em execução usando um soquete no host 127.0.0.1, na porta 8000.
Listagem 3. A VM de destino atua como um cliente de depuração
-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000 |
Recursos da depuração remota no Eclipse
O Eclipse é um front-end de depurador Java gráfico. A JDI é implementada no pacote configurável org.eclipse.jdt.debug. Neste artigo, não discutiremos os detalhes da implementação da JDI. Consulte Recursos para obter informações sobre a tecnologia Eclipse JDT e Java JDI.
A primeira coisa que desejamos saber é que conector do Eclipse usar. Para aprender os tipos de conexão remota fornecidos pelo Eclipse, é possível incluir uma configuração de ativação no Remote Java Application acessando o menu do Eclipse e selecionando Run > Debug Configurations..., e selecionando o conector na lista suspensa. Dois conectores são fornecidos no Ganymede:
- Conexão do Soquete
- Atendimento do Soquete
Para o conector de atendimento do soquete, a Eclipse VM será o host a ser conectado pelo aplicativo Java remoto. Para o conector de acoplamento do soquete, a VM de destino será o host. Não há nenhuma diferença para a depuração de aplicativo entre os dois conectores — o usuário pode escolher. Uma boa regra geral é usar um computador mais sofisticado e mais rápido como o host de depuração da VM devido aos recursos de computação necessários.
Antes de depurar o seu aplicativo Java, é necessário ter certeza de que as opções de depuração estão todas ativadas para o seu aplicativo remoto. Se essa informação não estiver disponível, você obterá uma mensagem de erro, do tipo "Debug information is not available" ou "Unable to install breakpoint due to missing line number". É possível modificar as configurações do menu do Eclipse mudando o que está definido em Window > Preferences > Java > Compiler.
Figura 1. Opções de depuração no Eclipse
Depurar um aplicativo remotamente
Estamos prontos para iniciar a depuração de um aplicativo remotamente. Vamos fazer isso etapa a etapa:
- 1. Criar um projeto Java com uma classe simples
- Vamos criar uma classe simples para propósito de depuração apenas. A Listagem 4 mostra o código de amostra.
Listagem 4. Código de amostra para depuração
package com.ibm.developerWorks.debugtest;
public class test {
public static void main(String[] args) {
System.out.println("This is a test.");
}
}
|
- 2. Definir um ponto de interrupção
- Defina um ponto de interrupção no código. Neste exemplo, definiremos o ponto de interrupção na linha
System.out.println("This is a test.");.
Figura 2. Definir ponto de interrupção no Eclipse
- 3. Depurar o aplicativo localmente
- Antes de depurar seu aplicativo, assegure que as opções de depuração descritas na Figura 1 estejam ativadas para o projeto. É desnecessário depurar um aplicativo localmente, mas é possível assegurar que todas as informações de depuração estejam disponíveis. Clique com o botão direito do mouse no projeto Java, selecione Debug As e Java Application (veja a Figura 3). Se a execução do aplicativo estiver parada no ponto de interrupção, as informações de depuração são apresentadas corretamente. É possível continuar a usar os recursos de depuração, como exibir a pilha de depuração, gerenciamento de ponto de interrupção ou variáveis etc.
Figura 3. Depurar o aplicativo localmente
- 4. Exportar o projeto Java
- Usaremos esse aplicativo como o destino da depuração. Clique com o botão direito do mouse no projeto Java, selecione Exportar, selecione Java e escolha JAR file ou Runnable JAR file para exportar o projeto. O arquivo JAR será gerado no local desejado. Esteja certo de que se a fonte Java não corresponder ao aplicativo de destino, a função de depuração não funcionará corretamente.
- 5. Executar o aplicativo Java manualmente
- Abra um console para ativar o aplicativo manualmente e ter certeza de que o Java Runtime Environment está configurado devidamente.
Listagem 5. Amostra de chamada de aplicativo Java
java -jar test.jar |
- 6. Depurar o aplicativo remotamente
- Copie o arquivo JAR para o local apropriado no computador remoto, ou para a mesma máquina, chame o servidor de depuração e conecte um cliente a ele. O aplicativo Java simples pode atuar como um servidor ou cliente de depuração. Dependendo da configuração, é possível escolher o tipo de conexão Socket Attach ou Socket Listen no Eclipse. Saiba como executar o aplicativo como um servidor ou cliente nas duas seções a seguir.
A VM de destino atua como um servidor de depuração
O exemplo a seguir chama o aplicativo Java no lado remoto, atua como um servidor de depuração e atende a uma conexão de soquete na porta 8000. A VM de destino será suspensa até que o depurador se conecte.
Listagem 6. Amostra de chamada da VM para modo de conexão de soquete no Eclipse
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar
test.jar
|
Inicie o Eclipse usando a configuração de ativação remota e especifique o endereço da VM de destino do aplicativo remoto. Para isso, clique em Run > Debug Configurationse clique duas vezes em Remote Java Application no menu Eclipse. Na configuração de ativação recém-criada, especifique o IP e a porta do aplicativo de destino. Para executar o aplicativo remoto na mesma máquina, simplesmente especifique o IP do host como localhost ou 127.0.0.1.
Figura 4. Configuração da conexão de acoplamento do soquete
Selecione a opção Allow termination of remote VM para terminar a VM à qual está se conectando durante a depuração do aplicativo.
Figura 5. Botão Terminate no Eclipse
A VM de destino atua como um cliente de depuração
O segundo exemplo é usar um aplicativo Java simples que atua como um cliente de depuração, e o front-end do depurador atua como um servidor de depuração. O Eclipse usa o tipo de conexão do modo de atendimento do soquete para atendimento. O front-end de depuração deve ser iniciado com antecedência para atender em uma porta específica. A Figura 6 mostra uma configuração de amostra para configurar o atendimento.
Figura 6. Configuração da conexão de atendimento do soquete
Clique no botão Debug do Eclipse e a barra de status mostrará a mensagem "waiting for vm to connect at port 8000..." Quando vir tal mensagem, inicie o aplicativo remoto. A Listagem 7 mostra como chamar o aplicativo Java como um cliente de depuração e conectá-lo a um aplicativo do depurador em execução usando um soquete no host 127.0.0.1, na porta 8000.
Listagem 7. Amostra da chamada da VM para conexão de listagem de soquete no Eclipse
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y
-jar test.jar
|
Se tudo ocorrer bem, a perspectiva de depuração será exibida para dar suporte à depuração de aplicativo, e a execução do aplicativo Java remoto será parado normalmente. Isso é similar à Etapa 3 que fizemos na depuração local (veja a Figura 3). A esta altura, é possível usar as funções de depuração padrão, como configurar pontos de interrupção e valores, execução de etapa etc.
Este artigo ilustrou como usar o tipo de configuração de aplicativo Java remoto integrado do Eclipse para executar a depuração de aplicativo remotamente. Apresentou como configurar um aplicativo Java para chamar a depuração remota e ajudou a compreender os conectores que o Eclipse fornece. Finalmente, você aprendeu a como aplicar essa tecnologia nos seus projetos.
Aprender
-
"Visão Rápida do Eclipse Ganymede" é uma visão geral dos projetos Ganymede, junto com os recursos para obter mais informações.
-
Para obter uma introdução à depuração com a plataforma Eclipse, consulte "Depurando com a Plataforma Eclipse."
-
Expanda seu conhecimento de depuração do Eclipse consultando Eclipse Debugging Resources.
-
Saiba mais sobre o
Java Platform Debugger Architecture da Sun Microsystems.
-
Leia a documentação do Java Platform Debugger Architecture para aprender mais sobre a JPDA.
-
Leia a documentação do Java Debug Interface para aprender mais sobre a JDI.
-
O projeto JDT fornece os plug-ins de ferramentas que implementam ferramentas Java que suportam o desenvolvimento de qualquer aplicativo Java, incluindo os plug-ins do Eclipse.
-
Confira "lista de leituras recomendadas do Eclipse."
-
Navegue em todo o conteúdo do Eclipse no developerWorks.
-
Iniciante no Eclipse? Leia o artigo do developerWorks "Introdução à Plataforma Eclipse" para saber sobre sua origem e arquitetura e como estender os plug-ins do Eclipse.
-
Expanda suas qualificações em Eclipse conferindo os recursos do projeto Eclipse.
-
Para ouvir entrevistas e discussões interessantes para desenvolvedores de software, verifique os Podcasts do developerWorks.
-
Fique por dentro dos eventos técnicos e webcasts do developerWorks .
-
Acompanhe e saiba mais sobre a IBM e tecnologias de software livre e funções de produto com as Demos gratuitas on demand do developerWorks.
-
Confira conferências, feiras, webcasts e outros eventos que estão para acontecer no mundo todo e que são do interesse de desenvolvedores de software livre da IBM.
-
Visite a zona de software livre para obter extensas informações de instruções, ferramentas e atualizações de projeto para ajudar você a desenvolver com tecnologias de software livre e usá-las com produtos IBM.
Obter produtos e tecnologias
-
O Java 2 Standard Edition V5 ou posterior está disponível em Sun Microsystems.
-
Confira a mais recente downloads da tecnologia Eclipse no alphaWorks da IBM.
-
Faça o download de
plataforma Eclipse e outros projetos da Eclipse Foundation.
-
Faça o download de
Versões de avaliação de produto IBM e comece a usar ferramentas de desenvolvimento de aplicativo e produtos de middleware do DB2®, Lotus®, Rational®, Tivoli®eWebSphere®.
-
Inove seu próximo projeto de desenvolvimento de software livre com o software de avaliação da IBM, disponível para download ou em DVD.
Discutir
-
O programa Newsgroup da Plataforma Eclipse deverá ser sua primeira parada para discussão das questões relacionadas ao Eclipse. (A seleção deste link ativará seu aplicativo leitor de notícias Usenet padrão e abrirá eclipse.platform.)
-
O programa Newsgroup do Eclipse tem muitos recursos para pessoas interessadas no uso e na extensão do Eclipse.
-
Participe dos blogs do developerWorks
e participe da comunidade do developerWorks.