Explicação detalhada do uso da IDEA de habilidades de depuração de ponto de interrupção de depuração (com demonstração de animação gif)

"Eu me inscrevi para o primeiro desafio do Golden Stone Project - para dividir o prêmio total de 100.000, este é meu enésimo artigo, clique para ver os detalhes do evento "

prefácio

        Usar pontos de interrupção de depuração para depurar é uma habilidade obrigatória para todo programador. Nosso trabalho diário não é apenas escrever bugs e encontrar bugs de outros! A depuração é uma ótima técnica para solucionar problemas. Com uma dúzia de pontos de interrupção, o problema pode ser resolvido em minutos. Além disso, algumas ferramentas de depuração IDE são muito fáceis de usar, e a ferramenta jdb que vem com o jdk também pode suportar depuração local e depuração remota. Corretamente a melhor ferramenta do ano, mas no que me diz respeito, costumo usar um ponto de interrupção de linha e um ponto de interrupção condicional para solucionar problemas. Embora eu possa solucionar a maioria dos problemas, sempre sinto que não é elegante . processo não é claro.

        Neste artigo, aprenderemos sobre o princípio e as habilidades de depuração de depuração. Com uma demonstração de animação do git, o artigo não apontará as operações básicas de depuração, mas apenas listará algumas habilidades de uso. Acredito que você dominou essas habilidades e sua compreensão da depuração será aprimorada ainda mais, e a eficiência da solução de problemas e solução os problemas inevitavelmente subirão para um nível mais alto.

Visão geral do princípio de depuração

        A operação do depurador JAVA é suportada pelo sistema JPDA (Java Platform Debugger Architecture). Citando a elaboração na documentação oficial, o JPDA é uma arquitetura de depuração multicamada, os desenvolvedores podem criar programas depuradores e esses programas depuradores podem ser executados em plataformas, máquinas virtuais e versões do JDK. Consulte a documentação oficial

JPDA é uma arquitetura de depuração de várias camadas que permite que os desenvolvedores de ferramentas criem facilmente aplicativos depuradores que são executados de forma portátil em plataformas,  implementações de máquinas virtuais (VM)  e versões JDK.

Toda a arquitetura JPDA é mostrada na figura abaixo e está dividida em três partes:

imagem.png

  1. JVM TI (Java VM Tools Interface) é uma nova interface introduzida no J2SE 5.0 que substitui o JVMDI. Escrito em linguagem C, ele define a interface de serviço de depuração fornecida pela VM, que é usada para obter e controlar o estado atual da máquina virtual.
  2. O JDWP (Java Debug Wire Protocol) é escrito em linguagem C e define o formato dos dados de comunicação entre o processo depurado e o depurador.
  3. JDI (Java Debugging Interface) define uma interface de linguagem Java de alto nível que os desenvolvedores de ferramentas de depuração usam para escrever programas depuradores. A ferramenta de depuração do IDEA implementa esse conjunto de APIs para nos fornecer ferramentas úteis.

        O princípio da depuração remota Java é que as duas VMs usam o protocolo JDWP para se comunicar por meio de soquetes para atingir a finalidade de depuração remota. Quando iniciamos a classe em execução no modo de depuração no IDEA, podemos depurar diretamente. O processo é o seguinte:

  1. O cliente IDEA e o terminal vm estabelecem uma conexão de soquete. Use o protocolo JDWP.
  2. O local do ponto de interrupção é criado e o evento do ponto de interrupção é passado para a VM do servidor por meio da interface JDI, e a VM chama suspend para suspender a VM.
  3. Após a suspensão da VM, as informações da VM que o cliente precisa obter são devolvidas ao cliente. Após o retorno, a VM retoma seu estado de execução.
  4. Depois que o cliente obtém as informações retornadas pela VM, elas podem ser exibidas ao usuário de diferentes maneiras.

        下面通过一个动图,看一下IDEA以debug模式运行程序都做了哪些事,首先建立起双向的通信,应用程序通过debug模式运行起来之后,可以通过jps看到启动参数中多了一行,这就是声明了使用jdwp协议,以及一些vm参数。

-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:**55951**,suspend=y,server=n
复制代码

