2013-06-24 4 views
17

Say I-Code den folgenden Code haben:PDB/IPDB für Python Pause auf editierbaren Zustand

for i in range(100): 
    import ipdb;ipdb.set_trace() 
    print i 

Aber jetzt ich:

for i in range(100): 
    print i 

Im Allgemeinen ich eine Zeile Code als hinzufügen will es bei i == 10 debuggen, und ich möchte nicht durch c für 10 mal in ipdb zu stören, wie soll ich tun?

In der Dokumentation fand ich condition bpnumber [condition], aber wie könnte ich die bpnumber wissen, wenn es keine Liste von bpnumber Index gibt. Die Dokumentation sagt auch b(reak) ([file:]lineno | function) [, condition]. Angenommen, die Zeilennummer print i lautet xx. Ich habe Folgendes in ipdb Shell eingegeben: b xx, i == 10, aber nichts wie erwartet passiert ist.

+0

Hallo, wenn Sie sagen, 'aber nichts als geschah erwartet 'meinst du, dass Informationen über die Erstellung von Haltepunkten nicht angezeigt werden 'Haltepunkt 1 bei /home/oleg/test.py: xx'? – oleg

+0

@oleg was ich meine ist, nachdem ich 'b xx, i == 10' eingegeben habe und dann' c' zum Fortfahren einfüge, stoppt das Programm wieder am Haltepunkt, aber der Wert von 'i' ist nicht 10, was das Programm bedeutet stoppt nicht bei der angegebenen Bedingung – shelper

+0

Es scheint, dass Sie an Ihrem ersten Haltepunkt angehalten haben (der als Codezeile vorhanden ist) Versuchen Sie, Ihre 'ipdb; ipdb.set_trace()' außerhalb des Zyklus zu verschieben und in ipdb session create conditional Breakpoint – oleg

Antwort

15

in Ordnung, ich einige Exploration mich getan hat, ist hier mein neues Verständnis von pdb. Wenn Sie import ipdb;ipdb.set_trace() eingeben, fügen Sie der Zeile tatsächlich einen Einstiegspunkt von ipdb hinzu, nicht wirklich einen Haltepunkt. nachdem Sie eingeben IPDB, können Sie Haltepunkte Setup

so, erkennen, was ich für die bedingte Debuggen möchten, sollte ich als

import ipdb;ipdb.set_trace() 
for i in range(100): 
    print i 

dann folgt hinzufügen, nachdem ich IPDB eingeben kann ich Eingang b xx, i == 10 und dann c oder r, um den Code auszuführen, dann wird der Code beendet, wenn die Bedingung erfüllt ist. wenn ich Eingang l wird die bpnumber für die Zeile wie folgt:

  xx-1     for i in range(100): 
bpnumber> xx      print i 
      xx+1      ... 

ich zu sagen habe, sind das Dokument und alle anderen Erklärungen so verwirrend, ich wünsche hier meine Antwort den Unterschied zwischen dem „debug Einspeisepunkt verdeutlicht "und" debug breakpoint "

+1

Schön gemacht! Das hat auch für mich geklärt :) –

9

Es ist eine schnelle schmutzige Art und Weise wie folgt aus:

for i in range(100): 
    if i == 10: import ipdb;ipdb.set_trace() 
    print i 

Es funktioniert und haben nicht zu beschäftigt, um Ihre Meinung mit anderen Befehle :)

+1

gut, ich stimme zu, aber das ist zu invasiv für den code, ich muss den code von zeit zu zeit ändern, wenn ich die bedingung ändern möchte – shelper

+1

Ok aber darüber nachdenken, ich bearbeitet mein Code, um es in nur einer Zeile Code zu verlassen. Ist genauso invasiv wie 'import pdb; ipdb.set_trace()' denkst du nicht. Obwohl ich zustimme, wäre es nützlich, 'condition' zu verwenden, aber ich kann keinen Hinweis finden, wie man es benutzt. –

+1

sagen, wenn Sie bereits in der pdb, und Sie konnten kein Problem für "i == 10" finden, aber Sie möchten versuchen, "i == 50", wenn Sie nicht können bedingte Haltepunkt einrichten, müssen Sie beenden() pdb, modifiziere den Code zu 'if i == 50:' und führe ihn erneut aus. das ist nicht benutzerfreundlich ... wie auch immer, danke für deinen Vorschlag – shelper

4

Ich denke, dass Sie nach einer direkteren Lösung suchten, die das Hinzufügen von Zeilen zu dem Code nicht beinhaltete, und nur Debuggerbefehle einschloss.

Ihr ursprüngliches Beispiel

b xx, i == 10 

nicht funktioniert, weil Sie einen Haltepunkt an der Stelle im Code setzen Sie den ipdb.set_trace() Befehl eingefügt. Wenn Sie im Debugger die Anweisung 'b xx, i == 10' hinzufügen, haben Sie tatsächlich 2 Breakpoints (1 Conditional und 1 Conditional) am selben Ort definiert (vorausgesetzt, dass xx die Zeile ist, in der sich der Befehl set_trace() befindet).

Alternativ, wenn Sie in Ihrem Code Breakpoints definiert haben, indem Sie den Befehl 'b' verwenden, der offensichtlich für Sie funktioniert.Sie können

condition bpnumber boolean-expression 

zum Beispiel

condition 1 i == 10 

Hinweis, einen Zustand zu dem Haltepunkt hinzu: die bpnumber die Zahl auf den Haltepunkt zugewiesen sind, nicht die Linie in Ihrem Code. Um eine Liste der Haltepunkte zu sehen, geben Sie einfach 'b' ohne Argumente ein.

Auch, wenn Sie ohne Debug-Modus eingeben möchten mit ipdb.set_trace(), führen Sie einfach Ihren Code mit dem PDB/ipbd Modul aktiviert

python -m pdb foo.py