JavaRush /Blogue Java /Random-PT /IntelliJ IDEA e Debug: não mergulho, mas mergulho com sno...
Viacheslav
Nível 3

IntelliJ IDEA e Debug: não mergulho, mas mergulho com snorkel

Publicado no grupo Random-PT
Escrever código é metade da batalha. Ainda precisa ser feito para funcionar corretamente. IDEs e ferramentas de depuração nos ajudam muito nisso.
IntelliJ IDEA e Debug: Não mergulho, mas mergulho com snorkel - 1
Usando o IntelliJ IDEA como exemplo, proponho conhecer como podemos descobrir o que acontece com nosso código quando ele é executado. A depuração é um tópico amplo, portanto esta revisão não oferece um mergulho profundo como um mergulhador. Mas espero que mergulhe com snorkel com certeza)

Introdução

Parte da escrita do código é depurá-lo. E se suas tarefas incluírem suporte de código, haverá ainda mais depuração. Bem, além disso, com a ajuda da depuração, você pode examinar o trabalho das bibliotecas e estruturas usadas tão profundamente quanto mergulhar na selva do código de outra pessoa. Para o nosso mergulho precisaremos de: Primeiro, descompacte o arquivo baixado com o código-fonte do Quick Start. Inicie o IntelliJ Idea e crie “ Novo projeto a partir de fontes existentes ”. Selecione o arquivo pom.xml no subdiretório hibernate4 . Ao importar, especifique “ Importar projetos Maven automaticamente ” e conclua a criação do projeto, deixando as demais configurações inalteradas. Enquanto o projeto está sendo importado, descompacte o servidor de aplicativos WildFly baixado em algum diretório. Iniciamos o servidor usando o arquivo (ou standalone.sh para sistemas *nix). (!) É importante começar com o parâmetro --debug , aguardamos o servidor iniciar. Eles nos escreverão informando que tudo começou e indicarão a hora. Vai parecer algo assim: bin\standalone.bat
IntelliJ IDEA e Debug: Não mergulho, mas mergulho com snorkel - 2
A seguir, precisamos executar o projeto que escolhemos no servidor. Este processo está descrito em uma pequena documentação que pode ser encontrada no próprio projeto: \hibernate4\README.adoc Conforme indicado nesta documentação, precisamos executar o comando no diretório hibernate4: mvn clean package wildfly:deploy Estamos aguardando uma mensagem informando que a compilação foi concluída com sucesso:
IntelliJ IDEA e Debug: Não mergulho, mas mergulho com snorkel - 3
Depois disso, no log do servidor podemos ver como o novo projeto foi “implantado”:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 4
Depois disso, vamos para a página http://localhost:8080/wildfly-hibernate4e devemos exibir uma página com o formulário “ Registro de Membro ”. Então, nossa preparação para os experimentos está completa e podemos começar)) Haverá muitas fotos pela frente para maior clareza, então prepare-se)

Depuração remota

Portanto, precisamos configurar o modo Debug para que nosso IDE controle a execução do código no servidor de aplicação. O IntelliJ Idea vem em duas versões: gratuita (Community) e paga (Ultimate). Este último pode ser julgado oficialmente na forma de EAP. Na versão Ultimate, tudo é simples - o servidor de aplicativos pode ser iniciado diretamente do IDE no modo de depuração. Mas na versão Community você precisa fazer algumas coisas manualmente. Portanto, vamos considerar um caso mais complicado, ou seja, configuração na versão comunitária. A versão comunitária tem algumas limitações. Em particular, você não pode executar um servidor de aplicativos a partir dele. Mas você pode configurar a depuração remota (Depuração Remota), quando em algum lugar separado houver um servidor em execução com o aplicativo que precisamos. Vamos usar a descrição da configuração aqui: Depuração remota do Wildfly na edição da comunidade IntelliJ Idea (configurando a configuração de execução remota para a porta 8787). Após a configuração, lançamos nossa nova configuração no modo Debug:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 5
Se tudo estiver bem, veremos uma mensagem sobre isso abaixo:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 6

Processo de depuração

