Upload
haliem
View
217
Download
5
Embed Size (px)
Citation preview
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.
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/)
Environnements de développement avec débogueur :
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 quedans un langage compilé.
Astuce
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 syssys.excepthook = infodel infodel sys
Créez le fichier $HOME/.local/lib/python2.6/site-packages/sitecustomize.pyavec le contenu suivant :
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.