Depurando com Eclipse

Depurando com Eclipse

1. Visão geral

Neste guia rápido, veremos como depurar programas Java usando o IDE Eclipse.

2. Conceitos Básicos

O Eclipse possui excelente suporte para depuração de um aplicativo. It visualizes step-by-step executione nos ajuda a descobrir bugs.

Para demonstrar os recursos de depuração no Eclipse, usaremos um programa de amostraPerfectSquareCounter. Este programa conta o total de quadrados perfeitos e até quadrados perfeitos sob um determinado número:

public class PerfectSquareCounter {

    static int evenPerfectSquareNumbers = 0;

    public static void main(String[] args) {
        int i = 100;
        System.out.println("Total Perfect Squares: " + calculateCount(i));
        System.out.println("Even Perfect Squares : " + evenPerfectSquareNumbers);
    }

    public static int calculateCount(int i) {
        int perfectSquaresCount = 0;
        for (int number = 1; number <= i; number++) {
            if (isPerfectSquare(number)) {
                perfectSquaresCount++;
                if (number % 2 == 0) {
                    evenPerfectSquareNumbers++;
                }
            }
        }
        return perfectSquaresCount;
    }

    private static boolean isPerfectSquare(int number) {
        double sqrt = Math.sqrt(number);
        return sqrt - Math.floor(sqrt) == 0;
    }
}

2.1. Modo de depuração

Primeiro, precisamosstart the Java program within Eclipse in debug mode. Isso pode ser alcançado de duas maneiras:

  • Clique com o botão direito no editor e selecioneDebug As → Java Application (mostrado na imagem abaixo)

  • Debug o programa da barra de ferramentas (destacado na imagem abaixo)

image

2.2. Pontos de interrupção

Precisamos dedefine the points at which the program execution should pause para investigação. These are called breakpoints and are applicable for methods. Eles também podem ser definidos a qualquer momento antes ou durante a execução.

Basicamente, existem três maneiras de adicionar pontos de interrupção ao programa:

  • Clique com o botão direito do mouse na barra de marcadores (régua vertical) correspondente à linha e selecione Alternar ponto de interrupção (mostrado na captura de tela abaixo)

  • PressioneCtrl+Shift+B na linha necessária enquanto estiver no editor

  • Clique duas vezes na barra de marcadores (régua vertical) correspondente à linha necessária

image

2.3. Controles de fluxo de código

Agora que o depurador para nos pontos de interrupção fornecidos, podemos prosseguir com a execução adicional.

Vamos supor que o depurador esteja posicionado atualmente de acordo com a captura de tela abaixo, na Linha 16:

image

As opções de depuração mais usadas são:

  • Step Into (F5) – This operation goes inside the methods usado na linha atual (se houver); caso contrário, prossegue para a próxima linha. Neste exemplo, ele levará o depurador dentro do métodoisPerfectSquare()

  • Step Over (F6) – This operation processes the current line and proceeds to the next line. Neste exemplo, isso executará o métodoisPerfectSquare() e continuará para a próxima linha

  • Step Return (F7) – This operation finishes the current method and takes us back to the calling method. Como, neste caso, temos um ponto de interrupção no loop, ele ainda estará dentro do método, senão voltaria ao método principal

  • Resume (F8) – This operation will simply continue with the execution until the program ends a menos que alcancemos qualquer ponto de interrupção adicional

2.4. Perspectiva de depuração

Quando iniciamos o programa no modo de depuração, o Eclipse solicitará uma opção para mudar para a perspectiva de Depuração. The Debug perspective is a collection of some useful views that help us visualize and interact with the debugger.

Também podemos mudar para a perspectiva Debug manualmente a qualquer momento.

Aqui estão algumas das visualizações mais úteis que ele contém:

  • Debug view - Mostra as diferentes threads e rastreamentos de pilha de chamadas

  • Variables view - Mostra os valores das variáveis ​​em qualquer ponto. Se precisamos ver as variáveis ​​estáticas, precisamos especificar explicitamente que

  • Breakpoints - Isso mostra os diferentes pontos de interrupção e pontos de controle (que veremos abaixo)

  • Debug Shell - Isso nos permite escrever e avaliar o código personalizado durante a depuração (um exemplo é coberto mais tarde)

