Debugging mit Python

Ähnliche Dokumente
Teil I Debuggen mit gdb

Nebenläufige Programme mit Python

Programmierkurs Python I

Quick-Start Informatik Programmieren in Python Teil 2

Automatisiertes Testen mit dem Doctest-Modul

C/C++ Debugging mit CDT unter Eclipse

Programmieren in Haskell Debugging

Übungszettel 2a - Python

Zahlen raten. Al Sweigart, Eigene Spiele programmieren Python lernen, dpunkt.verlag, ISBN D3kjd3Di38lk323nnm

Module, Packete und PIP

Algorithmen und Datenstrukturen

WS2017/ Oktober 2017

Python Einführung. Monica Selva Soto. 24 März Mathematisches Institut

PYTHON. 04 Funktionen II, Module

PYTHON. 03 for-schleifen, Funktionen

Vorlesung Skriptsprachen Duale Hochschule Stuttgart Sommersemester Dipl.-Ing. (FH) Volker Schepper

WS2018/ Oktober 2018

A2.1 Python. Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. A2.1 Python. A2.2 Kurzer Sprachüberblick. A2.3 Selectionsort in Python

Visual Basic Editor CATIA V5

Grundlagen. Felix Döring, Felix Wittwer 24. April Python-Kurs

2017/01/23 15:50 1/5 Bedienung

1. Python Interpreter installieren (WinPython)

Kurze Bedienungsanleitung für den Java-Editor

Informatik I. Informatik I. 6.1 Programme. 6.2 Programme schreiben. 6.3 Programme starten. 6.4 Programme entwickeln. 6.1 Programme.

Grundlagen von C# - 2

Inhalt. Vorwort zur dritten Auflage 15

Python Workshop i. Python Workshop

Debugging mit ddd (Data Display Debugger)

WS2018/ Oktober 2018

Algorithmik und Programmieren

Objektorientierte Programmierung und Modellierung

C# - Einführung in die Programmiersprache Fehler abfangen. Leibniz Universität IT Services Anja Aue

Debugging mit GDB Albrecht Oster Proseminar C - Grundlagen und Konzepte

Informatik I: Einführung in die Programmierung. Übungsblatt 3. Abgabe: Freitag, 15. November 2013, 18:00 Uhr

Zugang zu LISP. Franz Inc. Allegro Lisp Version 7.0 ist im Linux Pool installiert.

Informatik I: Einführung in die Programmierung

Anweisungen in Python

WS2017/ Oktober 2017

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Crashkurs Python und Sage U23 Krypto-Mission

... Trigger - Fehlersuche (Debugging)

Unix-Grundkurs 1. Thema heute: Shell-Skripten

Funktionen in Python

2 Programmieren in Java I noch ohne Nachbearbeitung

Linux II. Reguläre Ausdrücke Editoren Scripting. 2 Linux II. Linux I II III Res WN/TT NLTK XML Weka E Reguläre Ausdrücke Editoren Scripting

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion


Einführung in die Computerlinguistik

Vorsemesterkurs Informatik Übungsaufgaben. Tag 4a - Python

Erste Schritte mit Eclipse

Javakurs für Anfänger

Programmieren mit Python

Programmieren in Python

Java Übung. Übung Mai Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung. Werner Gaulke.

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

Python Intro. Vorsemesterkurs Informatik Praktischer Teil WS2012/13. 2.Oktober Vorkurs Informatik - WS 2012/13

C++ - Einführung in die Programmiersprache Fehler abfangen. Leibniz Universität IT Services Anja Aue

Programmieren in Python

Arithmetik in der tcsh

Inhaltsverzeichnis Einleitung xi Kapitel 1: Die Vorbereitung aufs Abenteuer

2.1 Visual C Express installieren Visual C Express starten Visual C Express registrieren...

III.1 Prinzipien der funktionalen Programmierung - 1 -

Brückenkurs Programmieren

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

Steht in der ersten Zeile #!/usr/bin/python und hat man die Ausführungsrechte gesetzt kann man es direkt ausführen.

1 def Anweisung. 2 Argumentübergabe. 3 Lokale Variablen. 4 Default Argumente. 5 Aufruf mit Schlüsselwort. 6 Variable Argumente. Funktionen in Python

Funktionen in Python

Prof. Dr. Stefan Funken, Dipl.-Ing. Christoph Erath 15. Mai WiMa-Praktikum (Matlab 2/9) Einführung in LATEXund Matlab

Erste Java-Programme (Scopes und Rekursion)

Objektsammlungen. Programmieren 2. Konzepte (Wiederholung vom Dienstag)

Einstieg in die Informatik mit Java

Grundlagen der Programmentwicklung

C++ OpenCppCoverage. Detlef Wilkening

Inhaltsverzeichnis. Warren D. Sande, Carter Sande. Hello World! Programmieren für Kids und andere Anfänger. Übersetzt von Dorothea Heymann-Reder

