Aprendendo a utilizar o GNU Debugger (parte 1)

Em programação, como as vezes não temos como saber onde pode estar aquele erro maldito, um bom depurador pode ser o nosso melhor amigo. Nesse artigo falarei de breakpoints: o que são, como definí-los, porque utilizá-los e também outros comandos como o list, next, run e o print.

[ Hits: 141.710 ]

Por: Ricardo Rodrigues Lucca em 26/01/2004 | Blog: http://aventurasdeumdevop.blogspot.com.br/


List, BreakPoints e Next



Agora que temos o gdb rodando, carregue o exemplo digitando: file ex.

Bom, com um exemplo rodando vamos exemplificar um pouco esses comandos:
  • List é usado para vermos uma porção do código do programa. Normalmente podemos chamar "list" (ou "l") seguido de um número que corresponderia a linha do código fonte. Também podemos passar como argumento o nome de uma função ou o endereço de memória.


(gdb) list
1       #include <stdio.h>
2
3       int main(void)
4       {
5               int a=1;
6
7
8               while (a<5) {
9                       printf("%2d! ",a);
10                      a++;

Bem, como já aprendemos a como executar o programa, vamos exemplificar o uso de "next" depois de breakpoint. O que deixará mais claro.

(gdb) b 7
Breakpoint 1 at 0x8048373: file ex.c, line 7.

Quando digitamos "breakpoint" (ou "b") seguido de um número, o gdb entende que este número é o numero da linha onde devemos "pausar" o programa. Assim, breakpoint é nada mais que uma parada da execução num determinado ponto.

Geralmente o breakpoint é usado quando sabemos que o erro ocorre na linha tal, aí usamos um breakpoint na linha tal-1, por exemplo.

Agora, se digitarmos "run" o programa irá parar na próxima linha com algo a fazer, no caso, a linha 8. Onde podemos dar um "print" na variável "a" e ver quanto ela está valendo.

(gdb) run
Starting program: /home/rlucca/C/seila/ex

Breakpoint 1, main () at ex.c:8
8               while (a<5) {
(gdb) print a
$1 = 1

Digitando "next" (ou "n") iremos pedir pro gdb ir para a próxima instrução (linha) do programa.

(gdb) n
9                       printf("%2d! ",a);
(gdb) n
10                      a++;
(gdb) n
11                      sleep(1);
(gdb) print a
$2 = 2

Página anterior    

Páginas do artigo
   1. Introdução
   2. Iniciando
   3. Encerrando e pedindo ajuda no gdb
   4. gdb e gcc
   5. Carregamento e execução
   6. Um exemplo simples
   7. List, BreakPoints e Next
Outros artigos deste autor

VIM avançado (parte 1)

Como posso recuperar o boot loader?

Uma pequena análise do Gentoo Linux

Introdução as Bibliotecas do C/C++

Como recuperar a senha o root

Leitura recomendada

LivreNFE - O emissor Nfe open source para Linux

Reprodução de arquivos WAV com SDL_mixer e linguagem C

Tutorial OpenGL v2.0

Introdução à plataforma GNU de desenvolvimento

Criação e uso de um interpretador de script BrainFuck em C++

  
Comentários
[1] Comentário enviado por jose_maria em 20/05/2004 - 10:53h

Parabéns pelo artigo. Eu estava realmente procurando informações de como usar o gdb.
Mas eu fiquei com algumas dúvidas:
- Eu não consegui executar o comando ctrl+pipe, simplesmente não aconteceu nada. Eu também não entendi para que serve o comando.
- O comando list não funcionou no meu gdb, fica assim:
(gdb) list
1 ../sysdeps/i386/elf/start.S: No such file or directory.
in ../sysdeps/i386/elf/start.S

Valeu cara.

[2] Comentário enviado por jllucca em 20/05/2004 - 20:54h

CTRL+PIPE é usado para interromper o programa e gerar um arquivo core. Se o arquivo não for criado experimente fazer um "ulimit -c 99000" porque normalmente o pessoal gosta de deixar o limite dos arquivos cores para "0"(Zero) o que impossibilita a criação deles.

Quanto ao problema com o gdb estou com um igual na faculdade. Mas, quando descobrir como resolver posto aqui. A primeira coisa normalmente que agente vê se esta "OK" é vermos se compilamos os programas usando a flag "-g". To me sentido muito mal por não ter como usar o gdb, o jeito é fazer testes...

[3] Comentário enviado por jllucca em 26/05/2004 - 12:57h

Quanto ao problema com o GDB, realmente era a flag "-g". Fiz testes aqui e consegui depurar o programa certinho fazendo :

$ g++ program.cpp -o programname -g
$ gdb programname
(gdb) list

Sem erros, enquanto que:
$ make clean
$ make all
$ gdb promname
(gdb) list
1 ../sysdeps/i386/elf/start.S: No such file or directory.
in ../sysdeps/i386/elf/start.S

Assim, estou tentando dinovo organizar o meu Makefile porque eh ele o gerador de caso. Quanto ao seu programa se quiser conversar por email fica muito melhor!

[]'s


[4] Comentário enviado por engos em 25/06/2004 - 11:42h

Legal o artigo, mas você não o encerrou muito cedo?

Acho que ficou faltando comentar que não é necessário ser um arquivo de core para debugar o programa, sem contar que poderia ter sido colocado mais de um breakpoint ou como remover os breakpoints.

Ficou bem redigido e de fácil entendimento, aconselho a postar um artigo complementar que explore mais o gdb, principalmente outras opções, qualquer coisa posso ajudar.

[]s

[5] Comentário enviado por jllucca em 27/07/2004 - 00:24h

Opa,

sobre o artigo ter acabado meio cedo. Realmente, estou pensando em escrever uma segunda parte. Mas, nada muito apressada que nem a segunda parte do void que como voce mesmo disse e depois eu fui ver realmente passa uma impressão meio vaga.

[]'s

[6] Comentário enviado por wildtux em 16/01/2014 - 12:13h

Estou usando o gdb tanto no Linux quanto no cygwin. Muito bom o artigo. Já vi a parte 2 também, ficou realmente mais esclarecedora que a primeira, claro sem desmerecer a primeira. Boa iniciativa parabéns.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts