Отладка приложений#
Логирование на сторону клиента#
Логирование позволяет отслеживать процесс выполнения запросов, подстановку параметров, последовательность вызова операций, открытия форм.
Для просмотра логов:
Зайдите в инструмент разработчика
В Google Chrome и Mozilla Firefox открывается поCtrl+Shift+iПерейдите на закладку «Console»
Для изменения настроек логирования:
Нажмите на кнопку настроек
Кнопка с изображением шестеренки находится в правом верхнем углу экрана.Примечание
Отображение кнопки может быть выключено в настройках сервера.
Настройки логирования позволяют выбрать тип информации, отображаемой в логе(по умолчанию включены все):
Операции
SQL
Скрипт
Для логирования можно задать уровень (предполагается, что нижестоящие уровни выводят также данные по уровням, находящимся выше, за исключением OFF):
Наименование |
Описание |
|---|---|
TRACE |
|
DEBUG |
|
INFO |
|
WARN |
|
ERROR |
|
OFF |
Отключение логирования |
Клиентское окно отладчика#
Дерево выборок#
Окно отладчика вызывается при нажатии сочетания клавиш
Ctrl+Shift+Alt+d или Ctrl+Shift+Alt+w.
В левой части расположена иерархическая структура открытых выборок (включая выборки выпадающих списков) со столбцами:
Выборка - Имя, отражающее функциональную принадлежность выборки.
Отображение - Системное имя отображения.
Наименование - Наименование выборки.
Загрузчик активен - Признак того, что данный загрузчик классов является текущим (активным) для системы.
Транзакция ORM - Признак того, что начата транзакция с БД.
Внимание
Наличие не завершённой транзакции с БД является ошибочным состоянием. Т.к. может приводить к бесконечным блокировкам записей БД.
Есть изменения - Есть не сохранённые изменения данных.
В правой части отображаются закладки с данными по выбранной из левой части выборке:
Атрибуты
Параметры фильтра
Параметры выборки
Операции
Отладочный макрос
Выполнить запрос
Выполнить Jexl-скрипт
Отладочные переменные
Описание закладок#
Атрибуты#
На данной закладке отображаются данные по атрибутам из основного запроса выборки для того элемента, на котором находится фокус ввода. Данные не доступны для редактирования.
Атрибуты:
Системное имя - Системное имя атрибута
Наименование - Наименование атрибута
Тип данных
Значение - Значение атрибута
Только чтение - Признак того, что атрибут доступен только для чтения
Видимость - Флаг видимости атрибута
Порядковый №
Ширина
Параметры фильтра#
На данной закладке отображаются данные по параметрам фильтра, если фильтр доступен в выбранном отображении. Данные не доступны для редактирования.
Атрибуты:
Системное имя - Системное имя атрибута фильтра
Наименование - Наименование атрибута фильтра
Тип данных
Значение - Значение атрибута фильтра
Только чтение - Признак того, что атрибут фильтра доступен только для чтения
Видимость - Флаг видимости атрибута фильтра
Параметры выборки#
Закладка хранит список переменных, созданных в выборке, и параметров, переданных в выборку.
Системное имя - Системное имя параметра/переменной
Тип данных - Тип данных параметра/переменной
Значение - Значение параметра/переменной
Операции#
На данной закладке отображаются операции выборки (отображения), которые определены непосредственно в ней, либо унаследованы.
Системное имя - Системное имя операции
Наименование - Наименование операции
Активность - Флаг активности операции
Видимость на ТБ - Флаг видимости операции на панели инструментов
Клон - Признак того, что операция клонируемая
Порядковый № - Порядковый № операции на панели инструментов
№ иконки - Номер картинки из коллекции
Отладочный макрос#
На данной закладке можно выполнять следующие действия:
open
Открытие выборки, пример выражения:ru.bitec.app.bs.Bs_PrjVer#List
openModal
Открытие выборки в модальном окне в режиме просмотра, пример выражения:ru.bitec.app.bs.Bs_PrjVer#List
doLookUp
Открытие выборки в модальном окне в режиме выбора, пример выражения:ru.bitec.app.bs.Bs_PrjVer#List
call
Вызов библиотечной операции, пример выражения:ru.bitec.app.btk.Btk_GroupLib#editGroups
Для каждого действия можно задавать список параметров для передачи в выборку/библиотечный метод
Ctrl+F9 - горячая клавиша для запуск макроса.
Запуск осуществляется от выборки, на которой находится фокус ввода.
Выполнить запрос#
Данная закладка позволяет выполнить sql-запрос с использованием атрибутов выборки, на которой открыли дебагер.
Выполнить Jexl-скрипт#
Данная закладка позволяет выполнить jexl-скрипт, в контексте выборки, на которой открыли дебагер.
Отладочные переменные#
Список значений, содержащихся в карте ru.bitec.common.debug.Debug#vars. Глобальная (для сервера) потокобезопасная карта произвольных значений. Используется для целей отладки/тестирования различного нового функционала.
Отладка сервера в среде IDE#
Запустите сервер приложения в режиме отладки.
Для настройки запуска сервера приложений смотрите раздел «Настройка рабочего места» в данной документации.Установите точку остановки в интересующем месте.
Откройте приложение в браузере.
Выберите необходимое приложение.
Выполните действие, которое вызовет отлаживаемый код.
Запуск jexl скрипта#
Позволяет запускать на отладку автономную бизнес логику.
Запуск jexl скрипта доступен в приложении «Настройка системы»
в меню Сервисы > Библиотека JEXL
Определение причины SQL-вызова из EclipseLink#
Для определения причины SQL-вызова из EclipseLink, поставьте точку остановки в методе:
org.eclipse.persistence.queries.ObjectLevelReadQuery#executeInUnitOfWork:1219
Через стек вызова можно проследить, что является причиной вызова.
Определение списка загружаемых расширений (Xxx_YyExt)#
Для определения списка загружаемых расширений поставьте точку остановки в методе:
ru.bitec.app.gtk.eclipse.api.ExtensionPoint#onCreate : 26
Отслеживания изменения атрибута класса.#
Для того чтоб поймать изменение любого атрибута объекта в коде поставьте точку остановки в методе (сеттер атрибутов):
ru.bitec.app.gtk.eclipse.rdb.EntityAro#_set : 280
По желанию можно добавить на точку условия.
Пример: key == 635651L && propertyName.equals("bBaseMsrItem")
635651L- id объекта(Long)bBaseMsrItem- название атрибута
Мониторинг производительности#
Для мониторинга производительности:
jmc.exe
jvisualvm.exe
pg_stat_statements
Jmc#
Входит в поставку JDK, имеет ограничения для коммерческого использования. Удобна тем, что позволяет видеть снимки стека со строчками кода. Позволяет искать узкие места в сервере приложения.
Jvisualvm#
Входит в поставку JDK. Позволяет искать узкие места в сервере приложения.
Снятие снимка#
Запустите jvisualvm
Откройте процесс для мониторинга
Для этого в окне «Application», сделайте двойной клик по нужному приложению.Начните запись снимка
Для этого на закладке «Sampler» в открытом процессе, нажмите кнопку «CPU»При необходимости, в открытом процессе запустите задачу, которую вам нужно профилировать.
Остановите запись снимка
Перейдите к снимку для анализа
Для этого на закладке «Sampler/CPU Sampler» нажмите кнопку «Snapshot»
Примечание
Профилирования идет по java функциям.
Получение полного списка функций для класса#
Scala компилятор может генерировать служебные функции, которых не видно в исходном коде. Однако знание их имён может помочь в локализации узких мест.
Для получения соответствия анонимной функции и строчки кода в классе:
Запустите scala console
Откройте Run/Debug configuration
Пункт «Edit configuration» в списке с лева от кнопки «запустить» в менюНажмите добавить конфигурацию
Выберете «scala console»
Укажите модуль, для класса которого вы хотите посмотреть список служебных функций
Запустите консоль
Выполните команду
:javap –l ru.bitec.app.Модуль.Класс
JProfiler#
Jprofiler - это комплексный профилировщик Java. Интуитивный пользовательский интерфейс Jprofiler поможет устранить узкие места производительности, точно определить утечки памяти и понять проблемы многопоточности.
Дистрибутив: «ftp://ftp/pub/%23Distrib/IntelliJ%20IDEA/JProfiler/»
Установщик сам интегрируется с IntelliJ IDEA
pg_stat_statements#
Позволяет вести статистику запросов в базе.
Подробнее смотрите документацию postgresql
Мониторинг оперативной памяти#
Для мониторинга оперативной памяти в продакшене можно использовать
jcmd pid GC.heap_dump dumpFile
Для анализа файла, рекомендуется использовать:
Отладка в закрытых средах#
Отладка в Visual Studio Code#
Редактор VSCode с установленными расширениями является более легковесным средством отладки java-приложений по сравнению с ItelliJ IDEA и более удобным по сравнению с JDB.
Расширение vscode-gtk-debug применяется в случае, когда необходимо отладить приложение на сервере заказчика, но нет возможности предоставить доступ к исходному коду на рабочем месте.
Внимание
Не рекомендуется использовать JVM-отладчик на боевой базе. По возможности желательно запустить копию экземпляра сервера и отлаживать именно её, так как отладчик может негативно повлиять на производительность серверного приложения.
В случае необходимости отладки на боевом сервере обязательно задавайте в фильтрах поток отладки. В противном случае, возможно срабатывание точек прерывания в пользовательских сеансах, что внесёт путаницу в процесс отладки и приведёт к зависаниям на стороне пользователей.
Настройка рабочего места#
Установите VSCode
Установите расширение (Extension) для отладки
Дистрибутив расширения размещён в подкаталоге, «plugins\vscode
vscode-gtk-debug-x.x.x.vsix»Запустите VSCode
На левой панели управления нажмите кнопку Extensions
Нажмите кнопку с тремя точками в заголовке открывшейся панели
В открывшемся меню выберите «Install from VSIX»Найдите и выберите файл дистрибутива расширения
vscode-gtk-debug-x.x.x.vsixВ списке установленных расширений появится «Global for Postgres Debugger»
Настройка рабочего каталога#
Для начала работы с VSCode необходимо открыть рабочий каталог.
Создайте пустой каталог в произвольном месте.
Перейдите в VSCode
Откройте созданный каталог
Выберете пункт менюFile > Open Folder...и укажите созданный каталог.Переключитесь на закладку отладки.
Для этого нажмите кнопку «Run and Debug» в левой панелиСоздайте файл
launch.jsonКликните на ссылку «create a launch.json file».
В открывшемся выпадающем списке выберите тип «Gtk»
В результате, в каталоге будет создан.\vscode\launch.json, содержащий конфигурацию подключения к отлаживаемому серверу Global по умолчанию.
Измените значения параметров в соответствии с настройками вашего сервера приложений.
Параметры конфигурации для отладки:
hostname
Имя или IP отлаживаемого сервераport
Порт, открытый отлаживаемым сервером для подключения java-отладчика. Значение задаётся параметром при старте java-процесса сервера Global.java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n
threadPattern
RegExp-выражение фильтрует имена потоков, доступных для срабатывания точек остановки. По умолчанию доступны все потоки пользовательских сессий.Внимание
Из конфигурации подставляются экранированные слэши. Выражение должно выглядеть:
ESession_\\d*httpPort
Порт на котором запущен сервер Global. Обычно: 80 или 8080.httpUser,httpPassword
Имя пользователя и пароль, которые будут использоваться для авторизации Rest-запросов к серверу Global при получении декомпилированных текстов прикладных Java и Scala-классов.
Подключение отладчика к процессу сервера#
Для подключения java-отладчика, процесс сервера должен быть запущен с соответствующими параметрами:
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n
Переключитесь в режим отладки нажатием кнопки «Run and Debug»
Запустите отладку
В случае успешного подключения к отлаживаемому процессу появится панель с командами отладчика а так же строка состояния изменит цвет. Смотрите Документацию по отладке VSCode
Получение текста прикладного класса#
Для установки точки остановки «Breakpoint» необходимо открыть в редакторе декомпилированный текст отлаживаемого класса. Получение текста класса не зависит от подключения отладчика к процессу сервера. Главное, что бы в конфигурации отладки были корректно указаны параметры подключения.
Нажмите комбинацию клавиш
Shift+Ctrl+P.В открывшемся поле ввода наберите
Find ClassesВыберите найденную команду «Find Classes…»
В открывшемся поле ввода введите имя искомого класса и нажмите Enter
Буде выполнен Rest-запрос к серверу приложений, для получения списка имён классов, содержащих введённое имяВыберите искомое имя класса из отображённого списка
Если было найдено только одно имя, будет открыт декомпилированный текст класса без промежуточного выбора.
Декомпилированный текст класса содержит расширение *.gdc (Global Decompiled Class).
Это виртуальный файл, который не сохраняется на диск. Он состоит из набора строк, на которые можно ставить точки сохранения. Каждая строка содержит имена методов, вызываемых на соответствующей строке исходного кода.
Задание точки остановки#
Для установки точки, щёлкните мышкой слева от номера требуемой строчки.
В списке «BREAKPOINS» появится информация об установленной точке. Точки могут устанавливаться до или после подключения отладчика к процессу сервера.
Срабатывание точки остановки#
При срабатывании точки остановки в одном из потоков, имя которого соответствует паттерну, произойдёт его остановка. В соответствующих фреймах будут отображены стек вызова и значения локальных переменных. Кликами по стеку, можно перемещаться между файлами.
Перемещение между классами#
Если установить курсор на имя класса или вызываемого метода и нажать F12
или Ctrl + Click, будет выполнена попытка перехода к файлу, где
объявлен класс.
Если не удастся однозначно определить класс по имени, будет открыт диалог выбора.
Замена декомпилированного текста на исходный код#
Скопируйте исходный код класса в буфер обмена и выполните вставку в соответствующий gdc-файл через контекстное меню
После вставки исходного кода можно переключаться между исходным кодом и декомпилированным текстом кнопкой, расположенной в заголовке файла.
Также в заголовке файла находятся кнопки которые переключают режимы подсветки синтаксиса для соответствующего языка.
Отладка приложений в консоли jdb#
Этот метод используется, если ошибка не повторяется в окружении с настроенной IDE и невозможна удалённая отладка.
Внимание
Штатный консольный отладчик не позволяет фильтровать поток для точки останова, так что полноценно работать на production сервере, с таким отладчиком нельзя
Внимания примеры приведены для операционной системы windows для Linux смотрите официальную документацию по jdb.
Убедитесь что процесс запущен с опциями позволяющими отладку:
-agentlib:jdwp=transport=dt_shmem,address=jdbconn,server=y,suspend=n
Запустите jdb
${jdk_home}\bin\jdb -attach jdbconnНаберите help, для просмотра списка допустимых команд
Смотрите так документацию: ru.bitec.app.gtk.debug.Jdb
Список самых полезных команд
stop
Установка точки остановкиwhere
Просмотр стэка потокаlocals
Печатает переменые в текущем фреймеdump this
Печатает текущий классnext
Выполняет строчку кодаcont
Продолжает выполнение
Отладка jexl скриптов#
Чтобы открыть отладчик выполните операцию «Включить режим отладки» под операцией «Выполнить».

