next up previous
Next: Acerca de este documento Up: Linux para Programadores Previous: El sistema de dependencia

El debugger de UNIX: dbx

Cuando ejecutamos un programa escrito por nosotros y tenemos errores en tiempo de ejecución usaremos un debugger para encontrarlos. Normalmente estos errores provocan que la memoria que ocupa el programa que aborta sea copiada en el disco creando un fichero core. Este fichero es usado por el debugger para averiguar en que línea del código fuente se ha producido el error. En Linux el debugger se llama gdb (Genius DeBugger). La forma de invocarlo es:
gdb fichero_ejecutable
Lo primero que debemos hacer es compilar nuestro programa para ser depurado. Esto se realiza con la opción -g del compilador de C. Una forma rápida de realizar esto es modificando el fichero makefile, para insertar el flag de compilación -g con lo que obtenemos:



width 3pt
width .3pt415ptdali: % make reverse
cc -g -c Reverse.c -o Reverse.o
cc -g reverse.c Reverse.o -o reverse
dali: %
width .3pt
depth .3pt width -3pt

Para invocar el debugger:



width 3pt
width .3pt415ptdali: % gdb reverse
GDB is free software and you are welcome to 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.
GDB 4.13 (i486-slackware-linux),
Copyright 1994 Free Software Foundation, Inc...
(gdb)
width .3pt
depth .3pt width -3pt

Para ejecutar el programa (sin paradas provocadas por nosotros):



width 3pt
width .3pt415pt(gdb) run
Starting program: /home/vi/reverse
Reverse ("Hola")=aloH
Program exited with code 026.
(gdb)
width .3pt
depth .3pt width -3pt

De esta forma, si lo que tenemos es una parada en tiempo de ejecución, el debugger se para en la línea que causa el problema. Si lo que deseamos es establecer puntos de ruptura (breakpoints):



width 3pt
width .3pt415pt(gdb) list (Listamos el programa que estamos depurando)
3               Testea el uso de la función Reverse.
4       */
5
6       #include <stdio.h>      /* Usamos el printf() */
7       #include "Reverse.h"    /* Prototipo de Reverse(). Necesario ! */
8
9       main()                          /* Cuerpo principal del programa */
10      {
11              char str[100];          /* Buffer para realizar inversiones de cadenas */
12              Reverse("Hola",str);    /* Invertimos la cadena 'Hola' */
(gdb) break 12 (establecemos un punto de ruptura en la linea 12)
Breakpoint 1 at 0x109f: file reverse.c, line 12.
(gdb) run (ejecutamos el programa)
Starting program: /home/vi/reverse
Breakpoint 1, main () at reverse.c:12
12              Reverse("Hola",str);    /* Invertimos la cadena 'Hola' */
(gdb)
width .3pt
depth .3pt width -3pt

Para trazar la ejecución del programa paso a paso realizamos:



width 3pt
width .3pt415pt(gdb) step
Reverse (in=0x1074 "Hola", out=0xbffffc2c "tically linked\n") at Reverse.c:14
14              int len=strlen(in);     /* Longitud de la cadena a invertir */
(gdb) step
strlen (str=0x1074 "Hola") at strlen.c:29
(gdb) step
Reverse (in=0x1074 "Hola", out=0xbffffc2c "tically linked\n") at Reverse.c:17
17              for(j=len-1,i=0;j>=0;j-,i++) out[i]=in[j];
(gdb) step
20              out[len]=(char)NULL;
(gdb) print out[1]
$1 = 108 'l'
(gdb) print out[0]
$2 = 97 á'
(gdb) print *out
$3 = 97 á'
(gdb)
width .3pt
depth .3pt width -3pt

Y como vemos es posible acceder a las variables del programa cuando lo estamos ejecutando paso a paso. gdb dispone de otros muchos comandos que se escapan del interés de este curso. Para obtener información acerca de ellos podemos escribir help en la línea de comandos. Para salir del debugger teclearemos el comando quit .


next up previous
Next: Acerca de este documento Up: Linux para Programadores Previous: El sistema de dependencia
Vicente González Ruiz
1998-07-13