Vamos depurar o salvamento do registro. Para fazer isso, devemos primeiro decidir o local que iremos explorar. A julgar pela janela, precisamos de um botão “Registrar”. Vamos encontrá-lo no código. Então, precisamos de um elemento, ele deve ter o texto: “Cadastre-se”. Ou ela deveria ter algo a ver com isso. Clique Ctrl+Shift+Fe procure Cadastre-se entre aspas. Vemos que existe um em index.xhtml.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 7
Pressione Enter para ir para a fonte encontrada:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 8
Então, vemos que ao se registrar, memberController.register é chamado, aparentemente deve ser algum tipo de classe java. Clique Ctrl+Ne pesquise:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 9
Na verdade, existe tal classe. Vamos lá. Aparentemente, deveria haver um método de registro. Clique Ctrl+F12e procure o método de registro
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 10
Na verdade, nós encontramos. Aparentemente, o registro ocorre aqui, em memberRegistration.register . Pressione Ctrl e clique no método para “cair” nele:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 11
Vamos agora definir um “break point” ou Break Point. Este é um marcador que indica onde a execução do código deve ser pausada. Neste momento teremos a oportunidade de aprender muitas coisas interessantes. Para colocá-lo, você precisa clicar no local à direita do número da linha.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 12
Na página http://localhost:8080/wildfly-hibernate4 preencha os campos e clique no botão Registrar. O ícone da ideia no painel piscará:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 13
Indo para Idea, você pode ver que há muitas informações interessantes no painel de depuração:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 14
Aqui você pode ver o valor dos campos do objeto. Por exemplo, em que consiste um Membro registrado:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 15
Ótimo. O que mais podemos fazer? Podemos abrir o menu de contexto e selecionar Avaliar Expressão (ou através do menu Executar -> Avaliar Expressão). Melhor ainda, no painel de controle do depurador:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 16
Essa é uma habilidade super legal em um breakpoint, ter acesso a tudo que aquele code point tem acesso, para executar qualquer código que possa ser executado naquele ponto. Por exemplo:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 17
Existem também botões de controle no painel de controle do depurador que são responsáveis ​​por onde você deseja mover o controle de fluxo do programa. Não é mágico?) Ao pressionar o botão F8 (Step Out), percorremos o código sem inserir métodos. Ao pressionar F9, paramos de percorrer as linhas de código com o depurador e damos ao depurador controle sobre o progresso do programa. Se pressionarmos F7 (Step Into), percorreremos o código, inserindo cada método que encontrarmos ao longo do caminho. A propósito, preste atenção especial a este bloco de informações:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 18
Isso mostra o thread em que estamos e os métodos na pilha do thread atual. Mas isso não é tudo. Por conveniência, você pode abrir a guia de quadros. Para fazer isso, ele deve estar habilitado:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 19
Agora na aba frames vemos informações sobre a transição de método para método, pois comecei a percorrer o código usando Step Into.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 20
Como vemos, nem sempre podemos ser transferidos para onde o programa está sendo executado. Estamos agora em "getDelegate:469, AbstractEntityManager(org.jboss.as.jpa.container)". Mas, na verdade, estamos em implementação. Isso é evidenciado pela classe especificada por isto:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 21
Vejamos isso. Como sabemos, aponta para o objeto atual. Estamos em TransactionScopedEntityManager. Por que a Idea não pode nos mostrar o código? O fato é que o IntelliJ Idea atualmente não conhece nenhum TransactionScopedEntityManager, porque não está conectado ao nosso projeto (não está nas dependências do projeto). Quando um servidor de aplicativos está em execução, há muitas bibliotecas diferentes em execução nele. Mas sabemos muito pouco sobre eles, porque... em geral, não precisamos nos aprofundar nos aspectos internos, só precisamos que funcione. Mas às vezes o trabalho ou o interesse esportivo exigem isso. Então, você precisa informar o Idea sobre esta biblioteca para que ele saiba onde obter o código da classe.

Conectando bibliotecas de terceiros para depuração

