Encontrar bugs 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, então o seguinte, dbgtst.c, é um programa artificial que contém um erro típico.

#include buf static char [256] -void read_input (char * s) -int principal (void) {char * entrada nulo = / * Apenas um ponteiro, sem armazenamento de cadeia * / read_input (de entrada) - / * comando Processo . * / Printf ("Você digitou:% sn", entrada)-/* . . ._ * / 0- retornar} void read_input (char * s) {printf ("Comando: ") -gets (s) -}

função principal deste programa chama o 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.

Video: Weird Bug in Linux. :/

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

gcc -g -o dbgtst dbgtst.c

Ignore a mensagem de aviso sobre a fica função sendo perigoso- você está tentando usar a desvantagem de que a função para ver como você pode usar gdb para rastrear erros.

Video: gdb commands tutorial

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

./ DbgtstCommand: culpa testSegmentation

O programa morre depois de exibir a falha de segmentação mensagem. Para um pequeno programa como este, você pode provavelmente encontrar a causa, examinando o código fonte. Em um aplicativo do 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, tipo gdb dbgtst para carregar um programa chamado dbgtst dentro gdb.



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

    Video: Teoria e prática sobre depuração em GDB

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

    (GDB) correComeçando programa: / home / edulaney / swdev / dbgtstCommand: testePrograma recebeu SIGSEGV sinal, 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 recebe () de /lib/tls/libc.so.6#1 0x08048474 em read_input (s = 0x0) na dbgtst.c: 16 # 2 0x08048436 em main () em dbgtst.c: 7 (gDB)

    O resultado mostra a sequência de chamadas de função. chamada de função # 0 - o mais recente - é o fica função de biblioteca C. o fica chamada tem origem no read_input função (na linha 16 do arquivo dbgtst.c), Que por sua vez é chamado a partir do 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 fica (s) -17} 18 (GDB)

    Depois de olhar para este perfil, você pode dizer que o problema pode ser o caminho read_input é chamado. Então você listar as linhas ao redor 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 principal (void) {5 * 6 entrada de char = nulo / * Apenas um ponteiro, sem armazenamento de cadeia * / 7 read_input (entrada) -8 / * Processo de comando. * / 9 printf ("Você digitou:% sn", De entrada) -10 / *. . . * / 11 0- retorno (GDB)

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


Publicações relacionadas