Outils pour utilisateurs

Outils du site


stu:python:pydbg

Débugger un programme Python

Voici quelques outils et quelques façons de procéder pour rechercher des erreurs dans un programme écrit en Python.

Ce document n'est pas finalisé.

- Si l'exécution n'est pas interrompue

Le programme continue de tourner, mais il ne fait pas ce que vous voulez ? Plusieurs approches sont possibles.

print

Pour des petites erreurs (mais on ne le sait généralement pas à l'avance), afficher des messages et le contenu de quelques objets en parsemant des print dans le programme permet souvent de se tirer d'affaire.

assert

Une assertion (en Python) est un test qui, s'il n'est pas vérifié interrompt le déroulement du programme. Cela permet souvent de s'assurer que certains prérequis sont remplis, ou inversement que certains objectifs sont atteints. Les assertions sont plus utiles à la prévention d'erreurs qu'au débuggage. C'est une bonne pratique d'en mettre partout où il est susceptible (même un tout petit peu) d'y avoir un problème. Car s'il y en effectivement un, on gagnera du temps…

Voici une fonction (factorielle) qui ne marche pas si son argument est négatif. L'assertion vérifie ce fait.

def facto(n) :
    assert n>=0, "Factorielle d'un nb négatif"
    if n==0 : return 1
    return n*facto(n-1)

pdb : obtenir un shell

Python est livré en standard avec un débugger (c'est un module) : [[pylib>pdb.html|pdb]]. Une possibilité très intéressante est d'interrompre le programme à un endroit donné et pouvoir examiner les objets qui d'y trouvent.

Un programme peut être interrompu à un endroit particulier, l'utilisateur pouvant alors examiner les objets, exécuter des commandes, et reprendre l'exécution. Pour cela, il faut insérer la ligne suivante dans le source :

import pdb; pdb.set_trace()

Voici un exemple :

def recursinfinie(n):
    if n == 1 : 
        import pdb; pdb.set_trace()
    n = n - 1
    recursinfinie(n)
 
recursinfinie(4)

- Si le programme a planté (levée d'une exception)

Débugger un programme suite à un plantage porte le nom évocateur de débuggage post-mortem. Après un plantage, un tel débuggage peut être entamé avec les commandes :

import pdb
pdb.pm()

On se retrouve alors en position d'examiner les objets au moment du plantage. Il est possible de remonter la pile des appels avec la commande up (et la redescendre avec down).

- Module inspect

Le module ''inspect'' permet de recueillir des informations sur les objets Python (introspection). Exemple de trace d'exécution :

import inspect
for x in inspect.stack():
    print('Call stack...',x)
stu/python/pydbg.txt · Dernière modification: 2014/03/31 16:45 (modification externe)