Перейти к основному содержанию
`Ctrl`+`K`

# Отладка приложений

## Логирование на сторону клиента

Логирование позволяет отслеживать процесс выполнения запросов, подстановку параметров, последовательность вызова операций, открытия форм.

Для просмотра логов:

1. Зайдите в инструмент разработчика
   В Google Chrome и Mozilla Firefox открывается по `Ctrl+Shift+i`.

2. Перейдите на закладку «Console».

Для изменения настроек логирования:

1. Нажмите на кнопку настроек (шестерёнка в правом верхнем углу)

   Примечание

   Отображение кнопки может быть выключено в настройках сервера.

Настройки логирования позволяют выбрать тип информации, отображаемой в логе(по умолчанию включены все):

- операции;

- 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

1. Запустите сервер приложения в режиме отладки.
   Для настройки запуска сервера приложений смотрите раздел «Настройка рабочего места» в данной документации.

2. Установите точку остановки в интересующем месте.

3. Откройте приложение в браузере.

4. Выберите необходимое приложение.

5. Выполните действие, которое вызовет отлаживаемый код.

### Запуск 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. Позволяет искать узкие места в сервере приложения.

#### Снятие снимка

1. Запустите jvisualvm.

2. Откройте процесс для мониторинга
   Для этого в окне «Application», сделайте двойной клик по нужному приложению.

3. Начните запись снимка
   Для этого на закладке «Sampler» в открытом процессе, нажмите кнопку «CPU».

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

5. Остановите запись снимка.

6. Перейдите к снимку для анализа
   Для этого на закладке «Sampler/CPU Sampler» нажмите кнопку «Snapshot».

Примечание

Профилирования идет по java функциям.

#### Получение полного списка функций для класса

Scala компилятор может генерировать служебные функции, которых не видно в исходном коде. Однако знание их имён может помочь в локализации узких мест.

Для получения соответствия анонимной функции и строчки кода в классе:

1. Запустите scala console:

   1. Откройте Run/Debug configuration
      Пункт «Edit configuration» в списке с лева от кнопки «запустить» в меню.

   2. Нажмите добавить конфигурацию.

   3. Выберете «scala console».

   4. Укажите модуль, для класса которого вы хотите посмотреть список служебных функций.

   5. Запустите консоль.

   6. Выполните команду `: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

Для анализа файла, рекомендуется использовать:

- Eclipse Memory Analyzer.

## Отладка в закрытых средах

### Отладка в Visual Studio Code

Редактор VSCode с установленными расширениями является более легковесным средством отладки java-приложений по сравнению с ItelliJ IDEA и более удобным по сравнению с JDB.

Расширение vscode-gtk-debug применяется в случае, когда необходимо отладить приложение на сервере заказчика, но нет возможности предоставить доступ к исходному коду на рабочем месте.

Внимание

Не рекомендуется использовать JVM-отладчик на боевой базе. По возможности желательно запустить копию экземпляра сервера и отлаживать именно её, так как отладчик может негативно повлиять на производительность серверного приложения.

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

#### Настройка рабочего места

1. Установите VSCode.

2. Установите расширение (Extension) для отладки
   Дистрибутив расширения размещён в подкаталоге, `plugins\vscode\ vscode-gtk-debug-x.x.x.vsix`.

3. Запустите VSCode.

4. На левой панели управления нажмите кнопку Extensions.

5. Нажмите кнопку с тремя точками в заголовке открывшейся панели
   В открывшемся меню выберите «Install from VSIX».

6. Найдите и выберите файл дистрибутива расширения `vscode-gtk-debug-x.x.x.vsix`.

7. В списке установленных расширений появится «Global for Postgres Debugger».

#### Настройка рабочего каталога

Для начала работы с VSCode необходимо открыть рабочий каталог.

1. Создайте пустой каталог в произвольном месте.

2. Перейдите в VSCode.

3. Откройте созданный каталог
   Выберете пункт меню `File > Open Folder...` и укажите созданный каталог.

4. Переключитесь на закладку отладки.
   Для этого нажмите кнопку Run and Debug в левой панели.

5. Создайте файл `launch.json`

   1. Кликните на ссылку «create a launch.json file».

   2. В открывшемся выпадающем списке выберите тип «Gtk»
      В результате, в каталоге будет создан `.\vscode\launch.json`, содержащий конфигурацию подключения к отлаживаемому серверу Global по умолчанию.

6. Измените значения параметров в соответствии с настройками вашего сервера приложений.

Параметры конфигурации для отладки:

- `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

1. Переключитесь в режим отладки нажатием кнопки «Run and Debug».

2. Запустите отладку.

В случае успешного подключения к отлаживаемому процессу появится панель с командами отладчика а так же строка состояния изменит цвет. Смотрите Документацию по отладке VSCode.

#### Получение текста прикладного класса

Для установки точки остановки «Breakpoint» необходимо открыть в редакторе декомпилированный текст отлаживаемого класса. Получение текста класса не зависит от подключения отладчика к процессу сервера. Главное, что бы в конфигурации отладки были корректно указаны параметры подключения.

