9. Le Débogueur Python

Le module pdb définit un débogueur interactif de code source pour les programmes Python. Il permet d'établir des points d'arrêt (breakpoints), éventuellement conditionnels, d'éxecuter pas à pas les lignes de source, d'inspecter l'état de la pile, de voir le code source et d'évaluer du code Python quelconque dans le contexte d'une instance d'activation (stack frame) quelconque. Il sert aussi au débogage post-mortem et peut être appelé sous contrôle d'un programme.

Le débogueur est extensible --- il est en fait défini comme la classe Pdb. Ceci n'est pas documenté, mais on le comprend aisément à partir des sources. L'interface d'extension utilise les modules bdb (non documenté) et cmd.

Une version à fenêtres du débogueur existe aussi --- c'est le module wdb, qui a besoin de stdwin.

L'invite du débogueur est "(Pdb) ". Voici une session d'utilisation typique du débogueur pour exécuter un programme:

>>> import pdb
>>> import mon_module
>>> pdb.run('mon_module.test()')
> <string>(0)?()
(Pdb) continue
> <string>(1)?()
(Pdb) continue
NameError: 'spam'
> <string>(1)?()
(Pdb) 

pdb.py peut aussi être invoqué comme un script pour déboguer d'autres scripts. Par exemple:

python /usr/local/lib/python1.5/pdb.py mon_script.py

L'usage pour l'inspection d'un programme avorté est:

>>> import pdb
>>> import mon_module
>>> mon_module.test()
Traceback (innermost last):
  File "<stdin>", line 1, in ?
  File "./mon_module.py", line 4, in test
    test2()
  File "./mon_module.py", line 3, in test2
    print spam
NameError: spam
>>> pdb.pm()
> ./mon_module.py(3)test2()
-> print spam
(Pdb) 

Le module définit les fonctions suivantes; chacune permet de rentrer dans le débogueur de façon légèrement différente:

run(instruction[, globales[, locales]])
Exécute l'instruction (passée comme une chaîne) sous contrôle du débogueur. L'invite du débogueur apparaît avant que le code soit exécuté; vous pouvez installer des points d'arrêt et taper "continue", ou bien vous pouvez avancer dans les commandes pas à pas avec "step" ou "next" (toutes ces commandes seront expliquées ci-après). Les arguments optionnels globals et locals spécifient l'environnement dans lequel le code sera exécuté; par défaut, il s'agit du dictionnaire du module __main__. (Voir l'explication de l'instruction exec ou de la fonction intégrée eval().)

runeval(expression[, globales[, locales]])
Evalue l'expression (passée comme une chaîne) sous contrôle du débogueur. runeval() retourne la valeur de retour de l'expression. Par ailleurs, elle est semblable a run().

runcall(fonction[, argument, ...])
Appelle la fonction (un objet fonction ou un objet méthode, pas une chaîne) avec les arguments fournis. runcall() retourne la valeur de retour de l'appel de fonction. L'invite du débogueur apparaît dès que l'exécution de la fonction commence.

set_trace()
Passer en débogage pour l'instance d'activation appelée. Ceci est utile pour poser en dur un point d'arrêt quelque part dans un programme, même si le code n'est pas débogué par ailleurs (par exemple lorsque une assertion échoue).

post_mortem(traceback)
Procéder au débogage post-mortem de l'objet traceback (trace de pile) donné.

pm()
Procéder au débogage post-mortem de la trace de pile contenue dans sys.last_traceback.


Sous-sections
  1. Commandes du Débogueur
  2. Comment ça marche