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:
- Ir paso a paso pasando por cada función: usamos step
- Ejecutar la instrucción actual: usamos stepi
- Ir paso a paso sin pasar por cada función: cont.
| (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