Débogage en Python

publicité
Débogage en Python
Konrad HINSEN
Centre de Biophysique Moléculaire (Orléans)
et
Synchrotron Soleil (St Aubin)
Outils de débogage Python
Module pdb dans la bibliothèque Python.
Winpdb (http://winpdb.org/), un débogueur graphique (aucun
lien avec le Windows de Microsoft !)
PuDB (http://pypi.python.org/pypi/pudb), un débogueur
sémi-graphique.
pydbgr (http://code.google.com/p/pydbgr/), une version
améliorée de pdb.
Environnements de développement avec débogueur :
IDLE (fait partie de la distribution Python)
PyDev (http://pydev.org/), une extension pour Eclipse
WingIDE (http://wingware.com/)
Komodo IDE (http://www.activestate.com/komodo/features/)
Débogage post-mortem
Situation fréquente: votre code se plante avec une exception et vous
voulez savoir pourquoi.
Options :
1)
Faites tourner votre programme sous contrôle d’un débogueur
et attendez l’exception :
python -m pdb mon_script.py
2)
Faites tourner votre programme dans un environnement interactif
(python -i, ipython, IDLE, ...) et démarrez pdb après l’exception:
import pdb
pdb.pm()
En Python, le débogage post-mortem est beaucoup plus utile que
dans un langage compilé.
Astuce
Créez le fichier $HOME/.local/lib/python2.6/site-packages/sitecustomize.py
avec le contenu suivant :
def info(type, value, tb):
import sys
if hasattr(sys, 'ps1') or not sys.stderr.isatty():
sys.__excepthook__(type, value, tb)
else:
import traceback, pdb
traceback.print_exception(type, value, tb)
print
pdb.pm()
import sys
sys.excepthook = info
del info
del sys
Python lance alors automatiquement pdb à chaque exception non traitée.
Attention : cette astuce ne marche pas sous Ubuntu !!!
Il faut modifier /usr/lib/python2.6/sitecustomize.py
Points de suspension
Situation fréquente : votre code produit des résultats suspects.
- Démarrez votre programme sous contrôle d’un débogueur (pdb:
lancez avec “python -m pdb”, IDLE: menu “debugger”)
- Mettez un point de suspension (pdb: b, IDLE: clic droit) au début de
la partie suspecte
- Continuez l’exécution (pdb: c, IDLE: Go) jusqu’au point de
suspension, puis exécuter ligne par ligne
Exécution ligne par ligne :
- “Step” (pdb: s) s’arrête à la prochaine occasion, ce qui est le plus
souvent le début d’une fonction qu’on appelle.
- “Over” (pdb: n) exécute une commande et s’arrête après.
- “Out” (pdb: r) s’arrête à la fin de la fonction.
Suspension conditionnelle
Situation fréquente : un point de suspension doit être passé des
centaines de fois avant qu’on arrive au point intéressant. Pour ne pas
devoir taper “c” des centaines de fois...
Points de suspensions conditionnels (pdb) :
condition <numéro> <condition>
Si au point de suspension la condition n’est pas remplie, l’exécution
reprend tout de suite.
Compteur de passage (pdb) :
ignore <numéro> <n>
Le point de suspension est ignoré n fois avant de devenir actif.
PDB: analyser l’état du
programme
Se retrouver dans le code source :
- (w)here affiche une trace de la pile
- (l)ist affiche 11 lignes de code centrées sur la ligne visée
- (u)p et (d)own montent et descendent dans la trace de pile
Valeurs des variables :
- (p)rint affiche la valeur d’une expression Python quelconque
Tracer des expressions aux points de suspension :
- command <numéro>
print <expression>
end
Exercice: Trouvez les bogues !
Le script simulateur.py contient un simulateur (très basique, pas du tout
optimisé) du système solaire. Un grand méchant y a introduit trois
erreurs. Corrigez-les en utilisant l’outil de votre choix (pdb et/ou
IDLE) !
Pour vous aider un peu, le fichier simulateur.log contient un protocole
d’exécution du simulateur avant l’intervention du grand méchant.
Téléchargement