Question

D'après ce que je peux dire, pdb ne reconnaît pas lorsque le code source a changé entre les « runs ». Autrement dit, si je suis le débogage, notez un bug, corriger ce bug, et exécutez à nouveau le programme en pdb (à savoir sans quitter pdb), pdb ne recompiler le code. Je serai encore l'ancienne version de débogage du code, même si les listes pdb le nouveau code source.

Alors, ne pdb pas mettre à jour le code compilé comme la source change? Sinon, est-il un moyen de le faire faire? Je voudrais être en mesure de rester dans une seule session pdb afin de garder mes points d'arrêt et autres.

FWIW, gdb remarquerez lorsque le programme il est le débogage des changements au-dessous, mais seulement sur un redémarrage de ce programme. Ceci est le comportement que je suis en train de se répliquer dans pdb.

Était-ce utile?

La solution

Que voulez-vous dire par « relancer le programme en pdb? » Si vous avez importé un module, Python ne relis sauf si vous demandez explicitement de le faire, à savoir avec reload(module). Cependant, reload est loin d'être l'épreuve des balles (voir xreload pour une autre stratégie).

Il y a beaucoup de pièges dans le rechargement de code Python. Pour résoudre votre problème de façon plus robuste, vous pouvez envelopper pdb avec une classe qui enregistre vos informations dans un fichier point d'arrêt sur le disque, par exemple, et les rejoue sur commande.

(Désolé, ignorer la première version de cette réponse,. Il est trop tôt et je n'ai pas lu votre question assez attentivement)

Autres conseils

Le mini-module suivant peut aider. Si vous importez dans votre session pdb, vous pouvez utiliser:

pdb> pdbs.r()

à tout moment pour forcer-recharger tous les modules non-système, sauf principal . Le code qui saute parce qu'il jette un ImportError ( 'Impossible re-init module interne principal ') exception.

# pdbs.py - PDB support

from __future__ import print_function

def r():
    """Reload all non-system modules, so a pdb restart
    will reload anything new
    """
    import sys
    # This is likely to be OS-specific
    SYS_PREFIX = '/usr/lib'

    for k, v in sys.modules.items():
        if not hasattr(v, '__file__'):
            continue
        if v.__file__.startswith(SYS_PREFIX):
            continue
        if k == '__main__':
            continue
        print('reloading %s [%s]' % (k, v.__file__))
        reload(v)

ipdb extension %autoreload

6.2.0 docs documenter http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html#module-IPython.extensions.autoreload :

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: from foo import some_function

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: some_function()
Out[6]: 43
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top