Código de depuración - Debug code

El código de depuración es un código de computadora introducido en un programa de computadora para probar errores o ayudar a determinar la causa de un error. Puede ser tan simple como un comando de eco para imprimir el valor de una variable en ciertos puntos de un programa. Los entornos de desarrollo integrados modernos a veces hacen que esto sea innecesario al permitir la ubicación de puntos de parada en lugares específicos del programa y brindar la capacidad de ver el valor de las variables a través del IDE en lugar de la salida del programa.

Usos del código de depuración

La función principal del código de depuración es ayudar a depurar el código. Esto puede hacer esto de varias formas, como mediante el uso de declaraciones de impresión, comandos de aserción y pruebas unitarias.

Uso en codificación

Se pueden agregar pequeñas declaraciones al código para encontrar la presencia y la ubicación de errores dentro de un programa. También se puede utilizar para proporcionar entradas de prueba para simular posibles casos de uso que un programa podría necesitar para poder aceptar. También se puede utilizar como marcador de posición para el código que aún está en desarrollo.

Usar en videojuegos

Muchas modificaciones de videojuegos, códigos de trampas , como el código de trampa de nivel , invencibilidad , etc., se introdujeron originalmente como código de depuración para permitir a los programadores y / o probadores omitir obstáculos que les impedirían llegar rápidamente a partes del juego que necesitaban. ser probado; y en estos casos, los modos de trampa a menudo se denominan modo de depuración .

Se recomienda como práctica recomendada eliminar el código de depuración de las versiones de producción de las aplicaciones, ya que puede ralentizarlas. Sin embargo, algunos juegos dejan estos comandos y trucos disponibles para que los jugadores los utilicen como una forma de mejorar su experiencia de juego. Por ejemplo, la versión para PC de Skyrim permite al jugador acceder a la consola de comandos, dándoles la capacidad de modificar ciertos aspectos de su juego mientras se ejecuta. Estos comandos incluyen dar al jugador invencibilidad, teletransportación y oro ilimitado.

Ejemplos de código de depuración

Depuración de impresión

La depuración de impresión hace uso de declaraciones de impresión para encontrar y aislar errores en un programa. Puede usarse para rastrear el flujo de valores de datos de un fragmento de código. Este tipo de código de depuración tiene algunas desventajas. Es temporal y generalmente se elimina cuando se resuelve el error. El uso de muchas sentencias de impresión puede afectar la salida real de un programa y ralentizar el tiempo de ejecución, dependiendo de la frecuencia con la que se llamen las sentencias de impresión. En algunos casos, las declaraciones de impresión no ayudan a encontrar el problema, por ejemplo, la salida estándar de C ++ tiene una salida almacenada en el búfer y, a veces, el contenido del búfer se pierde, lo que genera información de depuración incorrecta.

Ejemplo de C ++

void TestFunction(int timesToRun) {
  cout << "the algorithm should run " << timesToRun << " times" << std::endl;
  for (int i = 0; i <= timesToRun; i++) {
    // run algorithm
    algorithm();
    // debug print statement
    cout << "algorithm run " << i++ << " times." << std::endl;
  }
}

Hay un error en el código anterior. Con una entrada de 5, el programa debería imprimir lo siguiente en la consola.

the algorithm should run 5 times
algorithm run 1 times.
algorithm run 2 times.
algorithm run 3 times.
algorithm run 4 times.
algorithm run 5 times.

La salida real es la siguiente, que es incorrecta.

the algorithm should run 5 times
algorithm run 1 times.
algorithm run 2 times.
algorithm run 3 times.
algorithm run 4 times.
algorithm run 5 times.
algorithm run 6 times.

Nuestra función está ejecutando el algoritmo un tiempo adicional, y tras una inspección más cercana, queda claro que nuestro ciclo está codificado incorrectamente.

Afirmar declaraciones

Por lo general, el mejor momento para corregir un error es antes de ejecutar el programa. Esto se puede hacer insertando aserciones en el código. En C, esto se puede hacer usando el comando assert (). Un comando de aserción puede verificar si el programa se está ejecutando en las condiciones correctas en este punto del programa.

C ejemplo

int i, a[10];
for (i = 0; i < 10; ++i)
{
  a[i] = 10-i;
}
for (i = 0; i < 10; ++i)
{
  a[a[i]] = a[i];
}

El código anterior provocará un error fuera de límites que puede dar lugar a resultados inesperados. El código se puede escribir de una manera más segura, utilizando aserciones, como se muestra a continuación.

#include <assert.h>
int i, a[10];
for (i = 0; i < 10; ++i)
{
  assert(0 <= i && i < 10);
  a[i] = 10-i;
}
for (i = 0; i < 10; ++i)
{
  assert(0 <= i && i < 10);
  assert(0 <= a[i] && a[i] < 10);
  a[a[i]] = a[i];
}

JUnit

JUnit es un marco simple que se utiliza para escribir pruebas repetibles disponibles para Java y permite a los programadores crear su propia prueba unitaria. Una prueba unitaria es un código que se escribe para ejecutar una función específica en el código que se va a probar y, por lo general, tiene como objetivo una pequeña unidad de código, como un solo método o clase. Utilizando una combinación de declaraciones de aserción y otras declaraciones de prueba, los programadores pueden crear conjuntos de casos de prueba para saber si un método o función se está ejecutando correctamente.

Referencias