Опубликован: 16.04.2007 | Уровень: специалист | Доступ: платный
Лекция 13:

Расширение возможностей

< Лекция 12 || Лекция 13: 123
Аннотация: В этой лекции рассматриваются способы расширения функциональных возможностей сервера MySQL. Сюда входит написание собственных функций и процедур, а также создание наборов символов. Описываются также средства отладки, имеющиеся в MySQL.

Библиотека функций отладки

В MySQL входит библиотека функций отладки, первоначально созданная Фредом Фишем (Fred Fish). Чтобы разрешить ее использование, нужно на этапе компиляции программы вызвать сценарий configure с опцией –with_debug. Если в распоряжении имеется бинарный дистрибутив, проверьте версию какого либо исполняемого файла. Программы, скомпилированные с поддержкой отладки, имеют суффикс –debug. Библиотека функций отладки является частью библиотеки mysqlclient. Макросы библиотеки объявлены в файле dbug.h.

Названия всех макросов начинаются с префикса DBUG_ (табл. 13.1). Если нужно отключить отладку, определите макроконстанту DBUG_OFF. При ее наличии все остальные макросы игнорируются.

Таблица 13.1.
Макрос Описание
DBUG ENTER (функция) Этот макрос принимает имя функции, в которую входит программа. Его нужно указывать после объявления локальных переменных, но перед вызовом каких либо инструкций. Например: DBUG ENTER ("main")
DBUG EXECUTE (ключевое слово) Этот макрос помечает указанную инструкцию меткой. Например: DBUG EXECUTE ("where", print where(tmp,"cache"));
DBUG FILE Эта макроконстанта инкапсулирует дескриптор выходного файла, в который записывается отладочная информация. Например: sprintf (DBUG FILE, "\nWHERE:(%s)" , info) ;
DBUG LONGJMP (среда, значение) Если в программе используется функция LONGJMP(), замените ее данным макросом.
DBUG POP () Этот макрос восстанавливает предыдущее состояние отладки. DBUG POP ();
DBUG_PRINT (ключевое слово, формат, [аргументы]) Этот макрос записывает отладочную информацию в файловый поток, как если бы была вызвана функция fprintf с константой DBUG_FILE в качестве дескриптора. Первый это ключевое слово которое можно использовать с описанным ниже флагом d. Второй аргумент — это набор параметров, передаваемый функции fprintf. Например: DBUG_PRINT ("mfunkt" , ("name: "%s"" , name));
DBUG PROCESS (имя) Этот макрос задает имя текущего процесса. Например: DBUG PROCESS (argv [0] );
DBUG PUSH (формат) Этот макрос задает новые параметры для текущего сеанса отладки. Все они помещаются в стек, поэтому можно восстанавливать предыдущие состояния с помощью макроса DBUG POP (). Например: DBUG PUSH (" d:t ");
DBUG RETURN (значение) Этот макрос заменяет инструкцию return. Если функция ничего не возвращает, пользуйтесь макросом DBUG VOID RETURN ().
DBUG SET JMP (среда) Этот макрос заменяет функцию setjmp ().
DBUG VOID RETURN Этот макрос указывает на то, что функция не возвращает никаких значений

Отладка функции начинается с того, что в ее начало помещается макрос DBUG ENTER(). Затем все вызовы инструкции return заменяются либо макросом DBUG ENTER(), либо DBUG VOID RETURN. Это позволяет отладчику определять, когда управление передается той или иной функции.

Макрос DBUG EXECUTE() помечает отдельную строку кода ключевым словом. Макрос DBUG PRINT записывает сообщение в отладочный файл. Можно напрямую работать с этим файлом благодаря макроконстанте DBUG FILE, в которой хранится его дескриптор.

В листинге показан пример отладки функции, которая вычисляет факториал заданного целого числа.

ttinclude <dbug.h>

int factorial (register int value)
{
	DBUG ENTR ("factorial");
	DBUG PRINT ("find", ("find %d factorial", value));
if (value > 1)
{
value *= factorial (value - 1);
}
	DBUG ENTR ("result", ("result %d", value));
	DBUG RETURN (value);
}
Листинг 13.1.

Программа, работающая с библиотекой функций отладки, обычно начинает отладку, вызывая макрос DBUG PUSH(). Утилиты MySQL включают отладку, если получен соответствующий аргумент командной строки или если установлена специальная переменная среды.

В табл. 13.2 перечислены флаги, понимаемые отладчиком и передаваемые макросу DBUG PUSH (). Они определяют, какая информация должна быть представлена в выходных данных. Строка формата выглядит как последовательность флагов, разделенных двоеточиями. Некоторые флаги требуют наличия параметров. Например, флаг d принимает список ключевых слов, разделенных запятыми.

Таблица 13.2.
Флаг Описание
d [, ключевые слова] Этот флаг разрешает выводить информацию макросам с именами вида DBUG ключевое слово. Если список ключевых слов не указан, то подразумеваются все макросы. Ключевые слова должны задаваться без префикса DBUG.
D [,время] Этот флаг свидетельствует о том, что вывод отладочной информации должен быть задержан на указанное число десятых долей секунды. Например, флаг D, 25 означает, что при выводе каждой строки будет выдерживаться пауза длительностью 2,5 секунды.
f [,функции] Этот флаг разрешает выводить отладочную информацию только из указанных функций. Например, флаг f main означает, что будут включены макросы, находящиеся в теле функции main ().
F Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать именем исходного файла.
g Этот флаг включает режим профилирования. В результате будет создан файл dbugmon.out. В качестве аргумента может быть указан список функций, для которых выполняется профилирование. В противном случае подразумеваются все функции. Более подробную информацию об этом можно найти в файле dbug/readme.prof дистрибутива MySQL
i Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать идентификатором процесса или потока, в зависимости от контекста.
L Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать номером строки исходного файла.
n Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать информацией о глубине вызова текущей функции.
N Этот флаг включает нумерацию строк в файле отладки.
о [, файл] Этот флаг говорит о том, что отладочная информация должна направляться в указанный файл. По умолчанию эта информация отображается на экране, но многие клиентские программы изменяют данную установку, создавая в каталоге /tmp файл с именем программы и расширением .Trace.
О [, файл] Этот флаг аналогичен флагу o, но после каждой записи в файл будет очищаться файловый буфер
P [, процессы] Этот флаг разрешает выводить отладочную информацию только указанным процессам. Имя процесса должно быть задано с помощью макроса DBUG_PROCESS
Р Этот флаг указывает на то, что каждую строку отладочной информации необходимо сопровождать именем процесса
r Этот флаг заставляет выравнивать выводимую информацию по левому краю экрана после вызова макроса DBUG PUSH ().
S При наличии этого флага отладчик будет вызывать функцию sanity(file, line) для каждой отлаживаемой функции, пока первая не вернет значение, отличное от нуля
t [, уровень] Этот макрос включает вывод строк, помечающих точки вызова и завершения функций. Через запятую может быть указан максимальный уровень трассировки, по достижении которого отладочная и трассировочная информация перестает выводиться.

Исходная документация, написанная Фредом Фишем, находится в файле dbug/user.r в исходном каталоге MySQL. С помощью утилиты nroff этот файл можно преобразовать в формат Postscript или в текстовый формат.

< Лекция 12 || Лекция 13: 123
Александра Каева
Александра Каева
Дмитрий Черепенин
Дмитрий Черепенин

Какого года данный курс?

Анна Елисеева
Анна Елисеева
Россия, Великий Новгород, Ногородский государственный университет имени Ярослава Мудрого, 2003
Эмиль Фернандо
Эмиль Фернандо
Россия