Motivação

Todos sabemos que é muito importante testar o máximo possível as aplicações antes de colocá-las em produção, pois assim evitamos erros e possíveis dores de cabeça. Todavia, raramente os testes conseguem capturar todos os erros, pois muitos deles são identificados apenas quando o sistema já está em uso pelo cliente, causando transtornos indesejáveis. Entre os piores erros estão aqueles em que não temos log algum, ocorrem de forma aleatória ou apenas com determinado usuário, e acabam dificultando a sua análise.

A seguir, veremos uma das formas de rastrear esse tipo de erro em aplicações web Java, realizando o debug das aplicações de forma remota, ou seja, com a aplicação em produção, sendo executada em um container como o Tomcat.

Saiba mais sobre o Apache Tomcat

Passo 1: Configurando o Eclipse para depuração remota

Nesse artigo, utilizaremos o Eclipse para realizar a depuração remota, mas antes é preciso configurá-lo para suportar tal funcionalidade. Para isso, após abri-lo, acesse o menu Run e depois selecione a opção Debug Configurations.

Com a janela Debug Configurations aberta, você verá várias opções de depuração. Entre elas está a depuração remota, chamada de Remote Java Application, como podemos observar na Figura 1.

Janela de configuração do debug
Figura 1. Janela de configuração do debug

Note que estamos com o item Remote Java Application selecionado. A partir daí, devemos clicar no ícone New Launch Configuration, conforme destacado nessa figura.

Feito isso, será exibida a janela apresentada na Figura 2, onde temos, primeiramente, o campo Name. Nesse campo, devemos escolher um nome para a configuração, e abaixo dele, temos o campo Project, no qual devemos informar o projeto que possui os códigos fontes que serão utilizados para a depuração.

Documento PDF após inserção de conteúdo
Figura 2. Documento PDF após inserção de conteúdo

É importante destacar que nos testes que realizaremos será usado o JPDA (Java Platform Debugger Architecture), plataforma que é composta por um conjunto de APIs especializadas na depuração de código Java e nos permite, em uma aplicação web, por exemplo, redirecionar todo o fluxo ocorrido no servidor remoto para o nosso ambiente local. Para isso, basta colocar os breakpoints nos locais do código que desejar. Funciona da mesma forma que o debug de uma aplicação desktop, porém, a aplicação web pode estar hospedada em outra máquina da mesma rede, na nuvem, etc.

Além disso, se o código fonte do nosso ambiente local for diferente do ambiente remoto, o JPDA sobrescreverá o código do ambiente remoto pelo local. Por isso, é muito importante ter certeza de que o nosso código local é idêntico ao código usado para depuração remota.

Escolhido o projeto que será depurado, devemos selecionar em Connection Type a opção Standard (Socket Attach), que indica que estamos nos conectando a um host de destino. Em Connection Properties, informamos qual o IP da máquina remota que possui a nossa aplicação em execução e à qual conectaremos para o efetuar o debug. Feito isso, podemos clicar no botão DEBUG e estaremos prontos para depurar a aplicação.

Nesse momento, no entanto, o seguinte erro pode ocorrer:

Failed to connect to remote VM. Connection refused.
Connection refused: connect

Ele sinaliza que o seu servidor (ou container) de aplicação não está em execução, ou o seu modo de depuração não está habilitado, e em qualquer uma das duas opções a sua conexão é recusada.

Saiba mais sobre as ferramentas de debug do Eclipse

Passo 2: Configurando o servidor remoto para depuração

Agora, iremos configurar o Tomcat 7 para aceitar a depuração remota do Eclipse. Para habilitar o modo de depuração no Tomcat em sistemas operacionais Unix, você deve, primeiramente, configurar duas variáveis de ambiente, da seguinte forma:


set JPDA_ADDRESS=8000
set JPDA_TRANSPORT=dt_socket

É importante lembrar aqui que na tela da Figura 3 definimos que iremos conectar na porta 8000. Caso você deseje usar outra porta, deverá alterar ambas as configurações. Feito isso, você já pode tentar iniciar o debug novamente no Eclipse.

Para saber se o Tomcat iniciou em modo de depuração, você pode acessar o arquivo catalina.out, geralmente localizado em /usr/share/tomcat7/logs/. Nele, você deverá procurar pelo seguinte log:


  Listening for transport dt_socket at address: 8000
  

Caso encontre essa mensagem no arquivo, significa que o Tomcat já está escutando uma conexão na porta 8000 em modo de depuração.

No IDE Eclipse, ao iniciar o modo de Debug, você deverá ver o botão Disconnect habilitado (conforme a Figura 3), mostrando que estamos conectados ao servidor.

Botão Disconnect
Figura 3. Botão Disconnect

A partir desse momento, a depuração remota já pode ser feita. É válido ressaltar que ela seguirá o fluxo de breakpoints que você definir, como se tivesse depurando localmente. Isso permite que localizemos erros de forma eficiente, validando o sistema no ambiente em que ele estiver disponível para produção.