Instituto Politécnico de Beja
Escola Superior de Tecnologia e Gestão
Área Departamental de Engenharia
Bacharelato em Engenharia Informática

       O abc do gdb (versão 0.2)

João Paulo Barros

Beja, 10 de Janeiro de 1999


O gdb é o debugger da gnu.

Para começar devemos compilar todo o código do programa a "debugar" (depurar)com a opção -g. Por exemplo:

g++ -Wall -g A.cpp B.cpp -o prog

Para depurar chamamos o gdb com o executável como parâmetro:

gdb prog

Irá surgir um texto igual ou parecido ao seguinte:
GNU gdb 4.17
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or 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.
This GDB was configured as "i386-redhat-linux"...
(gdb)

(gdb) é a prompt do gdb. A tabel a seguinte apresenta-se os comandos, provavelmente, mais importantes e utilizados:
 
list para vermos a zona do código onde o gdb se encontra. No início irá mostrar o ínicio do programa.
break n para colocar um breakpoint na linha n.
break filename:n para colocar um breakpoint na linha n do ficheiro filename
info breakpoints mostra informação sobre os breakpoints existentes
disable b desactiva o breakpoint b
enable b activa o breakpoint b
delete  apaga todos os breakpoints
delete b apaga o breakpoint b
step para avançar no código entrando dentro das funções.
next para avançat no código sem entrar dentro das funções.
continue correr o programa até ao próximo breakpoint.
print v mostra o conteúdo da variável v
where mostra o "conteúdo" do stack. Bom para saber como se chegou ao sítio actual
backtrace para ver o stack após um core dump
help mostra ajuda para um comando
quit sai do gdb

O gdb disponibiliza bastantes mais comandos. Para saber mais experimente: man gdb e/ou info gdb.

Após um "segmentation fault core dump" o gdb pode ler o ficheiro core para saber onde é que o programa terminou. Basta passar também o ficheiro core como parâmetro do gdb: gdb prog core. Seguidamente executa-se o comando backtrace para conhecer o stack no momento do erro. Tal dá-nos uma ideia do sítio onde o programa terminou. No final não se esqueça de remover o ficheiro core, pois este ocupa, normalmente, muito espaço.

Uma forma mais simpática de utilizar o gdb consiste em chamá-lo dentro do emacs. Para tal execute o seguinte comando emacs:

Esc-x gdb

Seguidamente surgirá o seguinte texto:
Run gdb (like this): gdb
A partir daqui pode utilizar o gdb tal como o faz fora do emacs, mas com uma grande vantagem:
quando a execução pára num breakpoint o gdb automaticamente cria uma janela que mostra o código fonte e indica em que sitio se parou. Tal é indicado pela marca "=>".
Existem abreviaturas emacs para os comandos gdb, mas pode continuar a utilizar directamente os comandos do gdb o que é provavelmente uma boa ideia pelo menos no início.
 

Quanto maiores forem os programas, mais difícil será depurá-los  só com instruções de output tipo printf ou <<. O tempo gasto a aprender a trabalhar com o debugger será certamente compensado pelo tempo poupado a descobrir erros no código.
Por último é fundamental acreditar e perceber que os debuggers não são desculpa para cometer mais erros ao programar. Qualquer programador consciencioso e competente fará sempre um esforço honesto para escrever o programa da melhor forma que sabe e pode antes de pensar em utilizar um debugger