Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

[]_YAzueki_programmirovaniya_C_i_C++(BookFi.org)

.pdf
Скачиваний:
18
Добавлен:
25.03.2016
Размер:
1.43 Mб
Скачать
3
'n' 110 (Ox88) '0' 111 (Ox6F) 'w' 119 (Ox77)

Отладчик Turbo Debugger

проверяемую функцию. Затем нажмите F10 и выберите Locals. Область Statis окна Variables показывает значения аргументов.

Окна Inspector

Эти окна предоставляют наилучший способ просмотра элементов данных, так как они автоматически форматируются в соответствии с типом данных. Их особенно полезно использовать при проверке сложных объектов данных (массивов или связанных списков). Чтобы просмотреть данные в шестнадцатеричном виде, в активном окне Inpsector используйте команду View Dump. Окна

Inspector открываются из команды Data Inspector или SpeedMenu окон Wathes, Variables или Inspector.

При открытии окна Inspector выводится диалоговое окно Enter Variable с подсказкой на ввод выражений. Введите имя переменной или выражение. Если в момент команды Inspect курсор находится на идентификаторе, или вы выделили выражение, то они автоматически помещаются в поле ввода. Заголовок окна Inspector содержит проверяемое выражение.

Скалярное окно Inspector показывает значения простых элементов данных, таких как char, int или long. Оно содержит две строки: в первой указан адрес переменной, а вторая показывает ее тип и значение (в десятичном/шестнадцатеричном виде).

[*] Inspecting

wordcount

3

05A51:AA00

 

 

unsigned int

2

(0x02)

Окно Inspector для указателей выводит значения переменных, указывающих на другие элементы данных. В верхней строке указывается адрес переменной, а далее следует детальная информация об указываемых данных. В нижней области показывается тип этих данных.

[*] Inspecting bufp

register ds:0874 [TCDEMO buffer] [0] [1] [2]

char *

297

3
{2,2}
{2,0}
{2,0}
{1,1}
{1,0}

Отладчик Turbo Debugger

Если указатель ссылается на сложный объект данных, значения заключаются в фигурные скобки (выводится столько данных, сколько можно показать). При ссылке на строку символов выводится каждый элемент символьного массива с указанием индексов и значений. Команда Range позволяет выводить несколько строк информации.

Окна Inspector для структур и объединений показывают значения элементов в сложных объектах данных. Такое окно имеет две области. В верхней области выводится адрес объекта данных с перечислением имен и значений элементов данных объекта. Нижняя область содержит одну строку. Если вы в верхней области подсветите адрес объекта данных, в нижней выводится тип объекта и его имя. В противном случае там показывается тип элемента данных, подсвеченного в верхней области.

[*] Inspecting

letterinfo[n]

3

$7937:0852

 

 

count

2 (Ox2)

 

firstletter

2 (Ox2)

 

struct linfo

Область Inspector для массива показывает значения элементов массива (каждому элементу соответствует строка). Слева выводится индекс, справа — значение. Если значением является составной объект, Turbo Debugger выводит максимум данных объекта.

[*] Inspecting letterinfo $7682:0852 [0] [1] [2] [3] [4]

struct linfo [26]

Окно Inspector для функции показывает адрес функции, ее аргументы, а также возвращаемый функцией тип (в нижней области) и соглашения по вызову.

298

 

 

Отладчик Turbo Debugger

 

 

 

[*]

Inspecting analyzewords

3

071E9:02DD

 

char

*bufp

 

long

()

 

Меню окон Inspector

SpeedMenu окон Inspector содержит ряд полезных команд.

Range

Задает начальный элемент и число элементов, которые нужно просмотреть в массиве.

Change

Позволяет изменить значение подсвеченного элемента на значение в окне Enter New Value. Необходимое приведение типа выполняется автоматически.

Inspect

