JavaRush /Blog Java /Random-ES /IntelliJ IDEA y Debug: no bucear, sino hacer snorkel
Viacheslav
Nivel 3

IntelliJ IDEA y Debug: no bucear, sino hacer snorkel

Publicado en el grupo Random-ES
Escribir código es la mitad de la batalla. Todavía hay que hacer que funcione correctamente. Los IDE y las herramientas de depuración nos ayudan mucho con esto.
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 1
Usando IntelliJ IDEA como ejemplo, propongo familiarizarnos con cómo podemos saber qué sucede con nuestro código cuando se ejecuta. La depuración es un tema amplio, por lo que esta revisión no ofrece buceo profundo, como un buceador. Pero espero hacer snorkel seguro)

Introducción

Parte de escribir código es depurarlo. Y si sus tareas incluyen soporte de código, habrá aún más depuración. Bueno, además, con la ayuda de la depuración, puedes examinar el trabajo de las bibliotecas y marcos utilizados tan profundamente como sumergirte en la jungla del código de otra persona. Para nuestra inmersión necesitaremos: Primero, descomprima el archivo descargado con el código fuente de inicio rápido. Inicie IntelliJ Idea y cree un " Nuevo proyecto a partir de fuentes existentes ". Seleccione el archivo pom.xml en el subdirectorio hibernate4 . Al importar, especifique " Importar proyectos Maven automáticamente " y complete la creación del proyecto, dejando otras configuraciones sin cambios. Mientras se importa el proyecto, descomprima el servidor de aplicaciones WildFly descargado en algún directorio. Iniciamos el servidor usando el archivo (o standalone.sh para sistemas *nix). (!) Es importante comenzar con el parámetro --debug , esperamos a que se inicie el servidor. Nos escribirán que empezó en y nos indicarán la hora. Se verá algo como esto: bin\standalone.bat
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 2
A continuación, debemos ejecutar el proyecto que hemos elegido en el servidor. Este proceso se describe en una pequeña documentación que se puede encontrar en el propio proyecto: \hibernate4\README.adoc Como se indica en esta documentación, necesitamos ejecutar el comando en el directorio hibernate4: mvn clean package wildfly:deploy Estamos esperando un mensaje de que la compilación se completó con éxito:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 3
Tras esto, en el log del servidor podremos ver cómo se ha “implementado” el nuevo proyecto:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 4
Después de eso, vamos a la página http://localhost:8080/wildfly-hibernate4y deberíamos mostrar una página con el formulario de “ Registro de miembros ”. Entonces, nuestra preparación para los experimentos está completa y podemos comenzar)) Habrá muchas imágenes más adelante para mayor claridad, así que prepárese)

Depuración remota

Entonces, necesitamos configurar el modo de depuración para que nuestro IDE controle la ejecución del código en el servidor de aplicaciones. IntelliJ Idea viene en dos versiones: gratuita (Community) y de pago (Ultimate). Este último puede probarse oficialmente en forma de EAP. En la versión Ultimate, todo es simple: el servidor de aplicaciones se puede iniciar directamente desde el IDE en modo de depuración. Pero en la versión comunitaria debes hacer algunas cosas manualmente. Por tanto, consideremos un caso más complicado, es decir. configuración en la versión comunitaria. La versión comunitaria tiene algunas limitaciones. En particular, no puede ejecutar un servidor de aplicaciones desde él. Pero puede configurar la depuración remota (Remote Debug), cuando en algún lugar separado hay un servidor en ejecución con la aplicación que necesitamos. Usemos la descripción de la configuración desde aquí: Depuración remota de Wildfly en la edición comunitaria IntelliJ Idea (configuración de configuración de ejecución remota para el puerto 8787). Después de la configuración, lanzamos nuestra nueva configuración en modo Debug:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 5
Si todo está bien, veremos un mensaje sobre esto a continuación:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 6

Proceso de depuración

