Introducción a Flutter
Flutter es un framework de desarrollo de aplicaciones móviles creado por Google, utiliza el motor de …
leer másEl 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
.
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.
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.
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;
}
Primero, compilaremos el programa con gcc
utilizando la opción -g
para incluir información de depuración:
gcc -g accounting.c -o accounting
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á.
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.
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.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!
Quizá te puedan interesar
Flutter es un framework de desarrollo de aplicaciones móviles creado por Google, utiliza el motor de …
leer másEn el vasto universo de la programación existen principios que, aunque no sean mandamientos, son una …
leer másIntroducción En los capítulos anteriores de nuestra serie sobre Flutter, hemos establecido una …
leer másDe concepto a realidad