RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 11. Отладка хранимых процедур и функций

Отладчик хранимой процедуры предоставляет средства для урегулирования точек останова, продвижения в отдельные запросы (Step Into, Step Out, Step Over), вычисления и изменения значения локальной переменной и другие задачи отладки.

Привилегии

Отладчик воссоздает в начале каждого сеанса отладки базу данных serversidedebugger на вашем сервере. Эта база данных помогает отследить инструментованный код и логику наблюдения в отлаживаемом коде. У вашей текущей связи должны быть привилегии, чтобы создать эту базу данных и ее связанные функции и таблицы.

Отладчик вносит изменения негласно, чтобы временно добавить код инструментовки к сохраненным процедурам. Вы должны иметь привилегию ALTER ROUTINE для каждой хранимой процедуры, функции или триггера, который вы отлаживаете (включая процедуры и функции, которые вызваны, и триггеры, которые запущены процедурой, которую вы отлаживаете).

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

Для запуска отладчика:

  1. Выберите связь в Visual Studio Server Explorer.

  2. Откройте папку Stored Procedures. Только хранимые процедуры могут быть отлажены непосредственно. Чтобы отладить определенную пользователями функцию, создайте хранимую процедуру, которая вызывает функцию.

  3. Нажмите на узел хранимой процедуры, затем щелкните правой кнопкой мыши и из контекстного меню выберите Debug Routine.

    Рис. 11.1. Выбор хранимой процедуры для отладки

    Screen capture of stored procedure debugger,
showing how to choose a stored routine to debug

Применение

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

