Code Debugging Techniken

Beginner

This tutorial is from open-source community. Access the source code

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.