Show TOC

Benutzereigene Watchpoints und Breakpoints anlegenLocate this document in the navigation structure

ABAP bietet eine große Bandbreite an Standard-Breakpoints, die Sie flexibel einsetzen können. Zusätzlich können Sie jedoch auch eigene Watchpoints anlegen, die den Wert einer überwachten Variablen gemäß einer Reihe von Bedingungen evaluieren.

Doch selbst so ist oftmals ein noch intelligenterer Breakpoint oder Watchpoint erforderlich, wenn Sie ein Debugging bei einem schwierigen Problem durchführen müssen. Zum Beispiel kann ein benutzereigener Breakpoint nötig sein, bei dem angehalten wird, wenn eine bestimmte interne Tabelle gelesen wird. Eventuell benötigen Sie auch einen Watchpoint, bei dem angehalten wird, wenn sich der aktuelle Wert einer Variablen von deren früherem Wert unterscheidet. Eine solche Prüfung kann nicht durch ein Standard-Watchpoint ausgedrückt werden.

Durch Scripting mit dem Debugger können Sie jede beliebige Funktionskombination von Breakpoints und Watchpoints schnell implementieren.

Benutzereigenen Breakpoint anlegen

Im Folgenden finden Sie ein Programmbeispiel, bei dem das Programm, bei dem das Debugging durchgeführt wird, jedes Mal angehalten wird, wenn es aus einer bestimmten internen Tabelle liest. Sie können das komplette Script in der Transaktion SAS einsehen. Laden Sie hierzu das Standard-Script RSTPDA_SCRIPT_BP_READ_TAB.

*---------------------------------------------------------------------*
*       CLASS lcl_debugger_script DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_debugger_script DEFINITION INHERITING FROM  cl_tpda_script_class_super  .

  PUBLIC SECTION.
    METHODS: prologue  REDEFINITION,
             init    REDEFINITION,
             script  REDEFINITION,
             end     REDEFINITION.
  PRIVATE SECTION.

    DATA range_it TYPE tpda_range_it.
ENDCLASS.                    "lcl_debugger_script DEFINITION
*---------------------------------------------------------------------*
*       CLASS lcl_debugger_script IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_debugger_script IMPLEMENTATION.
  METHOD prologue.
*** generate abap_source (source handler for ABAP)
    super->prologue( ).
  ENDMETHOD.                    "prolog

  METHOD init.

    DATA l_cancel TYPE flag.

    CALL FUNCTION 'TPDA_SCRIPT_CALL_SEL_SCREEN'
      EXPORTING
        p_screen   = if_tpda_sel_screens=>c_scr_itab
      IMPORTING
        p_range_it = range_it
        p_cancel   = l_cancel.

    IF l_cancel = abap_true.
      MESSAGE s144(tpda) .
      RAISE EXCEPTION TYPE cx_tpda_stop_scripting_request.
    ELSEIF range_it IS INITIAL.
      MESSAGE s144(tpda) .
      RAISE EXCEPTION TYPE cx_tpda_stop_scripting_request.
    ENDIF.

  ENDMETHOD.                    "init

  METHOD script.
    DATA:  l_itabs_it TYPE cl_tpda_script_scan_itab_read=>ty_it_tables,
           l_itab LIKE LINE OF l_itabs_it,
           l_scan_object TYPE REF TO  cl_tpda_script_scan_itab_read,
           l_curr_itab TYPE string.

        l_scan_object ?= cl_tpda_script_scan=>scan(
            p_program     = abap_source->program( )
            p_include     = abap_source->include( )
            p_line        = abap_source->line( )
               ).

        l_itabs_it = l_scan_object->it_tables( ).

        LOOP AT l_itabs_it INTO l_itab.
          IF l_itab IN range_it.
            me->break( ).
          ENDIF.
        ENDLOOP.

  ENDMETHOD.                    "script
ENDCLASS.                    "lcl_debugger_script IMPLEMENTATION

            

Führen Sie folgende Schritte aus, um das Script zu verwenden:

  1. Starten Sie das Programm, bei dem das Debugging durchgeführt werden soll, im Debugger und wählen Sie die Registerkarte Script.

  2. Laden Sie das Script und starten Sie es. Geben Sie die Namen der zu überwachenden internen Tabellen ein.

  3. Jedes Mal wenn das Script anhält, können Sie, wenn nötig, ein Debugging vornehmen. Auf der Registerkarte Script können Sie anschließend entscheiden, ob Sie das Script bis zum nächsten Breakpoint ausführen oder ob Sie das Script beenden möchten.

  4. Wenn Sie das Ende des Programms erreichen, bevor Sie das Script beenden, geben Sie /h in das OK-Code-Feld ein und wählen Sie die Drucktaste "Zurück" ( F3), um die Steuerung an den Debugger zurückzugeben, damit Sie das Script beenden können.

