Wie sehen Sie eine Variable in pdb

Ich debugge ein Python-Skript, und ich möchte eine Variable für eine Änderung sehen (ähnlich wie Sie eine Speicheradresse in gdb sehen können). Gibt es einen Weg, dies zu tun?

4 Solutions collect form web for “Wie sehen Sie eine Variable in pdb”

Hier ist ein wirklich hacky Weg, dies mit pdb zu tun. Diese Befehle können in Ihrem ~/.pdbrc für automatisches Laden jedes Mal, wenn Sie pdb .

 !global __currentframe, __stack; from inspect import currentframe as __currentframe, stack as __stack !global __copy; from copy import copy as __copy !global __Pdb; from pdb import Pdb as __Pdb !global __pdb; __pdb = [__framerec[0].f_locals.get("pdb") or __framerec[0].f_locals.get("self") for __framerec in __stack() if (__framerec[0].f_locals.get("pdb") or __framerec[0].f_locals.get("self")).__class__ == __Pdb][-1] alias _setup_watchpoint !global __key, __dict, __val; __key = '%1'; __dict = __currentframe().f_locals if __currentframe().f_locals.has_key(__key) else __currentframe().f_globals; __val = __copy(%1) alias _nextwatch_internal next;; !if __dict[__key] == __val: __pdb.cmdqueue.append("_nextwatch_internal %1") alias _stepwatch_internal step;; !if __dict[__key] == __val: __pdb.cmdqueue.append("_stepwatch_internal %1") alias nextwatch __pdb.cmdqueue.extend(["_setup_watchpoint %1", "_nextwatch_internal"]) alias stepwatch __pdb.cmdqueue.extend(["_setup_watchpoint %1", "_stepwatch_internal"]) 

Dies fügt zwei Befehle, nextwatch und stepwatch die jeweils einen Variablennamen varname als Argument nehmen. Sie werden eine flache Kopie der lokalen Variablen des aktuellen Frames für varname, wenn möglich, und halten Sie die Ausführung next oder step jeweils, bis der Name auf Änderungen verweist.

Dies funktioniert in CPython 2.7.2 aber stützt sich auf einige pdb internals so wird es wahrscheinlich brechen woanders.

Um eine Variable zu sehen, wenn Sie einen Haltepunkt treffen, können Sie den Befehl Befehl verwenden. ZB Drucken some_variable beim Treffen Breakpoint # 1 ( kanonisches Beispiel aus pdb doc ).

 (Pdb) commands 1 (com) print some_variable (com) end (Pdb) 

Für Python 3 :

Sie können die Anzeigefunktionalität von pdb verwenden

Sobald Sie den Breakpoint getroffen haben, geben Sie einfach ein

Ipdb> Ausdruck anzeigen

Beispiel:

 ipdb> display instance display instance: <AppUser: dmitry4> ipdb> display instance.id display instance.id: 9 ipdb> display instance.university display instance.university: <University: @domain.com> ipdb> display Currently displaying: instance.university: <University: @domain.com> instance.id: 9 instance: <AppUser: dmitry4> ipdb> 

Wie Sie sehen können, jedes Mal, wenn Sie das Display eingeben – es wird alle Ihre Uhren (Ausdrücke) drucken. Sie können die Nicht-Funktion verwenden, um bestimmte Uhr zu entfernen.

Sie können auch pp Ausdruck verwenden , um den Ausdruck (sehr nützlich)

Eine mögliche Lösung ist die Verwendung von pdb ++ :

 pip install pdbpp 

Dann "markiere" das Objekt, das du mit dem Dekorator ansehen willst @pdb.break_on_setattr :

 from pdb import break_on_setattr @break_on_setattr('bar') class Foo(object): pass f = Foo() f.bar = 42 # the program breaks here 

Hier wird pdb jede Änderung der Attributleiste auf einem beliebigen Foo-Objekt brechen.

Vorbehalte
Nur __setattr__ der zugrunde liegenden __setattr__ werden den Haltepunkt auslösen. Dies bedeutet, dass f.bar = 'XYZ' und setattr(f, 'XYZ') funktionieren, aber manipulieren der bar -objekt nicht auslösen den Haltepunkt:

 f.bar = [] f.bar.append(7) # will NOT trigger breakpoint f.bar = 2 f.bar += 5 # will trigger breakpoint 

Hinweis: @break_on_setattr gehört nicht zum Standard- pdb Modul. pdb wird durch das pdbpp pdb überschrieben / monkey- pdbpp .

  • Wie kann ich das pdbtrack python Debugging in emacs 24.x Shell aktivieren?
  • Einfacher Weg, um PDB-Haltepunkte in Python-Code zu setzen?
  • Anbringen eines Prozesses mit pdb
  • Wie kann ich ipdb während des Post-mortem-Debugging beenden?
  • Starten Sie pdb auf Ausnahme in Tornados Ioloop
  • Python Debugger (pdb) gestoppt Handing up / down Pfeile, zeigt ^ [[A statt
  • Wie exportiere ich eine Variable vom PDB?
  • Pdb in Emacs, um Python-Prozess von aktuellen virtualenv zu verwenden
  • Mit ipdb zum Debuggen von Python in emacs
  • PDB.run - Neustart einer pdb-Sitzung
  • Wie habe ich Python pdb durcheinander gebracht?
  • Python ist die beste Programmiersprache der Welt.