При отладке бывает нужно не просто поставить точку остановки в известной строке, а найти и остановиться ровно там, где в исходном коде встречается определённый текст — например имя поля, вызов метода или вызов асинхронных модулей, программ обновления и т.п.. Это особенно актуально при отладке стандарта. Например, когда нужно найти где заполняется конкретное поле.
Ниже представлен скрипт, который решает эту задачу: пользователь вводит паттерн исходного кода, скрипт проходит по исходникам, находит строки, содержащие этот паттерн, и автоматически ставит динамическую точку прерывания там, где это нужно.
Скрипит для отладчика
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
CLASS lcl_debugger_script DEFINITION INHERITING FROM cl_tpda_script_class_super. PUBLIC SECTION. METHODS prologue REDEFINITION. METHODS init REDEFINITION. METHODS script REDEFINITION. METHODS end REDEFINITION. PRIVATE SECTION. TYPES: BEGIN OF mts_include, name TYPE tpda_curr_source_pos-prg_info-include, source TYPE STANDARD TABLE OF string WITH EMPTY KEY, tokens TYPE TABLE OF stokesx WITH KEY row, statements TYPE TABLE OF sstmnt WITH KEY from, END OF mts_include. DATA mt_includes TYPE SORTED TABLE OF mts_include WITH UNIQUE KEY name. DATA mr_search TYPE dbstotexts. ENDCLASS. CLASS lcl_debugger_script IMPLEMENTATION. METHOD prologue. super->prologue( ). ENDMETHOD. METHOD init. CLEAR mt_includes. CLEAR mr_search. IF cl_ci_query_attributes=>generic( p_name = CONV #( sy-repid ) p_title = 'Enter code string' p_display = abap_false p_attributes = VALUE #( ( kind = 'S' text = 'Source code string' ref = REF #( mr_search ) ) ) ). CLEAR mr_search. ENDIF. ENDMETHOD. METHOD script. DATA l_source_info TYPE tpda_curr_source_pos. TRY. CALL METHOD cl_tpda_script_abapdescr=>get_abap_src_info IMPORTING p_prg_info = l_source_info-prg_info p_dynp_info = l_source_info-dynp_info. CATCH cx_tpda_src_info. CLEAR l_source_info. ENDTRY. CHECK l_source_info-prg_info-include IS NOT INITIAL. READ TABLE mt_includes ASSIGNING FIELD-SYMBOL(<ls_include>) WITH TABLE KEY name = l_source_info-prg_info-include. IF sy-subrc NE 0. INSERT VALUE #( name = l_source_info-prg_info-include ) INTO TABLE mt_includes ASSIGNING <ls_include>. READ REPORT <ls_include>-name INTO <ls_include>-source. SCAN ABAP-SOURCE <ls_include>-source TOKENS INTO <ls_include>-tokens STATEMENTS INTO <ls_include>-statements WITH ANALYSIS. ENDIF. READ TABLE <ls_include>-tokens ASSIGNING FIELD-SYMBOL(<ls_token_from>) WITH TABLE KEY row = l_source_info-prg_info-line. CHECK sy-subrc EQ 0. READ TABLE <ls_include>-statements ASSIGNING FIELD-SYMBOL(<ls_statement>) WITH TABLE KEY from = sy-tabix. CHECK sy-subrc EQ 0. READ TABLE <ls_include>-tokens ASSIGNING FIELD-SYMBOL(<ls_token_to>) INDEX <ls_statement>-to. CHECK sy-subrc EQ 0. DO <ls_token_to>-row - <ls_token_from>-row + 1 TIMES. READ TABLE <ls_include>-source ASSIGNING FIELD-SYMBOL(<lv_source>) INDEX <ls_token_from>-row + sy-index - 1. CHECK sy-subrc EQ 0. IF <lv_source> IN mr_search. me->break( ). EXIT. ENDIF. ENDDO. ENDMETHOD. METHOD end. ENDMETHOD. ENDCLASS. |
Пример работы
Допустим, мы отлаживаем тр. MB52 и хотим остановиться в ABAP коде на строке, содержащую код FLAG. Запускаем скрипт

Вводим шаблон кода для остановки

Когда исполняемый код будет содержать наш паттерн, точка остановится

Отладка продуктива
Если вы хотите вставить скрипт в продуктив, то скорее всего у вас не будет на это прав, т.к. базис отключает эту возможность из соображений безопасности. В таких случаях можно сохранить скрипт в БД и перенести его в нужную систему. Перенос осуществляется через обычный запрос.

Присоединиться к обсуждению...