# Отладка приложений ## Логирование на сторону клиента Логирование позволяет отслеживать процесс выполнения запросов и подстановку параметров, последовательность вызова операций и открытия форм. Для просмотра логов: 1. Зайдите в инструмент разработчика \ В Google Chrome и Mozilla Firefox открывается по `Ctrl+Shift+i` 2. Перейдите на закладку "Console" Для изменения настроек логирования: 1. Нажмите на кнопку настроек \ Кнопка с изображением шестеренки находится в правом верхнем углу экрана. ~~~{note} Отображение кнопки может быть выключено в настройках сервера. ~~~ Настройки логирования позволяют выбрать тип информации, отображаемой в логе(по умолчанию включены все): - Операции - SQL - Скрипт Для логирования можно задать уровень (предполагается, что нижестоящие уровни выводят также данные по уровням, находящимся выше, за исключением OFF): | Наименование | Описание | |-|-| | TRACE || | DEBUG || | INFO || | WARN || | ERROR || | OFF | Отключение логирования | ## Клиентское окно отладчика ### Дерево выборок Окно отладчика вызывается при нажатии сочетания клавиш `Ctrl+Shift+Alt+d `или `Ctrl+Shift+Alt+w`. В левой части расположена Иерархическая структура открытых выборок (включая выборки выпадающих списков). Со столбцами: - Системное имя отображения - Каноническое имя класса которому принадлежит выборка \ Для выборок без отображается имя без окончания "Avi" В правой части отображаются закладки с данными по выбранной в левой части выборке: - Атрибуты - Параметры фильтра - Параметры выборки - Операции - Отладочный макрос ### Описание закладок #### Атрибуты На данной закладке отображаются данные по атрибутам из основного запроса выборки для того элемента, на котором находится фокус ввода. Данные не доступны для редактирования. Атрибуты: - *Системное имя* \ Системное имя атрибута - *Значение* \ Значение атрибута - *Только чтение* \ Признак того, что атрибут доступен только для чтения - *Видимость* \ Флаг видимости атрибута - *Порядковый №* - *Ширина* - *Тип данных* - *Наименование* \ Наименование атрибута #### Параметры фильтра На данной закладке отображаются данные по параметрам фильтра, если фильтр доступен в выбранном отображении. Данные не доступны для редактирования. Атрибуты: - *Системное имя* \ Системное имя атрибута фильтра - *Значение* \ Значение атрибута фильтра - *Только чтение* \ Признак того, что атрибут фильтра доступен только для чтения - *Видимость* \ Флаг видимости атрибута фильтра - *Тип данных* - *Наименование* \ Наименование атрибута фильтра #### Параметры выборки Закладка хранит список переменных, созданных в выборке, и параметров, переданных в выборку. - *Системное имя* \ Системное имя параметра/переменной - *Значение* \ Значение параметра/переменной - *Тип данных* \ Тип данных параметра/переменной #### Операции На данной закладке отображаются операции выборки (отображения), которые определены непосредственно в ней, либо унаследованы. - *Системное имя* \ Системное имя операции - *Активность* \ Флаг активности операции - *Видимость на ТБ* \ Флаг видимости операции на панели инструментов - *Порядковый №* \ Порядковый № операции на панели инструментов - *№ иконки* \ Номер картинки из коллекции - *Наименование* \ Наименование операции #### Отладочный макрос На данной закладке можно выполнять следующие действия: - `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` - горячая клавиша для запуск макроса. Запуск осуществляется от выборки, на которой находится фокус ввода. ## Отладка сервера в среде 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" ```{note} Профилирования идет по 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](https://www.postgresql.org/docs/9.6/pgstatstatements.html) ## Мониторинг оперативной памяти Для мониторинга оперативной памяти в продакшене можно использовать ``` jcmd pid GC.heap_dump dumpFile ``` Для анализа файла, рекомендуется использовать: - [Eclipse Memory Analyzer](https://www.eclipse.org/mat/) ## Отладка в закрытых средах ### Отладка в Visual Studio Code Редактор VSCode с установленными расширениями является более легковесным средством отладки java-приложений по сравнению с ItelliJ IDEA и более удобным по сравнению с JDB. Расширение vscode-gtk-debug применяется, в случае необходимости отладить приложение на сервере заказчика и при невозможности предоставить доступ к исходным кодам на рабочем месте. ~~~{attention} Не рекомендуется применять jvm отладчик на боевой базе, если есть такая возможность желательно запустить копию экземпляра сервера и отлаживать уже его. Отладчик может оказать негативное влияние на производительность сервера приложения. В случае необходимости отлаживаться на боевом сервере обязательно задавайте в фильтрах поток отладки, в противном случае, возможно срабатывание точек прерывания в пользовательских сеансах, что внесет путаницу в отладку и приведет к зависаниям на стороне пользователей. ~~~ #### Настройка рабочего места 1. Установите [VSCode](https://code.visualstudio.com/) 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-выражение фильтрующее имена потоков, доступных для срабатывания точек останова. По умолчанию, доступны все потоки пользовательских сессий. ```{attention} Из конфигурации подставляются экранированные слэши. Выражение должно выглядеть: `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](https://code.visualstudio.com/docs/editor/debugging) #### Получение текста прикладного класса Для установки точки остановки «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 и невозможна удаленная отладка. ```{attention} Штатный консольный отладчик не позволяет фильтровать поток для точки останова, так что полноценно работать на 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` \ Продолжает выполнение