Меню

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

|

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

Введение

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)

Рис. 19 Стек вызовов

  1. Файл трассировки можно сохранит в локальный файл:
    1. Выбрать инструменты
    2. Сохранить в локальный файл (Рис. 20)

Рис. 20 Сохранение в локальный файл

Добавление в журнал трассировок собственных данных

Также в журнал трассировок можно выводить собственные тексты, например, при необходимости определить с какими параметрами вызывались функциональные модули.

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

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

  1. Пишем в методе script следующую логику

  METHOD script.

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти

Обсуждения Количество комментариев7

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

Олег Точенюк

  |  26 апреля 2013, 23:24

Спасибо, отличная вещь для отладки...

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

Александр Дублин

  |  27 апреля 2013, 00:14

Спасибо, отличная вещь для отладки...

Понял. Спасибо. Ставлю себе зачёт :-)

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

Павел Телепко

  |  27 апреля 2013, 13:42

Спасибо, отличная вещь для отладки...

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

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

Олег Точенюк

  |  27 апреля 2013, 13:57

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

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

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

Ирина Сергиенко

  |  04 июля 2013, 18:09

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

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

Олег Башкатов

  |  03 декабря 2013, 03:21

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

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

Павел Телепко

  |  05 декабря 2013, 12:34

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

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