Einführung
Der Code ist niemals perfekt. Es werden immer Fehler auftauchen. Das Debuggen von Code ist eine Fähigkeit, die Sie lernen müssen.
Debugging-Tipps
Also, Ihr Programm ist abstürzt...
$ python3 blah.py
Traceback (most recent call last):
File "blah.py", Zeile 13, in <module>
foo()
File "blah.py", Zeile 10, in foo
bar()
File "blah.py", Zeile 7, in bar
spam()
File "blah.py", 4, in spam
line x.append(3)
AttributeError: 'int' Objekt hat kein Attribut 'append'
Was tun jetzt?!
Tracebacks lesen
Die letzte Zeile ist die spezifische Ursache des Absturzes.
## Ursache des Absturzes
Es ist jedoch nicht immer einfach, sie zu lesen oder zu verstehen.
PRO-TIPP: Fügen Sie den gesamten Traceback in Google ein.
Verwenden der interaktiven Python-Shell (REPL)
Verwenden Sie die Option -i, um Python bei der Ausführung eines Skripts am Leben zu halten.
$ python3 -i blah.py
Traceback (most recent call last):
File "blah.py", Zeile 13, in <module>
foo()
File "blah.py", Zeile 10, in foo
bar()
File "blah.py", Zeile 7, in bar
spam()
File "blah.py", 4, in spam
line x.append(3)
AttributeError: 'int' Objekt hat kein Attribut 'append'
>>>
Es bewahrt den Interpreter-Zustand auf. Das bedeutet, dass Sie nach dem Absturz herumstöbern können. Variable Werte und anderen Zustand prüfen.
Debugging mit print
Das Debugging mit print() ist ziemlich üblich.
Tipp: Stellen Sie sicher, dass Sie repr() verwenden.
def spam(x):
print('DEBUG:', repr(x))
...
repr() zeigt Ihnen eine genaue Darstellung eines Werts. Nicht die schöne Ausgabedruckform.
>>> from decimal import Decimal
>>> x = Decimal('3.4')
## OHNE `repr`
>>> print(x)
3.4
## MIT `repr`
>>> print(repr(x))
Decimal('3.4')
>>>
Der Python-Debugger
Sie können den Debugger manuell innerhalb eines Programms starten.
def some_function():
...
breakpoint() ## Startet den Debugger (Python 3.7+)
...
Dies startet den Debugger beim Aufruf von breakpoint().
In früheren Python-Versionen mussten Sie das so machen. Manchmal finden Sie dies in anderen Debugging-Anleitungen erwähnt.
import pdb
...
pdb.set_trace() ## Anstelle von `breakpoint()`
...
Unter Debugger ausführen
Sie können auch ein ganzes Programm unter Debugger ausführen.
$ python3 -m pdb someprogram.py
Es wird automatisch vor der ersten Anweisung in den Debugger eintreten. Dadurch können Sie Breakpoints setzen und die Konfiguration ändern.
Häufige Debuggerbefehle:
(Pdb) help ## Hilfe erhalten
(Pdb) w(here) ## Stapelverfolgung ausgeben
(Pdb) d(own) ## Einen Stapelebene nach unten bewegen
(Pdb) u(p) ## Einen Stapelebene nach oben bewegen
(Pdb) b(reak) loc ## Einen Breakpoint setzen
(Pdb) s(tep) ## Eine Anweisung ausführen
(Pdb) c(ontinue) ## Die Ausführung fortsetzen
(Pdb) l(ist) ## Quellcode auflisten
(Pdb) a(rgs) ## Argumente der aktuellen Funktion ausgeben
(Pdb)!statement ## Anweisung ausführen
Für Breakpoints kann die Position einer der folgenden sein.
(Pdb) b 45 ## Zeile 45 in der aktuellen Datei
(Pdb) b file.py:45 ## Zeile 45 in file.py
(Pdb) b foo ## Funktion foo() in der aktuellen Datei
(Pdb) b module.foo ## Funktion foo() in einem Modul
Übung 8.4: Fehler? Welche Fehler?
Es läuft. Schicke es raus!
Zusammenfassung
Herzlichen Glückwunsch! Sie haben das Debugging-Labor abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.