Читайте также:
|
|
Выше мы рассмотрели останов приложения командой Run to Cursor – клавишей F4. Теперь рассмотрим более мощный инструмент – введение в приложение точек прерывания (breakpoint).
Чтобы ввести простую (безусловную) точку прерывания, достаточно в окне Редактора кода щелкнуть мышью на полоске левее кода требуемой строки. Строка окрасится в красный цвет и на ней появится красная точка (смотри рисунок ниже). Если вы теперь запустите приложение на выполнение и начнете с ним работать, то произойдет прерывание выполнения.
Такая точка прерывания дает тот же результат, что и описанное ранее выполнение до точки, указанной курсором, при нажатии клавиши F4. Но преимущество точек прерывания заключается в том, что их можно одновременно указать несколько в разных местах кода и в разных модулях. Приложение будет выполняться до тех пор, пока управление не перейдет к первой встретившейся в программе точке прерывания. Кроме того, как мы скоро увидим, в этих точках можно устанавливать условия прерывания.
Для того, чтобы убрать точку прерывания, достаточно щелкнуть мышью на красной точке левее кода соответствующей строки.
Точки прерывания можно устанавливать только на выполняемых операторах. Если вы, например, попробуйте установить точку прерывания на строке, содержащей объявление переменной, то в момент запуска приложения в красной точке, выделяющей точку прерывания, появится крестик. Тем самым Delphi предупреждает, что прерывания не будет, поскольку оператор невыполняемый. Аналогичный крестик может появится и в том случае, если компилятор в процессе оптимизации кода убрал какой-то написанный вами оператор. Если вы все-таки хотите остановиться именно на этом операторе, вам надо отключить оптимизацию.
Delphi дает возможность установить условия прерывания. Задержите курсор мыши над красной точкой слева от стоки, где вы установили прерывание. Вы увидите всплывающий ярлычок с характеристиками данной точки прерывания. По умолчанию никаких условий останова не задается. Поэтому до сих пор остановы были при каждой передаче управления на точку прерывания. Попробуем задеть условие прерывания. Пусть, например, мы хотим остановиться на точке прерывания, которую мы уже ввели, но только на 26-м цикле, причем только при повторном проходе цикла (повторном щелчке пользователя на кнопке нашего приложения). Иначе говоря, мы хотим остановиться, когда переменная i будет иметь значение 26, причем не в первый, а во второй раз.
Щелкните кнопкой мыши на красной точке в строке, где вы ввели прерывание. Из всплывающего меню выберите раздел Breakpoint properties. Перед вами откроется окно, представленное на рисунке (см. следующую страницу).
Два верхних окошка редактирования – Filename (имя файла) и Line Number (номер его строки) в данном режиме недоступны. Они автоматически заполнились в момент, когда вы установили в своем коде точку прерывания.
Окошко Condition (условие) позволяет вам ввести некоторое условное выражение. Прерывание будет происходить только в случае, если значение этого выражения равно true. В нашем примере вы можете указать условие останова «i==26».
Окошко Pass Count позволяет указать, при котором по счету выполнении записанного условия произойдет останов. В нашем примере нас интересует второй проход цикла. Поэтому задайте в окошке Pass Count значение 2.
Окошко Group (группа) позволяет задать имя группы, к которой относится данное прерывание. Delphi позволяет отнести прерывание к какой-то группе. Группирована прерываний позволяет сделать целиком ту или иную группу доступной или недоступной. Это делается с помощью показанных внизу на рисунке окошек Enable Group (доступная группа) и Disable Group (недоступная группа). В этих окнах имя группы выбирается из выпадающих списков, содержащих имена введенных ранее групп.
Кнопка Advanced развертывает нижнюю часть окна задания свойств прерывания. В ней вы можете указать некоторые действия (Action), выполняемые в момент прерывания. Индикатор Break, установленный по умолчанию, обеспечивает стандартную реакцию – останов выполнения приложения. Группа индикаторов Ignore subsequent exception (игнорировать последующее исключение) и Handle subsequent exception (обрабатывать последующее исключение), из которых установить можно только один, определяют появление при генерации очередного исключения сообщения отладчика. Если установлен индикатор Ignore subsequent exception, то это сообщение не появляется. Если установлен индикатор Handle subsequent exception, то это сообщение появляется. Если не установлен ни один индикатор, то все определяется настройками отладчика Delphi на странице Language Exceptions окна настройки отладчика.
Окошко Log Message позволяет записать некоторое сообщение, которое будет появляться в момент прерывания в окне протокола событий Event Log. Окошко Eval Expression позволяет записать некоторое выражение, которое будет вычисляться при прерывании. При установленном индикаторе Log Result это выражение и результат его вычисления вы сможете увидеть в том же окне Event Log.
С учетом возможностей задания сообщений и выражений, появляются в окне Event Log, вам, вероятно, становится более понятным наличие индикатора Break. Если вы выключите этот индикатор и включите индикатор Ignore subsequent exception, то никаких остановов выполнения приложения в точке прерывания или при генерации исключения не будет происходить. Но завершив выполнение приложения и посмотрев протокол Event Log, вы увидите там соответствующие сообщения, которые позволят вам отследить логику работы приложения, понять, какие фрагменты кода и сколько раз выполнялись.
Внесите в окно задания свойств прерывания данные, показанные на рисунке, щелкните ОК и запустите выполнение приложения. После первого нажатия вами кнопки приложения останова не произойдет, а после второго нажатия выполнение остановится. Вы сможете увидеть в окне наблюдений, что в момент i = 26. Затем, при желании, вы можете пройти по шагам (с помощью клавиши F7) последовательный цикл перед выполнением ошибки. А если в окне вы выключите индикатор Break, то останова в точке прерывания не будет, а после генерации исключения вы сможете выполнять команду View | Debug Windows | Event Log, и в окне протокола событий найдете, в частности, строки
Breakpoint Message: Останов при i=26 Process Project1.exe (204)
Breakpoint Expression A: 1e+296 Process Project1.exe (204)
Это введенное вами сообщение («Останов при i=26 во второй раз») и выражение (А) с посчитанным результатом.
Списки введенных вами точек прерывания хранить в списке, который вы можете в любой момент (и до выполнения программы, и при останове) увидеть, если выполните команду View | Debug Windows | Breakpoints.
Откроется окно Breakpoint List. В нем вы увидите введенную вами ранее точку прерывания (на нашем рисунке видна еще одна точка, которую мы введем позднее). Окно точек прерывания удобно встраивать в окно наблюдения (см. рисунок на другой странице) и фиксировать такую конфигурацию окон как отладочную. Тогда в моменты останова вы будете видеть и наблюдаемые величины, и информацию о точках прерывания.
Условные точки прерывания – мощный инструмент отладки приложений, содержащих циклы. В нашем примере мы знаем, что ошибка происходит именно при втором проходе цикла, поскольку каждый проход мы сами запускаем нажатием кнопки приложения. Но если бы в более сложной программе мы этого не знали, то условная точка прерывания позволила бы нам определить, на каком именно проходе произошла ошибка. Для этого можно в окне задания свойств точки прерывания указать большое значение Pass Count, например, 50. Тогда, конечно, прерывание в этой точке не произойдет, поскольку раньше будет зафиксирована ошибка. Но если после прерывания вследствие этой ошибки вы посмотрите окно Breakpoint List, то увидите, что там указано, сколько произошло проходов через точку прерывания с выполнением заданного условия.
Теперь обсудим некоторые возможности окна точек прерывания. Щелкните в окне правой кнопкой мыши и во всплывающем меню выберите команду Add – добавить точку прерывания. Вам будет предложено три варианта: Source Breakpoint –точка прерывания в файле приложения, Address Breakpoint – прерывание при переходе управления по заданному адресу, и Data Breakpoint – прерывание при изменении данных по заданному адресу. Правда, если вы работаете в окне Breakpoint List не во время выполнения вашего приложения, две последние команды будут недоступны. Это связано с тем, что пока приложение не выполняется, адрес команд и переменных еще не известны.
Давайте рассмотрим пример использования прерывания при изменении данных по заданному адресу. В нашем приложении мы знаем единственный оператор, который изменяет значение переменной А. Но в сложном приложении подобных операторов может быть много. И тогда мы не можем знать, какой из них увеличивает значение А настолько, что дальнейшее выполнение приложения грозит переполнением, или какой оператор заносит в А недопустимое значение. В подобных случаях помогает установка прерывания при изменении данных по заданному адресу – в нашем примере по адресу, отведенному для А. Вы не устанавливаете, на какой строке кода хотите прервать выполнение. Прерывание произойдет на том операторе, который занесет в указанную вами переменную некоторое значение, если будут выполнены указанные вами условия.
Пусть мы хотим остановиться на операторе, заносящем новое значение в адрес А, причем при значении А > 10299. Поскольку отладчик не знает адреса переменных, пока приложение не загружено в память, то прежде, чем задавать точку прерывания, в данном случае надо запустить приложение на выполнение. Затем, не закрывая приложения и ничего с ним не делая, вернитесь в Delphi. В окне Breakpoint List щелкните правой кнопкой мыши и во всплывающем меню выберите команду Add. Из предложенных вам трех вариантов точек прерывания выберите Data Breakpoint – прерывание при изменении данных по заданному адресу. Откроется окно (смотри рисунок на другой странице) подобное рассмотренному ранее. Только здесь в окошке редактирования Address задается переменная, при изменении которой происходит прерывание. Окошко длины переменной (Length) обычно заполняется автоматически. Окна Condition и Pass Count имеют тот же смысл, что и в ранее рассмотренном примере.
Заполните окно так, как показано на рисунке, щелкните ОК. Вернитесь в окно списка точек прерывания, в котором появится введенная вами новая точка.
Чтобы убедиться в работе новой точки прерывания, отключите прежнюю. Для этого выделите ее в окне списка точек прерывания, щелкните на ней правой кнопкой мыши и из контекстного меню выберите команду Properties. В появившемся диалоговом окне введите имя групп (например, 0) и выберите это имя в окошке Disable Group. Тем самым вы сделаете недоступной прежнюю точку прерывания. Можно поступить проще: щелкнуть правой кнопкой мыши на строке прежней точки прерывания и во всплывающем меню снять установку индикатора Enabled. На всякий случай проверьте, что в новой точке прерывания этот индикатор включен. Теперь вернитесь в ваше выполняющееся приложение и щелкните кнопкой. Приложение будет выполняться, но заметно медленнее, чем раньше. Это влияние накладных расходов на проверку условий при каждом изменении А. после второго щелчка приложение остановится на операторе
A:= A*10000;
при состоянии приложения, когда А = 10300. Т.е. прерывание, как и было сказано, произошло после того, как соответствующим образом изменилась переменная А.
Учтите, что доступность точки прерывания по изменению переменной сохраняется только в течение данного сеанса выполнения приложения. По завершении выполнения точка становится недоступной и при следующем запуске ее надо повторно активизировать, устанавливая с помощью меню ее индикатор Enabled.
Помимо описанных команд, задающих точки прерывания в Delphi, имеется еще несколько команд, осуществляющих те же функции. Это прежде всего, команда Run | Add Breakpoint (добавить точку прерывания) с разделами Source Breakpoint, Data Breakpoint и Module Load Breakpoint. Первые три раздела выполняют те же функции, что и одноименные им разделы контекстного меню списка точек прерывания, рассмотренные ранее. А последний раздел позволяет задать прерывание при загрузке в память указанного модуля (обычно библиотеки .dll или пакета .bpl). Имеется также возможность задать прерывание по изменению переменной из всплывающего меню окна наблюдения (команда Break When Changed). Соответствующая точка возникает в списке точек прерывания, но доступна только в течение данного сеанса выполнения приложения. По завершении выполнения точка становится недоступной и при следующем запуске ее надо повторно активизировать, устанавливая с помощью меню ее индикатор Enabled.
Дата добавления: 2015-11-13; просмотров: 78 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Выполнение приложения по шагам. | | | Использование окна Инспектора Отладки Debug Inspector |