La puesta a punto de programas es grandemente facilitada por la utilisación de un debugger. El más simple sur gnu: gdb. El más sofisticado: ddd. Los 2 son compatibles, por lo tanto daremos algunas indicaciones para gdb.
g++ -g -o tarea1 tarea1.cpp xgrafico.cpp -lX11 gbd tarea1
g++ -g leemalla.cpp gbd a.out l b 49 run s s s p nv ... quit
Conocer la linea de detención del programa en el caso de un "bug" no es siempre suficiente, ya que la función del problema puede ser llamada desde muchos lugares. Para conocer la secuencia de llamados a las funciones, y por lo tanto para saber cual parte del programa es la culpable de un llamado a la función "exit", el metodo mas simple es utilizar la función "atexit" de la libreria stdlib:
#include <stdlib.h}
...
void myexit()
{
cout << "Fin" << endl;
}
...
void main()
{
atexit(myexit);
...
}
Con esto, en la ejecución del programa via gdb, se pondra un "breakpoint"
en la ligne "cout<<"Fin"..."
de tal modo que el debugger se detendra automaticamente en esta linea en caso
de problema. En efecto, la función atexit(func) fuerza la ejecución
de la fonction func en caso de interrupcion por parte del sistema (tipicamente
por escritura en zonas de memorias protegidas). Luego, cuando el break se produzca,
la función "where" da la lista total de llamados
de función en función hasta llegar a func. Así se puede saber donde
esta el problema. Tambien son utilis las funciones ``up'' y ``down'' que
permiten subir y bajar de funcion en función segun la secuencia de llamados.
Obs: Si se ejecutara el programa simplemente como ./tarea1 y se produjiera algun error entonces el sistema automaticamente generara un archivo llamado core el cual contiene toda la informacion del estado previo a la generación del error. Gracias a este archivo puede invocarse el debugger gdb mediante la instrucción
gdb tarea1 corey con se podra ver que linea se ejecutaba, el estado de las variables, quien llamo a la subrutina que produjo el error, con que parametros, etc.