Primeros pasos con GDB

Este documento pretende ser una breve y sencilla guía práctica al depurador GDB (http://gnu.org). A lo largo de esta guía, usaremos como ejemplo un sencillo programa cuyo código se muestra a continuación:

#include <stdio.h>

int main() {
   int v = 0, i = 0;
   for (i = 0; i < 5; i++) {
      v += i;
   } /* for */
   printf("Resultado: %i\n", v);
   return 0;
} /* main */

Lo primero que hemos de hacer es compilar dicho programa con la opción “-ggdb” para que se incluya la información necesaria para la depuración. Si el programa está guardado en un archivo

[vampird@Sharwyn]:~/devel/C$ gcc -ggdb -o test test.c

Una vez compilado, podemos comenzar la depuración invocando a gbd con el nombre del archivo compilado.

[vampird@Sharwyn]:~/devel/C$ gdb test
GNU gdb (GDB) SUSE (6.8.91.20090930-2.4)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vampird/devel/C/test...done.
(gdb)

La línea “(gdb)” nos indica que el depurador está listo para empezar a procesar nuestras órdenes. El primer comando que veremos es (l)ist. Este comando muestra el código fuente del programa que estoy depurando.

(gdb) l
1      #include <stdio.h>
2
3         int main() {
4         int v = 0, i = 0;
5         for (i = 0; i < 5; i++) {
6            v += i;
7         } /* for */
8         printf("Resultado: %i\n", v);
9         return 0;
10     } /* main */
(gdb)

Para ejecutar el programa, utilizamos el comando (r)un. Como aún no hemos puesto ningún punto de ruptura, el programa se ejecutará entero.

(gdb) r
Starting program: /home/vampird/devel/C/test
Resultado: 10
Program exited normally.
(gdb)

Vamos a colocar ahora un punto de ruptura. Como su nombre indica, un punto de ruptura es un punto donde la ejecución de nuestro programa se detiene. Para colocar un punto de ruptura utilizamos el comando (b)reakpoint seguido de la línea donde queremos ponerlo.

(gdb) b 6
Breakpoint 1 at 0x400553: file test.c, line 6.
(gdb)

Ya tenemos un punto de ruptura en la línea 9. Si ahora ejecutamos el programa se detendrá cuando llegue a esa línea.

(gdb) r
Starting program: /home/vampird/devel/C/test
Breakpoint 1, main () at test.c:6
6 v += i;
(gdb)

Para continuar la ejecución del programa utilizamos el comando (c)ontinue. En nuestro ejemplo, el programa se volverá a detener en el mismo punto de ruptura.

(gdb) c
Continuing.
Breakpoint 1, main () at test.c:6
6 v += i;
(gdb) c
Continuing.
Breakpoint 1, main () at test.c:6
6 v += i;
(gdb) c
Continuing.
Breakpoint 1, main () at test.c:6
6 v += i;
(gdb) c
Continuing.
Breakpoint 1, main () at test.c:6
6 v += i;
(gdb) c
Continuing.
Resultado: 10
Program exited normally.
(gdb)

Puesto que tenemos un punto de ruptura en el bucle y este da 5 vueltas, hemos tenido que continuar 5 veces para ejecutar el programa completo. También es posible ejecutar el programa línea a línea con el comando (n)ext.

(gdb) r
Starting program: /home/vampird/devel/C/test
Breakpoint 1, main () at test.c:6
6 v += i;
(gdb) n
5 for (i = 0; i < 5; i++) {
(gdb) n
Breakpoint 1, main () at test.c:6
6 v += i;
(gdb)

En cualquier momento podemos ver el valor de una variable con el comando (p)rint seguido del nombre de la variable.

(gdb) p v
$1 = 0
(gdb) c
Continuing.
Breakpoint 1, main () at test.c:6
6 v += i;
(gdb) c
Continuing.
Breakpoint 1, main () at test.c:6
6 v += i;
(gdb) p v
$2 = 3
(gdb)

Para eliminar un punto de ruptura utilizamos el comando delete y el número del punto a eliminar. En nuestro ejemplo

(gdb) delete 1

Por último, para salir del depurador utilizamos el comando (q)uit.

Hay mucha más información disponible tanto en la página del manual como en los archivos info:

$ man gdb
$ info gdb

También puede utilizarse interfaces gráficos para trabajar con GB de manera más cómoda. Uno de esos interfaces es DD y puede descargarse en http://sourceforge.net/projects/ddd/

=-=-=-=-=
Powered by Blogilo

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: