Depuración 'printf' Mejorada

Otros idiomas: English 한국어 Português 中文

Una de las técnicas de depuración más comunes, la depuración con ‘printf’ es particularmente popular porque la mayoría de las personas la aprende de forma intuitiva cuando escriben sus primeros programas.

La depuración ‘printf’ es muy accesible porque no necesitas ninguna herramienta especial para ella. Cuando te enfrentas a tus primeros bugs, incluso antes de que sepas qué es un depurador, lo natural es hacer que tu programa imprima variables paso a paso, para que puedas seguir la ejecución en la consola.

Aunque es una de las técnicas de depuración más básicas, los desarrolladores experimentados también la usan mucho. Puede ayudarte a investigar cualquier tipo de problema, como rutinas subóptimas, estado inconsistente, problemas de multithreading, y más.

Como ya mencioné, esta técnica no requiere que uses ninguna herramienta especial, como un IDE. Sin embargo, si estás usando uno, puede hacer que seas aún más eficiente en el registro del estado del programa.

Info icon

Este artículo muestra características de IntelliJ IDEA. Es posible que características similares estén o no disponibles en otros IDEs. Si estás utilizando una herramienta diferente, considera consultar su documentación para ver si estas características también están presentes.

Live templates

IntelliJ IDEA proporciona live templates para los patrones de registro de depuración más comunes. Para usar una plantilla en vivo para el registro de depuración, introduce la abreviatura correspondiente y presiona Tab. IntelliJ IDEA generará la sentencia de impresión y la insertará en el cursor.

Veamos un par de ejemplos.

Registrar parámetros de método


public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {

    // escriba 'soutp' aquí, luego presione Tab

    return null;
}
public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {

    System.out.println("in = " + in + ", mask = " + mask + ", newColor = " + newColor);

    return null;
}

Registrar valores


public static double coolMethod(double parameter) {
    double a = Math.random();
    double b = Math.random();

    // escriba 'soutv' aquí, presione Tab y luego seleccione el valor

    return a * b * parameter;
}
public static double coolMethod(double parameter) {
    double a = Math.random();
    double b = Math.random();

    System.out.println("b = " + b);

    return a * b * parameter;
}

Registrar entradas de método


public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {

    // escriba 'soutm' aquí

    return null;
}
public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {

    System.out.println("ImageUtils.recolor");

    return null;
}

Puntos de interrupción de registro

Una de las desventajas de depurar con sentencias de impresión es que introducen la sobrecarga de la gestión manual. No puedes encenderlos y apagarlos rápidamente, y definitivamente no quieres cometer el error de enviarlos y ejecutarlos en producción.

Por esta razón, si necesitas registrar algo para fines de depuración, recomendaría usar puntos de interrupción de registro, ya que son mucho más fáciles de manejar.

El punto de interrupción de registro se muestra como un círculo amarillo en el margen del editor El punto de interrupción de registro se muestra como un círculo amarillo en el margen del editor

Para establecer un punto de interrupción de registro, mantén presionada Shift, luego haz clic en el margen. A diferencia de un punto de interrupción regular, no suspende la ejecución del programa, sino que imprime en la consola.

Por defecto, es un mensaje que indica que el programa ha llegado a esta línea. También puedes usar las opciones cerca de la casilla de verificación Evaluate and log en la configuración del punto de interrupción si prefieres registrar la traza de pila actual o el resultado de una expresión personalizada.

La ventana de diálogo de configuración de puntos de interrupción con una expresión personalizada en el campo 'Evaluate and log', y la casilla de verificación 'Suspend' desmarcada La ventana de diálogo de configuración de puntos de interrupción con una expresión personalizada en el campo 'Evaluate and log', y la casilla de verificación 'Suspend' desmarcada
Info icon

Ten cuidado con las expresiones de registro. Evaluar las que causan efectos secundarios puede ser una fuente de nuevos bugs o comportamientos inesperados. Además, cuando se utilizan en código caliente, podrían ralentizar significativamente tu programa.

Cuando los puntos de interrupción de registro se vuelven numerosos, puedes hacer un seguimiento y administrarlos en el cuadro de diálogo de Breakpoints (Run | View Breakpoints):

El diálogo 'Breakpoints' muestra todos los puntos de interrupción dentro del proyecto agrupados por tipo El diálogo 'Breakpoints' muestra todos los puntos de interrupción dentro del proyecto agrupados por tipo

Incluso puedes crear grupos personalizados para ellos:

Haciendo clic derecho en un punto de interrupción en el diálogo 'Breakpoints' se muestra un menú de contexto con la opción 'Move to group' Haciendo clic derecho en un punto de interrupción en el diálogo 'Breakpoints' se muestra un menú de contexto con la opción 'Move to group'

Esto te ayudará a administrar tus puntos de interrupción de manera centralizada. Por ejemplo, puedes crear un grupo relacionado con un bug en particular y guardarlo para más tarde. Cuando el problema desaparece, simplemente lo apagas. De esta manera, si el problema vuelve a aparecer, no tienes que recrear todo desde cero. Simplemente vuelves a encender el grupo.

Registro de eventos frecuentes

Para los eventos que ocurren mucho durante la ejecución del programa, es posible que registrar cada evento individualmente sea superfluo. Esto no solo inunda la consola con mensajes, sino que una gran cantidad de interacción con I/O puede ralentizar significativamente la sesión de depuración.

Consola con muchos mensajes similares, como 'Mouse moved to 380, 183' Consola con muchos mensajes similares, como 'Mouse moved to 380, 183'

Para estos eventos, puede ser útil utilizar la función Pass count. Puedes acceder a ella en el cuadro de diálogo Breakpoints.

Cuadro de diálogo de configuración de puntos de interrupción con el campo 'Pass count' establecido en 100 Cuadro de diálogo de configuración de puntos de interrupción con el campo 'Pass count' establecido en 100

Después de haber establecido Pass count en un valor específico, el correspondiente punto de interrupción sólo se activará cada vez que se alcance n-veces, asegurando que el registro no se convierta en una molestia.

Resumen

Independientemente de si estás insertando declaraciones de impresión o configurando puntos de interrupción de registro para depuración, las herramientas modernas tienen características para mejorar tu experiencia de depuración. Con esta publicación, quería asegurarme de que estás al tanto de estos pequeños trucos que hacen que todo el proceso sea más agradable.

all posts ->