TP unix shell - le debogueur - Calcul de racine carrée

Exercice 1: Le débogueur

Un débogueur est un programme qui exécute d’autres programmes, permettant a` l’utilisateur d’avoir un contrôle sur ceux-ci et d’examiner le contenu des variables lorsqu’un problème survient. Le plus connu des débogueurs est gdb le débogueur de GNU, c’est lui que nous allons utiliser. Pour pouvoir débogueur un programme, celui ci doit être compiléavec l’option -g. Attention : sur nos machines, vous devrez spécifier -gstabs+ a` la place de -g (cela n’est pas nécessaire habituellement).

gcc -gstabs+ bug1.c

Cette compilation produit un fichier a.out que nous allons exécuter pas a` pas a` l’aide de gdb. Pour cela tapez d’abord la commande :

gdb a.out

Vous êtes maintenant dans l’interpréteur de commande de gdb. Celui ci attend votre ordre pour lancer le programme a.out. Ceci se fait a` l’aide de la commande

run

Si votre programme a des paramètres, ceux-ci peuvent être pris en compte par run vos_paramètres

(ceci inclus même la redirection d’un fichier en entrée).

Récuperez les trois fichiers bug1.c, bug2.c et bug3.c. Le but est d’apprendre le débogueur sur des fichiers simples; jouez le jeu en lançant le débogueur sans corriger les fichiers.

Astuce : gdb autorise la complétion. Essayez inf suivi de la touche Tab, tapez ensuite br suivi de la touche Tab. Essayez aussi les touches haut, bas.

1.1 - Pour bug1.c

– compilez avec gcc -g -o bug1 bug1 c

– lancez le débogueur avec gdb bug1

– tapez list plusieurs fois. Tapez help list et lancez la commande pour afficher le fichier source autour de la fonction main, puis la commande pour lister les 20 premieres lignes du fichier.

– tapez break main, puis break 9, puis break 11, puis break 13.

– tapez info breakpoints

– supprimez le point d’arrêt correspondant a` la ligne 13.

– tapez info breakpoints

– lancez le programme avec run

– tapez print s puis print i. Les valeurs vous semblent-elle normales?

– tapez continue qui reprend l’exécution jusqu’au prochain point d’arrêt, c’est-à-dire a` la ligne 9.

– Tapez continue a` nouveau: le programme ne s’arrête pas. Tapez Controle-c et le débogueur vous rend la main. Le débogueur vous dit alors oüle programme a étéinterrompu (ligne 9). Tapez where pour afficher l’état de la pile d’exécution (comme il n’y a pas eu d’appels de fonctions, nous sommes au niveau le plus bas (#0) a` la ligne 9 dans la fonction main

– quittez le débogueur, retirez le point virgule, et relancez le débogueur.

– mettez un point d’arrêt a` la ligne 11 et relancez avec run

– tapez display i et display s.

– tapez next plusieurs fois (voir aide de next au début du TP)

– tapez cont. Quelle est la différence avec next?

– supprimez le point d’arrêt de la ligne 11 et continuez l’exécution avec cont.

– le programme ne s’arrête pas car la boucle boucle sans fin!

– vous avez trouvéle probleme qui est dans le test d’arrêt.

– corrigez le programme et vérifiez la sortie en ligne de commande.

1.2 Pour bug2.c

– mettez un point d’arrêt a` la ligne 15.

– tapez next. Est-on rentrédans la boucle?

– corrigez le programme et relancez le débogueur.

mettez un point d’arrêt ligne 15, tapez run et affichez en permanence la valeur de i et Un.

tapez ensuite cont quatre fois.

retirez ensuite le point d’arrêt en et tapez cont

le programme doit se terminer

1.3 Pour bug3.c

lancez le débogueur et tapez run. Le résultat est-il correct?

mettez un point d’arrêt ligne 16.

tapez run puis next deux fois. Que vaut somme?

tapez kill puis run. Cette fois-ci tapez step a` la place de next. Cette fois, vous rentrez dans la fonction.

– tapez where pour voir l’état de la pile. Vous voyez que vous êtes dans la fonction somme carres et que cette fonction a étéappelée depuis la fonction main.

tapez break 8 puis cont.

tapez print i et print s.

– tapez print nb pour voir la valeur de la variable nb de la fonction main. Est-ce que le message d’erreur vous semble normal?

– sans changer le comportement du programme, nous allons “sortir” du contexte de la fonction somme carres pour aller examiner le contenu de nb dans le main. Tapez up puis affichez le contenu de nb et somme. Essayez d’afficher la valeur de i. Tapez info frame, vous voyez que vous êtes dans main. Tapez down puis info frame, vous êtes revenus dans somme carres.

– Tapez where full (qui en plus de where affiche les variables locales).

– tapez display i et display s puis tapez cont plusieurs fois. L’exécution vous semble-t-elle normale?

– nous voulons que le point d’arrêt ne soit effectif que si s devient négatif. Tapez help condition puis ajoutez la condition.

– tapez ensuite cont. s devrait alors être négatif et i doit valoir 1862.

– ce programme n’est donc pas réellement bogué. Il faut s’assurer que le paramètre de somme carres est inférieur a` une valeur que vous devez déterminer.

– Stoppez le programme avec kill, supprimer tous les points d’arrêts avec delete. Tapez breakpoint 5 puis run. Tapez ensuite watch s après avoir regardél’aide de watch. Tapez ensuite cont plusieurs fois. Vous verrez la valeur de s changer.

Exercice 2:  Calcul de racine carrée

Nous allons dans cette partie créer un programme qui calcule et affiche la racine carréd’un entier N saisi au clavier

par l’utilisateur. Ce programme doit demander a` l’utilisateur laquelle des trois méthodes suivantes il veut utiliser.

– Utiliser la fonction sqrt de la bibliothèque mathématique (include du fichier math.h, compilation avec l’option

-lm)

– Utiliser une méthode dichotomique.

– Utiliser la méthode de Newton oücalculer la racine carrée de N revient a` trouver x tel que f(x) = x2 - N = 0. On va donc calculer le zéro de la fonction x2 - N comme limite de la suite x0 = N, xn+1 = xn - f(xn)/f'(xn). Soit encore x0 = N,xn+1 = x, 2 + N

2x,

Vous utiliserez impérativement le débogueur (même si votre programme fonctionne) pour tester l’exécution et afficher les variables des méthodes dichotomique et de Newton.

Article publié le 10 Septembre 2009 Mise à jour le Mercredi, 03 Mars 2010 02:30 par Salim KHALIL