Debugger scripting

Бер программа чакырылган барлык ФМ-нарны җыер өчен мин Debugger scripting белән кулланам.

Программаның бөтен боерыклар беркетмәсен RSTPDA_SCRIPT_STATEMENT_TRACE сценарие белән язып була.

Drill down to debugging as usual, select the RSTPDA_SCRIPT_STATEMENT_TRACE
Check the box “Breakpoint reached” and create new one on “CALL FUNCTION” then start the script.

When everything will be done, /h into the command line, press F3 and then stop the script.

The transaction SAS can show the results:

*<SCRIPT:PERSISTENT>
REPORT rstpda_script_template.
 
*<SCRIPT:HEADER>
*<SCRIPTNAME>Z_RSTPDA_SCRIPT_REG_EXPRESSION</SCRIPTNAME>
*<SCRIPT_CLASS>LCL_DEBUGGER_SCRIPT</SCRIPT_CLASS>
*<SINGLE_STEP>X</SINGLE_STEP>
 
*</SCRIPT:HEADER>
 
*<SCRIPT:PRESETTINGS>
 
*</SCRIPT:PRESETTINGS>
 
*<SCRIPT:SCRIPT_CLASS>
*---------------------------------------------------------------------*
*       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: TEXT              TYPE STRING,
          IGNORE            TYPE STRING,
          INCLUDE_PATTERN   TYPE STRING,
          F_DELETE_COMMENTS TYPE FLAG,
          F_CONDENSE        TYPE FLAG,
          F_TO_UPPER_CASE   TYPE FLAG,
          F_ISREGEX         TYPE FLAG,
          F_TRACE           TYPE FLAG,
          F_BREAKPOINT      TYPE FLAG,
          T_SOURCE          TYPE ABAPTXT255_TAB,
          T_SOURCES         TYPE STANDARD TABLE OF ABAPTXT255_TAB,
          OLD_INCLUDE       TYPE SYREPID,
          R_OLD_INCLUDE     TYPE RSELOPTION.
 
    METHODS:
      READ_SENTENCE
        IMPORTING
          I_LINE           TYPE I
        RETURNING
          VALUE(E_LINESRC) TYPE STRING.
 
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
*--------------------------------------------------------------------*
* Asks user some parameters
*--------------------------------------------------------------------*
  METHOD INIT.
    DATA: LT_FIELDS TYPE STANDARD TABLE OF SVAL,
          LS_FIELDS LIKE LINE OF LT_FIELDS,
          L_RETURNCODE(1) TYPE C,
          L_POPUP_TITLE(30)     TYPE C.
 
*--------------------------------------------------------------------*
*   Parameters and title of popup
*--------------------------------------------------------------------*
    L_POPUP_TITLE = 'Introduce expression or regular expression'(001).
 
    CLEAR LS_FIELDS.
    LS_FIELDS-TABNAME     = 'LCTABLES'.
    LS_FIELDS-FIELDNAME   = 'INFO02'. "just a char 512 in a table
    LS_FIELDS-VALUE       = '^ *SELECT'.
    LS_FIELDS-FIELDTEXT  = 'Expression'(002).
    LS_FIELDS-NOVALUEHLP  = 'X'.
    APPEND LS_FIELDS TO LT_FIELDS.
 
    CLEAR LS_FIELDS.
    LS_FIELDS-TABNAME     = 'MEM_ALLOC'.
    LS_FIELDS-FIELDNAME   = 'RECORD'. "just a char 1024 in a table
    LS_FIELDS-VALUE       = ''.
    LS_FIELDS-FIELDTEXT  = 'Expression to ignore'(007).
    LS_FIELDS-NOVALUEHLP  = 'X'.
    APPEND LS_FIELDS TO LT_FIELDS.
 
    CLEAR LS_FIELDS.
    LS_FIELDS-TABNAME     = 'TRDIR'.
    LS_FIELDS-FIELDNAME   = 'NAME'. "
