Procurar Erros no Linux usando gdb

Para entender como você pode encontrar bugs no Linux usando gdb, você precisa ver um exemplo. O procedimento é mais fácil de mostrar com um exemplo simples, de modo que se segue, dbgtst.c, é um programa artificial que contém um erro típico.

#include static char buf [256] -void read_input (char * s) -int main (void) {char * input = nulo-/ * Apenas um ponteiro, não armazenamento para string * / read_input (entrada) - / * comando Processo . * / Printf ( "Você digitou:% s n", de entrada) - / *. . ._ * / Return 0-} read_input void (char * s) {printf ( "Comando:") -gets (s) -}

função principal deste programa chama a read_input função para obter uma linha de entrada do usuário. o read_input função espera uma matriz de caracteres em que ele retorna o que o usuário digita. Neste exemplo, no entanto, a Principal chamadas read_input com um ponteiro não inicializado - que é o bug neste programa simples.

Criar o programa usando gcc com o -g opção:

gcc -g -o dbgtst dbgtst.c

Ignorar a mensagem de aviso sobre a fica função é perigoso- você está tentando usar a deficiência dessa função para ver como você pode usar gdb para rastrear erros.

Para ver o problema com este programa, executá-lo e digitar teste no Comando: pronto:

./ DbgtstCommand: falha testSegmentation

O programa morre depois de exibir a falha de segmentação mensagem. Para um pequeno programa como este, você provavelmente poderá encontrar a causa, examinando o código fonte. Em uma aplicação no mundo real, no entanto, você pode não saber imediatamente o que causa o erro. Isso é quando você tem que usar gdb para encontrar a causa do problema.

Usar gdb para localizar um erro, siga estes passos:

  1. Carregar o programa sob gdb.

    Por exemplo, digite gdb dbgtst para carregar um programa chamado dbgtst dentro gdb.

  2. Iniciar a execução do programa no âmbito do gdb digitando o corre comando. Quando o programa pede a introdução, escreva algum texto de entrada.

    O programa falhar, como o fez anteriormente. Eis o que acontece com o programa dbgtst:

    (GDB) correA partir do programa: / home / edulaney / swdev / dbgtstCommand: testePrograma recebeu sinal SIGSEGV, Segmentação fault.0x400802b6 em gets () a partir de /lib/tls/libc.so.6(gdb)
  3. Use o Onde comando para determinar onde o programa morreu.

    Para o programa dbgtst, este comando rendimentos esta saída:

    (GDB), onde # 0 0x400802b6 em gets () a partir de /lib/tls/libc.so.6#1 0x08048474 em read_input (s = 0x0) na dbgtst.c: 16 # 2 0x08048436 no main () na dbgtst.c: 7 (gDB)

    A saída mostra a sequência de chamadas de função. chamada de função # 0 - o mais recente - é a fica função de biblioteca C. o fica chamada tem origem no read_input function (na linha 16 do arquivo dbgtst.c), Que por sua vez é chamada a partir da a Principal função na linha 7 da dbgtst.c Arquivo.

  4. Use o Lista comando para inspecionar as linhas de código fonte suspeita.

    Dentro dbgtst, você pode começar com a linha 16 do dbgtst.c arquivo, como segue:

    (GDB) Lista dbgtst.c: 1611 retorno 0-12} 13 vazio read_input (char * s) 14 {15 printf ( "Comando:") -16 recebe (s) -17} 18 (GDB)

    Depois de olhar para este perfil, você pode dizer que o problema pode ser o caminho read_input é chamado. Em seguida, você listar as linhas ao redor da linha 7 em dbgtst.c (onde o read_input chamar origina):

    (GDB) Lista dbgtst.c: 72 buf static char [256] -3 vazio read_input (char * s) -4 int main (void) 5 {* Entrada 6 de char = nulo-/ * Apenas um ponteiro, não armazenamento para cadeia * / 7 read_input (entrada) -8 / * comando do processo. * / 9 printf ( "Você digitou:% s n", de entrada) -10 / *. . . * / 11 retorno 0- (GDB)

    Neste ponto, você pode restringir o problema para a variável chamada entrada. Essa variável é um array, não um NULO (O que significa zero) ponteiro.

menu