La depuración de errores durante el Desarrollo de Software

jul. 15, 2024

Este artículo forma parte de una serie:

El origen del debugging

El término debugging o depuración de errores, tan familiar en el mundo del desarrollo de software, tiene una historia bastante interesante que se remonta a los primeros días de la computación. La depuración se refiere al proceso de identificar y corregir errores o “bugs” en un programa, y su origen está envuelto en una anécdota que se ha convertido en parte del folklore de la informática.

La historia más conocida sobre el origen del término debugging data de 1947, en los laboratorios de la Universidad de Harvard. Grace Hopper, una de las pioneras de la computación, y su equipo estaban trabajando en la computadora Harvard Mark II. Un día, la máquina comenzó a funcionar de manera errática, al inspeccionar el hardware, encontraron una polilla atrapada entre los relés del computador, lo que causaba los fallos. Después de retirar el insecto, documentaron el incidente en el diario de la computadora como el “primer caso real de depuración” (literalmente, debugging).

Aunque el término bug ya se utilizaba en la ingeniería para referirse a defectos o problemas técnicos, este incidente en la Harvard Mark II popularizó el término “debug” en el contexto de la computación. Desde entonces, debugging se convirtió en una parte fundamental del desarrollo de software, simbolizando tanto la resolución de problemas técnicos como la búsqueda de la perfección en los sistemas computacionales.

Con el avance de la tecnología, las técnicas y herramientas de depuración han evolucionado significativamente. En los primeros días de la programación, los desarrolladores tenían que revisar manualmente el código y utilizar rudimentarios dispositivos de prueba. Con la aparición de lenguajes de programación de alto nivel y entornos de desarrollo integrados (IDE), se han desarrollado herramientas sofisticadas que permiten a los programadores identificar y solucionar errores de manera más eficiente.

La depuración de código es una habilidad esencial para los desarrolladores de software, ya que les permite identificar y corregir errores de manera eficiente, mejorar la calidad del código y garantizar el correcto funcionamiento de las aplicaciones. Aunque depurar un programa puede ser un proceso desafiante y a menudo frustrante, dominar las técnicas y herramientas de depuración es fundamental para convertirse en un programador competente y eficaz.

En este artículo vamos a utilizar un código de ejemplo sencillo en C que depuraremos para identificar y corregir errores. En él código de ejemplo se simulan operaciones de contabilidad básicas, como sumar y restar transacciones, contiene un error intencionado que corregiremos utilizando herramientas de compilación y depuración como gcc y gdb.

Las diferentes fases del proceso de Desarrollo de Software

Durante el proceso de desarrollo de software suelen existir diferentes fases que no tienen porqué ser lineales, sino que pueden solaparse o repetirse y tampoco tienen porqué llevarse a cabo en todas las ocasiones.

  1. Diseño: En esta fase se definen los requisitos y la arquitectura del software.
  2. Implementación: Se escribe el código fuente del programa siguiendo el diseño previamente establecido.
  3. Pruebas: Se realizan pruebas para verificar que el software funciona correctamente y cumple con los requisitos.
  4. Depuración: Se identifican y corrigen errores o “bugs” en el código.
  5. Optimización: Se mejora el rendimiento y la eficiencia del software.
  6. Documentación: Se documenta el código y se elabora la documentación del software.
  7. Despliegue: Se distribuye e instala el software en los sistemas de los usuarios.
  8. Mantenimiento: Se realizan actualizaciones y correcciones en el software para mantenerlo en funcionamiento.

El proceso de depuración de errores suele coincidir con la fase de implementación y pruebas, ya que es en este momento cuando se identifican y corrigen los errores en el código. La depuración es un proceso crítico en el desarrollo de software, ya que los errores pueden tener consecuencias graves en el funcionamiento de las aplicaciones y en la seguridad de los sistemas.

Depurando un software básico de contabilidad en C

Vamos a empezar con un pequeño programa en C que tiene algunas funciones básicas de contabilidad. Nuestro objetivo será identificar y corregir uno de los errores que tiene el código fuente. Este es el programa que realiza operaciones de suma y resta para llevar un registro de las transacciones:


  #include <stdio.h>
  
  void addTransaction(float *balance, float amount) {
      *balance += amount;
  }

  // Error introducido: Usar '+' en lugar de '-'
  void subtractTransaction(float *balance, float amount) {
      *balance += amount;
  }
  
  int main() {
      float balance = 0.0;
      char operation;
      float amount;
  
      printf("Welcome to the Accounting Program\n");
      printf("Enter transaction (format: + 100 or - 50):\n");
  
      while (1) {
          scanf(" %c %f", &operation, &amount);
  
          if (operation == '+') {
              addTransaction(&balance, amount);
          } else if (operation == '-') {
              subtractTransaction(&balance, amount);
          } else {
              printf("Invalid operation. Use + or -\n");
          }
  
          printf("Current balance: %.2f\n", balance);
      }
  
      return 0;
  }
  

