К основному контенту

Трассировка

https://abap-blog.ru/

1. Начиная с SAP_ABA 702 в отладчике появился инструмент позволяющий быстро включать трассировку (SE30/ST05):
Добавляем инструмент:



 Ставим точку перед вызовом SQL (В моем случае получение хранимого объекта):



2. ABAP отладчик ограничивает использование точек наблюдения (whatchpoints) на field-symbols, однако можно обойти это ограничение путём использования точки прерывания на базе исходного кода. 
Рассмотрим пример кода:
Предположим Вы захотели остановится на итерации цикла когда значение переменной <lv_test> будет иметь значение «3». Переходим в отладке на вкладку точек прерываний и устанавливаем её следующим образом (тут следует обратить внимание что не во всех версиях SAP системы есть ограничение относительно заданного условия), при этом в качестве строки кода обозначаем либо строку начала цикла, либо строку внутри цикла:







6 способов найти место вызова сообщений

Задачу определения места в программе, из которого было вызвано сообщение, можно решить несколькими способами. Ниже будут рассмотрены основные из них.
В качестве простого примера рассмотрим вызов сообщения в SE38, при неправильно указанном имени программы:
 Перейдя в указанный класс сообщений (тр. SE91) можно воспользоваться командой на поиск мест, где используется указанное сообщение:


В результате список окажется довольно большим и нам надо будет прощелкать все программы в поисках нужного вызова:
 В случае, когда список маленький, можем поставить точки прерывания в каждом из вызовов, повторим некорректный ввод программы мы, скорее всего, попадём в нужное нам место.
Данный способ не совсем удобен и не дает 100% результата, т.к. сообщение может быть вызвано не из класса сообщений, а список использования его программами может быть очень большим.
Способ второй. Наиболее результативными способами будут способы, которые используют отладчик. С помощью точек наблюдений в отладчике, мы можем отследить состояние системных переменных: sy-msgid и sy-msgno. Переходим в отладку (/h):

Способ третий. Таким же способом, как и ранее, попадаем в отладку, далее переходим к выставлению точек прерывания и указываем ABAP команду MESSAGE:
msg
Либо добавляем её через меню:
msg_menu
В данном случае можно будет указать еще и тип вызываемого сообщения:
msgmenu
Способ четвертый. Найти вхождение вызова оператора MESSAGE, используя программы сканирования исходного текста. Первое что нужно сделать определится через статус системы где мы находимся и в какой программе нужно искать (По меню Система -> Статус):
status
Далее открываем программу сканирования исходного текста (через SE38) RPR_ABAP_SOURCE_SCAN (либо использовать транзакцию CODE_SCANNER) и заполняем искомые данные:
scan
Результат:
scanres
Способ пятый. С помощью транзакции SAT можно проанализировать вызовы всех ABAP операторов в программе. Первым делом нужно создать вариант, в котором не будут объединяться измерения:
sat
Далее запускаем транзакцию SE38 через SAT с нашим вариантом:
satvar
После трассировки смотрим иерархию вызовов и ищем оператор MESSAGE:
satsearch
Результат:
satrestult
Щелкнув два раза по позиции, мы перейдем в нужное нам место. Данный способ не является оптимальным, т.к. в больших программах файл трассировки будет очень большим и его анализ затянется.
Способ шестой. Использовать транзакцию ST05. Порядок действий следующий:
  • Открыть две сессии в одной запустить ST05, во второй SE38 с неверным названием программы
  • Активируем трассировку
  • Запускаем программу в SE38
  • Деактивируем трассировку
Зная, что таблица с наименованиями программы называется PROGDIR, мы можем перейти в то место кода программы, где вызывается считывание данной таблицы. Предполагаем, что вызов сообщения о несуществующей программе будет где-то «рядом»:
st05
Как видим на рисунке, наше предположение было верным:
st05result

Комментарии

Популярные сообщения из этого блога

ABAP кратко

/h - start debugging  /hs - system debugging  /ha - debugging - no screens  l_         - локальная переменная с единственным значением lt_        - локальная таблица ls_       - локальная структура lr_        - локальная переменная типа Range lv_        - локальная переменная lty_     - локальный тип t_           - локальный тип p_        - параметр so_      - selection option <ls_>  - field symbol на структуру (все остальное по аналогии) lcl_      - локальный класс lo_       - объект rg_       - range range это внутренняя таблица, которая состоит из 4 полей: sign, options, low и high. По сути range это аналог select-options и заполняется точно также: SIGN = 'I' (включить) или 'E' (исключить), OPTIONS содержит о...

ABAP

*пример простой программы с двумя строками текста: report abaptest . write 'Customerlist ' . *Программа должна начинаться с декларации REPORT *Второй оператор выводит на экран слова * комментарий в начале строки или " комментарий в любом месте строки write 'Customer list ' at 10 . *комманда write содержит необязательное дополнение, задающее позицию появления текста write : 'Custome rlist' , 'Booking' . *общая часть перед двоеточием, последовательные части отделяются запятыми *------------------------------------------------------- * * ПОЛЯ * *------------------------------------------------------- data : customer_name( 25 ) type с , vendor__name like customer_name. *data - определяется поле (переменная), like - наследование types t_name( 25 ) type с . data : customer_name type t_name, vendor_name type t_name. *Тип, определенный как t_name, назначается для полей vendor_name и customer_name,...