El proceso normal para desarrollar programas de computadora es más o menos así: escribir un código, compilar el código, ejecutar el programa. Si el programa no funciona como se esperaba, vuelve al código para buscar errores (bugs) y repite el ciclo nuevamente.
Dependiendo de la complejidad del programa y la naturaleza de los errores, hay ocasiones en las que puede necesitar ayuda adicional para rastrear los errores. Esto es lo que hace un «depurador». Le permite examinar un programa de computadora mientras se está ejecutando. Puede ver los valores de las diferentes variables, puede examinar el contenido de la memoria y puede detener el programa en un punto específico y recorrer el código una línea a la vez.
El depurador principal en Linux es el depurador GNU (gdb). Es posible que ya esté instalado en su sistema (o una versión reducida llamada gdb-minimal), pero para asegurarse, escriba el siguiente comando en una terminal:
Para usar el depurador, debe decirle al compilador que incluya información de depuración en el binario. Cree un archivo llamado «hello10.c» usando nano:
Copia y pega el siguiente código:
#include <stdio.h> main() { int i; for(i=0;i<10;i++) printf("%d",i); }
El indicador «-g» le dice al compilador que produzca información de depuración, por lo que para compilar el uso del programa:
gcc -g -o hello10 hello10.c
Para comenzar a depurar el tipo de programa:
En este punto, si simplemente comienza a ejecutar el programa (usando el comando «ejecutar»), el programa se ejecutará y finalizará antes de que tenga la oportunidad de hacer algo. Para detener eso, debe crear un «punto de interrupción» que detendrá el programa en un punto específico. La forma más fácil de hacer esto es decirle al depurador que se detenga en la función «main()»:
Ahora inicia el programa:
El depurador se ha detenido en la primera línea de código ejecutable, por ejemplo, el bucle «for». Para pasar a la siguiente línea, escriba «siguiente» o «n» para abreviar. Sigue usando «siguiente» para repetir el bucle un par de veces:
Para inspeccionar el valor de una variable, use el comando «imprimir». En nuestro programa de ejemplo, podemos examinar el contenido de la variable «i»:
Repita alrededor del bucle y unas cuantas veces más y vea cómo cambia «i»:
next next next next print i
En el ejemplo anterior, «i» ha alcanzado el valor de 4. El ciclo continuará mientras «i» sea menor que 10. Puede cambiar el valor de una variable usando «set var». Escriba lo siguiente en gdb para establecer «i» en 10.
set var i = 10 print i next
Es posible que deba hacer otro «siguiente» (dependiendo de dónde se detuvo el programa cuando configuró «i» en 10), pero cuando la línea de bucle «for» se ejecute a continuación, el bucle se cerrará, porque «i» no es más largo menos de 10.
El comando «siguiente» no profundiza en las funciones, sino que la función se ejecuta y el depurador se detiene nuevamente en la siguiente línea después de la función. Si desea ingresar a una función, use el comando «paso», o «s» para abreviar.
Otra forma de depurar su programa es establecer un reloj en una variable. Lo que esto hace es detener el programa cada vez que cambia la variable. Reinicie el programa nuevamente escribiendo «ejecutar». Como el programa ya se está ejecutando, el depurador le preguntará si desea volver a iniciarlo desde el principio.
El programa se detendrá en main (ya que no eliminamos el punto de interrupción). Ahora pon un reloj en «i»:
El comando «continuar» hace que el programa vuelva a ejecutarse hasta la siguiente condición de punto de interrupción. En este caso volverá a funcionar hasta que cambie la variable «i» (debido al reloj).
Para detener la depuración, simplemente use el comando «salir».
Si desea obtener más información sobre gdb, entonces un buen lugar para comenzar es el Documentación del BGF. Si tiene algún problema con los ejemplos anteriores, utilice la sección de comentarios a continuación y veremos si podemos ayudarlo.