*   LS_FIELDS-VALUE       = '^Z.*'.                 
    LS_FIELDS-FIELDTEXT  = 'Include pattern'(008).
    LS_FIELDS-NOVALUEHLP  = 'X'.
    APPEND LS_FIELDS TO LT_FIELDS.
 
    CLEAR LS_FIELDS.
    LS_FIELDS-TABNAME     = 'LTAP'.
    LS_FIELDS-FIELDNAME   = 'ZRSTG'. "just a flag in a table
    LS_FIELDS-VALUE       = 'X'.
    LS_FIELDS-FIELDTEXT  = 'Is a Regex'(003).
    LS_FIELDS-NOVALUEHLP  = 'X'.
    APPEND LS_FIELDS TO LT_FIELDS.
 
    CLEAR LS_FIELDS.
    LS_FIELDS-TABNAME     = 'TC10'.
    LS_FIELDS-FIELDNAME   = 'TST01'. "just a flag in a table
    LS_FIELDS-VALUE       = 'X'.
    LS_FIELDS-FIELDTEXT  = 'Delete comments'(004).
    LS_FIELDS-NOVALUEHLP  = 'X'.
    APPEND LS_FIELDS TO LT_FIELDS.
 
    CLEAR LS_FIELDS.
    LS_FIELDS-TABNAME     = 'TC10'.
    LS_FIELDS-FIELDNAME   = 'TST02'. "just a flag in a table
    LS_FIELDS-VALUE       = 'X'.
    LS_FIELDS-FIELDTEXT  = 'Condense'(005).
    LS_FIELDS-NOVALUEHLP  = 'X'.
    APPEND LS_FIELDS TO LT_FIELDS.
 
    CLEAR LS_FIELDS.
    LS_FIELDS-TABNAME     = 'TC78'.
    LS_FIELDS-FIELDNAME   = 'FLG_EOSP'. "just a flag in a table
    LS_FIELDS-VALUE       = 'X'.
    LS_FIELDS-FIELDTEXT  = 'To upper case'(006).
    LS_FIELDS-NOVALUEHLP  = 'X'.
    APPEND LS_FIELDS TO LT_FIELDS.
 
 
    CLEAR LS_FIELDS.
    LS_FIELDS-TABNAME     = 'TC72'.
    LS_FIELDS-FIELDNAME   = 'FLG_EOSP'. "just a flag in a table
    LS_FIELDS-VALUE       = 'X'.
    LS_FIELDS-FIELDTEXT  = 'Breakpoint'(009).
    LS_FIELDS-NOVALUEHLP  = 'X'.
    APPEND LS_FIELDS TO LT_FIELDS.
 
 
    CLEAR LS_FIELDS.
    LS_FIELDS-TABNAME     = 'TC76'.
    LS_FIELDS-FIELDNAME   = 'FLG_EOSP'. "just a flag in a table
*    LS_FIELDS-VALUE       = 'X'.
    LS_FIELDS-FIELDTEXT  = 'Trace'(010).
    LS_FIELDS-NOVALUEHLP  = 'X'.
    APPEND LS_FIELDS TO LT_FIELDS.
 
 
    CALL FUNCTION 'POPUP_GET_VALUES'
         EXPORTING POPUP_TITLE    = L_POPUP_TITLE
         IMPORTING RETURNCODE     = L_RETURNCODE
         TABLES    FIELDS         = LT_FIELDS.
 
    IF L_RETURNCODE = 'A'.
