# 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, e parcialmente outras.

## 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".
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. 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.

### 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
* 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.) 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. 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. 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:
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:
E o programa agora pode ser executado:
Quando o código de exemplo é executado, uma falha de segmentação é gerada. Portanto, podemos utilizar o GDB para inspecionar o problema.
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:
Ao recompilar e executar novamente o programa dentro do GDB, agora é possível observar o resultado correto:
O GDB imprime a saída do comando printf na tela, e então informa ao usuário que o programa terminou normalmente.