Primeiro, nós mesmos precisamos entender que tipo de biblioteca precisa ser conectada. A primeira forma é a mais difícil - pesquisar na Internet. A velocidade e o resultado de encontrar um resultado dependem muito de quão bem o projeto foi gerenciado. Por exemplo, WildFly possui um repositório aberto. Então, quando pesquisarmos “TransactionScopedEntityManager” no Google, iremos para https://github.com/wildfly/wildfly/tree/master/jpa/subsystem e descobriremos que precisamos de wildfly-jpa. O segundo método está correto. Onde está o servidor, olhe lá. Vários meios podem ajudar nisso. Por exemplo, no Windows poderia ser Far Manager . Abaixo está um exemplo de algoritmo de pesquisa. Depois de instalado e iniciado, use Tab para alternar para uma das guias, usando Alt+F1a guia esquerda ou Alt+F2direita, e selecione a partição que precisamos no disco rígido. É bem possível que o próprio diretório Far Manager esteja aberto no Far Manager após a instalação. Para ir para a raiz do disco, pressione Ctrl + \. Usando, Alt+Fabra a janela de pesquisa, comece a digitar o nome do diretório e pressione Enter após o diretório ser encontrado. Esta pesquisa é inteligente e destaca os diretórios que correspondem ao texto da pesquisa. Se você inserir caracteres para os quais não há pastas, esses caracteres não poderão ser inseridos. Desta forma vamos para o diretório do servidor de aplicação. Digamos que não sabemos onde os módulos estão localizados no servidor. Talvez esta seja a primeira vez na sua vida que você ouve falar de algum tipo de WildFly. Portanto, clique imediatamente aqui Alt+F7para procurar arquivos. Então, a lógica dita: precisamos de um arquivo com a biblioteca. Ou seja, precisamos de uma jarra. Deve haver uma classe TransactionScopedEntityManager dentro. Porque class = arquivo e procure por “contém”. Ou seja, algo assim:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 22
Agora vamos esperar o resultado. Ele não vai deixar você esperando)
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 23
Agora, precisamos encontrar o código-fonte dele em algum lugar. E existem 2 opções: Vamos usar, talvez, o segundo. Vamos encontrar lá:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 24
Agora vamos descrever a dependência. Nesta página você pode baixar o código fonte. Ótimo, agora baixamos o código. Resta conectar a biblioteca. Ele se conecta de forma extremamente simples. Precisamos abrir as configurações do projeto:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 25
Lá selecionamos “Bibliotecas” e adicionamos os códigos-fonte recebidos à seção “Fontes”, e na seção “Classes” indicamos o próprio arquivo jar da biblioteca do diretório WildFly, que encontramos usando o Far Manager. Após isso, ao navegarmos por F7, veremos o conteúdo das classes AbstractEntityManager e TransactionScopedEntityManager, e também ficarão disponíveis através de uma busca por classe usando Ctrl+N.

Pontos de interrupção com condições

Voltemos agora aos Break Points. Às vezes, nem sempre queremos parar, mas apenas sob alguma condição. O que fazer? E aqui nosso IDE também nos ajudará. Ao colocar um Break Point, podemos atribuir uma condição a ele. Por exemplo, coloque um ponto e clique com o botão direito nele:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 26
Agora o breakpoint só será acionado quando o nome for Maximilian. Ao clicar no botão Mais, um conjunto expandido de configurações para pontos de interrupção estará disponível para você.

Pontos de interrupção em exceções

Às vezes podemos receber um erro e queremos rastrear de onde ele vem. Então podemos adicionar um ponto de interrupção não em uma linha específica de código, mas no local onde a exceção será lançada. Para fazer isso, você precisa expandir a lista de todos os pontos de interrupção:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 27
E crie uma nova regra para o tipo de exceção selecionado:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 28
Por exemplo, para NPE:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 29

Aulas de HotSwap

O depurador é uma coisa incrível. Além de depurar, permite alterar classes! Sim, recursos (como páginas xhtml, por exemplo) não podem ser alterados tão facilmente. Mas o código das classes Java pode ser substituído instantaneamente (isso é chamado de Hot Swap). Para fazer isso, basta alterar a classe com o depurador anexado e executar Executar -> Recarregar Classes Alteradas. Revisão útil sobre este tópico: 4 maneiras gratuitas de fazer hot-swap de código na JVM

Conclusão

Um depurador é uma ferramenta poderosa que permite ao desenvolvedor penetrar nas profundezas do código em execução e estudá-lo em todos os detalhes. Isso permite corrigir os erros mais confusos. Também permite que você entenda melhor como funcionam certas bibliotecas. Mesmo uma breve revisão revelou-se bastante impressionante, mas espero que seja útil e interessante. Se alguém estiver interessado neste material, pode continuar o mergulho através dos seguintes links:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 30
#Viacheslav
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION