Erste Schritte
Grundlegende Methoden und Konzepte anwenden
Mit lokalen Klassen arbeiten
Daten aus der Datenbank lesen
Mit strukturierten Datenobjekten arbeiten
Mit komplexen internen Tabellen arbeiten
Datenbankänderungen mit Business Objects implementieren
Das ABAP-RESTful-Anwendungsprogrammiermodell beschreiben

Debugging eines ABAP-Programms

Objectives

After completing this lesson, you will be able to:
  • Wechseln Sie in den Debugging-Modus.
  • Steuern Sie die Ausführung von Code.
  • Analysieren Sie den Inhalt von Datenobjekten.

Der Debugging-Modus

Sehen Sie sich dieses Video an, um die Notwendigkeit für das Debugging zu verstehen.

Den Debugger starten

Zum Debuggen eines ABAP-Programms setzen Sie einen Breakpoint und führen dann das Programm normal aus. Wenn das Programm den Breakpoint erreicht, wird es vom System unterbrochen und in ADT wird die ABAP-Debug-Perspektive geöffnet. Anschließend können Sie jede nachfolgende Anweisung einzeln ausführen, um zu sehen, welche Auswirkung sie auf das Programm hat. Sie können auch den Inhalt aller Variablen im Programm prüfen, um festzustellen, ob unerwartete Werte auftreten.

Um einen Breakpoint zu setzen oder zu entfernen, klicken Sie mit der rechten Maustaste auf den linken Rand des Editors, und wählen Sie „Toggle Breakpoint". Alternativ können Sie auf den linken Rand doppelklicken. Beachten Sie, dass das Programm aktiviert werden muss, bevor Sie Breakpoints setzen können.

Breakpoints sind benutzerspezifisch und persistent, d.h., dass sie auch nach Ihrer Abmeldung von ADT und einer erneuten Anmeldung aktiv bleiben. Um zu verhindern, dass der Debugger an einem Breakpoint startet, müssen Sie ihn entweder löschen (mit der Funktion „Toggle Breakpoint") oder mit der entsprechenden Funktion im Kontextmenü deaktivieren.

Notiz

Abhängig von Ihren Personalisierungseinstellungen fordert ADT zuerst eine Bestätigung an, bevor die Debug-Perspektive automatisch geöffnet wird.

Die Debug-Perspektive in ADT

Beim Debuggen eines ABAP-Programms mit den ABAP Development Tools verwenden Sie die Debug-Perspektive. Hierbei handelt es sich um eine standardmäßige Eclipse-Debug-Perspektive, die Views und Funktionen enthält, die besonders für das Debugging wichtig sind.

Schauen wir uns einige wichtige Elemente der Debug-Perspektive an.

Starten des Debuggers

Codeausführung steuern

Navigationsfunktionen

Sobald Sie mit dem Debugging begonnen haben, verwenden Sie die Navigationsfunktionen, um die Ausführung des Quelltexts zu steuern.

Wichtige Navigationsfunktionen:

Step Into (F5)

Wählen Sie Step Into, oder drücken Sie F5, um einen einzelnen Schritt auszuführen. Verwenden Sie diese Funktion für eine schrittweise Analyse. Beispiel: Sie möchten feststellen, welcher Quelltextblock einer Kontrollstruktur tatsächlich ausgeführt wird.

Resume (F8)

Wählen Sie Resume, oder drücken Sie F8, um das Programm bis zum nächsten Breakpoint auszuführen. Wenn der Debugger keine weiteren Breakpoints findet, wird das Programm bis zum Ende ausgeführt und die Debugging-Sitzung beendet.

Run to Line (Umschalt + F8)

Wählen Sie Run to Line, oder drücken Sie Umschalt + F8, um das Programm bis zur aktuellen Cursorposition auszuführen. Das Klicken auf eine Quelltextzeile und das Wählen dieser Funktion bietet eine bequeme Alternative zum Setzen eines Breakpoints, Wählen von „Resume" und Entfernen des Breakpoints.

Jump to Line (Umschalt + F12)

Wählen Sie Jump to Line, oder drücken Sie Umschalt + F12, um einige Quelltextzeilen zu überspringen oder zu einem bereits ausgeführten Quelltext zurückzukehren. Diese Funktion kann hilfreich sein, um zu simulieren, was passieren würde, wenn ein bestimmter Quelltextteil entfernt würde, oder um ein Stück Quelltext zu debuggen, bei dem die Analyse beim ersten Mal versäumt wurde. Beachten Sie, dass es sich hierbei tatsächlich um einen Sprung handelt und nicht um die Ausführung des Quelltexts. Wenn Sie rückwärts springen, werden Änderungen an Datenobjekten nicht rückgängig gemacht.

Terminate

Wählen Sie Terminate, wenn Sie mit dem Debugging fertig sind und das verbleibende Programm nicht ausführen möchten. Die Debugging-Sitzung wird sofort beendet.

Spezielle Breakpoints

Sie haben gelernt, dass Sie Breakpoints anlegen und verwalten können, indem Sie auf den linken Rand der View „ABAP Editor" klicken. Dies funktioniert auch mit der View „ABAP Editor" in der Debug-Perspektive.

Darüber hinaus können Sie in die View „Breakpoints" wechseln und dort Ihre Breakpoints verwalten.

In der View „Breakpoints" können Sie auch spezielle Breakpoints anlegen:

Anweisungs-Breakpoint

Ein Anweisungs-Breakpoint ist nicht an eine bestimmte Quelltextzeile, sondern an eine bestimmte ABAP-Anweisung angehängt. Ein Anweisungs-Breakpoint für die Anweisung CLEAR bewirkt z.B., dass das Programm im Debugger gestoppt wird, wenn eine CLEAR-Anweisung ausgeführt wird, unabhängig davon, wo sich diese Anweisung befindet.

Um einen Anweisungs-Breakpoint anzulegen, öffnen Sie die Dropdown-Liste in der Symbolleiste der View „Breakpoints", und wählen Sie Add Statement Breakpoint …

Ausnahme-Breakpoint

Ein Ausnahme-Breakpoint wird an eine bestimmte Ausnahme angehängt. Dies bewirkt, dass das Programm im Debugger gestoppt wird, wenn diese bestimmte Ausnahme ausgelöst wird, und zwar unabhängig davon, ob diese Ausnahme vom Programm behandelt wird oder zu einem Laufzeitfehler führt. Um einen Ausnahme-Breakpoint anzulegen, öffnen Sie die Dropdown-Liste in der Symbolleiste der View „Breakpoints", und wählen Sie „Add Exception Breakpoint …".

Bedingter Breakpoint

Sie wandeln einen Breakpoint in einen bedingten Breakpoint um, indem Sie eine Bedingung hinzufügen. Wenn die Programmausführung auf einen bedingten Breakpoint trifft, stoppt das Programm im Debugger nur, wenn die Bedingung erfüllt ist. Wenn sich beispielsweise ein Breakpoint zwischen DO und ENDDO befindet, wird das Programm bei jeder Iteration im Debugger angehalten. Wenn Sie jedoch eine Bedingung „sy-index > 20" hinzufügen, ignoriert der Debugger diesen Breakpoint während der ersten 20 Iterationen und stoppt nur in den folgenden Iterationen.

Um einem Breakpoint eine Bedingung hinzuzufügen, wählen Sie den Breakpoint in der Liste der Breakpoints aus, und geben Sie die Bedingung im Feld „Condition" ein. Drücken Sie die Eingabetaste, um den Breakpoint mit der Bedingung zu sichern.

Watchpoints

Wenn Ihnen ein unerwarteter Wert einer Variable Probleme bereitet, können Sie diesen Wert im Laufe des Programms mit einem Watchpoint verfolgen.

In diesem Video erfahren Sie, wie das funktioniert.

So steuern Sie die Ausführung von Code

Analyse von Datenobjekten

Inhalt von Datenobjekten anzeigen

In diesem Video erfahren Sie, wie Sie den Inhalt von Datenobjekten im Debugger anzeigen.

Inhalt interner Tabellen anzeigen

In diesem Video erfahren Sie, wie Sie den Inhalt interner Tabellen anzeigen.

Variablenwerte ändern

Abhängig von Ihren Berechtigungen können Sie den Wert von Variablen während des Debuggings ändern.

Bei einfachen Variablen suchen Sie die Variable in der Ansicht Variablen, klicken mit der rechten Maustaste darauf und wählen Wert ändern….

Um den Inhalt einer internen Tabelle zu ändern, muss zwischen dem Ändern des Werts einer vorhandenen Zeile und dem Hinzufügen oder Löschen von Zeilen unterschieden werden.

Wie in der Abbildung dargestellt, sind die folgenden Funktionen verfügbar, wenn Sie mit der rechten Maustaste auf die Sicht ABAP Internal Table klicken:

Wert ändern...
Wählen Sie Wert ändern…, um den Inhalt einer vorhandenen Zeile zu ändern.
Zeile einfügen...
Wählen Sie Zeile einfügen…, um eine neue Zeile hinzuzufügen. Sie können entscheiden, ob Sie die neue Zeile anhängen oder an der gewählten Position einfügen möchten.
Ausgewählte Zeilen löschen
Wählen Sie Ausgewählte Zeilen löschen, um die ausgewählten Zeilen zu entfernen, bevor Sie mit der rechten Maustaste darauf klicken. Um eine Zeile auszuwählen, klicken Sie mit der linken Maustaste darauf. Um mehr als eine Zeile auszuwählen, halten Sie die Strg -Taste oder die Umschalt -Taste gedrückt, wenn Sie mit der linken Maustaste auf zusätzliche Zeilen klicken.
Zeilen löschen...
Wählen Sie Zeilen löschen…, um einen größeren Bereich von Zeilen oder sogar alle Zeilen zu entfernen. Sie werden nach der Nummer der Startzeile und der Endzeile gefragt, die Sie löschen möchten.

Analysieren der Inhalte von Datenobjekten

ABAP-Code debuggen

In dieser Übung analysieren Sie ABAP-Code mit dem ABAP Debugger.

Vorlage:

  • /LRN/CL_S4D400_BTT_DEBUG (globale Klasse)

Lösung:

  • Keine, die Klasse bleibt unverändert.

Aufgabe 1: Vorbereitung

Kopieren Sie die Klasse, die Sie debuggen möchten.

Schritte

  1. Öffnen Sie den Quelltext der globalen Klasse /LRN/CL_S4D400_BTT_DEBUG im ABAP Editor.

    1. Wählen Sie in der Eclipse-Symbolleiste Open ABAP Development Object. Drücken Sie alternativ Strg + Umschalt + A.

    2. Geben Sie als Suchzeichenfolge /LRN/CL_S4D400_BTT ein.

    3. Wählen Sie in der Liste der Entwicklungsobjekte /LRN/CL_S4D400_BTT_DEBUG aus, und wählen Sie dann OK.

  2. Verknüpfen Sie die View Project Explorer mit dem Editor.

    1. Suchen Sie in der Symbolleiste Project Explorer die Drucktaste Link with Editor. Wählen Sie die Drucktaste, falls diese noch nicht markiert ist. Dadurch sollte das Entwicklungsobjekt, das im Editor geöffnet ist, im Project Explorer hervorgehoben sein.

  3. Kopieren Sie die Klasse /LRN/CL_S4D400_BTT_DEBUG in eine Klasse in Ihrem eigenen Paket (Namensvorschlag: ZCL_##_DEBUG, wobei ## für Ihre Gruppennummer steht).

    1. Klicken Sie in der View Project Explorer mit der rechten Maustaste auf die Klasse /LRN/CL_S4D400_BTT_DEBUG, um das Kontextmenü zu öffnen.

    2. Wählen Sie im Kontextmenü Duplicate ...

    3. Geben Sie den Namen Ihres Pakets (ZS4D400_##, wobei ## für Ihre Gruppennummer steht) und den Namen für die neue Klasse (ZCL_##_DEBUG) ein, und wählen Sie Next.

    4. Bestätigen Sie den Transportauftrag, und wählen Sie Finish.

  4. Aktivieren und testen Sie die Klasse.

    1. Drücken Sie Strg + F3, um die Klasse zu aktivieren.

    2. Drücken Sie F9, um die Klasse auszuführen.

  5. Überprüfen Sie die Ausgabe in der View Console.

    1. Überprüfen Sie die View Console, die planmäßig als neue Registerkarte unterhalb der Editor-View geöffnet wird.

    2. Wenn die View Console nicht angezeigt wird, öffnen Sie sie, indem Sie WindowShow ViewOther wählen. Doppelklicken Sie in der Trefferliste auf Console.

Aufgabe 2: Startwerte analysieren

Starten Sie den Debugger bei der ersten ausführbaren Anweisung in der Methode if_oo_adt_classrun~main( ), und analysieren Sie die Werte einiger Variablen- und Konstantendatenobjekte.

Schritte

  1. Setzen Sie bei der ersten Anweisung einen Breakpoint, der keinen Typ definiert bzw. kein Datenobjekt deklariert.

    Hinweis

    TYPES definiert einen Datentyp, CONSTANTS deklariert ein Konstantendatenobjekt, DATA deklariert ein variables Datenobjekt.
    1. Doppelklicken Sie auf den linken Rand des Editors neben der Zeile  loan_remaining = loan_total., um einen Breakpoint zu setzen.

  2. Führen Sie die Klasse als Konsolen-App aus, und rufen Sie den Debugger auf.

    1. Drücken Sie F9, um die Klasse auszuführen.

    2. Wenn Sie gefragt werden, ob Sie zur Debug-Perspektive wechseln möchten, markieren Sie Remember my decision, und wählen Sie OK.

  3. Zeigen Sie den Wert des Datenobjekts loan_remaining und loan_total in der View Variables an.

    1. Doppelklicken Sie in der aktuellen Quelltextzeile (die Zeile mit grünem Hintergrund) auf loan_remaining.

    2. Doppelklicken Sie in derselben Quelltextzeile auf loan_total.

Aufgabe 3: Programmausführung steuern

Setzen Sie Breakpoints und Watchpoints. Führen Sie einzelne Schritte aus, oder setzen Sie die Ausführung fort, bis der nächste Breakpoint oder Watchpoint erreicht ist. Überwachen Sie die Wertänderungen der Datenobjekte.

Schritte

  1. Führen Sie einen einzelnen Schritt aus, um die Wertzuweisung in der aktuellen Zeile zu debuggen.

    1. Wählen Sie in der Symbolleiste Step Into (F5), oder drücken Sie F5.

    2. Prüfen Sie, ob sich der Wert von loan_remaining von 0..00 in 5000,00 geändert hat.

  2. Zeigen Sie den Inhalt des Datenobjekts spec_repay_mode an. Führen Sie anschließend einen weiteren Einzelschritt aus, um zu sehen, welche WHEN-Verzweigung der CASE-Kontrollstruktur ausgeführt wird.

    1. Doppelklicken Sie in der nächsten Quelltextzeile auf spec_repay_mode.

    2. Drücken Sie F5, um zu sehen, dass das Programm zur Quelltextzeile WHEN 'Q'. springt.

  3. Setzen Sie einen Watchpoint für die Variable loan_remaining, und setzen Sie die Programmausführung fort. Wo stoppt die Programmausführung wieder?

    1. Klicken Sie in der View Variables mit der rechten Maustaste auf LOAN_REMAINING, und wählen Sie Set Watchpoint.

    2. Wählen Sie in der Symbolleiste Resume (F8), oder drücken Sie F8.

    3. Die Programmausführung stoppt unmittelbar nach der Quelltextzeile loan_remaining = loan_remaining - repayment_month., genauer gesagt, in der nächsten Quelltextzeile mit ausführbarem Code.

  4. Zeigen Sie den Inhalt des Datenobjekts repayment_plan an. Führen Sie dann einen weiteren Einzelschritt aus, um zu sehen, wie es mit der APPEND-Anweisung gefüllt wird.

    Notiz

    Da repayment_plan eine interne Tabelle ist, wird sie nicht nur in der View Variables, sondern auch in der View ABAP Internal Table (Debugger) unterhalb des Editors angezeigt.
    1. Doppelklicken Sie auf repayment_plan am Ende der APPEND-Anweisung.

    2. Drücken Sie F5, um zu sehen, wie repayment_plan mit einer ersten Zeile gefüllt wird.

  5. Untersuchen Sie das Zeichenketten-Template in der APPEND-Anweisung und beziehen Sie es auf die resultierende erste Zeile in der internen Tabelle repayment_plan. Zeigen Sie den Inhalt der Datenobjekte an, die in den eingebetteten Ausdrücken vorkommen.

    1. Doppelklicken Sie auf die Datenobjekte, die zwischen den geschweiften Klammern stehen, um deren Inhalt anzuzeigen.

  6. Setzen Sie einen weiteren Watchpoint für die Variable repayment_plan, und setzen Sie die Programmausführung einige Male fort. Immer wenn die Ausführung einen der Watchpoints erreicht, analysieren Sie den Wert von loan_remaining. Neue Zeilen werden zu repayment_plan hinzugefügt.

    1. Klicken Sie in der View Variables mit der rechten Maustaste auf REPAYMENT_PLAN, und wählen Sie Set Watchpoint.

    2. Drücken Sie F8, um die Programmausführung fortzusetzen.

    3. Analysieren Sie die Datenobjekte in den Views Variables und ABAP Internal Table (Debugger).

  7. Setzen Sie nach einer Weile einen Anweisungs-Breakpoint für alle EXIT-Anweisungen, und löschen Sie die beiden Watchpoints.

    1. Navigieren Sie zur View Breakpoints.

      Hinweis

      Sie finden die View Breakpoints neben der View Variables.
    2. Expandieren Sie in der Symbolleiste der View Breakpoints die Dropdown-Drucktaste ganz links, und wählen Sie Add Statement Breakpoint ....

    3. Geben Sie im daraufhin angezeigten Dialogfenster EXIT als Suchzeichenfolge ein, klicken Sie auf den Wert EXIT in der Trefferliste, und wählen Sie OK.

    4. Klicken Sie in der View Breakpoints mit der rechten Maustaste auf den Watchpoint LOAN_REMAINING, und wählen Sie Remove.

    5. Klicken Sie in der View Breakpoints mit der rechten Maustaste auf den Watchpoint REPAYMENT_PLAN, und wählen Sie Remove.

  8. Setzen Sie die Programmausführung fort, bis Sie die erste EXIT-Anweisung erreicht haben. Deaktivieren Sie den Anweisungs-Breakpoint für die EXIT-Anweisung. Führen Sie dann Einzelschritte aus, bis Sie den Ausgabeteil des Programms erreichen.

    1. Drücken Sie F8, um die Programmausführung fortzusetzen.

    2. Wechseln Sie zur View Breakpoints, und entmarkieren Sie die Zeile mit EXIT [Statement].

    3. Drücken Sie F5, bis Sie die erste Quelltextzeile erreichen, die mit out->write( beginnt.

  9. Öffnen Sie die View Console. Führen Sie das verbleibende Programm aus, und verfolgen Sie die Ausgabe in der View Console.

    Drücken Sie nicht F5, um die Ausgabe zu debuggen. Verwenden Sie stattdessen F6.

    Notiz

    Wie Sie später im Kurs lernen werden, handelt es sich bei out->write( ... ) nicht um eine ABAP-Anweisung, sondern um einen wiederverwendbaren Quelltextblock, der aus vielen ABAP-Anweisungen besteht. Wenn Sie F5 drücken, gelangen Sie über Step Into in diesen Quelltext, um ihn im Detail zu analysieren. Mit F6 (Step Over) überspringen Sie den Quelltextblock und behandeln ihn wie eine einzelne Anweisung.
    1. Drücken Sie mehrmals F6, bis Sie das Ende der Anwendung erreicht haben.

    2. Analysieren Sie die zusätzliche Ausgabe in der View Console, und vergleichen Sie sie mit dem Zeichenketten-Template in der vorherigen Quelltextzeile.

  10. Vergessen Sie beim Beenden der Anwendung nicht, wieder in die ABAP-Perspektive zu wechseln.

    1. Wählen Sie ABAP ganz rechts in der Eclipse-Symbolleiste.