9756

Изучение принципов функционирования отладчика среды

Лекция

География, геология и геодезия

Цель лекции: Изучить состав и структуру приложения. Изучить принципы функционирования отладчика среды. Учебные вопросы: 1. Состав и структура приложения. Файл проекта. Модуль формы. Разделы модуля формы. Связи между файлами проекта. 2. О...

Русский

2013-03-16

6.08 MB

2 чел.

Цель лекции:

  1.  Изучить состав и структуру приложения.
  2.  Изучить принципы функционирования отладчика среды.

Учебные вопросы:

1. Состав и структура приложения.

Файл проекта. Модуль формы. Разделы модуля формы. Связи между файлами проекта.

2. Отладка приложения.

Актуальность проблемы отладки. Синтаксические ошибки. Логические ошибки. Стандартная техника отладки приложения. Отладчик интегрированной среды.

Литература:

1. [10] стр. 310 – 321.    2. [11] стр. 63 - 69.

Материальное обеспечение:

1. Дидактические материалы по теме лекции.

2. Выставка литературы.

3. Диапроектор «Лектор».

4. Слайды.

Уровни обученности:

иметь представление:

- о возможностях технологии визуального программирования и путях ее применения в промышленности, научных исследованиях, организационном управлении и других областях;

знать:

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

Распределение времени:

Вводная часть -               10    мин.

Учебный вопрос №1 -    30    мин.

Учебный вопрос №2 -    45    мин.

Заключительная часть -  5      мин.

Фундаментальные понятия:

Приложение. Главный модуль приложения. Модуль формы. Отладчик среды.

Актуальность лекции:

Работа над проектом требует знания его состава и структуры каждого модуля. Каждая из составных частей модуля имеет свое конкретное назначение и структуру.

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

Приемы активизации обучаемых:

Основная часть

Вопрос 1. Состав и структура приложения.

Программа Delphi - это несколько связанных между собой файлов.

Так, любая программа всегда состоит из уже знакомого нам файла проекта (такой файл имеет расширение .dpr) и одного или нескольких модулей (файлы с расширением .pas).

 

Файл проекта не предназначен для редактирования пользователем и создается автоматически самой системой программирования Delphi. Для того чтобы увидеть содержимое файла проекта, необходимо выполнить команду Project  -  View Source. Содержимое файла проекта может быть, например, следующим:

program Project1; {название программы}

uses {подключение необходимых модулей}

   Forms,

   Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin

   Application.Initialize; {инициализация программы}

   Application.CreateForm(TForm1, Form1); {создание формы}

   Application.Run; {запуск программы}

end. {завершение работы программы}

Файл проекта (главный модуль) начинается словом program, за которым следует имя программы, совпадающее с именем проекта. Имя проекта задается программистом в момент сохранения файла проекта, и оно определяет имя создаваемого средой Delphi исполняемого файла (файла с расширением .ехе). Далее за словом uses следуют имена используемых модулей: стандартного модуля Forms и модуля формы Unitl. Похожая на комментарий директива {$R *.RES} указывает компилятору, что нужно использовать файл ресурсов, который содержит описание ресурсов приложения, например, пиктограммы. Звездочка указывает, что имя файла ресурсов такое же, как и у файла проекта, но с расширением .res.

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

В разделе исполняемых операторов формируются как минимум три оператора: вызовы методов Initialize, CreateForm и Run глобального объекта Application. Метод Initialize предусмотрен «на всякий случай» и по умолчанию ничего не делает. За вызовом метода Initialize следует один или несколько операторов обращения к методу CreateForm, с помощью которого создается окно Главной формы, а также все другие окна, включенные в список Auto-create forms вкладки Forms окна Project Options (вызывается командой Project - Options). Обычно в программе нет  необходимости создавать сразу все окна - пользователь на самом деле вначале будет работать лишь с главным окном, а все остальные можно создавать программно по мере надобности. По умолчанию на вкладке Designer окна Environment Options (открывается командой Tools - Environment Options) установлен флажок Auto create forms & data modules, что заставляет Delphi помещать любую новую форму в список Auto-create forms и формировать соответствующий оператор обращения к методу CreateForm в файле проекта. Если перед началом работы над проектом снять этот флажок или на вкладке Forms окна Project Options и перенести ненужные формы в список Available forms, можно существенно сократить время загрузки программы.

