PRÁCTICAS DE SISTEMAS OPERATIVOS

MANEJO DEL DEPURADOR


Cuando se producen errores en tiempo de ejecución, hay que depurar el programa. El error en tiempo de ejecución se debe habitualmente a un mal diseño de nuestro programa. Para corregir errores en tiempo de ejecución, hay que proceder en dos pasos:
  1. Acotar al máximo la parte del código fuente que está fallando.
  2. Una vez se sabe en qué zona del programa se está produciendo el error, hay que proceder a solucionarlo. Para ello, hay que enfrentar el comportamiento esperado con el comportamiento que en realidad sucede. Hay que plantear una hipótesis de lo que está fallando, y con esta hipótesis, modificar el programa de modo que la próxima ejecución sea diferente en el caso de que la hipótesis sea verdadera o no.

A veces, al no disponer de otras herramientas o debido a la simplicidad de la prueba, se puede simplemente modificar el código fuente incluyendo alguna orden que imprima el valor de alguna variable, un mensaje, etc. Sin embargo, es preferible usar un programa que se denomina depurador (debugger). En el servidor, podéis usar el depurador de GNU, el gdb.

Veamos un ejemplo: queremos usar el depurador con un programa que se llama limpiador.c.

Análisis de un fichero core

El depurador sirve también para analizar la causa de la producción de un fichero core. Por ejemplo, si introducimos el siguiente código:
void main(void)
   {char array[13];

    array[10000000]='J';} 
Lo compilamos y lo ejecutamos, se produce un acceso ilegal a memoria que se ve reflejado en la interrupción del programa y la generación de un fichero core. Este fichero contiene la información acerca del punto en que se interrumpió y la causa por la que se interrumpió el programa1:
<T>/usuarios/gyermo/PRIVADO/SO/PRACTS/CORE$ gcc -g prueba.c -o prueba
<T>/usuarios/gyermo/PRIVADO/SO/PRACTS/CORE$ prueba
Memory fault(coredump)
<T>/usuarios/gyermo/PRIVADO/SO/PRACTS/CORE$ ls -l
total 522
-rw-------   1 gyermo     profes      185820 Feb 29 00:55 core
-rwxr-xr-x   1 gyermo     profes       68896 Feb 29 00:55 prueba
-rw-r--r--   1 gyermo     profes          64 Feb 29 00:55 prueba.c 
Para analizar la causa de la detención del programa sólo hay que ejecutar el depurador especificando el fichero core como segundo argumento:
<T>/usuarios/gyermo/PRIVADO/SO/PRACTS/CORE$ gdb prueba core
Wildebeest is free software and you are welcome to distribute copies of
[...]
Copyright 1996, 1997 Free Software Foundation, Inc...
Core was generated by `prueba'.
Program terminated with signal 11, Segmentation fault.

warning: The shared libraries were not privately mapped; setting a
breakpoint in a shared library will not work until you rerun the program.

#0  0xbf54 in main () at prueba.c:4
4           array[10000000]='J';}
#0  0xbf54 in main () at prueba.c:4
4           array[10000000]='J';} 
A partir de ahí, se puede usar otras órdenes del depurador, lo que es muy interesante, pues se puede inspeccionar variables, mirar el estado de la pila de llamadas a funciones (back)...
1 En algunos sistemas, en particular en muchos Linuxes, la generación de ficheros core está desactivada por defecto para no desperdiciar espacio del disco duro, pues un usuario normal no se dedica a depurar los programas que fallan. Para activar la generación de ficheros core, hay que escribir: ulimit -c unlimited
© 2020 Guillermo González Talaván.