Если у начальной процедуры, которую вы отлаживаете, будут один или несколько аргументов, выводится всплывающее окно с сеткой (строка на каждый аргумент и три столбца: один для аргумента, один для значения аргумента (редактируемый) и один для аннулирования этого значения аргумента (флажок). После подготовки всех значений аргументов можно нажать OK, чтобы начать сеанс отладки или Cancel, чтобы отменить сеанс отладки.

Рис. 11.2. Установка параметров (1 из 2)

Setting Arguments (1 of 2)

Рис. 11.3. Установка параметров (2 из 2)

Setting Arguments (2 of 2)

Как отлаживать функции

Чтобы иметь видимость внутренней работы сохраненных процедур, отладчик готовит специальную версию процедуры, функции или триггера с дополнительным кодом, чтобы отслеживать текущую строку и значения всех локальных переменных. Любые другие хранимые процедуры, функции или триггеры, вызванные из отлаживаемой процедуры, инструментованы так же. Отладочные версии подготовлены автоматически, и когда сеанс отладки заканчивается (или нажато F5 или Shift + F5), исходные версии автоматически восстановлены.

Копия исходной версии каждой инструментованной процедуры (версия без инструментовки) сохранена в папке AppData\Roaming\MySqlDebuggerCache для текущего пользователя Windows (путь, возвращенный, вызывая System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) в .NET с добавлением MySqlDebuggerCache. Есть один файл для каждого инструментованного кода, с именем routine_name .mysql. Например, в Windows 7 для пользователя fergs путь будет C:\Users\fergs\AppData\Roaming\MySqlDebuggerCache .

Два потока используются, одна для отладчика и одна для отлаживаемой процедуры. Потоки работают в строгом чередовании, переключаяясь между отладчиком и процедурой.

Основные операции по отладке

У отладчика есть тот же самый стиль как у стандартных отладчиков Visual Studio для C#, VB.NET или C++. В частности, следующее верно:

Locals и Watches

  • Чтобы показать вкладку Locals, выберите пункты меню Debug, Windows, Locals.

    Вкладка Locals перечисляет все переменные, доступные в текущей ситуации: переменные, определенные с DECLARE в любом месте, параметры аргумента и переменные сеанса, на которые ссылаются.

  • Если последняя операция изменит значение переменной, оно будет подсвечено красным (пока другой запрос не будет выполнен).

  • Можно изменить значение любой локальной переменной.

  • Чтобы показать вкладку Watch, выберите из меню Debug, Windows, Watch.

    Чтобы определить наблюдение, введите любое действительное выражение MySQL, произвольно включая вызовы функции. Если значение будет иметь смысл в текущем контексте (текущий стековый фрейм), это покажет свое значение, иначе это покажет сообщение об ошибке в той же самой строке.

  • При отладке триггера вдобавок у локальным переменным или переменным сеанса, новый и старый объект (когда применимы) будут перечислены. Например, в триггере для INSERT для таблицы, определенного как:

    create table t1(id int, myname varchar(50));
    

    локально перечислят дополнительные переменные new.id и new.myname. Для триггера UPDATE вы также получите дополнительные переменные old.id и old.myname. Этими переменными от новых и старых объектов можно управлять как любой обычной локальной переменной.

    Рис. 11.4. Отладка триггера

    Debugging a Trigger

Call Stack

  • Чтобы посмотреть вкладку Call Stack, выберите из меню Debug, Windows, Call Stack.

  • Трассировка стека (вкладка Call Stack) перечислит все трассировки стека, по одной для каждого вызова процедуры. С желтой отметкой это текущяя точка. Нажатие в другой трассировке активирует в редакторе вкладку для той процедуры, подкрашивая зеленым последний шаг.

    Рис. 11.5. Call Stack

    Call Stack

Stepping

  • Выполнение процедуры начинается с первой выполнимой инструкции (исключая декларации, обработчики, определения курсора и т.д.).

    Рис. 11.6. Шаги отладки

    Debug Stepping

    Рис. 11.7. Шаги функций (1 из 2)

    Function Stepping (1 of 2)

    Рис. 11.8. Шаги функций (2 из 2)

    Function Stepping (2 of 2)
  • Чтобы войти в код обработчика особых ситуаций, условие должно быть вызвано в остальной части процедуры.

  • Следующий запрос, который будет выполнен, подсвечен желтым.

  • Чтобы продолжить выполение, можно выбрать между Step Into (F11), Step Out (F10) или Step Over (Shift + F11).

  • Можно выйти из любой функции, триггера или хранимой процедуры. Если вы шагаете из главной процедуры, она будет выполнять процедуру к завершению и заканчивать сеанс отладки.

  • Можно перешагнуть через вызовы хранимой процедуры, сохраненные функции и триггеры. Чтобы переступить через триггеры, переступите через запрос, который заставил бы триггер сработать.

  • Выполняя отдельный оператор, отладчик выполнит каждую отдельную функцию, вызванную этим запросом и каждый триггер, запущенный этим запросом. Порядок, в котором они отлажены, является тем порядком, в котором сервер MySQL выполняет их.

  • Можно войти в триггеры, приведенные в действие из запросов INSERT, DELETE, UPDATE и REPLACE.

  • Кроме того, число раз, которое вы входите в сохраненную функцию или триггер, зависит от того, сколько строк оценено функцией или затронуто триггером. Например, если вы нажимаете F11 (Step Into) в запросе UPDATE, который изменяет три строки (вызывая функцию для столбца в SET, таким образом вызывая функцию для каждой из этих трех строк), вы войдете в функцию три раза по очереди, однажды для каждой из строк. Можно ускорить этот сеанс отладки, отключив любые точки останова, определенные в данной сохраненной функции и нажав Shift + F11. В этом примере порядок, в котором отлажены различные экземпляры сохраненной функции, определен для сервера: это тот же самый порядок, используемый текущим сервером MySQL, чтобы оценить эти три вызова функции.

Breakpoints

  • Чтобы увидеть вкладку Breakpoints, выберите пункты меню Debug, Windows, Breakpoints.

  • Вкладка Breakpoints покажет все определенные точки останова. Отсюда можно включить и отключить точки останова по одной или все сразу (используя панель инструментов сверху вкладки Breakpoints).

  • Можно определить новые точки останова только посреди сеанса отладки. Щелкните в левой серой границе любого редактора MySQL или щелкните где угодно в редакторе MySQL и нажмите F9. В Visual Studio вы нажимаете F9 однажды, чтобы создать точку останова в текущей строке, и снова, чтобы удалить эту точку останова.

  • Как только точка останова определяется, это будет включенным (заполненный красный круг слева от текущей строки, если она будет действительным запросом, чтобы поместить точку останова) или отключенным (незаполненный красный круг слева от текущей строки, если она не подлходит, чтобы поместить точку останова).

  • Чтобы определить условные точки прерывания, после создания точки останова, щелкните правой кнопкой мыши в красной точке и выберите Condition.... Там можно поместить любое действительное выражение MySQL и статус, если выражение Is True или Has changed. Первый вызовет точку останова каждый раз, когда условие верно, последний каждый раз, когда меняется значение условия (если вы определяете условную точку прерывания, недостаточно войти в строку с точкой останова, определенной, чтобы вызвать такую точку останова).

    Рис. 11.9. Условные точки прерывания

    Conditional Breakpoints

    Рис. 11.10. Выражения и точки останова

    Expressions and Breakpoints
  • Чтобы определить число проходов точки останова, после создания точки останова, щелкают правой кнопкой мыши в красной точке и выбирают Hit Count.... Во всплывающем диалоге определите особое условие. Например, break when the hit count is equal to и значение 3 вызовет точку останова в третий раз, когда это выполнено.

Другие особенности

  • Чтобы прервать сеанс отладки (и выполнение текущего стека вызовов), нажмите Shift + F5.

  • Чтобы запустить процедуру до конца (или до следующей контрольной точки), нажмите F5.

  • Для всей функциональности можно использовать (в дополнение к документированным сокращениям) опции в меню Debug в Visual Studio.

Ограничения

  • Отлаживаемый код не должен использовать функции MySQL get_lock или release_lock, так как они используются внутренне инфраструктурой отладчика, чтобы синхронизировать отладчик и отлаживаемый код.

  • Отлаживаемый код должен избегать использования любого кода транзакции (START TRANSACTION, COMMIT, ROLLBACK) из-за возможности вытирания содержания таблиц отладчика. Это ограничение может быть удалено в будущем.

  • Вы не можете отладить код в базе данных serversidedebugger.

  • Сервер MySQL, управляющий отлаживаемым кодом, может быть любой версией сервера MySQL после 5.0 на любой поддерживаемой платформе.

  • Всегда управляйте сеансами отладки на тестовых системах или серверах разработки, а не на рабочем сервере MySQL, потому что отладка может вызвать временные проблемы или даже заблокировать сервер. Инструментованные версии процедур используют блокировки, которые не могут принадлежать остальной части производственного кода.

Клавиатурные сокращения

Следующий список суммирует клавиши быстрого вызова для отладки:

  • F9: Создает или снимает точки останова.

  • F11: Один шаг вперед.

  • F10: Перешагнуть через строку.

  • Shift + F11: Один шаг назад.

  • F5: Запустить на выполнение.

  • Shift + F5: Прервать текущий сеанс отладки.

Поиск

 

Найди своих коллег!

Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru