GNU Debugger

(Redirecionado de 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]

GNU Debugger
DesenvolvedorProjecto GNU
Sistema operativoUnix-like, Windows
Gênero(s)depurador
LicençaGNU GPL
Página oficialwww.gnu.org/software/gdb

História

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

  • 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

Características

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

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

gdb programdepura "programa" (da consola)
run -vcorre programa lido com parametros
bt recua (em caso de pane do programa)
info registersimprime todos os registos
disass $pc-32, $pc+32reverter assemblador ou desmontar

Uma sessão como exemplo

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

#include <stdio.h>#include <stdlib.h>#include <string.h>size_tfoo_len (const char *s){  return strlen (s);}intmain (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:

# ./exampleSegmentation fault

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

# gdb ./exampleGNU 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) runStarting program: /path/exampleProgram received signal SIGSEGV, Segmentation fault.0x0000000000400527 in foo_len (s=0x0) at example.c:88  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_tfoo_len (const char *s){  return strlen (s);}intmain (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) runStarting program: /path/examplesize 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

Referências

Ligações externas