GNU Debugger

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa
GNU Debugger 
Desenvolvedor: Projecto GNU
Última versão: 7.4.1 / 26 de Abril, 2012
Gênero Debugger
Licença: GNU General Public License
Website: gnu.org/software/gdb/


O GNU Debugger, mais conhecido por GDB, é um depurador, ou debugger, do projeto GNU. Ele pode ser usado para depuração em muitos sistemas do tipo Unix e suporta muitas linguagens de programação, como C, C++ e FORTRAN.

Índice

[editar] História

Originalmente escrito por Richard Stallman em 1988, o GDB é um software livre licenciado através da GNU General Public License.

Desde 1990 até 1993 ela foi mantida por John Gilmore enquanto ele trabalhava para a Cygnus Solutions.

[editar] Detalhes técnicos

[editar] 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.

[editar] Limitações

O depurador não contém a sua própria interface gráfica, suportando apenas a interface CUI (Console user interface) do 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.

Outras ferramentas foram projetadas para trabalharem junto com o GDB, como detectores de memory leaks.

[editar] Uma sessão como exemplo

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.

[editar] Referências

[editar] Ver também