Бер программа чакырылган барлык ФМ-нарны җыер өчен мин 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>