Manual básico de gdb

El depurador gdb (GNU Debugger) es el depurador estándar de Linux. Fue creado por Richard Stallman en el año 1988. Después de esta introducción de wikipedia, pasamos a ver como se usa.

Con gdb podemos depurar código C/C++, Pascal, y Ada. Es un depurador de línea de comandos, aunque existe una parte gráfica llamada DDD. A mí personalmente, el DDD me dio muchos problemas. Me fío más de la línea de comandos.

Para usarlo, es necesario compilar el fuente con la opción de depuración, para C, C++ y Pascal, dicha opción es -g.


Programa de ejemplo pascal para probar con gdb.
______________________________________________________
program ejemplo;

procedure proc ();
var
  i : integer;
begin
  for i := 1 to 10 do
    writeln('In for: ', i);
end;
  
begin
  writeln('This is the first line');
  proc();
end.
______________________________________________________

Compilamos con la opción -g

$ fpc -g ejemplo.pas



Cargando el depurador

$ gdb ./ejemplo
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
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-linux-gnu"...
(gdb)




Listar el código

Para listar el código usamos el comando list o l simplemente. El patrón es el siguiente:
list | l lineInit, lineEnd

Ejemplo:

(gdb) list 1, 5
1    program ejemplo;
2  
3    procedure proc ();
4    var
5      i : integer;
(gdb)



Nota: Si le damos a ENTER sin ninguna opción, se vuelve a repetir el último comando.

(gdb)
6    begin
7      for i := 1 to 10 do
8        writeln('In for: ', i);
9    end;
10     
11   
12    begin
13      writeln('This is the first line');
14      proc();
15    end.(gdb)




 Colocar breakpoints

Para colocar breakpoints usamos el comando break  line, o b line, donde line es el número de línea que queremos el breakpoint. Suponer que la queremos colocar el la línea 13.

(gdb) b 13
Breakpoint 1 at 0x400229: file ejemplo.pas, line 13.




Comenzar la ejecución

Una vez tengamos hayamos puesto puntos de ruptura (también se podría poner wachpoint y catchpoint) pasamos a ejecutar el programa. Para ello usamos la instrucción run.

(gdb) run
Starting program: /home/user/Desktop/ejemplo

Breakpoint 1, main () at ejemplo.pas:13
13      writeln('This is the first line');
(gdb)




Traza

Ahora tenemos varias posibilidades:
  1. Ir paso a paso pasando por cada función: usamos step
  2. Ejecutar la instrucción actual: usamos stepi
  3. Ir paso a paso sin pasar por cada función: cont.
Por ejemplo:

(gdb) step
This is the first line
14      proc();
(gdb)
PROC () at ejemplo.pas:7
7      for i := 1 to 10 do
(gdb)
8        writeln('In for: ', i);
(gdb)
In for: 1
7      for i := 1 to 10 do
(gdb)
8        writeln('In for: ', i);

(gdb) cont
Continuing.
In for: 2
In for: 3
In for: 4
In for: 5
In for: 6
In for: 7
In for: 8
In for: 9
In for: 10

Program exited normally.




Imprimir el valor de una variable

Para mostrar por pantalla el valor de una variable usamos la instrucción print nombre_variable.


(gdb) step
8        writeln('In for: ', i);
(gdb) print i
$3 = 1




Limpiar la lista de breakpoints

Para quitar un breakpoint, usamos clear num_Line. Donde num_Line es el número de línea donde teníamos un breakpoint. Si no nos acordamos la línea en la que lo hemos puesto, usamos el comando info breakpoints.

Para eliminar todos los breakpoints usamos delete breakpoints.

Ejemplo:

(gdb) info breakpoints
Num     Type           Disp Enb Address            What
3       breakpoint     keep y   0x0000000000400229 in main at ejemplo.pas:13
4       breakpoint     keep y   0x00000000004001ac in PROC at ejemplo.pas:7

(gdb) delete breakpoints
Delete all breakpoints? (y or n) y
(gdb) info breakpoints
No breakpoints or watchpoints.
(gdb)


0 comentarios:

Publicar un comentario en la entrada