Depurando Aplicações Multithread no NetBeans IDE

Este documento descreve como usar a janela Depuração no NetBeans IDE para depurar aplicações multithread. O tutorial também demonstra como usar o IDE para detectar deadlocks em uma aplicação.

A janela Depuração simplifica o processo de depuração integrando em uma janela as informações sobre sessões de depuração, threads de aplicações e pilhas de chamadas de threads. A janela Depuração permite que você exiba facilmente o status dos threads de aplicações para suspender e retomar qualquer um dos threads na sessão.

Este tutorial usa dois projetos de amostra para demonstrar como trabalhar com a janela Depuração. Para concluir este tutorial, primeiro faça o download e abra os projetos Gallery e Deadlock.

Assista ao Vídeo de Depuração de uma Aplicação Multithread no NetBeans IDE.

Conteúdo

O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0

Para seguir este tutorial, são necessários os recursos e o software a seguir.

Software ou Recurso Versão Necessária
NetBeans IDE 7.2, 7.3, 7.4, 8.0
JDK (Java Development Kit) versão 7 ou 8
Projeto Gallery e Projeto Deadlock  

Fazendo Download de Projetos de Amostra

Você pode fazer o download dos projetos de amostra usados neste tutorial das seguintes formas:

  • Faça download de um arquivo compactado zip do projeto finalizado.
  • Faça o check-out do código-fonte do projeto das Amostras do NetBeans ao executar as etapas a seguir:
    1. Escolha Equipe > Subversion > Efetuar check-out no menu principal.
    2. Na caixa de diálogo Efetuar Check-out, insira o Repositório URL a seguir:
      https://svn.netbeans.org/svn/samples~samples-source-code
      Clique em Próximo.
    3. Clique em Procurar para abrir a caixa de diálogo Procurar Pastas do Repositório.
    4. Expanda o nó raiz e selecione samples/java/debugging-samples. Clique em OK.
    5. Especifique a Pasta Local para o códigos-fonte (a pasta local precisa estar vazia).
    6. Clique em Finalizar.

      Quando você clica em Finalizar, o IDE inicializa a pasta local como um repositório Subversion e verifica os códigos-fonte do projeto.

    7. Clique em Abrir Projeto na caixa de diálogo exibida quando o check-out for concluído.

    Observação. Para saber mais sobre como efetuar check-out do Subversion, consulte a seção Configurando o Subversion no Guia do Subversion no NetBeans IDE.

Abrindo os Projetos

Neste tutorial, você usará duas aplicações para demonstrar o suporte do IDE para a depuração de aplicações multithread. Neste exercício, você abrirá e executará os dois projetos no IDE. Depois de executar os projetos, será necessário depurar cada um deles.

Executando o Projeto Gallery

A aplicação Gallery é uma aplicação Java Swing simples que reproduz imagens animadas. A aplicação tem dois botões que permitem adicionar e remover imagens animadas. Neste exercício, você executará a aplicação Gallery.

  1. Faça download e expanda o arquivo compactado debugging-samples.zip no seu sistema local.
  2. Escolha Arquivo > Abrir no menu principal.
  3. Localize e selecione o projeto Gallery no diretório de depuração de amostras. Clique em Abrir.

    Quando você clicar em Abrir, o IDE abrirá e exibirá o projeto na janela Projetos. Se você expandir o nó do projeto na janela Projetos, poderá observar que o projeto é uma aplicação Java Swing simples.

  4. Clique com o botão direito do mouse no nó do projeto e escolha Executar para iniciar a aplicação Gallery.
  5. Na aplicação Gallery, clique em 'Mais' para adicionar imagens e clique em 'Menos' para remover as imagens.
    Tela da aplicação Gallery
  6. Feche a janela da aplicação Gallery.

O projeto Gallery é uma aplicação multithread simples que você irá depurar neste tutorial.

Executando o Projeto Deadlock

A aplicação Deadlock contém um método main que inicia um thread, executado durante 500000 milissegundos. O método main inicia dois threads que são impressos na janela de Saída quando finalizados.

  1. Escolha Arquivo > Abrir no menu principal.
  2. Localize e selecione o projeto Deadlock no diretório de amostras de depuração. Clique em Abrir.

    Quando você clicar em Abrir, o IDE abrirá e exibirá o projeto na janela Projetos. Se você expandir o nó do projeto na janela Projetos, observará que o projeto é uma aplicação Java simples.

  3. Clique com o botão direito do mouse no nó do projeto e escolha Executar para iniciar a aplicação Deadlock.

    Quando você clica em Executar, a janela de Saída abre e exibe a saída a seguir.

    run:
    Application started
    MyThread2 successfully finished.
    MyThread1 successfully finished
  4. Permite que a aplicação seja finalizada normalmente (cinco minutos).

    Quando a aplicação Deadlock for finalizada, será exibido o seguinte na janela de Saída.

    Main thread finished

O projeto Deadlock é uma aplicação Java simples com dois threads. Quando você depurar a aplicação, criará um deadlock para ilustrar como o IDE pode ajudá-lo a detectar deadlock.

Depurando os Projetos de Amostra

O projeto Gallery é uma aplicação Java Swing simples que exibe imagens animadas. Você adiciona e remove as imagens clicando nos botões da aplicação. Clicar no botão "Mais" inicia um novo thread que exibe e anima uma imagem. Clicar no botão "Menos" interrompe o thread mais recente, interrompendo a animação e removendo a imagem.

Suspendendo Threads

Neste exercício, você começa a depuração da aplicação Gallery e adiciona imagens para iniciar alguns threads da aplicação. Quando você inicia uma sessão de depuração, o IDE abre a janela Depuração no painel esquerdo do IDE. A janela Depuração exibe uma lista dos threads na sessão.

  1. Clique com o botão direito do mouse no projeto Gallery na janela Projetos e escolha Depurar.

    Quando você clica em Depurar, o IDE inicia a aplicação Gallery e abre as janelas de depuração default. O IDE abre automaticamente a janela Depuração no lado esquerdo da janela principal e abre a Console do Depurador na janela de Saída.

  2. Clique três vezes em "Mais" na aplicação Gallery para iniciar três threads que exibem imagens animadas.

    Se você observar a janela Depuração, poderá verificar que um novo thread foi iniciado para cada animação.

    Tela da janela de Depuração
  3. Suspenda dois threads clicando no botão "Suspender thread" à direita do thread, na janela Depuração.

    Quando um thread é suspenso, o ícone do thread é alterado para indicar o novo estado. Você pode expandir o nó thread para exibir a pilha de chamadas do thread. Você pode clicar com o botão direito do mouse nos itens na janela Depuração para abrir um menu pop-up com os comandos de depuração.

    Tela da janela Depuração com dois threads suspensos

    Se você observar a aplicação Gallery, poderá verificar que, quando você suspendeu os threads, a animação desses threads foi interrompida.

A janela Depuração permite que você exiba rapidamente e altere o status dos threads na sessão. Por default, a janela Depuração exibe os botões Retomar e Suspender no lado direito da janela. É possível ocultar os botões e personalizar ainda mais a exibição da janela Depuração usando a barra de ferramentas na parte inferior da janela Depuração. Se você estiver executando várias sessões de depuração, poderá usar a lista drop-down na parte superior da janela Depuração para escolher qual sessão será exibida na janela.

Tela da barra de ferramentas da janela de Depuração

Alternando Threads

Este exercício demonstra o que acontece quando você está avançando passo a passo na aplicação e um thread diferente da aplicação atinge um ponto de interrupção. Neste exercício você definirá um ponto de interrupção do método e avançará o passo a passo pela aplicação. Enquanto estiver avançando passo a passo pela aplicação, você iniciará um novo thread que também atingirá o ponto de interrupção. O IDE informa quando isso ocorre, exibindo uma notificação na janela Depuração. Em seguida, você irá alternar entre os threads.

  1. Na janela da aplicação Galeria, clique em 'Menos' ou 'Mais' até que apenas duas ou três animações sejam exibidas na janela.
  2. Na janela Projetos do IDE, expanda o pacote gallery e clique duas vezes em Gallery.java para abrir o arquivo no editor.
  3. Insira um ponto de interrupção do método em Gallery.java no início do método run clicando na margem esquerda, na linha 175.
  4. Clique em "Mais" na aplicação Gallery para iniciar um novo thread que atingirá o ponto de interrupção do método.
  5. Clique em Fazer Step Over (F8) e comece a avançar passo a passo pelo método até que o Contador do Programa alcance a linha 191.

    Você observará que o Contador do Programa na margem do editor indica sua posição à medida que você avança passo a passo pelo método.

  6. Clique em "Mais" na aplicação Gallery para iniciar um novo thread que atingirá o ponto de interrupção do método.

    Quando o novo thread atingir o ponto de interrupção do método, uma notificação de Nova Ocorrência de Ponto de Interrupção atingida será exibida na janela Depuração, informando que outro thread atingiu um ponto de interrupção enquanto você avançava passo a passo pelo método.

    Tela de notificação de Nova Ocorrência de Ponto de Interrupção

    Quando você estiver avançando passo a passo por um thread, e um ponto de interrupção for atingido em outro thread, o IDE oferecerá a opção de alternar para o outro thread ou continuar a avançar passo a passo pelo thread atual. Você pode clicar no botão de seta na notificação de Nova Ocorrência de Ponto de Interrupção para alternar para o thread que encontrou o ponto de interrupção. Você pode alternar para o novo thread a qualquer momento selecionando o thread na janela de notificação. Avançar passo a passo pelo thread do ponto de interrupção atual retoma o thread atual, porém o status de outros threads da aplicação permanecem inalterados.

    Observação. Se você verificar a janela Depuração você poderá ver que o thread atual (thread_jirka) é indicado por uma barra verde na margem. O thread que chamou a notificação atingindo o ponto de interrupção (Thread_Roman) é indicado por uma barra amarela e o ícone do thread indica que o thread está suspenso por um ponto de interrupção.

    Tela de notificação de Nova Ocorrência de Ponto de Interrupção
  7. Clique na seta, na notificação na notificação de Nova Ocorrência de Ponto de Interrupção atingida, para alternar o thread atual para o novo thread (Thread_Roman).

    Quando alternar para o novo thread, você observará o seguinte:

    • O contador do programa se move para a posição na linha 175 no novo thread atual (Thread_Roman).
    • Uma anotação "thread suspenso" ficará visível na margem, na linha 191, indicando que um thread (Thread_Jirka) está suspenso nessa linha.
    Tela do editor que mostra as anotações da depuração
  8. Clique em Fazer Step Over algumas vezes para avançar passo a passo pelo novo thread atual (Thread_Roman).
  9. Clique com o botão direito do mouse na anotação "thread suspenso" na margem do editor e escolha Definir como Thread Atual > Thread_Jirka para voltar ao thread suspenso.
    Tela do editor mostrando a pop-up Definir como Thread Atual

    Se preferir, você pode chamar o Seletor de Thread Atual (Alt+Shift+T; Ctrl+Shift+T no Mac) e alternar para qualquer um dos threads da aplicação.

    Tela da aplicação Gallery

