Encontrar bugs no linux usando gdb
Para entender como você pode encontrar bugs no Linux usando gdb
Conteúdo
#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:
Carregar o programa sob gdb.
Por exemplo, tipo gdb dbgtst para carregar um programa chamado dbgtst dentro gdb.
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)
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.
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.