Logo DIE

Depuración de Programas

Unidad de Apoyo para el Aprendizaje

Iniciar

Introducción


Cuando se escriben programas, es normal cometer errores (bugs). De hecho, en promedio, un programador comete un error cada 10 líneas de programa. Esto significa que la probabilidad de que el programa funcione la primera vez es prácticamente nula; por lo tanto, el desarrollo de un programa siempre incorpora una etapa de depuración (debugging), que consiste en buscar y resolver los errores cometidos durante la programación.

Depuración de programas es el proceso de identificar y corregir errores de programación. En inglés se le conoce como debugging, ya que se asemeja a la eliminación de bichos (bugs), manera como se conoce informalmente a los errores de programación.



Aplicar las técnicas básicas de depuración de programas en C, para revisar y corregir de manera precisa posibles errores en el flujo de ejecución y el valor de las variables.

Depuración de programas


Depurar un programa significa ejecutarlo en un ambiente controlado, por medio de herramientas dedicadas para tal efecto. Este ambiente permite conocer exactamente el flujo de ejecución del programa línea a línea, el valor que las variables adquieren, la pila de llamadas a funciones, entre otros aspectos. Para poder depurar un programa, es requisito importante poder compilar el programa sin errores.

La depuración de un programa es útil cuando…

Se desea optimizar el programa

No basta que el programa se pueda compilar y se someta a pruebas que demuestren que funciona corrrectamente.

Debe realizarse un análisis exhaustivo del mismo en ejecución para averiguar cuál es su flujo de operación y encontrar formas de mejorarlo (reducir el código, utilizar menos recursos llegando a los mismos resultados, hacer menos rebuscado el algoritmo), o bien, encontar puntos donde puede fallar con ciertos tipos de entrada de datos.

El programa tiene algún fallo

El programa no muestra los resultados que se esperan, para cierta entrada de datos debido a que el programador cometió algún error durante el proceso de diseño o de implementación.

Muchas veces encontrar este tipo de fallos suele ser difícil, ya sea porque la percepción del programador no permite encontrar la falla en su diseño porque la errata es muy pequeña, pero crucial.

En este caso es de mucha utilidad conocer paso a paso como se ejecutan las estructuras de control, qué valor adquieren las variables, etc.

El programa tiene un error de ejecución o defecto

Cuando el programa está ejecutándose, éste se detiene inesperadamente.

Suele ocurrir por error en el diseño o implementación del programa en las que no se contemplan las limitaciones del lenguaje de programación o el equipo donde el programa se ejecuta.

Como el programa se detiene inesperadamente, no se conoce la parte del programa donde se provoca el defecto, teniendo que recurrir a la depuración para encontrarlo. El más común de este tipo de defecto es la “violación de segmento”.



Para facilitar la etapa de depuración es conveniente usar herramientas especializadas para estos efectos. La más común es el depurador o también llamado debugger. Un depurador es una herramienta que permite intervenir durante la ejecución de un programa, para saber cómo se está ejecutando.

Algunas funciones básicas que tienen en común la mayoría de los depuradores son las siguientes:

Dependiendo de la herramienta usada para compilar el programa, si es de consola o de terminal, su uso y las funciones disponibles variarán.

En las IDE (Entornos de Desarrollo Integrado), suelen existir herramientas de depuración gráficas. Es muy común que existan dos modos para desarrollar un programa y producir el archivo ejecutable, los cuales son “Debug” y “Release”. El primer modo se recomienda exclusivamente durante el desarrollo del programa, para poder depurarlo continuamente durante cualquier prueba de ejecución. El segundo modo se establece cuando el programa ha sido terminado y totalmente probado.





Depuración de programas escritos en lenguaje C con GCC y GDB



Para depurar un programa usando las herramientas desarrolladas por GNU, éste debe compilarse con información para depuración por medio del compilador GCC.

Esquema



Una vez hecho el paso anterior, debe usarse la herramienta GDB, la cual es el depurador para cualquier programa ejecutable realizado por GCC.

Esquema



Al ejecutar el programa GDB se entra a un entorno de ejecución controlado en forma de línea de comandos. Dependiendo del comando utilizado, se pueden realizar distintas funciones de depuración. A continuación, se muestran algunos comandos de GDB para depuración:

Esquema

Depuración de programas escritos en lenguaje C con Dev-C++ 5.0.3.4


Esquema



Si bien incorpora un editor de textos y un compilador integrados, también posee un depurador. Cabe destacar que por defecto Dev-C++ se basa en el compilador GCC y el depurador en GDB, aunque de manera gráfica ello es transparente para el usuario, ya que todo simula una sola herramienta.

Si se desea utilizar Dev-C++ como herramienta de desarrollo de programas en C, debe estar instalado adecuadamente en el equipo, para que funcione tanto el compilador como las herramientas de depuración.