Quando você voltar para o Thread_Jirka, a anotação do thread suspenso será exibida ao lado da linha onde o Thread_Roman foi suspenso. Você pode retomar o Thread_Roman clicando em Retomar, na janela Depuração.

Tela do editor que mostra as anotações da depuração

A janela Depuração permite que você exiba e controle com muita precisão os estados dos threads. O depurador gerencia os threads da aplicação para simplificar o fluxo de trabalho de depuração e para evitar que o processo de depuração crie deadlocks. Neste exercício, você observou o seguinte comportamento durante a depuração de uma aplicação no IDE.

  • Quando um thread atinge um ponto de interrupção, somente o thread do ponto de interrupção é suspenso.
  • Ao avançar passo a passo pela aplicação, o thread atual não é afetado quando outros threads atingem os pontos de interrupção.
  • O passo a passo retoma somente o thread atual. Quando a etapa é concluída, somente o thread atual é suspenso.

Você pode sair da aplicação Gallery. No próximo exercício, você irá depurar a aplicação Deadlock e usará o IDE para ajudar a detectar um deadlock.

Detectando Deadlocks

O IDE pode ajudar a identificar possíveis situações de deadlock pesquisando automaticamente em todos os threads suspensos. Quando um deadlock é detectado, o IDE exibe uma notificação na janela Depuração e identifica os threads envolvidos.

Para demonstrar a detecção de deadlocks do IDE, você executará o projeto de amostra Deadlock no depurador e criará uma situação de deadlock.

  1. Expanda o pacote myapplication e abra o Thread1.java e Thread2.java no editor de código-fonte.
  2. Defina um ponto de interrupção em Thread1.java, na linha 20, e em Thread2.java, na linha 20

    Para definir o ponto de interrupção, clique na margem do editor de código-fonte, próximo à linha onde você deseja definir o ponto de interrupção. A anotação do ponto de interrupção é exibida na margem esquerda, perto da linha. Se você abrir a janela Pontos de Interrupção (Alt-Shift-5; Ctrl+Shift+5 no Mac), poderá verificar que os dois pontos de interrupção estão definidos e ativados.

    Tela do editor que mostra o ponto de interrupção definido na linha 20
  3. Clique com o botão direito do mouse no projeto Deadlock, na janela Projetos, e escolha Depurar.

    O método main executará os dois threads e ambos serão suspensos em um dos pontos de interrupção. Você pode visualizar os threads suspensos pelos pontos de interrupção na janela Depuração.

  4. Na janela Depuração, retome os threads suspensos (MyThread1 e MyThread2) clicando nos botões Retomar à direita dos threads suspensos na janela Depuração.
    Tela de retomada de threads suspensos na janela Depuração

    A retomada dos threads MyThread1 e MyThread2 criará o estado de deadlock.

  5. Escolha Depurar\Verificar Deadlock no menu principal para verificar se há deadlock nos threads suspensos.
    Tela de retomada de threads suspensos na janela Depuração

    Se você verificar a aplicação e detectar um deadlock, uma mensagem será exibida na janela Depuração que o informará sobre o deadlock. Você pode observar que os threads no deadlock são indicados com uma barra vermelha na margem esquerda da janela Depuração.

Este tutorial foi uma introdução básica a algumas funcionalidades de depuração do IDE. A janela Depuração permite que você suspenda e retome facilmente os threads ao depurar uma aplicação. Isso pode ser extremamente útil quando você estiver depurando aplicações multithread.



Consulte Também

Para obter mais informações sobre o desenvolvimento e teste de aplicações Java no NetBeans IDE, veja os recursos a seguir:

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo