pldebugger
Средство отладки plpgsql.
Связанные компоненты: plpgsql.
Схема размещения:
ext
.В данном разделе будут рассмотрены введенные расширением типы данных, а также функции, предоставляемые им.
Типы, добавляемые расширением:
breakpoint
;frame
;proxyinfo
;targetinfo
;var
.
Функции расширения:
-
pldbg_abort_target
. Останавливает выполнение/отладку кода в сессии с переданным в аргументеPID
. Возвращаетtrue
илиfalse
в зависимости от успешности остановки.Входные аргументы: session integer.Тип возвращаемого значения: boolean. -
pldbg_attach_to_port
. Функция подключается к целевому объекту отладки, прослушивающему заданный порт. Клиент отладчика вызывает эту функцию в ответ на уведомлениеPLDBGBREAK
(уведомление содержит номер порта, к которому необходимо подключиться). Функция возвращает дескриптор сеанса, который идентифицирует конкретный сеанс отладки. При вызове любой из функций с префиксомpldbg_*
, нужно указать дескриптор сеанса, возвращаемый функциейpldbg_attach_to_port()
. Клиент отладчика может поддерживать несколько одновременных сеансов благодаря многократному вызовуpldbg_attach_to_port()
(с разными номерами портов) и отслеживанию возвращаемых дескрипторов сеанса.Входные аргументы: portnumber integer.Тип возвращаемого значения: integer. -
pldbg_continue
. Функция отправляет командуcontinue
целевому объекту отладчика, а затем ожидает, пока он достигнет следующего исполняемого оператора. На выходе возвращается запись типаbreakpoint
, характеризующая точку останова и содержащая идентификатор функции, а также номер строки, в которой целевой объект в данный момент остановлен.Входные аргументы: session integer.Тип возвращаемого значения: breakpoint. -
pldbg_create_listener
. Функция создает сеанс отладки. Возвращаетid
сессии сеанса отладки.Входные аргументы: отсутствуют.Тип возвращаемого значения: integer. -
pldbg_deposit_value
. Функция перезаписывает значение заданной переменной (идентифицируемой по имени и номеру строки). Аргументvalue
определяется как выражение, результатом которого должно быть значение с типом, аналогичным типу заданной переменной (или приводимым к нему типом).Входные аргументы: session integer, varname text, linenumber integer, value text.Тип возвращаемого значения: boolean. -
pldbg_drop_breakpoint
. Функция удаляет локальную точку останова в целевом процессе.Входные аргументы: session integer, func oid, linenumber integer.Тип возвращаемого значения: boolean. -
pldbg_get_breakpoints
. Функция возвращает набор точек останова. Каждая запись в результирующем наборе идентифицирует точку останова.Входные аргументы: session integer.Тип возвращаемого значения: setof breakpoint. -
pldbg_get_proxy_info
. Функция извлекает небольшую коллекцию параметров с сервера, которые связаны с версией сервера и версией протокола API, реализованного расширением для взаимодействия с ним внешних графических инструментов (например, pgAdmin). Функция может быть вызвана (из клиентского процесса отладчика), чтобы узнать, с какой версией прокси-API происходит взаимодействие - если этой функции не существует, можно предположить, что обмен данными осуществляется с прокси-API версии 1.Входные аргументы: отсутствуют.Тип возвращаемого значения: proxyinfo. -
pldbg_get_source
. Функция возвращает исходный код для заданной функции. Клиент отладчика всегда должен извлекать исходный код, вызывая данную функцию, вместо чтенияpg_proc
. Если вместо этого производится чтениеpg_proc
, то считываемый исходный код может не совпадать с исходным кодом, фактически выполняемым целевым объектом (поскольку исходный код мог быть изменен в другой транзакции).pldbg_get_source()
всегда извлекает исходный код из целевого объекта и гарантирует, что получаемый на выходе исходный код является исходным кодом, выполняемым целевым объектом.Входные аргументы: session integer, func oid.Тип возвращаемого значения: text. -
pldbg_get_stack
. Функция возвращает набор записей с фреймами. Каждая запись в результирующем наборе содержит информацию об одном фрейме стека. Каждая запись также содержит строку, которую можно использовать для отображения имени и значения каждого аргумента для конкретного вызова.Входные аргументы: session integer.Тип возвращаемого значения: setof frame. -
pldbg_get_target_info
. Устаревшая функция, которая возвращает информацию о целевой отлаживаемой функции. Используется для обратной совместимости старых версий pgAdmin. Для новых приложений получение информации из каталога происходит напрямую.Входные аргументы: signature text, targettype char.Тип возвращаемого значения: targetinfo. -
pldbg_get_variables
. Функция возвращает набор записейvar
. Записи в результирующем наборе содержат информацию об одной рассматриваемой локальной переменной (или параметре) во фрейме стека. Каждая запись содержит имя переменной, номер строки, в которой была объявлена переменная, а также флаг, сообщающий, является ли имя уникальным в пределах области действия функции. Если имя не является уникальным, клиент отладчика может использовать номер строки для различия переменных с одинаковыми именами. Помимо этого каждая запись содержит флаг, используемый для определения, является ли переменная константной; флаг, определяющий, является ли переменная нулевой, а также тип данных переменной (OID
соответствующегоpg_type
) с ее значением. Чтобы просмотреть переменные, определенные в другом фрейме стека, необходимо вызватьpldbg_select_frame()
для переключения внимания отладчика на конкретный фрейм.Входные аргументы: session integer.Тип возвращаемого значения: setof var. -
pldbg_oid_debug
. Функция получает информацию о функции с переданнымOID
изpg_proc
и в случае, если функция найдена, информация о ней получена, а пользователь, запустивший ее является суперпользователем, устанавливается локальная точка останова в начале данной функции. В случае успеха возвращается0
, в противном случае - код ошибки.Входные аргументы: functionoid oid.Тип возвращаемого значения: integer. -
pldbg_select_frame
. Функция изменяет цель отладчика на указанный кадр (в стеке вызовов). При остановке отладчик переключается на наиболее глубоко вложенную функцию в стеке вызовов (так как это функция, которая выполняется в данный момент времени). Цель отладчика можно изменить на другие фреймы стека с целью получения исходного кода для этого фрейма, значения переменных в этом фрейме и точек останова в целевом объекте. Отладчик остается на выбранном кадре до тех пор, пока он не будет изменен пользователем или пока целевой объект не остановится на другой точке останова. Функция возвращает запись типаbreakpoint
, содержащую идентификатор функции и номер строки, на которой целевой объект в данный момент остановлен.Входные аргументы: session integer, frame integer.Тип возвращаемого значения: breakpoint. -
pldbg_set_breakpoint
. Функция регистрирует локальную точку останова в целевом процессе.Входные аргументы: session integer, func oid, linenumber integer.Тип возвращаемого значения: boolean. -
pldbg_set_global_breakpoint
. Функция регистрирует точку останова в глобальной структуре с точками останова. На вход принимаетid
сессии, в которой запущен отладчик,OID
функции, которую планируется отлаживать, номер строки функции, на которую устанавливается точка останова, а такжеPID
целевого процесса, в котором будет выполняться отлаживаемая функция.Входные аргументы: session integer, func oid, linenumber integer, targetpid integer.Тип возвращаемого значения: boolean. -
pldbg_step_into
. Функция отправляет командуstep/into
целевому объекту отладчика, а затем ожидает, пока целевой объект достигнет следующего исполняемого оператора, и возвращает запись типаbreakpoint
.Входные аргументы: session integer.Тип возвращаемого значения: breakpoint. -
pldbg_step_over
. Функция отправляет командуstep/over
целевому объекту отладчика, а затем ожидает, пока целевой объект достигнет следующего исполняемого оператора в текущей функции. Если целевой объект столкнется с точкой останова (например, в дочернем вызове) до перехода к следующей исполняемой строке, он остановится на точке останова. Функция возвращает запись типаbreakpoint
.Входные аргументы: session integer.Тип возвращаемого значения: breakpoint. -
pldbg_wait_for_breakpoint
. Функция ожидает, пока целевой объект отладки достигнет точки останова. Необходимо вызвать функцию сразу после того, какpldbg_attach_to_port()
вернет идентификатор сеанса. Функцияpldbg_wait_for_breakpoint()
почти идентична функциямpldbg_step_into()
,pldbg_step_over()
иpldbg_continue()
(все они ожидают целевого объекта), но эта функция не отправляет команду целевому объекту первой. В качестве возаращаемого значения - запись типаbreakpoint
.Входные аргументы: session integer.Тип возвращаемого значения: breakpoint. -
pldbg_wait_for_target
. Функция объявляет прокси-процесс активным отладчиком, ожидающим глобальных точек останова и возвращает дескриптор сеанса, который идентифицирует конкретный сеанс отладки. Когда вызывается любая из других функцийpldbg
, необходимо указать соответствующий дескриптор сеанса. Данный клиент отладчика может поддерживать несколько одновременных сеансов, вызываяpldbg_attach_to_port()
много раз (с разными номерами портов) и отслеживая возвращаемые дескрипторы сеанса.Входные аргументы: session integer.Тип возвращаемого значения: integer. -
plpgsql_oid_debug
. Обертка для функцииpldbg_oid_debug (functionoid oid)
, создана для обратной совместимости старых версий pgAdmin.Входные аргументы: functionoid oid.Тип возвращаемого значения: integer.
Отладчик состоит из трех частей:
-
клиент — среда, в которой вызываются функции api (консоль psql или некоторый графический интерфейс). Отображает исходный код, текущий фрейм стека, переменные и т.п., позволяя пользователю устанавливать точки останова и пошагово выполнять код. Клиент может находиться на другом узле, отличном от сервера базы данных (например, PgAdmin);
-
целевой сервер - серверная часть, которая запускает отлаживаемый код. Библиотека
plugin_debugger.so
должна быть загружена в целевой сервер; -
отладочный прокси - дополнительный серверный процесс, к которому подключен клиент. Функции API, методы
pl_dbg*
, а также библиотекиpldbgapi.so
, выполняются именно на нем.
Клиент должен подключиться к отладочному прокси, используя обычное соединение
libpq
. Когда сеанс отладки активен, прокси вызывает функции API библиотеки plugin_debugger.so
, которая в свою очередь подключается к целевому серверу на уровне ядра, прозрачным для клиента образом. Протокол между прокси и целевым сервером не видим для других пользователей. Методы pldbg_*
из библиотек API предоставляют доступный интерфейс к средствам отладки.Доступ к данным методам осуществляется при помощи SQL-функций, предоставляемых расширением и дополнительно никак не регулируется - все, кто могут аутентифицироваться в БД и имеют доступ к запуску данных функций, могут перехватить выполнение любой функции в любой сессии, зная ее
OID
. По этой причине использование данного расширения категорически не рекомендуется в промышленных средах.Дополнительную информацию по поставляемому модулю pldebugger можно получить по ссылке.