Ich werde das Debuggen mit ipdb zusammenfassen, einschließlich der Organisation dessen, was die Anfänger in der Webentwicklung gelernt haben.
Es bietet eine Erweiterung von pdb, einem ** Debugger **, der standardmäßig in Python enthalten ist.
Geben Sie den folgenden Code an der Stelle ein, an der Sie den Debugger starten und das Programm ausführen möchten.
import ipdb; ipdb.set_trace()
Bei der Ausführung wartet es auf ** Standardeingabe **, sodass Sie den Debugger durch Eingabe eines Befehls bedienen können. Das Folgende ist eine Zusammenfassung häufig verwendeter (wahrscheinlicher) Befehle.
Befehl | Bewegung |
---|---|
n | Zur nächsten Zeile laufen |
s | Bis zur nächsten Funktion ausführen |
p Variablenname | Wert der Variablen anzeigen |
a | Zeigen Sie die Argumente der ausgeführten Funktion an |
h | Hilfe |
q | Ende |
Lassen Sie uns tatsächlich ipdb mit dem Programm von Aggressive Cows von POJ No.3468 verwenden.
Aggressive.py
import ipdb
n = 5
m = 3
x = [1, 2, 8, 4, 9]
def C(d):
last = 0
for _ in range(1, m):
crt = last + 1
while crt<n and x[crt]-x[last]<d:
crt += 1
if crt == n:
return False
last = crt
return True
x.sort()
lb, ub = 0, max(x)
while ub-lb > 1:
ipdb.set_trace()
mid = int( (lb+ub)/2 )
if C(mid):
lb = mid
else:
ub = mid
print(lb)
Lauf.
$ python Aggressive.py
>c:/users/~/aggressive.py(21)<module>()
20 import ipdb; ipdb.set_trace()
---> 21 mid = int( (lb+ub)/2 )
22 if C(mid):
Der eingestellte Haltepunkt wird als Pfeil ausgegeben.
ipdb> h
Documented commands (type help <topic>):
========================================
EOF cl disable interact next psource rv unt
a clear display j p q s until
alias commands down jump pdef quit source up
args condition enable l pdoc r step w
b cont exit list pfile restart tbreak whatis
break continue h ll pinfo return u where
bt d help longlist pinfo2 retval unalias
c debug ignore n pp run undisplay
Miscellaneous help topics:
==========================
exec pdb
Eine Liste verwendbarer Befehle wird ausgegeben.
ipdb> p mid
*** NameError: name 'mid' is not defined
Die Variable "mid" ist nicht definiert, da Zeile 21 noch nicht ausgeführt wurde.
ipdb> n
> c:/users/~/aggressive.py(22)<module>()
21 mid = int( (lb+ub)/2 )
---> 22 if C(mid):
23 lb = mid
Der Pfeil, der den Haltepunkt anzeigt, verschiebt sich um eins.
ipdb> p mid
4
Da die 21. Zeile ausgeführt wird, wird der Wert der Variablen "mid" angezeigt.
ipdb> s
--Call--
> c:/users/~/aggressive.py(6)C()
5
----> 6 def C(d):
7 last = 0
Es scheint, dass der Aufruf der nächsten Funktion ausgeführt wurde.
ipdb> a
d = 4
Da der Aufruf der nächsten Funktion knapp darunter lag, wird der zuvor bestätigte Wert der Variablen mid
als Argument angezeigt.
ipdb> q
Exiting Debugger.
Beenden Sie den Debugger.
Ich habe alle (wahrscheinlichen) Befehle verwendet, die häufig in ipdb verwendet werden. Es war mein erstes Mal, dass ich den Debugger benutzte, aber ich habe das Programm ** zur Hälfte ** ausgeführt und jedes Mal den Inhalt der Variablen überprüft oder es an der gewünschten Position ausgeführt, ohne das Programm neu zu schreiben. Ich fand es sehr bequem zu gehen. Es ist schwierig, ein Programm zu schreiben, weil es debuggt. Daher möchte ich den Debugger gut nutzen, um ein Programm zu schreiben, das effizient und fehlerfrei ist.
Recommended Posts