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.
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.
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.
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):
Incluso puedes crear grupos personalizados para ellos:
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.
Para estos eventos, puede ser útil utilizar la función Pass count. Puedes acceder a ella en el cuadro de diálogo Breakpoints.
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.