pldebugger. Средство отладки plpgsql
Версия: 1.1.
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: plpgsql.
Схема размещения:
ext
.
pldebugger
предоставляет API для выполнения функций с возможностью остановки в заданной точке, пошаговым выполнением, просмотром значений переменных.
Расширение интегрировано с инструментами pg_admin
и dbeaver
, которые предлагают графический интерфейс для разработки и отладки с использованием возможностей расширения. Функции API доступны напрямую из psql
, так как реализованы в виде стандартных SQL-функций.
Доработка
Не производилась.
Ограничения
Для корректной работы pldebugger
необходимо наличие plpgsql
- расширения по работе с plpgsql
.
Так как расширение позволяет перехватывать выполнение кода функций и процедур для отладки, а также видеть значения переменных и управлять процессами управления, его использование доступно только суперпользователю и не рекомендуется в промышленной среде.
Установка
- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo dnf install pangolin-pldebugger-{version_component}-{OS}.x86_64.rpm
sudo apt install pangolin-pldebugger-{version_component}_amd64.deb
sudo apt-get install pangolin-pldebugger-{version_component}-{OS}.x86_64.rpm
Пример заполненной команды:
cd distributive
sudo apt-get -y install pangolin-pldebugger-1.1-sberlinux9.x86_64.rpm
Расширение использует общую разделяемую память сервера, поэтому должно быть добавлено в shared_preload_libraries
:
shared_preload_libraries = 'plugin_debugger'
Для использования расширения на развернутой СУБД необходимо установить его в целевую БД:
CREATE EXTENSION pldebugger SCHEMA ext;
С помощью ключевого слова SCHEMA
можно задать целевую схему для расширения, если этого аргумента нет — расширение будет установлено в первую найденную схему из search_path
.
Настройка
В случае, если расширение используется совместно с расширением plpgsql_check, библиотека расширения должна быть указана первой при перечислении в shared_preload_libraries
:
shared_preload_libraries = 'plugin_debugger,plpgsql_check'
- ::: admonition Примечание
- class: note
- Поскольку расширение реализует API для отладки функций и процедур, для работы с ним нужно использовать внешние графические инструменты. В настоящее время работа с данным расширением реализована в
pgAdmin4
иDBeaver
(в редакции Enterprise). При необходимости возможно использование функций расширения непосредственно в сеансеpsql
. - ::
Архитектура отладчика PL/pgSQL
Отладчик PL/pgSQL реализован в виде трех взаимодействующих компонентов:
- Клиент — среда, в которой вызываются функции API. Обычно представляет собой графический интерфейс пользователя, который отображает исходный код, текущий стек вызовов, переменные и другие элементы, а также позволяет устанавливать точки останова и выполнять код пошагово. Клиент может работать на удаленной машине, отличной от той, где размещен сервер базы данных, например
PgAdmin
. - Целевой сервер — серверная часть, которая запускает отлаживаемый код. Для обеспечения возможности отладки в него должна быть загружена библиотека
plugin_debugger.so
. - Отладочный прокси — дополнительный серверный процесс, к которому подключает клиент. На нем выполняются функции API, методы
pl_dbg*
, а также библиотекиpldbgapi.so
.
Клиент устанавливает обычное соединение через драйвер (libpq
или jdbc
) с отладочным прокси, как если бы подключался к обычной базе данных. После установки соединения, прокси вызывает функции API библиотеки plugin_debugger.so
, которая в свою очередь подключается к целевому серверу на уровне ядра, прозрачным для клиента образом. Протокол между прокси и целевым сервером не видим для других пользователей. Методы pldbg_*
из библиотек API предоставляют доступный интерфейс к средствам отладки.
Доступ к данным методам осуществляется при помощи SQL-функций, предоставляемых расширением. Доступ к этим функциям не ограничивается какими-либо дополнительными механизмами контроля — любой пользователь, имеющий право аутентификации и вызова соответствующих SQL-функций, может перехватить выполнение функции в любом сеансе при наличии информации об ее OID
.
Ниже представлена схема взаимодействия компонентов отладчика:
debugger client *------ libpq --------* Proxy backend
(pgAdmin) *
|
pldebugger socket connection
|
*
application client *----- libpq -------* Target backend
Функции расширения
Функции pldebugger
Имя функции | Аргументы | Тип возвращаемого значения | Описание |
|
|
| Останавливает выполнение/отладку кода в сессии с переданным в аргументе |
|
|
| Функция подключается к целевому объекту отладки, прослушивающему заданный порт. Клиент отладчика вызывает эту функцию в ответ на уведомление |
|
|
| Функция отправляет команду |
| Отсутствуют |
| Функция создает сеанс отладки. Возвращает |
|
|
| Функция перезаписывает значение заданной переменной (идентифицируемой по имени и номеру строки). Аргумент |
|
|
| Функция удаляет локальную точку останова в целевом процессе |
|
|
| Функция возвращает набор точек останова. Каждая запись в результирующем наборе идентифицирует точку останова |
| Отсутствуют |
| Функция извлекает небольшую коллекцию параметров с сервера, которые связаны с версией сервера и версией протокола |
|
|
| Функция возвращает исходный код для заданной функции. Клиент отладчика всегда должен извлекать исходный код, вызывая данную функцию, вместо чтения |
|
|
| Функция возвращает набор записей, каждая из которых описывает один фрейм в стеке вызовов. В каждой записи содержится информация о соответствующем фреймворке, включая строковое представление, пригодное для отображения имени и значения каждого аргумента конкретного вызова. |
|
|
| Устаревшая функция, которая возвращает информацию о целевой отлаживаемой функции. Используется для обратной совместимости со старыми версиями |
|
|
| Функция возвращает набор записей |
|
|
| Функция получает информацию о функции с переданным |
|
|
| Функция изменяет цель отладчика на указанный кадр (в стеке вызовов). При остановке отладчик переключается на наиболее глубоко вложенную функцию в стеке вызовов (так как это функция, которая выполняется в данный момент времени). Цель отладчика можно изменить на другие фреймворки стека с целью получения исходного кода для этого фреймворка, значения переменных в этом фреймворке и точек останова в целевом объекте. Отладчик остается на выбранном кадре до тех пор, пока он не будет изменен пользователем или пока целевой объект не остановится на другой точке останова. Функция возвращает запись типа |
|
|
| Функция регистрирует локальную точку останова в целевом процессе |
|
|
| Функция регистрирует точку останова в глобальной структуре с точками останова. На вход принимает |
|
|
| Функция отправляет команду |
|
|
| Функция отправляет команду |
|
|
| Функция ожидает, пока целевой объект отладки достигнет точки останова. Необходимо вызвать функцию сразу после того, как Функция |
|
|
| Функция объявляет прокси-процесс активным отладчиком, ожидающим глобальных точек останова и возвращает дескриптор сеанса, который идентифицирует конкретный сеанс отладки. Когда вызывается любая из других функций |
|
|
| Оболочка функции |
Типы данных расширения
Типы, добавляемые расширением:
breakpoint
frame
proxyinfo
targetinfo
var
Управление
Решение не оказывает влияния на кластерную архитектуру СУБД Pangolin, включая потоковую и логическую репликацию, процессы резервного копирования, интеграцию с СРК, а также сохраняет полную обратную совместимость с текущей версией СУБД Pangolin.
Поскольку решение предоставляет возможность перехвата исполнения функций и доступа к полному стеку выполнения plpgsql
кода, необходимо обеспечить аудит вызовов функций из задействованных расширений.
Использование модуля
Отладка кода с помощью pgAdmin
-
Запустите
pgAdmin
, подключитесь к БД. -
В
pgAdmin
найдите в дереве объектов БД функциюget_count(text, int)
, в опциях, доступных через выпадающее менюDebugging
, установите режимSet breakpoint
.Результат — открылось окно отладчика, в другой сессии ожидается запуск целевой функции.
-
Откройте новую сессию
psql
и подключитесь к демонстрационной БД. -
В
psql
вызовите функцию:select * from get_count('pg_class', 2);.
Результат — сессия
psql
зависла на выполнении функции. -
Перейдите в окно отладки
pgAdmin
.Результат — в окне отладчика появился код функции, выделена строка, на которой в данный момент остановлено выполнение функции.
-
В отладчике осуществите
step into
.Результат — в окне отладчика выделена следующая строка, на которой остановилось выполнение функции.
-
Проверьте вкладки с отладочной информацией.
Результат — во вкладках с отладочной информацией отображается актуальная информация, включающая номер текущей строки, значения аргументов функции, значения локальных переменных функции и др.
-
В отладчике выберите строку с номером 10 и установите точку останова, нажав на область рядом с номером строки левой кнопкой мыши.
Результат — на выбранной строке появился символ точки останова рядом с номером строки.
-
В отладчике нажмите кнопку
continue
.Результат — выполнение функции продолжилось до точки останова.
-
В отладчике осуществите
step into
.Результат — в отладчике появился код вложенной функции и ее стек, курсор установлен на первой строке функции.
-
В отладчике нажмите кнопку
continue
.Результат — выполнился код вложенной функции, в отладчике появился код родительской функции, выполнение остановилось на следующей после вызова вложенной функции строке.
-
В отладчике осуществите
step over
.Результат — выполнился код вложенной функции без перехода в нее, выполнение остановилось на следующей строке.
-
В отладчике нажмите кнопку
stop
.Результат — выполнение функции прервалось, в консоли
psql
появилось сообщение о том, что выполнение функции остановлено администратором. -
Закройте вкладку отладчика, закройте
pgAdmin
, закройтеpsql
.
Отключение функциональности
Для отключения данной функциональности необходимо:
- Удалить расширение командой:
DROP EXTENSION pldebugger;
- Убрать библиотеку расширения
plugin_debugger
изshared_preload_libraries
. - Перезагрузить сервер СУБД:
pg_ctl restart
Ссылки на документацию разработчика
pldebugger: https://github.com/EnterpriseDB/pldebugger.