Открывает новое окно Inspector с элементом, подсвеченным в текущем окне Inspector. Используется для проверки составных объектов данных. Эту команду можно вызвать, подсветив элемент и нажав Enter. Если текущий элемент является функцией, то выводится окно Module. Для возврата в прежнее окно нажмите Esc. Чтобы закрыть все окна Inspector, дайте команду Window Close (Alt+F3).

Descend

Эта команда работает аналогично команде Inspect локального меню, но она заменяет окно Inspector и выводит новые элементы. Это позволяет уменьшит число выводимых окон Inspector. Однако при использовании Descend для структуры данных вы не сможете вернуться к предыдущему просмотру.

New Expression

Позволяет вам проверить другое выражение, которое замещает данные в текущем окне Inspector.

Окно Stack

Это окно позволяет проанализировать стек вызова и вывести в удобном для чтения формате все активные функции и значения аргументов. Окно Stack вы можете создать с помощью

299

Отладчик Turbo Debugger

команды View Stack. В окне стека выводится список всех активных процедур и функций. Первой в списке указывается последняя вызванная процедуры, за которой следует вызвавшая ее процедура и предыдущая процедура, и так до самой первой функции программы (функция main в Си). Это окно выводит также имена функций элементов, перед которой указывается имя класса. При рекурсивном вызове окно Stack содержит несколько экземпляров функции.

[*] Stack

3

TCDEMO.PROCESSLINE.ISLETTER('A')

TCDEMO.PROCESSLINE('ABCDEF')

SpeedMenu окна Stack содержит две команды: Ispect и Locals. Команда Inspect открывает окно Module и позиционирует курсор на активную строку подсвеченной функции. Если подсвеченная функция находится в вершине стека вызова (последняя вызванная функция), то в окне Module показывается положение счетчика команд. В противном случае курсор позиционируется на строку после вызова соответствующей функции. Вызвать эту команду можно также нажатием Enter после подстветки нужной функции. Команда Locals открывает окно Variables с идентификаторами, локальными для текущего модуля и подсвеченной функции.

Команда Evaluate/Modify

Эта команда меню Data открывает диалоговое, которое содержит текст по текущей позиции курсора или выражение, выбранное с помощью Ins и стрелок, затем вычисляет его (если вы выберите кнопку Eval) так же, как это сделал бы компилятор. Результат помещается в поле Result.

[*]

Evaluate/Modify

 

Expression

 

Eval

thisShape[CurrentPoint]

 

CurrentShape

== LINE

 

HIWORD<lParam>

 

 

 

 

Cancel

Result

 

 

struct SSHAPE

<<113,116,0,0>,5,1,0,0>

Help

New

value

 

Modify

<not

avaliable>

 

300

Отладчик Turbo Debugger

Диалоговое окно содержит три поля:

В поле ввода Expression вы можете ввести выражение для вычисления. После содержит протокол всех введенных выражений.

В средней области выводится результат вычисления вашего выражения. Если строки данных слишком велики и не умещаются в поле результата, то они заканчиваются символом >. «Прокрутив» окно вправо, вы можете просмотреть остаток строки.

Нижняя область New Value — это область ввода, в

которой вы можете ввести новое выражение для вычисления. Если выражение модифицировать нельзя, то в данной области выводится сообщение <not avaliable>.

Запись в поле ввода New Value (Новое значение) будет действовать, если вы выберите кнопку Modify. Если вы выполняете отладку объектно ориентированных программ C++, то окно Evaluate/Modify позволяет вам также вывести поля объекта или элементы экземпляра класса. Для каждого элемента, который может использоваться при вычислении записи, можно использовать спецификатор формата.

Команда Function Returns

По команде Function Returns выводится возвращаемое текущей функцией значение. Используйте эту команду только тогда, когда функция собирается передать значение в вызывающую программу. Возвращаемое значение выводится в окне Inspector (Проверка), поэтому вы легко можете просмотреть значения, представляющие собой указатели на сложные объекты данных. Данная команда позволяет вам не переходить в окно CPU, когда требуется просмотреть возвращаемое через регистры процессора значение.

