Frage

Nach dem, was ich beurteilen kann, erkennt PDB nicht, wann sich der Quellcode zwischen "Läufen" geändert hat. Das heißt, wenn ich debuggiere, einen Fehler bemerken, diesen Fehler beheben und das Programm in PDB (dh ohne PDB) umzusetzen, wird PDB den Code nicht umkompilieren. Ich werde immer noch die alte Version des Codes debuggen, auch wenn PDB den neuen Quellcode auflistet.

Aktualisiert PDB den kompilierten Code nicht, wenn sich die Quelle ändert? Wenn nicht, gibt es eine Möglichkeit, dies zu tun? Ich möchte in einer einzigen PDB -Sitzung bleiben, um meine Breakpoints und dergleichen zu halten.

FWIW, GDB wird bemerken, wenn das Programm darunter das Debugging darunter, allerdings nur bei einem Neustart dieses Programms. Dies ist das Verhalten, das ich in PDB replizieren möchte.

War es hilfreich?

Lösung

Was meinst du mit "das Programm in PDB wiederholen?" Wenn Sie ein Modul importiert haben, wird Python es nicht erneut lesen reload(module). Jedoch, reload ist alles andere als kugelsicher (siehe Xreload für eine andere Strategie).

Es gibt viele Fallstricke im Python -Code Nachladen. Um Ihr Problem robuster zu lösen, können Sie PDB mit einer Klasse einwickeln, die Ihre Haltepunktinformationen beispielsweise in einer Datei auf der Festplatte aufzeichnet und sie wieder auf den Befehl abspielt.

(Entschuldigung, ignorieren Sie die erste Version dieser Antwort; es ist früh und ich habe Ihre Frage nicht sorgfältig genug gelesen.)

Andere Tipps

Das folgende Mini-Modul kann helfen. Wenn Sie es in Ihre PDB -Sitzung importieren, können Sie verwenden:

pdb> pdbs.r()

Zu jeder Zeit, um alle Nicht-System-Module zu erzwingen, außer außer hauptsächlich. Der Code überspringt dies, weil er einen Importeurror auswirkt ('kann das interne Modul nicht wieder initieren hauptsächlich') Ausnahme.

# 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 %autoreload Verlängerung

6.2.0 Docs -Dokument http://ipython.readthedocs.io/en/stable/config/extensions/Atoreload.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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top