Benutzereigenen Watchpoint anlegen

Angenommen, bei Ihrem Programm verschwinden in einer großen Programmschleife Zeilen aus einer internen Tabelle. Es werden Zeilen an einer unbekannten Stelle in der Tabelle gelöscht, an der sie nicht gelöscht werden sollten.

Das folgende Script bietet Ihnen eine effiziente Lösung, das Problem zu lokalisieren, indem das Programm jedes Mal angehalten wird, wenn die Anzahl der Zeilen in der Tabelle reduziert wird. Das Skript wird am Watchpoint für die Anzahl der Zeilen in der Tabelle angestoßen. Wenn die Anzahl der Zeilen in der Tabelle geringer ist, als beim letzten Watchpoint, hält das Script an dem Watchpoint an.

Mit dem Script können Sie alle Änderungen an der Zeilenanzahl in der Tabelle, die keine Bedeutung haben, überspringen. Es hält das Programm im Debugger nur bei Änderungen der Variable an, die für Sie relevant ist.

*---------------------------------------------------------------------*
*       CLASS lcl_debugger_script DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_debugger_script DEFINITION INHERITING FROM  cl_tpda_script_class_super  .

  PUBLIC SECTION.
    METHODS: prologue  REDEFINITION,
             init    REDEFINITION,
             script  REDEFINITION,
             end     REDEFINITION.

  PRIVATE SECTION.
    DATA saved_count TYPE i.

ENDCLASS.                    "lcl_debugger_script DEFINITION
*---------------------------------------------------------------------*
*       CLASS lcl_debugger_script IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_debugger_script IMPLEMENTATION.
  METHOD prologue.
*** generate abap_source (source handler for ABAP)
    super->prologue( ).
  ENDMETHOD.                    "prolog

  METHOD script.

    DATA table_descr TYPE REF TO cl_tpda_script_tabledescr.
    DATA l_count TYPE i.

* Use a script wizard function to get a handle
* for accessing the internal table from your script
****************************************************************
*Interface (CLASS = CL_TPDA_SCRIPT_DATA_DESCR / METHOD = FACTORY )
*Importing
*        REFERENCE( P_VAR_NAME ) TYPE TPDA_VAR_NAME
*Returning
*        VALUE( P_DATADESCR ) TYPE REF TO CL_TPDA_SCRIPT_DATA_DESCR
****************************************************************
    table_descr = cl_tpca_script_data_descr=>factory( 
                    p_var_name  = 'ITAB' ).

* Get the current line count of the table.
****************************************************************
*Interface (CLASS = CL_TPDA_SCRIPT_TABLEDESCR / METHOD = LINECNT )
*Returning
*        VALUE( P_LINES ) TYPE I
****************************************************************
    p_lines = table_descr->linecnt( ).

    IF l_count < saved_count.
* Break if the line count of the table DECREASES.
      me->break( ).
    ENDIF.
    saved_count = l_count.

  ENDMETHOD.                    "script
ENDCLASS.                    "lcl_debugger_script IMPLEMENTATION
*----------------
            

Führen Sie folgende Schritte aus, um das Script zu verwenden:

  1. Starten Sie das Programm, bei dem das Debugging durchgeführt werden soll, im Debugger und wählen Sie die Registerkarte Script.

  2. Laden Sie oder erstellen Sie das Script. Stoßen Sie es an einem Watchpoint für die Änderung der Zeilenanzahl in der internen Tabelle an. Starten Sie anschließend das Script.

  3. An jedem vom Script ausgelösten Breakpoint können Sie, wenn nötig, ein Debugging vornehmen. Auf der Registerkarte Script können Sie anschließend entscheiden, ob Sie das Script bis zum nächsten Breakpoint ausführen oder ob Sie das Script beenden möchten.

  4. Wenn Sie das Ende des Programms erreichen, bevor Sie das Script beenden, geben Sie /h in das OK-Code-Feld ein und wählen Sie die Drucktaste "Zurück" ( F3), um die Steuerung an den Debugger zurückzugeben, damit Sie das Script beenden können.