Алексей Михнин
Отладчик в SAP ERP (S/4HANA) для блондинок

Введение

В начале немного скучной теории…

Аксиома: В программах и в данных бывают ошибки

Ошибки могут проявляться по-разному, в зависимости от того, предугадал и предусмотрел ли разработчик возможность появления ошибки в данном месте программы. Программа может аварийно завершиться («упасть в дамп»), может выдать сообщение об ошибке или лог ошибок. А может тихо и незаметно испортить Вам данные. Или наоборот – ничего не делать, хотя должна.

Как только Вы заметили проявление ошибки, необходимо выяснить и устранить ее причину. Иногда о причине ошибки говорит сообщение, которое выводится на экран. В этом случае ошибку можно исправить, изменив исходные данные или настройки. Но очень часто сообщения либо нет, либо оно не информативное. В этом случае необходимо найти место в программе (а иногда и саму программу), в котором возникает ошибка.

Если произошло аварийное завершение, то в транзакции ST22 мы можем увидеть наш «дамп», в котором есть информация, как о месте возникновения ошибки, так и о значениях переменных в момент ошибки. Иногда этой информации достаточно, чтобы понять, почему она произошла. Но зачастую этого мало – тогда нам на помощь приходит отладка.

Если у нас есть сообщение с классом и номером сообщения (обычно их можно найти в переменных SY-MSGID, SY-MSGNO), то в транзакции SE91 можно попробовать найти места в программах, где это сообщение выводится. Иногда можно перейти в это место посмотреть на код и понять, почему возникла ошибка. Но часто таких место очень много. Или они не найдены – такое возможно потому, что ошибки могут генерироваться разными способами с динамическим формированием номера сообщения. В этих случаях также нужна отладка. Наконец, отладка нужна в том случае, если место возникновения ошибки неочевидно или известно только приблизительно.

Что представляет собой отладка программы

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

Поэтому, помимо штатного режима работы на полной скорости, программы могут также работать в режиме отладки. Он отличается тем, что после выполнения каждого своего оператора, команды или функции программа приостанавливается и ждет дальнейших указаний от человека. В то время, пока программа остановлена, доступны для просмотра и анализа все переменные программы в текущей области видимости. И также возможен просмотр содержания таблиц в базе данных, стека вызовов (списка программных единиц, откуда мы попали в текущее место программы), состояния памяти и так далее. Более того, для переменных возможно изменение их значений (как правило, это недоступно на продуктивной системе или доступно, но не всем).

После анализа текущего состояния человек дает команду на выполнение следующей инструкции программы. Инструкция выполняется, и программа снова останавливается в ожидании дальнейших указаний. Таким образом можно выполнить всю программу. Этот процесс и называется ОТЛАДКОЙ.

Все операции по отладке осуществляются в специальной программе – отладчике. То есть отладчик – это программа для отладки других программ. На данный момент в SAP существуют два отладчика – новый и классический (старый). Они отличаются интерфейсом и возможностями. Об этом мы поговорим позже в соответствующем разделе.

Отладчик показывает исходный код программы и текущее место в нем, на котором программа остановлена. Текущее место отображается в отладчике стрелкой – желтой в новом отладчике и синей в старом. Также он позволяет управлять дальнейшим ходом выполнения программы и отображать всю информацию, указанную выше. В отладчике можно пройти по шагам всю программу, анализируя логику ее работы и сверяя ее с той, которая должна была бы быть. Плохая новость в том, что программы могут быть очень большими и проходить их по шагам, останавливаясь после каждого оператора, быстро надоест. Хорошая новость заключается в том, что уже придуманы способы обхода данной неприятности и встроены в отладчик.

Управление шагом отладки

