Techniques de débogage de code

PythonPythonBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

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.

$ 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)
## Cause of the crash
AttributeError: 'int' object has no attribute 'append'

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.