O GNU Debugger é usado para depurar um programa, para analisar travamentos ou para ver o que o programa faz em um determinado ponto. Ele foi desenvolvido pelo Projeto GNU na década de 1980 e tem sido um dos depuradores de linha de comando mais amplamente usados, bem como um dos softwares GNU mais populares.
Vamos primeiro escrever um pequeno programa em C que depois depuraremos. Para começar, crie um novo .c
arquivo usando vim
ou qualquer editor de sua escolha:
vim test.c
Crie o seguinte programa C:
#include int main () {int i = 5; float f = 5,5 i = i + 3; f = f + 2,2; printf ("Os valores de i e f são:% d e% f \ n", i, f); return 0; }
pressione Fuga
para ir para o modo de comando do vim. Então digite : wq
para salvar o programa e sair.
Compile e veja se o programa roda:
gcc test.c -o test ./test Os valores de i e f são: 8 e 7.700000
Para habilitar o suporte à depuração em um programa, nós compilamos com -g
bandeira. Se o sinalizador não for usado, o usuário ainda pode depurar o programa, embora com opções limitadas.
gcc test.c -g -o test
Para começar a depurar nosso arquivo executável teste
dentro gdb
, Nós corremos:
teste gdb
Vai abrir o gdb
console, onde você pode digitar o gdb
comandos. Para ver uma lista de comandos, use o ajuda
comando.
$ (gdb) help Lista de classes de comandos: aliases - Aliases de outros pontos de interrupção de comandos - Fazendo o programa parar em certos dados de pontos - Examinando arquivos de dados - Especificando e examinando arquivos internos - Comandos de manutenção obscuros - Recursos obscuros em execução - Executando a pilha do programa - Examinando o status da pilha - Suporte a consultas de status - Pontos de rastreamento de recursos de suporte - Rastreamento da execução do programa sem interromper o programa definido pelo usuário - Comandos definidos pelo usuário Digite "help" seguido por um nome de classe para obter uma lista de comandos dessa classe. Digite "help all" para obter a lista de todos os comandos. Digite "help" seguido do nome do comando para obter a documentação completa. Digite "apropos palavra" para pesquisar comandos relacionados a "palavra". Abreviações de nomes de comandos são permitidas se não forem ambíguas.
Você pode então digitar ajuda class_name
para ver os comandos pertencentes a essa classe. Para pesquisar comandos usando uma substring, use a propósito da substring
.
Para definir um ponto de interrupção quando o programa entra em uma função, corre:
$ (gdb) break main
Aqui, definimos um ponto de interrupção na única função em nosso código, ou seja, a Principal
. Use o comando corre
para executar o programa até o próximo ponto de interrupção ou até sair.
$ (gdb) run
Para definir um ponto de interrupção em um local específico em uma função, usar:
break * main + 4
Isso configurará um ponto de interrupção na 4ª linha da função principal.
Agora, para passar pelo fluxo do programa para a próxima linha de código, simplesmente execute o degrau
comando.
$ (gdb) etapa 5: float f = 5.5;
Para exibir o conteúdo de uma variável, corre exibição
.
$ (gdb) exibir i 6: i = 5
Para modificar o conteúdo de uma variável, que pode ser necessário para analisar a execução de um programa sob valores específicos de uma variável, execute definir variável = Expressão
.
$ (gdb) definir variável i = 10 $ (gdb) exibir i 7: i = 10
Aqui, a 'Expressão' pode ser qualquer expressão válida (aritmética / lógica). Por questão de simplicidade, apenas atribuímos outro valor (10) à variável eu
.
Para imprimir o código de montagem do programa, use o comando desmontar nome da função
:
Use apenas desmontar
para imprimir o código assembly para todo o programa. Observe a seta em uma linha específica no código de montagem. Isso denota que a sessão de depuração está atualmente pausada naquele local de memória específico (ou seja, aquela linha de código).
Para pular o depurador em uma determinada linha de código, corre:
$ (gdb) jump * main + 2 Continuando em 0x400528. Ponto de interrupção 2, 0x000000000040052a em main () em test.c: 3 3 int main () {1: i = 2: f = 3: h = (vazio *) 0x0 4: main = {int ()} 0x400526 5: i =
Isso fará com que o depurador salte para a localização da memória da 2ª linha de código em função a Principal
. Observe que aqui eu pulei do início do local principal para o segundo local. Conseqüentemente, variável eu
nunca foi definido, o que resulta no erro de lançamento do depurador que não pode acessar o conteúdo da memória no endereço da variável eu
.
Estes são alguns dos comandos básicos que podem ajudá-lo a começar a depurar um arquivo executável no Linux. Esperamos que as informações nesta página sejam úteis.