Si se usa el sistema operativo Windows, se recomienda encarecidamente usar la versión que se proporciona en http://lcp02.fi-b.unam.mx en la sección de Servicios.

Antes de iniciar la depuración se debe tener a la mano el archivo con el programa escrito en C o proceder a escribirlo en la misma IDE.

Para ello debe usarse el menú Archivo → Nuevo → Código Fuente si se piensa usar la IDE para escribirlo, o en su lugar Archivo → Abrir Proyecto o Archivo si ya existía el código fuente.

Una vez que se tiene el programa, se debe activar la opción de compilación, generando información para el depurador. Para activar esta opción se debe abrir el menú:

Herramientas → Opciones del Compilador

y acceder a la pestaña Generación/Optimización de Código

y finalmente, en la subpestaña Enlazador (linker) activar la opción

Generar Información de Depuración



Esquema



Después de realizar lo anterior, el programa realizado se puede compilar y ejecutar utilizando las opciones del menú Ejecutar.

Para agregar breakpoints se debe hacer clic en la línea de código donde se desea colocar y ésta se volverá en color rojo. Para retirarlo se hace clic de nuevo en la línea y volverá a su color normal.

Esquema



Para depurar el programa:

Se debe compilar con el menú Ejecutar → Compilar
y luego depurar con Depurar →

El programa se abrirá y se ejecutará hasta el primer breakpoint seleccionado. También se abrirá un cuadro de herramientas en la parte inferior de la ventana, que tiene las principales herramientas de depuración en la parte derecha.

La línea que se ejecuta actualmente es la que se resalta en color azul.

Esquema

Cuando se llega al breakpoint, se tienen diversas opciones:

Esquema



Para detener la depuración se puede seleccionar la opción Parar ejecución

La opción Ver ventana del CPU permite ver a detalle las instrucciones enviadas al procesador, registros de memoria involucrados y el valor de cada una de las banderas en el procesador.

Finamente, para estudiar el valor de cada variable, se puede recurrir a la función

Añadir Watch y escribir el nombre de la variable.

En un cuadro a la izquierda se verá el nombre de la variable y su valor hasta el punto donde se está ejecutando el programa:

Esquema



Cuando se utiliza esta IDE, se recomienda usar los accesos directos mencionados en los propios menús, lo cual permite usarla de manera óptima. El nombre de las funciones y menús puede variar según el idioma en el que se haya instalado la IDE.

Depuración de programas escritos en lenguaje C con Code::Blocks 13.12


Esquema



Para poder depurar en Code::Blocks:

Es necesario crear un nuevo proyecto desde el menú File → New → Project

y elegir en el cuadro que aparece Console Application

Recuerda que, por ahora, todos los programas son desarrollados en modo de consola.



Seguir el asistente para crear el proyecto eligiendo que se usará el lenguaje C, luego seleccionar un título adecuado para el proyecto, la ruta donde se creará y el título del archivo asociado al proyecto.

Posteriormente, en el mismo asistente seleccionar Create “Debug” Configuration y Create “Release” Configuration con compilador GNU GCC Compiler. Nótese que existen dos carpetas asociadas que son /bin/debug y /bin/release que son donde se crearán los ejecutables de depuración y el final respectivamente. Al terminar se debe finalizar el asistente.

En la parte izquierda se encontrará el nombre del archivo fuente del proyecto. Para ello, navegar como se indica en la siguiente imagen y hacer clic en el archivo main.c:

Esquema

El archivo main.c se abre en la ventana derecha del IDE; éste se debe editar para formar el programa deseado. Cuando se está desarrollando es importante que esté seleccionado el modo de depuración, localizado en la barra de herramientas, como se muestra a continuación:

Esquema



