Programmierpraktikum SoSe 2024, Bachelor Informatik, FU Berlin
ProPra2024 > Debugging > Debugging-Praxis > einkaufsliste-defekt

Finden eines Defekts mittels Debugger nach Fehlermeldungen

Trial
Product

Ziel

Ich bin in der Lage, mittels Debugger durch ein Programm zu navigieren und zielstrebig einen Programmabsturz zu analysieren und zu beheben.

Detailed

Arbeitsschritte

Was soll das Programm können?

  • Das Programm grocery_list.py soll Ihnen im Terminal 10 Gerichte anzeigen und Ihnen ermöglichen, eine Einkaufsliste für ein von Ihnen zusammengestelltes Menü zusammenzustellen.
  • Das Menü darf aus mehreren, auch doppelten, Gerichten bestehen.
  • Zum Beispiel würde die Eingabe 0,0,4 das Menü "2x spaghetti bolognese und 1x shrimp scampi" auswählen.
  • Die Ausgabe des Programms ist eine Liste von Zutaten, die Sie für dieses Menü einkaufen müssen.
  • Dabei sollen die Artikel nach Ihrer Abteilung im Supermarkt sortiert angegeben werden.
Gewünschter Output zur Eingabe 0,0,4
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
What are you shopping for? 0,0,4
Here's your grocery list:
===== alcohol =====
white wine, 1/2 cup

===== canned goods =====
crushed tomatoes, 28 oz can + 28 oz can
tomato paste, 2 tbsp + 2 tbsp

===== condiments/oils =====
olive oil, 2 tbsp + 2 tbsp + 2 tbsp

===== meat =====
ground beef, 1 lb + 1 lb

===== pasta =====
linguine, 8 oz
spaghetti, 12 oz + 12 oz

===== produce =====
garlic, 3 cloves + 3 cloves + 4 cloves
lemon juice, 2 tbsp
onion, 1 + 1
parsley, 1/4 cup

===== seafood =====
shrimp, 1 lb

===== spices =====
black pepper, to taste + to taste + to taste
dried basil, 1 tsp + 1 tsp
dried oregano, 1 tsp + 1 tsp
red pepper flakes, 1/2 tsp
salt, to taste + to taste + to taste


Process finished with exit code 0

Erste Sichtung der Dateien

  • Laden Sie die Datei einkaufsliste.zip herunter und entpacken Sie diese.
  • Das darin enthaltene Verzeichnis besteht aus drei Dateien: recipes.json bildet die Datengrundlage für die Rezepte und ingredients.json gibt an, wo die Zutaten im Supermarkt liegen. grocery_list.py ist das oben beschriebene Programm.

Finden des Defekts

  • 1 Führen Sie grocery_list.py in Ihrem Terminal aus. Geben Sie als Input 0,0,1,2 ein. Die gesuchte Ausgabe ist die Fehlermeldung des Programms.
  • In der Fehlermeldung werden Ihnen vier Zeilen im Quellcode genannt. Lesen Sie diese Liste von unten nach oben:
    • 1 Was für eine Art von Defekt liegt vor?
    • 2 Welches ist die erste Zeile, in der der Defekt sichtbar wird?
    • 3 Welcher Funktionsaufruf löst das Versagen aus?
  • Öffnen Sie nun grocery_list.py in PyCharm.
  • Setzen Sie einen Breakpoint auf die in 2 gefundene Zeile und starten Sie den Programmlauf mit dem Debugger.
  • 4 Prüfen Sie den Wert der Variable, die in 3 als Argument des Funktionsaufrufs mitgegeben wird.
  • 5 Rufen Sie über die Konsole des Debuggers die in 3 gefundene Funktion auf. Geben Sie als Argument den Wert der Variable aus 4 ein. Sie werden eine Fehlermeldung erhalten. Um was für einen Fehler handelt es sich?
  • Suchen Sie die Stelle im Code, an der all_ingredient_locs erstellt worden ist und springen Sie zu der erzeugenden Funktion.
  • 6 In der Rückgabe dieser Funktion wird eine von Python mitgelieferte Funktion benutzt. Prüfen Sie nach, welchen Typ die Rückgabe in diesem Fall hat.
Hinweis (nur bei Bedarf): Die gefragte Funktion…

…lautet json.load() und hat je nach Form des eingegebenen JSON einen anderen Rückgabetypen. Sie finden die Tabelle mit dieser Information unter https://docs.python.org/3/library/json.html#encoders-and-decoders.
Wenn Sie sich mehr für JSON und der Handhabung von JSON in Python interessieren, finden Sie in den Aufgaben m_json1 und m_json2 einen Einstieg.

Hinweis (nur bei Bedarf): Das eingegebene Argument von json.load()

…ist die Datei ingredients.json. Es handelt sich um ein JSON-Array.

  • 7 Sehen Sie sich noch einmal den entstehenden Rückgabetypen an und die Stelle, an der der Defekt das erste Mal aufgefallen ist: Welcher Datentyp wird von der aufrufenden Stelle eigentlich erwartet?
  • 1 Implementieren Sie eine Korrektur an der in 6 gefundenen Stelle, die den richtigen Datentyp zurückgibt.
  • 2 Machen Sie einen separaten Commit des korrigierten Quellcodes und zeigen Sie dann git -P show HEAD.
  • 3 Führen Sie das Programm grocery_list.py im Terminal aus. Geben Sie die Ausgabe des Programms mit der Eingabe 0,0,4 an.
Bemerkung:

Wenn Sie der Aufgabe gefolgt sind, sollte der Output ohne Ausgabe von Fehlern funktionieren. Allerdings ist das Programm noch nicht fehlerfrei, wenn Sie die Ausgabe mit der oben gegebenen Beispielausgabe vergleichen. Darum kümmern wir uns aber erst in einkaufsliste-defekt2.

Trace
Snippet
Information

Abgabe

Geben Sie den Quellcode ab, wie er am Ende der Aufgabe vorliegt.

Geben Sie ein Kommandoprotokoll ab, das genau nur die Eingaben und Ausgaben der obigen Kommandos 1, 2, … enthält. Entfernen Sie vor Abgabe eventuelle Fehlversuche und sonstige zusätzliche Kommandos aus dem Protokoll.

Geben Sie ein Markdown-Dokument ab mit knappen Antworten zu den oben gestellten Fragen 1, 2, … Geben Sie diese Marker mit an.
Geben Sie ggf. Beispiele oder benutzte Quellen an.