Trouver des bugs dans linux en utilisant gdb

Pour comprendre comment vous pouvez trouver des bugs dans Linux en utilisant gdb, vous devez voir un exemple. La procédure est plus facile de montrer par un exemple simple, de sorte que le suivant, dbgtst.c, est un programme artificiel qui contient un bogue typique.

#inclure statique char buf [256] Read_Input -void (char * s) -int main (void) {char * entrée = null-/ * Juste un pointeur, pas de stockage de chaîne * / Read_Input (entrée) - / * commande Process . * / printf ("Vous avez saisi: n% s", entrée) - / *. . ._ * / return} 0- Read_Input void (char * s) {printf ("Commande:") -gets (s) -}

La fonction principale de ce programme appelle la Read_Input fonction pour obtenir une ligne d'entrée de l'utilisateur. La Read_Input fonction attend un tableau de caractères dans lequel elle retourne ce que les types d'utilisateurs. Dans cet exemple, toutefois, principal appels Read_Input avec un pointeur non initialisé - qui est le bug dans ce programme simple.

Construire le programme en utilisant gcc avec le -g Option:

gcc -g -o dbgtst dbgtst.c

Ignorez le message d'avertissement sur la obtient fonction étant dangerosité vous essayez d'utiliser le défaut de cette fonction pour voir comment vous pouvez utiliser gdb pour traquer les erreurs.

Pour voir le problème avec ce programme, l'exécuter et tapez test au Commande: Invite:

./ dbgtstCommand: testSegmentation faute



Le programme meurt après l'affichage du Segmentation fault message. Pour un si petit programme comme celui-ci, vous pouvez probablement trouver la cause en examinant le code source. Dans une application dans le monde réel, cependant, vous ne pouvez pas savoir immédiatement ce qui provoque l'erreur. Cela est quand vous avez à utiliser gdb pour trouver la cause du problème.

Utiliser gdb pour localiser un bug, suivez ces étapes:

  1. Chargez le programme en vertu gdb.

    Par exemple, tapez gdb dbgtst pour charger un programme nommé dbgtst dans gdb.

  2. Lancer l'exécution du programme en vertu gdb en tapant la courir commande. Lorsque le programme demande l'entrée, tapez du texte d'entrée.

    Le programme ne parvient pas comme il le faisait auparavant. Voici ce qui se passe avec le programme de dbgtst:

    (gdb) courirDémarrage du programme: / home / edulaney / swdev / dbgtstCommand: testProgramme signal reçu SIGSEGV, Segmentation fault.0x400802b6 dans gets () de /lib/tls/libc.so.6(gdb)
  3. Utilisez le commande pour déterminer où le programme est mort.

    Pour le programme de dbgtst, cette commande rendements de cette sortie:

    (gdb) où # 0 0x400802b6 en obtient () de /lib/tls/libc.so.6#1 0x08048474 dans Read_Input (s = 0x0) au dbgtst.c: 16 # 2 0x08048436 dans main () au dbgtst.c: 7 (gdb)

    La sortie montre la séquence d'appels de fonction. Appel de fonction # 0 - la plus récente - est à la obtient Fonction de la bibliothèque C. La obtient appel provient de la Read_Input fonction (à la ligne 16 du fichier dbgtst.c), Qui à son tour est appelée à partir de la principal fonction à la ligne 7 de la dbgtst.c fichier.

  4. Utilisez le liste commander pour inspecter les lignes de code source suspecte.

    Dans dbgtst, vous pouvez commencer par la ligne 16 du dbgtst.c déposer, comme suit:

    (gdb) dbgtst.c liste: 1611 retour 0-12} 13 Read_Input void (char * s) 14 {15 printf ("Commande:") -16 gets (s) -17} 18 (gdb)

    Après avoir regardé cette liste, vous pouvez dire que le problème peut être la manière Read_Input est appelé. Ensuite, vous énumérez les lignes autour de la ligne 7 à dbgtst.c (où le Read_Input appel provient):

    (gdb) liste dbgtst.c: 72 statique char buf [256] -3 Read_Input void (char * s) -4 int main (void) {5 6 char * entrée = null-/ * Juste un pointeur, pas de stockage à la corde * / 7 Read_Input (entrée) -8 / * commande de processus. * / 9 printf ("Vous avez saisi: n% s", entrée) -10 / *. . . * / 11 retour 0- (gdb)

    À ce stade, vous pouvez affiner le problème à la variable nommée contribution. Cette variable est un tableau, pas un NUL (ce qui signifie zéro) pointeur.


» » » » Trouver des bugs dans linux en utilisant gdb