Минимальным шагом отладки является один оператор языка программирования (в нашем случае это ABAP). Следует сразу отметить, что различные математические операции не относятся к операторам – это составляющие выражения. А вот знак =, например, это именно оператор – оператор присвоения значения выражения, стоящего справа от него, переменной слева от него. Ключевые слова для объявления переменных и типов также не относятся к операторам. Таким образом, если мы дадим с помощью отладчика команду выполнить минимальный шаг, программа выполнит текущий оператор, перейдет к следующему и остановится. При этом мы снова окажемся в отладчике. Если какие-либо данные были изменены во время шага, отладчик покажет нам их текущие значения. Большинство необходимых команд отладчика присвоены горячим клавишам – так выполнение отдельного шага назначено на клавишу F5. Кроме того, эту команду можно выполнить, выбрав соответствующий пункт меню Отладчик-Отдельный шаг (в старом отладчике Отладка-Управление-Отдельный шаг) или нажав кнопку

на панели инструментов.

Теперь представим ситуацию, что в процессе отладки мы остановились на операторе вызова подпрограммы, функции, метода или чего-то похожего (назовем это все «подпрограммой»). Если дать команду выполнить отдельный шаг, управление будет передано внутрь вызываемой подпрограммы и вам придется проходить ее всю также по шагам. Если Вы уверены что то, что происходит внутри подпрограммы не вызывает ошибки, которую вы ищете, или просто в данный момент Вам не интересно, то всю подпрограмму можно выполнить за 1 шаг. Для этого предназначена соответствующая команда «Выполнить», назначенная на клавишу F6. Эту команду можно давать и при выполнении обычных операторов, в этом случае ее действие совпадает с выполнением команды отдельного шага по F5. В меню она находится в том же подразделе, что и команда «Отдельный шаг», а кнопка для нее выглядит так .

Чтобы объяснить следующую команду отладки, стоит поговорить про стек вызовов. Стеком называется хранилище неких сущностей, из которого сущности могут быть извлечены в порядке обратном их помещению в стек. Если вы когда-нибудь слышали про LIFO – это и есть стек.

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

Для нас сейчас важно, что мы можем дать команду выполнить текущую подпрограмму до конца и выйти из нее. При этом программа остановится, и мы окажемся в отладчике на операторе, следующем за вызовом той подпрограммы, из которой мы вышли. Такая команда называется «Возврат» и назначена на клавишу F7 (и также присутствует в меню и панели инструментов). Очень полезно если вы случайно провалились в подпрограмму по F5, поняли, что хотели нажать F6 и Вам тут не интересно, и хотите вернуться. Кнопка для этой команды выглядит так .

Следующая команда «Дальше» сама простая – она запускает программу с текущего места в обычном режиме. Программа остановится только в точке прерывания, о типах которой поговорим ниже, либо отработает полностью и завершится. Команда назначена на клавишу F8. В классическом (старом) отладчике эта команда объединена со следующей. Кнопка выглядит следующим образом .

Команда «Выполнить до курсора» – запускает программу и заставляет ее остановиться в месте, на котором установлен курсор. Если курсор установлен не в текущей подпрограмме или выше текущей команды – поведение аналогично команде «Дальше». В новом отладчике команда назначена на сочетание клавиш Shift+F8. В классическом отладчике, эта команда объединена с предыдущей – при ее вызове, если в процессе выполнения программы будет достигнуто место, на котором установлен курсор, программа остановится, и вы окажетесь в отладчике. Иначе программа будет выполнена до конца или до точки прерывания.

Еще одна команда «Перейти к оператору» позволяет переходить на любой оператор текущей подпрограммы без выполнения команд между ним и текущим оператором, на котором остановлена программа. Эта команда позволяет, как переходить вперед, например, пропуская какие-либо проверки, так и возвращаться назад, повторяя отдельные части подпрограммы. Для перехода необходимо установить курсор в тексте программы на нужное место и дать эту команду. В новом отладчике она назначена на сочетание клавиш Shift+F12. В классическом отладчике вызывается только через меню.

В классическом отладчике есть еще одна команда «Выполнить PAI-/PBO-модуль». По этой команде возобновляется обычная работа программы как при команде «Дальше». Но как только начинает выполняться PAI или PBO логика экрана – программа вновь останавливается, и Вы попадаете в отладчик.

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

