guía práctica de estudio: depuración de programasodin.fi-b.unam.mx/salac/practicasfp/anexo...

20
Guía práctica de estudio: Depuración de programas Elaborado por: M.C. Edgar E. García Cano Ing. Jorge A. Solano Gálvez Revisado por: Ing. Laura Sandoval Montaño

Upload: duongdiep

Post on 01-Nov-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

Guía práctica de estudio: Depuración de programas

Elaborado por: M.C. Edgar E. García Cano

Ing. Jorge A. Solano Gálvez

Revisado por: Ing. Laura Sandoval Montaño

Page 2: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

1

Guía práctica de estudio: Depuración de programas

Objetivo:

Ejecutar un programa bajo el contexto de depuración con la finalidad de encontrar de

forma precisa los errores de ejecución.

Introducción

Cuando un programa falla (no termina su ejecución de manera correcta), la mayoría de las

veces, el compilador envía cierta información que permite determinar dónde se encuentra

el problema. Empero, no siempre es así y es más complicado saber dónde falla el

programa y cómo corregirlo. En esos casos es mejor ejecutar el programa en un contexto

controlado para saber, exactamente, donde está fallando.

La depuración se refiere al hecho de poder ejecutar un programa en un ambiente

controlado de manera que se pueda estudiar el flujo de ejecución, la pila de llamadas, los

valores de las variables, etcétera.

Por ejemplo, el siguiente código genera un error al ejecutarse debido a la falta del carácter

ampersand cuando se lee el valor numérico:

int funcion() { int num; printf("Cuántos elementos tiene el arreglo?\n"); scanf("%d",num); printf("El número de elementos del arreglo es: %d\n", num); return num; }

Si se ejecuta el programa anterior, debe enviar una salida de error del siguiente tipo:

$> ./debug

Violación de segmento (core dumped)

Page 3: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

2

Debido al mensaje de error generado, la experiencia dice que falló al intentar acceder a una

localidad de memoria no reservada pero, ¿cómo saber en qué parte del programa está el

error?

En este caso es fácil localizar donde está el problema, sin embargo, cuando el código crece

y se tienen cientos de líneas la corrección no es tan directa, es ahí donde los depuradores

adquieren importancia.

La mayoría de los entornos de programación permiten depurar programas realizando una

ejecución paso a paso y consultar los valores que van tomando las variables, de manera

que se puede realizar una traza para detectar dónde y por qué se producen los errores y

corregir los mismos.

gdb (ventana de comandos)

gdb es una aplicación que permite depurar otros programas escritos en cualquier lenguaje

de programación pero compilados con gcc (GNU Compiler Collection, antes GNU C

Compiler).

Ejemplo

int funcion() { int num; printf("Cuántos elementos tiene el arreglo?\n"); scanf("%d",num); printf("El número de elementos del arreglo es: %d\n", num); return num; }

Para depurar el programa anterior utilizando gdb se debe compilar el archivo fuente con

gcc y utilizando la bandera -g:

gcc -g archivo.c -o archivo

Cuando se utiliza la bandera -g se crea un archivo un poco más grande, ya que contiene

más información para la depuración.

Page 4: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

3

Una vez compilado el archivo se puede ejecutar en un ambiente controlado por gdb de la

siguiente manera:

gdb ./archivo

La línea anterior genera la siguiente salida:

GNU gdb 6.3.50-20050815 (Apple version gdb-1705) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .. done (gdb)

Lo que indica que el programa ya se está ejecutando bajo el depurador gdb. El depurador

posee diferentes comandos para ir corrigiendo el programa.

El comando l (list) muestra el código fuente del programa. También se puede indicar la

línea a partir de la cual listar el mismo:

