Mieux que le print, et aussi simple à utiliser que lui, il vous permet (entre autre) de stopper votre code python (le mettre en pause) et de vous donner la mains. A partir de ce moment là, vous pouvez exécuter n'importe quel ligne de code (tel qu'un print($mavariable) par exemple), et/ou de continuer, ligne à ligne, l'exécution du code. Les bases du debug en somme...

Que du bonheur! :youplaBoum:

Avant toute chose

Je vais éviter de parler de pile d'appel (stack) ou quoi que ce soit dans la mesure ou on reste sur du debug "de base".

Je ne parlerai pas non plus du debugage dit "post-mortem" car il est dans la documentation (et que je ne m'en sert pas).

La documentation

Voici le liens vers la documentation officiel (elle est très courte et simple à comprendre pour qui à déjà une idée de comment fonctionne un scrit...):

http://docs.python.org/library/pdb.html

Utilisation

Comme d'habitude avec Python, on importe le module en début de code:

import pdb

Puis on place un breakpoint dans notre code, où on veux:

pdb.set_trace()

Cette procédure stop le programme et "ouvre le debugger". C'est la procédure que j'utilise le plus (la seul en fait). :hehe:

Dès que l'interpréteur arrivera au breakpoint, vous pourrez éxécutez d'autres commandes pour, par exemple, modifier ou vérifier la valeur d'une variable.

Application

Il n'est pas aisé de faire une explication de comment s'utilise un debugger tellement son utilisation dépend du problème qu'on souhaite solver.

Je vais prendre un exemple simple ou on souhaite modifier une variable afin de forcer un cas particulier.

Soit le script python suivant:

import pdb
 
def debugDemoEntreEnDiscotheque(chaussures):
 
	#pdb.set_trace()	#breakpoint
 
	if(chaussures == "barkers"):
		print("Tu peut rentrer car tes chaussures sont des "+chaussures)
 
	if(chaussures == "nikes"):
		print("Tu peut pas rentrer avec tes chaussures "+chaussures)
 
debugDemoEntreEnDiscotheque("nikes")

Le resultat de ce code sera:

Tu peut pas rentrer avec tes chaussures nikes

L'idée vous l'aurez compris est de rentrer avec les chaussures qu'on veux. Commençons par décommenter la ligne:

pdb.set_trace()	#breakpoint

Puis relançons le code:

> c:\demo\demo.py(7)debugDemoEntreEnDiscotheque()
-> if(chaussures == "barkers"):
(Pdb)

Le programme est stoppé vous pouvez maintenant faire ce que vous voulez...

La ligne:

> c:\demo\demo.py(7)debugDemoEntreEnDiscotheque()

Est le chemin du script ainsi que la ligne à laquelle nous somme et le nom de la procédure.

La ligne:

-> if(chaussures == "barkers"):

Est la ligne suivante. Nous somme donc juste au dessus d'elle.

Dans un premier temps, on va vérifier que contient la variable "chaussures", tapez:

(Pdb) print(chaussures)
'nikes'

Bon, à priori on va avoir du mal à entrer dans cette boucle là.

Tapez:

(Pdb) next

Puis validez.

> c:\demo\demo.py(10)debugDemoEntreEnDiscotheque()
-> if(chaussures == "nikes"):
(Pdb)

Oh! Il a sauté la boucle! En effet, next est une commande du debugger qui permet de passer à l'instruction suivante, d'avancer dans notre programme. Pour vous donner une idée simple, si vous faite que des "next", c'est comme si vous exécutiez votre programme normalement...

Les commandes du debugger

Pourquoi je m'arrête ici? Pour vous présenter les principales commandes du debuggers. c'est elles qui permettent de récupérer des informations et de naviguer dans votre programme. La plupars sont abrégé pour vous permettre de gagner du temps. Par exemple, au lieu de taper "next", vous pouvez taper "n".

Plus fort encore! Valider une commande vide répète la dernière commande exécuté par le debugger. Validez donc la ligne vide:

> c:\demo\demo.py(11)debugDemoEntreEnDiscotheque()
-> print("Tu peut pas rentrer avec tes chaussures "+chaussures)
(Pdb)

C'est le moment de jouer aux cons. La prochaine ligne va vous afficher la marque de vos chaussures. On va donc modifier la valeur:

(Pdb) chaussures = "barkers"

Validez, vous venez d'exécuter une commande et le debugger attend toujours avant de passer à la suite. Tapez "n" puis revalidez:

-> print("Tu peut pas rentrer avec tes chaussures "+chaussures)
(Pdb) chaussures = "barkers"
(Pdb) n
Tu peut pas rentrer avec tes chaussures barkers

On est bien avancé. Recommencez et essayé de rentrer avec vos chaussures "nikes":

> c:\documents and settings\dorian.fevrier\desktop\demo.py(7)debugDemoEntreEnDiscotheque()
-> if(chaussures == "barkers"):
(Pdb) chaussures = "barkers"
(Pdb) n
> c:\documents and settings\dorian.fevrier\desktop\demo.py(8)debugDemoEntreEnDiscotheque()
-> print("Tu peut rentrer car tes chaussures sont des "+chaussures)
(Pdb) chaussures = "nikes"
(Pdb) c
Tu peut rentrer car tes chaussures sont des nikes
Tu peut pas rentrer avec tes chaussures nikes

Paf! Collé le script! Pour le coups, j'ai aussi réussi à entrer dans le second "if" car les deux conditions se sont révélé vrai.

La commande "c" continue l'exécution du code et ne s'arrête que quand un autre breakpoint (set_trace) est rencontré. Ici, il me fini le programme.

Je ne vais pas répéter la documentation qui est déjà très simple à comprendre pour expliquer chaque commande du debugger.

Avec Maya

Et bien oui! Cela marche aussi avec Maya. Vous aurez des choses assez... Rigolotes...

maya_freeze007.png

Le problème c'est qu'il est absolument impossible de cliquer ailleurs que dans la fenêtre. :gne: Vous ne pouvez donc pas copier coller le nom de vos variables... En cas de "gros" debug, je vous invite très fortement à avoir à coté de vous un petit fichier texte avec les mots que vous êtes amené à taper régulièrement (print, nom des variables, etc...).

J'espère cependant que ce petit tuto vous permettra de débugger plus rapidement vos scripts. Et de faire des pipeline de qualité! :baffed:

A bientôt!