Все мы знаем, что Apex предоставляет нам возможность дебажить наш код с помощью оператора System.debug и самого debug log, реже используется дебагеры Apex Replay Debugger, Apex Interactive Debugger и ISV Customer Debugger. Поскольку Apex Interactive Debugger и ISV Customer Debugger - это платные и специфические дебагеры, в этой статье мы поговорим об Apex Replay Debugger, что это, как с ним работать, в чем его особенности.
Apex Replay Debugger - это расширение, которое воспроизводит выполнение Apex кода из debug log и помогает дебажить ошибки в вашем коде. Не устанавливайте это расширение, если у вас уже установлен - Salesforce Extension Pack.
Replay Debugger имитирует сеанс отладки в режиме реального времени с использованием debug log, который является записью всех взаимодействий в транзакции. Т.е. Replay Debugger использует логи, созданные в результате транзакции, для имитации выполнения этой же транзакции.
Apex Replay Debugger бесплатный, и позволяет нам дебажить код, проверяя логи, используя Visual Studio Code в качестве клиента. Он, как и другие отладчики, дает возможность просматривать переменные, устанавливать breakpoints и наводить курсор на переменные, чтобы увидеть их текущее значение. Нам больше не понадобится вручную анализировать множество строк лога или добавлять в код операторы System.debug(), чтобы увидеть значения переменных или отслеживать путь выполнения кода.
Процесс дебага состоит из нескольких этапов:
- редактирование кода
- деплой кода в организацию
- воспроизведение сценария с ошибками
- загрузка полученного лога,
- запуск Apex Replay Debugger с этим логом
Теперь об этом всем по порядку на конкретном примере
Установка Apex Replay Debugger
Перед первым запуском Apex Replay Debugger убедитесь, что у вас создан конфигурационный JSON файл в вашем проекте - .vscode/launch.json
. Если его нет, то создайте.
- Откройте свой Salesforce DX проект в VS Code.
- Если ваш Salesforce DX проект не содержит JSON файл, путь к которому
.vscode/launch.json
, создайте файл (и, если необходимо, папку). - Откройте свой
.vscode/launch.json
файл. - Добавьте конфигурацию с именем
Launch Apex Replay Debugger
.
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Apex Replay Debugger",
"type": "apex-replay",
"request": "launch",
"logFile": "${command:AskForLogFileName}",
"stopOnEntry": true,
"trace": true
}
]
}
Или нажмите на боковой панели слева на кнопку “Play с Жуком” и выберите create a launch.json file
В появившемся списке выберите Apex Replay Debugger
И файл создастся автоматически
Пример кода для дебага
Возьмем простой пример кода для демонстрации возможностей Apex Replay Debugger.
Apex класс, в коде которого намеренно сделана ошибка. Её мы и постараемся найти и исправить.
И тестовый класс
Запустим, тестовый класс и убедимся, что ошибка действительно возникает
Дебаг кода
Перед стартом дебага, нужно установить Checkpoint. Для этого установите курсор на нужную строку кода
и вызовите команду из Command Palette - SFDX: Toggle Checkpoint.
В итоге вы должны увидеть индикатор Checkpoint напротив строки, которую вы выбирали.
Также он будет отображен на боковой панели Debug
После того как Checkpoint установлен, выполните команду SFDX: Update Checkpoints in Org или нажмите соответствующую кнопку в секции Checkpoints
Убеждаемся, что команда выполнена
Далее в Command Palette выполняем команду SFDX: Turn On Apex Debug Log for Replay Debugger. Эта команда создаст необходимый лог, с поддержкой воспроизведения на 30 мин. Время при желании можно изменить в Setup меню Debug Logs
После необходимо повторно запустить тест Apex для создания debug log с поддержкой воспроизведения.
Тест ожидаемо валится повторно, но теперь у нас есть необходимый лог с Checkpoint, который поможет нам найти и исправить ошибку.
Снова открываем Command Palette и выполняем команду SFDX: Get Apex Debug Logs….
После выбираем, связанный с последним запуском теста, сформированный лог из списка, это должен быть по времени последний созданный и вверху списка.
Через несколько секунд Visual Studio Code откроет загруженный debug log, или его можно будет найти в .sfdx/tools/debug/logs
.
На этом этапе мы должны запустить сгенерированный debug log. Также debug log мог быть сгенерирован и передан вам другим разработчиком из вашей команды. Он будет показывать корректную информацию при условии, что ваш проект содержит тот же исходный код, который сгенерировал debug log.
Щелкните правой кнопкой мыши любую строку в журнале отладки, затем выберите SFDX: Launch Apex Replay Debugger with Current File.
Через несколько секунд Visual Studio Code открывает панель Debug, где можно будет выполнять пошагово код.
Нажмите кнопку “Continue” на появившейся панели, чтобы перейти к первому Checkpoint.
Apex Replay Debugger останавливается на строке return newAcct;
где был установлен Checkpoint. На боковой панели отображаются текущие значения переменных в области видимости. Убеждаемся, что аргумент website, переданный методу createAccount, имеет ожидаемое значение “https://salesforce.in.ua/
”, поэтому код тестового класса передает правильное значение методу.
Теперь давайте развернем переменную newAcct, где видим, что значение Website не соответствует значению аргумента website, переданному методу.
Зная эту информацию, проверяем метод “createAccount”, и видим, что мы присваиваем не то значение, которое нужно, что и вызывало ошибку.
Нажмите кнопку «Стоп» на панели Debug Toolbar, чтобы завершить сеанс дебага.
Далее осталось только пофиксить метод, задеплоить изменения, перезапустить тест и убедится, что он проходит.
Такой способ дебага мне кажется очень удобным когда у нас есть цикл, это позволит в режиме онлайн видеть текущие значения в каждой итерации, что легче для восприятия в отличии от множества System.debug() в логе.
Некоторые особенности Apex Replay Debugger
- Вы можете использовать Replay Debugger только в своих организациях. Для дебага ISV Customers организаций используйте ISV Customer Debugger.
- Вы можете воспроизводить только один debug log за раз. Это ограничение может затруднить дебаг асинхронного Apex, который создает несколько debug logs.
- Помните о времени сессии после загрузки checkpoints, оно истекает после 30 минут
- Дебажьте свой код вскоре после запуска сеанса, потому что heap dumps истекают примерно через день после их создания.
- Вы не можете воспроизвести debug log, созданный scheduled Apex.
- Длинные String усекаются в breakpoints. Checkpoints String полные.
- Вы не можете расширить коллекцию (a list, set, or map), потому что ее элементы показаны в строковой форме.
- Изменение коллекции не приводит к обновлению переменной коллекции в разделе VARIABLES на Debug панели.
- Вы не можете установить условие для breakpoints.