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. |