Funciones básicas del depurador Con frecuencia, los alumnos piensan que cuando su programa no tiene errores de compilación (está correctamente escrito) entonces ya es correcto. Muchas veces esto no es así. Es más, en la mayoría de los casos, al ejecutar el programa por primera vez se produce algún fallo, que llamamos fallos de ejecución. A pesar de que el programa está bien escrito, no hace lo que tenía que hacer y el resultado es incorrecto. Empieza entonces una de las tareas más difíciles para los programadores primerizos: identificar y subsanar los errores de ejecución. Para realizar esta tarea, el depurador (debugger) es una ayuda inestimable. En esta práctica aprenderás algunas de las funcionalidades más básicas. Al finalizar esta práctica serás capaz de: Ejecutar un programa paso a paso Establecer y eliminar puntos de parada, y ejecutar un programa hasta el siguiente punto de parada Observar el valor de las variables de tu programa durante la ejecución Como en prácticas anteriores, lo ideal es tener abierto en la pantalla del ordenador el documento que contiene este guión, e ir realizando en secuencia cada uno de los pasos. Es posible que debas consultar de vez en cuando el manual de Dev-C++ (en particular, la parte que habla de la depuración. Paso 1 Crea una carpeta en la unidad C: del ordenador, en la que trabajaras durante esta práctica. Paso 2 Crea un proyecto a partir del siguiente código en lenguaje C (si tienes abierto este documento en pantalla, te resultará cómodo hacer copy y paste). /* Este programa calcula el mayor de cuatro numeros */ void main () { int a=10, b=5, c=15, d=21; int mayor1, mayor2, mayor; if (a > b) mayor1 = a; else mayor1 = b; if (c > d) mayor2 = c; else mayor2 = d; if (mayor1 > mayor2) mayor = mayor1; else mayor = mayor2; } 1 Para calcular el mayor de los cuatro números, el programa calcula el mayor de los dos primeros (y lo deja en mayor1) calcula el mayor de los dos siguientes (y lo deja en mayor2), y después compara los “ganadores” para seleccionar el mayor de todos que dejará en mayor. Observa que las variables iniciales a, b, c y d han sido inicializadas con constantes en la propia declaración de variables. Paso 3 Compila y monta el programa, y déjalo listo para ejecutar. Si lo ejecutas ahora no veras nada porque el programa no escribe nada en pantalla. Eso tiene fácil arreglo porque basta añadir al final una sentencia para escribir en pantalla el valor de la variable mayor. Pero eso lo dejamos para luego. Paso 4 En primer lugar tienes que comprobar que está activada la opción de generar información de depuración. Vete a Proyecto/Opciones del proyecto/Parámetros y comprueba que en la ventana del compilador aparecen las opciones: _DEBUG D DEBUG D _DEBUG Si no es así, inclúyelas y pulsa Aceptar. Una vez hecho esto estamos preparados para utilizar el depurador de Dev-C++. Paso 5 Correr tu programa en el depurador es fácil. Simplemente ve al menú Depurar y haz clic en Depurar (o presiona F8). Si no tienes establecida la información para poder depurar en tu proyecto, Dev-C++ te pedirá si quieres reconstruir tu proyecto con dicha información activada. En ese caso comprueba que has realizado correctamente el paso 4. Si todo está correcto, el depurador ha cargado ahora tu programa y lo ejecuta, pero antes debes aprender a controlar varios aspectos del depurador: • Estableciendo puntos de ruptura en tu código 2 • Ejecución paso a paso de tu código • Mostrando el valor de las variables y miembros de clases y estructuras • Retroseguimiento • Usando la ventana del CPU (procesador) Paso 6: estableciendo Puntos de Ruptura en tu código Puedes usar Puntos de Ruptura para pausar tu programa en cierta instrucción (línea de código). Para añadir un Punto de Ruptura, selecciona primero la línea de código donde quieres parar. Ahora haz clic en el menú Depurar y luego en Añadir / Quitar Punto de Ruptura (o pulsando Ctrl+F5). Haciendo clic en la barra en el margen izquierdo del editor a la altura de la línea tendrá el mismo efecto que los pasos anteriores: Cuando cargue el depurador, si tu programa ejecuta la línea de código con el Punto de Ruptura, Dev-C++ te avisará que se ha llegado a la línea cambiándola el color del fondo a azul: Ahora puedes examinar los datos en tu programa o ejecutar paso a paso tu programa. Paso 7: ejecución paso a paso de tu programa Una vez que se llegue a un Punto de Ruptura, puedes saltar pasos en tu programa de las distintas formas siguientes: Siguiente Paso (o presionando F7) : El depurador dará un paso a la siguiente instrucción (línea de código) en tu programa. Avanzar Paso a Paso (o presionando Shit+F7) : El depurador saltará una instrucción. Si esa instrucción es una llamada a una función saltará a ella. Saltar Paso (o presionando Ctrl+F7) : El depurador continuará la ejecución del programa hasta que haya un Punto de Ruptura o el Final del código. 3 Paso 8: Mostrando valores de variables y miembros de clases y estructuras Depurar es interesante también por la posibilidad de mostrar el valor de las variables observadas en un determinado instante. Dev-C++ te permite ver en una conveniente manera, los contenidos de tus clases, cadenas, estructuras/uniones, arrays y otras variables, en el Explorador de Depuración de Variables, como el ejemplo mostrado en la figura: Puedes observar tus variables (cuando se llega a un punto de ruptura) de dos formas distintas: Haciendo clic en el botón Añadir Watch (o presionando F4), y escribiendo el nom- bre de la variable en el diálogo, y presionando Aceptar. Si seleccionas una palabra en el código fuente y presionas F4, se añadirá la variable observada sin preguntar por el nombre. Apuntando con el ratón sobre una variable en tu código fuente si la opción Observar la variable seleccionada (apuntada por el ratón) está activada en Opciones del Entorno y se añadirá a la lista de variables observadas. Paso 9 Haz varias ejecuciones del programa modificando los valores iniciales de las variables a, b, c y d, y verifica, mediante una ejecución paso a paso, que el programa siempre hace el camino correcto. Ten presente que cada vez que cambies los valores iniciales de las variables tendrás que volver a compilar y montar el programa. Paso 10 Modifica el programa para que los valores iniciales de las variables se introduzcan por teclado (añadiendo las sentencias scanf necesarias), y para que el resultado se escriba en pantalla (mediante una sentencia printf). No olvides hacer el #include de la librería necesaria. Paso 11 Ejecuta paso a paso la nueva versión del programa. Observarás que llega un momento en que por más que pulses F7, el programa no avanza. Se ha quedado “atascado” en la primera sentencia scanf. El programa ha abierto una ventana de DOS y está esperando a que introduzcas el valor que debe leer. Localiza esa ventana e introduce el valor, y verás como el programa avanza a la siguiente sentencia. 4 Paso 12 Pulsa F8 una vez más para entrar en modo ejecución paso a paso, y añade (con la opción añadir watch o las alternativas vistas anteriormente) los nombres de las variables mayor1, mayor2 y mayor (una variable en cada línea). Puedes observar que en el caso de mayor2 aparece un valor extraño, que es el valor que tiene inicialmente la variable, antes de ser inicializada (por eso no debemos usar nunca el valor de una variable que no haya sido inicializada convenientemente). Si prosigues ahora la ejecución paso a paso, observarás que en la ventana “Depurar” se muestran los cambios que van produciéndose en los contenidos de las variables. 5