Depurar sem Pontos de Interrupção
Outras línguas: English 中文 Español
Em um cenário típico de depuração, você definiria pontos de interrupção para indicar ao depurador quando suspender seu programa. Um ponto de interrupção geralmente corresponde ao momento que marca o ponto de partida para uma investigação mais aprofundada.
Decidir onde definir um ponto de interrupção pode ser desafiador. Pode haver situações em que a linha exata não esteja clara, ou você pode preferir pausar o programa com base no tempo, em vez de um código específico.
![Post banner](/img/debug-without-breakpoints-banner.png)
Neste artigo, vamos dar uma olhada na funcionalidade Pause Program do IntelliJ IDEA – uma técnica de depuração menos conhecida que pode ser extremamente poderosa em alguns cenários, inclusive nos descritos acima. Discutiremos seus casos de uso e limitações, além de descobrir o segredo do passo a passo.
O que é Pause?
Pause Program é uma funcionalidade do depurador do IntelliJ IDEA que permite pausar arbitrariamente sua aplicação em qualquer ponto no tempo. Além disso, você nem precisa conhecer o código da aplicação. Na verdade, você pode simplesmente ignorá-lo!
![Botão 'Pause Program' na barra de ferramentas do depurador](/img/pause-button.png)
![Botão 'Pause Program' na barra de ferramentas do depurador](/img/pause-button-dark.png)
Para pausar um programa, clique em Pause Program na barra de ferramentas do depurador. Então, o programa será interrompido bem no meio do que estiver a fazer.
Limitações
À primeira vista, um programa em pausa pode parecer exatamente como aquele que foi suspenso em um ponto de interrupção. No entanto, isso só é verdade até certo ponto.
![Depurador parece igual, independentemente se a pausa ou um ponto de interrupção foi usado para suspender o aplicativo](/img/paused-program.png)
![Depurador parece igual, independentemente se a pausa ou um ponto de interrupção foi usado para suspender o aplicativo](/img/paused-program-dark.png)
Seria correto considerar Pause Program uma espécie de thread dump mais. Você ainda pode inspecionar tão variáveis quanto threads da forma que normalmente faria. Porém, algumas das funcionalidades mais avançadas, como Evaluate Expression, não funcionarão.
Casos de uso
Existem inúmeras maneiras de usar Pause Program. Frequentemente, pode ser usado de forma intercambiável com os pontos de interrupção tradicionais. Contudo, há cenários onde usar Pause Program é uma abordagem mais adequada. Vamos considerar alguns deles.
Aplicativos irresponsivos
Se você encontrar um congelamento da interface do usuário (UI), isso geralmente se deve ao bloqueio da thread da UI.
![A pilha da thread bloqueada da UI mostra qual método está sendo executado atualmente](/img/inspect-blocked-thread.png)
![A pilha da thread bloqueada da UI mostra qual método está sendo executado atualmente](/img/inspect-blocked-thread-dark.png)
Pause Program poderia ser útil nesse caso, pois permite pausar a aplicação enquanto ela está irresponsiva e examinar a pilha de chamadas da thread da UI. Isso é geralmente suficiente para diagnosticar o problema.
Fontes ausentes
Como mencionado anteriormente, Pause Program permite que você simplesmente ignore o código fonte, que pode estar ausente para você de qualquer maneira. Embora este cenário não seja muito comum, quando você depara com ele, os pontos de interrupção não seriam de nenhuma ajuda.
É aqui que Pause Program entra em ação!
![meme do gato do hehe](/img/hehe.png)
Travas
Se você suspeitar de um problema de sincronização, como um deadlock ou um livelock, Pause Program pode ajudá-lo a encontrar as threads e travas exatas que estão causando o problema.
![A lista de threads mostra quais threads acabaram em um impasse](/img/debug-locks-with-pause.png)
![A lista de threads mostra quais threads acabaram em um impasse](/img/debug-locks-with-pause-dark.png)
Neste caso, pause o programa e inspecione a lista de threads. Ela mostrará quais threads estão bloqueadas. Ao navegar até o ponto de execução, você também verá as seções críticas em que estão trancadas. Essas informações podem ajudar a orientá-lo em direção a uma solução.
Dica secreta de passo a passo
Como mencionei anteriormente, Pause Program limita seu acesso a algumas das funcionalidades avançadas do depurador. Se você tentou usar certas funcionalidades enquanto uma aplicação está pausada, você pode ter visto uma mensagem de erro que diz Cannot evaluate methods after Pause action.
![Uma mensagem de erro dizendo 'Não é possível avaliar métodos após a Pausa'](/img/debugger-god-mode/cannot-evaluate-after-pause.png)
![Uma mensagem de erro dizendo 'Não é possível avaliar métodos após a Pausa'](/img/debugger-god-mode/cannot-evaluate-after-pause-dark.png)
No entanto, há um atalho para essa restrição.
Depois de ter pausado uma aplicação, prossiga executando qualquer ação passo a passo. Step Into ou Step Over servirão. Feito isso, você estará em uma sessão de depuração regular, semelhante a quando você suspende uma aplicação usando um ponto de interrupção. Todas as funcionalidades avançadas estão agora desbloqueadas!
Conclusão
É isso por hoje! Espero que você ache estas dicas e truques úteis.
Se houver algo específico sobre a depuração em Java que você queira que eu aborde, não hesite em entrar em contato! A sua opinião ajudará na priorização e publicação do conteúdo que é mais interessante para você.