Ler em outros idiomas: English Português 中文
Existem muitos tutoriais de depurador que ensinam como definir pontos de interrupção de linha, registrar valores ou avaliar expressões. Embora esse conhecimento por si só forneça muitas ferramentas para depurar seu aplicativo, os cenários do mundo real podem ser um pouco mais complicados e exigir uma abordagem mais avançada.
Neste artigo, aprenderemos como localizar o código que causa uma falha na IU sem muito conhecimento prévio do projeto e consertar o código quebrado instantaneamente.
Se quiser seguir o exemplo, comece clonando este repositório: https://github.com/flounder4130/debugger-example
Suponha que você tenha um aplicativo complexo que trava quando você executa alguma ação. Você sabe como reproduzir o erro, mas a dificuldade é que você não sabe qual parte do código é responsável por essa funcionalidade.
Em nosso aplicativo de exemplo, a falha ocorre quando você clica no Botão N. Porém, não é tão fácil encontrar o código responsável por esta ação:
Vamos ver como podemos usar o depurador para encontrá-lo.
A vantagem dos pontos de interrupção de método sobre os pontos de interrupção de linha é que eles podem ser usados em hierarquias inteiras de classes. Como isso é útil em nosso caso?
Se você observar o projeto de exemplo, verá que todas as classes de ação são derivadas da interface Action com um único método: perform().
Definir um ponto de interrupção de método neste método de interface suspenderá o aplicativo toda vez que um dos métodos derivados for chamado. Para definir um ponto de interrupção do método, clique na linha que declara o método.
Inicie a sessão de depuração e clique no Botão N. O aplicativo está suspenso no ActionImpl14. Agora sabemos onde está localizado o código correspondente a este botão.
Embora neste artigo estejamos focados em encontrar o bug, essa técnica também pode economizar muito tempo quando você quiser entender como algo funciona em uma grande base de código.
A abordagem com pontos de interrupção de método funciona bem, mas depende da suposição de que sabemos algo sobre a interface pai. E se essa suposição estiver errada ou não pudermos usar essa abordagem por algum outro motivo?
Bem, podemos até fazer isso sem pontos de interrupção. Clique no Botão N e, enquanto o aplicativo trava, vá para o IntelliJ IDEA. No menu principal, selecione Executar | Ações de depuração | Pausar programa.
O aplicativo será suspenso, permitindo-nos examinar o estado atual dos threads na guia Threads & Variables. Isso nos dá uma ideia do que o aplicativo está fazendo naquele momento. Como está travado, podemos identificar o método que está causando o bloqueio e rastreá-lo até o site da chamada.
Essa abordagem tem algumas vantagens sobre um dump de thread mais tradicional, que abordaremos em breve. Por exemplo, ele fornece informações sobre variáveis de uma forma conveniente e permite controlar a execução adicional do programa.
Dica: para obter mais dicas e truques com Pause Program, consulte Depuração sem pontos de interrupção e Debugger.godMode()
Finalmente, podemos usar um dump de thread, que não é estritamente um recurso de depurador. Ele está disponível independentemente de você estar usando o depurador.
Clique no Botão N. Enquanto o aplicativo está travando, vá para IntelliJ IDEA. No menu principal, selecione Executar | Ações de depuração | Obter despejo de thread.
Explore os threads disponíveis à esquerda e em AWT-EventQueue você verá o que está causando o problema.
A desvantagem dos dumps de thread é que eles fornecem apenas um instantâneo do estado do programa no momento em que foram feitos. Você não pode usar dumps de thread para explorar variáveis ou controlar a execução de programas.
Em nosso exemplo, não precisamos recorrer a um dump de thread. No entanto, ainda gostaria de mencionar esta técnica, pois ela pode ser útil em outros casos, como quando você está tentando depurar um aplicativo que foi iniciado sem o agente de depuração.
Independentemente da técnica de depuração, chegamos ao ActionImpl14. Nesta aula, alguém pretendia fazer o trabalho em uma thread separada, mas confundiu Thread.start() com Thread.run(), que executa o código na mesma thread que o código de chamada.
O analisador estático do IntelliJ IDEA até nos avisa sobre isso em tempo de design:
Um método que faz trabalho pesado (ou dorme muito neste caso) é chamado no thread da UI e o bloqueia até que o método termine. É por isso que não podemos fazer nada na UI por um tempo depois de clicar no Botão N.
Agora que descobrimos a causa do erro, vamos corrigir o problema.
Poderíamos parar o programa, recompilar o código e executá-lo novamente. No entanto, nem sempre é aconselhável reimplantar todo o aplicativo apenas porque uma pequena alteração foi feita.
Vamos fazer isso de maneira inteligente. Primeiro, corrija o código usando a solução rápida sugerida:
Depois que o código estiver pronto, clique em Executar | Ações de depuração | Recarregar aulas alteradas. Um balão aparece, confirmando que o novo código chegou na VM.
Vamos voltar ao aplicativo e verificar. Clicar no Botão N não trava mais o aplicativo.
Dica: Lembre-se de que o HotSwap tem suas limitações. Se você estiver interessado em recursos estendidos de HotSwap, pode ser uma boa ideia dar uma olhada em ferramentas avançadas como DCEVM ou JRebel
Usando nosso raciocínio e alguns recursos do depurador, conseguimos localizar o código que estava causando uma falha na interface do usuário em nosso projeto. Em seguida, procedemos à correção do código sem perder tempo com recompilação e redistribuição, o que pode ser demorado em projetos do mundo real.
Espero que as técnicas descritas sejam úteis para você. Deixe-me saber o que você pensa!
Se você estiver interessado em mais artigos relacionados à depuração e criação de perfil, confira alguns dos meus outros artigos:
Fique ligado para mais!
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3