Точки прерывания

Точкой прерывания (breakpoint) называется место в программе, достигнув которого программа остановится и будет открыта в отладчике. Смысл существования точки прерывания заключается в ускорении процесса отладки. Например, если Вы знаете место, в котором возникает ошибка, но пока не понимаете почему, Вам нужно остановить выполнение программы и проанализировать данные, которые «придут» в это место. В этом случае вместо того, чтобы по шагам идти по всей программе до нужного кода, вы можете установить в нем точку прерывания и запустить программу в обычном режиме. Когда точка будет достигнута – программа остановится, и Вы окажетесь в отладчике.

Точки прерывания могут быть различных типов. Самой простой точкой является точка прерывания сеанса (Session BP). Такая точка устанавливается в редакторе кода с помощью пункта меню Утилиты-Точки прерывания-Установить/Удалить. При этом в строке с курсором слева появится соответствующая иконка – вот такая

,

которая как раз говорит, что в этой строке установлена точка прерывания. Кроме появления иконки, о наличии точки прерывания будет сигнализировать подсвеченная темно-красным строка. Также точку можно поставить, нажав комбинацию клавиш Ctrl+Shift+F12, нажав кнопку в панели инструментов или кликнув мышью на сером поле слева (там, где появилась иконка). Снять точку прерывания можно, выполнив те же действия, что и при ее установке. Установленные таким способом точки прерывания будут работать в течение всего сеанса работы пользователя, установившего точку, пока он не удалит ее. После выхода из системы (манданта) сеанс прерывается и точки теряются.

Разновидностью точки прерывания сеанса является точка прерывания отладчика (Debugger BP). Такую точку можно установить, только находясь непосредственно в отладчике. Точка устанавливается с помощью пункта меню Точки прерывания-Точка прерывания строк-Установить/Удалить или клавишей F9 (в старом отладчике – Точки прерывания-Установить/Удалить или комбинацией Shift+F4). Также можно кликнуть мышью на сером поле, а в новом отладчике – на кнопку в панели инструментов

.

При установке точки слева от строки появляется иконка

,

а в новом отладчике строка дополнительно подсвечивается зеленым. Удаляется точка аналогично тому, как устанавливается. Точки прерывания отладчика сохраняются только на время работы отладчика. После завершения работы программы и повторном ее запуске, точки данного типа будут отсутствовать. В остальном их поведение совпадает с поведением точки прерывания сеанса. Точки прерывания отладчика можно конвертировать в точки прерывания сеанса, нажав кнопку сохранить в панели инструментов.

В новом отладчике точку прерывания отладчика также можно сохранить как внешнюю точку прерывания (External BP), либо выбрав в меню пункт Точки прерывания-Save Debugger BPS as-External Bps, либо нажав кнопку Save as External BP на вкладке ТочкиПрерыв. Внешняя точка прерывания похожа на точку сеанса за тем исключением, что программу можно запустить в другом сеансе, а в отладку мы попадем в текущем. Такие точки, например, используется при отладке WebDynpro приложений. В этом случае приложение запускается в браузере, создавая таким образом еще один сеанс, но, если при этом перед запуском в текущем сеансе была установлена внешняя точка прерывания, то при достижении точки отладчик откроется в именно в текущем сеансе. Редактор кода в Web Dynpro автоматически в коде котроллеров вместо точек сеанса устанавливает внешние точки прерывания. Вручную внешнюю точку можно установить и снять с помощью пункта меню Утилиты-Внешние точки прерывания-Установить/удалить внешнюю точку прерывания, нажав соответствующую кнопку в панели инструментов

или комбинацию клавиш Ctrl+Shift+F9. Визуально внешняя точка прерывания отличается от точки сеанса иконкой – вот такой

.

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

Конец ознакомительного фрагмента.

Текст предоставлен ООО «Литрес».

Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.

Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.