Code Debugging Techniken

PythonPythonBeginner
Jetzt üben

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

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.