pldebugger

Средство отладки plpgsql.
Связанные компоненты: plpgsql.
Схема размещения: ext.

Ограничения

Для корректной работы pldebugger необходимо наличие plpgsql - расширения по работе с plpgsql.

Использование модуля

В данном разделе будут рассмотрены введенные расширением типы данных, а также функции, предоставляемые им.
Типы, добавляемые расширением:
  • 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 можно получить по ссылке.
Предыдущий раздел
pg_visibility
Следующий раздел
plperl (plperlu)
Была ли страница полезной?