Como usar o GNU Debugger no Linux

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.