Introduction
Le code n'est jamais parfait. Vous aurez toujours des bugs. Le débogage de code est une compétence que vous devez apprendre.
Astuces pour le débogage
Donc, votre programme s'est planté...
$ python3 blah.py
Traceback (most recent call last):
File "blah.py", line 13, in?
foo()
File "blah.py", line 10, in foo
bar()
File "blah.py", line 7, in bar
spam()
File "blah.py", 4, in spam
line x.append(3)
AttributeError: 'int' object has no attribute 'append'
Maintenant quoi?!
Lecture des traces d'erreur
La dernière ligne est la cause spécifique du crash.
## Cause of the crash
Cependant, il n'est pas toujours facile de lire ou de comprendre.
POINT D'ASTUCE : Collez toute la trace d'erreur dans Google.
Utilisation de la console interactive Python (REPL)
Utilisez l'option -i pour maintenir Python actif lors de l'exécution d'un script.
$ python3 -i blah.py
Traceback (most recent call last):
File "blah.py", line 13, in?
foo()
File "blah.py", line 10, in foo
bar()
File "blah.py", line 7, in bar
spam()
File "blah.py", 4, in spam
line x.append(3)
AttributeError: 'int' object has no attribute 'append'
>>>
Elle conserve l'état de l'interpréteur. Cela signifie que vous pouvez examiner le code après le crash. Vérifier les valeurs des variables et d'autres états.
Débogage avec l'instruction print
Le débogage avec l'instruction print() est assez courant.
Conseil : assurez-vous d'utiliser repr()
def spam(x):
print('DEBUG:', repr(x))
...
repr() vous montre une représentation exacte d'une valeur. Pas la sortie d'affichage élégante.
>>> from decimal import Decimal
>>> x = Decimal('3.4')
## SANS `repr`
>>> print(x)
3.4
## AVEC `repr`
>>> print(repr(x))
Decimal('3.4')
>>>
Le débogueur Python
Vous pouvez lancer manuellement le débogueur à l'intérieur d'un programme.
def some_function():
...
breakpoint() ## Entrez dans le débogueur (Python 3.7+)
...
Cela lance le débogueur au niveau de l'appel breakpoint().
Dans les versions antérieures de Python, vous faisiez ainsi. Vous verrez parfois cela mentionné dans d'autres guides de débogage.
import pdb
...
pdb.set_trace() ## Au lieu de `breakpoint()`
...
Exécuter sous le débogueur
Vous pouvez également exécuter un programme complet sous le débogueur.
$ python3 -m pdb someprogram.py
Il entrera automatiquement dans le débogueur avant la première instruction. Vous permettant de définir des points d'arrêt et de modifier la configuration.
Commandes de débogueur courantes :
(Pdb) help ## Obtenir de l'aide
(Pdb) w(here) ## Afficher la trace de pile
(Pdb) d(own) ## Descendre d'un niveau de pile
(Pdb) u(p) ## Monter d'un niveau de pile
(Pdb) b(reak) loc ## Définir un point d'arrêt
(Pdb) s(tep) ## Exécuter une instruction
(Pdb) c(ontinue) ## Continuer l'exécution
(Pdb) l(ist) ## Lister le code source
(Pdb) a(rgs) ## Afficher les arguments de la fonction actuelle
(Pdb)!statement ## Exécuter une instruction
Pour les points d'arrêt, la localisation peut être l'une des suivantes.
(Pdb) b 45 ## Ligne 45 dans le fichier actuel
(Pdb) b file.py:45 ## Ligne 45 dans file.py
(Pdb) b foo ## Fonction foo() dans le fichier actuel
(Pdb) b module.foo ## Fonction foo() dans un module
Exercice 8.4 : Des bugs? Quels bugs?
Ça fonctionne. Lâchez-le!
Sommaire
Félicitations ! Vous avez terminé le laboratoire de débogage. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.