Domanda

Da quello che posso dire, pdb non riconosce quando il codice sorgente è cambiato tra le "esecuzioni".Cioè, se sto eseguendo il debug, noto un bug, lo correggo ed eseguo nuovamente il programma in pdb (cioèsenza uscire da pdb), pdb non ricompilerà il codice.Continuerò a eseguire il debug della vecchia versione del codice, anche se pdb elenca il nuovo codice sorgente.

Quindi, pdb non aggiorna il codice compilato man mano che cambia il sorgente?Se no, c'è un modo per farlo fare?Mi piacerebbe poter rimanere in un'unica sessione pdb per mantenere i miei punti di interruzione e simili.

FWIW, gdb noterà quando il programma di cui sta eseguendo il debug cambia al di sotto di esso, anche se solo al riavvio di quel programma.Questo è il comportamento che sto cercando di replicare in pdb.

È stato utile?

Soluzione

Cosa intendi per "Rierunare il programma in PDB?" Se hai importato un modulo, Python non lo rileggerà a meno che tu non chieda esplicitamente di farlo, cioècon reload(module).Tuttavia, reload è tutt’altro che a prova di proiettile (vedi xreload per un'altra strategia).

Ci sono molte insidie ​​​​nel ricaricamento del codice Python.Per risolvere il tuo problema in modo più efficace, potresti racchiudere pdb con una classe che registra le informazioni del punto di interruzione su un file su disco, ad esempio, e le riproduce a comando.

(Scusa, ignora la prima versione di questa risposta;è presto e non ho letto la tua domanda con sufficiente attenzione.)

Altri suggerimenti

Il seguente mini-modulo può aiutare. Se si importa nella sessione PDB, quindi è possibile utilizzare:

pdb> pdbs.r()

in qualsiasi momento per forzare ricaricare tutti i moduli non di sistema tranne principale . Il codice ignora che perché genera ImportError ( 'Non è possibile ri-init modulo interno principale ') fa eccezione.

# 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 estensione %autoreload

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top