OOStuBS - Technische Informatik II (TI-II)  2.4
Aufgabe 3 - Prozedurstackanalyse

Inhaltsverzeichnis

Ziele

Aufgabe

Nachdem in der ersten Aufgabe Ein- und Ausgabe implementiert wurden und in der zweiten Aufgabe Unterbrechungsbehandlungen eingebaut wurden geht es in dieser Aufgabe um Fehlermeldungen der x86-CPU und dem Stackaufbau bei Funktionsaufrufen.

Zu diesem Zweck sind in zwei Teilfunktionen die Stacks zu untersuchen und deren Struktur zu interpretieren. In dieser Aufgabe ist keine eigene Implementierung notwendig!

Implementierung und Fragen

Die Vorgabe bringt zwei neue Task-Anwendungen, Task3A und Task3B. Beim Start des OS kann zwischen beiden Aufgaben gewählt werden, wobei deren eigentliche Funktion für die Aufgaben nicht von Bedeutung ist.

Teil A

Den Anfang macht die Aufgabe Task3A. Hier wird eine Methode Task3A::action() aufgerufen. Offenbar tritt dabei allerdings ein Fehler auf, denn das Programm wird mit der Ausgabe von 3 Parametern abgebrochen. Entwickeln Sie eine Strategie, wie Sie mit Hilfe des gdb die Programmzeile finden, in der der Fehler auftritt, welcher Fehlertyp generiert wird und welche Inhalte sich beim Auslösen der Exception auf dem Stack befinden.

Achtung
Der Stackaufbau nach dem Auslösen einer Exception folgt in unserem Simulator einer leicht anderen Struktur als in der Dokumentation beschrieben und stellt sich wie folgt dar:
Fehlercode / irrelevant / eip / cs / eflags/

Durch den zugehörigen Aufruf der Behandlungsfunktion Exception werden weitere Frames auf dem Stack abgelegt. Betrachten Sie entsprechend nur den Ausschnitt, der unterhalb des Stackframes des Funktionsaufrufes Task3A::action() liegt.

Fragen:
Was für ein Fehler ist aufgetreten?
In welcher Quellcodezeile trat dieser Fehler auf?
Wie sind Sie vorgegangen?

Teil B

Die zweite Aufgabe Task3B führt die Berechnung einer Fibunachi-Folge durch runFib(). Machen Sie sich zunächst mit der Aufrufhierarchie der Methode vertraut. Mit dem Starten des Programms wird an signifikanten Punkten die Funktion printStack() aufgerufen. Diese gibt in 32-Bit-Worten die Stackstruktur zu je vier Einheiten pro Zeile in hexadezimaler Darstellung aus.

Es ist nun an Ihnen diesen Ausgaben entsprechende Bedeutungen zu geben. Achten Sie dabei insbesondere auf die verschiedenen Formen der Parameterübergaben zwischen den Funktionen. Insbesondere für die rekursiven Aufrufe ergibt sich ein deutliches Muster. Sie können gern den gdb hinzuziehen, um weitere Informationen zu erlangen.

Fragen:
Was sind die sich wiederholenden Strukturen?
Wie erscheint das Array "ende" im Speicher?
In welcher Reihenfolge werden Parameter bei einem Funktionsaufruf auf den Stack gelegt?

Hilfestellung