|
|
|||||||||||||||||||||||||||||
|
Методы отладки приложения в FormsИсточник: oracloid
Пэм Геймер, FORMS TROUBLESHOOTING, by Pam Gamer ВВЕДЕНИЕ Выяснение источника ошибок во время выполнения формы для новичка в OracleForms может стать чрезвычайно сложным делом. Большая часть работы по решениютаких проблем заключается в идентификации источника и причины ошибки; и кактолько эта задача разрешается, исправление кода проходит относительно просто. Иногда даже опытному программисту трудно определить в форме с несметным числомтриггеров различных уровней, который из операторов кода становится причинойпорождения неожиданных результатов или сообщений об ошибке во время выполненияпрограммы. Существуют различные приемы, помогающие в таких случаях. Некоторые из нихдовольно простые, и их можно быстро претворить в жизнь; другие требуютиспользования отладчика Forms; где-то потребуется создание и интерпретацияжурналов. Большинство обсуждаемых приемов применимы к приложениямклиент/сервер, так как перед их развертыванием в Web-форме должно проверить направильность работы в режиме клиент/сервер. Но кроме того, будут приведенынекоторые приемы, применимые только к Web-формам. Если вы познакомитесь совсеми этими приемами, то в любой ситуации сможете быстро выбратьсоответствующий инструмент для разрешения проблемы. БЫСТРЫЕ МОДИФИКАЦИОННЫЕ МЕТОДЫ ДИАГНОСТИКИ[ Прим. редактора : В оригинале "QUICK AND DIRTY" - то есть"Быстрые и грязные", что по русски звучит не очень гладко. Авторскорее всего имеет в виду, что при применении этих методов приходится вносить висходный текст отладочные модификации, то есть "грязнить" код.] Некоторые методы определения проблем являются и быстрыми, и простыми вреализации. Они подходят главным образом для ситуаций, когда вам уже довольнопонятно, в чем корни проблемы. Большинство этих подходов совершенно не сложны,но им не хватает мощности более формальных методов. В этом разделе обсуждаютсячетыре приема: комментирование части кода (превращение его в комментарий),использование встроенной команды "message", использование во времявыполнения опции "debug_messages=yes" и, наконец, использованиевстроенной команды "break". КОММЕНТИРОВАНИЕ ПОДОЗРИТЕЛЬНЫХ СТРОК ПРОГРАММЫ Если у вас возникло подозрение, что некоторые строки программы могут вызватьпроблемы, попробуйте убрать их, превратив (на время) в комментарий, и проверьтеформу снова. Комментарии - это невыполнимые части программы, которые в PL/SQLобозначаются одним из следующих способов: -строки, которымпредшествуют два знака минус (--) или -часть кода,начинающаяся с /* и заканчивающаяся */ Если Вы закомментируете триггер или программный блок полностью, вам нужнооставить, по крайней мере, пустой оператор: null; Недостаток этого метода заключается в том, что вам нужно не забытьраскомментировать ранее закомментированные строки после того, как вы установилипричину возникновения проблемы, или определили, что эти строки не являются еепричиной. Отслеживание множества комментариев может само по себе статьдостаточно сложным и запутанным делом, так что лучше поменьше пользоваться этимприемом и раскомментировать один раздел перед тем, как закомментировать другой. ИСПОЛЬЗОВАНИЕ ВСТРОЕННОЙ КОМАНДЫ "MESSAGE" Встроенная команда "MESSAGE", помещенная в нужном месте, позволитвам выводить на экран любое требуемое сообщение. Это сообщение может включатьназвание выполняющегося кода или значения любых переменных, которые Вы захотитеполучить в этой точке выполнения кода. Хотя строка сообщения может иметь длинудо 200 символов, на реально отображаемую длину сообщения воздействуют такиефакторы, как шрифт сообщения и ограничения менеджера окон времени выполнения(run time window manager). В реальной жизни, конечно лучше разбить длинноесообщение на несколько меньших. Убедитесь также, что свойство "ConsoleWindow" формы установлено на правильный размер окна; иначе сообщение непоявится вообще. Чтобы гарантировать, что сообщение выведется на экран втребуемой точке кода, добавьте сразу после команды "MESSAGE" команду"SYNCHRONIZE". Пример : message('The tablecontains '//to_char(empcount)//' employees'); Вместо команды "SYNCHRONIZE", вы можете использовать команду "PAUSE",которая не только синхронизирует вывод на дисплей, но и приостанавливаетпрограмму, вынуждая пользователя нажать на какую-либо клавишу для еепродолжения. Этот вариант является предпочтительным, если вы хотите привлечьвнимание к сообщению и к тому, что именно в этой точке форма выводит надисплей. Приведенный выше пример иллюстрирует тот факт, что встроенные команды"MESSAGE" выводят на дисплей сообщение в виде строки символов, так что выдолжны конвертировать любые числовые значения или значения типа даты ксимвольному виду. Кроме того, значения переменных должны оставаться внеодиночных кавычек, и должны быть объединены со строкой при помощи оператораконкатенации (//). Использование встроенной команды "MESSAGE" может вызывать проблемы дляприложений, содержащих более одного окна. Как и в случае с приемомкомментирования кода, вы должны не забыть удалить (или закомментировать) кодсообщения, как только вы изолировали проблему, поскольку эти сообщения могутвводить пользователя в заблуждение. Кроме того, вы можете обнаружить, чтоиспользование встроенной команды "MESSAGE" приведет к исчезновению ошибки вовремя выполнения программы! Если это случилось, попробуйте использовать тольковстроенную команду "SYNCHRONIZE", потому что это указывает, что проблема моглабыть связана с недостатком синхронизации между выводом на дисплей и внутреннимсостоянием формы. ИСПОЛЬЗОВАНИЕ ОПЦИИ ВРЕМЕНИ ВЫПОЛНЕНИЯ "DEBUG_MESSAGES=YES" Третий быстрый модификационный прием заключается в добавлении к команднойстроке выполняемого модуля формы опции "debug_messages=yes". Этоприведет к автоматическому отображению сообщений, информирующих нас о том,какой триггер выполняется в данный момент. Как только вы столкнетесь с ошибкойво время выполнения программы, станет известно, какой триггер был запущенпоследним, и можно продолжить отладку именно с этой точки. Любой, кто работалеще в эпоху SQL*FORMS 3.0, помнит, что это был задаваемый по умолчанию режимпри выполнении формы в режиме отладки. Чтобы использовать эту опцию из окна Form Builder, отметьте опцию"debug_messages" на вкладке runtime после выбора из меню Tools ->preferences. При выполнении из командной строки просто добавьте опцию "debug_messages=yes". Есливы для того, чтобы запустить вашу форму, используете иконку Windows, добавьтеопцию к сокращенной команде (shortcut). Для платформы Windows это можетвыглядеть примерно так: c:\orant\bin\ifrun60.exemodule=myform userid=scott/tiger debug_messages=yes Для Unix: f60runm module=myformuserid=scott/tiger debug_messages=yes Главный недостаток этого приема заключается в том, что надо подтверждатьсообщения по мере выполнения каждого триггера, что быстро вызывает раздражение.Хотя при этом видны все отработавшие триггеры, выполняемые программные блоки неотображаются, а также нет возможности показать значения переменных. Вывод этихсообщений может вызвать тот же эффект, что и прерывание хода выполненияпрограммы, с чем мы встретились при разборе встроенной команды "MESSAGE". Темне менее, этот прием полезен в тех случаях, когда вы понятия не имеете, какойтриггер вызывает проблему; ну, а как только сужена область поиска, болееподходящими могут оказаться другие приемы. ИСПОЛЬЗОВАНИЕ ВСТРОЕННОЙ КОМАНДЫ "BREAK" При выполнении формы в режиме отладки, встроенная команда "BREAK" вызываетотладчик форм Forms Debugger. Эта команда может рассматриваться как быстрыймодификационный прием диагностики форм, потому что для ее использования о FormsDebugger надо знать сравнительно немного. В ситуациях, где полезна встроенная команда "MESSAGE", для того, чтобыпосмотреть любые переменные в некой точке кода, не определяя при этом строкусообщения, можно использовать встроенную команду "BREAK". Когда форма доходитдо строки, в которой записана команда прерывания ("BREAK"), на экране появляетсяокно отладчика, и даже очень немного зная об его инструментальных средствах, высможете развернуть узлы на навигационной панели отладчика, чтобы ознакомитьсясо значениями системных переменных, переменных формы, переменных программы иглобальных переменных. Затем, когда можно будет продолжить выполнениепрограммы, достаточно только нажать иконку "GO" (значок с изображением молнии).Даже если это - все, что вы знаете об отладчике форм, вы найдете этот приемочень полезным. Но, раз уж вызван отладчик, можно при желании воспользоватьсялюбой из других его функций. Кроме того, что не требуется явно кодировать строку сообщения, чтобыотобразить нужные вам значения переменных, еще одно преимущество "BREAK" надкомандой "MESSAGE" состоит в том, что нет никакой необходимости удалять иликомментировать строку с командой "BREAK". Если форма выполняется не вотладочном режиме, "BREAK" не будет оказывать никакого влияния на выполнениепрограммы, так что ваши потребители не будут и знать, что вы оставили команду впрограмме. ДИАГНОСТИКА С ПОМОЩЬЮ FORMS DEBUGGERОтладчик форм (Forms Debugger) - это простой интерфейс, который обеспечиваетразработчику высокую степень контроля при отладке приложений. Вы не толькоможете просматривать значения переменных, но даже изменять их во времявыполнения, чтобы исследовать, как различные их значения влияют на результаты.Вы можете двигаться по коду и даже, если хотите, изменять его на время сеансаотладчика. Для Forms 5.0 и более поздних версий вы можете отлаживать серверныйкод, просматривать значения в таблицах PL/SQL и знать, какую строкуобрабатывает курсор. Forms Debugger обеспечивает исчерпывающий набор инструментальных средств дляотладки Oracle Forms, а его основные возможности весьма легки в использовании.Как только вы овладеете основными возможностями отладчика, вы, вероятно, если ине откажетесь совсем от быстрых модификационных методов, то станетеиспользовать их только для наиболее элементарных задач. Рисунок 1: Вызов отладчика из окна Form Builder ВЫЗОВ FORMS DEBUGGER Самый простой способ вызвать отладчик форм - это щелкнуть в окне FormsBuilder по иконке отладки, которая появляется как в навигаторе объектов, так ив графическом редакторе (canvas layout editor). В Forms 6.0 при этом происходитвыполнение формы в отладочном режиме. В более ранних версиях - это некоторыйпереключатель, который определяет, должна ли форма выполняться в режимеотладки, когда вы нажимаете иконку выполнения. Вы можете сделать то же самоедля Forms 6.0, используя опции меню Tools Options илиPreferences. Вы можете также выполнять Forms Debugger, определяя"debug=yes" в командной строке. Чтобы это сделать, вы должны вместонормального исполнимого модуля формы использовать отладочный исполнимый модуль,и, к тому же, форма должна быть сгенерирована в отладочном режиме. Например,чтобы работать в режиме отладки на платформе Windows задайте: c:\orant\bin\ifdbg60.exemodule=myform userid=scott/tiger debug=yes Третий метод вызова формы на выполнение в отладочном режиме состоит в том,чтобы взвести флажок "Run in Debug Mode" в окне выполнения. Если вы выполняетеформу в отладочном режиме и обнаруживаете, что не видите программный код, этозначит, что форма не сгенерирована для отладки. При выполнении формы вотладочном режиме из окна Form Builder она автоматически генерируется вотладочном режиме. Если вы работаете с Forms 5.0 или более старшими версиями и не видитесерверный код, следует повторно оттранслировать этот код на сервере, чтобывключить в него отладочную информацию: ALTER PROCEDURE procnameCOMPILE DEBUG; Такая повторная трансляция даст возможность пошагового выполнения серверногокода с использованием Forms Debugger и Forms 5.0 или более поздних версий. Еслиформа выполняется в отладочном режиме, окно отладчика будет выводиться надисплей при первом появлении формы, а также всякий раз, когда при выполнениипрограммы будут встречаться отладочные действия (об этом будет идти речь ниже).Вы можете также вручную вызвать окно отладчика во время выполнения формы вотладочном режиме, выбирая в меню Help -> Debug. КОМПОНЕНТЫ FORMS DEBUGGER В окне отладчика появяется инструментальная панель/меню, а также еще трипанели, размеры которых относительно друг друга могут быть изменены. Рисунок 2 - Компоненты Forms Debugger РАЗДЕЛ ИНСТРУМЕНТАЛЬНОЙ ПАНЕЛИ/МЕНЮ Доступные опции инструментальной панели и параметры меню изменяются взависимости от того, что отображено в панелях окна. Пять кнопок слева наинструментальной панели управляют выполнением кода, в то время как краснаякнопка X закрывает отладчик, а вопросительный знак выводит на дисплей справку.Остальные кнопки относятся к панели навигатора. ПАНЕЛЬ ИСХОДНОГО ТЕКСТА На верхней панели в режиме "только для чтения" отображается текущий блокпрограммы, если таковой вообще имеется. ПАНЕЛЬ НАВИГАТОРА На средней панели отображаются объекты отладчика, например, отладочныедействия, встроенные пакеты, объекты базы данных, модули, глобальные исистемные переменные в древовидной структуре, подобной навигатору объектовForms Builder. ПАНЕЛЬ ИНТЕРПРЕТАТОРА Нижняя панель предназначена для ввода и отображения команд интерпретатораPL/SQL. ИСПОЛЬЗОВАНИЕ ОТЛАДЧИКА Наиболее общее применение отладчика состоит в том, что в определенной точкекода выполнение программы приостанавливается, что позволяет проанализироватьход выполнения, а затем продолжить движение по коду, чтобы увидеть, как каждаяего строка воздействует на среду выполнения и форму. Кроме того, можно вводитькоманды непосредственно в интерпретатор PL/SQL, или изменять строки программы изначения переменных, чтобы видеть, как эти модификации воздействуют навыполняющуюся форму. ПРИОСТАНОВКА ВЫПОЛНЕНИЯ ПРОГРАММЫ В ФОРМЕ Выполнение программы приостанавливается, когда отладчик встречается сотладочными действиями. Имеются два типа отладочных действий: точки останова итриггеры отладки. ТОЧКИ ОСТАНОВА Точка останова сообщает форме, в каком месте следует приостановитьвыполнение кода и вызвать отладчик. Вы можете устанавливать точки остановатолько на выполнимых операторах. Если Вы попытаетесь установить точку останована комментарии, операторе begin, объявлении переменной или другой невыполнимойстроке программы, вы получите сообщение об ошибке. Имеются три пути установкиточек останова: 1. ДВАЖДЫ ЩЕЛКНУТЬ ПО ЖЕЛАЕМОЙ СТРОКЕ ПРОГРАММЫ В ПАНЕЛИ ИСХОДНОГО ТЕКСТА:На панели навигатора выберите модуль, который вы выполняете, затем выделитетриггер или программный блок, куда нужно вставить точку останова. В результатеэтот программный блок попадет на панель исходного текста (верхнюю панель).Чтобы вставить точку останова, дважды щелкните по номеру строки, перед которойжелательно сделать паузу. 2. ВВЕСТИ КОМАНДУ В ИНТЕРПРЕТАТОР PL/SQL: Введите следующую команду в панелиинтерпретатора (нижняя панель): .BREAK PROG LINE Или же в панели исходного текста щелкните на желаемой строке, а затемвведите в интерпретаторе следующую команду: .BREAK Но зачем Вам это нужно, если при двойном щелчке по номеру строки текстапрограммы в панели исходного текста команда прерывания автоматически вводитсядля передачи в интерпретатор? 3. ИСПОЛЬЗОВАТЬ В ФОРМЕ ВСТРОЕННУЮ КОМАНДУ "BREAK": Как обсуждалось вразделе "быстрые модификационные методы" - это единственный способустановить "стационарные" точки останова. Все установленные в сеансеотладчика точки останова исчезают, когда вы закрываете форму, и должны бытьзаново установлены при последующих выполнениях формы в отладочном режиме. Есливам нужно, чтобы программа прерывала свою работу каждый раз, когда запускаетсяотладчик, внесите эту команду в форму. Помните, что встроенная команда "break"срабатывает только тогда, когда форма выполняется в отладочном режиме, так чтоона не помешает работе пользователей. ТРИГГЕРЫ ОТЛАДКИ Другой способ приостановить выполнение программы - использование триггеровотладки. Триггер отладки - это определенный Вами блок кода, которыйвыполняется: (a) каждый раз, когда управление передается отладчику, (b) в каждой строке выполняемого исходного текста, © когда встречается определенная строка исходного текста. Триггеры отладки обычно используются, чтобы определить условную точкуостанова. Например, вы можете установить для строки исходного текста триггеротладки, который временно прекратит выполнение программы, если значениенекоторой переменной оказалось больше, чем указанная величина: IF Debug.Getn('my_sal') > 5000 THEN raise Debug.Break; END IF; В этом коде вызываются функции пакета DEBUG, который документирован вразделе интерактивной справки "О пакете DEBUG". ИССЛЕДОВАНИЕ СРЕДЫ ВЫПОЛНЕНИЯ После того, как Вы установили требующиеся отладочные действия, можно закрытьотладчик форм, щелкнув для этого по красной иконке со значком "X".Форма будет работать нормально, пока ее выполнение не дойдет до строкипрограммы с установленной в ней точкой останова. Остановка произойдет до выполненияэтой строки программы. В этой точке можно проанализировать среду выполнения, аименно: -значенияэлементов (включая неотображаемые элементы), параметры, глобальные переменные,системные переменные, -параметрыкомандной строки, -программный стек(стек вызовов), наряду со значениями переменных программного блока для каждогоуровня стека ПОШАГОВОЕ ПРОДВИЖЕНИЕ ПО КОДУ Вы можете использовать кнопки управления программой на инструментальнойпанели, чтобы выполнить код формы любым требующимся способом. При использованииForms 5.0 и более старших версий с RDBMS версии 7.3.4 + или 8.0.4 +, имеетсятакже возможность отлаживать блоки программы, которые хранятся в базе данных(серверная отладка). -Step into (Шагвнутрь): первая кнопка слева выполняет следующую строку программы. Это полезно,если вы хотите индивидуально выполнить каждую строку, чтобы узнать, как ее кодвоздействует на переменные формы и среды выполнения. При этом вы будетепопадать и в вызываемые подпрограммы, что позволит выполнять также кодподпрограмм. -Step over(Пропустить): следующая кнопка позволяет выполнять следующую строку программы,пропуская при этом вызываемые подпрограммы; другими словами, подпрограммавыполнится, но вам не придется проходить через каждую строку кода подпрограммы.Отладчик возобновит свою работу после выполнения подпрограммы. -Step out:(Выйти): третья кнопка управления после выполнения текущей подпрограммывозвращает управление отладчику, останавливаясь в том месте, где вызываласьподпрограмма. Используйте ее, если вы начали движение по подпрограмме, но затемрешили, что ее пошаговое выполнение не требуется. -Go(Продолжить): при нажатии этой кнопки (GO) в обычном режиме (без пошаговоговыполнения команд) выполняется последующий код до завершения программы или додостижения другой точки останова. Используйте эту кнопку, чтобы убрать окноотладчика и возобновить (продолжить) нормальное выполнение формы. -Reset (Сброс):пятая и последняя кнопка управления программой прерывает выполнение блоковпрограммы, которые выполняются в настоящее время, возвращая управление внешнемууровню отладки. Если в то время, как управление программой принадлежитотладчику, он сталкивается с несколькими точками останова, может иметьсянесколько различных уровней отладки. При каждом шаге по коду Вы можете, если это необходимо, непосредственновводить команды PL/SQL и исполнять проверку или модификацию значений переменныхили кода. ВВОД КОМАНД В ИНТЕРПРЕТАТОР PL/SQL Если вы выполняете в отладчике действия ГИП (Графического ИнтерфейсаПользователя), то можете заметить, что команды повторяются на экране в панелиинтерпретатора PL/SQL. ПО желанию эти и другие команды можно ввестинепосредственно. Ниже приведены примеры команд PL/SQL, которые могут бытьвведены с панели интерпретатора: УСТАНОВИТЬ ТОЧКУ ОСТАНОВА .BREAK PROG LINE Обозначение PROG применяется вместо PROGRAMUNIT, но если вы предпочитаете,можно использовать более определенные термины PACKAGE, SUBPROGRAM, PROCEDUREили FUNCTION. Вы можете также определить триггер, который будет выполняться при достиженииточки останова. ПРОСМОТР ИСХОДНОГО ТЕКСТА .LIST PROG СПИСОК ОПРЕДЕЛЕННЫХ В НАСТОЯЩЕЕ ВРЕМЯ ПРОГРАММНЫХ БЛОКОВ .SHOW PROG ЭКСПОРТ ПРОГРАММНЫХ БЛОКОВ В ФАЙЛ .export prog * fileC:\.pls Эта функция полезна для документирования всего кода PL/SQL формы. Однакоимеется один существенный недостаток: в файл не выводятся названия программныхблоков. Поэтому, если вы намерены использовать эти функциональные возможности,нужно в начале каждого программного блока поместить комментарий, в которыйвключено его название и уровень триггера. Например, в триггереwhen-button-pressed (если нажата кнопка), Вы могли бы поместить такойкомментарий: /*CONTROL.BUTTON1.WHEN-BUTTON-PRESSED trigger */ РАСПЕЧАТАТЬ ЗНАЧЕНИЯ ОБЩИХ (PUBLIC) ПЕРЕМЕННЫХ ПАКЕТА TEXT_IO.PUT_LINE ( Это хороший способ определения значений переменных пакета, которые, если ониопределены в технических спецификациях пакета, обычно не могут просматриватьсяв отладчике. СОЗДАНИЕ МОДИФИКАЦИЙ ВО ВРЕМЯ ВЫПОЛНЕНИЯ Во время отладки формы, можно увидеть результаты изменения кода. В окне FormBuilder можно изменить код и повторно испытать его, но если всего лишь нужнопроверить, как модификация кода воздействует на выполняющуюся форму, можнопровести эти изменения в отладчике форм. Однако следует учесть, что этимодификации не сохранятся; они будут действительны только для текущего сеансаотладчика. Если требуется сохранить сделанные изменения, их можно скопировать вокне отладчика и вставить в программный блок в окне Form Builder, а затемсохранить код, чтобы сделать изменения постоянными. Подобным способом можнопроверить, как различные изменения в значениях программных переменных будутвлиять на результаты выполнения формы, в то время как форма выполняется вотладчике. Модификация кода программы или значений переменных производится в панелинавигатора. Чтобы вызвать на экран редактор PL/SQL, нужно дважды щелкнуть поиконке программного блока. Заметьте, что если этот программный блок находится втекущем стеке вызовов, он будет доступен в режиме "только для чтения". Впротивном случае вы имеете возможность сделать модификации, которые будутдействительны только на время сеанса отладчика. Вы можете изменять значенияпеременных программы в стеке вызовов панели навигатора, и даже изменятьзначения элементов форм, спускаясь вниз "модульном" узле навигатора.Для этого нужно всего лишь выбрать в навигаторе переменную, а затем выделить ееи изменить ее значение. Последующие строки программы, ссылающиеся на этупеременную, будут использовать ее новое значение. ОГРАНИЧЕНИЯ ОТЛАДЧИКА В отладочном режиме обработка ошибок функционирует по-другому. Триггерыon-error и on-message не срабатывают, а любые ошибки или сообщения отображаютсякак предупреждения. Это является усовершенствованием по сравнению с SQL*FORMS3.0, где при выполнении формы в отладочном режиме вам советовали вручнуювременно отключить триггеры on-error и on-message. Имеется много встроенных элементов, которые не будут выполняться до тех пор,пока форма не будет запущена на выполнение в отладочном режима. Их списокнаходится в разделе интерактивной справки: "Об ограничениях запускаотладчика". Не пробуйте вызывать из отладчика подсказку. Это вызывает ошибку PDE. См.сообщение об ошибках Forms номер 438135. В настоящее время нет простого способа определить, какая строка программывызвала исключительную ситуацию. Однако в будущих выпусках отладчика можетпоявиться подобное расширение. Как уже упоминалось, нет способа сохранить отладочные действия (точкиостанова и триггеры), созданные в отладчике. Их нужно повторно вводить в каждомсеансе отладчика, если только Вы не используете встроенную в ваш код команду"BREAK". Кроме того, не существует никакого способа сохранить сделанные впрограммных блоках модификации. ПРЕИМУЩЕСТВА ОТЛАДЧИКА ФОРМ Несмотря на описанные ограничения, отладчик форм является полезныминструментом для получения детального представления большинства элементов средыформы во время исполнения. Это дает возможность создавать сценарии "what if"("что, если…"), изменяя "на лету" код программы и значения переменных, и выможете легко обнаруживать результаты выполнения каждой строки кода. Кроме того,при использовании пакетов типа OLE2 или TEXT_IO, вы получите более осмысленныесообщения об ошибках при выполнении в отладочном режиме, даже если не былоустановлено ни одной точки останова, а только пошаговое выполнение кода. Из-зафункциональных возможностей и простоты использования отладчик форм являетсяценным пополнением вашего диагностического инструментария. ДИАГНОСТИКА ПРИ ПОМОЩИ ЖУРНАЛИЗАЦИИ И ТРАССИРОВКИИмеются несколько методов, которые используют журнализацию и трассировку длясоздания отчетов о выполнении формы. Они полезны для детального анализа. Частопри анализе журнального файла можно обнаруживать кое-что, что было упущено приработе с отладчиком. Кроме того, если не удается самостоятельно решитьпроблему, можно послать журнальный файл аналитику службы поддержки Oracle(Oracle Support), чтобы он оказал техническую помощь. Не упустите из виду электронную поддержку через MetaLink - постоянно (и, ктому же, бесплатно) доступный источник помощи, если у Вас имеется лицензияOracle Support. Это дает доступ ко многим документам, которыми пользуютсяаналитики службы поддержки, чтобы помогать заказчикам решать их проблемы.Журнализация может дать информацию по кодам ошибок, сообщениям об ошибках,расположенных в стеке данных трассировки, и Java. Далее вы можете сделать поэтим ключевым словам запрос в MetaLink, чтобы найти статьи, имеющие отношение квашей конкретной проблеме. Зарегистрироваться для MetaLink можно по адресу http://metalink.oracle.com/ . Чтобы решить, подходит ли вам журнализация, и какой тип файла журналаявляется лучшим в данной ситуации, надо иметь информацию о методикахжурнализации: как инициировать журнализацию и как интерпретировать журналы,созданные каждым методом. DEBUG_SLFIND На платформах, отличных от Windows, проблемы иногда могут возникать из-занесоответствующего использования файлов ресурса. Можно, например, обнаружить,что некоторые из клавишей работают не так, как вы ожидаете, или что внешний видформы не такой, каким должен быть. Скорее всего, это происходит из-за того, чтопрограмма (Forms) не может найти пользовательский ресурс-файл или файлTK2MOTIF, и заменяет их на задаваемый по умолчанию ресурс-файл, в которомклавиши или визуальные аспекты формы определены по-другому. Или же вы призапуске формы получаете ошибки FRM. А для того, чтобы обнаружить проблемы сиспользованием ресурс-файла, следует использовать журнальный файл DEBUG_SLFIND,доступный на платформах Unix или VMS. Этот журнальный файл инициализируется установкой переменной среды споследующим выполнением формы. Приведем пример синтаксиса для Unix: > setenv DEBUG_SLFINDoutput.txt > f60runm module=testuserid=scott/tiger > more output.txt Полученный журнальный файл довольно просто интерпретировать. Он содержит всевызовы, с которыми Forms обращается в среду, указывает переменные среды, путипоиска файлов и разыскиваемые ресурс-файлы, а также файлы, к которым былиобращения. ТРАССИРОВКА SQL (SQL TRACE) SQL Trace - это выполняющиеся на сервере операторы трассировки SQL. Онисоздают на сервере базы данных в каталоге, указанном параметром USER_DUMP_DESTв файла init.ora, файл трассировки. Основная цель трассировки - последующаянастройка операторов SQL. Трассировка может быть инициирована для всех подключений к базе данных, еслив файле init.ora определен параметр SQL_TRACE=TRUE. Однако обычно бывает намного полезнее трассировать каждый сеанс отдельно. Выможете сделать это в Form Builder, отметив на экране поле"Statistics", где определяются опции времени выполнения, или вкомандной строке runform (выполнить форму) с параметром STATISTICS=YES. Перед их интерпретацией файлы трассировки необходимо конвертировать вчитаемую форму. Чтобы выполнить такое конвертирование, можно использоватькоманду TKPROF. В результате выполнения команды TKPROF создается файл, вкотором перечисляются все операторы SQL, время выполнения каждого оператора(если в файле init.ora для базы данных установлено значение TRUE параметраTIMED_STATISTICS), и планы их выполнения (если в командной строке для TKPROFиспользуется опция "explain=userid/password"). Приведем примериспользования команды TKPROF для конвертирования файла трассировки SQL вчитаемую форму: Tkprof ora_8927.trc/tmp/tkprof_8927.txt explain=scott/tiger Для платформы Windows команда изменяется в соответствии с версией базы данных(tkprof73, tkprof80) - название соответствующего выполнимого модуля можно найтив каталоге $ORACLE_HOME\bin. ТРАССИРОВКА SQL*NET (SQL*NET TRACE) Трассировка SQL*Net - это трассировка операторов SQL на клиентской стороне. Приэтом перехватывается каждое взаимодействие между любым клиентскиминструментальным средством и любой версией базы данных, а Вам сообщаютсяизданные операторы SQL и возвращенные данные. Вы можете инициировать трассировку SQL*NET, установив в файле sqlnet.ora наклиентской стороне два параметра настройки: -SetTRACE_LEVEL_CLIENT=16 (имеется 16 уровней трассировки; 16 - это наиболеедетальный уровень). -SetTRACE_DIRECTORY_CLIENT указывает на каталог, в котором Вы хотите создать файлтрассировки. -Необязательныйпараметр: Set TRACE_FILE_CLIENT задает используемое название файла трассировки(значение по умолчанию - sqlnet.trc). Поскольку команда SQL*NET Trace создает очень большие файлы трассировки иможет повлиять на эффективность работы, вы должны как можно скорее выйти изклиентского сеанса и отключить трассировку, снова изменив значениесоответствующего параметра в файле sqlnet.ora: TRACE_LEVEL_CLIENT=OFF Кроме того, последующие действия по трассировке будут добавлять информацию вконец файла трассы, так что вы должны или каждый раз использовать уникальноеимя файла, или удалять, или переименовывать файл перед началом каждой следующейтрассировки. Если Вы не определяете имя файла, по умолчанию ему каждый разбудет назначено уникальное название. Если нет возможности изменить файл sqlnet.ora, потому что, скажем, оннаходится в общей сети, вы можете для среды Windows создать его локальную копиюи установить переменную системного реестра TNS_ADMIN так, чтобы она указывалана локальный каталог, где находится этот файл. Для Unix Вы можете создать копиюэтого файла в основном каталоге и назвать ее ".SQLNET.ORA" (обратитевнимание на точку, предшествующую имени файла). Этот файл будет использоватьсявместо общедоступной копии. Вы можете читать файлы трассировки непосредственно; однако, их может бытьнесколько затруднительно интерпретировать. В них будет, вероятно, содержатьсямного не представляющей для вас интереса информации, в то время как основнойэлемент файла, который, вероятно, будет Вас интересовать - это распечаткаоператоров SQL, генерируемых формой. К счастью, утилита TRCEVAL поможет Вамотобрать из файла трассировки полезную информацию: Использование: trceval [-параметры] <имя файла> Где -параметры могут принимать одно или несколько значений из следующегосписка: Например, Вы можете использовать следующую команду, переназначающую выходутилиты TRCEVAL в файл, который называется "mytrace.txt": Trceval -qu sqlnet.trc> mytrace.txt Сравнение размеров файлов, получающихся после трассировки простой формы споследующим применением к нему утилиты TRCEVAL показало, что файл трассировкиимеет размер 169Кб, а файл, сгенерированный TRCEVAL, - только 5Кб. Чтобы внекотором конкретном файле трассировки, который выглядит подобно приведенномуниже файлу, найти первый оператор SQL, выданный формой, вы должны просмотреть3041 строку:
Однако,в файле, сгенерированном из этого файла трассировки командой TRCEVAL (сиспользованием опции -qu), оператор SQL появляется уже в 37-й строке и выглядитследующим образом: SELECT DEPTNO,DNAME,LOC,ROWID FROMDEPT TRCEVALне показывает посланные и полученные данные, но вы можете, если это необходимо,обратиться к файлу трассировки. Таким образом, до тех пор, пока вам нетребуется вся детальная информация по сетевым пакетам, утилита TRCEVAL - этото, что надо! ОператорыSQL в этом файле используют переменные связи. Например: SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,ROWIDFROM EMP WHERE (DEPTNO=:1) Переменнаясвязи (в этом примере ":1"), показывает, что этот операторсгенерирован внутри Forms. Если бы это был оператор, написанный программистом,как это бывает в тех случаях, когда вы определяете явный курсор для выборкиданных, переменная связи началась бы с "b", например,":b1". ТрассировкаSQLNet не только позволяет вам видеть операторы SQL, издаваемые Forms, темсамым, давая представление о том, что происходит за кулисами, но и может даватьВам все подробности относительно ошибок, произошедших на сервере, которыесоставляют стек. Ее (трассировки) полезность становится очевидной, если вывспомните про цель приложения на Forms: обеспечить простой интерфейспользователя для ввода операторов SQL DML (select, insert, delete, update) длябазы данных. СООБЩЕНИЯОБ ОШИБКАХ FORMS ВРЕМЕНИ ВЫПОЛНЕНИЯ Начинаяс Developer 1.6.1 (Forms 4.5.10.1.0), Developer 2.1 (Forms 5.0.6.5.1) иDeveloper 6.0 (все версии Forms), вы имеете возможность использовать сообщенияоб ошибках времени выполнения Forms (Forms Runtime Diagnostics - FRD). Этоаналогично выполнению формы в отладочном режиме и распечатыванию всехпроисходящих событий. Хотя вы не сможете воздействовать на результат, изменяязначения переменных или команды программы "на лету", тем не менее, вы получаетеполный журнальный файл, содержащий следующие типы сведений: -Открытые файлы(fmx и mmx) -Каждыйсработавший триггер вместе с уровнем срабатывания -Каждыйвстроенный выполнимый модуль (every built-in that executes), включая егопараметры -Полнаяинформация о состоянии формы в начале ее выполнения и обо всех изменениях,которые происходили после каждого действия -Полный текстсообщений об ошибках форм и необработанных исключительных ситуациях -Каждыйсделанный выбор из меню УFRD имеются недостатки по сравнению с выполнением формы в отладочном режиме.FRD не позволяет вам пошагово двигаться по коду, и фактически даже непоказывает, какие программные модули выполняются. Вы не способны видеть значенияпеременных программы или элементов Forms во время выполнения триггера, хотя вамдоступны элементы формы, которые изменились после завершения выполнениятриггера. Выполнитьформу с активизированной диагностикой совсем просто. Нужно только добавить к команднойстроке опцию "record=collect" (для формы, развертываемой в Web, этаопция добавляется к параметру serverArgs в файле HTML). По желанию вы можетеспецифицировать имя журнала, прибавляя к командной строке опцию "log=". Примеры: D:\ORANT\BIN\ifrun60.EXEmodule=testform userid=scott/tiger record=collect Выможете комбинировать сообщения об ошибках времени выполнения с выполнением формыв отладочном режиме, совмещая тем самым "лучшее из обоих миров": D:\ORANT\BIN\ifdbg60.EXEmodule=testform userid=scott/tiger record=collect Заметим,что эта команда использует выполнимый модуль отладчика, поэтому не забудьте сначаласгенерировать форму в отладочном режиме. Незабудьте также, что если файл с тем же самым названием уже существует, FRDзаписывает поверх своего предыдущего журнала; нет способа добавлять информациюв конец журнального файла. Кроме того, журналы могут быть очень большими, такчто используйте этот метод только для конкретных ситуаций. Если FRD неспособнаписать в журнал из-за переполнения файловой системы или какой-либо другойпроблемы, форма продолжит функционирование, но запись в журнал производиться небудет. Отладка с помощью FRD может быть особенно полезна, когда пользовательполучает необъяснимые ошибки в Form, но неспособен даже точно объяснить вам,что это за ошибки. Активизируйте для такого пользователя FRD, и как только онсообщит, что проблема повторилась, исследуйте журнальный файл. Вы сможете точноопределить, что делал в форме пользователь в момент возникновения ошибки. НАСТРАИВАЕМАЯЖУРНАЛИЗАЦИЯ С ПОМОЩЬЮ TEXT_IO Возможно,что ни одна из этих опций журнализации не удовлетворяет точно вашим целям.Может быть, вы имеете дело с формой, в которой скрывается ошибка, зависящая отданных, или же вы хотите проследить значение переменной на всем протяжениидлинного цикла или при выборке большого объема данных. Пошаговое продвижение попрограмме или ответы на сообщения могут стать весьма утомительным занятием, вто время как другие методы журнализации могут или вовсе не давать требующуюсявам информацию, или давать ее так много, что извлечение требуюемых данныхстановится затруднительным. Решение проблемы подобного типа состоит в том,чтобы использовать для создания вашего собственного настраиваемого журналапакет TEXT_IO. Есливы захотите создать пакет для выполнения настраиваемой журнализации, то модельюдля этого может послужить следующий пакет, описанный в документе OracleNote:61692.1 FORMS DEBUGGING TECHNIQUES: Вы можете передать в dbg.output строку, и эта строка будет добавлена в конецжурнала вместе с меткой времени. Например: dbg.output(‘The value of salary is ‘// to_char(empsal)); Дляего активизации необходимо, чтобы параметр формы передавал некоторое значение.Чтобы добиться этого, вы можете прибавить к форме вызываемый параметр,например, FORM_DEBUG, и исправить код в пакете dbg для обеспечения возможностиусловного выполнения: if :PARAMETER.FORM_DEBUG=’YES’ then --Поместите эту строку в тело пакета после BEGIN Теперьдостаточно поместить перед строкой "EXCEPTION" оператор "endif", и вы получите условную журнализацию. При нормальных обстоятельствахне создается никакого журнала. Запись в журнальный файл будет вестись только вслучае, если в командной строке или (для формы, выполняющейся в Web) впараметре serverArgs файла HTML будет передано значение параметра формы"FORM_DEBUG=YES": D:\ORANT\BIN\ifrun60.EXEmodule=test_form userid=scott/tiger FORM_DEBUG=YES Этимпутем вы можете, когда это необходимо, активизировать настраиваемуюжурнализацию и выводить любое требующееся вам сообщение. Возможностибесконечны! ДИАГНОСТИКАФОРМ, РАЗВЕРТЫВАЕМЫХ В WEBИмеютсянесколько полезных приемов при разрешении проблем, с которыми сталкиваются привыполнении форм в Web. Ниже рассматриваются два таких приема, позволяющиеполучить более осмысленную информацию: журнализация информации о подключенияхна Forms Server и выбор параметров для клиентской Java-консоли. ЖУРНАЛИЗАЦИЯДЕЙСТВИЙ ПО ПОДКЛЮЧЕНИЮ Чтобыполучить информацию о подключениях к Forms Server, можно использовать средствоConnection Activity Logging (журнализация действий по подключению),появившееся, начиная с Developer 1.6.0 (Forms 4.5.9.3.0), Developer 1.6.1, 2.1и 6.0 (все версии). Оно активизируется при старте сервера Forms Server: f60ctl ... log=log_file Чтобыактивизировать журнализацию действий по подключению для платформы NT, нужновручную запустить Forms Server из командной строки, или вручную же запуститьслужбу с опцией log=. Вы не сможете активизировать ее, если при загрузке NTслужба стартует автоматически. Журнальныйфайл будет содержать все сообщения, порожденные Forms Server, включая: -сообщения призапуске Forms Server -запросы наподключение, обслуживание и разъединение -аварийныезавершения -адреса IP, номерапортов и обработку информации по идентификации процесса Хорошаяидея - сохранять службу Connection Activity Logging активизированной.Получающийся журнал относительно короток по сравнению с другими типамижурнальных файлов, а содержащаяся в нем информация очень полезна дляадминистраторов системы при диагностике проблем Forms Server. В более поздниеверсии Forms в журнальном файле включена трассировка стека действий поподключению в том случае, если имела место аварийная ситуация, что делает этоттип журнализации еще более ценным. ПАНЕЛЬУПРАВЛЕНИЯ JINITIATOR Панельуправления JInitiator имеет параметры, с помощью которых можно получать данныео формах, выполняющихся в Web. Для появления панели управления выполнитеследующие действия: START -> Programs -> OracleJInitiator Control Panel Рисунок3 - Панель управления Jinitiator Убедитесь,что выбрана опция "Show Java Console". После активизации на Java-консоли будутотображаться детализированные сообщения Java, поскольку приложение Formsвыполняется в Web. Вытакже можете получить дополнительную информацию, нажав на вкладку"Advanced" и отметив окно "Enable Debug". Начинаяс JInitiator 1.1.7.15.1, появляется новая возможность: вы можете создатьжурнальный файл действий с кэшем файла JAR. Вы можете активизировать ее в поле"runtime parameter" панели управления Jinitiator, используя следующие опции: -Dcache.verbose=trueвыводит все операции с кэшем в окно консоли Jinitiator, включая попадания вкэш, справочник кэша, размер кэша, добавления к кэшу и удаления из кэша. -Dcache.verbose.hit=trueвыводит все случаи, когда выборка из файла происходит непосредственно из кэша. -Dcache.verbose.miss=trueвыводит случаи, когда требующуюся запись файла нельзя выбрать из кэша. -Dcache.logfileопределяет журнальный файл, в который будет вестись дозапись в конец при каждомзапуске Jinitiator. Отсутствиеустановок означает, что журнализация не выполняется. ВЫБОРПОДХОДЯЩИХ ИНСТРУМЕНТАЛЬНЫХ СРЕДСТВКактеперь, когда вы знакомы со всеми этими методами диагностики, решить, какое изних является подходящим для конкретной ситуации? Имеется несколько общихрекомендаций: -быстрые модификационные- если форма относительно проста, а вам всего лишь требуется установить, гдевстречается проблема, может оказаться полезным один из быстрых модификационныхметодов: комментирование подозрительного кода, использование встроенной команды"message" или очень простой вызов отладчика Forms с использованиемвстроенной команды "break ". Если вы понятия не имеете, где источникпроблемы, можно сначала использовать в командной строке опцию"debug_messages=yes", чтобы вывести сообщение для каждого сработавшеготриггера; как только контекст сужен, можно использовать какую-либо другуюметодику для дальнейшего уточнения места нахождения проблемы. -Forms Debugger- Если вы во время выполнения формы должны контролировать или изменять средувремени выполнения, используйте Forms Debugger. Вы можете даже использовать егов комбинации с другими методами, например, некоторыми типами журнализации. -Журнализация/трассировка- если необходимо фиксировать поведение Forms во время выполнения формы, используйтеодин из методов журнализации или трассировки. Эти методы особенно полезны длясложных ситуаций, где может оказаться выгодной способность анализировать файл.Журнал должен предоставлять детальную информацию об ошибках, содержащуюключевые слова для запроса в MetaLink. Кроме того, аналитик службы поддержкиOracle сможет быстрее решить вашу проблему, если вы предоставите журнальныйфайл, в котором содержится регистрация действий формы. Этиинструментальные средства должны стать прочным фундаментом вашего превращения вопытного диагноста Forms! Ссылки по теме
|
|