ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 9 ГЛАВА 7 ТОЧКИ ОСТАНОВА Turbo Debugger имеет единую концепцию "точки останова", которая объединяет функции отладчика, которые обычно называют точками останова, точками слежения и контрольными точками. Обычно точки останова, точки слежения и контрольные точки определяются следующим образом. Точка останова это место в программе, где требуется приостановить выполнение программы, чтобы проверить ее переменные и структуры данных. Точки слежения заставляют отладчик выполнять программу по одной команде или строке исходного текста за один шаг отладки и позволяют отследить, в какой момент значение выражения становится истинным. Контрольные точки заставляют отладчик выполнять программу по одной команде или строке исходного текста за один шаг отладки и позволяют следить за изменением значений отдельных переменных программы или выражений, в которых производятся обращения к областям памяти. В отладчике Turbo Debugger эти три концепции объединены в одну концепцию точки останова, определение которой делится на три части: - место в программе, где установлена точка останова; - условие, при котором просходит включение точки останова; - что происходит при включении точки останова. Под "местом" в программе может подразумеваться как одно определенное место в программе, так и "глобальное" место, которое означает, что точка останова может быть установлена на любой строке исходного текста или команды. "Условие" может быть следующим: - всегда; - когда становится истинным некоторое выражение; - когда изменяется значение некоторого объекта данных. Кроме того, может быть указано число проходов, которое определяет, сколько раз должно быть выполнено "условие", чтобы произошло включение точки останова. "Что происходит" означает одно из следующих событий: - работа программы останавливается (точка останова); - регистрируется значение выражения; - выполняется выражение (вставка кода). В этой главе показываются преимущества точек останова отладчика Turbo Debugger над традиционными точками останова, точками слежения и контрольными точками. Вы научитесь пользоваться окном точек останова и окном регистрации, изучите, как устанавливать простые точки останова, условные точки останова и точки останова, регистрирующие значения переменных программы. Кроме того, вы изучите, как устанавливать точки останова, которые отслеживают тот момент, когда изменяется значение переменной выражения или объекта данных. Во многих случаях вам будет требоваться устанавливать только несколько простых точек останова, по достижении каждой из которых выполнение программы будет останавливаться. Можно установить или сбросить точку останова в любом месте программы. Для этого достаточно установить курсор на нужную строку исходного текста и нажать клавишу F2. Можно также установить точку останова на любой строке машинного кода, нажав клавишу F2 в тот момент, когда маркер выполнения находится на нужной команде в подокне кода окна процессора.Либо, если у вас есть мышь, нажмите кнопку на первых двух столбцах того места, где вы хотите установить точку останова. (Если вы находитесь в правом столбце, то в позиции указателя при этом появится кружочек). Количество одновременно установленных точек останова ничем не ограничено. Меню Breakpoints ----------------------------------------------------------------- Глобальное меню Breakpoints может быть вызвано в любой момент нажатием его активной клавиши Alt-B. ----------------------------- Toggle F2 At... Alt-F2 Changed memory global... Expression true global... Hardware breakpoint... Delete All ----------------------------- Команда Toggle Устанавливает или сбрасывает точку останова в выделенной строке окна модуля или подокна кода окна процессора. Активная клавиша - F2. Команда At Устанавливает точку останова в определенном месте программы. Отладчик запрашивает адрес строки, на которой необходимо установить точку останова. Активная клавиша - Alt-F2. Команда Changed Memory Global Устанавливает точку останова, которая переключается при изменении содержимого определенной области памяти. Отладчик запрашивает имя области памяти, за которой необходимо следить. Для получения более подробной информации обратитесь к описанию команды Changed Memory в разделе "Локальное меню окна точек останова", следующем ниже в данной главе. Команда Expression True Global Устанавливает точку останова, которая переключается, когда выражение, заданное пользователем становится истинным. Отладчик запрашивает выражение у пользователя. Для получения более подробной информации обратитесь к описанию команды Condition Expression True в разделе "Локальное меню окна точек останова", следующем ниже в данной главе. Команда Hardware Breakpoint Информация об интерфейсе аппаратного отладчика находится в файле на дистрибутивных дискетах. См. в файле README описание доступа к этой дисковой информации. Предупреждение! Для аппаратной отладки у вас должна иметься плата отладчика. Команда Delete All ------------------ Сбрасывает все установленные точки останова. Область действия выражений, заданных для точек останова ----------------------------------------------------------------- Как действие, выполняемое в точке останова, так и условие, при котором происходит ее включение, могут управляться выражением, вводимым пользователем. Это выражение вычисляется с учетом области действия адреса, в котором установлена точка останова, а не области действия точки, в которой была остановлена программа. Это означает, что в выражении, по которому происходит переключение точки останова, могут использоваться имена только тех переменных, которые являются допустимыми в том месте программы, в котором установлена точка останова (если эта область дейстия не заменяется). Более подробно области действия описаны в главе 9. Если в выражении используются локальные переменные некоторой подпрограммы, то переключаемая этим выражением точка останова будет работать значительно медленнее, чем точка останова, для включения которой используются только глобальные переменные и локальные переменные модуля. Окно точек останова ----------------------------------------------------------------- Окно точек останова (Breakpoints) открывается по команде View/Breakpoints главного меню. Оно позволяет пользователю просматривать и изменять условия переключения точки останова. Это окно можно использовать и для задания новых точек останова, удаления точек останова и настройки имеющихся точек останова. Окно точек останова разделено на два подокна. В левом подокне приведен список адресов, на которых установлены точки останова. В правом подокне приведена информация о точке останова, выделенной в левом подокне. Только левое подокно имеет свое локальное меню, которое вызывается нажатием клавиш Alt-F10. Его опции влияют на то, высвечивается ли точка останова в подокне Breakpoint List. Локальное меню окна точек останова --------------------- Set options... Hardware options... --------------------- Add... Remove Delete all Inspect --------------------- С помощью команд данного меню можно устанавливать новые точки останова, удалять имеющиеся и изменять поведение определенной точки останова. Локальное меню окна точек останова вызывается нажатием клавиш Alt-F10. Если для команды локального меню определена активная клавиша, для ее выбора достаточно нажать клавишу Ctrl в сочетании с первой буквой названия команды. Команда Set Options ------------------- Открывает блок диалога Breakpoint Options, в котором содержится два набора селективных кнопок, один блок ввода и один блок проверки. В этом блоке диалоге вы можете - определить, что происходит при срабатывании точки останова, высвеченной в подокне Breakpoint List - управлять условиями срабатывания точки прерывания - устанавливать число раз, которое может произойти заданное действие, прежде чем сработает точка останова. - разрешать или отменять точку останова - устанавливать или изменять адрес точки останова - делать точку останова глобальной Селективные кнопки Action (действие) имеют три возможных установки: Break (останов) Заставляет отладчик останавливать программу при переключении точки останова. После этого произойдет возврат в среду отладчика, и вы сможете ввести команды, необходимые для проверки структур данных своей программы. Execute (выполнение) Заставляет отладчик выполнять определенное выражение. Это выражение запрашивается отладчиком. Выражение не должно иметь таких побочных эффектов, как изменение значения переменной. Эта команда может использоваться для "вставки кода", позволяя вставлять выражение, которое будет выполнено перед текущей строкой программы. Log (регистрация) Заставляет отладчик зарегистрировать значение выражения в окне Log. Отладчик запросит у вас выражение, значение которого необходимо зарегистрировать. Будьте внимательны и не допускайте, чтобы это выражение имело какие-либо неожиданные побочные эффекты. Подробное описание побочных эффектов приведено в главе 9. Селективные кнопки Condition (условие) имеют четыре возмиожные установки, Always (всегда) Показывает, что для переключения точки останова не требуется выполнения никаких дополнительных условий. Changed Memory (изменение содержимого памяти) Следит за содержимым области памяти, занимаемой переменной или другим объектом, и позволяет переключить точку останова, если оно изменилось. Отладчик запрашивает у пользователя выражение, которое обращается к отслеживаемому объекту, и количество объектов, за которыми требуется следить. Общее число байтов в области памяти равно размеру объекта, к которому обращается выражение, умноженному на количество объектов. Например, если при отладке программы на Си ввести (long)a,4 длина отслеживаемой области будет равна 16 байтам, поскольку под тип long отводится 4 байта, и число таких объектов равно 4. Если задать это условие для глобальной точки останова, программа будет работать намного медленнее, поскольку указанная область памяти должна будет проверяться после выполнения каждой строки исходного текста. Если установлен драйвер аппаратного отладчика, программа, в которой задана подобная точка останова будет работать значительно быстрее. Если точка останова, включаемая при изменении содержимого области памяти, имеет аппаратную поддержку, после названия точки останова в левом подокне ставится знак "*". В этом случае можно убедиться, что точка останова не замедляет выполнение программы. Если задать это условие для точки останова, имеющей конкретный адрес, это не вызовет потери в скорости, как в случае с глобальной точкой останова, но сохранит возможность проверять нужную переменную при каждом выполнении определенной строки программы. Expression True (выражение истинно) Позволяет включать точку останова, когда выражение становится истинным (или принимает ненулевое значение). Отладчик запрашивает у пользователя выражение, значение которого должно вычисляться каждый раз, когда встречается данное действие. Hardware (аппаратная отладка) Заставляет отладчик включать точку останова с помощью драйвера устройства с аппаратной поддержкой. Используйте это меню, если работаете на машине с процессором 80386 и установлен драйвер устройства TDH386.SYS, или если в вашей машине имеется плата аппаратного отладчика и ее изготовитель снабдил ее драйвером устройства для отладчика Turbo Debugger. В поставляемой на дискетах документации рассмотрен интерфейс аппаратного отладчика и использование меню Hardware. Блок ввода Pass Count позволяет установить, сколько раз должно быть выполнено определенное действие прежде чем будет включена точка останова.По умолчанию это число равно 1. Счетчик количества проходов уменьшает свое значение на единицу, только когда условие включения точки останова выполняется. Это означает, что если вместе с условием задано количество проходов n, точка останова будет включена, когда в n-ый раз условие будет выполнено. Блок переключения Breakpoint Disabled разрешает или запрещает включать выделенную точку останова. Эта команда работает как триггер, имеющий два состояния: "разрешено" и "запрещено", который переключается при каждом выполнении данной команды. Запрещенная точка останова остается "невидимой", пока она снова не будет разрешена, и ведет себя так, как будто она была удалена. Этот блок полезно использовать в том случае, если была определена сложная точка останова, которая в данный момент не требуется, но впоследствии может снова понадобиться. Это исключает необходимость удалять точку останова, а затем снова ее задавать вместе с условиями ее включения и выполняемым действием. Команда Hardware Options Интерфейс аппаратного отладчика и использование данной команды описаны в документации на диске. Предупреждение! Для использовании средства аппаратной отладки необходимо иметь плату отладчика. Команда Add (добавить) ------------------------- Добавляет в список имеющихся точек останова еще одну точку. Вы должны ввести адрес в блоке ввода Address. Можно также добавить точку останова, просто начав вводить с клавиатуры адрес строки, в которой она должна быть установлена. На экране появится окно запроса, такое же, как и при выборе команды Add. После того, как будет задана новая точка останова, можно воспользоваться другими командами локального меню, чтобы изменить ее "поведение". После задания новой точки останова для нее устанавливается количество проходов равное 1, условия ее включения отсутствуют, а ее действием является прерывание (останов) выполнения программы. Команда Remove (удалить) ------------------------ Удаляет выделенную точку останова. Команда Delete All (удалить все) -------------------------------- Удаляет все точки останова, как глобальные, так и имеющие конкретные адреса. После этого, если требуется, можно задать другие точки останова. Команда Inspect (проверить) --------------------------- Показывает строку исходного текста или команду ассемблера, соответствующую выделенной точке останова. Если точка останова имеет адрес, соответствующий строке исходного текста программы, открывается окно модуля, в котором отмечена данная строка. В противном случае будет открыто окно процессора, в котором отмечена та команда, на которой установлена точка останова. Эту команду также можно вызвать, нажав Enter в тот момент, когда выделяющая полоса установлена на точке останова. Окно регистрации ----------------------------------------------------------------- Окно регистрации (Log) открывается при выборе команды View/Log. Это окно позволяет просматривать список важных событий, которые произошли во время сеанса отладки. В окне регистрации отображается список строк, которые во время отладки заносятся в журнал (log). Если в журнал было занесено более 50 строк, самые старые строки удаляются из вершины прокручиваемого в окне списка. Чтобы изменить количество строк в списке, можно либо задать соответствующий параметр командной строки при запуске отладчика, либо воспользоваться программой настройки TDINST. Можно также сохранить весь журнал, непрерывно записывая его в дисковый файл. Для этого служит команда Open Log File локального меню. Запись новой строки в журнал производится в одном из следующих случаев. - Работа программы была остановлена в указанном пользователем месте. Точка программы, в которой произошел останов, регистрируется в журнале. - Выполнена команда Add Comment локального меню. Отладчик запрашивает у пользователя комментарий и заносит его в журнал. - Включена точка останова при достижении выражением определенного значения. Это значение помещается в журнал. - Выполнена команда Window/Dump Pane To Log (из главного меню), которая регистрирует текущее содержимое подокна. Локальное меню окна регистрации ------------------- Open log file... Close log file Logging Yes Add comment... Erase log ------------------- Команды этого меню дают возможность управлять записью журнала в дисковый файл, начинать и прекращать запись, добавлять комментарии в журнал и очищать журнал. Локально меню окна регистрации вызывается нажатием клавиш AltF10. Если разрешено использование активных клавиш в комбинации с клавишей Ctrl, команду можно вызвать непосредственно, нажав клавишу Ctrl в сочетании с первой буквой ее названия. Команда Open Log File (открыть журнальный файл) -------------------------------------------------- По этой команде все строки, заносимые в журнал, записываются также в дисковый файл. Отладчик запрашивает у пользователя имя файла, в который будет записываться журнал. Когда открывается журнальный файл, все строки, которые уже имеются в прокручиваемом списке окна регистрации, переписываются в дисковый файл. Это дает возможность открывать дисковый журнальный файл после того, как в журнале была обнаружена важная информация, которую желательно записать на диск. Если требуется начать запись в дисковый файл не с той информации, которая уже имеется в окне регистрации, то прежде чем выбрать команду Open Log File, необходимо очистить окно регистрации командой Erase Log. Команда Close Log File (закрыть журнальный файл) ------------------------------------------------ Останавливает запись строк журнала в файл, заданный командой Open Log File локального меню, после чего файл закрывается. Команда Logging (регистрация) ----------------------------- Включает и выключает режим регистрации, управляя тем, будет ли что-то действительно занесено в окно регистрации. Команда Add Comment (добавить комментарий) ------------------------------------------ Дает возможность заносить комментарии в журнал. Отладчик запрашивает у пользователя строку текста, которая может содержать любые символы, выбранные пользователм. Команда Erase Log (стереть журнал) ---------------------------------- Очищает журнал. После этого окно регистрации становится пустым. Однако это не влияет на запись журнала в дисковый файл. Простые точки останова ----------------------------------------------------------------- Одним из наиболее общепринятых приемов, используемых при отладке программы, является приостановка ее работы в том месте, где начинается выполнение определенного фрагмента кода. В отладчике предусмотренно несколько способов задания точки останова. Выбор того или иного способа зависит от конкретной ситуации. - Переместите курсор к нужной строке исходного текста в окне модуля и выполните команду Breakpoints/Toggle (или нажмите клавишу F2 или кнопку мыши на данной строке). Выполнение этой команды для строки, на которой уже установлена точка останова, вызовет удаление этой точки останова. - Переместите курсор к нужной команде в подокне кода окна процессора и выполните команду Breakpoints/Toggle (или нажмите клавишу F2 или кнопку мыши на данной строке). Выполнение этой команды для строки, на которой уже установлена точка останова, вызовет удаление этой точки останова. - Выполните команду Breakpoints/At и введите адрес строки, на которой требуется установить точку останова. (Адрес кода имеет тот же формат, что и указатели в отлаживаемом языке. Выражения описаны в главе 9). - Выполните команду Add локального меню подокна списка окна точек останова и введите адрес строки, на которой требуется установить точку останова. Условные точки останова и количество проходов --------------------------------------------- Бывают такие ситуации, когда нежелательно включать точку останова при каждом выполнении определенной строки исходного кода, особенно если эта строка выполняется многократно прежде чем возникает та ситуация, которая интересует программиста. Turbo Debugger обеспечивает два способа управления фактическим включением точек останова: количество проходов и условия. Если требуется остановить работу программы на десятом вызове некоторой функции, можно установить точку останова в начале этой функции и использовать блок ввода Pass Count блока диалога Breakpoint Options, который определяет, сколько раз надо пропустить данную точку останова прежде чем она будет включена. Если требуется остановить работу программы в определенном месте, но только в том случае, если будет выполнено определенное условие, можно задать соответствующее выражение, используя селективную кнопку Expression True блока диалога Breakpoint Options. Каждый раз, когда будет встречаться данная точка останова, отладчик будет вычислять значение выражения, и если оно окажется истинным (ненулевым), точка останова будет включена. Этот способ можно использовать в сочетании с опрделением количества проходов, что позволит включать точку останова только после того, как выражение становилось истинным определенное количество раз. Используя селективную кнопку Change Memory локального меню, можно определить точку останова, которая будет включаться только в том случае, если изменится значение некоторого элемента данных. Этот способ может оказаться значительно более эффективным, чем задание глобальной точки останова, которая тщательно отслеживает все изменения. Если требуется проследить за изменением какого-либо элемента данных при достижении определенной строки исходного текста, этот способ уменьшает объем обработки, выполняемой отладчиком для определения момента изменения элемента данных. Глобальные точки останова ------------------------- Если требуется, чтобы условие, заданное для точки останова, проверялось при выполнении каждой строки исходного текста или команды кода, необходимо установить глобальную точку останова. Имеется несколько способов задания глобальной точки останова. Выбор того или иного способа зависит от конкретной ситуации. - В блоке диалога Breakpoint Options включите блок Global. Используйте эту команду, если хотите задать условие включения и/или количество проходов, либо если при включении точки останова вы хотите выполнить какое-либо действие, отличное от останова программы. - Выберите из главного меню команду Breakpoints/Changed Memory Global. Используйте ее для остановки программы при изменении содержимого области памяти. - Выберите из главного меню команду Breakpoints/Expression True Global. Используйте эту команду для остановки программы, когда выражение становится истинным. При задании глобальной точки останова обычно используется локальное меню окна Breakpoint, которое позволяет изменить условие или действие; в противном случае точка останова будет установлена на каждой строке исходного текста и будет работать точно так же, как команда Run/Trace Into главного меню. Для того чтобы проверять условия включения глобальных точек останова перед выполнением каждой строки исходного текста, убедитесь в том, что при перезапуске программы с помощью одной из команд меню Run окно процессора не является текущим. Для того чтобы проверять условия включения глобальных точек останова перед выполнением каждой команды, убедитесь в том, что при перезапуске программы окно процессора является текущим. Предупреждение! Глобальная точка останова выполняет проверку всех исходных строк или команд программы. Используйте глобальные точки останова, когда вам требуется точно определить момент, когда переменная изменяет значение или выполняется некоторое условие. Глобальные точки останова существенно замедляют работу программы. Однако, они весьма удобны для нахождения мест в программе, где происходит "порча" данных. После установки глобальной точки останова вы должны задать условие ее срабатывания. Останов при изменении объектов данных ------------------------------------- Если требуется определить, в какой момент выполнения программы происходит изменение значения определенного объекта данных, можно установить глобальную точку останова, используя один из способов, рассмотренных в предыдущем разделе. Затем можно использовать селективную кнопку Changed Memory блока диалога Breakpoint Options. Введите выражение, которое обращается к области памяти, за которой требуется следить, и необязательное количество объектов для слежения. При использовании этой команды программа начинает выполняться меделеннее. Поэтому прежде чем использовать этот способ для точного нахождения места программы, где происходит изменение элемента данных, можно сначала локализовать ошибку. Если установлен драйвер аппаратного отладчика, Turbo Debugger попытается для слежения за изменением области данных установить "аппаратную" точку останова. Различные аппаратные отладчики поддрерживают разное количество и разные виды аппаратных точек останова. Открыв окно точек останова с помощью команды View/ Breakpoints, можно проверить, используется ли для некоторой точки останова аппаратная поддержка. Каждая точка останова, имеющая аппаратную поддержку, помечается звездочкой (*). Эти точки останова работают значительно быстрее, чем другие глобальные точки останова, не имеющие аппаратной поддержки. Регистрация значений переменных ----------------------------------------------------------------- Иногда бывает полезно регистрировать значения отдельных переменных каждый раз, когда выполнение программы доходит до определенного места. (Замечание: на одной строке программы может быть установлена только одна точка останова.) Можно зарегистрировать значение любого выражения, включая, например, значения параметров, с которыми вызывается функция. Просматривая журнал после каждого вызова функции, можно определить, в какой момент она была вызвана с неверными параметрами. Выберите селективную кнопку Log из блока диалога Breakpoint Options. Отладчик попросит ввести выражение, значение которого должно регистрироваться каждый раз, когда включается точка останова. Если необходимо регистрировать значения нескольких переменных, надо задать несколько точек останова. Выполнение выражений ----------------------------------------------------------------- Выполняя выражение, имеющее побочные эффекты, при каждом включении точки останова, можно эффективно "вставлять" новые фрагменты кода перед данной строкой исходного текста. Это бывает полезно, когда требуется изменить поведение подпрограммы для проверки причины ошибки или ее исправления. Это исключает необходимость прохождения всего цикла компиляции и компоновки после внесения незначительного изменения в подпрограмму. Однако применение этого способа ограничено только вставкой выражения перед выполнением уже имеющейся строки исходного текста; то есть его нельзя использовать для непосредственной модификации существующих строк программы. |