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:
Carregar o programa sob gdb.
Por exemplo, digite gdb dbgtst para carregar um programa chamado dbgtst dentro gdb.
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)
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.
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.