Точки прерывания
Чтобы ввести простую (безусловную) точку прерывания, достаточно в окне Редактора Кода щелкнуть на полоске левее кода требуемой строки. Строка станет красной, и на ней появится красная точка. (Для удаления точки прерывания достаточно щелкнуть на красной точке.) Если запустить приложение на выполнение, то произойдет прерывание выполнения, как только управление перейдет к строке, в которой указана точка прерывания. Можно одновременно указать несколько точек прерывания в разных местах кода и в разных модулях. Кроме того, в этих точках можно установить условия прерывания.
Точки прерывания можно устанавливать только на выполняемых операторах. Если, например, попробовать установить точку прерывания на строке, содержащей объявление переменной, то в момент запуска приложения в красной точке появится крестик. Это предупреждение о том, что здесь прерывания не будет. Установим контрольную точку на операторе
A*=10000; //Увеличение A в 10000 раз
Если задержать курсор над красной точкой, то увидим всплывший ярлык с характеристиками данной точки прерывания. По умолчанию никаких условий останова не задается. Зададим следующие условия: нужно остановиться на введенной точке прерывания, но только на 26-м цикле, причем только при повторном проходе цикла (повторном щелчке пользователя на кнопке приложения).
Щелкните правой кнопкой на красной точке и из всплывшего меню выберите Свойства контрольной точки. Откроется окно Исходные Свойства Контрольной точки.
Два верхних окна редактирования − Имя файла и Номер линии (номер строки файла) в данном режиме недоступны. Они автоматически заполнились в момент, когда была установлена точка прерывания.
В окне Условие укажем условие останова i==26. В окне Счет прохода зададим значение 2.
Окно Группа позволяет задать имя группы, к которой относится данное прерывание. Группировка прерываний позволяет сделать целиком ту или иную группу доступной или недоступной. Это делается с помощью окон Вкл. группу и Выкл. группу, которые становятся доступными после нажатия кнопки Дополнительно. В этих окнах имя группы выбирается из выпадающих списков, содержащих имена введенных ранее групп. В целом, в нижней части окна задания свойств прерывания указываются некоторые действия, выполняемые в момент прерывания. Индикатор Перерыв, установленный по умолчанию, обеспечивает стандартную реакцию − останов выполнения приложения. Индикаторы Игнорировать последующее исключение и Обрабатывать последующее исключение (установлен может быть только один) определяют появление при генерации очередного исключения сообщения отладчика. Если установлен второй индикатор, то сообщение появляется. Если не установлен ни один индикатор, то все определяется настройками отладчика на странице Исключения языка окна настройки отладчика, вызываемого командой Инструменты|Опции отладчика. Пока в перечисленные элементы окна Исходные Свойства Контрольной точки (начиная с окна Группа) никакие изменения вносить не будем.
Список введенных точек прерывания хранится в памяти, и поэтому в любой момент его можно увидеть (и до выполнения программы, и при останове), выполнив команду Вид | Windows отладки | Контрольные точки. Окно Список контрольных точек можно встраивать в окно наблюдения Список часов и фиксировать такую конфигурацию окон как отладочную. Тогда в моменты останова будут видны и наблюдаемые величины, и информация о точках прерывания. В Список часов внесите переменную A и переменную i.
После внесения данных в окно Исходные Свойства Контрольной точки щелкните на OK, откомпилируйте модуль (команда Проект|Компилировать модуль) и запустите выполнение приложения. После первого нажатия кнопки приложения останова не произойдет, а после второго нажатия выполнение остановится. Отметим, что в этот момент A=1E+304, а i=26. Затем, находясь в Редакторе Кода, пройдите по шагам (клавишей F7) последний цикл перед появлением ошибки, наблюдая за окнами Список контрольных точек и Список часов.
В окне Исходные Свойства Контрольной точки, нажав Дополнительно, в окно Log сообщение запишем сообщение “останов при i=26 во второй раз”, которое будет появляться в момент прерывания в окне Журнал событий, вызываемого командой Вид|Windows отладки|Журнал событий. В окно Eval выражение запишем некоторое выражение (в данном случае просто имя переменной − A), которое будет вычисляться при прерывании. При установленном индикаторе Log результат это выражение и результат его вычисления можно увидеть в том же окне Журнал событий. Выключим индикатор Перерыв и включим индикатор Игнорировать последующее исключение. При этом никаких остановов выполнения приложения в точке прерывания или при генерации исключения не будет происходить. Но после завершения выполнения приложения в Журнале событий окажутся соответствующие сообщения. Нажмем Ok.
Откомпилируем модуль (Alt+F9) и запустим выполнение приложения. После генерации исключения и выполнения команды Вид|Windows отладки|Журнал событий увидим строки со следующим содержанием:
Breakpoint Message: останов при i=26 во второй раз Process Project1.exe Breakpoint Expression A: 1E+304 Process Project1.exe
Это введенное ранее сообщение (останов при i=26 во второй раз) и выражение (A) с посчитанным результатом.
В нашем примере, где каждый проход запускается нажатием кнопки приложения, очевидно, что ошибка происходит именно при втором проходе цикла. В более сложном варианте определение прохода, на котором происходит ошибка, позволяет сделать условная точка прерывания. Для этого в окне Исходные Свойства Контрольной точки укажем большое значение Счет прохода, например 50. Очевидно, ошибка будет зафиксирована раньше этой точки. Включим индикатор Перерыв и выключим индикатор Игнорировать последующее исключение. Откомпилируем модуль и запустим выполнение приложения. В окне Список контрольных точек будет указано, сколько произошло проходов через точку прерывания с выполнением заданного условия (2 из 50).
В окне Список контрольных точек щелкнем правой кнопкой и во всплывшем меню выберем Добавить. Предлагается три варианта: Исходная контрольная точка − точка прерывания в файле приложения, Адрес точки − прерывание при переходе управления по заданному адресу, и Точка данных − прерывание при изменении данных по заданному адресу. Однако, если работа в окне Список контрольных точек производится не во время выполнения приложения, две последние команды будут недоступны. Это связано с тем, что пока приложение не выполняется, адреса команд и переменных еще не известны.
Выполним пример использования прерывания при изменении данных по заданному адресу. В нашем приложении только один оператор изменяет значение переменной A. В более сложном приложении таких операторов может быть несколько, и поэтому будет неизвестно, какой из них увеличивает значение A настолько, что дальнейшее выполнение приложения приведет к переполнению, или какой оператор заносит в A недопустимое значение. В подобных случаях помогает установка прерывания при изменении данных по заданному адресу − в нашем примере по адресу, отведенному для A. Здесь не устанавливают, на какой строке кода хотят прервать выполнение. Прерывание произойдет на том операторе, который занесет в указанную переменную некоторое значение, если будут выполнены указанные условия.
Воспользуемся оператором, заносящем новое значение в адрес A, причем при значении A> . Поскольку отладчик не знает адреса переменной, пока приложение не загружено в память, то прежде чем задавать точку прерывания, надо запустить приложение на выполнение. Затем, не закрывая приложения и ничего с ним не делая, т.е. не щелкая на кнопке приложения, вводим команду Вид|Windows отладки|Контрольные точки и в открывшемся окне Список контрольных точек щелкнем правой кнопкой мыши. Во всплывшем меню выберем команду Добавить. Из предложенных трех вариантов выберем вариант Точка данных − прерывание при изменении данных по заданному адресу. Откроется окно Добавить контрольную точку данных, подобное окну Исходные Свойства Контрольной точки.
Окно заполняем следующим образом. В окно Адрес заносим переменную A, при изменении которой наступает прерывание. Окно Длина заполняется автоматически. В окна: Условие заносим A>1e299, Счет прохода − 0, Группа − 1, ниже кнопки Дополнительно: Сообщение − значение A>1e299, Eval выражение − A, Вкл. группу − 1, Выкл. группу − 0. Последним действием (занесли 0 в окно Выкл. группу) начинаем отключение прежней точки прерывания. Для завершения отключения выделим ее в окне Список контрольных точек, щелкнем правой кнопкой и выберем Свойства. В открывшемся окне Свойства исходных контрольных точек в окно Группа занесем 0, в окно Вкл. группу − 1, а в окно Выкл. группу − 0. Однако выключить прежнюю точку прерывания можно проще: после щелчка правой кнопкой на строке прежней точки прерывания в окне Список контрольных точек в контекстном меню выбрать Удалить.
Теперь вернемся в выполняющееся приложение и щелкнем кнопкой приложения. Приложение будет выполняться, но значительно медленнее, чем раньше. После второго щелчка приложение остановится на операторе
A*=10000; //Увеличение A в 10000 раз
при состоянии приложения, когда A=1E+300, в чем можно убедиться в окне Список часов и в Журнале событий. Следовательно, прерывание, как и было заказано, произошло после того, как переменная A стала больше 1e299.
Примечание. Доступность точки прерывания по изменению переменной сохраняется только в течение данного сеанса выполнения приложения. По завершению выполнения точка становится недоступной, и при следующем запуске ее надо повторно активизировать. Для этого в контекстном меню, которое появится после щелчка правой кнопкой в окне Список контрольных точек, нужно выбрать Включить группу, а затем − 1.
Добавить точки прерывания можно также командой Запуск|Добавить точку прерывания, первые три первых варианта которой − Контрольная точка источника, Адрес контрольной точки и Данные контрольной точки совпадают с рассмотренными выше.
Имеется также возможность задать точку прерывания по изменению переменной из всплывающего меню окна Список часов (команда Перерыв при замене, доступная только во время выполнения). Это прерывание необходимо, когда надо понять, почему переменная начинает изменяться, а должна быть неизменной. Соответствующая точка возникает в списке точек прерывания, но доступна только в течение данного сеанса выполнения приложения. По завершению выполнения точка становится недоступной и при следующем запуске ее надо повторно активизировать, устанавливая с помощью контекстного меню индикатор Включить.