Вычисление выражений

Выражение — это последовательность идентификаторов программы, констант и операций языка, при вычислении которого получается значение. Оно должно соответствовать синтаксису и правилам выбранного языка.

301

Отладчик Turbo Debugger

Механизм вычисления выражений Turbo Debugger

При вводе выражения в отладчике оно передается механизму вычисления выражения, который проверяет синтаксис и вычисляет значения идентификаторов, возвращая вычисленное значение. Чтобы задать механизм вычисления выражений, выберите команду Options Language, которая открывает диалоговое окно Expression Language. Это окно содержит кнопки с зависимой фиксацией Source, C, Pascal и Assembler, задающие язык для вычисления выражений. Кнопка Source определяет вычисления в соответствие с исходным языком. В большинстве случаев Turbo Debugger поддерживает полный синтаксис указанных языков.

Типы выражений

Вы можете использовать выражения для доступа к значением идентификаторов программы, вычисления значений и изменения значений элементов данных. Допускается задавать шестнадцатеричные значения, адреса памяти, строки программы, байтовые списки и вызовы функций. Формат записи шестнадцатеричного значения зависит от выбранного механизма вычисления:

Язык

16 разрядный

32 разрядный

C

0xnnnn

0xnnnnnnnn

Pascal

$nnnn

$nnnnnnnn

Assembler

0nnnn

0nnnnnnnn

При отладке 16 битового кода для задания адреса памяти вы можете использовать обозначение «сегмент:смещение», например:

Язык

Формат

Пример

C

Oxnnnn

Ox1234:Ox0010

Pascal

$nnnn

$1234:0010

Assembler

nnnnh

1234h:0B234h

Чтобы задать номер строки программы, перед десятичным номером строки укажите символ #. Можно задавать также байтовые списки:

302

 

 

Отладчик Turbo Debugger

 

 

 

Язык

Список

Данные

C

1234"AB"

34 12 41 42

Pascal

"ab"0x04"c"

61 62 04 63

Assembler

'ab'$04'c'

61 62 04 63

Функции из выражений вызываются также, как в исходном коде. Это позволяет быстро проверить поведение функции.

Выражения с побочными эффектами

Побочный эффект означает изменение при вычислении выражения элемента данных. Это мощный инструмент отладки. Побочные эффекты имеют выражения с операциями присваивания (=, += и др.) и выражения с операциями ++ и .

Спецификаторы формата

Чтобы изменить используемый по умолчанию формат вывода, укажите после выражение запятую и один из спецификаторов:

c

Символ или строка выводятся на экран в виде необработанных символов. Обычно непечатаемые символы выводятся в виде управляющих символов или в числовом формате. Этот параметр приводит к тому, что при выводе символов будет использоваться полный набор символов дисплея IBM.

d

Целое число выводится в виде десятичного значения.

