6. Отладка прикладной задачи В FoxPro имеется исчерпывающий набор инструментов для отладки прог- рамм. Эти инструменты отладки - окна трассировки Trace и отладки Debug, текстовый редактор и оперативная помощь - могут помочь в опре- делении места и исключении ошибок в программах. Глава охватывает следующие темы: - Ошибки компиляции - Ошибки времени выполнения - Советы по отладке Программные ошибки Ошибки, возникающие в программах FoxPro, могут быть поделены на две категории: - ошибки компиляции, возникающие при компиляции программы - ошибки времени выполнения, возникающие при выполнении программы Например, пусть нужно открыть базу данных CUSTOMER по команде USE, но Вы ошибаетесь при вводе: MUSE customer При компиляции этой команды генерируется сообщение "Unrecogniked command verb". Эта ошибка - пример ошибки компиляции. Пусть база дан- ных CUSTOMER стерта с диска, так что ее нельзя найти. Хотя команда USE customer синтаксически правильна и будет компилироваться без ошибок, при выполнении команды генерируется ошибка "File 'customer' does not exist". Эта ошибка - пример ошибки выполнения. Ошибки компиляции Перед тем, как программа FoxPro сможет работать, ее нужно откомпилиро- вать. Вы можете откомпилировать программу сами, или же дать возмож- ность FoxPro откомпилировать ее автоматически. Интерактивная компиляция Программы могут быть откомпилированы интерактивно из блока диалога Comрile, который появляется при выборе из всплывающего меню Program команды Comрile... Когда выбираются селективные кнопки To .ERRs или To File, создается файл журнала, содержащий ошибки компиляции. - Если выбирается To .ERRS, то создается файл журнала ошибок компиля- ции с тем же именем, что имя программы, и расширением .ERR. - Если выбирается To File, то можно направлять ошибки компиляции в файл журнала с другим именем и расширением. Файл журнала ошибок компиляции содержит каждую строку программы, выз- вавшую ошибку во время компиляции, после которой следует номер строки и сообщение об ошибке. Для открытия и изучения файла журнала ошибок можно использовать редактор FoxPro. Команда Comрile Из окна Command или внутри программы, программы могут быть откомпили- рованы по команде COMPILE. Команда SET LOGERRORS определяет, был ли создан при компиляции программ по COMPILE файл ошибок компиляции. - Если перед выдачей COMPILE LOGERRORS установлен в ON, то файл журна- ла ошибок компиляции создается с тем же именем, что имя программы, и расширением .ERR. Если такой файл уже существует, он перезаписывается. - Если программа откомпилировалась без ошибок или если перед компиля- цией LOGERRORS установлен в OFF, файл журнала ошибок компиляции не создается. Если программа компилируется без ошибок и файл ошибок с тем же именем, что и компилируемая программа, существует, то он удаляется. Сохранение и компиляция Когда в редакторе текстов создается или редактируется программа, в блоке Preferences доступен блок контроля Comрile when saved. Блок Preferences появляется, когда из всплывающего меню Edit выбирается ко- манда Preferences... В случае выбора Comрile when saved программы ав- томатически компилируются при каждом их сохранении. - Если, когда, выбрав Comрile when saved, Вы сохраняете программу, LOGERRORS имеет значение SET ON, то создается файл журнала ошибок ком- пиляции, имеющий то же имя, что и программа, с расширением .ERR. Если такой файл уже существует, он перезаписывается. - Если программа компилируется без ошибок или LOGERRORS имеет значение SET OFF, файл журнала ошибок компиляции не создается. Если программа компилируется без ошибок и файл ошибок с тем же именем, что и компили- руемая программа, существует, то он удаляется. Причины ошибок компиляции Обычно причинами ошибок компиляции являются следующие: - синтаксические ошибки из-за неправильности набора команды FoxPro или недопустимых символов - неправильные или пропущенные ключевые слова в структурированных ко- мандах FoxPro. K структурированным командам относятся DO CASE, DO WНILE, IF...ENDIF, FOR...ENDFOR и SCAN...ENDSCAN. Например, использо- вание IF без ENDIF генерирует ошибку "If/else/endif mismatch". - слишком большая длина строки. Команда или функция не может превышать максимальной длины в 2048 символов Если программа генерирует ошибки компиляции, нужно исправить строки программы, в которых эти ошибки об- наружены, и вновь откомпилировать ее. Процесс нужно продолжать до тех пор, пока программа не откомпилируется без ошибок. Ошибки времени выполнения Ошибки времени выполнения - это ошибки, возникающие во время выполне- ния программы. Хотя программа может откомпилироваться без ошибок, она может генерировать ошибки времени выполнения. Ошибки времени выполне- ния могут быть более сложными для устранения, чем ошибки компиляции и могут потребовать использования окон Trace и Debug. Окно трассировки отображает исходный код программы по мере ее выполне- ния. Исполняемая строка программы высвечивается повышенной яркостью. В строках программы можно установить точки прерывания, чтобы программа приостанавливала выполнение перед каждой строкой - это дает возмож- ность пошагово выполнять программу, выполняя каждый раз одну строку. Окно Debug позволяет отслеживать во время выполнения программы значе- ния переменных в памяти, элементов массивов, функций, файлов баз дан- ных и выражений. В этом окне можно устанавливать точки прерывания для остановки программы при изменении значений этих элементов. Окна Trace и Debug могут быть открыты одновременно, и Вы можете устанавливать точки прерывания программы в обоих окнах. Число устанавливаемых точек прерывания ограничено лишь объемом доступной памяти. Более подробная информация об окнах Trace и Debug приводится в главе "Меню Window" в "Руководстве по интерфейсу". Рекомендации по отладке Могут быть полезными следующие рекомендации по отладке: Настройте свой дисплей Если имеющаяся аппаратура поддерживает режимы расширенного отображе- ния, перед началом отладки можно переключиться на расширенный видеоре- жим. В расширенном режиме окна Trace и Debug могут быть открыты ниже окон вывода, помещаемых на экран программой. Если имеющаяся видеоаппа- ратура не поддерживает расширенные режимы и окно программы покрывает окна Trace и Debug, нужно остановить выполнение программы и интерак- тивно переместить окна Trace и Debug. Документирование с помощью FoxDoc Для создания документации как по одной программе, так и по всей прик- ладной задаче рекомендуется использовать FoxDoc. FoxDoc создает древо- видные структуры для прикладной задачи, заключений по прикладным зада- чам, отчетов по перекрестным ссылкам для переменных и многое, многое другое. Если Вы "породили" прикладную задачу, FoxDoc быстро прояснит ее смысл. SET ESCAPE ON Команда SET ESCAPE OFF предотвращает завершение программы по нажатию клавиши Esc. Если отлаживаемая программа содержит SET ESCAPE OFF, то нужно временно закомментировать эту команду. Для этого нужно в начало строки с этой командой поставить звездочку (*). Приостановка выполнения в контрольных точках Для приостановки выполнения программы перед строкой с точкой прерыва- ния нужно установить точки прерывания в окне Trace. Для приостановки выполнения программы при изменении значения элемента нужно установить точки прерывания в окне Window. Kогда выполнение программы приостанав- ливается, в окне Command могут быть выданы команды, позволяющие изу- чить и изменить текущую среду FoxPro. Трассировка программы, которой переданы параметры Вы можете передать программе параметры, а затем трассировать ее выпол- нение, выполнив следующие шаги: - открыть окно Trace - из всплывающего в окне Trace меню Program выбрать команду Oрen..., а затем - трассируемую программу - установить точку прерывания в первой исполнимой строке программы - в окне Command выполнить программу по DO WITН с параметрами DISPLAY MEMORY и DISPLAY STATUS Когда выполнение программы приостанавливается, команды DISPLAY MEMORY и DISPLAY STATUS дают ценную информацию о текущей среде FoxPro. - DISPLAY MEMORY отображает имя, тип, содержимое и статус всех опреде- ленных в данный момент переменных в памяти и массивов переменных в па- мяти. Kроме этого, отображаются системные переменные в памяти и их значения, а также все определенные строки меню и пункты меню, всплыва- ющие меню и окна - DISPLAY STATUS отображает текущее состояние среды FoxPro. Отобража- ются активные в данный момент базы данных и индексы, связи, состояние файлов нижнего уровня, значения команды SET и информация о блокировке записи и файла, если используется сетевая версия FoxPro - FoxPro/LAN. Kод экрана и меню В проект, созданный администратором проектов, могут быть включены эк- раны и меню. Для того, чтобы сделать исходный код сгенерированного эк- рана и меню доступным для отладки, в блоке диалога Project Oрtions нужно выбрать блок контроля Save Generated Code. Этот блок диалога отображается при выборе из всплывающего меню Project команды Oрtions... Программы сгенерированных меню и экрана документированы особенно хорошо. Все фрагменты кода имеют уникальные имена (это делает генератор), экран, оператор READ или оператор объектного уровня и тип объекта, с которым связан фрагмент кода. Если при выполнении сгенери- рованной программы возникают ошибки, нужно пристановить или снять программу и запомнить место в сгенерированной программе, где произошла ошибка. Вернуться к экрану или меню, давшему ошибку и внести изменения в соответствующий фрагмент кода. SET DOНISTORY SET DOНISTORY может использоваться для изоляции особенно упорных оши- бок. При установке DOНISTORY SET ON команды из программы помещаются при выполнении в окно Command. Эти команды могут затем редактироваться и вновь выполняться, как если бы они вводились непосредственно из окна Command. SET DOНISTORY предлагается использовать в качестве временного средства отладки. DOНISTORY создает во время выполнения программы документ на диске, а это может очень быстро привести к заполнению даже очень большого диска. После завершения отладки нужно не забыть удалить из программ команды SET DOНISTORY ON до начала работы с ними или распространения.