Работа с отладчиком PL/pgSQL

QHB поддерживает отладку хранимых процедур, написанных на языке PL/pgSQL. Поддержка отладки осуществляется благодаря реализованным в QHB внутренним функциям, представляющим интерфейс отладчика:

  • pldbg_abort_target: прекращение сеанса отладки;
  • pldbg_attach_to_port: присоединение к порту отладочного процесса;
  • pldbg_continue: продолжение выполнения кода после точки остановки;
  • pldbg_create_listener: получение идентификатора отладочного сеанса;
  • pldbg_deposit_value: перезапись значения заданной переменной;
  • pldbg_drop_breakpoint: уничтожение точек останова;
  • pldbg_get_breakpoints: получение списка точек останова;
  • pldbg_get_proxy_info: получение информации о процессе-прокси;
  • pldbg_get_source: получение текстового представления исходного кода отлаживаемой процедуры;
  • pldbg_get_stack: проверка стека вызовов;
  • pldbg_get_target_info: получение информации об отлаживаемой функции;
  • pldbg_get_variables: получение списка переменных и формальных параметров отлаживаемой функции;
  • pldbg_oid_debug: установка локальной точки останова в начале выбранной функции;
  • pldbg_select_frame: навигация по кадрам стека отлаживаемой функции;
  • pldbg_set_breakpoint: установка локальной точки останова;
  • pldbg_set_global_breakpoint: установка глобальной точки останова;
  • pldbg_step_into: сделать шаг отладки с заходом в вызываемые функции;
  • pldbg_step_over: сделать шаг отладки с переходом через функции;
  • pldbg_wait_for_breakpoint: ожидание того, что целевой сеанс отладки достигнет точки останова;
  • pldbg_wait_for_target: получение конкретного идентификатора сеанса отладки.

С их помощью сторонние клиентские приложения могут реализовать полноценный отладчик хранимых процедур.



Использование интерфейса отладчика

Покажем пробный сеанс отладки на основе двух сессий psql:

Создадим функцию для подсчета количества строк в таблице, имя которой передается параметром.

 CREATE FUNCTION get_count (tabname text) RETURNS bigint
  AS $$DECLARE
      cmd text;
      retval bigint;
  BEGIN
      cmd := 'SELECT COUNT(*) FROM '
             || quote_ident(tabname);

      EXECUTE cmd INTO retval;
      RETURN retval;
  END;
  $$ LANGUAGE plpgsql STABLE;

Получим идентификатор сеанса отладки и OID функции:

   select pldbg_create_listener() as sessionid,
           'get_count'::regproc::oid as funcoid \gset

Установим точку останова в начале функции (3-й параметр: -1) и ждем вызова функции из любого (4-й параметр: NULL) сеанса:

select * from pldbg_set_global_breakpoint(:sessionid, :funcoid, -1, NULL);

Переведем отладочный (текущий) сеанс в режим ожидания:

select * from pldbg_wait_for_target(:sessionid);


Запуск кода под отладчиком

Откроем второй сеанс и вызываем целевую функцию:

select get_count('pg_class');

Выполнение доходит до точки останова, и теперь второй сеанс переходит в режим ожидания команд отладчика.

Первый сеанс просыпается и переходит в режим управления отладкой.



Управление отладкой

В режиме управления можно:

  • проверить стек вызова (pldbg_get_stack);
  • перемещаться по функциям в стеке (pldbg_select_frame);
  • смотреть значения параметров и локальных переменных текущей функции в стеке (pldbg_get_variables);
  • изменить значения переменных (pldbg_deposit_value);
  • установить/удалить точки останова (pldbg_set_breakpoint/pldbg_drop_breakpoint);
  • продолжить выполнение до следующей точки (pldbg_continue);
  • выполнить пошаговую отладку:
    • с заходом внутрь функций (pldbg_step_into);
    • или выполняя строку целиком (pldbg_step_over);
  • прекратить сеанс отладки (pldbg_abort_target).