(gdb) l 1 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int funcion() { 5 int num; 6 7 printf("Cuántos elementos tiene el arreglo?\n"); 8 scanf("%d",num); 9 printf("El número de elementos del arreglo es: %d\n", num);

Page 5: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

4

Dentro del entorno de gdb se pueden realizar diversas acciones sobre el código. Si se desea

ejecutar el programa se teclea r (run):

(gdb) r Starting program: /home/gdb/depurar Cuántos elementos tiene el arreglo? 5 Program received signal SIGSEGV, Segmentation fault. 0x00390b2f in _IO_vfscanf_internal () from /lib/libc.so.6 Missing separate debuginfos, use: debuginfo-install glibc-2.12.90-17.i686

También se pueden crear puntos de ruptura (breakpoint). Los puntos de ruptura o de

interrupción sirven para detener la ejecución de un programa, si un programa falla en

cierto pedazo de código, se recomienda establecer un breakpoint para deterner la

ejecución en ese punto y ejecutar línea a línea las siguientes instrucciones para ver dónde

está el error. Para crear un punto de ruptura se ejecuta el comando b (breakpoint) y el

número de línea donde se quiere establecer el punto:

(gdb) b 7 Breakpoint 1 at 0x804847a: file depurar.c, line 7.

Una vez establecido un punto de ruptura se puede ejecutar el programa (con el comando

r) y la ejecución se detendrá justo en el punto establecido.

(gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/gdb/depurar Breakpoint 1, funcion () at depurar.c:7 7 printf("Cuántos elementos tiene el arreglo?\n"); (gdb)

Cuando el programa se detiene por un punto de ruptura se tienen tres posibilidades:

continuar la ejecución, saltar al siguiente paso o saltar a la siguiente línea.

Page 6: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

5

Si se desea continuar con la ejecución normal del programa se presiona la tecla c

(continue):

(gdb) c Continuing. Cuántos elementos tiene el arreglo? 5 Program received signal SIGSEGV, Segmentation fault. 0x00390b2f in _IO_vfscanf_internal () from /lib/libc.so.6

Para depurar el programa se debe ejecutar instrucción a instrucción. Si se desea ejecutar la

siguiente instrucción se debe presionar la tecla s (si la siguiente instrucción es una llamada

a función se ingresará a la misma):

Breakpoint 1, funcion () at depurar.c:7 7 printf("Cuántos elementos tiene el arreglo?\n"); (gdb) s Cuántos elementos tiene el arreglo? 8 scanf("%d",num);

Si se desea ejecutar la siguiente línea de código se puede presionar la tecla n (si el siguiente

paso es una llamada a función se ejecuta sin entrar al cuerpo de la misma):

Breakpoint 1, funcion () at depurar.c:7 7 printf("Cuántos elementos tiene el arreglo?\n"); (gdb) n Cuántos elementos tiene el arreglo? 8 scanf("%d",num);

En cualquier momento es posible imprimir el valor de una variable, para ello se utiliza el

comando p (print) seguido del nombre de la variable que se desea mostrar:

Breakpoint 1, funcion () at depurar.c:7 7 printf("Cuántos elementos tiene el arreglo?\n"); (gdb) p num $1 = 5033972

Para eliminar un punto de ruptura se utiliza el comando delete (d) y el punto a eliminar:

(gdb) delete 7

Page 7: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

6

Para mostrar los breakpoints que se han creado en el programa se invoca el comando info

breakpoints:

(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x0804847a in funcion at depurar.c:7

También se puede ignorar un punto de ruptura, es decir, el depurador no se detendrá en

ese punto de ruptura. Para ignorar un breakpoint se utiliza el comando ignore y se indica

el punto que se desea ignorar:

(gdb) ignore 2

Para salir de gdb se presiona la tecla q o el comando quit:

(gdb) q

Existen varias opciones más de gdb que se pueden ver dentro del manual o en la

información del comando:

$ man gdb

$ info gdb

Page 8: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

7

Code Blocks (entorno gráfico)

Code Blocks es un entorno de desarrollo gráfico que permite depurar programas de

manera gráfica utilizando el contexto de debug (depurador) al momento de ejecutar el

programa.

Para depurar un programa es necesario crear un nuevo proyecto de consola (Console

application)

Page 9: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

8

Creación de una nueva aplicación de consola

Page 10: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

9

Al final se pregunta qué opciones habilitar Debug o Release. La opción Release permite

genera la aplicación ejecutable, la opción debug permite ejecutar el programa en un

entorno controlado por Code Blocks.

Page 11: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

10

Cuando se agrega un nuevo archivo al proyecto, se puede activar el modo release o el

modo debug o ambos.

Una vez activado el modo debug se puede abrir el programa y proceder a utilizar el

depurador.

Page 12: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

11

Para establecer puntos de ruptura en el programa solo es necesario dar un clic a lado del

número de línea donde se desea agregar. Para retirar los breakpoints es necesario realizar

el mismo proceso (clic) sobre la línea.

Page 13: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

12

Para depurar el programa se debe compilar y después en el menú Debug se presiona Start

/ Continue. El programa comenzará su ejecución (aparece la ventana de comandos) y se

detendrá en el punto establecido.

Page 14: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

13

Para continuar la ejecución del programa se puede ir al menú Debug y presionar Star /

continue.

Page 15: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

14

Así mismo, en el menú Debug existe varias instrucciones para la depuración del código

(Stop debugger, Next line, Next instruction, etc.). Si se selecciona, por ejemplo, Next line,

el programa salta a la siguiente línea.

Page 16: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

15

En el menú Debug está la opción para imprimir la pila (Information -> Current stack

frame).

Si el usuario requiere ingresar información al programa se muestra la ventana de

comandos.

Page 17: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

16

En cuanto se genera el error, Code Blocks envía una ventana con la traza del mismo

indicando la línea que falló.

Page 18: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

17

En cualquier momento se puede ver el valor de una variable, para ello sólo se da clic

derecho sobre la variable y se selecciona "watch 'nombreVariable'".

Page 19: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

18

Si el programa se ejecuta en modo release (menú Build, submenú Run), el programa no se

detiene en los puntos de ruptura, esas marcas solo funcionan cuando el programa se

ejecuta en un entorno controlado (en modo Debug).

Page 20: Guía práctica de estudio: Depuración de programasodin.fi-b.unam.mx/salac/practicasFP/Anexo DepuracionProgramas.pdf · Code Blocks es un entorno de desarrollo gráfico que permite

19

Bibliografía

man gdb

info gdb

http://wiki.codeblocks.org/index.php?title=Debugging_with_Code::Blocks