Работа с отладчиком 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).