Proceso de compilación

Primero, compilaremos el programa con gcc utilizando la opción -g para incluir información de depuración:

  
  gcc -g accounting.c -o accounting
  

Ejecución del programa

Una vez compilado, puedes ejecutar el programa con el siguiente comando en la terminal:

  
  ./accounting
  

Al ejecutar el programa, verás una salida similar a la siguiente:

  
  Welcome to the Accounting Program
  Enter transaction (format: + 100 or - 50):
  

Auí puedes introducir transacciones en el formato + 100 para sumar 100 al balance o - 50 para restar 50 al balance (o eso debeŕia). Sin embargo, si intentas introducir una operación inválida, el programa no te lo permitirá.

Ejemplo de Ejecución

Veamos un ejemplo de ejecución del programa:

  
  Welcome to the Accounting Program
  Enter transaction (format: + 100 or - 50):
  + 100
  Current balance: 100.00
  - 50
  Current balance: 150.00
  * 25
  Invalid operation. Use + or -
  Current balance: 150.00
  

En este ejemplo, hemos sumado 100 al balance, restado (que en realidad se suma) 50 y tratado de multiplicar por 25, lo que ha resultado en una operación inválida.

Depuración con gdb

Ahora vamos a utilizar el depurador gdb para identificar y corregir errores en el programa. Para iniciar gdb, simplemente ejecuta el siguiente comando en la terminal:

  
  gdb ./accounting
  

Una vez que gdb esté en funcionamiento nos aparecerá el texto (gdb) al inicio de línea de nuestra terminal, puedes utilizar los siguientes comandos para depurar el programa:

  • run: Inicia la ejecución del programa.
  • break <line_number>: Establece un punto de interrupción en la línea especificada.
  • next: Ejecuta la siguiente línea de código.
  • print <variable>: Imprime el valor de la variable especificada.
  • step: Ejecuta la siguiente línea de código, entrando en funciones si es necesario.
  • quit: Sale de gdb.
  • help: Muestra la lista de comandos disponibles.

Ejemplo de Depuración

Vamos a depurar el programa para identificar y corregir el error que se produce en la función subtractTransaction. Primero, estableceremos un punto de interrupción en la línea donde se llama a esta función.

  
  (gdb) break subtractTransaction
  

Nos indicará que se ha establecido un punto de interrupción en la función subtractTransaction, un punto de interrupción es un lugar en el código donde el programa se detendrá para que podamos inspeccionar su estado. También nos mostrará la dirección de memoria de la función subtractTransaction junto a información adicional:


  Punto de interrupción 1 at 0x11c3: file accounting.c, line 8.
  

Utiliza el comando run para ejecutar el programa:

  
  (gdb) run
  

En la entrada del programa, escribe - 50 tras haber añadido una suma positiva para activar el punto de interrupción en subtractTransaction. Utiliza el comando next para avanzar por el código dentro de la función:

  
  (gdb) next
  

Podrás observar en el código como en realidad tiene un error ya que en vez de utilizar el símbolo de resta, utiliza el de suma. Para corregirlo, simplemente cambia el operador de la operación += por -= en la línea 8 del código. Si imprimes el valor de *balance y amount tras haber introducido los valores en la terminal verás que el balance se incrementa en lugar de disminuir.


  (gdb) print *balance
  (gdb) print amount
  

Ahora que hemos localizado el error sólo faltaría corregirlo y volver a compilar el programa para comprobar que funciona correctamente. Una vez hecho, el programa debería funcionar correctamente y permitirte realizar operaciones de suma y resta de forma adecuada.

Este es un ejemplo faćil de ver, incluso sin necesidad de herramientas de depuración, pero nos ha servido para ilustrar el proceso de depuración desde sus cimientos y cómo se puede utilizar estas herramientas para identificar y corregir errores en el código. En el próximo artículo veremos cómo hacer el debug aprovechando las herramientas de un IDE moderno, lo que nos facilita enormemente el proceso de depuración de código para así tener un ¡Happy Coding!

¿Te ha sido útil?

Tu apoyo contribuye a que sigamos compartiendo conocimiento actualizado. Si encuentras valor en nuestros artículos, considera ayudarnos a mantener el blog en marcha. 🤗

Artículos relacionados

Quizá te puedan interesar

Nuestro trabajo

De concepto a realidad

project-thumb
Mantente al día con las últimas noticias tecnológicas y nuestro podcast semanal. BetaZetaNews
project-thumb
Hazte entender en múltiples idiomas con solo presionar un botón gracias a BuddyLingo. BuddyLingo
project-thumb
Aventuras sin límites generadas por IA dónde tus elecciones dan forma a la historia. LAIA
project-thumb
Controla fácilmente y en profundidad las horas que dedicas a tu empleo y/ó proyectos. Sé dueño de tu tiempo. WorkIO