1. Нажмите комбинацию клавиш `Shift+Ctrl+P`.

2. В открывшемся поле ввода наберите `Find Classes`.

3. Выберите найденную команду Find Classes….

4. В открывшемся поле ввода введите имя искомого класса и нажмите Enter
   Будет выполнен Rest-запрос к серверу приложений, для получения списка имён классов, содержащих введённое имя.

5. Выберите искомое имя класса из отображённого списка
   Если было найдено только одно имя, будет открыт декомпилированный текст класса без промежуточного выбора.

Декомпилированный текст класса содержит расширение `*.gdc` (Global Decompiled Class). Это виртуальный файл, который не сохраняется на диск. Он состоит из набора строк, на которые можно ставить точки сохранения. Каждая строка содержит имена методов, вызываемых на соответствующей строке исходного кода.

#### Задание точки остановки

Для установки точки, щёлкните мышкой слева от номера требуемой строчки.

В списке «BREAKPOINS» появится информация об установленной точке. Точки могут устанавливаться до или после подключения отладчика к процессу сервера.

#### Срабатывание точки остановки

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

#### Перемещение между классами

Если установить курсор на имя класса или вызываемого метода и нажать `F12` или `Ctrl + Click`, будет выполнена попытка перехода к файлу, где объявлен класс.

Если не удастся однозначно определить класс по имени, будет открыт диалог выбора.

#### Замена декомпилированного текста на исходный код

Скопируйте исходный код класса в буфер обмена и выполните вставку в соответствующий gdc-файл через контекстное меню .

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

Также в заголовке файла находятся кнопки которые переключают режимы подсветки синтаксиса для соответствующего языка.

### Отладка приложений в консоли jdb

Этот метод используется, если ошибка не повторяется в окружении с настроенной IDE и невозможна удалённая отладка.

Внимание

Штатный консольный отладчик не позволяет фильтровать поток для точки останова, так что полноценно работать на production сервере, с таким отладчиком нельзя.

Примеры приведены для операционной системы windows для Linux смотрите официальную документацию по jdb.

1. Убедитесь что процесс запущен с опциями позволяющими отладку:

       -agentlib:jdwp=transport=dt_shmem,address=jdbconn,server=y,suspend=n

2. Запустите jdb:

       ${jdk_home}\bin\jdb -attach jdbconn

3. Наберите `help`, для просмотра списка допустимых команд.

Смотрите так же документацию: `ru.bitec.app.gtk.debug.Jdb`

Список самых полезных команд:

- `stop` - установка точки остановки;

- `where` - просмотр стэка потока;

- `locals` - печатает переменные в текущем фрейме;

- `dump this` - печатает текущий класс;

- `next` - выполняет строчку кода;

- `cont` - продолжает выполнение.

## Отладка JEXL-скриптов

Чтобы открыть отладчик выполните операцию Включить режим отладки под операцией Выполнить.

### Структура отладчика

Отладчик JEXL-скриптов позволяет:

1. Устанавливать точки останова.

2. Вычислять значения выражений, используя текущие значение переменных.

3. Останавливать выполнение кода при выпадении ошибок.

#### Установка точек останова

Для установки точки останова нажмите на кружочек слева от номера строки. Через контекстное меню точки останова (правый клик) можно установить условие остановки или временно отключить ее.

Условие остановки задаётся выражением, результатом которого является boolean.

Примечание

Точка остановки игнорируется, если условие остановки выполнится с ошибкой или вернёт не boolean значение.

#### Запуск отладки

После установки точек остановки можно запустить отладку (операция «Выполнить»). Во время отладки доступные следующие операции:

- `Остановить отладку` - прерывает отладку.

- `Продолжить выполнение` - продолжает выполнение до следующей остановки (в результате достижения точки остановки или выпадении ошибки).

- `Поставить отладку на паузу` - в процессе выполнения скрипта в режиме отладки есть возможность приостановить его выполнение. Во время паузы можно выполнять выражения и выполнять «шаг вперёд».

- `Шаг вперёд` - продолжает выполнение скрипт на один шаг вперёд. Если встречается вызов функции (объявленной в этом же скрипте) заходит внутрь этой функции.

- `Выключить точки останова` - когда точки останова выключены, они не оказывают влияния на выполнение скрипта.

#### Вычисление значений выражений

Во время отладки скрипта (во время паузы или при достижения точки останова) можно ввести выражение и нажать кнопку «Выполнить». Результаты выражения выводятся в строке «результат выражения».

Примечание

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

#### Остановка исполнения кода при выпадении ошибок

Чтобы останавливать выполнение кода при возникновении ошибок, нужно установить галочку «Остановка при выпадении ошибок».

Если выбран класс ошибок «Все ошибки», выполнение прервётся при возникновении любой ошибки. Дополнительные классы ошибок можно указать в списке.

Примечание

В классе ошибок нужно указывать полное имя класса ошибки. Например: java.lang.ArithmeticException.