Programmieren in Python

Gültigkeitsbereich. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2016/

Python Intro I. Vorsemesterkurs Informatik Praktischer Teil WS 2013/14. 1.Oktober Vorkurs Informatik - WS 2013/14

Funktionales C++ zum Ersten

Transkript:

Debugging mit Python PyCon DE 2012 Stefan Schwarzer, SSchwarzer.com info@sschwarzer.com Leipzig, Deutschland, 2012-10-31

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 2 / 23 Überblick Print-Anweisungen und Logging Debugger-Konzepte Umsetzung mit pdb Weitere Python-Debugger Zusammenfassung

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 3 / 23 Print-Anweisungen Oft ausreichend Einfach einsetzbar Vorteile gegenüber Debugger: kann einfacher bei Code mit Timeouts eingesetzt werden praktisch, um zu zeigen, bei welchen Werten (zum Beispiel in einer Schleife) ein Problem auftritt

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 4 / 23 Print-Anweisungen Wie man es eher nicht machen sollte print "====================" print self.employer.name()... print "********************" print self.employee.name() print self.employee.address() Man kann leicht vergessen, welche Markierung zu welchem Wert gehört. Entfernung von Debugging-Ausgaben ist fehleranfällig, sobald einer Markierung mehr als eine Ausgabe folgt. Man kann allzu leicht etwas entfernen, was nicht für das Debugging gedacht war.

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 5 / 23 Print-Anweisungen Empfehlung print "=== employer name:", self.employer.name()... print "=== employee name:", self.employee.name() print "=== employee address:", self.employee.address() Man sieht in der Ausgabe, was ausgegeben wird. Debug-Ausgaben sind leicht zu entfernen (im Editor nach === suchen und Zeile löschen). Abtrennung mit Komma vermeidet Tupel-Anomalie: "=== Wert: %s" % value versagt bei Tupel-Werten. Schreibarbeit kann durch Editor-Makro reduziert werden. Beispiel für Vim: inoremap <leader>p print "=== :", <ESC><BS><BS><BS>i \p gibt print "=== :", aus und setzt den Cursor vor den Doppelpunkt.

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 6 / 23 Logging import logging logging.basicconfig() log = logging.getlogger("debugging") log.setlevel(logging.debug) log.debug("here s a tuple: %s", (1, 2)) # DEBUG:debugging:Here s a tuple: (1, 2) Aufwändiger einzurichten als Print-Anweisungen. Geschwätzigkeit kann durch Log-Level gesteuert werden. Log-Ausgaben können gegebenenfalls im Code bleiben, wenn Log-Level und/oder Ausgabeziel angepasst werden. Ausgabe sehr flexibel konfigurierbar Threadsichere Ausgabe

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 7 / 23 Debugger Konzepte Zwei Modi Normaler Programmablauf Eingabe von Debugging-Kommandos Programmzeiger Dieser markiert die als nächstes auszuführende Anweisung. Ausführung ohne sichtbare Verzweigung in Aufrufe ( next ) mit sichtbarer Verzweigung in Aufrufe ( step ) Unterbrechungspunkte/Breakpoints An diesen Anweisungen hält die Code-Ausführung an und der Debugger-Prompt erscheint.

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 8 / 23 Debugger pdb (Python Debugger) In der Standardbibliothek enthalten Nur Kommandozeilen-Modus (ähnlich gdb) Für viele Zwecke ausreichend help liefert eine Befehlsliste, help befehl einen Hilfetext zum Befehl befehl. Lesetipp: http://www.doughellmann.com/pymotw/pdb/

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 9 / 23 Debugger pdb Aktivierung Innerhalb des Programmcodes import pdb; pdb.set trace() In der Shell $ python -m pdb programm argumente Danach Breakpoint setzen und fortsetzen (kommt später). Post-mortem (im Vortrag nicht weiter behandelt)

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 10 / 23 Code-Beispiel import os if name == " main ": import pdb; pdb.set_trace() items = os.listdir(os.curdir) path = os.path.join(os.getcwd(), items[0]) print path

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 11 / 23 Debugger pdb Anzeigen von Code (list) list, l Code um den Programmzeiger herum auflisten; nach einem vorherigen list-befehl das Listing fortsetzen list zeile Code um die genannte Programmzeile listen list anfangszeile endzeile Zeilenbereich listen

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 12 / 23 Debugger pdb Anzeigen von Code $ python debug_example.py > /home/someone/pycon_de/debug_example.py(5)<module>() -> items = os.listdir(os.curdir) (Pdb) l 1 import os 2 3 if name == " main ": 4 import pdb; pdb.set_trace() 5 -> items = os.listdir(os.curdir) 6 path = os.path.join(os.getcwd(), items[0]) 7 print path [EOF]

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 13 / 23 Debugger pdb Ausführen von Anweisungen next, n Anweisung einschließlich enthaltener Aufrufe ohne zwischenzeitliche Debugger-Kontrolle ausführen step, s Anweisung ausführen, dabei auch enthaltene Aufrufe unter Debugger-Kontrolle ausführen. In C-Funktionen wie os.getcwd() im Beispiel kann mit s nicht hineingesprungen werden.

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 14 / 23 Debugger pdb Ausführen von Anweisungen Nach dem ersten l von oben: (Pdb) n > /home/someone/pycon_de/debug_example.py(6)<module>() -> path = os.path.join(os.getcwd(), items[0]) (Pdb) l 1 import os 2 3 if name == " main ": 4 import pdb; pdb.set_trace() 5 items = os.listdir(os.curdir) 6 -> path = os.path.join(os.getcwd(), items[0]) 7 print path [EOF]

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 15 / 23 Debugger pdb Ausführen von Anweisungen (Pdb) s --Call-- > /usr/lib/python2.7/posixpath.py(60)join() -> def join(a, *p): (Pdb) l 55 56 # Join pathnames. 57 # Ignore the previous parts if a part is absolute. 58 # Insert a / unless the first part is empty or already 59 60 -> def join(a, *p): 61 "Join two or more pathname components, inserting / 62 If any component is an absolute path, all previous p 63 will be discarded." 64 path = a 65 for b in p:

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 16 / 23 Debugger pdb Werte anzeigen p ausdruck Ausdruck evaluiert anzeigen pp ausdruck Dito, aber übersichtlicher formatiert (wie von pprint.pprint) args Aktuelle Werte der Argumente der Funktion/Methode anzeigen

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 17 / 23 Debugger pdb Aus Funktion zurückkehren return, r So lange nicht-interaktiv Code ausführen, bis die aktuelle Funktion/Methode verlassen wird und dann wieder in den interaktiven Modus schalten.

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 18 / 23 Debugger pdb Unterbrechungspunkte/Breakpoints Markierung, an der der Code zur Inspektion im Debugger angehalten werden kann Ob das tatsächlich passiert, kann an eine Bedingung geknüpft werden. Ein Breakpoint kann aus- und eingeschaltet werden. Dabei bleiben die Eigenschaften (Position, Bedingungen) erhalten. Es lassen sich beliebig viele Unterbrechungspunkte definieren.

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 19 / 23 Debugger pdb Unterbrechungspunkte/Breakpoints break, b Alle Breakpoints auflisten break dateipfad :zeilennummer, bedingung Breakpoint setzen, an dem nur unter der Bedingung bedingung angehalten wird. Die Bedingung wird nicht in Anführungszeichen eingeschlossen. Die Pfadangabe ist relativ zu sys.path. Obwohl der Dateipfad wie eine Modul-Angabe wirkt, darf kein Punkt als Trennzeichen verwendet werden. Stattdessen muss es ein Pfadtrenner sein, zum Beispiel break paket/modul.py:23 Dateipfad und Bedingung sind optional.

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 20 / 23 Debugger pdb Unterbrechungspunkte/Breakpoints condition breakpointnr bedingung Setze oder ändere die Bedingung des Breakpoints mit der Nummer breakpointnr. continue, cont, c Setze den Programmablauf fort. Dabei wird der interaktive Debugger-Modus bis zum nächsten aktiven Breakpoint oder bis zum Programmende verlassen.

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 21 / 23 Alternative Debugger für Python Liste (Suche im Python Package Index) http://pypi.python.org/pypi?%3aaction=search&term=debugger Textmodus pudb (nur Posix, einschließlich Cygwin) http://pypi.python.org/pypi/pudb pdb++ http://pypi.python.org/pypi/pdbpp ipdb http://pypi.python.org/pypi/ipdb GUI IDLE Einfache IDE; gehört zur Standardbibliothek, muss aber unter Unix/Linux eventuell zusätzlich installiert werden WinPdb nicht nur für Windows! http://winpdb.org/ Debugger in diversen Python-IDEs

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 22 / 23 Zusammenfassung Print-Anweisungen können hilfreich sein. Man muss nicht unbedingt gleich zum Debugger greifen. Das logging-modul ist flexibler als print, aber für einfache Aufgaben etwas umständlicher. Debugging-Konzepte: Programmzeiger; Ausführung ohne/mit Unterprogrammaufrufen; Unterbrechungspunkte Code kann mit l gelistet und mit n, s und r abgearbeitet werden. p, pp und args zeigen Objekte an. Unterbrechungspunkte lassen sich mit b setzen; nach deren Auslösung führt c den Code weiter aus. Es gibt diverse weitere Textmodus- und GUI-Debugger für Python. Die meisten davon finden sich im Python Package Index (PyPI).

Debugging mit Python Stefan Schwarzer, info@sschwarzer.com 23 / 23 Danke für die Aufmerksamkeit! :-) Fragen? Anmerkungen? Diskussion? sschwarzer@sschwarzer.com http://sschwarzer.com