Ejecución en depuración
La ejecución para depuración difiere considerablemente de la ejecución normal. Para poder depurar un programa, este debe ser cargado indirectamente a travez de una herramienta denominada "depurador" (en este caso gdb). Esta herramienta carga el ejecutable en memoria y analiza la información de depuración contenida en el mismo. Permite luego definir puntos de interrupción para posteriormente comenzar la depuración. Cuando la ejecución se detiene, el depurador permite, mediante la interpretación de la información de depuración extraida anteriormente del ejecutable, asociar el estado del programa con su código fuente, pudiendo extraer el contenido de variables, observar la pila de llamadas a funciones en terminos de los nombres de funciones definidos en los fuentes, identificar bloques de código, etc.
En ZinjaI, para depurar un programa, se debe ejecutar el mismo utilizando la opción Iniciar del menú Depuración. Esta opción carga el depurador, indicandole que se va a depurar el proyecto/programa actual, activa todos los puntos de interrupción, y comienza la ejecución. Es por esto que el usuario debe definir los puntos de interrupción antes de comenzar la depuración.
Cuando el programa se está ejecutando en modo depuración, puede detenerse por diferentes motivos:
- Se alcanzo un punto de interrupcion: cuando la ejecución del programa llega a una instrucción correspondiente a la linea en la que se definió un punto de interrupción, el depurador detiene el programa justo antes de ejecutar esta instrucción. Ver Puntos de Interrupcion.
- Se leyó modifico el valor de una inspeccion definida como watchpoint: un watchpoint permite detener el programa cuando este intenta leer o modificar el valor de una variable. Ver Inspecciones.
- Se recibio una señal: el programa puede recibir señales del sistema operativo. Algunas de ellas simplemente pausan la ejecución, pudiendo luego reanudarse, mientras que otras la detienen totalmente (por ejemplo, un segfault si el programa realiza una operacion en memoria no permitida). Las segundas se reconocen porque la flecha que indica el punto de ejecución en el margen del código fuente se presenta en rojo.
- Se interrumpe la ejecución mediante la opción Interrumpir del menú Depuración: esta opción permite detener el programa en cualquier momento (actualmente solo esta disponible en GNU/Linux).
Cuando el programa se ha detenido, se indica con una flecha en el margen del código fuente, cual sería la próxima linea a ejecutar si se reanudase la ejecución. En este punto, se pueden utilizar distintas herramientas (como las inspecciones o el trazado inverso) para analizar su estado, definir nuevos puntos de interrupcion o watchpoints, o continuar la ejecución de alguna de las siguientes maneras:
- Continuar la ejecución hasta la proxima interrupción, mediante la opción la opción Iniciar/Continuar del menú Depuración.
- Ejecutar solo una linea, de la funcion/metodo actual, mediante la opción la opción Step Over del menú Depuración. Si la linea a ejecutar incluye la llamada a algún método o función, este se ejecuta completamente.
- Ejecutar hasta la proxima linea ejecutable, mediante la opción Step In del menú Depuración. Esta opción se diferencia de la anterior en que si la linea que se va a ejecutar incluye la llamada a algun método o función directa o indirectamente (puede ser un constructor, o mediante la sobrecarga de un operador), el depurador detendrá la ejecución en la primer línea de este método o función.
- Ejecutar hasta salir de la función o el método actual, mediante la opción Step Out del menú Depuración. El depurador continuará ejecutando lo que resta de la función o el método, y se detendrá en linea que sigue a la línea que invocó a la función o método.
- Salir inmediatamente de la función o el método actual, mediante la opción Return del menú Depuración. Esta opción, a diferencia de la anterior, no continua ejecutando lo que resta de la función, sino que la interrumpe como si ejecutará un return. Para ello, ZinjaI solicitará el valor de retorno que la función devolverá al salir.
Es importante notar que la ejecución paso a paso (mediante Step In y Step Out) se controla a nivel de número de linea. Si una línea de código fuente consta de dos o más instrucciones, es imposible detenerse en medio de las mismas. Es útil considerar esto a la hora de escribir o acomodar un código para depuración.
Finalmente, cabe resaltar que si el ejecutable ha sido optimizado en compilación, el compilador puede haber reordenado algunas instrucciones, suprimido otras, eliminado variables no utilizadas, ect; por lo que el comportamiento del programa en el depurador puede parecer extraño. Es recomendable desactivar todas las optimizaciones para depurar un programa. En los proyectos de ZinjaI, el nivel de optimización del ejecutable se define en la pestaña Enlazado del cuadro de Configuración de proyecto.