*     Кулланучы эшен туктата
      CLEAR TEXT. "Should already be initial.
      RETURN. "Method
    ENDIF.
 
    LOOP AT LT_FIELDS ASSIGNING FIELD-SYMBOL(<FS_FIELD>).
      CASE  <FS_FIELD>-FIELDTEXT.
        WHEN 'Expression'(002).
          TEXT = <FS_FIELD>-VALUE.
        WHEN 'Is a Regex'(003).
          F_ISREGEX = <FS_FIELD>-VALUE.
        WHEN 'Delete comments'(004).
          F_DELETE_COMMENTS = <FS_FIELD>-VALUE.
        WHEN 'Condense'(005).
          F_CONDENSE = <FS_FIELD>-VALUE.
        WHEN 'To upper case'(006).
          F_TO_UPPER_CASE = <FS_FIELD>-VALUE.
        WHEN 'Expression to ignore'(007).
          IGNORE = <FS_FIELD>-VALUE.
        WHEN 'Include pattern'(008).
          INCLUDE_PATTERN = <FS_FIELD>-VALUE.
        WHEN 'Breakpoint'(009).
          F_BREAKPOINT = <FS_FIELD>-VALUE.
        WHEN 'Trace'(010).
          F_TRACE = <FS_FIELD>-VALUE.
      ENDCASE.
    ENDLOOP.
 
 
  ENDMETHOD.                    "init
 
*--------------------------------------------------------------------*
* Check if the current sentence has the required expression (excluding
* the desired expression to ignore).
* If found a hit: break execution (dynamic breakpoint) and write trace
*--------------------------------------------------------------------*
  METHOD SCRIPT.
    DATA: L_NEW_INCLUDE TYPE SYREPID,
          L_LINE TYPE I,
          L_LINESRC LIKE LINE OF T_SOURCE,
          LS_NEW_INCLUDE LIKE LINE OF R_OLD_INCLUDE.
 
    CHECK TEXT IS NOT INITIAL.
 
    TRY.
*--------------------------------------------------------------------*
*       Obtain/read include (with some buffering magic) -> T_SOURCE
*--------------------------------------------------------------------*
        L_NEW_INCLUDE     = ABAP_SOURCE->INCLUDE( ).
 
*       Filter includes
*       ---------------
        IF INCLUDE_PATTERN IS NOT INITIAL.
          FIND REGEX INCLUDE_PATTERN IN L_NEW_INCLUDE.
          IF SY-SUBRC <> 0.
            EXIT. "method
          ENDIF.
        ENDIF.
 
        IF L_NEW_INCLUDE = OLD_INCLUDE.
          ."Do nothing: T_SOURCES already has the source.
        ELSEIF R_OLD_INCLUDE IS INITIAL OR L_NEW_INCLUDE NOT IN R_OLD_INCLUDE. "we need to read the source again.
          CLEAR T_SOURCE[].
          READ REPORT L_NEW_INCLUDE INTO T_SOURCE.
          OLD_INCLUDE = L_NEW_INCLUDE.
          IF T_SOURCE[] IS NOT INITIAL.
            LS_NEW_INCLUDE-OPTION = 'EQ'.
            LS_NEW_INCLUDE-SIGN = 'I'.
            LS_NEW_INCLUDE-LOW = L_NEW_INCLUDE.
            APPEND LS_NEW_INCLUDE TO R_OLD_INCLUDE.
            IF F_DELETE_COMMENTS = ABAP_TRUE.
*             Delete comments
              REPLACE ALL OCCURRENCES OF REGEX '(^\*| *").*' IN TABLE T_SOURCE WITH ''.
            ENDIF.
            APPEND T_SOURCE TO T_SOURCES.
 
          ENDIF.
        ELSE.
          READ TABLE R_OLD_INCLUDE WITH KEY LOW = L_NEW_INCLUDE TRANSPORTING NO FIELDS.
          IF SY-SUBRC EQ 0.
            READ TABLE T_SOURCES INDEX SY-TABIX INTO T_SOURCE.
            OLD_INCLUDE = L_NEW_INCLUDE.
          ENDIF.
        ENDIF.
 