Структура отладчика#
Отладчик jexl скриптов позволяет:
Устанавливать точки останова
Вычислять значения выражений, используя текущие значение переменных
Останавливать выполнение кода при выпадении ошибок
Установка точек останова#
В окне с кодом можно ставить точки останова, нажимая на кружочек слева от номера строки.
Через контекстное меню точки останова (правый клик) можно установить условие остановки или временно отключить ее.

Условие остановки задаётся выражением, результатом которого является boolean.
Примечание
Точка остановки игнорируется, если условие остановки выполнится с ошибкой или вернёт не boolean значение.
Запуск отладки#
После установки точек остановки можно запустить отладку (операция «Выполнить»). Во время отладки доступные следующие операции:

Остановить отладкуПрерывает отладку.
Продолжить выполнениеПродолжает выполнение до следующей остановки (в результате достижения точки остановки или выпадении ошибки).
Поставить отладку на паузуВ процессе выполнения скрипта в режиме отладки есть возможность приостановить его выполнение. Во время паузы можно выполнять выражения и выполнять «шаг вперёд».
Шаг вперёдПродолжает выполнение скрипт на один шаг вперёд. Если встречается вызов функции (объявленной в этом же скрипте) заходит внутрь этой функции.
Выключить точки остановаКогда точки останова выключены, они не оказывают влияния на выполнение скрипта.
Вычисление значений выражений#
Во время отладки скрипта (во время паузы или при достижения точки останова) можно ввести выражение и нажать кнопку «Выполнить». Результаты выражения выводятся в строке «результат выражения».
Примечание
Так же в значении переменных выводится результат выполнения jexl скрипта или ошибка в соответствующей строчке

Остановка исполнения кода при выпадении ошибок#
Чтобы останавливать выполнение кода при возникновении ошибок, нужно установить галочку «Остановка при выпадении ошибок».
Если выбран класс ошибок «Все ошибки», выполнение прервётся при возникновении любой ошибки. Дополнительные классы ошибок можно указать в списке.
Примечание
В классе ошибок нужно указывать полное имя класса ошибки. Например: java.lang.ArithmeticException