image

3. Técnicas

Nesta seção, passaremos por algumas técnicas importantes que nos ajudarão a dominar a depuração no Eclipse.

3.1. Variáveis

Podemos ver os valores das variáveis ​​durante a execução na visualização Variáveis. Para ver as variáveis ​​estáticas, podemos selecionar a opção drop-downJava → Show Static Variables.

Usando a visualização de variáveis, é possível alterar qualquer valor para o valor desejado durante a execução.

Por exemplo, se precisarmos pular alguns números e começar diretamente com o número 80, podemos fazer isso alterando o valor da variávelnumber:

image

3.2. Inspeção de valores

Se precisarmos inspecionar o valor de uma expressão ou instrução Java, podemos selecionar a expressão específica no editor, clicar com o botão direito e Inspecionar, conforme mostrado abaixo. Um atalho útil é parahit Ctrl+Shift+I on the expression to see the value:

image

image

No caso de precisarmospermanently inspect this expression, we can right-click and Watch. Agora, isso é adicionado à visualização Expressions e o valor desta expressão pode ser visto para diferentes execuções.

3.3. Shell de depuração

No contexto da sessão de depuração,we can write and run custom code to evaluate possibilities. Isso é feito no Shell de Depuração.

Por exemplo, se precisarmos verificar a exatidão da funcionalidadesqrt, poderíamos fazer isso no Debug Shell. No código,Right-click → Inspect para ver o valor:

image

image

3.4. Pontos de interrupção condicionais

Haverá casos em que queremos depurar apenas para condições específicas. We can achieve this by adding conditions to a breakpoint de uma das duas maneiras:

  • Clique com o botão direito do mouse no ponto de interrupção e escolha Propriedades do ponto de interrupção

  • Na exibição Ponto de interrupção, selecione o ponto de interrupção e especifique a condição

Por exemplo, podemos especificar o ponto de interrupção para suspender a execução apenas senumber for igual a 10:

image

3.5. Pontos de controle

Whatbreakpoints are for methods, watchpoints are for class-level variables. Neste exemplo atual, o ponto de interrupção na declaraçãoevenPerfectSquareNumbers é chamado de watchpoint. Agora, o depurador pausará a execução toda vez que o campo for acessado ou modificado em um ponto de controle.

Este é o comportamento padrão, que pode ser alterado nas propriedades do ponto de controle.

Neste exemplo, o depurador interromperá a execução sempre que um quadrado perfeito for um número par:

image

3.6. Pontos de gatilho

Vamos supor que estejamos depurando um problema complexo em um aplicativo com uma grande quantidade de código-fonte. O depurador continuará suspendendo o fluxo devido a pontos de interrupção dispersos.

Quando um ponto de interrupção é marcado como um ponto de disparo, significa que o resto dos pontos de interrupção serão habilitados apenas se esse ponto de interrupção for atingido.

Por exemplo, na captura de tela abaixo, o ponto de interrupção emisPerfectSquare() deve ser atingido para cada iteração no loop. No entanto, especificamos o ponto de interrupção no métodocalculateCount() como um ponto de gatilho, junto com uma condição.

Portanto, quando a contagem de iterações atingir 10, isso disparará o restante dos pontos de interrupção. Portanto, a partir de agora, se o ponto de interrupção emisPerfectSquare() for atingido, a execução será suspensa:

image

3.7. Depuração Remota

Finalmente, se o aplicativo estiver sendo executado fora do Eclipse, ainda podemos usar todas as funcionalidades acima, desde que o aplicativo remoto permita a depuração. No Eclipse, selecionaríamosDebug as Remote Java Application.

4. Conclusão

Neste guia rápido, vimos os fundamentos e diferentes técnicas de depuração de programas no Eclipse IDE.

Como sempre, o código-fonte usado neste exercício está disponívelover on GitHub.