f[#]

Формат с плавающей точкой с заданным числом цифр. Если вы не задаете число цифр, то используется столько цифр, сколько необходимо.

m

Выражение со ссылкой на память выводится в виде шестнадцатеричных байт.

md

Выражение со ссылкой на память выводится в виде десятичных байт.

303

Отладчик Turbo Debugger

P

Выводится необработанное значение указателя, показывающее сегмент, как имя регистра (если это возможно). Показывается также объект, на который указатель ссылается. Если управление форматом не задано, то это используется по умолчанию.

s

Выводится массив или указатель на массив символов (строка, заключенная в кавычки). Строка завершается нулевым символом.

x или h

Целое выводится в виде шестнадцатеричного значения.

Если спецификатор формата не применим к типу данных выражения, он игнорируется. Вы можете задать таким же образом счетчик повторения (он указывает, что выражение относится к повторяющемуся элементу данных, например, массиву).

Переопределение области действия

Область действия идентификатора — это та область программы, в которой на него можно ссылаться. Заданные в выражении идентификаторы Turbo Debugger ищет в следующем порядке:

идентификаторы в стеке текущей функции;

идентификаторы в модуле, содержащем текущую функцию;

глобальные идентификаторы (вся программа);

глобальные идентификаторы в DLL, начиная с первой загруженной DLL.

Для определения области действия идентификатора отладчик использует текущую позицию курсора. Если вы измените в отладчике область действия, это может дать непредсказуемые результаты, поэтому для возврата к текущей точке используйте команду Origin окна Module.

Синтаксис переопределения области действия зависит от выбранного в окне Options Language языка. В Си, С++ и ассемблере для этого используется символ #, в Pascal — точка. Таким образом, для переопределения области действия

304

Отладчик Turbo Debugger

используется следующий синтаксис (в квадратные скобки заключены необязательные элементы):

[#модуль[#имя_файла]]#номер_строки[#номер_переменной]

или

[#модуль[#имя_файла]][#имя_функции]#имя_переменной

Просмотр и модификация файлов

Turbo Debugger предусматривает два способа просмотра файлов на диске: окно Module и окно File. Окно Module чаще всего используется в отладчике. Его можно применять для просмотра исходного кода выполняемого модуля, скомпилированного с отладочной информацией. Строка заголовка этого окна показывает имя текущего загруженного модуля, имя текущего исходного файла и номер строки курсора. Выполняемая строка в этом окне помечается символом точки (.), а стрелка (>) в первой позиции показывает указатель команд. Он всегда отмечает следующий выполняемый оператор. При загрузке программы в отладчик окно Module загружается автоматически

При выполнении программы по шагам окно Module автоматически показывает исходный код, соответствующий выполняемой инструкции. Перемещаясь по исходному коду, вы можете установить точки останова и задать отслеживаемые выражения, а также проверить значения переменных. Если в строке заголовка выводится opt, то программа оптимизирована компилятором. Это может затруднить поиск переменных. Если файл модифицирован после последней компиляции, то в заголовке выводится modified. Это может привести к несоответствию строк исходного текста. Перекомпилируйте программу.

Команды меню окна Module

Меню SpeedMenu окна Module содержит команды, позволяющие перемещаться по исходному тексту, выбирать и просматривать элементы данных и загружать новые исходные файлы. В TD32 это меню содержит дополнительные команды

Thread и Edit.

Inspect

Открывает окно Inspector с подробной информацией о переменной программы в позиции курсора (если курсор не установлен на переменной, выводится подсказка). Для быстрого

305

Отладчик Turbo Debugger

перемещения и выбора выражений в окне Module используйте стрелки и клавишу Ins. После выбора выражения активизируйте окно Inspector с помощью Ctrl+I.

Watch

Добавляет переменную в текущей позиции курсора в окно Watch. Включение переменной в окно Watches позволяет отслеживать ее значение при выполнении.

Thread

Открывает диалоговое окно Pick a Thread, из которого вы можете выбрать для отслеживания конкретную нить программы.

Module

Команда Module (F3) позволяет выбрать в диалоговом окне Load Module Source or DLL и загрузить в отладчик другой модуль.

File

Позволяет просмотреть другой исходный файл, входящий в состав данного модуля. Открывает диалоговое окно Pick a Source File с перечнем исходных файлов, содержащихся в выполняемом коде. При выборе нового файла он заменяет в окне Module текущий. Чтобы просматривать их одновременно, используйте команду View Another Module.

Previous

Возвращает вас к тому месту исходного кода, которое вы просматривали перед сменой позиции.

Line

Позиционирует вас на новую строку с указанным номером, который задается в выводимом диалоговом окне Enter New Line Number.

Search

Ищет заданную строку символов, начиная с текущей позиции курсора. Строка задается в выводимом диалоговом окне Enter Search String. Если курсор позиционирован на имени переменной, то окно инициализируется этим именем. Чтобы инициализировать окно Search String, вы можете также выделить с помощью Ins и стрелок блок файла. В строке поиска можно задавать трафаретные символы * и ?.

306