Комментарии по теме

«Ко­рре­кти­ро­вка таблиц базы данных с помощью ABAP»
Олег Точенюк:
Андрей а вам никто никогда не говорил, что обновлять таблицы базы данных SAP категорически запрещено, независимо от того чем обусловлены такие желания. Свои Z-таблицы, да сколько угодно, но......
«Тра­нза­кция SM02: сообщения в SAP системе»
Олег Башкатов:
С помощью ФМ TH_POPUP можно отправить сообщение конкретному пользователю :-)
«MVC или как писать отчеты быстро и просто»
Олег Точенюк:
>>"Самое главное - это расположить инклуды с моделью и представлением до инклуда с контроллером"   А может проще написать в начале что-то типа: CLASS: <имя> DEFINITION...

Использование скриптов в процессе отладки

6726
7

Введение

Script Debugging необходим, чтобы автоматизировать действия, производимые в отладчике вручную.

  • Изменять значения переменных
  • Создавать трассировки
  • Регулировать ход выполнения программы
  • Динамически создавать точки наблюдения и остановок

Скрипты используют интерфейс отладчика и запускаются на его стороне. Они не могу непосредственно изменять код программы, но могут повлиять на ход его выполнения. Окно скриптов в отладчике приведено на Рис.1.

Рис.1 Окно скриптов

Описание окна скриптов:

  1. Две вкладки:
    1. Script – инструмент для создания скриптов
    2. Trace files – список созданных трассировок
  2. Кнопки запуска скрипта или загрузки из репозитария
  3. Созданный скрипт можно сохранить как Z программу в репозитарии
  4. Настройка триггера запускающего скрипт
    1. Execute Directly – запуск скрипта напрямую
    2. After Debugger Events – после события отладчика
      1. Debugger single step – запуск скрипта при каждом шаге отладчика
      2. Breakpoint Reached – после отработки точки прерывания
      3. Watchpoint Reached – после отработки точки наблюдения
  5. Script Wizard – содержит шаблоны для работы скриптов
  6. Область редактирования скрипта

Список трассировок можно так же посмотреть отдельно в транзакции SAS, из нее можно редактировать и сохранять скрипты. Трассировки могут быть следующих видов:

  1. Statement Trace – записывает информацию о текущей строке исходного кода, которая обрабатывается в скрипте
  2. Trace of the Call Hierarchy – запись  иерархии вызовов
  3.  User Specific Trace – определенный пользователем вид.

Далее рассмотрим созданный локальный класс скрипта. Скрипт наследуется от глобального класса - CL_TPDA_SCRIPT_CLASS_SUPER. По умолчанию для него создаются следующие методы:

  • Prologue – техническая инициализация скрипта. Вызывается при запуске. В реализации супер класса данного метода происходит обновление информации об исходном коде программы.
  • Init – инициализация скрипта. Вызывается после метода prologue только один раз, Вы можете использовать его для инициализации внутренних данных либо для запроса у пользователя информации необходимой для скрипта.
  • Script – метод, вызывающийся при каждом срабатывании триггера, или прямом выполнении скрипта. В данный метод передается параметр p_trigger – обозначающий тип триггера, который его запустил. Метод содержит два исключения:
    • cx_tpda_stop_scripting_request – вызвав данное исключение вы прекратите срабатывание скрипта по данному триггеру,
    • cx_tpda_script_continue – продолжает выполнение работы скрипта. Для того чтобы позволить пользователю выбрать хочет он продолжать работу скрипта далее или нет используйте метод -  me->break( ).
  • End – конец выполнения скрипта. Срабатывает, когда пользователь останавливает работу скрипта, либо когда скрипт сам ее завершает.

Как запустить скрипт

  1. Чтобы запустить скрипт необходимо запустить отладчик:
    1. С помощью системной команды /h
    2. Поставить break-point до того места в коде, который скрипт должен проанализировать
  2. Выбрать закладку Script (Рис. 2)

Рис.2 Выбор закладки Script

  1. При необходимости дополнить кодом методы сгенерированного класса lcl_debugger_script, которые описаны в разделе  «Введение».
  2. Нажать кнопку запуска скрипта «Start Script»
  3. По завершению выполнения той части функционала, которую необходимо было проанализировать провалиться в отладку, чтобы отключить скрипт
  4. Отключить скрипт нажатием кнопки «Stop Script»

Примеры создания различных скриптов