iShot_2022-09-25_18.06.54.gif

        其实远程debug也需要加上这段参数,如何进行远程debug会在最后一个章节中提到,接下来列出一下常用的debug技巧。

断点技巧

字段断点

        如果想要知道某个类的字段属性在哪一行代码被修改了值,就需要使用到字段监视断点。需要注意的是字段监视断点只能打在类字段上,打在引用类型的对象或者集合类型上是不生效的。我们也可以为引用类型的对象属性添加watch监视。

  • 字段监视断点可以帮助我们定位到在哪一行被修改了。
  • 属性watch可以帮助我们捋清楚变量值的变化过程。

        如下图所示,我们为变量a上打了一个字段监视断点,debug运行时,则会停在改变a值的哪一行,我们也可以为这个a值添加watch,以观察这个值变化链上的每一次值改变状况。

fieldWatch (1).gif

方法断点

        当接口有多个实现时,当不知道程序执行走的是哪一个类的实现时,就可以将断点打在接口中的方法上,那么程序运行后可以直接步入到具体的实现类中的方法。

iShot_2022-09-25_11.48.48.gif

        有时候不想在方法里一步步执行,可以直接在方法签名上打断点,断点会在方法的首尾行停留,配合上watch,我们可以看这个方法中究竟做了什么,以及产生了哪些影响。

iShot_2022-09-25_11.54.18.gif

条件断点

        常用于多线程或者请求频繁时,当不断有请求调用当前方法时,我们可以设置条件断点,满足条件时,才会步入断点行,然后对当前请求进一步调试。条件断点怎么打就不用多说了,右键断点,添加条件判断语句,只有true和false两种结果,条件是根据上下文写的。

异常断点

        异常断点在工作中也非常有用,就是因为遇到了异常才去调试程序,那怎么能不用上异常断点呢?平时看到长串的异常堆栈信息,例如最常见的空指针异常,我们都是找到对应是哪一行爆出来抛出的异常,然后慢慢往下跟,找到具体为null的变量,才能找出导致程序退出的根因。

        IDEA的debug工具,提供的异常断点,顾名思义,就是当遇到异常的时候,断点会停在当前行,使用起来也非常简单,只需要添加进对应的异常类型,开启异常断点即可。如下图在空指针异常时断点。以供查看上下文变量的值。

iShot_2022-09-25_16.06.38.gif

多线程断点

        当遇到多线程调试的时候也是个麻烦事儿,因为不知道当前到底是哪一个线程在运行中,所以就需要使用到线程debug了,也是结合条件断点,根据线程名去断下对应的线程。

iShot_2022-09-25_17.05.00.gif

Stream流断点

        大家常用的stream流,写时一时爽,调试火葬场,因为属于流操作,断点无法跟踪到内部,查看相应的值变化,所以当stream复杂的时候,debug起来也是一件头疼的事,但是idea中的跟踪流链功能就非常实用了,他能显示出每一步流操作的输出结果。

iShot_2022-09-25_16.32.48.gif

远程断点

        本地debug调试自然是简单,但是一旦项目部署到服务器上,没有了本地环境,该怎么调试呢?其实有办法,线上的项目可以开启远程调试,如本文开头所讲,其实debug的原理就是两个vm之间的socket通信,加上一串参数就好了,那么我们也可以给线上的服务运行的JAVA_OPTS中加上这段参数,声明好端口即可,例如:

-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:9999,suspend=y,server=n
复制代码

        服务端的vm启动好之后,接着启动客户端的vm,当我们使用IDEA,可以创建一个remote jvm debugger的客户端,用于attach到远程jvm内部,过程如下所示,可以做到如同本地调试一样,调试远程服务了,但是需要注意的是本地的代码一定要和线上运行服务的那一套代码完全相同。

imagem.png

注意事项

  • 一般正式环境不会将远程debug开启,会有安全隐患。
  • Quando o ambiente de teste é depurado remotamente, toda a VM será suspensa, portanto, o serviço está no estágio indisponível, o que afetará o uso normal do serviço por outros desenvolvedores.
  • O tempo de depuração é muito longo, o que pode fazer com que a vm falhe. Portanto, lembre-se de desligar o cliente de depuração a tempo.

おすすめ

転載: juejin.im/post/7147265497396953125