Como se puede observar, hay un menú despegable; éste tiene la opción Debug y Release de ahí debe estar siempre seleccionada la primera opción (Debug) hasta que el programa esté libre de errores. Cuando todo esté listo, se cambiará a la segunda opción (Release y se usará el archivo ejecutable que se localiza en la /bin/reléase jamás el localizado en /bin/debug que sólo tiene efectos de desarrollo.

A la izquierda del menú se encuentran las opciones de compilación y ejecución del programa en el modo seleccionado.

A la derecha se encuentran las opciones de depuración.

La primera opción Debug/Continue permite ejecutar el programa en modo de depuración y reanudar la ejecución después de un breakpoint.

La opción Stop debugger detiene la depuración y permite continuar editando.

Existen otras herramientas adicionales; entre ellas correr el programa hasta donde se encuentre el cursor en el texto, ejecutar la siguiente línea o la siguiente instrucción; todas ellas estudiadas anteriormente.

Para visualizar una variable, se debe hacer clic sobre ella con el depurador corriendo, y al hacer clic en Watch ‘variable’ aparecerá un pequeño cuadro con la tabla de las variables que se desean visualizar y su valor:

Esquema

Finalmente, para agregar un breakpoint, se tiene que hacer clic derecho sobre el número de línea de código y agregarlo; aparecerá un punto rojo en la línea; para quitarlo se tiene que hacer el mismo procedimiento.

La parte del código que se está ejecutando por el depurador se indica por medio de una flecha amarilla en el número de línea correspondiente.

Esquema




Depuración de programas escritos en lenguaje C con Xcode de Mac


Esquema



Para depurar un programa en lenguaje C utilizando Xcode se debe realizar lo siguiente:

1. Abrir la aplicación Xcode; crear un nuevo proyecto seleccionando Create a new Xcode project y después se debe seleccionar macOS y Command Line Tool y dar Next como se muestra en la siguiente pantalla:

Esquema



2. Después se deben dar algunas características del proyecto, como se muestra en la siguiente figura. Al terminar se presiona Next.

Esquema



3. Al final se presentará una ventana en la que hay que indicar dónde se guardará el proyecto. Por ejemplo, en Documents, y se crea el proyecto (Create).

Esquema



A partir de este momento ya tenemos el área de trabajo para editar y depurar programas.

Esquema



En la barra izquierda del IDE se muestra la jerarquía de archivos del proyecto. Del lado derecho se muestra el editor para codificar el programa. Al final, dentro de Xcode se puede compilar, ejecutar y depurar el programa.

Esquema



Una vez que se tiene el programa codificado, se recomienda compilarlo antes de realizar su depuración; esto se realiza usando las teclas Cmd + B. Posteriormente, para ejecutarlo (o compilarlo y ejecutarlo si no se ha hecho anteriormente la compilación), en la barra de trabajo utilizar el ícono de play.



Esquema



Al igual que en otras IDE, se pueden establecer breakpoints haciendo clic con el botón derecho del ratón sobre el número que indica la línea de código en donde se desea detener y aparecerá una flecha azul. Para quitar un breakpoint se debe hacer clic sobre él y arrastrar hacia el editor; la flecha azul debe desaparecer.

Esquema



Una vez definidos los breakpoints, al momento de ejecutar el programa se detendrá al encontrar el primero, indicando automáticamente el valor de todas las variables definidas en el programa hasta ese punto. Por ejemplo:

Esquema



Como se puede observar, en la parte inferior se muestran las variables con su valor y tipo de dato declarado. Si a una variable aún no se le asigna un valor, éste será indeterminado.

La continuidad y control de la ejecución del programa se realiza a través de los íconos de la barra de resultados:

Esquema
Esquema



Se recomienda revisar las opciones que se tienen en el menú Debug para realizar otras actividades de depuración.

Esquema
Esquema
ícono

Actividad 1. Corrigiendo errores de sintaxis

Ahora ya sabes que un programa puede tener errores en su sintaxis (codificación) y corregirlos también es parte de la etapa de depuración.

ícono

Actividad 2. Ecuaciones de segundo grado

Los errores sintácticos son aquellos que rompen las reglas gramaticales del lenguaje; estos errores son identificados al compilar el programa; sin embargo, los errores semánticos son errores de lógica, y pueden ser percibidos hasta que el programa fue ejecutado y los resultados no son los esperados.

ícono

Autoevaluación. Depuración de programas

Para generar software de calidad es importante que el código esté libre de errores y funcione de acuerdo a las especificaciones. Para ello es importante conocer las técnicas y herramientas de depuración existentes para el lenguaje utilizado.


Fuentes de información

Básicas

González, M. E., Marín, C. L. y Noguerón, P. (2005). Apuntes de computadoras y programación. Ciudad de México: UNAM.

Documentos electrónicos

Gutiérrez, J. J. (s. f.). Primeros pasos con GDB. Consultado de http://www.lsi.us.es/~javierj/ssoo_ficheros/GuiaGDB.htm

Marín, E. (2012). Depuración de programas Dev C++. Consultado de http://programacionymetodos.blogspot.mx/2012/05/depuracion-de-programas-dev-c.html

Pozo, S. (2007). Primeros pasos con GDB. Consultado de http://www.c.conclase.net/devcpp/?cap=depurar

Solano, J., García, E., Sandoval, L., Nakayama, A., Arteaga, I. y Castañeda, M. (2016). Manual de prácticas del laboratorio de Fundamentos de programación. Facultad de Ingeniería. Consultado de http://lcp02.fi-b.unam.mx



Cómo citar


Arteaga, T. I. y Nakayama, M. A. (2018). Depuración de programas. Unidades de Apoyo para el Aprendizaje. CUAED/Facultad de Ingeniería-UNAM. Consultado el (fecha) de (vínculo)