Digamos que tenemos una función como esta:
public void myStart()
{
for (int i = 0; i<10; i++) myFunction(i);
}
private int myFunction(int a)
{
a = foo(a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
//something gnarly here
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
Ahora, por alguna razón, nuestro código no funciona. Tal vez está arrojando un error, tal vez está devolviendo el valor incorrecto, tal vez se ha quedado atascado en un bucle infinito.
Lo primero que un programador de primer año es imprimir en consola / std out (habiendo aprendido a imprimir Hello World antes de aprender a usar un depurador).
Por ejemplo, para depurar este código, podrían hacer lo siguiente:
private int myFunction(int a)
{
print("before foo: a=" + a);
a = foo(a);
print("before bar: a=" + a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
print ("foo step1: a=" + a);
//something gnarly here
print ("foo step2: a=" + a + " someOtherValue="+ someOtherValue + " array.length= " + someArray.length());
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
Ahora que ejecutan el código, obtienen una gran impresión de la consola, que pueden atravesar para rastrear dónde van las cosas mal.
Una alternativa, por supuesto, es establecer puntos de interrupción y recorrer el código en cada punto.
Una de las principales ventajas de imprimir en la consola es que el desarrollador puede ver el flujo de los valores de una vez, sin tener que hacer clic en los pasos, etc.
Pero la desventaja es que su código está lleno de todas estas declaraciones de impresión que luego deben eliminarse.
(¿Es posible tal vez decirle al depurador que imprima solo ciertos valores en un registro ?, los puntos de interrupción se pueden agregar o eliminar fácilmente sin modificar el código).
Todavía uso la impresión de consola como método principal de depuración, me pregunto qué tan común / efectivo es esto en comparación con algo más.
Respuestas:
Las declaraciones impresas y el depurador no son mutuamente excluyentes. Son solo diferentes herramientas disponibles para localizar / identificar errores. Hay quienes afirman que nunca tocan un depurador y hay quienes no tienen una sola declaración de registro / impresión en ninguna parte del código que escriben. Mi consejo es que no quieras estar en ninguno de esos grupos.
En cambio, aprenda a usar el registro y aprenda a usar un depurador. Con experiencia, (casi sin tener que pensarlo) elegirá la herramienta adecuada y hará el trabajo con precisión y eficiencia. Sin experiencia, a veces elegirás uno sobre el otro, y tal vez te lleve un poco más de tiempo analizar las variables o examinar los archivos de registro, pero eso es parte del proceso de aprendizaje.
Entonces, para responder a su pregunta específica. Si. El uso de impresiones para rastrear la ejecución es una estrategia de depuración buena y ampliamente utilizada. Sin embargo...
En lugar de usar declaraciones impresas, considere usar un marco de registro. Los marcos de registro tienen un concepto de niveles de registro para que pueda agregar un montón de mensajes de registro, pero elija un nivel para cada uno. Cuando su aplicación se está ejecutando en condiciones normales, su nivel sería ERROR o ADVERTENCIA para que solo se informen cosas importantes. Sin embargo, cuando rastrea el código y necesita comprender el flujo de ejecución, puede cambiar el registrador a INFO o DEBUG y ahora todas esas declaraciones de "impresión" que ya tiene en el código informarán información adicional.
Usando un marco de registro ...
Actualización: Acabo de darme cuenta al final de que estaba preguntando: "¿Es posible quizás decirle al depurador que imprima solo ciertos valores en un registro". Dependiendo de qué depurador use. Muchos depuradores modernos le permiten definir una acción para invocar cuando se alcanza un punto de interrupción. En algunos (he hecho esto en VS y WinDbg), es posible especificar "imprimir esto y reanudar". Visual Studio los llama "puntos de rastreo" en lugar de "puntos de interrupción"
fuente
El registro / impresión y los depuradores son técnicas complementarias que tienen diferentes fortalezas y debilidades: es mejor usar ambas. Pero en general, diría que los depuradores son la herramienta superior en la mayoría de los casos y deben usarse primero, con el registro / impresión solo para las cosas en las que es realmente mejor.
Ventajas de los depuradores:
Ventajas de registro / impresión:
fuente
Imprimir en una salida estándar de alguna manera puede ser una buena estrategia para depurar su código, por ejemplo
Utilizo muchas declaraciones impresas para ver qué sucede en los diferentes niveles de mi código, especialmente si no entiendo completamente el error
o tal vez el error no tiene información detallada que pueda indicarme qué parte del código está causando el problema exactamente.
Sin embargo, debe acostumbrarse a las herramientas de depuración, existen muchas opciones dependiendo del idioma o la plataforma que utilice.
También otro método es el registro, registro los errores todo el tiempo cuando trabajo en aplicaciones de Android, también con el manejo de excepciones, uno puede registrar fácilmente un seguimiento de la pila o un mensaje de error de la excepción que se genera.
fuente