Comment faire pdb reconnaître que la source a changé entre les courses?
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.
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