Помимо главного модуля каждая программа включает как минимум один модуль формы, который содержит описание стартовой формы приложения и поддерживающих ее работу процедур. В Delphi каждой форме соответствует свой модуль. Для переключения между формой и окном редактора кода, содержащего соответствующий модуль, следует выполнить команду главного меню View  - Toggle Form/Unit, либо нажать функциональную клавишу F12, либо на панели инструментов  щелкнуть мышью по кнопке: 

Модули - это программные единицы, служащие для размещения фрагментов программ. При помощи содержащихся в них текстов программ (программных кодов) и реализуется решаемая пользователем задача.

Модули имеют стандартную конструкцию (последовательность и перечень разделов), предусмотренную языком программирования Object Pascal. Приведем структуру модуля в общем виде:

unit   { имя  модуля };

 interface

uses {список используемых модулей}

{описание интерфейсной части модуля}

………….

 implementation

 uses {список используемых модулей}

  {реализация подпрограмм, описанных в интерфейсной части}

  …………………..

 initialization

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

   ………………….

          finalization

           { необязательная часть инициализации модуля, которая выполняется при любом завершении модуля}

             …………………..

end. {конец модуля}

В качестве примера приведем содержимое модуля в том виде, в котором он находится сразу после загрузки среды Delphi:

unit Unit1;

  interface

    uses

       Windows, Messages, SysUtils, Classes, Graphics,

       Controls, Forms, Dialogs;

   type

        TForm1 = class(TForm)

        private    { Private declarations }

        public    { Public declarations }

   end;

  var

      Form1: TForm1;

implementation

{$R *.DFM}

end.

Начинается модуль словом unit, за которым следует имя модуля. Именно это имя упоминается в списке используемых модулей в операторе uses главного модуля приложения.

Модуль может состоять из четырех разделов: интерфейса, реализации, инициализации и завершающей части.

Раздел интерфейса (начинается словом interface. В этой части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны стать доступными основной программе и(или) другим модулям. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок.  В этом разделе перечислены (после слова uses) стандартные модули, используемые данным модулем, а также находится сформированное Delphi описание типа формы, которое следует за словом type.

 Список модулей после слова uses - список  модулей, с которыми устанавливается связь; элементами списка являются имена модулей, отделяемые друг от друга запятыми. Если объявление Uses присутствует, оно должно открывать раздел описаний основной программы. Модули могут использовать другие модули. Предложение Uses в модулях может следовать либо сразу за зарезервированным словом interfасе, либо сразу за словом implementation, либо, наконец, в обоих местах (то есть в модуле допускаются два предложения Uses, однако модули второго объявления недоступны в интерфейсной части, в то время как модули первого доступны везде).

Раздел реализации начинается словом implementation и содержит объявления локальных переменных, процедур и функций, поддерживающих работу формы. В начале раздела реализации располагается директива {$R *.dfm}, указывающая компилятору, что в раздел реализации надо вставить команды установки значений свойств формы, которые находятся в файле с расширением .dfm, имя которого совпадает с именем модуля. Файл в формате dfm генерируется Delphi на основе внешнего вида формы.

За директивой {$R *.dfm} располагаются описания процедур обработки событий формы. Сюда же программист может поместить описание своих процедур и функций, которые могут вызываться из процедур обработки событий. Все объекты исполняемой части недоступны вне модуля. Описанию подпрограммы, объявленной в интерфейсной части модуля, в исполняемой части должен предшествовать заголовок, в котором можно опускать список формальных параметров (и тип результата для функции), так как они уже описаны в интерфейсной части. Но если заголовок подпрограммы приводится в полном виде, то есть со списком формальных параметров и объявлением результата, он должен совпадать с заголовком, объявленным в интерфейсной части. Повторение заголовка в исполняемой части должно быть полным и точным.

Инициирующая и завершающая части являются необязательными и чаще всего отсутствуют.

Инициирующая часть начинается словом initialization либо заключается в операторные скобки begin...end . Операторы из этой части выполняются до передачи управления основной программе и обычно используются для подготовки ее работы.

Завершающая часть начинается словом finalization и содержит операторы, выполняющиеся в момент окончания программы.

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

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

В приведенном выше примере модуля инициирующая и завершающая части отсутствуют. 

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

При компиляции программы Delphi создает файлы с расширениями .dcu для каждого модуля.

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

ВОПРОС 2. Отладка приложения.

Актуальность проблемы отладки. Сразу с первого запуска правильно работать может только очень маленькая программа. Если объем исходного кода превышает хотя бы десять строк, то этап отладки становится необходимым.

Термин синтаксис означает структуру кода, а семантика - значение кода или соотношение кода с решаемой задачей.

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

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

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

Приведенный ниже фрагмент кода содержит синтаксическую ошибку.

procedure TformSyntaxError. DoExample (Sender: TObject) ;

   var

     thisValue: Integer;

begin

      thiValue := 10;

      memOutput.Clear;

      memOutput.Lines.Add('thisValue = ' + IntToStr(thisValue));

end;

Ошибка состоит в том, что в операторе присваивания неправильно введено имя thisValue. Если бы этот код выполнялся, то компьютер попытался бы присвоить значение 10 несуществующей переменной thiValue. Это наиболее распространенный вид синтаксических ошибок. Однако в Object Pascal каждая переменная всегда объявляется явно, поэтому компилятор Delphi автоматически обнаруживает синтаксические ошибки во время компиляции.

Синтаксическая ошибка - это ошибка в структуре кода (в написании, грамматике или пунктуации).

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

Первая найденная ошибка выделяется бардовой полосой. Для перехода к другим ошибкам, описанным в окне  Message, необходимо выделить соответствующую строку сообщения, щелкнуть правой кнопкой мыши и в контекстном меню выбрать команду Edit Sourse (изменить источник).

После исправления всех ошибок необходимо выполнить перекомпиляцию проекта.

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

procedure TformLogicError.DoExample(Sender: TObject);

   var

        number: Real;

begin

   number := 10.0;

   memOutput.Clear;

   repeat

         memOutput.Lines.Add(Format( ' %5.2n ',    [number]));

          number   :=  number  -   3.0  /  4.0;

   until  number  =  0.0;

end;

Логическая ошибка находится в предложении until. Переменная number никогда не будет равна 0.0, следовательно, код содержит бесконечный цикл. Чтобы прекратить выполнение бесконечного цикла в среде разработки Delphi, выберите в главном меню команду Run - Program Reset (Выполнить - Восстановить программу) или нажмите клавиши «Ctrl+F2» при активном окне среды Delphi. Чтобы исправить эту ошибку, нужно заменить предложение until следующим:

until number <= 0.0;

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

Типичными логическими ошибками являются бесконечные циклы (как в нашем примере) и ошибки в математических формулах. Транслятор не обнаруживает логических ошибок.

Чтобы предотвратить ошибки времени выполнения, программист должен предусмотреть в программе проверку всех данных, вводимых пользователем. Защита от ошибок предотвращает крах программы в результате случайного или злонамеренного ввода неправильных данных. Одна из наиболее распространенных ошибок времени выполнения - деление на нуль. Рассмотрим следующий фрагмент кода.

procedure TformNoErrorProof.ComputeRates(Sender: TObject);

       var

           distancel, distance2, distance3 : Real;
                      timel, time2, time3 : Real;

            ratel, rate2, rate3 : Real;

            code : Integer;

begin

    Val(edtDistancel.Text, distancel, code);

    Val(edtTimel.Text, timel, code);

     ratel := distancel/timel;

    Val (edtDistance2.Text,  distance2, code);

    Val (edtTime2.Text, time2,  code);

     rate2 := distance2/time2;

    Val (edtDistance3.Text,  distance3,  code);

    Val (edtTime3.Text,  time3,  code);

    rate3 := distance3/time3;

    memOutput.Clear;

    memOutput.Lines.Add (' Rate 1: '   +  Format ( ' %6.2n ',    [ratel] ));

    memOutput.Lines.Add (' Rate 2:  '  +  Format ( ' %6.2n ',    [rate2] ));

    memOutput.Lines.Add (' Rate 3:  '  +  Format ( ' %6.2n ',    [rate3] ));

end;

Программа вычисляет скорость rate на основе введенных пользователем значений расстояния distance и времени time. Исходный код отлажен и сам по себе работает правильно. Но что произойдет, если пользователь ошибочно запишет в поле ввода edtTime1 нулевое значение? Программа присвоит переменной time1 значение 0.0, а затем попытается вычислить rate1 путем деления distance1 на time1. Естественно, при этом произойдет ошибка деления на нуль и выполнение программы прекратится. Поскольку окно программы закроется, то пользователю трудно будет понять, что произошло. Что будет, если пользователь введет в edtTime1 строку, не содержащую число. В этом случае опять произойдет ошибка деления на нуль.

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

В Object Pascal строку в число преобразует процедура Val (). Ее фактический параметр code можно использовать для проверки вводимых пользователем данных. Если строку нельзя преобразовать в число, то процедура Val () помещает в переменную code индекс первого неправильного символа. В противном случае (если преобразование может быть выполнено) переменной code присваивается нулевое значение. В предыдущем фрагменте кода (как и во всех предыдущих примерах) результирующее значение переменной code игнорировалось. В следующем фрагменте кода переменная code используется для предотвращения деления на нуль:

procedure TformErrorProof.ComputeRates(Sender: TObject);

   var

       distancel, distance2, distance3: Real;

        timel, time2, time3: Real;

        ratel, rate2, rate3: Real;

       distCode, timeCode: Integer;

begin

       memOutput.Clear;

       Val (edtDistancel.Text, distancel, distCode);

       Val (edtTimel.Text, timel, timeCode);

       if (distCode <> 0) or (timeCode <> 0) then

       memOutput.Lines.Add (' Пожалуйста, введите правильные значения ' +

       '  расстояния и времени 1. ' )

                                                                      else

          if (distancel < 0.0) then

      memOutput.Lines.Add (' Пожалуйста, введите неотрицательное

      значение ' + ' расстояния 1.' )

                                          else

                if (timel <= 0.0) then

      memOutput.Lines.Add('Пожалуйста, введите положительное время1.')

                                          else

     begin

        ratel := distancel/timel;

        memOutput.Lines.Add (' Скорость 1: ' + Format (' %6.2n ', [ratel] ));

     end;

…………………………………………………………………………………

end;

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

procedure TformGotoErrorProof.ComputeRates(Sender: TObject);

   label

      nonNumber,   valueError;

  var

    distancel, distance2, distance3: Real;
               timel, time2, time3:Real;

     ratel, rate2, rate3: Real;

    distCode, timeCode: Integer;

begin

      memOutput.Clear;

      Val (edtDistancel.Text, distancel, distCode);

      Val (edtTimel.Text, timel, timeCode);

      if (distCode <> 0) or (timeCode <> 0) then

                goto nonNumber;

      if (distancel < 0.0) or (timel <= 0.0) then

                goto valueError;

       ratel := distancel/timel;

       memOutput.Lines.Add(' Скорость 1: ' +Format(' %6.2n ', [ratel] ));

…………………………………………………………………………..

       Exit;

       nonNumber:

       memOutput.Lines.Add (' Пожалуйста, введите вещественные числа ' +

        ' в поле ввода,  расположенное выше.' );

       Exit;

       ValueError:

       memOutput.Lines.Add (' Пожалуйста, введите неотрицательные

       значения '  + ' расстояний ');

       memOutput.Lines.Add (' и положительные значения времени.');

end;

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

Метка - это идентификатор, отмечающий определенный оператор исходного кода. Объявление метки, оператор goto и помеченный оператор должны находиться в одном и том же программном блоке (иметь одинаковую область видимости). Следовательно, выполнить безусловный переход из одной подпрограммы в другую невозможно. Кроме того, каждый помеченный оператор в одном и том же блоке должен иметь уникальную метку, невозможно пометить два оператора одной и той же меткой.

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

Использование оператора goto делает исходный код трудным для чтения, усложняет логику программы, существенно затрудняет отладку и написание документации программы Следует везде, где это возможно, избегать использования оператора goto. Используйте вместо него современные средства структурирования программ. Фактически вся идеология Windows основана на переходах между фрагментами кодов с помощью событий. Кроме рассмотренных нами событий Windows, программист может объявлять собственные события, наступающие при достижении определенных условий. В любой программе операторы goto можно заменить условными операторами и операторами цикла, т.е. любую программу можно разработать без использования операторов goto.

В Object Pascal есть удобные встроенные средства перехвата ошибок, происходящих во время выполнения программы. Они называются средствами обработки исключительных ситуаций (чаще всего упрощенно пишут "исключений"). Каждое исключение генерируется определенной ошибкой времени выполнения. Когда происходит ошибка, Object Pascal создает экземпляр объекта исключения.

Отладчик интегрированной среды. Delphi поддерживает множество директив компилятора, связанных с тестированием и обработкой ошибок. Директивы часто используются для выявления или предотвращения возникновения логических ошибок. Для настройки необходимых параметров компилятора можно использовать вкладку Compiler (компилятор) в окне диалога Project Options (параметры проекта). Чтобы открыть окно диалога Project Options , выберете команду Project - Options (проект - параметры).

Оптимизация программного кода. В разделе Code generation (генерация кода) вкладки  Compiler (компилятор) окна диалога Project Options  имеется флажок Optimization (оптимизация), управляющий режимом оптимизации программного кода.

Ошибки времени выполнения. В разделе Runtime errors (ошибки времени выполнения) можно установить параметры, определяющие возможность отслеживания ошибок во время выполнения программы.

Установленный  флажок Range Checking  (контроль диапазонов) позволяет перехватывать ошибки, вызванные выходом за пределы диапазона  массива или строки. Использование этого параметра глобально нецелесообразно, так  как это тормозит выполнение программы.

Установленный флажок I/O Checking  (контроль ввода -  вывода) обозначает обязательное прерывание выполнения программы при возникновении ошибки времени выполнения.

Оптимизация программного кода. В разделе Code generation (генерация кода) вкладки  Compiler (компилятор) окна диалога Project Options  имеется флажок Optimization (оптимизация), управляющий режимом оптимизации программного кода.

Ошибки времени выполнения. В разделе Runtime errors (ошибки времени выполнения) можно установить параметры, определяющие возможность отслеживания ошибок во время выполнения программы.

Установленный  флажок Range Checking  (контроль диапазонов) позволяет перехватывать ошибки, вызванные выходом за пределы диапазона  массива или строки. Использование этого параметра глобально нецелесообразно, так  как это тормозит выполнение программы.

Установленный флажок I/O Checking  (контроль ввода -  вывода) обозначает обязательное прерывание выполнения программы при возникновении ошибки времени выполнения.

Overflow  checking(Q) (контроль переполнения) позволяет выяснить, например, не является ли результат выполнения целочисленной операции слишком большим для размещения его в переменной. Использование этого параметра глобально в программе не целесообразно, так как это тормозит выполнение программы.

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

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

Установленный флажок Local symbols (локальные символы) позволяет выполнить просмотр значений локальных переменных.  

Установленный флажок Symbol info (ссылочная информация) позволяет выполнить просмотр структуры программного кода в окнах Code Browser (просмотр кода), Code Explorer (обозреватель кода) и Project Browser (просмотр проектов).  Этот параметр заставляет компилятор делать записи о том, где определены и используются  идентификаторы.

В разделе Debuggint имеется флажок  Assertions(C)  (верификация), позволяющий выполнить проверку логической истины. Если логическое выражение истинно, то продолжается выполнение программы, если выражение ложно  -  возбуждается исключение.

Пошаговая отладка.

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

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

Управление  пошаговой отладкой осуществляется с помощью команд, представленных  в Delphi в меню Run (выполнение).

          

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

Команда – Trace Into (шаг с заходом) используется для выполнения строки программного кода с пошаговым заходом во все процедуры и функции, которые содержатся в точке выполнения.

Команда Trace to Next Source  Line (выполнить до следующей строки) используется для автоматического выполнения приложения  до следующей исполняемой команды.

Команда Run to Cursor  (выполнить до курсора) используется для автоматического выполнения программы вплоть до той точки  в  исходном тексте, где находится курсор.

Команда Show Execution Point  (показать точку выполнения) позволяет приостановить выполнение программы, открыть окно редактора и  показать выполняемую в настоящее время строку программы.

Команда Program Pause  (пауза программы) позволяет временно приостановить выполнение приложения.

Команда Program Reset  (сброс программы) позволяет немедленно завершить выполнение программы, выгрузить ее из памяти и вернуться в среду разработки.

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

Точкой останова программы (breakpoint) программы называется точка выполнения, в которой происходит прерывание выполнения программы и переход в пошаговый режим отладки. Когда отладчик доходит до строки программного кода, в которой находится точка останова, выполнение приложения прерывается и ожидает дальнейших указаний от  пользователя.

Точки останова могут быть условными и безусловными – отладчик всегда останавливается в точке безусловного останова, а в точке условного останова остановка выполняется только при выполнении поставленного условия.

Чтобы установить точку останова, необходимо поместить курсор в нужную строку и нажать клавишу F5 или щелкнуть левой кнопкой мыши в поле, левее окна редактирования.

Переменную можно добавить в окно непосредственно из текста программы. Для этого необходимо установить курсор на имени нужной переменной в окне редактора кода, щелкнуть правой кнопкой мыши и в контекстном меню выбрать команду Toggle Breakpoint  (включить точку останова). Все имеющиеся точки останова собраны в окне Breakpoint List (список точек останова). Для открытия этого окна выберите команду View -  Breakpoints (вид - точки останова).

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

Для добавления  контрольной точки следует щелкнуть в окне Breakpoint List правой кнопкой мыши и выбрать в контекстном меню команду Add.

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

 

Filename – путь и имя файла (в момент появления окна в поле этого списка содержатся данные открытого файла);

Line number – номер строки от начала файла (в момент появления окна в поле этого списка содержится номер строки с текстовым курсором);

Condition – в поле этого списка можно указать условие останова в виде логического выражения;

Pass count – в поле этого списка можно указать количество проходов программы через контрольную точку без прерывания вычислений.

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

В Delphi имеется два окна диалога Watch List  (список наблюдения) и Evaluate/Modify (вычисление/изменение), позволяющие наблюдать за динамикой изменения переменных или вносить непосредственные изменения в переменные, используемые в программе. Окно диалога  Watch List позволяет только пассивно наблюдать за неограниченным набором переменных, а окно  Evaluate/Modify вести наблюдение и изменять одну переменную.

Чтобы добавить переменную, за которой нужно наблюдать, в окно диалога Watch List выберите команду Run - Add Watch (выполнение - добавить в список наблюдения). В окне диалога Watch Properties (свойства наблюдения) настройте необходимые параметры.

В поле Expression (выражение) введите имя переменной или простое выражение без вызовов функций (это может быть любое вычисляемое выражение). В поле Repeat Count (счетчик повторов) можно указать число просматриваемых элементов массива. В поле Digits (цифры) указывается количество значащих цифр при выводе числа с плавающей точкой. Флажок Enabled (включить) позволяет включить или отключить контроль значений для данного выражения. Группа переключателей позволяет указать тип результирующего значения. По умолчанию предполагается, что тип результирующего значения совпадает с текущим типом, поэтому установлен переключатель Default (по умолчанию). После щелчка на кнопке ОК заданное выражение будет помещено в окно  Watch List.

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

Для редактирования свойств представленного в окне Watch List выражения необходимо выбрать его, щелкнуть правой кнопкой мыши и в контекстном меню выбрать команду Edit Wath (изменить наблюдения).

Чтобы открыть окно диалога   Evaluate/Modify (вычисление/изменение) выберите команду Run - Evaluate/Modify или установите курсор на переменную, которую нужно поместить в это окно диалога, щелкните правой кнопкой мыши и в контекстном меню выберите команду Debug - Evaluate/Modify (отладка – вычислить/изменить).

В поле Expression (выражение) введите простое выражение или имя переменной и  щелкните на кнопке Evaluate (вычислить) – в поле Result  (результат) будет представлено ее текущее значение. Если выражение является именем простой переменной, то в поле New value (новое значение) можно ввести значение, которое после щелчка на кнопке Modify (изменить) будет присвоено этой переменной. Для добавления переменной или выражения, указанного в поле Expression, в окно Watch List щелкните на кнопке Watch (наблюдать).

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

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

В ряде случаев бывает неудобно или невозможно пользоваться пошаговой отладкой программ. В таких ситуациях вам могут помочь контрольные точки, которые не прерывают работу программы, а лишь помещают некоторую информацию в специальный файл трассировки. Для реализации такой точки раскройте окно Source Breakpoint Properties, снимите флажок Break и введите сообщение в поле раскрывающегося списка Log message. Вы можете также в поле списка Eval expression ввести некоторое выражение, которое будет вычислено и вместе с сообщением помещено в протокол работы программы. Этот протокол можно просмотреть в любой момент (в том числе и после завершения прогона программы) с помощью команды View - Debug Windows - Event Log.

Вопросы для контроля усвоения учебного материала

1. Назовите состав приложения?

2. Перечислить основные составные части основного модуля проекта?

3. Перечислить основные составные части модуля формы?

4. Пояснить назначение и состав разделов модуля формы?

5. Пояснить принцип функционирования отладчика среды?


Форма

Модуль

Форма

Модуль

Модуль

Модуль

ПРОЕКТ

ПАРАМЕТРЫ

РЕСУРСЫ

ПРИЛОЖЕНИЕ

Компиляция

Рис. 1.5.  Связи между файлами проекта

Рис.1.12. Меню перехода к другим ошибкам

Рис. 1.11. Сообщение о синтаксической ошибке

ис. 1.13 . Настройка параметров компилятора

Рис. 1.14. Точка выполнения

Рис. 1.15. Кнопки быстрого доступа к командам пошаговой отладки

Рис. 1.16 . Содержание меню Run 

Рис. 1.17 . Вид фрагмента программы после компиляции

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

Рис. 1.19 . Окно списка точек останова

Рис. 1.20 . Контекстное меню добавления контрольной точки

Рис. 1.21 . Окно определения параметров добавляемой точки

Рис. 1.22 . Всплывающая подсказка в окне редактора кода

Рис. 1. 23. Окно свойств наблюдения

Рис. 1.24.  Окно списка наблюдения

Рис. 1.25.  Окно диалога Evaluate/Modify

Рис. 1.26. Текущее значение  переменной


 

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

65186. СИСТЕМЫ СЧИСЛЕНИЯ 22.15 KB
  Различают непозиционные и позиционные системы счисления. Непозиционные системы сложны и громоздки при записи чисел и мало удобны при выполнении арифметических операций например: Римская непозиционная система счисления.
65187. Виды термической обработки 34 KB
  В любительской практике для определения температуры раскаленной детали по цвету можно использовать приведенную таблицу Закалка придает стальной детали большую твердость и износоустойчивость.
65188. УРАВНЕНИЯ СОСТОЯНИЯ ЛИНЕЙНОЙ ЭЛЕКТРИЧЕСКОЙ ЦЕПИ 61.01 KB
  Для ветвей i и j имеющих взаимное сопротивление связь между всеми указанными величинами определяется следующими уравнениями: 12 при указанных положительных направлениях.
65189. Виникнення філософії. Філософський спосіб освоєння дійсності 27.5 KB
  Виникнення філософії пов'язане зі становленням світогляду його розвитком та ступенями зрілості. Вирішення першого завдання привело до появи природничих наук в лоні філософії. Останній блок питань належав і належить філософії.
65191. Суверенитет государства: понятие и содержание 27 KB
  Суверенитет государства это верховенство государственной власти внутри страны способность государственной власти издавать общеобязательные для всех членов общества правила поведения устанавливать и обеспечивать единый правопорядок...
65192. Многообразие форм знания и специфика научного знания 32.5 KB
  Познавательное отношение человека к миру осуществляется в различных формах в форме обыденного познания познания художественного религиозного наконец в форме научного познания. Первые три области познания рассматриваются в отличие от науки как вненаучные формы.
65193. Общее представление о социальной психологии как науке, ее объекте, и предмете. Социальная психология в системе психологических знаний 36.5 KB
  Социальная психология раздел психологии изучающий поведение человека в обществе социуме психические явления происходящие во время взаимодействия различных групп людей. Выработка практических рекомендаций в плане совершенствования взаимодействия людей...
65194. Проблемы и методы социальной психологии 31.5 KB
  Социальная психология пользуется определением личности которое даёт общая психология выясняет каким образом т. Отличие такого подхода от социологического заключается в том что она выявляет каким образом сформировались эти социально-типические черты почему в одних условиях формирования личности...