GNU Debugger

Origem: Wikipédia, a enciclopédia livre.
GNU Debugger
Desenvolvedor Projecto GNU
Sistema operativo Unix-like, Windows
Gênero(s) depurador
Licença GNU GPL
Página oficial www.gnu.org/software/gdb

O GNU Debugger, mais conhecido por GDB, é um depurador do GNU. Ele pode ser usado para depuração em sistemas Unix-like e suporta muitas linguagens de programação, como a C, C++, Fortran, Objective-C, Pascal, Java,[1] e parcialmente outras.[2]

História[editar | editar código-fonte]

O GDB foi escrito por Richard Stallman em 1986 como parte do sistema GNU, depois que o GNU Emacs atingiu um "estado razoável de estabilidade".[3]

Depois do GNU Emacs ficar razoávelmente estável, o que demorou ao todo cerca de um ano e meio, eu comecei a rever as outras partes do sistema. Eu desenvolvi um depurador que eu chamei GDB que depura os simbolos do código C, que recentemente entrou em distribuição. Agora este depurador é em grande parte no espirito do Dbx, que é o depurador que acompanha o Berkeley Unix.
— Richard Stallman

O GDB é um software livre licenciado através da GNU General Public License. Foi modelado depois do depurador Dbx, que acompanhava a distribuição Berkeley Unix.[3] Desde 1990 até 1993 o GDB foi mantido por John Gilmore enquanto ele trabalhava para a Cygnus Solutions. Após este período, durante alguns anos, a Free Software Foundation nomeava membros que compunham o que era chamado de Comitê Diretor do GDB (ou GDB Steering Committee, em inglês). Em 2011, o conceito de Comitê Diretor foi desfeito e o projeto passou a ser mantido por um grupo de mantenedores globais que também é formado através de nomeações da Free Software Foundation.[4][5]

Versões[editar | editar código-fonte]

  • 2014 Fevereiro 06: GDB 7.7
  • 2013 Dezembro 08: GDB 7.6.2
  • 2013 Agosto 30: GDB 7.6.1
  • 2013 Abril 26: GDB 7.6
  • 2012 Novembro 29: GDB 7.5.1
  • 2012 Agosto 17: GDB 7.5
  • 2012 Abril 26: GDB 7.4.1
  • 2012 Janeiro 24: GDB 7.4
  • 2011 Julho 26: GDB 7.3[6]
  • 2010 Setembro 2: GDB 7.2
  • 2010 Março 18: GDB 7.1
  • 2009 Outubro 6: GDB 7.0
  • 2008 Março 27: GDB 6.8
  • 2003 Outubro 3: GDB 6.0

Detalhes técnicos[editar | editar código-fonte]

Características[editar | editar código-fonte]

O GDB oferece várias facilidades para a depuração de programas. O usuário pode monitorar e alterar valores de variáveis internas do sistema, e até chamar funções de forma independente do fluxo do programa.

Os processadores suportados pelo GDB (até 2003) incluem: Alpha, ARM, H8/300, System/370, System 390, X86 e X86-64, IA-64 "Itanium", Motorola 68000, MIPS,PA-RISC, PowerPC, SuperH, SPARC, VAX.

Também são suportados alguns processadores menos conhecidos como: A29K, ARC, AVR, CRIS, D10V, D30V, FR-30, FR-V, Intel i960, M32R, 68HC11, Motorola 88000, MCORE, MN10200, MN10300, NS32K, Stormy16, V850, VAX, e Z8000. (Em versões novas alguns destes processadores não serão suportados.)[7] O GDB possui suporte a simuladores para processadores ainda menos conhecidos, como M32R ou V850.

Interface gráfica de usuário[editar | editar código-fonte]

O depurador não contém a sua própria interface gráfica do utilizador, suportando apenas a interface CUI ou interpretador de comandos. Por outro lado, existem alguns softwares que implementam uma interface gráfica para ele, como o DDD, GDBtk/Insight, Emacs no modo "GUD" ou o Eclipse com o plugin CDT. Estes programas oferecem facilidades similares às encontradas nas IDEs.

