Главная » Free Pascal » Отладка программ Free Pascal

0

Основные средства отладки достаточно консервативны. Еще на ЭВМ первого поколения программисты набирали на пульте адрес команды, на которой автома- тическое выполнение программы прекращалось, и появлялась возможность про- смотреть содержимое машинных регистров и ячеек оперативной памяти. Вторым магическим средством был перевод компьютера в пошаговый режим работы, в ко- тором очередное нажатие кнопки <ПУСК> приводило к выполнению следующей команды программы. На некоторых ЭВМ была предусмотрена возможность оста- нова работы программы в момент записи данных в ячейку с указанным адресом. Сегодня кодами машинных команд пользуются очень редкие профессионалы, да и те предпочитают более продвинутые средства вроде услуг ассемблера. Большинст- во пользователей работает с алгоритмическими языками высокого уровня. Однако старинные средства отладки сохранились в несколько модернизированном виде.

Так называемые точки останова (breakpoints) теперь задаются не по адресам машинных команд, а на входе во фрагмент исполняемой программы, соответст- вующий началу указанной строки исходного текста. Вместо просмотра содержимо- го ячеек оперативной памяти появилась возможность вывода на дисплей значений переменных и даже формул, заданных в обычном для программиста виде. Контро- лируемые таким образом выражения в англоязычной литературе обозначают тер- минами watches. Вместо однотактного режима выполнения программы по одной машинной команде появилась возможность "простукивать" исходную программу по одной строке. Конечно, каждое из этих новшеств обрастает дополнительными деталями, но, в целом, процесс развития средств отладки сохранился на первобыт- ном уровне. Основные средства отладки в среде FP IDE сосредоточены в меню Run и Debug (рис. 3.22).

Рис. 3.22. Отладочные команды системы в среде IDE Free Pascal

Начнем с возможности прерывания автоматического режима выполнения про- граммы. По команде Run ® Run (клавишный аналог — <Ctrl>+<F9>) программа начнет выполняться в автоматическом режиме, и при достаточно объемной выдаче

результатов на экран мы ничего путного увидеть не успеем. Конечно, имеется воз- можность подменить стандартный вывод записью в файл, запуская программу с параметром командной строки:

>prog.exe >1.txt

В этом случае мы сможем прочитать из файла с именем 1.txt все результаты, выданные программой, но обнаружить причины неправильной работы программы таким способом мы не сможем. Желательно остановить работу программы в по- дозрительной точке и проанализировать значения наиболее важных переменных. А потом продолжить автоматическую работу до следующей точки останова. Для назначения первой точки останова можно воспользоваться командой Goto Cursor (клавишный аналог — <F4>) из меню Run. Предварительно нужно установить кур- сор в поле редактора в ту строку, перед выполнением которой мы хотим прервать работу программы.

После выхода на первый останов и просмотра нужных данных у нас появляют-

ся следующие возможности — продолжить работу в автоматическом режиме или перейти на пошаговое выполнение программы. В первом случае можно воспользо- ваться командой Continue из меню Run (клавишный аналог — <Ctrl>+<F9>), но тогда дальнейшее выполнение программы будет до конца только автоматическим. А можно опять перевести курсор на строку следующего останова и снова восполь- зоваться командой Goto Cursor. Конечно, такой выбор следующей точки останова нельзя признать удовлетворительным. Существует и более разумный подход, но о нем — далее.

После выхода в точку останова можно продолжить работу программы в поша-

говом режиме. Для этой цели предназначены клавишные команды <F8> (аналог команды Step over) и <F7> (аналог команды Trace into). Каждое нажатие одной из этих клавиш приводит к выполнению очередной строки в исходной программе. Ес- ли выполняемая строка содержала обращение к процедуре, то по нажатию клавиши

<F8> процедура будет выполнена в автоматическом режиме, а после возврата из

процедуры сохранится пошаговый режим выполнения программы. Такой процесс целесообразен, когда вы уверены в правильности работы процедуры. Если у вас появились сомнения, то и процедуру разумно "простучать" в пошаговом режиме. В этом случае надо воспользоваться клавишей <F7>. Наконец, существует ситуа- ция, когда, выполнив несколько шагов в процедуре, вам захотелось заставить ее доработать в автоматическом режиме. На этот случай вам предлагается команда Until return (клавишный аналог — <Alt>+<F4>).

Более рациональный способ задания точек останова заключается в том, что вы

устанавливаете их заранее или добавляете при выходе в ту или иную точку про- граммы. Для того чтобы сделать текущую строку точкой останова, достаточно вы- полнить клавишную команду <Ctrl>+<F8> (аналог команды Breakpoint из меню Debug). При этом текущая строка окрасится в красный цвет. Повторное нажатие той же комбинации клавиш отменит точку останова в текущей строке, и ее цвет станет нормальным. За один присест можно набрать несколько точек останова.

Список всех точек останова, установленных к текущему моменту, можно увидеть в окне, которое появляется по команде Breakpoint List из меню Debug (рис. 3.23).

Рис. 3.23. Список точек останова

Новые точки останова можно добавлять, редактируя строки в этом окне. Вторая колонка позволяет, не удаляя точку останова из списка, сделать ее пассивной (Dis- abled) — теперь останов на ней не произойдет. Для этой цели используется кнопка Toggle (Переключить). Повторное нажатие этой кнопки меняет статус точки оста- нова на противоположный. Полное удаление точки останова осуществляется с по- мощью кнопки Delete.

Рис. 3.24. Дополнительные условия останова

Нажатие кнопки Edit открывает диалоговое окно (рис. 3.24), в котором можно оговорить дополнительные условия останова в той или иной точке. Точка останова, установленная обычным способом (<Ctrl>+<F8>), заставляет компьютер прервать выполнение программы при каждом попадании в начало соответствующей строки исходной программы. Представьте себе ситуацию, когда вы установили точку ос-

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

Поэтому условия фактического останова в данной точке программы можно до- полнить некоторыми проверками. К таким возможностям относятся:

± задание номера прохождения через данную строку (номер набирается в нижней строке диалогового окна);

± задание логического условия, при выполнении которого должен произойти ос- танов.

Логическое условие останова записывается в строке, над которой расположена надпись Conditions. Формат записи логического выражения такой же, каким вы пользуетесь в операторе if. С помощью этого средства вы можете установить си- туацию, когда, например, в данном операторе в переменную x записывается недо- пустимое (с точки зрения алгоритма) значение:

x <= 0

Нулевое значение счетчика проходов через заданную точку останова означает, что останов должен произойти при каждом попадании на заданную строку про- граммы (именно этой ситуации соответствует надпись на рис. 3.24 — Ignore count).

Если в точке останова одновременно заданы дополнительные условия останова

по счетчику и по истинности логического выражения, то для фактического остано- ва должны выполниться оба условия.

Наличие в программе нескольких точек останова позволяет перемещаться меж- ду ними в автоматическом режиме, что повышает производительность отладки.

Теперь о возможностях просмотра значений переменных и выражений в точках останова. Первая из них заключается в том, что предварительно с помощью коман- ды Add Watch из меню Debug мы набираем нужные имена и формулы в откры- вающемся окне (рис. 3.25).

В момент останова с помощью команды Watches из меню Debug в нижней час- ти экрана открывается окно, в котором представлены все набранные выражения и значения тех из них, которые можно было сосчитать в этой точке.

Рис. 3.25. Окно для набора контролируемого выражения

Вторая возможность оценить значение выражения, не включенного в список Watches, предоставляется командой Evaluate (Вычислить). Соответствующее диа- логовое окно представлено на рис. 3.26.

Рис. 3.26. Окно для вычисления значения выражения

Операнды выражения, набираемого в поле Expression, должны быть доступны в текущей точке останова.

Дополнительным средством отладки является использование системной про- цедуры Assert (от англ. assert — утверждать), допускающей один из двух следую- щих форматов вызова:

Assert(условное_выражение); Assert(условное_выражение, сообщение);

Если в момент выполнения процедуры Assert условное выражение принимает значение True, то работа процедуры завершается без каких-либо дополнительных действий и выполнение программы продолжается. В случае нарушения заданного условия процедура Assert прекращает выполнение программы и выдает либо сис- темное сообщение, либо сообщение, предусмотренное вторым аргументом в обра- щении. Процедура Assert функционально дублирует действия, возникающие в точке останова, нагруженной дополнительным логическим условием. Разница только в том, что точка останова переводит программу в режим ручного изучения возникшей ситуации. Использование процедуры Assert не приводит к таким за- держкам и позволяет включить в окно вывода программы дополнительное смысло- вое сообщение по поводу происшедшего события. Кроме того, несколько одинако- вых обращений к процедуре Assert можно включить в конце каждого участка программы, подозреваемого в нарушении условий правильного функционирования алгоритма.

Обращения к процедурам Assert будут проигнорированы компилятором, если вы не включите в текст своей программы соответствующую разрешающую дирек- тиву (листинг 3.1).

   Листинг 3 .1 .  Ис пол ьзова ние  про цед уры  Assert                                 

program assert1;

{$ASSERTIONS ON}

var

x : integer=1; y : integer=1;

begin

x := x-1;

assert(x<>0,’Значение x равно 0′);

y := y div x; writeln(y); readln;

end.

Окно вывода этой программы содержит строку с предусмотренным сообщени- ем и координатами точки, в которой было обнаружено нарушение условия:

Running "c:\fpc\myprog\assert1.exe "

Значение x равно 0 (Assert1.pas, line 8).

Дополнительно выдается сообщение в диалоговом окне, представленном на рис. 3.27.

Рис. 3.27. Сообщение процедуры Assert

Если бы в обращении к процедуре Assert отсутствовал второй аргумент, то в окне вывода программы появилось бы системное сообщение:

Assertion failed (Assert1.pas, line 8).

Для отладки программы ее следует компилировать с отладочной информацией. Это происходит в следующих случаях:

± программа выполняется шаг за шагом;

± программа запускается до попадания в одну из точек останова;

± во время выполнения программы осуществляется контроль за содержимым пе- ременных или ячеек памяти.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии