Show TOC

Benutzereigene Traces anlegenLocate this document in the navigation structure

Mit Trace-Sätzen lässt sich fehlerhaftes Programmverhalten auf einfache Weise analysieren. Allerdings wird oft vergessen, die Traces frühzeitig zu implementieren, so dass sie im Fehlerfall nicht zur Verfügung stehen.

Mit dem ABAP Debugger-Scripting können Sie Ihr eigenes - auf Ihre Anforderungen angepasstes - Tracing implementieren, ohne den ursprünglichen Quelltext zu ändern.

Wenn Sie das Tracing über Scripts mit Layer Aware Debugging (profilgesteuertem Debugging) kombinieren, können Sie genau die Quelltextstellen analysieren, die Sie interessieren.

Trace für Anweisungen erstellen

Im Folgenden erfahren Sie, wie Sie ein Trace der Anweisungen erstellen, die während einer Debugging-Sitzung ausgeführt wurden. Mit diesem Trace sehen Sie, welcher Pfad durch ein Programm genommen wurde. Vom Trace aus können Sie mittels Vorwärtsnavigation direkt zur Anweisung im ABAP-Quelltext springen.

  1. Starten Sie das zu analysierende Programm im neuen ABAP Debugger. Wechseln Sie auf die Registerkarte Script.

  2. Wählen Sie über die Eingabehilfe von Script laden das Trace-Script RSTPDA_SCRIPT_STATEMENT_TRACE aus und laden Sie es.

    Sie sehen, dass das Script die Methode TRACE->ADD_SRC_INFO aus dem Script Wizard verwendet, um Quelltextzeilen in eine Trace-Datei zu schreiben.

    Der Trigger wird so gesetzt, dass das Script bei jedem Debugger-Einzelschritt läuft. Jede ausgeführte Quelltextzeile wird im Trace aufgezeichnet.

  3. Führen Sie das Script mit Script starten aus.

    Das Programm, das Sie gerade debuggen, läuft bis zum Ende (oder bis zum nächsten Dynpro bzw. zur nächsten Interaktion) durch. Effektiv haben Sie die Drucktaste Weiter im Debugger gewählt.

    Wenn Sie Breakpoints oder Watchpoints definiert haben, werden diese vom Debugger akzeptiert, und er hält an. Sie können dann wie gewohnt mit dem Debugger arbeiten. Wählen Sie Script fortführen auf der Registerkarte Script, wenn Sie mit dem Tracing fortfahren möchten.

  4. Wenn Ihr Programm bis zum Ende durchgelaufen ist oder Sie das Tracing stoppen möchten, übergeben Sie dem Debugger wieder die Steuerung. Geben Sie in der Sitzung des Programms, das Sie debuggen, den OK-Code /h ein. Wählen Sie dann die Drucktaste Zurück (F3).

    Sie gelangen wieder auf den Debugger-Bildschirm. Wählen Sie Script beenden, um das Script zu stoppen und zum Bildschirm zur Script-Definition zurückzukehren.

  5. Zeigen Sie das Trace mit Hilfe einer der Funktionen im Bereich Letzten Trace anzeigen an.

    Klicken Sie auf eine Zeile im Trace, um zur Zeile im Quelltext zu springen.

Trace aufgerufener Prozeduren mit benutzereigenem Tracing anlegen

Das Tracing von Prozeduren, die von einem Programm aufgerufen werden, bietet Ihnen eine Sicht auf höherer Ebene auf den Ausführungspfad des Programms als ein Trace der Anweisungen. Anhand eines Prozeduren-Trace können Sie die richtige zu debuggende Schicht mit dem Layer Aware Debugging (profilgesteuerten Debugging) erkennen.

Ein Prozeduren-Trace stellt außerdem ein gutes Framework für die Lokalisierung eigener Traces zur Verfügung, wie im Beispielscript unten gezeigt.

Das Beispielscript wird bei einem Watchpoint angestoßen, den Sie vor dem Starten des Scripts definieren. (Sie können auch interaktive Script-Methoden aus dem Script Wizard verwenden, um automatisch den Namen der Variablen zu holen und den Watchpoint zu setzen.)

Das Script liefert den aktuellen 'customer' (Kunden) aus dem Watchpoint und prüft und analysiert anschließend den Wert einer zweiten Variablen. Wenn der Wert dieser Variablen falsch ist, wird das Script angehalten und die Steuerung im Debugger wird an Sie zurückgegeben. Da der Debugger bis zum Auftreten dieses Problems ohne Unterbrechung läuft, können Sie viel Zeit sparen, die Sie ansonsten für die manuelle Werteprüfung aufwenden müssten.

  METHOD script.

* At each watchpoint or breakpoint, write the procedure name into the trace
    trace->add_event_info( ).

* Use a script wizard function to get 
* the current value of the watchpoint variable.
****************************************************************
*Interface (CLASS = CL_TPDA_SCRIPT_DATA_DESCR / METHOD = GET_SIMPLE_VALUE )
*Importing
*        REFERENCE( P_VAR_NAME ) TYPE TPDA_VAR_NAME
*Returning
*        VALUE( P_VAR_VALUE ) TYPE TPDA_VAR_VALUE
****************************************************************
    DATA: cust_name TYPE tpda_var_value.
    cust_name = cl_tpda_script_data_descr=>get_simple_value(
       p_var_name  = '<CUSTOMER_NAME-VARIABLE>' ).

* Add a subordinate trace entry with the current customer name.
****************************************************************
*Interface (CLASS = IF_TPDA_SCRIPT_TRACE_WRITE / METHOD = ADD_CUSTOM_INFO )
*Importing
*        REFERENCE( P_TRACE_ENTRY ) TYPE TPDA_TRACE_CUSTOM
****************************************************************
    DATA trace_entry TYPE tpda_trace_custom.
    trace_entry-value = 'Current customer is' && ` ` && cust_name.
    trace->add_custom_info( p_trace_entry = trace_entry ).

* Get the value of the correlated variable with which
* the problem is occurring.
    DATA: correlated_value TYPE tpda_var_value.
    correlated_value = cl_tpda_script_data_descr=>get_simple_value(
        p_var_name  = '<CORRELATED-VARIABLE>' ).

* Is the correlated value still valid?
* If not, then break for interactive debugging.
    IF correlated_value <> <VALID>.
      trace_entry-value = 'Correlated value incorrect:' 
                          && ` ` && correlated_value.
      trace->add_custom_info( p_trace_entry = trace_entry ).
      me->break( ).
    ELSE.
      trace_entry-value = 'Correlated value correct:' 
                          && ` ` && correlated_value.
      trace->add_custom_info( p_trace_entry = trace_entry ).
    ENDIF.

  ENDMETHOD.                    "script

            

Das vom Script generierte Trace ist hierarchisch nach den Prozeduren-Traces strukturiert, so dass Sie einfach erkennen können, wo Ihr eigenes Trace angestoßen wurde. Vom Trace aus können Sie mittels Vorwärtsnavigation zur Quelltextanzeige springen.