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 можно получить по ссылке.