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.
This tutorial is from open-source community. Access the source code
💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken
Der Code ist niemals perfekt. Es werden immer Fehler auftauchen. Das Debuggen von Code ist eine Fähigkeit, die Sie lernen müssen.
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?!
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 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.
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')
>>>
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()`
...
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
Es läuft. Schicke es raus!
Herzlichen Glückwunsch! Sie haben das Debugging-Labor abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.