В Turbo Debugger понятие точки останова включает в себя три следующих элемента:
Адрес может представлять собой отдельный адрес в программе или быть глобальным (при этом останов может происходить на любой строке исходного кода или инструкции программы). Под условиями могут подразумеваться следующие условия, когда происходит останов:
Можно также задавать "счетчик проходов", который определяет, чтобы прежде чем сработает точка останова, "условие" должно принимать истинное значение определенное число раз.
При достижении точки останова может выполняться следующее действие:
Обычно точка останова устанавливается на конкретной исходной строке или машинной инструкции программы. Когда программа достигает точки останова, Turbo Debugger вычисляет ее. Однако точки останова могут быть и глобальными. Глобальные точки останова вычисляются отладчиком после выполнения каждой строки исходного кода или инструкции. Это позволяет определить момент модификации переменной или указателя.
Когда программа доходит до точки останова, Turbo Debugger проверяет условия точки останова и проверяет истинность заданного условия. Если условие выполняется, точка останова срабатывает. Такая точка останова называется условной.
Создать окно точек останова Breakpoints можно с помощью команды View Breakpoints основного меню. Это дает вам способ выбора
и установки условий, при которых срабатывает точка останова. Это
окно можно использовать для добавления новых точек останова, отмены (удаления) точек останова и изменения существующих точек останова.
[*] Breakpoints 3 [^][v]
TCDEMO.220 Breakpoint
TCDEMO.225 Always
TCDEMO.226 Enabled
< >
В левой области этого окна показан список всех адресов, где установлены точки останова. В правой области показаны подробные данные по текущим (подсвеченным в левой области) точкам останова.
Локальное меню SpeedMenu окна Breakpoints можно получить по нажатию клавиш Alt+F10. Команды данного меню позволяют вам добавлять новые точки останова, отменять существующие или изменять характер поведения имеющихся точек останова.
Когда вы впервые устанавливаете точку останова, Turbo Debugger создает по умолчанию простую точку останова. При достижении такой точки останова программа всегда приостанавливает выполнение. Чтобы выполнить программу до точки останова, нажмите F9.
Простейшие методы установки простых точек останова предлагают окно Module и область Code окна CPU.
Если вы работаете с клавиатурой, поместите курсор на любую выполняемую строку исходного кода или инструкцию в области кода окна CPU и нажмите F2. То же самое можно сделать с помощью команды Breakpoint Toggle. После установки точки останова соответствующая строка становится красной. Для отмены точки останова нажмите F2.
При работе с "мышью" вы можете установить точку останова, щелкнув на двух левых столбцах нужной строки. Повторный щелчок "мышью" отменяет точку останова.
Кроме того, команда Breakpoinr At (Alt+F2) позволяет установить простую точку останова на текущей строке. Кроме того, эта команда открывает диалоговое окно Breakpoint Options, которое предоставляет быстрый доступ к командам настройки точки останова.
Кроме установки точке останова из окон Module и CPU, Turbo Debugger предлагает для установки точек останова следующие команды. Чтобы установить простые точки останова на точках входа во все функции текущего загруженного модуля или все функции-элементы класса, используйте команду Group локального меню окна Breakpoints. Команда Add этого же меню также устанавливает точки останова. Она открывает диалоговое окно Breakpoint Options и позиционирует курсор на пустое поле ввода Address, где вы можете ввести адрес или номер строки.
После установки точки останова вы можете модифицировать действие, выполняемое по ее активизации. По умолчанию это "Break" - Turbo Debugger приостанавливает выполнение программы. О других действиях рассказывается ниже.
Эти точки останова также устанавливаются по конкретному адресу в программе, однако имеют специальные условия и связанные и ними действия.
Иногда точку останова нежелательно активизировать при каждом ее обнаружении, особенно когда содержащая ее строка выполняется многократно. Не всегда также желательно приостанавливать программу на точке останова. В таких случаях используются условные точки останова. Для создания условной точки останова можно выполнить следующие шаги:
Эти точки останова отслеживают выражения, при вычислении которых получается объект памяти или адрес. Они активизируются при изменении значения соответствующего объекта данных или указателя памяти. Для установки такой точки останова нужно выполните те же шаги, что и перечисленные выше, но
Когда ваша программа обнаруживает строку с такой точкой останова, условное выражение вычисляется перед выполнением этой строки. Это нужно учитывать.
При вводе выражения вы можете также ввести счетчик числа отслеживаемых объектов. Общее число отслеживаемых байт памяти равно произведению размеру объекта, на которое ссылается выражение, на счетчик объекта.
Эти точки останова являются по существую точками останова двух описанных выше типов, но отслеживаются они непрерывно в течении всего периода выполнения программы. Так как Turbo Debugger проверяет такие точки останова после выполнения каждой инструкции или строки исходного кода, они являются превосходным инструментом выявления того места в программе, где происходит порча данных.
Чтобы создать глобальную точку останова, установите сначала условную точку останова или точку останова по изменению памяти (как описано выше), затем после выхода из окна Conditions and Actions включите кнопку с зависимой фиксацией Global диалогового окна Breakpoint Options.
Поскольку глобальные точки останова не связываются с конкретными адресами программы, в поле ввода Address диалогового окна Breakpoint Options выводится <not available>.
Чтобы глобальная точка останова проверялась после выполнения каждой машинной инструкции, а не каждой строки исходного кода, в активном окне CPU нажмите F9. Эти точки останова сильно замедляют выполнение программы, поэтому использовать их нужно умеренно. Кроме того, для них не рекомендуется задавать условие "Always".
Меню Breakpoint содержит команды для быстрой установки глобальных точек останова: Changed Memory Global и Expression True Global. При этом по умолчанию выбирается действие "Break". Changed Memory Global устанавливает глобальную точку останова, активизируемую при изменении значения в памяти. Эта команда выводит подсказку для задания соответствующей области памяти Enter Memory Address и поле счетчика Count. Expression True Global устанавливает точку останова, срабатывающую при истинном значении заданного выражения.
Эти точки останова доступны в TDW и TD32 при отладке программ Windows NT. Они используют специальные отладочные регистры процессоров Intel 80386 и старше. Эти точки останова являются глобальными. Для работы с этими точками останова вам потребуется драйвер TDDEBUG.386. Скопируйте его с дистрибутивных диске и включите в файл CONFIG.SYS. (Инструкции содержатся в файле TD_HDWBP.TXT.) При правильной установке этого драйвера в поле Breakpoints диалогового окна File Get Info выводится Hardware (в противном случае - Software).
Чтобы установить аппаратную точку останова, выберите в меню Breakpoints команду Hardware Breakpoint. Эта команда автоматически устанавливает кнопку Global окна Breakpoint Options, кнопку Hardware в окне Conditions and Actions и открывает диалоговое окно Hardware Breakpoint Options. Это окно содержит все параметры аппаратных точек останова и полностью описано в файле TD_HDWBP.TXT.
Можно также создать аппаратную точку останова, модифицировав существующую точку останова:
Кнопка с зависимой фиксацией Action в диалоговом окне Conditions and Actions позволяет задать действия, выполняемые по точке останова.
Break | Break приводит к тому, что при срабатывании точки останова программа останавливается. Экран отладчика будет выведен заново, и вы можете вводить команды для просмотра структур данных программы. |
Execute | Execute приводит к выполнению выражения (выражение запрашивается в поле ввода Action Expression). Выражение должно иметь некоторые побочные эффекты, например, присваивание значения переменной. Эта возможность позволяет вам включить выражение, которое будет выполняться перед кодом вашей программы в строке с текущим номером ("вставка кода"). Такое средство полезно использовать, когда вы хотите изменить поведение подпрограммы, чтобы проверить "диагноз" или скорректировать ошибку. Это позволяет при проверке минимальных изменений в программе не выполнять цикл компиляции и компоновки. |
Log | Log приводит к тому, что значение выражения будет записано в окне Log. Вам выводится подсказка. В ответ на нее вы должны ввести выражение, значение которого требуется зарегистрировать. Будьте внимательны, чтобы выражение не имело никаких неожиданных побочных эффектов. |
Enable group | Enable group позволяет вновь активизировать запрещенную ранее группу точек останова. Укажите в поле ввода Action Expression номер группы. |
Disable group | Disable group позволяет запретить группу точек останова. При запрещении группы точек останова они не стираются, а просто маскируются на время сеанса отладки. Укажите в поле ввода Action Expression номер группы. |
Для задания активизации точки останова и того, что должно при этом происходить, используется окно Conditions and Actions. Обычно для каждой конкретной точки останова задается одно условие или выражение действия. Однако отладчик позволяет задавать несколько выражений. Кроме того, с одной точкой останова можно связать несколько условий и действий.
Чтобы задать набор условий, выберите кнопку с зависимой фиксацией Changed Memory of Expression, введите в поле ввода Condition Expression условие выберите кнопку Add под блоком ввода Condition Expression (если вводится несколько выражений, повторите эти шаги). Кнопка Delete под полем Condition Expression позволяет удалить из поля ввода Condition Expression текущее подсвеченное выражение.
При выборе кнопки с зависимой фиксацией Execute, Log, Enable Group или Disable Group в группе Action, то нужно задать набор условий, по которым Turbo Debugger будет активизировать точку останова. Набор условий состоит из одного или более выражений. Чтобы задать их, выберите кнопку с зависимой фиксацией Execute, Enable Group или Disable Group, введите действие в поле ввода Action Expression и выберите кнопку Add под полем ввода Action Expression. Чтобы при активизации точки останова выполнять более одного выражения, повторите эти шаги. При задании нескольких условий и действий они вычисляются в порядке их ввода.
При выборе кнопки Enable Group или Disable Group для ссылки на группы точек останова, которые нужно разрешить или запретить, наберите в поле Action Expression номер группы.
Кнопка Delete под полем Action Expression позволяет удалить из набора действие текущее подсвеченное выражение. Закончив ввод действий, выберите в диалоговом окне Condition Action командную кнопку OK.
Условия и действия точки останова управляются заданными выражениями. Turbo Debugger вычисляет выражение точки останова относительно области действия того места, где находится точка останова. Используя синтаксис переопределения области действия, вы можете обращаться к значениям любого определенного объекта данных, однако это замедляет вычисления.
Чтобы модифицировать точку останова в другом (не загруженном в данный момент) модуле, используйте команду View Another Module.
Объединение точек останова в группы позволяет разрешать, запрещать или удалять их одним действие. Кроме того, одной командой можно задать группу точек останова для всех функций (или функций-элементов) модуля.
Команда Group в локальном меню окна Breakpoint активизирует
диалоговое окно Edit Breakpoint Groups, с помощью которого вы можете создать или модифицировать точки останова.
[*] Edit Breakpoint groups
Group
1 #BCDEMO#38 #BCDEMO#39 OK
3 #BCDEMO#40
Help
Add... Delete Enable Disable
Группа точек останова идентифицируется положительным целым числом, которое автоматически генерируется отладчиком или назначается вами. Отладчик автоматически присваивает групповое число каждой создаваемой точке останова. Генерируемый номер группы представляет собой наименьший еще не использованный номер. Таким образом, если номера 1, 2 и 5 уже используются группами, то следующей создаваемой точке останова автоматически присваивается номер группы 3. После создания точки останова вы можете модифицировать статус ее группы с помощью команды Breakpoint Groups.
Кнопка Add окна Edit Breakpoints активизирует диалоговое окно Add Group, содержащее один блок списка и набор кнопок с зависимой фиксацией. Блок списка Module/Class выводит список модуле или классов текущей программы. Посветите нужных модуль или класс и выберите OK. Все устанавливаемые таким образом точки останова объединяются в одну группу. Кнопка Delete удаляет подсвеченную группу, а Enable/Disable разрешают или временно запрещают данную группу.
Кнопки с зависимой фиксацией позволяют выбрать тип функций, выводимых в блоке Module/Class: кнопка Modules выбирает все модули в текущей программе, а кнопка Classes - все ее классы.
Удалить точки останова можно с помощью локального меню (SpeedMenu) окна Breakpoints или меню Breakpoints. Команда Remove меню окна Breakpoints или клавиша Del стирают точку останова, подсвеченную в области списка. Команда Delete All меню Breakpoint и локального меню окна Breakpoints удаляют все установленные точки останова.
Turbo Debugger поддерживает размещение точек останова в шаблонах С++, шаблонах функций и шаблонах экземпляров классов и объектов. Для установки таких точек останова используются следующие методы:
Удаляются такие точки останова аналогично другим: позиционируйте курсор на точке останова в окне Module и нажмите F2. Удаляются все точки останова соответствующих экземпляров классов. Конкретные точки останова можно удалить с помощью окна CPU.
Программы для Windows NT состоят из одной или более выполняемых "нитей". При их отладки вы можете установит точки останова в конкретных нитях, даже если этот код совместно используется несколькими нитями. По умолчанию точка останова в программе Windows NT устанавливается во всех нитях программы. Чтобы установить ее только в одной нити, сделайте следующее:
Это окно отслеживает события, происходящие во время сеанса
отладки. Открывается оно по команде View Log и по умолчанию содержит до 50 строк текста (вы можете изменить это с помощью программы инсталляции).
[*] Log 3 [^][v]
At MCINPUT.124 ^
Breakpoint at TCDEMO.220
Breakpoint at TCDEMO.220
Breakpoint at TCDEMO.220
We are now entering procedure Params...
Breakpoint at TCDEMO.180 v
< >
В это окно записываются:
Команды SpeedMenu окна Log позволяют вам записывать журнал в файл на диске, останавливать и начинать регистрацию, комментировать журнал, очищать его и записывать в него информацию о программе Windows.
Open Log File | Эта команда записывает на дик все записи, регистрируемые в окне Log. Вам выводится подсказка для ввода имени файла на диске. По умолчанию он имеет расширение .LOG, а его имя соответствует имени программы. При открытии файла в него записываются все уже зарегистрированные записи. Если это нежелательно, выберите сначала команду Erase Log. |
Close Log File | Закрывает файл, открытый с помощью команды Open Log File. |
Logging | Разрешает/запрещает запись событий в окно Log. Используется для управления регистрацией событий. |
Add Comment | Позволяет включить в окно Log комментарии. Открывает диалоговое окно с подсказкой для ввода комментария. |
Erase Log | Очищает окно Log. Файл журнала на диске не изменяется. |
Display Windows Info | Доступна только для TDW и выводит на экран окно Windows Information. Позволяет вывести информацию о динамически распределяемой памяти и список модуля приложения. |
Данные вашей программы - это глобальные и локальные переменные, а также определенные константы. Для проверки и модификации данных в Turbo Debugger имеется ряд окон.
Это окно обеспечивает самый простой способ отслеживания элементов данных программы. В нем вы можете просматривать переменные
и выражения, значения которых нужно отслеживать.
[*] Watches 2 [^][v]
wordcount unsigned int 8 (Ox8) ^
wordcounts unsigned int [10] {1,2,4,6,1,1,2,0,0,0}
lettersinfo struct linfo [26] {(4,2),(1,1),(0,0),(1,1),(7,0),(.
nlines*nwords unsigned int 24 (Ox22)
totalcharacters unsigned long 88L (Ox42) v
< >
Это окно допускает просмотр значений как простых переменных, так и составных объектов данных (например, массивов). Элементы составных объектов выводятся в фигурных скобках ({}). Можно также отслеживать выражения, не ссылающиеся непосредственно на память. Отслеживаемые выражения перечисляются в левой части окна, соответствующие типы данных и значения - справа.
Чтобы задать отслеживаемые данные, выберите команду Data Add Watch, либо команду Watch локального меню окна Module, Variable или Watches. Turbo Debugger открывает диалоговое окно Enter Expression to Watch. Введите в нем имя переменной или выражение.
Если в окне Module курсор находится на переменной, то она автоматические добавляется в окно Watch при выборе окна Wathes в SpeedMenu. Это же относится к выражениям, выделенными с помощью клавиш Ins и стрелок.
Если не переопределяется область действия, отладчик вычисляет выражения относительно текущего указателя команд. Если выражение содержит символ, недоступный в активной области действия, то выводятся символы ????. При вводе выражений вы можете использовать имена еще не определенных переменных, поэтому имена следует вводить аккуратно (Turbo Debugger не распознает ошибок).
При трассировке внутри функции-элемента можно использовать указатель this, который можно сопровождать спецификаторами формата и квантификаторами.
SpeedMenu окна Wathes содержит все команды, необходимые для работы с элементами окна.
Wathes | Эта команда выводит подсказку для ввода имени переменной или выражения, добавляемого в окно Watches. Если не задается область действия, оно вычисляется относительно текущей позиции курсора. |
Edit | Открывает диалоговое окно Edit Watch Expression, позволяющее вам модифицировать подсвеченное в окне Wathes выражение. |
Remove | Удаляет из окна Watches подcвеченный элемент. |
Delete All | Удаляет из окна Watches все выражения. Ее полезно использовать при при перемещении из одной области программы в другую. |
Inspect | Открывает окно Inspector с детальной информацией по подсвеченному в окне Watch элементу. Ее полезно применять для просмотра сложного объекта данных. |
Change | Модифицирует значение текущей подсвеченной в окне Wathes переменной. При вводе в диалоговом окне Enter New Value нового значения Turbo Debugger выполняет необходимое преобразование типа. |
В этом окне, которое открывается по команде View Variable,
показаны все локальные и глобальные переменные (с именами и значениями), доступные из текущего места программы. Его можно использовать, чтобы найти переменные, написание имен которых вы не помните. Для дальнейшего анализа или изменения их значений можно
использовать команды локальных меню. Это окно можно также использовать для проверки переменных, локальных по отношению к любой вызванной функции.
[*] Variables 3 [^][v]
TCDEMO.SHORESULTS @7129:01fA
TCDEMO.INIT @7129:0402
TCDEMO.PROCESSLINE @7129:04B5
TCDEMO.PARMSONHEAP @7129:0651
TCDEMO.NUMLINES 1 ($1)
TCDEMO.NUMWORDS 0 ($0)
< >
CH 'A'
ISLETTER True
S 'ABC DEF'
I 1 ($1)
WORDLEN 28969
Окно имеет две области. Область глобальных переменных (вверху), показывает все глобальные идентификаторы программы. Область статических/локальных переменных (внизу) показывает все статические переменные (идентификаторы) текущего модуля. В обеих областях выводится имя переменной (слева) и ее значение (справа). Если отладчик не может найти информации о типе данных идентификаторов, то он выводит четыре вопросительных знака (????). Меню окна Variables
Каждая область окна Variables имеет собственное SpeemMenu. Оба меню содержат команды Inspect, Change и Wathes, а команда Show имеется только в области локальных идентификаторов.
Inspect | Открывает окно Inspector, где выводится содержимое подсвеченного идентификатора. В отличие от обычных окон Inspector, если вы проверяете глобальную переменную, имя которой совпадает с именем локальной переменной, то Turbo Debugger выводит значение глобальной переменной. При проверке имени функции активизируется окно Module, а курсор перемещается на имя этой функции в исходном коде (при его отсутствии выводится окно CPU). | |
Change | Открывает диалоговое окно Change, в котором можно изменит значение подсвеченного идентификатора. | |
Watch | Открывает окно Watches и добавляет в него подсвеченный идентификатор. При этом не отслеживается, глобальная это переменная или локальная. В блоке локальной переменной локальная переменная имеет старшинство. | |
Show | Выводит диалоговое окно Local Display. Кнопки с зависимой фиксацией этого окна позволяют разрешить или изменить область действия переменной в области локальных переменных. | |
Show | Показывать только статические переменные. | |
Auto | Только переменные, локальные для текущего блока. | |
Both | И статические, и локальные (по умолчанию). | |
Module | Смена текущего модуля. Выводит диалоговое окно со списком модулей программы. |
С помощью окна Stack вы можете проверить любые переменные или функции, которые находятся в стеке (включая рекурсию). Для этого откройте окно стека и подсветите проверяемую функцию. Затем нажмите F10 и выберите Locals. Область Statis окна Variables показывает значения аргументов.
Эти окна предоставляют наилучший способ просмотра элементов данных, так как они автоматически форматируются в соответствии с типом данных. Их особенно полезно использовать при проверке сложных объектов данных (массивов или связанных списков). Чтобы просмотреть данные в шестнадцатиричном виде, в активном окне Inpsector используйте команду View Dump. Окна Inspector открываются из команды Data Inspector или SpeedMenu окон Wathes, Variables или Inspector.
При открытии окна Inspector выводится диалоговое окно Enter Variable с подсказкой на ввод выражений. Введите имя переменной или выражение. Если в момент команды Inspect курсор находится на идентификаторе, или вы выделили выражение, то они автоматически помещаются в поле ввода. Заголовок окна Inspector содержит проверяемое выражение.
Скалярное окно Inspector показывает значения простых элементов данных, таких как char, int или long. Оно содержит две строки: в первой указан адрес переменной, а вторая показывает ее тип и значение (в десятичном/шестнадцатиричном виде).
[*] Inspecting wordcount 3 [^][v]
05A51:AA00
unsigned int 2 (0x02)
< >
Окно Inspector для указателей выводит значения переменных,
указывающих на другие элементы данных. В верхней строке указывается адрес переменной, а далее следует детальная информация об
указываемых данных. В нижней области показывается тип этих данных.
[*] Inspecting bufp 3 [^][v]
register ds:0874 [TCDEMO buffer] ^
[0] 'n' 110 (Ox88)
[1] '0' 111 (Ox6F)
[2] 'w' 119 (Ox77)
< >
char *
Если указатель ссылается на сложный объект данных, значения заключаются в фигурные скобки (выводится столько данных, сколько можно показать). При ссылке на строку символов выводится каждый элемент символьного массива с указанием индексов и значений. Команда Range позволяет выводить несколько строк информации.
Окна Inspector для структур и объединений показывают значения элементов в сложных объектах данных. Такое окно имеет две области. В верхней области выводится адрес объекта данных с перечислением имен и значений элементов данных объекта. Нижняя область содержит одну строку. Если вы в верхней области подсветите
адрес объекта данных, в нижне выводится тип объекта и его имя. В
противном случае там показывается тип элемента данных, подсвеченного в верхней области.
[*] Inspecting letterinfo[n] 3 [^][v]
$7937:0852 ^
count 2 (Ox2)
firstletter 2 (Ox2)
< >v
struct linfo
Область Inspector для массива показывает значения элементов
массива (каждому элементу соответствует строка). Слева выводится
индекс, справа - значение. Если значением является составной объект, Turbo Debugger выводит максимум данных объекта.
[*] Inspecting letterinfo 3 [^][v]
$7682:0852 ^
[0] {2,2}
[1] {2,0}
[2] {2,0}
[3] {1,1}
[4] {1,0}
< >
struct linfo [26]
Окно Inspector для функции показывает адрес функции, ее аргументы, а также возвращаемый функцией тип (в нижней области) и
соглашения по вызову.
[*] Inspecting analyzewords 3 [^][v]
071E9:02DD
char *bufp
< >
long ()
Range | Задает начальный элемент и число элементов, которые нужно просмотреть в массиве. |
Change | Позволяет изменить значение подсвеченного элемента на значение в окне Enter New Value. Необходимое приведение типа выполняется автоматически. |
Inspect | Открывает новое окно Inspector с элементом, подсвеченным в текущем окне Inspector. Используется для проверки составных объектов данных. Эту команду можно вызвать, подсветив элемент и нажав Enter. Если текущий элемент является функцией, то выводится окно Module. Для возврата в прежнее окно нажмите Esc. Чтобы закрыть все окна Inspector, дайте команду Window Close (Alt+F3). |
Descend | Эта команда работает аналогично команде Inspect локального меню, но она заменяет окно Inspector и выводит новые элементы. Это позволяет уменьшит число выводимых окон Inspector. Однако при использовании Descend для структуры данных вы не сможете вернуться к предыдущему просмотру. |
New Expression | Позволяет вам проверить другое выражение, которое замещает данные в текущем окне Inspector. |
Назад | Содержание | Вперед