corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Depurando aplicativos multithreaded no NetBeans IDE

Este documento descreve como usar a janela Depuração no NetBeans IDE para depurar aplicativos multithreaded. O tutorial também demonstra como usar o IDE para detectar impasses em um aplicativo.

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 aplicativos e pilhas de chamadas de threads. A janela Depuração permite que você veja facilmente o status dos threads de aplicativos 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.

Conteúdo

 O conteúdo desta página se aplica ao IDE NetBeans 6.7, 6.8, 6.9 e 7.0

Para seguir este tutorial, você precisa dos seguintes recursos e softwares.

Software ou recurso Versão necessária
NetBeans IDE 6.7, 6.8, 6.9, 7.0
Java Development Kit (JDK) versão 6 ou
versão 5
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 o download de um arquivo zip do projeto acabado.
  • Retire o código-fonte do projeto do Kenai ao executar as seguintes etapas:
    1. Escolha Equipe > Kenai > Obter código-fonte a partir do Kenai, a partir do menu principal.

      Alternativamente, você pode escolher Abrir projeto Kenai para adicionar o projeto no painel do Kenai, e a seguir obter o código-fonte do projeto.

    2. Na caixa de diálogo Obter código-fonte a partir do Kenai, localize o repositório Kenai ao clicar em Procurar para abrir a caixa de diálogo Procurar projetos Kenai.
    3. Pesquise pelo Catálogo de amostras do NetBeans IDE.

      Alternativamente, o código-fonte para a depuração de aplicativos de amostra também estão disponíveis a partir do repositório do projeto NetBeans Debugger Demos.

    4. Selecione o Catálogo de amostra do NetBeans IDE e clique em OK.
    5. Clique em Procurar para especificar a Pasta a obter e selecione NB67/Java/debugging-samples. Clique em OK.
    6. Especifique a pasta local para o código-fonte (a pasta local precisa estar vazia).
    7. Clique em Obter do Kenai.

      Quando você clica em Obter do Kenai, o IDE inicializa a pasta local como um repositório Subversion e retira o código-fonte do projeto.

    8. Clique em Abrir projeto na caixa de diálogo que aparece quando a retirada estiver completada.

    Nota. o NetBeans IDE 6.7 é necessário.

Abrindo os projetos

Neste tutorial você usará dois aplicativos para demonstrar o suporte do IDE para a depuração de aplicativos multithreaded. 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

Gallery é um aplicativo Java Swing simples que reproduz imagens animadas. O aplicativo tem dois botões que permitem adicionar e remover imagens animadas. Neste exercício, você executará o aplicativo Gallery.

  1. Faça o download e descompacte o arquivo debugging-samples.zip em seu sistema local.
  2. Escolha Arquivo > Abrir no menu principal.
  3. Localize e selecione o projeto Gallery no diretório debugging-samples. 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 é um aplicativo Java Swing simples.

  4. Clique com o botão direito do mouse no nó do projeto e escolha Executar para iniciar o aplicativo Gallery.
  5. No aplicativo Gallery, clique em "Mais" para adicionar imagens e clique em "Menos" para remover imagens.
    Captura de tela do aplicativo Gallery
  6. Feche a janela do aplicativo Gallery.

O projeto Gallery é um aplicativo multithreaded simples que você irá depurar neste tutorial.

Executando o projeto Deadlock

O aplicativo Deadlock contém um método main que inicia um thread, executado durante 500000 milissegundos. O método main inicia dois threads que imprimem na janela Saída quando concluídos.

  1. Escolha Arquivo > Abrir no menu principal.
  2. Localize e selecione o projeto Deadlock no diretório debugging-samples. 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 é um aplicativo Java simples.

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

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

    executar:
    Aplicativo iniciado
    MyThread2 concluído com êxito.
    MyThread1 concluído com êxito.
  4. Permita que o aplicativo finalize normalmente (cinco minutos).

    Quando o aplicativo Deadlock finalizar, será exibido o seguinte na janela Saída.

    Thread principal concluído