O GDB continua em desenvolvimento, e desde a versão 7.0 as novas funcionalidades incluem suporte para scripts Python.[8] Desde a versão 7.0, existe suporte para "depuração reversível" — permitindo a recuar na sessão de depuração, muito parecido ao botão de desenrolar permitindo visualizar o pane no programa para ver o que aconteceu.[9] Outras ferramentas foram projetadas para trabalharem junto com o GDB, como detectores de vazamento de memória.

Exemplos de comandos[editar | editar código-fonte]

gdb program depura "programa" (da consola)
run -v corre programa lido com parametros
bt recua (em caso de pane do programa)
info registers imprime todos os registos
disass $pc-32, $pc+32 reverter assemblador ou desmontar

Uma sessão como exemplo[editar | editar código-fonte]

Considere o seguinte código-fonte escrito em C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

size_t
foo_len (const char *s)
{
  return strlen (s);
}

int
main (int argc, char *argv[])
{
  const char *a = NULL;

  printf ("size of a = %d\n", foo_len (a));

  exit (0);
}

Utilizando o compilador GCC no sistema GNU/Linux, o código acima deve ser compilado usando-se a opção -g para que as informações de depuração apropriadas sejam incluídas no executável gerado, tornando possível a utilização do GDB para inspecioná-lo. Assumindo-se que o arquivo contendo o código acima é chamado example.c, o comando para a compilação poderia ser:

gcc example.c -g -o example

E o programa agora pode ser executado:

# ./example
Segmentation fault

Quando o código de exemplo é executado, uma falha de segmentação é gerada. Portanto, podemos utilizar o GDB para inspecionar o problema.

# gdb ./example
GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /path/example...done.
(gdb) run
Starting program: /path/example

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400527 in foo_len (s=0x0) at example.c:8
8	  return strlen (s);
(gdb) print s
$1 = 0x0

O problema está presente na linha 8, e ocorre quando a função strlen é chamada (porque seu argumento, s, é NULL). Para corrigir o problema, a variável a (na função main) deve conter uma string válida. Aqui está uma uma versão corrigida do código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

size_t
foo_len (const char *s)
{
  return strlen (s);
}

int
main (int argc, char *argv[])
{
  const char *a = "This is a test string";

  printf ("size of a = %d\n", foo_len (a));

  exit (0);
}

Ao recompilar e executar novamente o programa dentro do GDB, agora é possível observar o resultado correto:

GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /path/example...done.
(gdb) run
Starting program: /path/example
size of a = 21
[Inferior 1 (process 14290) exited normally]

O GDB imprime a saída do comando printf na tela, e então informa ao usuário que o programa terminou normalmente.

Ver também[editar | editar código-fonte]

Referências

  1. «Documentação do GDB - Linguagens de programação suportadas» (em inglês). Consultado em 15 de abril de 2014 
  2. «Sumário da documentação do GDB» (em inglês). Consultado em 15 de abril de 2014 
  3. a b «Richard Stallman lecture at the Royal Institute of Technology, Sweden (1986-10-30)» (em inglês). Consultado em 15 de abril de 2014 
  4. «The Official FSF-appointed GDB Maintainers» (em inglês). Consultado em 15 de abril de 2014 
  5. «MAINTAINERS: Official FSF-appointed maintainers change» (em inglês). Consultado em 15 de abril de 2014 
  6. http://www.gnu.org/software/gdb/news/
  7. «Documentação GDB» (em inglês). Consultado em 1 de dezembro de 2011 
  8. «Notas distribuição GDB 7.0» (em inglês)  Parâmetro desconhecido |acessdata= ignorado (ajuda)
  9. «Reverse Debugging with GDB» (em inglês). Consultado em 28 de junho de 2012 

Ligações externas[editar | editar código-fonte]