GNU Debugger
| 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
- Richard M. 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