Depuremos guardando el registro. Para ello, primero debemos decidir el lugar donde exploraremos. A juzgar por la ventana, necesitamos un botón "Registrarse". Busquémoslo en el código. Entonces, necesitamos un elemento, debería tener el texto: "Registrarse". O ella debería tener algo que ver con eso. Haga clic Ctrl+Shift+Fy busque Registrarse entre comillas. Vemos que hay uno en index.xhtml.
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 7
Presione Enter para ir a la fuente encontrada:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 8
Entonces vemos que al registrarse se llama a memberController.register , aparentemente debe ser algún tipo de clase java. Haga clic Ctrl+Ny busque:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 9
De hecho, existe tal clase. Entremos en ello. Aparentemente, debería haber un método de registro. Haz clic Ctrl+F12y busca el método de registro.
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 10
De hecho, lo encontramos. Aparentemente, el registro se produce aquí, en memberRegistration.register . Presione Ctrl y haga clic en el método para "caer" en él:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 11
Establezcamos ahora un “punto de interrupción” o Break Point. Este es un marcador que indica dónde debe pausarse la ejecución del código. En este momento tendremos la oportunidad de aprender muchas cosas interesantes. Para ponerlo, debe hacer clic en el lugar a la derecha del número de línea.
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 12
En la página http://localhost:8080/wildfly-hibernate4 complete los campos y haga clic en el botón Registrarse. El icono de idea en el panel parpadeará:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 13
Al ir a Idea, puede ver que hay mucha información interesante en el panel de depuración:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 14
Aquí puede ver el valor de los campos del objeto. Por ejemplo, en qué consiste un Miembro registrado:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 15
Excelente. qué más podemos hacer? Podemos abrir el menú contextual y seleccionar Evaluar expresión allí (o mediante el menú Ejecutar -> Evaluar expresión). Mejor aún, en el panel de control del depurador:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 16
Esta es una habilidad genial en un punto de interrupción, tener acceso a todo a lo que tiene acceso ese punto de código, para ejecutar cualquier código que pueda ejecutarse en ese punto. Por ejemplo:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 17
También hay botones de control en el panel de control del depurador que son responsables de dónde desea mover el control de flujo del programa. ¿No es mágico?) Al presionar el botón F8 (Salir), recorremos el código sin ingresar métodos. Al presionar F9, dejamos de recorrer las líneas de código con el depurador y le damos al depurador control sobre la ejecución del programa. Si presionamos F7 (Step Into), revisaremos el código, ingresando cada método que encontremos en el camino. Por cierto, presta especial atención a este bloque de información:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 18
Esto muestra el hilo en el que estamos y los métodos en la pila del hilo actual. Pero eso no es todo. Para mayor comodidad, puede abrir la pestaña de marcos. Para ello se debe habilitar:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 19
Ahora en la pestaña Marcos vemos información sobre la transición de un método a otro, porque Comencé a recorrer el código usando Step Into.
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 20
Como vemos, no siempre podemos ser trasladados al lugar donde se está ejecutando actualmente el programa. Ahora estamos en "getDelegate:469, AbstractEntityManager(org.jboss.as.jpa.container)". Pero, de hecho, estamos en implementación. Esto se evidencia en la clase especificada por esto:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 21
Miremos esto. Como sabemos, apunta al objeto actual. Estamos en TransactionScopedEntityManager. ¿Por qué Idea no puede mostrarnos el código? El hecho es que IntelliJ Idea actualmente no conoce ningún TransactionScopedEntityManager, porque no está conectado a nuestro proyecto (no está en las dependencias del proyecto). Cuando se ejecuta un servidor de aplicaciones, hay muchísimas bibliotecas diferentes ejecutándose en su interior. Pero sabemos muy poco sobre ellos, porque... En general, no necesitamos profundizar en lo interno, sólo necesitamos que funcione. Pero a veces el trabajo o el interés deportivo lo requiere. Luego, debe informar a Idea sobre esta biblioteca para que sepa dónde obtener el código de clase.

Conexión de bibliotecas de terceros para depuración

