Using ABAP Debugger

Objective

After completing this lesson, you will be able to aBAP-Programm debuggen

Start über den ABAP Debugger in ADT

Es lässt sich nicht vermeiden, dass in Programmen Fehler auftreten. Diese Fehler können sich aber auf unterschiedliche Weise bemerkbar machen. Wenn ein Benutzer eine fehlerhafte Anwendung startet, kann sie abstürzen, es können unerwartete Ereignisse auftreten oder es kann überhaupt nichts passieren. Aus Sicht des Benutzers ist es auf der Ebene der Benutzungsoberfläche nicht möglich, zu sagen, wie und warum dieser Fehler aufgetreten ist.

Als Entwickler müssen Sie das Programm zeilenweise genauer untersuchen, um festzustellen, welche Anweisungen und Kombinationen von Werten in den verschiedenen Programmvariablen den Fehler verursacht haben. Hier kommt der Debugger ins Spiel.

Der Debugger in den ADT ist ein wichtiges Diagnosewerkzeug, mit dem Sie eine ABAP-Anwendung analysieren können.

Mit dem Debugger können Sie ermitteln, warum ein Programm nicht korrekt funktioniert, indem Sie zur Laufzeit innerhalb des Programms springen. Auf diese Weise können Sie die ausgeführten Anweisungen und den sich ändernden Wert von Variablenwerten während des Programmablaufs sehen.

Um den Debugger zu verwenden, entscheiden Sie zunächst, wo der Debug-Prozess gestartet werden soll. Eine Möglichkeit besteht darin, Breakpoints im Quelltext zu setzen, Ihr Programm auszuführen und an diesem gesetzten Breakpoint anzuhalten.

Im Debugger stehen unter anderem folgende Funktionen zur Verfügung:

Funktionen des ABAP Development Tools (ADT) Debugger

FunktionADT-Debugger
Breakpoints setzenJa
WatchpointsJa (je nach Release)
Bedingte BreakpointsJa
Schritt-für-Schritt-für-Schritt-AnleitungJa
Variablenwerte anzeigenJa

ABAP-Programm mit ABAP Development Tools (ADT) debuggen

Wenn Sie ein ABAP-Programm mit ADT debuggen, 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.

Screenshot der Debug-Perspektive mit Debug-spezifischen Sichten

Wichtige Elemente der Debug-Perspektive:

View „Source Code"

Die View Source Code ist der zentrale Teil der Debug-Perspektive. Hier wird der Quelltext angezeigt und die aktuelle Position im Programm markiert.

View „Variables"

Die View Variables ist ebenfalls sehr wichtig. In dieser Sicht können Sie die aktuellen Werte von Variablen von Variablen anzeigen.

View „Breakpoints"

Die Sicht Breakpoints wird neben der Sicht Variablen angezeigt (in der vorherigen Abbildung „Debug-Perspektive" nicht ausgewählt). In dieser Sicht können Sie Breakpoints anzeigen, löschen oder anlegen. Breakpoints sind Programmstellen, an denen die normale Verarbeitung unterbrochen wird, und das System zeigt Ihnen den Debugger an, damit Sie den Zustand des Programms genau zu diesem Zeitpunkt analysieren können.

Navigationsfunktionen

Beim Debuggen eines Programms verwenden Sie die Navigationsfunktionen, um die Ausführung des Quelltexts zu steuern.

View „Debug"

Die View Debug links oben zeigt die Debugging-Sitzung und die Aufrufhierarchie. Diese benötigen Sie später, wenn Sie Aufrufe von Modularisierungseinheiten, z.B. Methoden, debuggen.

Perspektivenauswahl

Mit den Drucktasten Perspektivenauswahl in der oberen rechten Ecke können Sie zur ABAP-Perspektive zurückwechseln.

Steuerung der Ausführung des Codes

Navigationsfunktionen

Wenn Sie das Debugging starten, verwenden Sie die Navigationsfunktionen, um die Ausführung des Codes zu steuern.

Screenshot der Schaltfläche „Step Into“
Screenshot der Schaltfläche „Fortsetzen“

Es folgen einige wichtige Navigationsfunktionen:

Step Into (F5)

Wählen Sie Schritt in, oder drücken Sie F5 auf Ihrer Tastatur, 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 Fortsetzen oder drücken Sie F8 auf Ihrer Tastatur, um das Programm bis zum nächsten Breakpoint auszuführen.  Wenn der Debugger keine Breakpoints mehr trifft, wird das Programm bis zum Ende ausgeführt und die Debugging-Sitzung beendet.

Run to Line (Umschalt + F8)

Wählen Sie Ausführen bis Zeile, oder drücken Sie Umsch+F8 auf der Tastatur, um das Programm bis zur aktuellen Cursorposition auszuführen. Die Auswahl einer Codezeile und die Auswahl dieser Funktion ist eine bequeme Alternative zum Setzen eines Breakpoints, zum Wählen von Fortsetzen und zum Entfernen des Breakpoints.

Jump to Line (Umschalt + F12)

Wählen Sie Zur Zeile springen, oder drücken Sie Umschalt+F12 auf Ihrer Tastatur, um einige Codezeilen zu überspringen oder zu einem bereits ausgeführten Code zurückzuspringen. Diese Funktion kann hilfreich sein, um zu simulieren, was passieren würde, wenn ein bestimmter Quelltextteil entfernt wurde, oder um das Debugging für ein bisschen Code zu wiederholen, bei dem Sie die Analyse zum ersten Mal versäumt haben. Beachten Sie, dass es sich hierbei um einen Sprung handelt und nicht um die Ausführung des Quelltexts. Wenn Sie rückwärts springen, werden Änderungen an den Datenobjekten nicht rückgängig gemacht.

Terminate

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

Inhalt von Datenobjekten anzeigen

Eine Möglichkeit, den Inhalt von Datenobjekten im Debugger zu analysieren, ist die Mouseover-Funktionalität des ABAP Editors. Positionieren Sie im Debugging-Modus den Cursor auf den Namen eines Datenobjekts und warten Sie einen Moment. Ein Dialogfenster mit dem Inhalt des Datenobjekts wird geöffnet.

Eine weitere Möglichkeit, den Inhalt von Datenobjekten im Debugger zu analysieren, ist die View „Variables". Diese View zeigt eine Liste der Datenobjekte und ihre aktuellen Werte an. Die Hauptliste mit den sogenannten Variablen der obersten Ebene enthält standardmäßig einige eingebaute Datenobjekte. In diesem Beispiel SY-SUBRC und ME. Expandieren Sie den Knoten „Locals", um eine Liste aller variablen Datenobjekte anzuzeigen, die im aktuellen Verarbeitungsblock definiert sind.

Es gibt drei Möglichkeiten, der Hauptliste in der View „Variables" Datenobjekte hinzuzufügen:

  • Doppelklicken Sie im Editor auf den Namen eines Datenobjekts.
  • Klicken Sie in der Variablenliste mit der linken Maustaste auf den Platzhalter <Enter variable> , und geben Sie den Namen des Datenobjekts ein.
  • Klicken Sie mit der rechten Maustaste auf eine Variable im Knoten „Locals", und wählen Sie „Show as Top Level Variable".

Eine Möglichkeit, den Inhalt von Datenobjekten im Debugger zu analysieren, ist die Mouseover-Funktionalität des ABAP Editors. Positionieren Sie im Debugging-Modus den Cursor auf den Namen eines Datenobjekts und warten Sie einen Moment. Ein Dialogfenster mit dem Inhalt des Datenobjekts wird geöffnet.

Eine weitere Möglichkeit, den Inhalt von Datenobjekten im Debugger zu analysieren, ist die View „Variables". Diese View zeigt eine Liste der Datenobjekte und ihre aktuellen Werte an. Die Hauptliste mit den sogenannten Variablen der obersten Ebene enthält standardmäßig einige eingebaute Datenobjekte. Im Beispiel sind dies SY-SUBRC und ME. Expandieren Sie den Knoten „Locals", um eine Liste aller variablen Datenobjekte anzuzeigen, die im aktuellen Verarbeitungsblock definiert sind.

Es gibt drei Möglichkeiten, der Hauptliste in der View „Variables" Datenobjekte hinzuzufügen:

  • Doppelklicken Sie im Editor auf den Namen eines Datenobjekts.
  • Klicken Sie in der Variablenliste mit der linken Maustaste auf den Platzhalter <Variable eingeben>, und geben Sie den Namen des Datenobjekts ein.
  • Klicken Sie mit der rechten Maustaste auf eine Variable im Knoten „Locals", und wählen Sie „Show as Top Level Variable".

Hier noch ein Tipp. Um ein Datenobjekt aus der Liste zu entfernen, klicken Sie mit der rechten Maustaste darauf, und wählen Sie Remove.

Watchpoints

Ein einfacher Watchpoint für eine Variable bewirkt, dass das Programm im Debugger anhält, wenn sich der Wert dieser Variablen ändert. Durch das Hinzufügen einer Bedingung stoppt das Programm nur, wenn sich der Wert der Variable ändert und die Bedingung erfüllt ist.

Um einen Watchpoint für eine Variable festzulegen, doppelklicken Sie auf die Variable in der Quelltextanzeige, klicken Sie mit der rechten Maustaste darauf, und wählen Sie Watchpoint setzen. Dadurch wird ein Watchpoint für diese Variable angelegt, den Sie dann in der View „Breakpoints" sehen können.

Um einem Watchpoint eine Bedingung hinzuzufügen, wählen Sie diese in der Liste der Breakpoints aus, und geben Sie die Bedingung in das Feld Bedingung ein. Drücken Sie die Eingabetaste, um den Watchpoint mit der Bedingung zu sichern.

Screenshot eines in der Breakpoint-Sicht definierten Watchpoints

Wenn ein unerwarteter Wert einer Variablen zu Problemen führt, können Sie ihren Wert während der Programmausführung mit einem Watchpoint verfolgen.

Ein einfacher Watchpoint für eine Variable bewirkt, dass das Programm im Debugger angehalten wird, wenn sich der Wert dieser Variablen ändert. Durch das Hinzufügen einer Bedingung stoppt das Programm nicht bei jeder Wertänderung der Variablen, sondern nur in den Fällen, in denen auch die Bedingung erfüllt ist.

Um einen Watchpoint für eine Variable festzulegen, markieren Sie die Variable im Quelltext, klicken Sie mit der rechten Maustaste darauf, und wählen Sie Watchpoint setzen. Dadurch wird ein Watchpoint für die Variable angelegt, den Sie in der Breakpoint-Sicht sehen können.

Wählen Sie die Watchpoint-Variable aus, um eine Bedingung zu einem Watchpoint hinzuzufügen, wählen Sie sie in der Liste der Breakpoints aus, und geben Sie die Bedingung in das Feld Bedingung ein. Wählen Sie Enter auf Ihrer Tastatur, um den Watchpoint mit der Bedingung zu sichern.

Um den Watchpoint zu entfernen, wechseln Sie zur Ansicht Breakpoints, klicken Sie mit der rechten Maustaste auf die Variable Watchpoint, und wählen Sie Entfernen.

ABAP-Anwendung debuggen und Watchpoint setzen

Betriebswirtschaftliche Übung

Wir sehen uns nun an, wie ein Breakpoint gesetzt und ein Watchpoint angelegt wird.

Notiz

In dieser Übung bezieht sich XX auf Ihre Nummer.

Schritte

  1. Öffnen Sie die lokale Klasse LHC_GROCERY der Klasse ZBP_R_XX_GROCERY. Fügen Sie einen Breakpoint hinzu, wenn dem Feld lv_Außendienst ein Wert zugewiesen wird.

    1. Doppelklicken Sie im Project Explorerauf die Klasse ZBP_R_XX_GROCERY.

    2. Wählen Sie unten im Editorfenster die Registerkarte Lokale Typen.

    3. Um den Breakpoint zu setzen, doppelklicken Sie auf den Rand der Zeile:

      lv_expiration = ls_grocery-Expirationdate.
  2. Führen Sie das Anwendungsprogramm aus.

    1. Doppelklicken Sie im Projekt-Explorer auf die Service-Bindung ZUI_XX_GROCERY_04, um die Service-Bindung zu öffnen.

    2. Wählen Sie unter Serviceversionsdetails unter Entitätsmenge und Assoziationdie Option Lebensmittel.

    3. Wählen Sie Vorschau... um die Anwendung auszuführen.

  3. Gehen Sie den Code durch, und sehen Sie sich die Variablen an.

    1. Wählen Sie Start, um die Lebensmittelliste anzuzeigen. Wenn die Liste leer ist, wählen Sie Anlegen, und legen Sie mindestens eine Lebensmittelposition an.

    2. Markieren Sie das Ankreuzfeld links neben einer Lebensmittelposition, und wählen Sie Verfall prüfen.

    3. In Eclipse wird eine Aufforderung angezeigt, zur Debug-Perspektive zu wechseln. Wählen Sie Umschalten. Die Debug-Perspektive wird nun angezeigt.

    4. Um den Wert von lv_Expiration anzuzeigen, bewegen Sie den Mauszeiger über lv_ablauf in der Zeile:

      lv_expiration = ls_grocery-Expirationdate.
    5. Doppelklicken Sie auf lv_expriation, um die Variablenliste auf der rechten Seite des Fensters hinzuzufügen.

    6. Wählen Sie Step Into (F5) (Einzelschritt). Sehen Sie sich in der Variablenliste den geänderten Wert für lv_Außendienst an.

    7. Gehen Sie mehr Code durch, und sehen Sie sich alle Variablenwerte an, an denen Sie interessiert sind.

    8. Zum Beenden wählen Sie Fortsetzen (F8).

      Screenshot der Drucktaste Fortsetzen
  4. Legen Sie einen Watchpoint für eine Variable an.

    Notiz

    Damit der Watchpoint erreicht wird, muss der ausgewählte Lebensmittelartikel ein Ablaufdatum in der Vergangenheit haben. Wenn dies nicht der Fall ist, klicken Sie auf eine Lebensmittelposition in der Liste, und wählen Sie auf dem Detailbild Bearbeiten, und setzen Sie das Verfallsdatum auf ein Datum in der Vergangenheit.
    1. Um einen Watchpoint für eine Variable anzulegen, wiederholen Sie die vorherigen Schritte, bis Sie die Debug-Perspektive eingeben.

    2. Klicken Sie mit der rechten Maustaste auf lv_verfallen. Wählen Sie Watchpoint setzen.

    3. Wechseln Sie oben rechts auf dem Bild von der Registerkarte Variablen zur Registerkarte Breakpoint.

    4. Doppelklicken Sie auf lv_abgelaufen, und fügen Sie diese Bedingung unten in der Sicht hinzu.

      = abap.true
    5. Wählen Sie Sichern Sichern (Strg+S).

    6. Wählen Sie Fortsetzen (F8).

  5. Zeigen Sie die alten und neuen Werte der Watchpoint-Variablen an.

    1. Wählen Sie die Registerkarte Variablen.

    2. Klappen Sie Watchpoint LV_EXIPIRED Values auf. Zeigen Sie Aktueller Wert und Aktueller Wert an.

  6. Setzen Sie die Anwendung fort, und wechseln Sie zurück zur ABAP-Perspektive.

    1. Wählen Sie Fortsetzen (F8).

    2. Wählen Sie oben rechts im Fenster die Drucktaste ABAP-Perspektive.

    Übung