Mots clés : environnement de
programmation, analyse de programme, sémantique .
- Erreur
- Une erreur est une action humaine qui fait qu'un
résultat incorrect est produit par un programme. Par
exemple, une erreur peut être d'intervertir deux
variables A et B.
- Faute
- Une faute est une étape, un processus ou une
définition de données erronés dans un programme. Une
erreur peut générer une ou plusieurs fautes. Par exemple,
une faute induite par l'erreur citée plus haut peut être
qu'un test d'arrêt d'une boucle se fait sur A qui n'est
pas mise à jour.
- Panne
- Une panne est l'incapacité d'un programme à
effectuer ses fonctionnalités requises. Une faute peut
générer une ou plusieurs pannes [ANS]. Un exemple de panne résultant de la
faute citée plus haut est que le programme ne termine
pas.
Résumé :
Le débogage consiste à localiser et corriger les fautes
qui sont responsables des pannes logicielles. Le débogage
est une activité cognitive complexe qui nécessite, en
général, de remonter jusqu'à l'erreur humaine pour
comprendre les raisons des fautes qui ont engendré les
pannes.
Il existe des outils, communément appelés
débogueurs, qui aident le programmeur à identifier
les comportements non-attendus du programme. Ces outils
donnent une image (appelée trace) des détails de
l'exécution des programmes. On peut identifier trois tâches
principales pour la réalisation d'un véritable débogueur.
La première tâche consiste à déterminer les informations
qui doivent apparaître dans la trace. La deuxième tâche est
la mise en oeuvre des traceurs. La troisième tâche consiste
à automatiser le filtrage et l'analyse des traces
d'exécution afin de donner des informations pertinentes au
programmeur qui peut ainsi se concentrer sur le processus
cognitif.
Le débogage consiste à localiser et corriger les fautes
qui sont responsables des pannes logicielles. Une panne peut
être détectée après une exécution, par exemple à la suite de
phases de test (cf module 3.4) ou lors d'une phase
de vérification formelle. La première situation, la plus
fréquente dans la pratique actuelle, correspond à ce qu'on
appelle le débogage dynamique ; la seconde sera
qualifiée de débogage statique. Dans les deux cas,
l'objectif visé est de faire cesser les pannes
identifiées.
Le débogage est une activité cognitive complexe qui
nécessite, en général, de remonter jusqu'à l'erreur humaine
pour comprendre les raisons des fautes qui ont engendré les
pannes. Une panne est un symptÔme de faute qui se manifeste
en un comportement erroné du programme. Bien souvent le
programmeur ne maîtrise pas toutes les facettes du
comportement d'un programme. Par exemple, des points de
sémantique opérationnelle du langage peuvent lui échapper, le
programme peut être trop complexe, ou les librairies
utilisées peuvent avoir une documentation obscure. Nous
présentons dans un premier temps la problématique du débogage
dynamique avant de résumer les particularités introduites par
le débogage statique.
Pour ce qui est du débogage dynamique, il existe des
outils, communément appelés débogueurs, qui aident
le programmeur à identifier les comportements du programme
qui ne correspondent pas à l'idée qu'il s'en faisait. Ces
outils, qui devraient plutÔt s'appeler traceurs,
donnent une image (appelée trace) des détails de
l'exécution des programmes. Une trace est composée d'
événements remarquables.
On peut identifier trois tâches principales pour la
réalisation d'un véritable débogueur dynamique :
- La première tâche consiste à déterminer les
informations qui doivent apparaître dans la trace. La trace
est calquée sur la sémantique opérationnelle du langage
sans forcément en donner tous les détails. Elle fournit une
abstraction des étapes de calcul dont l'objectif est la
compréhension par l'utilisateur du comportement des
programmes. Elle dépend donc du langage et du type
d'utilisateur potentiel.
- La deuxième tâche est la mise en oeuvre des traceurs
qui nécessite l'insertion d'instructions de trace dans les
mécanismes d'exécution des programmes (appelée
instrumentation dans la suite). Cette
instrumentation peut se faire à différents niveaux :
dans le code source, dans le compilateur ou dans
l'émulateur quand il en existe un. La pratique courante
consiste à instrumenter à un niveau bas [Ros96] mais plus l'instrumentation est faite
à un niveau haut, plus elle est portable.
- Quand le programmeur dispose d'un traceur, il lui reste
à analyser les traces pour comprendre les comportements des
programmes et localiser les fautes. Cependant ces traces
donnent souvent trop de détails par rapport à la panne
analysée. La troisième tâche consiste à automatiser le
filtrage et l'analyse des traces d'exécution afin de donner
des informations plus pertinentes au programmeur qui peut
ainsi se concentrer sur son processus cognitif.
La dichotomie débogueur statique / débogueur dynamique
reflète tout à fait la distinction introduite plus haut
(module 3.2) entre
analyse statique et analyse dynamique. De fait, un débogueur
statique peut être vu comme un analyseur statique dédié à la
vérification de certaines classes de propriétés et intégré
dans un outil interactif. L'interaction doit permettre à
l'utilisateur de vérifier certaines hypothèses sur le
comportement du programme et d'identifier d'éventuelles
causes de dysfonctionnement sans exécuter le programme. Les
trois tâches identifiées plus haut pour le débogage dynamique
se retrouvent mutatis mutandis dans le contexte du
débogage statique : les traces sont alors des
abstractions de la sémantique opérationnelle du langage (cf
module 3.1)
et le filtrage réalise une approximation permettant de rendre
décidable la propriété recherchée.