При закрытии подписчики были переданы в рассылку "Delphi - проблемы и решения" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Информационный Канал Subscribe.Ru |
18.6 Точки прерывания
Выше мы рассмотрели останов приложения командой Run to Cursor — клавишей F4.
Теперь рассмотрим более мощный инструмент — введение в приложение точек
прерывания (breakpoint).
Чтобы ввести простую (безусловную) точку прерывания достаточно в окне Редактора
Кола щёлкнуть мышью на полоске левее кода требуемой строки. Строка окрасится в
красный цвет и на ней появится красная точка. Подведя курсов мыши к точке, вы
увидите ярлычок, со свойствами точек прерывания. Об этих свойствах мы поговорим
позднее.
Если вы теперь запустите приложение на выполнение и начнёте с ним работать, то
произойдет прерывание выполнения, как только управление перейдет к строке, в
которой указана точка прерывания. Такая точка прерывания даёт тот же результат,
что и описанное ранее выполнение до точки, указанной курсором, при нажатии
клавиши F4. Но преимущество точек прерывание заключается в том, что их можно
одновременно указать несколько в разных местах кода и в разных модулях.
Приложение будет выполняться до тех пор, пока управление не перейдёт к первой
встретившейся в программе точке прерывания.
Для того чтобы убрать точку прерывания, достаточно щелкнуть мышью на красной
точке левее кода соответствующей строки.
Точки прерывания можно устанавливать только на выполняемых операторах. Если вы,
например, попробуете установить точку прерывания на строке, содержащей
объявление переменной, то в момент запуска приложения в красной точке,
выделяющей строку прерывания, появится крестик. Тем самым Delphi предупреждает,
что прерывания не будет, поскольку оператор невыполняемый. Аналогичный крестик
может появиться и в том случае, если компилятор в процессе оптимизации кода
убрал какой-то написанный вами оператор. Если вы все-таки хотите остановиться
именно на этом операторе, вам надо отключить оптимизацию. Напоминаю, что это
делается снятием флажка Optimization страницы Compiler окна Project Options,
которое вы можете вызвать командой Project | Options.
Возможности точек прерывания гораздо шире, чем об этом пока говорилось. Delphi
дает возможность установить условия прерывания. Вернемся к нашему примеру.
Предположим, что мы хотим остановиться при каком-то значении переменной цикла I,
например, при i = 3, причем не в первый, а только во второй раз (т.е. при
повторном нажатии пользователем кнопки в окне приложения). Для установки такой
точки прерывания надо выполнить следующие действия.
Щелкните правой кнопкой мыши на точке в строке, в которой вы ввели прерывание и
выберите во всплывшем меню раздел Breakpoint properties. Перед вами откроется
окно свойств точки прерывания.
Два верхних окошка редактирования — Filename (имя файла) и Line Number (номер
его строки) в данном режиме недоступны. Они автоматически заполнились в момент,
когда вы установили в своем коде точку прерывания.
Окошко Condition (условие) позволяет вам ввести некоторое условное выражение.
Прерывание будет происходить только в случае, если значение этого выражения
равно true. В нашем примере вы можете указать условие останова "i = 3".
Окошко Pass Count позволяет указать, при котором по счету выполнении записанного
условия произойдет останов. В нашем примере нас интересует второй проход цикла.
Поэтому задайте в окошке Pass Count значение 2.
Окошко Group (группа) позволяет задать имя группы, к которой относится данное
прерывание. Группировка прерываний позволяет сделать целиком ту или иную группу
доступной или недоступной. Это делается с помощью окошек Enable Group (доступная
группа) и Disable Group (недоступная группа). В этих окнах имя группы выбирается
из выпадающих списков, содержащих имена введенных ранее групп.
Кнопка Advanced развертывает нижнюю часть окна задания свойств прерывания. В ней
вы можете указать некоторые действия (Action), выполняемые в момент прерывания.
Индикатор Break, установленный по умолчанию, обеспечивает стандартную реакцию —
останов выполнения приложения. Группа индикаторов Ignore subsequent exception
(игнорировать последующее исключение) и Handle subsequent exception
(обрабатывать последующее исключение), из которых установить можно только один,
определяют появление при генерации очередного исключения сообщения отладчика.
Если установлен индикатор Ignore subsequent exception, то это сообщение не
появляется. Если установлен индикатор Handle subsequent exception, то это
сообщение появляется. Если не установлен ни один индикатор, то все определяется
настройками отладчика Delphi.
Окошко Log Message позволяет записать некоторое сообщение, которое будет
появляться в момент прерывания в окне протокола событий Event Log. Окошко Eval
Expression позволяет записать некоторое выражение, которое будет вычисляться при
прерывании. При установленном индикаторе Log Result это выражение и результат
его вычисления вы сможете увидеть в том же окне Event Log.
С учетом возможностей задания сообщений и выражений, появляющихся в окне Event
Log, вам, вероятно, становится более понятным наличие индикатора Break. Если вы
выключите этот индикатор и включите индикатор Ignore subsequent exception, то
никаких остановов выполнения приложения в точке прерывания или при генерации
исключения не будет происходить. Но завершив выполнение приложения и посмотрев
протокол Event Log, вы увидите там соответствующие сообщения, которые позволят
вам отследить логику работы приложения, понять, какие фрагменты кода и сколько
раз выполнялись.
Внесите в окно задания свойств прерывания данные, щёлкните на ОК и запустите
выполнение приложения. После первого нажатия вами кнопки приложения останова не
произойдет, а после второго нажатия выполнение остановится. Вы сможете увидеть в
окне наблюдений, что в этот момент i=3. Затем, при желании, вы можете пройти по
шагам какие-то циклы и увидеть появление бесконечного значения А. Выполнив
команду View | Debug Windows | Event Log, вы увидите протокол событий и в нем, в
частности, найдете строки
Breakpoint Message: останов при i = 3 Process Project1.exe (3648) Breakpoint
Expression A: 1e+128 Process Project1.exe (3648)
Это введенное вами сообщение («останов при i=3») и выражение (А) с посчитанным
результатом.
Команда View | Debug Windows | Breakpoints позволяет открыть окно списка точек
прерывания. В этом окне можно выделить уже введённую точку прерывания, щёлкнуть
на ней правой кнопкой мыши и из контекстного меню выбрать команду Properties,
которая покажет окно задания свойств прерывания и позволит отредактировать
информацию.
Если в окне списка точек прерывания щелкнуть правой кнопкой мыши не на одной из
уже введенных точек прерывания, то во всплывшем меню появится раздел Add —
добавление новых точек с подразделами: Source Breakpoint — уже рассмотренная
точка прерывания в указанной строке файла приложения, Address Breakpoint -
прерывание при переходе управления по заданному адресу, и Data Breakpoint -
прерывание при изменении данных. Последний вид прерываний очень полезен, если
какая-то переменная принимает неправильное значение, но не ясно, при выполнении
какой команды кода это происходит. Но оба последних вида прерывания в вашем меню
будут недоступны, поскольку, пока приложение не загружено в замять, Delphi не
знает адресов команд и переменных. Чтобы задать эти виды прерывания, надо
запустить приложение на выполнение и после этого, ничего в нём не делая,
вернуться в среду Delphi и открыть окно точек прерывания. Давайте выберем из
контекстного меню команду Add | Data Breakpoint, чтобы остановиться в момент,
когда значение переменной А превысит, например, величину 10^250.
При выполнении этой команды вы попадете в диалоговое окно свойств прерывания при
изменении данных. Оно похоже на рассмотренное ранее, но содержит окошко адреса (Address),
в котором вы можете указать идентификатор переменной, и окошко длины переменной
(Length), которое обычно заполняется автоматически. Заполнив окно, щелкните на
ОК. Вы вернётесь в окно списка точек прерывания, в котором появится введенная
вами новая
точка.
Чтобы убедиться в работе новой точки прерывания, отключите прежнюю. Для этого
выделите ее в окне списка точек прерывания, щелкните на ней правой кнопкой мыши
и из контекстного меню выберите команду Properties. В появившееся диалоговом
окне введите имя группы (например, "1") и задайте это же имя в списке Disable
Group. Тем самым вы сделаете недоступной прежнюю точку прерывания. Можно
поступить проще: щелкнуть правой кнопкой мыши на строке прежней точки прерывания
и во всплывшем меню снять установку индикатора Enabled. На всякий случай
проверьте, что в новой точке прерывания индикатор Enabled включен. Теперь
вернитесь в ваше выполняющееся приложение и щелкните кнопкой. После второго
щелчка приложение остановится на операторе
А:=А*А;
при состоянии приложения, когда А= 10^356. Т.е. прерывание, как и было заказано,
произошло после того, как соответствующим образом изменилась переменная А.
Учтите, что доступность точки прерывания по изменению переменной сохраняется
только в течение данного сеанса выполнения приложения. По завершении выполнения
точка становится недоступной и при следующем запуске ее надо повторно
активизировать, устанавливая с помощью контекстного меню ее индикатор Enabled.
Помимо описанных команд, задающих точки прерывания, в Delphi 7 имеется еще
несколько команд, осуществляющих те же функции. Это, прежде всего, команда Run |
Add Breakpoint (добавить точку прерывания) с разделами Source Breakpoint,
Address Breakpoint, Data Breakpoint и Module Load Breakpoint. Первые три раздела
выполняют те же функции, что и одноименные им разделы контекстного меня списка
точек прерывания, рассмотренные ранее. А последний раздел позволяет задать
прерывание при загрузке в память указанного модуля (обычно библиотеки .dll или
пакета .bр1). Имеется также возможность задать прерывание по изменении
переменной из всплывающего меню окна наблюдения (команда Break When Changed).
Соответствующая точка возникает в списке точек прерывания, но доступна только в
течение данного сеанса выполнения приложения. По завершении выполнения точка
становится недоступной и при следующем запуске ее надо повторно активизировать,
устанавливая с помощью контекстного меню ее индикатор Enabled.
Сайт рассылки http://mydelphi7.narod.ru, на котором есть архив рассылки, также гостевая книга, переводчик.
Копировать, размещать, продавать представленную информацию запрещается.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||