O projeto Deadlock é um aplicativo Java simples com dois threads. Quando você depurar o aplicativo, criará um impasse para ilustrar como o IDE pode ajudá-lo a detectar impasses.

Depurando os projetos de amostra

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

Suspendendo threads

Neste exercício, você começa a depuração do aplicativo Gallery e adiciona imagens para iniciar alguns threads do aplicativo. 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 o aplicativo Gallery e abre as janelas de depuração padrão. O IDE abre automaticamente a janela Depuração no lado esquerdo da janela principal e abre o Console do depurador na janela Saída.

  2. Clique três vezes em "Mais" no aplicativo 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.

    Captura de tela da janela 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 visualizar 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 suspenso com os comandos de depuração.

    Captura de tela da janela Depuração com dois threads suspensos

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

A janela Depuração permite que você veja rapidamente e altere o status dos threads na sessão. Por padrão, 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 suspensa na parte superior da janela Depuração para escolher qual sessão será exibida na janela.

Captura de tela da barra de ferramentas da janela Depuração

Alternando threads

Este exercício demonstra o que acontece quando você está avançando passo a passo no aplicativo e um thread diferente do aplicativo atinge um ponto de interrupção. Neste exercício você definirá um ponto de interrupção do método e iniciará o passo a passo no aplicativo. Enquanto estiver avançando passo a passo no aplicativo, 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. Expanda o pacote gallery na janela Projetos e clique duas vezes em Gallery.java para abrir o arquivo no editor.
  2. 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 174.
  3. Clique em "Mais" no aplicativo Gallery para iniciar um novo thread que atingirá o ponto de interrupção do método.
  4. Clique em Passar sobre (F8) duas vezes para iniciar o passo-a-passo pelo método.

    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.

  5. Clique em "Mais" no aplicativo 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 Novo ponto de interrupção atingido 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.

    Captura de tela da notificação Novo ponto de interrupção atingido

    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 Novo ponto de interrupção atingido 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 do aplicativo permanecem inalterados.

    Observação. Se você observar a janela Depuração, poderá verificar que o thread atual (Thread_Jirka) é indicado por uma barra verde na margem. O thread que invocou 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.

    Captura de tela da notificação Novo ponto de interrupção atingido
  6. Clique na seta, na notificação Novo ponto de interrupção atingido, 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.
    Captura de tela do editor mostrando as anotações de depuração
  7. Clique em Passar sobre algumas vezes para avançar passo a passo pelo novo thread atual (Thread_Roman).
  8. 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.
    Captura de tela do editor mostrando o pop-up Definir como thread atual

    Como alternativa, você pode invocar o Seletor de thread atual (Alt+Shift+T) e alternar para qualquer um dos threads do aplicativo.

    Captura de tela do aplicativo 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.

Captura de tela do editor mostrando as anotações de depuração

A janela Depuração permite que você veja e controle com muita precisão os estados dos threads. O depurador gerencia os threads do aplicativo para simplificar o fluxo de trabalho de depuração e para evitar que o processo de depuração crie impasses. Neste exercício, você observou o seguinte comportamento durante a depuração de um aplicativo 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 pelo apilcativo, 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 do aplicativo Gallery. No próximo exercício, você irá depurar o aplicativo Deadlock e usará o IDE para ajudar a detectar o impasse.

Detectando impasses

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

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

  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-fone, 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), poderá verificar que os dois pontos de interrupção estão definidos e ativados.

    Captura de tela do editor que exibe 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.
    Captura de tela da retomada de threads suspensos na janela Depuração

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

  5. Escolha Depurar\Verificar impasse no menu principal para verificar se há impasses nos threads suspensos.
    Captura de tela da retomada de threads suspensos na janela Depuração

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

Este tutorial foi uma introdução básica a alguns dos recursos de depuração do IDE. A janela Depuração permite que você suspenda e retome facilmente os threads ao depurar um aplicativo. Isso pode ser extremamente útil quando você estiver depurando aplicativos multithreaded.



Veja também

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