Recherche…


Le débogueur Python: débogage progressif avec _pdb_

La bibliothèque standard Python comprend une bibliothèque de débogage interactive appelée pdb . pdb possède des capacités étendues, la plus couramment utilisée étant la possibilité de passer à travers un programme.

Pour entrer immédiatement dans le débogage, utilisez:

python -m pdb <my_file.py>

Cela démarrera le débogueur sur la première ligne du programme.

Généralement, vous voudrez cibler une section spécifique du code pour le débogage. Pour ce faire, nous importons la bibliothèque pdb et utilisons set_trace () pour interrompre le flux de cet exemple de code perturbé.

import pdb

def divide(a, b):
    pdb.set_trace()
    return a/b 
    # What's wrong with this? Hint: 2 != 3

print divide(1, 2)

L'exécution de ce programme lancera le débogueur interactif.

python foo.py 
> ~/scratch/foo.py(5)divide()
-> return a/b
(Pdb) 

Cette commande est souvent utilisée sur une seule ligne pour pouvoir être commentée avec un seul caractère.

 import pdf; pdb.set_trace()

À l'invite (Pdb), les commandes peuvent être entrées. Ces commandes peuvent être des commandes de débogueur ou python. Pour imprimer des variables que nous pouvons utiliser p du débogueur, ou l'impression de python.

(Pdb) p a
1
(Pdb) print a
1

Pour voir la liste de toutes les variables locales à utiliser

locals

fonction intégrée

Ce sont de bonnes commandes de débogueur à connaître:

b <n> | <f>: set breakpoint at line *n* or function named *f*.
# b 3
# b divide
b: show all breakpoints.
c: continue until the next breakpoint.
s: step through this line (will enter a function).
n: step over this line (jumps over a function).
r: continue until the current function returns.
l: list a window of code around this line.
p <var>: print variable named *var*.
# p x
q: quit debugger.
bt: print the traceback of the current execution call stack
up: move your scope up the function call stack to the caller of the current function
down: Move your scope back down the function call stack one level
step: Run the program until the next line of execution in the program, then return control back to the debugger
next: run the program until the next line of execution in the current function, then return control back to the debugger
return: run the program until the current function returns, then return control back to the debugger
continue: continue running the program until the next breakpoint (or set_trace si called again)

Le débogueur peut également évaluer de manière interactive python:

-> return a/b
(Pdb) p a+b
3
(Pdb) [ str(m) for m in [a,b]] 
['1', '2']
(Pdb) [ d for d in xrange(5)]
[0, 1, 2, 3, 4]

Remarque:

Si l'un de vos noms de variable coïncide avec les commandes du débogueur, utilisez un point d'exclamation ' ! 'avant le var pour faire explicitement référence à la variable et non à la commande du débogueur. Par exemple, il arrive souvent que vous utilisiez le nom de variable ' c ' pour un compteur et que vous souhaitiez l’imprimer dans le débogueur. une simple commande ' c ' continuerait l'exécution jusqu'au prochain point d'arrêt. Au lieu de cela, utilisez ' ! C ' pour imprimer la valeur de la variable comme suit:

(Pdb) !c
4

Via IPython et ipdb

Si IPython (ou Jupyter ) est installé, le débogueur peut être appelé en utilisant:

import ipdb
ipdb.set_trace()

Une fois atteint, le code va sortir et imprimer:

 /home/usr/ook.py(3)<module>()
      1 import ipdb
      2 ipdb.set_trace()
----> 3 print("Hello world!")

ipdb>

Clairement, cela signifie que l'on doit éditer le code. Il y a un moyen plus simple:

from IPython.core import ultratb
sys.excepthook = ultratb.FormattedTB(mode='Verbose',
                                     color_scheme='Linux',
                                     call_pdb=1)

Cela provoquera l'appel du débogueur s'il existe une exception non interceptée.

Débogueur distant

Quelques fois, vous devez déboguer du code python qui est exécuté par un autre processus et dans ce cas, rpdb est utile.

rpdb est un wrapper autour de pdb qui redirige stdin et stdout vers un gestionnaire de socket. Par défaut, il ouvre le débogueur sur le port 4444

Usage:

# In the Python file you want to debug.
import rpdb
rpdb.set_trace()

Et puis, vous devez exécuter ce terminal pour vous connecter à ce processus.

# Call in a terminal to see the output
$ nc 127.0.0.1 4444

Et vous obtiendrez pdb promt

> /home/usr/ook.py(3)<module>()
-> print("Hello world!")
(Pdb)


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow