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

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

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

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

  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.

В левой части расположена Иерархическая структура открытых выборок (включая выборки выпадающих списков). Со столбцами:

  • Системное имя отображения

  • Каноническое имя класса которому принадлежит выборка
    Для выборок без отображается имя без окончания «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

Определение списка загружаемых расширений (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

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

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

Отладка в 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
    Продолжает выполнение