Next: Acerca de este documento
Up: Linux para Programadores
Previous: El sistema de dependencia
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: Acerca de este documento
Up: Linux para Programadores
Previous: El sistema de dependencia
Vicente González Ruiz
1998-07-13