• Header exxsens Developer Blog

Debugger-Skripting - Einführung Teil 1

Mit dem Debugger-Skripting besteht die Möglichkeit Aktionen im Debugger zu automatisieren und Informationen über die Laufzeitumgebung zu sammeln und zu analysieren. In dieser Reihe wollen wir Ihnen das Thema vorstellen. Das Debugger-Skripting finden Sie nach dem Start des Debuggers auf einer zusätzlichen Registerkarte.

Bei dem Skripting handelt es sich um ABAP-Code einer lokalen Klasse der während der Laufzeit ausgeführt wird. Diese lokale Klasse erbt seine Methoden von der Klasse cl_tpda_script_class_super. Das eigentliche Coding für das Skripting erfolgt im einfachsten Fall innerhalb der Methode script. Initial wird diese Methode mit dem folgenden Coding geladen:
  METHOD script.

*** insert your script code here
  me->break( ).

  ENDMETHOD.                    "script 

​Wir wollen nun damit beginnen, dass wir ein bereits im System vorhandenes Skript laden und ausführen. Hierzu wählen wir im linken Teil des Bildschirms den Button Skript laden aus.

Anschließend öffnet sich ein PopUp auf dem der Übersichtsbutton auswählen.

Wir erhalten nun eine Übersicht mit im System hinterlegten Skripten. Als Beispiel wählen wir das Skript RSTPDA_SCRIPT_BP_SELECT_TAB aus. Dieses Skript öffnet nach dem Start ein PopUp-Fenster in dem wir die Datenbanktabellen angeben können, bei denen automatisch ein Breakpoint bei einem SELECT-Zugriff gesetzt werden soll.

Das folgende Coding wurde nun im Skripting-Fenster eingefügt und kann über den Button Skript starten ausgeführt werden.

*---------------------------------------------------------------------*
*       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 db TYPE  string.
    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_table
      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_db_tables_it TYPE         cl_tpda_script_scan_sql_sel=>ty_it_db_tables,
           l_dbtab        LIKE LINE OF l_db_tables_it,
           l_scan_object  TYPE REF TO  cl_tpda_script_scan_sql_sel,
           l_curr_dbtab   TYPE         string.
    TRY.

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

        l_db_tables_it = l_scan_object->db_tables( ).

        LOOP AT l_db_tables_it INTO l_dbtab.
          IF l_dbtab-dynamic = abap_true.
            l_curr_dbtab = cl_tpda_script_data_descr=>get_simple_value( p_var_name = l_dbtab-name  ).
          ELSE.
            l_curr_dbtab = l_dbtab-name.
          ENDIF.
          IF l_curr_dbtab in range_it.
            me->break( ).
          ENDIF.
        ENDLOOP.



      CATCH cx_sy_move_cast_error.
        MESSAGE s049(tpda_script).
        me->break( ).
      CATCH cx_tpda_script_scan_macro.
        MESSAGE s048(tpda_script).
        me->break( ).
      CATCH cx_tpda_script_scan.
        MESSAGE s049(tpda_script).
        me->break( ).
      CATCH cx_tpda_varname .
        MESSAGE s049(tpda_script).
        me->break( ).
      CATCH cx_tpda_script_no_simple_type .
        MESSAGE s049(tpda_script).
        me->break( ).
      CATCH cx_root.
        MESSAGE s049(tpda_script).
        me->break( ).
    ENDTRY.

  ENDMETHOD.                    "script
  METHOD end.
*** insert your code which shall be executed at the end of the scripting (before trace is saved)
*** here

  ENDMETHOD.                    "end
ENDCLASS.                    "lcl_debugger_script IMPLEMENTATION 

​Nach dem Start wird das folgende PopUp-Fenster geöffnet und die Datenbanktabelle kann eingetragen werden.

Anschließend erfolgt beim SELECT auf die Datenbanktabelle automatisch ein Breakpoint.

Bedingungen für Breakpoints und Watchpoints
Mylyn als Aufgabenmanagement für ABAP in Eclipse

Ähnliche Beiträge

Empfehlen Sie uns weiter