Создание скрипта для остановки при вызове оператора

                Предположим, что необходимо создать скрипт для остановки в момент вызова оператора CALL FUNCTION

  1. Запускаем программу в режиме отладки
  2. Настраиваем триггер для запуска скрипта, только в момент вызова CALL FUNCTION (Рис.3)

Рис. 3 Настройка триггера для запуска скрипта

  1. В методе script пишем вызова метода:

me->break( ).

  1. Нажимаем кнопку запуска скрипта «Start Script»
  2. В момент остановки и после анализа кода, нажимаем кнопку «Continue Script»
  3. Когда анализ кода окончен нажимаем на кнопку «Exit Script»

Создание скрипта для изменения значения переменных

                Предположим, что у нас есть код программы, успешное выполнение которой возможно, только если её переменную 1000 раз изменить:

REPORT  z_test.

DATA: gv_rc TYPE flag.

DO 1000 TIMES.
  PERFORM get_rc USING gv_rc.
  IF gv_rc IS NOT INITIAL.
    MESSAGE 'Ошибка выполнения программы'(001) TYPE 'E'.
  ENDIF.
ENDDO.

MESSAGE 'Программа успешно выполнена'(002) TYPE 'S'.

*&---------------------------------------------------------------------*
*&      Form  test
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LV_RC      text
*----------------------------------------------------------------------*
FORM get_rc USING p_rc TYPE flag.
  p_rc = abap_true.
ENDFORM.                    "get_rc

Задача следующая:

  • Необходимо запустить скрипт в момент выполнения подпрограммы get_rc (п.2)
  • Выполнить подпрограмму, чтобы значение переменной gv_rc  изменилось (п.3)
  • Заменить значение переменной gv_rc на пустое (п.4)
  1. Запускаем программу в режиме отладки
  2. Настраиваем триггер для запуска скрипта, только в момент проваливания в подпрограмму GET_RC (Рис. 4)

Рис. 4 Настройка триггера для запуска скрипта

                Нажимаем кнопку “редактирование” breakpoint  и создаем точку прерывания, которая будет запускать скрипт (см. Рис.5)

Рис. 5 Создание точки прерывания

  1. Далее необходимо выполнить подпрограмму GET_RC с помощью кода скрипта

Для этого воспользуемся помощником формирования кода и добавим его в метод script (Рис. 6)

Рис. 6 Помощник формирования кода

Сгенерируется следующий код (имитация нажатия кнопки F7 в отладчике):

*************************************************
* debugger commands (p_command):
* Step into(F5)   -> CL_TPDA_SCRIPT_DEBUGGER_CTRL=>DEBUG_STEP_INTO
* Execute(F6)     -> CL_TPDA_SCRIPT_DEBUGGER_CTRL=>DEBUG_STEP_OVER
* Return(F7)      -> CL_TPDA_SCRIPT_DEBUGGER_CTRL=>DEBUG_STEP_OUT
* Continue(F8)    -> CL_TPDA_SCRIPT_DEBUGGER_CTRL=>DEBUG_CONTINUE
*************************************************

    TRY.
        CALL METHOD debugger_controller->debug_step
          EXPORTING
            p_command = cl_tpda_script_debugger_ctrl=>debug_step_out.
      CATCH cx_tpda_scr_rtctrl_status .
      CATCH cx_tpda_scr_rtctrl .
    ENDTRY.

  1. Необходимо заменить значение переменной gv_rc

Опять воспользуемся помощником формирования кода и добавим в метод script следующий код (Рис. 7)

Рис. 7 Добавление метода

Сгенерируется следующий код:

TRY.
CALL METHOD CL_TPDA_SCRIPT_DATA_DESCR=>CHANGE_VALUE
  EXPORTING
    P_NEW_VALUE = ''
    P_VARNAME   = 'gv_rc'.
 CATCH cx_tpda_varname .
 CATCH cx_tpda_scr_auth .
ENDTRY.
    

  1. Теперь можно запустить выполнение скрипта “Start Script”

Можно увидеть, что результат положительный, т.к. получено сообщение.

Создание скрипта для вывода журнала трассировки по операторам

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

  1. Запускаем программу в режиме отладки (Рис. 8)

Рис. 8 Запуск программы в режиме отладки

  1. Настраиваем триггер для запуска скрипта, на каждом шаге debugger`а (Рис. 9)

Рис. 9 Настройка триггера для запуска скрипта

  1. Заходим в скрипт, используя помощник формируем код для считывания названия Include (Рис. 10)

Рис. 10 Формирование кода для считывания названия Include

    DATA: lv_incl TYPE syrepid.

    TRY.
        CALL METHOD abap_source->include
          RECEIVING
            p_incl = lv_incl.
      CATCH cx_tpda_src_descr_invalidated .
      CATCH cx_tpda_src_info .
    ENDTRY.

  1. Далее необходимо убедиться, что мы находимся в Enhancement, т.е. посмотреть, что первый символ считаного в п.3 Include начинается на ‘Z’
  2. Если Include начинается на ‘Z’, то следует записывать трассировку в виде вызова операторов, т.е. с помощью помощника формирования кода вставить шаблон «Statement Trace (Current Source Code Position)» (Рис.11)

Рис. 11 Добавление шаблона

т.е. код:

CALL METHOD trace->add_src_info( ).

  1. Запускаем скрипт  «Start Script»
  2. Запускаем программу на выполнение (Рис. 12)

Рис. 12 Запуск программы

  1. После отработки программы с помощью системной команды «проваливаемся» в debugger, чтобы отключить скрипт и отследить трассировку (Рис.13)

Рис. 13 Отключение скрипта

Нажимаем закладку “Trace Files” и видим трассировку (аналог тр. SAS) (Рис.14)

Рис. 14 Трассировка

  1. И можем просмотреть содержимое трассировки, где будут только созданные Enhancements (Рис. 15)

Рис. 15 Просмотр трассировки

Создание скрипта для трассировки стека вызовов

                Предположим, что необходимо вывести иерархию вызовов программы, для этого необходимо:

  1. Запустить программу в режиме отладки
  2. Настроить триггер для запуска скрипта, только при смене стека вызовов (Рис. 16)

Рис. 16 Настройка тригера

  1. Записывать трассировку в виде иерархии, т.е. с помощью помощника формирования кода вставить шаблон «Trace of the call Hierarchy (Current Event)» Рис. 17

Рис. 18 Добавление шаблона

 т.е. код:

CALL METHOD TRACE->ADD_EVENT_INFO.

  1. Запустить скрипт нажатием на кнопку «Start Script»
  2. В необходимый момент завершить скрипт нажатием на кнопку «Stop Script»
  3. По окончанию в транзакции SAS появится файл трассировки, где можно просмотреть стек вызовов (Рис. 19)

Ограниченный доступ

Для прочтения полной версии статьи необходимо зайти как зарегистрированный пользователь.

Комментарии:

Олег Точенюк (Рейтинг: 10189) 23:24, 26 апреля 2013

Спасибо, отличная вещь для отладки...
00:14, 27 апреля 2013

Александр Дублин (Рейтинг: 13408)

Понял. Спасибо. Ставлю себе зачёт :-)
13:42, 27 апреля 2013

Павел Телепко (Рейтинг: 979)

Пожалуйста. Согласен с Вами, действительно отличный инструмент. Из личного опыта знаю, что многие разработчики еще не смотрели что это, надеюсь, что статья поможет в его освоении.
13:57, 27 апреля 2013

Олег Точенюк (Рейтинг: 10189)

Да многие вообще не знаю об этом :-) давно как-то накидал пример использования, но до ума те заметки так и не довел. А тут как бы все уже хорошо документировано, так что еще раз спасибо.

Ирина Сергиенко (Рейтинг: 124) 18:09, 04 июля 2013

Большое спасибо, Павл Александрович, за статью.
Для меня это было открытие!
Обязательно буду использовать скрипт при отладке

Олег Башкатов (Рейтинг: 7740) 03:21, 03 декабря 2013

А данный инструмент применим для тестовой системы (контроля качества/продуктива), то есть в таких в которых система закрыта для изменений?
 
При попытке использовать этот инструмент система мне выдала сообщение "Система неизменяема", хотя в другой тестовой системе - пустила в Script без проблем.
 
Может где-то что-то упустил...
Прошу подсказать.
12:34, 05 декабря 2013

Павел Телепко (Рейтинг: 979)

Скрипт это программа, которая переноситься с помощью запроса. Думаю, как минимум нужно иметь права на отладку и перенести запрос из системы разработки в целевую систему.

Любое воспроизведение запрещено.
Копирайт © «Издательство ООО «Эксперт РП»