*--------------------------------------------------------------------*
*       Read and check line
*--------------------------------------------------------------------*
        IF T_SOURCE[] IS NOT INITIAL.
          L_LINE    = ABAP_SOURCE->LINE( ).
          L_LINESRC = READ_SENTENCE( L_LINE ).
          IF L_LINESRC IS NOT INITIAL.
            IF F_ISREGEX <> ABAP_TRUE.
              IF L_LINESRC CS TEXT.
                MESSAGE S000(ZSD) WITH L_LINESRC 'contains' TEXT.
*               Check if the sentence should be ignored
*               ---------------------------------------
                IF IGNORE IS NOT INITIAL.
                  IF L_LINESRC CS IGNORE.
                    EXIT. "method
                  ENDIF.
                ENDIF.
*               Break and trace
*               ---------------
                IF F_TRACE = ABAP_TRUE.
                  CALL METHOD TRACE->ADD_SRC_INFO. "Add trace to transaction SAS.
                ENDIF.
                IF F_BREAKPOINT = ABAP_TRUE.
                  ME->BREAK( ).
                ENDIF.
              ENDIF.
            ELSE.
              FIND REGEX TEXT IN L_LINESRC.
              IF SY-SUBRC = 0.
*               Check if the sentence should be ignored
*               ---------------------------------------
                IF IGNORE IS NOT INITIAL.
                  FIND REGEX IGNORE IN L_LINESRC.
                  IF SY-SUBRC EQ 0.
                    EXIT. "method
                  ENDIF.
                ENDIF.
 
*               Break and trace
*               ---------------
                MESSAGE S000(ZSD) WITH L_LINESRC 'contains reg. expr.' TEXT.
                IF F_TRACE = ABAP_TRUE.
                  CALL METHOD TRACE->ADD_SRC_INFO. "Add trace to transaction SAS.
                ENDIF.
                IF F_BREAKPOINT = ABAP_TRUE.
                  ME->BREAK( ).
                ENDIF.
              ENDIF.
            ENDIF.
          ENDIF.
 
        ENDIF.
 
      CATCH CX_SY_READ_SRC_LINE_TOO_LONG.
        . " Do nothing.
      CATCH CX_ROOT  .
        . " Do nothing.
    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
 
*--------------------------------------------------------------------*
* METHOD READ_SENTENCE:
* Reads whole sentence as long as it is not larger than 5000 lines.
* To do so... keeps reading lines until it finds a point that is not in a comment.
*--------------------------------------------------------------------*
  METHOD READ_SENTENCE.
    DATA L_LINESRC LIKE LINE OF T_SOURCE.
    DATA L_LINE TYPE I.
 
    L_LINE = I_LINE.
 
    CLEAR E_LINESRC.
    CHECK T_SOURCE[] IS NOT INITIAL.
 
    READ TABLE T_SOURCE INTO L_LINESRC INDEX L_LINE.
    IF SY-SUBRC EQ 0.
      DO 5000 TIMES. "max 5000 lines per sentence
        CONCATENATE E_LINESRC L_LINESRC INTO E_LINESRC SEPARATED BY SPACE.
        IF F_CONDENSE = ABAP_TRUE.
          CONDENSE E_LINESRC.
        ENDIF.
        IF F_TO_UPPER_CASE = ABAP_TRUE.
          TRANSLATE E_LINESRC TO UPPER CASE.
        ENDIF.
 
*       Check if has a ".".
        FIND '.' IN L_LINESRC-LINE.
        IF SY-SUBRC EQ 0.
          EXIT. "FROM DO LOOP.
        ENDIF.
 
        ADD 1 TO L_LINE.
        READ TABLE T_SOURCE INTO L_LINESRC INDEX L_LINE.
        IF SY-SUBRC <> 0. "If end of code
          EXIT. "FROM DO LOOP.
        ENDIF.
      ENDDO.
    ENDIF.
  ENDMETHOD.
ENDCLASS.                    "lcl_debugger_script IMPLEMENTATION
*</SCRIPT:SCRIPT_CLASS>
 
*</SCRIPT:PERSISTENT>

Җавап калдыру



All fields are required. Your email address will not be published.

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert