Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
En pratique : Déboguer avec MonAm
(Article écrit par Denis Jarril et extrait d'Amiga News Tech - octobre 1991)
|
|
Après une longue discussion téléphonique avec l'un de nos innombrables abonnés, je me suis rendu compte
que peu de gens savaient utiliser efficacement ce superbe et dispensable outil qu'est MonAm.
Pourtant, ledit abonné était un utilisateur "officiel" du Devpac, c'est-à-dire qu'il l'avait
acheté tout à fait légalement, et était même allé jusqu'à renvoyer sa carte de garantie à HiSoft
(ce que, malheureusement pour eux, peu de Français font). C'est à ces gens-là uniquement que cet
article s'adresse ; il ne servira absolument pas de mode d'emploi aux utilisateurs "officieux", qui
se seraient procuré le Devpac par des voies détournées...
Pourquoi un débogueur ?
C'est bien connu, les programmes écrits en langage machine sont plus particulièrement sujets à des
erreurs. Cela peut aller de la plus bénine (la simple erreur d'affichage, très simple à corriger,
qui entraîne une illisibilité totale du texte), jusqu'à la sérieuse (résultat d'un calcul erroné)
et à la carrément catastrophique (plantage de l'Amiga). Un débogueur vous aide à trouver ces erreurs et
à les corriger. Il se présente généralement sous la forme d'un désassembleur qui vous permet
d'exécuter votre programme pas à pas, instruction par instruction. Vous pouvez ainsi facilement
repérer les endroits de votre programme qui ne réagissent pas comme vous l'auriez souhaité.
MonAm est un débogueur symbolique, c'est-à-dire qu'il désassemble le code machine en utilisant tous
les labels définis dans votre programme source, exactement comme si vous vous trouviez encore dans
l'éditeur GenAm. Cette présentation est évidemment d'une aide très précieuse et simplifie grandement
la recherche des bogues. La seule condition à ceci est que le programme exécutable contienne un (ou
plusieurs) HUNK_SYMBOL, ce que GenIm, l'assembleur du Devpac, sait parfaitement faire (assembler
avec l'option "Debug Info" sur "Normal" ou "Exports"). Notez enfin que bien que MonAm soit un
débogueur de bas niveau (c'est-à-dire ne présentant que les codes machine du programme et les registres
du micro-processeur), on peut également s'en servir pour déboguer des programmes écrits en un autre
langage, comme le C ou le Pascal.
Les exceptions
MonAm sait parfaitement reconnaître quand une exception. au sens 68000 du terme, survient. Ces exceptions
provoquent normalement une requête Software Error - Task held ou un Guru Meditation. MonAm détourne les
exceptions sur une routine à lui et vous permet de poursuivre l'exécution du programme fautif comme si
de rien n'était. Cela n'est bien entendu valable que pour le programme en cours de débogage ; si une
autre tâche venait à provoquer une exception, le Guru apparaîtrait de toute manière.
Pour tracer un programme instruction par instruction, MonAm utilise ce que l'on appelle des points d'arrêt.
Pour placer un tel point d'arrêt dans un programme. MonAm y insère le code machine $4AFC, correspondant
à l'instruction 68000 ILLEGAL. Son convertisseur d'exception intégré est alors capable de déterminer si
cette instruction définissait un point d'arrêt, ou si elle était le fruit d'une erreur dans le programme.
Dans les deux cas, MonAm suspend l'exécution du programme, mais la suite des évènements dépend bien sûr
de la raison de la présence de l'instruction ILLEGAL ici. Nous reviendrons plus en détails sur les points
d'arrêts un peu plus loin.
L'écran de MonAm
L'illustration ci-dessous représente l'écran de MonAm, avec toutes les fenêtres qu'il est possible d'y
ouvrir (cinq en tout).
- La première présente les registres du 68000 (leur contenu et quelques octets de la mémoire qu'ils pointent).
- La seconde est la fenêtre de désassemblage principale.
- La troisième présente une recopie du contenu ("dump") hexadécimale et ASCII de la mémoire.
- La quatrième fenêtre peut être utilisée soit pour désassembler une autre portion du programme que
celle affichée dans la fenêtre 1 soit pour visionner un texte source, comme ici.
- Enfin, la cinquième fenêtre présente une seconde copie de la mémoire, très pratique pour comparer
une zone avec celle affichée dans la fenêtre 3.
En mode trace, MonAm rafraîchit le contenu de toutes ses fenêtres après chaque instruction exécutée.
Cela vous permet de suivre en temps réel la modification d'un tableau en mémoire, par exemple. De
plus, et à l'exception de la première, toutes les fenêtres de MonAm peuvent être liées à un registre
particulier. Ainsi, après chaque instruction, l'adresse de la mémoire représentée par cette fenêtre
est recalculée. Par défaut, la fenêtre 2 est liée au PC.
Les expressions numériques
MonAm dispose d'un véritable interpréteur pour évaluer les expressions que vous lui
fournissez soit directement, soit en tant que paramètre d'une commande. Cet interpréteur prend
même en compte la priorité des opérateurs arithmétiques !
MonAm considère que tous les nombres entrés sont en hexadécimal. Pour entrer un nombre en décimal,
il faut le précéder du signe "\". Quand un nombre hexadécimal pourrait être confondu avec un nom
de registre, il faut le faire précéder du signe "$" ou d'un "0". Vous pouvez également utiliser
les registres du 68000 dans une expression. Quant aux accolades "{" et "}", elle représentent le
contenu de l'adresse pointée par l'expression qu'elles entourent. Ainsi, des expressions comme :
...sont parfaitement valides.
Il existe également plusieurs symboles réservés :
- CODE : adresse du premier segment du programme.
- HUNKx : adresse du xème segment du programme.
- SP : pointeur de pile courant (USP ou SSP).
- SSP : pointeur de pile superviseur.
- SR : registre d'état du processeur.
Enfin, 10 variables, numérotées de M0 à M9 peuvent prendre les valeurs de votre choix.
Par défaut, les variables M2 à M5 contiennent l'adresse de début des fenêtres correspondantes.
M0 et M1 sont positionnés, lorsque l'on charge un fichier binaire (pas un programme !) en mémoire,
respectivement sur l'adresse de début et l'adresse de fin du fichier.
Les points d'arrêt
Les points d'arrêt de MonAm sont conditionnels, c'est-à-dire que l'on peut préciser certaines
conditions que MonAm évaluera avant de décider s'il doit interrompre ou non l'exécution du
programme en cours.
La première forme de point d'arrêt est la plus simple : le programme s'interrompra une fois ce
point d'arrêt atteint, et le point d'arrêt sera effacé. L'utilisation la plus évidente est de permettre
l'exécution du programme jusqu'à ce qu'une routine particulière soit atteinte.
La seconde forme de point d'arrêt est permanente ; chaque fois que le programme passera sur ce point
d'arrêt, il sera interrompu.
La troisième forme de point d'arrêt introduit la notion de compteur ; le programme ne s'arrêtera qu'après
être passé un certain nombre de fois (défini par vous) sur ce point d'arrêt, ce qui est très utile dans les
boucles.
Enfin, la forme la plus puissante est le point d'arrêt conditionnel, c'est-à-dire que le programme ne
sera interrompu que si la condition spécifiée est remplie. Cette condition peut aussi bien être un registre
qui prend une valeur particulière, qu'une zone de mémoire qui soit modifiée, soit encore que le bit Z
de SR soit positionné. Toutes les expressions vues plus haut sont valides.
La commande "Amiga droite+B", qui permet de placer un point d'arrêt à une adresse donnée, accepte plusieurs
formes de paramètres :
Dans la table ci-dessus, "<adr>" représente une adresse quelconque (par exemple, un label du programme),
et "<exp>" une expression valide. MonAm ne peut pas placer de points d'arrêt à des adresses impaires ni en ROM.
Voilà pour l'essentiel de MonAm. Nous continuerons le mois prochain notre survol de ses
principales fonctionnalités.
|