Por:Andrêssa Finzi e Arthur Morais de Andrade
Muitos programadores se deparam com erros em seus programas, muitas das vezes, os mesmos não conseguem encontrar certos erros. Uma maneira de localizar estes bugs é a ulização de "debugadores". Apresentamos o famoso debugger do mundo UNIX e que pode ser utilizado em ambiente Windows, o GNU Debugger ou GDB, software muito útil para fazer análises e encontrar erros decorrentes em nossos programas.
GDB
O que é o GDB?
O GDB(Gnu Debugger) é um programa depurador que permite visualizar a execução em andamento de outros programas, ou seja, o GDB entra dentro da execução do programa, mostrando todos os passos que estão sendo executados por aquele programa. Ele possui suporte para muitas linguagens de programação, como C, C++ e FORTRAN.
O que é um debbuger (depurador)
Um depurador é um programa que executa outros programas, permitindo que o usuário exerça controle sobre estes programas para chegar às áreas problemáticas.
Como compilar o programa para utilizar o debugger ?
O GDB não pode ser utilizado para depurar um programa que contém erros de compilação. Antes de tentar utilizar o GDB retire todos os erros que o compilador encontrar em seu código fonte.
Você pode escrever seu programa em qualquer editor de texto e depois salvar como .c, abra o terminal e na linha de comando digite:gcc nome_do_programa.c -o nome_executavel -g
Obs: '-g' inclui no código do arquivo executável as informações necessárias para o GDB iniciar a depuração.
Como inicializar o GBD ?
Para inicializar o GDB digita-se no terminal o seguinte comando:
gdb nome_executavel
Após digitar o comando irá aparecer algo semelhante:
GNU gdb (GDB) 7.2-ubuntu
Copyright (C) 2010 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 compying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
(gbd)
Como visualizar as linhas do programa?
Obs.: Usarei um exemplo de loop infinito durante as explicações.Usando o comando list ou l, é possível listar as linhas do código de seu programa.
Ex:
(gdb) list
1 #include < stdio.h >
2 main()
3 {
4 int i, n=0;
5 for (i=1;i>n;i++){
6 if (i%2==0)
7 printf ("%d eh par \n",i);
8 else
9 printf ("%d eh impar \n",i);
10 }
(gdb) list
11 }
Obs.: Este comando só mostra dez linhas por vez, portanto é só dar sucessivos list para verificar todo o programa.
Como marcar pontos de parada?
Usando o comando break é possível criar um ponto de parada, ou seja, especificar linhas do código fonte onde a execução do programa deverá ser interrompida. Com isso, é possível analisar melhor o código e reconhecer os erros.
Ex: Ao executar o programa e ele irá parar na linha 5:
(gdb) break 5
Ponto de parada 2 at 0x80483d5: file nome_do_programa.c, line 5.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/andressa/nome_do_programa
Breakpoint 1, main () at nome_do_programa.c:5
5 for(i=1;i>n;i++){
No caso, o ponto de parada foi estabelecido na linha 5, mas pode ser colocado em outras linhas do código , lembrando que os pontos de parada são acumulativos.
Para limpar os breakpoints contidos em uma linha especificada use o comando clear lin (onde lin é o número da linha) ou caso nenhuma linha seja passada como parâmetro limpará todos os breakpoints a frente de onde a execução parou com o comando clear.
Como executar o programa?
Usa-se o comando run para executar o programa. Com o comando ctrl+c é possível parar a execução, principalmente em casos de loop infinito.
Ex:
(gdb)run
17346 eh par
17347 eh impar
17348 eh par
17349 eh impar
17350 eh par
17351 eh impar
17352 eh par
17353 eh impar
17354 eh par
17355 eh impar
17356 eh par
17357 eh impar
17358 eh par ^C
Program received signal SIGINT, Interrupt.
0x0012e416 in __kernel_vsyscall ()
Como executar o programa passo-a-passo ?
Temos dois comandos que podemos utilizar para executar passo-a-passo, step e next, no caso, step vai fazendo passo-a-passo, ou seja, linha por linha e o next é utilizado quando desejo passar por sub-rotina (função, procedimento ou mesmo subprograma) .
Ex:
Breakpoint 1, main () at nome_do_programa.c:5
5 for(i=1;i>n;i++){
(gdb) next
6 if(i%2==0)
(gdb) next
9 printf("%d eh impar \n",i);
(gdb) next
1 eh impar
5 for(i=1;i>n;i++){
(gdb) next
6 if(i%2==0)
(gdb) next
7 printf("%d eh par \n",i);
(gdb)
Como verificar e alterar o valor da variável no momento?
Para verificar o valor da variável usamos o comando print x onde "x" é a variável, para alterar o valor da variável usamos o comando set(x=num) onde "x" é a variável e "num" é o valor que a variável assumirá. Como no exemplo podemos ver, i estava valendo 2, usei o comando set (i=7), agora i vale 7, se executarmos o próximo passo veremos que ele irá imprimir "7 eh impar".
Ex:
(gdb) print i
$4 = 2
(gdb) set(i=7)
(gdb) print i
$5 = 7
(gdb) next
9 printf("%d eh impar \n",i);
(gdb) next
7 eh impar
5 for(i=1;i>n;i++){
Como obter ajuda sobre comandos do depurador?
Utilize o comando help.
(gdb) help
list of classes of commands
aliases -- Aliases of other comands
breakpoints -- Making program stop at cartain points
data -- Examinando dados
files -- Especificandoe examinando arquivos
internals -- Maintenance commands
obscure -- Obscure features
running -- Executando o programa
stack -- Emaxining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution whithout stopping the program
user-defined -- User-defined comman
Como sair do GDB?
Para sair do GDB use o programa quit.
(gdb) quit
Estes foram alguns comandos básicos para demonstrar o que o GDB é capaz, sem contar que existem muitos outros detalhes mais específicos que não foram abordados. Para informações mais detalhadas consulte o manual do gdb. Digite na linha de comando: man gdb
Referência:
tutorialspoint