GNU Debugger
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 | |
---|---|
Desenvolvedor | Projecto GNU |
Sistema operativo | Unix-like, Windows |
Gênero(s) | depurador |
Licença | GNU GPL |
Página oficial | www |
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 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
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
- Richard Stallman, Roland Pesch, Stan Shebs, et al., Debugging with GDB (Free Software Foundation, 2002) ISBN 1-882114-88-4
- Norman Matloff, P. J. Salzman, The Art of Debugging with GDB/DDD: For Professionals and Students (No Starch Press, 2003) ISBN 1-59327-002-X