Primero, nosotros mismos debemos entender qué tipo de biblioteca es la que necesita estar conectada. La primera forma es la más difícil: buscar en Internet. La velocidad y el resultado de encontrar un resultado dependen en gran medida de qué tan bien se gestionó el proyecto. Por ejemplo, WildFly tiene un repositorio abierto. Entonces, cuando busquemos en Google "TransactionScopedEntityManager", iremos a https://github.com/wildfly/wildfly/tree/master/jpa/subsystem y encontraremos que necesitamos wildfly-jpa. El segundo método es correcto. Donde está el servidor, mira allí. Varios medios pueden ayudar con esto. Por ejemplo, en Windows podría ser Far Manager . A continuación se muestra un ejemplo de un algoritmo de búsqueda. Una vez instalado y ejecutado, use Tab para cambiar a una de las pestañas, usando Alt+F1la pestaña izquierda o Alt+F2la derecha, y seleccione la partición que necesitamos en el disco duro. Es muy posible que el directorio de Far Manager esté abierto en Far Manager después de la instalación. Para ir a la raíz del disco, presione Ctrl + \. Usando, Alt+Fabra la ventana de búsqueda, comience a escribir el nombre del directorio y presione Entrar después de encontrar el directorio. Esta búsqueda es inteligente y resalta aquellos directorios que coinciden con el texto de búsqueda. Si ingresa caracteres para los cuales no hay carpetas, dichos caracteres no se podrán ingresar. De esta manera nos dirigimos al directorio del servidor de aplicaciones. Digamos que no sabemos dónde están ubicados los módulos en el servidor. Quizás esta sea la primera vez en tu vida que oyes hablar de algún tipo de WildFly. Por lo tanto, haga clic inmediatamente aquí Alt+F7para buscar archivos. Entonces, la lógica dicta: necesitamos un archivo con la biblioteca. Es decir, necesitamos un frasco. Debería haber una clase TransactionScopedEntityManager dentro. Porque clase = archivo, luego busque "contiene". Es decir, algo como esto:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 22
Ahora esperemos el resultado. Él no te hará esperar)
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 23
Ahora, necesitamos encontrar el código fuente en alguna parte. Y hay 2 opciones: Utilicemos, quizás, el segundo. Busquemos allí:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 24
Pasemos ahora a describir la dependencia. En esta página puedes descargar el código fuente. Genial, ahora tenemos el código descargado. Ya sólo queda conectar la biblioteca. Se conecta de forma extremadamente sencilla. Necesitamos abrir la configuración del proyecto:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 25
Allí seleccionamos "Bibliotecas" y agregamos los códigos fuente recibidos a la sección "Fuentes", y en la sección "Clases" indicamos el archivo jar de la biblioteca del directorio WildFly, que encontramos usando Far Manager. Después de esto, cuando naveguemos por F7, veremos el contenido de las clases AbstractEntityManager y TransactionScopedEntityManager, y también estarán disponibles mediante una búsqueda por clase usando Ctrl+N.

Puntos de ruptura con condiciones

Volvamos ahora a los puntos de ruptura. A veces, no siempre queremos parar, sino sólo bajo alguna condición. ¿Qué hacer? Y aquí nuestro IDE también nos ayudará. Al colocar un punto de interrupción, podemos asignarle una condición. Por ejemplo, pon un punto y haz clic derecho sobre él:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 26
Ahora el punto de interrupción solo se activará cuando el nombre sea Maximilian. Al hacer clic en el botón Más, tendrá a su disposición un conjunto ampliado de configuraciones para puntos de interrupción.

Puntos de ruptura en excepciones

A veces podemos recibir un error y queremos rastrear de dónde viene. Luego podemos agregar un punto de interrupción no en una línea de código específica, sino en el lugar donde se generará la excepción. Para hacer esto, debe expandir la lista de todos los puntos de interrupción:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 27
Y cree una nueva regla para el tipo de excepción seleccionado:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 28
Por ejemplo, para NPE:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 29

Clases HotSwap

El depurador es algo asombroso. ¡Además de depurar, te permite cambiar de clase! Sí, los recursos (como las páginas xhtml, por ejemplo) no se pueden cambiar tan fácilmente. Pero el código de las clases de Java se puede reemplazar sobre la marcha (esto se llama Hot Swap). Para hacer esto, simplemente cambie la clase con el depurador adjunto y ejecute Ejecutar -> Recargar clases cambiadas. Revisión útil sobre este tema: 4 formas gratuitas de intercambiar código en caliente en la JVM

Conclusión

Un depurador es una herramienta poderosa que permite al desarrollador penetrar en las profundidades del código en ejecución y estudiarlo en cada detalle. Esto le permite corregir los errores más confusos. También le permite comprender mejor cómo funcionan determinadas bibliotecas. Incluso una reseña tan breve resultó bastante impresionante, pero espero que sea útil e interesante. Si alguien está interesado en este material, puede continuar la inmersión utilizando los siguientes enlaces:
IntelliJ IDEA y Debug: No bucear, sino hacer snorkel - 30
#viacheslav
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION