4826

Отладка программ на языке Pascal

Лекция

Информатика, кибернетика и программирование

Отладка программ Цель: Дать студентам понятие ошибки, причины их возникновения. Задачи: Воспитательная: любая программа несовершенна, всегда находятся ошибки, исправить которые требует время. Учебная: обнаруживать ошибки и вовремя исправлять их. Раз...

Русский

2012-11-27

185 KB

4 чел.

Отладка программ

Цель:

Дать студентам понятие ошибки, причины их возникновения.

Задачи:

Воспитательная: любая программа несовершенна, всегда находятся ошибки, исправить которые требует время.

Учебная: обнаруживать ошибки и вовремя исправлять их.

Развивающая: развитие внимательности.

План занятия.

  1.  Организационный момент.
  2.  Изучение нового материала.
  3.  Контрольные вопросы.
  4.  Резюме.
  5.  Домашнее задание.

Изучение нового материала.

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

Классификация ошибок

   Ошибки, которые могут быть в программе, принято делить на три группы:

  •  Синтаксические ошибки, их также называют ошибками времени компиляции (Compile-time error), наиболее легко устранимы. Синтаксические ошибки обнаруживаются компилятором автоматически. Сообщения о найденных ошибках отображаются в нижней части редактора, в небольшом окне.

При двойном щелчке на строке с сообщением об ошибке система Delphi 7 переключится в редактор, где подсветит строку, в которой эта ошибка обнаружена. Само сообщение (на английском языке) описывает ошибку достаточно подробно, чтобы можно было понять ее причину. Процесс устранения ошибок носит итерационный характер. Сначала устраняются наиболее очевидные ошибки, например, декларируются необъявленные переменные. После очередного внесения изменений в текст программы выполняется повторная компиляция. Следует учитывать тот факт, что компилятор не всегда может локализовать ошибку. Поэтому, анализируя фрагмент программы, который по мнению компилятора, содержит ошибку, нужно обратить внимание не только на тот фрагмент кода, на который компилятор установил курсор, но и на тот, который находится в предыдущей строке.

Наиболее типичные ошибки и соответствующие

им сообщения компилятора

Сообщения компилятора

Вероятная причина

Undeclared identifier

(необъявленный идентификатор)

Unterminated string

(Незавершенная строка)

Incompatible typesand

(Несовместимые типы)

Missing operator or semicolon

(Отсутствует оператор или точка с запятой)

а) Используется переменная, не объявленная в разделе var.

б) Ошибка при написании имени объявленной переменной.

в) Ошибка при написании имени инструкции.

При записи строковой константы, например сообщения, не поставлена завершающая кавычка.

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

После инструкции не поставлена точка с запятой.

Если компилятор обнаружил много ошибок, то просмотреть все сообщения, устранить сначала очевидные ошибки и выполнить повторную компиляцию. После этого количество ошибок уменьшится.

  •  Ошибки времени выполнения, в Delphi они называются исключениями (exception), тоже, как правило, легко устранимы. Они обычно проявляются уже при первых запусках программы и во время тестирования. При возникновении ошибки в программе, запущенной из Delphi, среда разработки прерывает работу программы, о чем свидетельствует заключенное в скобки слово Stopped в заголовке главного окна Delphi, и на экране появляется диалоговое окно, которое содержит сообщение об ошибке и информацию о типе (классе) ошибки. На рис. приведен пример сообщения об ошибке, возникающей при попытке открыть несуществующий файл.

   После возникновения ошибки программист может либо прервать выполнение программы, для этого надо из меню Run выбрать команду Program Reset, либо продолжить ее выполнение, например, по шагам (для этого из меню Run надо выбрать команду Step), наблюдая результат выполнения каждой инструкции.

   Если программа запущена из Windows, то при возникновении ошибки на экране также появляется сообщение об ошибке, но тип ошибки (исключения) в сообщении не указывается. После щелчка на кнопке ОК программа, в которой проявилась ошибка, продолжает (если сможет) работу.

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

Предотвращение и обработка ошибок

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

try

   // здесь инструкции, выполнение которых может вызвать исключение

   except // начало секции обработки исключений 

       on ТипИсключения1 do Обработка1;

       on ТипИсключения2 do Обработка2;

       on ТипИсключенияJ do ОбработкаJ;

   else

   // здесь инструкции обработки остальных исключений

end;

где:

  •  try — ключевое слово, обозначающее, что далее следуют инструкции, при выполнении которых возможно возникновение исключений, и что обработку этих исключений берет на себя программа;
  •  except — ключевое слово, обозначающее начало секции обработки исключений. Инструкции  этой секции будут выполнены, если в программе возникнет ошибка;
  •  on — ключевое слово, за которым следует тип исключения, обработку которого выполняет  инструкция, следующая за do;
  •  else — ключевое слово, за которым следуют инструкции, обеспечивающие обработку  исключений, тип которых не указаны в секции except.

Как было сказано выше, основной характеристикой исключения является его тип. В таблице перечислены наиболее часто возникающие исключения и указаны причины, которые могут привести к их возникновению.

Таблица. Типичные исключения

Тип исключения

Возникает

EZeroDivide

При выполнении операции деления, если делитель равен нулю

EConvertError

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

EFilerError

При обращении к файлу. Наиболее частой причиной является отсутствие требуемого файла или, в случае использования сменного диска, отсутствие диска в накопителе

   Следующая программа, вид диалогового окна которой приведен на рис., а текст — в листинге, демонстрирует обработку исключений при помощи инструкции try.

Листинг. Обработка исключения типа EZeroDivide

unit UsTry_;

interface

uses

   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

   TForm1 = class(TForm)

       Label1: TLabel;

       Label2: TLabel;

       Label3: TLabel;

       Label4: TLabel;

       Editl: TEdit; // напряжение 

       Edit2: TEdit; // сопротивление

       Label5: TLabel; // результат расчета - ток

       Button1: TButton; //кнопка Вычислить

       procedure ButtonlClick(Sender: TObject);

   private

       { Private declarations )

   public

       { Public declarations }

   end;

var

   Form1: TForm1;

implementation

   {$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var

   u: real; // напряжение 

   r: real; // сопротивление

   i: real; // ток 

begin

   Label5.Caption := ' ';

   try

       // инструкции, которые могут вызвать исключение (ошибку)

       u := StrToFloat(Edit1.Text);

       r := StrToFloat(Edit2.Text);

       i := u/r;

   except // секция обработки исключений

       on EZeroDivide do // деление на ноль 

           begin

               ShowMessage('Сопротивление не может быть равно нулю!');

              exit;

           end;

       on EConvertError do // ошибка преобразования строки в число 

           begin

               ShowMessage('Напряжение и сопротивление должны быть ' +

               'заданы числом. ' +#13+

               'При записи дробного числа используйте запятую.';

               exit;

          end;

       end;

       Label5.Caption := FloatToStr(i) + ' A';

end;

end.

В приведенной программе исключения могут возникнуть при вычислении величины тока. Если пользователь задаст, что сопротивление равно нулю, то при выполнении инструкции i:=u/r возникает Исключение EZeroDivide. Если неверно будет введено числовое значение, например, для разделения целой и дробной частей числа вместо запятой будет использована точка, то возникнет исключение типа EConvertError. Оба исключения обрабатываются одинаково: выводится сообщение, после чего процедура обработки события Onclick завершает свою работу.

Отладчик

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

   Трассировка программы

   Во время работы программы ее инструкции выполняются одна за другой со скоростью работы процессора компьютера. При этом программист не может определить, какая инструкция выполняется в данный момент, и, следовательно, определить, соответствует ли реальный порядок выполнения инструкций разработанному им алгоритму. В случае неправильной работы программы необходимо видеть реальный порядок выполнения инструкций. Это можно сделать, выполнив трассировку программы. Трассировка — это процесс выполнения программы по шагам (step-by-step), инструкция за инструкцией. Во время трассировки программист дает команду: выполнить очередную инструкцию программы.

   Delphi обеспечивает два режима трассировки: без захода в процедуру (Step over) и с заходом в процедуру (Trace into). Режим трассировки без захода в процедуру выполняет трассировку только главной процедуры, при этом трассировка подпрограмм не выполняется, вся подпрограмма выполняется за один шаг. В режиме трассировки с заходом в процедуру выполняется трассировка всей программы, т. е. по шагам выполняется не только главная программа, но и все подпрограммы.

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

   Активизировать и выполнить трассировку можно при помощи функциональной клавиатуры. Команде Step over соответствует клавиша <F8>, а команде Trace into — клавиша <F7>.

   В любой момент времени можно завершить трассировку и продолжить выполнение программы в реальном темпе. Для этого надо из меню Run выбрать команду Run.

   При необходимости выполнить трассировку части программы следует установить курсор на инструкцию программы, с которой надо начать трассировку, и из меню Run выбрать команду Run to cursor или нажать клавишу <F4>. Затем, нажимая клавишу <F7> или клавишу <F8>, выполнить трассировку нужного фрагмента программы.

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

   Точки останова программы

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

   Добавление точки останова Для того чтобы поставить в программу точку останова (breakpoint), нужно из меню Run выбрать команду Add Breakpoint (Добавить точку останова), затем из меню следующего уровня — команду Source Breakpoint. В результате открывается диалоговое окно Add Source Breakpoint, в котором выводится информация о добавляемой точке останова.

  •  Поле Filename содержит имя файла программы, куда добавляется точка останова.
  •  Поле Line number — номер строки программы, в которую добавляется точка останова.
  •  О назначении полей Condition (Условие) и Pass count (Число пропусков) будет сказано далее.

   После щелчка на кнопке ОК точка останова добавляется в программу, и строка, в которой находится точка останова, помечается красной точкой и выделяется цветом.

   Точку останова можно добавить, щелкнув мышью на синей точке, помечающей ту инструкцию программы, перед которой надо поместить точку останова (если в программе нет ошибок, то компилятор помечает выполняемые инструкции программы синими точками).

   Для точки останова можно задать условие, при выполнении которого программа приостановит свою работу в данной точке (например, если значение переменной равно определенной величине). Условие (логическое выражение) вводится в поле Condition диалогового окна Add Source Breakpoint.

   Если для точки останова задано условие, то программа приостанавливает свою работу только в том случае, если выражение, находящееся в поле Condition, истинно (его значение равно TRUE). Кроме условия для точки останова, можно задать количество пропусков данной точки. Если во время добавления в программу точки останова в поле Pass count (Число пропусков) диалогового окна Add Source Breakpoint записать отличное от нуля число, то программа приостановит свою работу в этой точке только после того, как инструкция, находящаяся в строке, помеченной точкой останова, будет выполнена указанное число раз.

   Изменение характеристик точки останова Программист может изменить характеристики точки останова. Для этого надо из меню View выбрать команду Debug Windows, затем из меню следующего уровня — команду Breakpoints. В открывшемся диалоговом окне Breakpoint List нужно щелкнуть правой кнопкой мыши в строке, содержащей информацию о нужной точке останова, и в появившемся контекстном меню выбрать команду Properties. В результате открывается диалоговое окно Source Breakpoint Properties, в котором можно изменить характеристики точки останова, например, изменить условие (содержимое поля Condition) остановки программы в данной точке. Используя это же контекстное меню, можно быстро перейти к инструкции, в которой находится точка останова; для этого надо выбрать команду Edit Source.

   

   Удаление точки останова Для того чтобы удалить точку останова, нужно в диалоговом окне Breakpoint List щелкнуть правой кнопкой мыши в строке, содержащей информацию о точке, которую надо удалить, и в появившемся контекстном меню выбрать команду Delete. Можно также в окне редактора кода щелкнуть мышью на красной точке, помечающей строку, в которой находится точка останова.

    Наблюдение значений переменных Во время отладки, в частности, при выполнении программы по шагам, довольно часто бывает полезно знать, чему равно значение той или иной переменной. Отладчик позволяет наблюдать значения переменных программы. Для того чтобы во время выполнения программы по шагам иметь возможность контролировать значение переменной, нужно добавить имя этой переменной в список наблюдаемых элементов (Watch List). Для этого надо из меню Run выбрать команду Add Watch (Добавить наблюдаемый элемент) и в поле Expression появившегося диалогового окна Watch Properties ввести имя переменной.

   В результате в список Watch List, содержимое которого отражается в диалоговом окне Watch List, будет добавлен новый элемент. Так как переменные программы существуют (и, следовательно,  доступны) только во время выполнения программы, то после имени переменной выводится сообщение: process not accessible (процесс недоступен).

   В качестве примера на рис. приведен вид окна редактора кода и окна Watch List во время пошагового выполнения программы сортировки массива.

   В окне редактора кода стрелкой помечена инструкция, которая будет выполнена на следующем шаге выполнения программы (при нажатии клавиши <F8> или при выборе команды Step Over из меню Run), в диалоговом окне Watch List выведены значения переменных.

   Существует еще один способ, позволяющий проверить значение переменной, не добавляя ее имя в список Watch List. Заключается он в следующем. После того как программа достигнет точки останова, в результате чего откроется окно редактора кода, нужно установить курсор мыши на имени переменной, значение которой надо проверить. В окне редактора кода появится окно подсказки, в котором будет выведено значение переменной.

Чтобы завершить процесс пошагового выполнения программы, нужно из меню Run выбрать команду Program Reset.

Контрольные вопросы

  1.  Что такое отладка?
  2.  Классификация ошибок.
  3.  Типичные ошибки и соответствующие им сообщения компилятора.
  4.  Предотвращение и обработка ошибок.    
  5.  Понятие исключения.

Резюме

  1.  Процесс поиска и устранения ошибок называется отладкой.
  2.  Ошибки бывают синтаксические, ошибки времени исполнения, алгоритмические.
  3.  Обработку исключений (ошибок) берет на себя автоматически добавляемый в выполняемую программу код, который обеспечивает, в том числе, вывод информационного сообщения. Вместе с тем Delphi дает возможность программе самой выполнить обработку исключения.
  4.  Нарушение в работе программы называется исключением.
  5.  Процесс устранения ошибок носит итерационный характер. Сначала устраняются наиболее очевидные ошибки, например, декларируются необъявленные переменные. После очередного внесения изменений в текс программы выполняется повторная компиляция.

Домашнее задание

   Исправить ошибки, полученные в результате компиляции.


 

А также другие работы, которые могут Вас заинтересовать

25935. Разрядники: назначение, конструкция, принцип действия. Вентильные и трубчатые разрядники. Нелинейные ограничители перенапряжения (ОПН): назначение, конструкция, принцип действия. Условия выбора 52.5 KB
  Нелинейные ограничители перенапряжения ОПН: назначение конструкция принцип действия. В результате пробоя в трубке возникает интенсивная газогенерация и через выхлопное отверстие образуется продольное дутье достаточное для погашения дуги . ОПН Ограничитель перенапряжения нелинейный ОПН это разрядник без искровых промежутков. Активная часть ОПН состоит из последовательного набора варисторов.
25936. Устройство защитного отключения (УЗО). Назначение, схема подключения 53 KB
  Устройство защитного отключения УЗО. Устройство защитного отключения УЗО; более точное название: Устройство защитного отключения управляемое дифференциальным остаточным током сокр. УЗО−Д механический коммутационный аппарат или совокупность элементов которые при достижении превышении дифференциальным током заданного значения при определённых условиях эксплуатации должны вызвать размыкание контактов. Основная задача УЗО защита человека от поражения электрическим током и от возникновения пожара вызванного утечкой тока через...
25937. Конструкция и принцип действия воздушных выключателей. Достоинства и недостатки. Условия выбора. Сравнение с другими высоковольтными выключателями 27.5 KB
  Воздушные выключатели обладают высокими техническими характеристиками. Сетевые выключатели на напряжение 6кВ и выше применяемыев электрических сетях и предназначенные для пропуска и коммутации тока в нормальных условиях работы цепи и в условиях КЗ. Генераторные выключатели на напряжение 624 кВ предназначенные для пропуска и коммутации токов в нормальных условиях а также в пусковых режимах и при КЗ. Выключатели для электротермических установок с напряжениями 6220 кВ предназначенные для работы как в нормальных так и в аварийных режимах 4.
25938. Конструкция и принцип действия элегазовых выключателей. Достоинства и недостатки. Условия выбора. Сравнение с другими высоковольтными выключателями 23 KB
  В элегазовых выключателях гашение дуги происходит так же как и в воздушных выключателях при интенсивнои охлаждении дуги потоком газа. В элегазовых дугогасительных устройствах в отличие о воздушных при гашении дуги истечение газа через сопло происходит не в атмосферу а в замкнутый объем камеры заполненный элегазом при небольшом избыточном давлении. По способу гашения дуги в элегазе различают следующие ДУ: с системой продольного дутья в которую предварительно сжатый воздух поступает из резервуара с относительно высоким давлением элегаза ДУ...
25939. Выключатели нагрузки. Назначение, конструктивное исполнение и принцип действия выключателей нагрузки. Условия выбора 21 KB
  Выключатели нагрузки. Назначение конструктивное исполнение и принцип действия выключателей нагрузки. Выключатели нагрузки используются для оперативного соединения и разъединения цепи. Выключатель нагрузки обеспечивает двухкратное включение нормированного для него тока включения на короткое замыкание без повреждений препятствующих его дальнейшей работе в нормальном и эксплуатационном режиме.
25940. Расчет деревянных, металлических, железобетонных перекрытий 1.07 MB
  Орел 2011 Расчет деревянного перекрытия Подобрать сечение деревянной балки для перекрытия жилого дома.Предварительно принимаем собственный вес одного метра балки qnбалки=025кН м;f=1.1 qбалки= qnбалки f=0.Собираем нагрузку на погонный метр балки с учетом её собственного веса: qn=qnперекрытияlгр qnбалки=18140275=277кН м; q= qперекрытияlгр qбалки=234120275=3083кН м.
25941. СБОРНО-МОНОЛИТНЫЕ КОНСТРУКЦИИ 26.5 KB
  СБОРНОМОНОЛИТНЫЕ КОНСТРУКЦИИ конструкции состоящие из заранее изготовленных на заводах отд. Наибольшее распространение получили сборномонолитные конструкции со сборными элементами из железобетона см. Железобетонные конструкции . арматуру конструкции и иногда используются в качестве формы опалубки для монолитного бетона; их целесообразно делать предвари тсльно напряженными.
25942. Здания и сооружения из монолитного железобетона 31 KB
  Монолитные конструкции несущего остова здания представляют собой неразрезные элементы наружных и внутренних несущих стен колонн ригелей и перекрытий жестко связанных между собой в пространственную систему работающую под нагрузкой как единое целое. Здания из монолитного железобетона разделяются на монолитные и сборномонолитные и выполняются по следующим конструктивным схемам: монолитные несущие и ограждающие конструкции; монолитный каркас колонны и перекрытия наружные и внутренние стены сборные или каменных материалов; монолитные...
25943. Больше пролетные покрытия – плоскостные покрытия 68.5 KB
  Плоскостными покрытиями называют конструкции работающие только в одной вертикальной плоскости проходящей через опоры; к ним относятся балки фермы рамы арки; к ним следует отнести и те конструкции которые можно разрезать вертикальными плоскостями вдоль пролета на отдельные элементы причем каждый элемент независимо от другого будет тоже работать как плоскостной. К распорным плоскостным покрытиям относят своды арки рамы.