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

Debugging eines falschen Outputs

Trial
Product

Ziel

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

Detailed

Arbeitsschritte

Der nächste Bug: Falscher Output

Das Programm läuft jetzt hoffentlich ohne Abstürze, allerdings ist die Ausgabe noch nicht wie erwartet. Anstatt eine Auflistung der Zutaten sortiert nach Abteilung im Supermarkt zu erhalten, hat jede Zutat ihren eigenen Eintrag erhalten. Vergleichen Sie dazu diese beiden Ausgaben.

Aktueller Output für 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
What are you shopping for? 0,0,4
Here's your grocery list:
===== ('alcohol', 'white wine') =====
white wine, 1/2 cup

===== ('canned goods', 'crushed tomatoes') =====
crushed tomatoes, 28 oz can + 28 oz can

===== ('canned goods', 'tomato paste') =====
tomato paste, 2 tbsp + 2 tbsp

===== ('condiments/oils', 'olive oil') =====
olive oil, 2 tbsp + 2 tbsp + 2 tbsp

===== ('meat', 'ground beef') =====
ground beef, 1 lb + 1 lb

===== ('pasta', 'linguine') =====
linguine, 8 oz

===== ('pasta', 'spaghetti') =====
spaghetti, 12 oz + 12 oz

===== ('produce', 'garlic') =====
garlic, 3 cloves + 3 cloves + 4 cloves

===== ('produce', 'lemon juice') =====
lemon juice, 2 tbsp

===== ('produce', 'onion') =====
onion, 1 + 1

===== ('produce', 'parsley') =====
parsley, 1/4 cup

===== ('seafood', 'shrimp') =====
shrimp, 1 lb

===== ('spices', 'black pepper') =====
black pepper, to taste + to taste + to taste

===== ('spices', 'dried basil') =====
dried basil, 1 tsp + 1 tsp

===== ('spices', 'dried oregano') =====
dried oregano, 1 tsp + 1 tsp

===== ('spices', 'red pepper flakes') =====
red pepper flakes, 1/2 tsp

===== ('spices', 'salt') =====
salt, to taste + to taste + to taste


Process finished with exit code 0
Gewünschter Output für 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

Anders als bei einem Programmabsturz wie in der ersten Aufgabe ist hier nicht so klar, wo man mit der Suche nach dem Defekt anfangen soll.

Finden des Versagens

  • 1 Finden und nennen Sie die Stellen im Quellcode, die die Ausgabe des Programms regeln.
  • 2 Beschreiben Sie den Aufbau dieser Funktion.
    • Was wird alles in dieser Funktion definiert?
    • Welche Variablen und Funktionen werden tatsächlich benutzt?
    • Welchen Inhalt haben diese Variablen?
    • Wo genau findet die Ausgabe der Zutaten statt?
  • Setzen Sie einen Breakpoint bei der für die Ausgabe zuständigen Funktion und starten Sie den Debugger.
  • Springen Sie mittels Debugger zum Anfang der Schleife, in der die Ausgabe erzeugt wird.
  • 3 Stimmen die Inhalte der Variablen damit überein, was von ihnen verlangt wird?
  • 4 An dieser Stelle sind für diesen Fall alle Informationen vorhanden, um das Versagen
    aufzuklären. Beschreiben Sie in eigenen Worten, wie das Versagen zustande kommt.
  • 1 Beheben Sie den zugrunde liegenden Defekt.
  • 1 Machen Sie einen separaten Commit des korrigierten Quellcodes und zeigen Sie dann git -P show HEAD.
  • 2 Führen Sie das Programm grocery_list.py im Terminal aus. Geben Sie die Ausgabe des Programms mit der Eingabe 0,0,4 an.
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.