|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Окно StackЭто окно позволяет проанализировать стек вызова и вывести в удобном для чтения формате все активные функции и значения аргументов. Окно Stack вы можете создать с помощью команды View Stack. В окне стека выводится список всех активных процедур и функций. Первой в списке указывается последняя вызванная процедуры, за которой следует вызвавшая ее процедура и предыдущая процедура, и так до самой первой функции программы (функция main в Си). Это окно выводит также имена функций-элементов, перед которой указывается имя класса. При рекурсивном вызове окно Stack содержит несколько экземпляров функции.
[*] Stack 3 [^][v]
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>
Диалоговое окно содержит три поля:
Запись в поле ввода New Value (Новое значение) будет действовать, если вы выберите кнопку Modify. Если вы выполняете отладку объектно-ориентированных программ C++, то окно Evaluate/Modify позволяет вам также вывести поля объекта или элементы экземпляра класса. Для каждого элемента, который может использоваться при вычислении записи, можно использовать спецификатор формата. Команда Function ReturnsПо команде Function Returns выводится возвращаемое текущей функцией значение. Используйте эту команду только тогда, когда функция собирается передать значение в вызывающую программу. Возвращаемое значение выводится в окне Inspector (Проверка), поэтому вы легко можете просмотреть значения, представляющие собой указатели на сложные объекты данных. Данная команда позволяет вам не переходить в окно CPU, когда требуется просмотреть возвращаемое через регистры процессора значение. Вычисление выраженийВыражение - это последовательность идентификаторов программы, констант и операций языка, при вычислении которого получается значение. Оно должно соответствовать синтаксису и правилам выбранного языка. Механизм вычисления выражений Turbo DebuggerПри вводе выражения в отладчике оно передается механизму вычисления выражения, который проверяет синтаксис и вычисляет значения идентификаторов, возвращая вычисленное значение. Чтобы задать механизм вычисления выражений, выберите команду Options Language, которая открывает диалоговое окно Expression Language. Это окно содержит кнопки с зависимой фиксацией Source, C, Pascal и Assembler, задающие язык для вычисления выражений. Кнопка Source определяет вычисления в соответствие с исходным языком. В большинстве случаев Turbo Debugger поддерживает полный синтаксис указанных языков. Типы выраженийВы можете использовать выражения для доступа к значением идентификаторов программы, вычисления значений и изменения значений элементов данных. Допускается задавать шестнадцатиричные значения, адреса памяти, строки программы, байтовые списки и вызовы функций. Формат записи шестнадцатиричного значения зависит от выбранного механизма вычисления:
При отладке 16-битового кода для задания адреса памяти вы можете использовать обозначение "сегмент:смещение", например:
Чтобы задать номер строки программы, перед десятичным номером строки укажите символ #. Можно задавать также байтовые списки:
Функции из выражений вызываются также, как в исходном коде. Это позволяет быстро проверить поведение функции. Выражения с побочными эффектамиПобочный эффект означает изменение при вычислении выражения элемента данных. Это мощный инструмент отладки. Побочные эффекты имеют выражения с операциями присваивания (=, += и др.) и выражения с операциями ++ и --. Спецификаторы форматаЧтобы изменить используемый по умолчанию формат вывода, укажите после выражение запятую и один из спецификаторов:
Если спецификатор формата не применим к типу данных выражения, он игнорируется. Вы можете задать таким же образом счетчик повторения (он указывает, что выражение относится к повторяющемуся элементу данных, например, массиву). Переопределение области действияОбласть действия идентификатора - это та область программы, в которой на него можно ссылаться. Заданные в выражении идентификаторы Turbo Debugger ищет в следующем порядке:
Для определения области действия идентификатора отладчик использует текущую позицию курсора. Если вы измените в отладчике область действия, это может дать непредсказуемые результаты, поэтому для возврата к текущей точке используйте команду Origin окна Module. Синтаксис переопределения области действия зависит от выбранного в окне Options Language языка. В Си, С++ и ассемблере для этого используется символ #, в Pascal - точка. Таким образом, для переопределения области действия используется следующий синтаксис (в квадратные скобки заключены необязательные элементы):
[#модуль[#имя_файла]]#номер_строки[#номер_переменной]
или
[#модуль[#имя_файла]][#имя_функции]#имя_переменной
Просмотр и модификация файловTurbo Debugger предусматривает два способа просмотра файлов на диске: окно Module и окно File. Окно Module чаще всего используется в отладчике. Его можно применять для просмотра исходного кода выполняемого модуля, скомпилированного с отладочной информацией. Строка заголовка этого окна показывает имя текущего загруженного модуля, имя текущего исходного файла и номер строки курсора. Выполняемая строка в этом окне помечается символом точки (.), а стрелка (>) в первой позиции показывает указатель команд. Он всегда отмечает следующий выполняемый оператор. При загрузке программы в отладчик окно Module загружается автоматически При выполнении программы по шагам окно Module автоматически показывает исходный код, соответствующий выполняемой инструкции. Перемещаясь по исходному коду, вы можете установить точки останова и задать отслеживаемые выражения, а также проверить значения переменных. Если в строке заголовка выводится opt, то программа оптимизирована компилятором. Это может затруднить поиск переменных. Если файл модифицирован после последней компиляции, то в заголовке выводится modified. Это может привести к несоответствию строк исходного текста. Перекомпилируйте программу. Команды меню окна ModuleМеню SpeedMenu окна Module содержит команды, позволяющие перемещаться по исходному тексту, выбирать и просматривать элементы данных и загружать новые исходные файлы. В TD32 это меню содержит дополнительные команды Thread и Edit.
Просмотр других файловДля просмотра любого файла на диске, включая двоичные и текстовые, используйте окно File. При выборе в строке меню команды View File отладчик выводит диалоговое окно Enter Name of File. Вы можете задать в нем трафаретные символы или конкретное имя файла. В зависимости от содержимого файла в открываемом окне File файлы выводятся в текстовом или шестнадцатиричном виде. Команды окна FileКоманды SpeedMenu окна File можно использовать для перемещения по файлу и изменения формата вывода.
Отладка на уровне ассемблераПри отладке программы на языке высокого уровня обычно достаточно отладки на уровне исходного кода. Однако иногда может потребоваться проанализировать программу глубже. Окно CPUЭто окно открывается командой View CPU строки меню и использует различные области для описания состояния вашей программы на нижнем уровне. Его можно использовать для
область регистров
область кода область стека
[*] CPU 80486 3 [^][ ]
TCDEMO.120: Inc(NumLines); ^ ax 0004 c=0
cs:04C4:4F36063000 inc word ptr [TPDEMO bx 3EEE z=0
TCDEMO.121 i := 1; cx 0000 s=0
cs:04C8 C:43FE0100 word ptr [bp+02].000 dx 5920 o=0
TCDEMO.122: while i <= Length(S) do si 3CEC p=0
cs:04C0 C47ED4 les di,[bp+04] bp 3EF4 a=0
cs:0400 288A05 mov al,es:[di] sp 3EF4 i=1
cs:0403 3D84 xor ah,ah ds 5920 d=0
cs:0405 3B48FE cmp ax,[bp+02] es 5920
cs:0408 7D03 jnl TPDEMO.125 (04DD) ss 595A
cs:040A 898A00 jmp TPDEMO.148 cs 548A
TCDEMO.125 while (i <= Length(S)) and notv ip 04C8
< >
ds:0008 5A 5D 5A 5D 5A 5D 00 00 Э^$< < ss:3EF2 548A
ds:0010 00 00 00 00 00 00 5A 5D 6D vЖ ss:3EF0>04C1
ds:0018 00 00 5A 5D 00 00 00 90 7 ss:3EEE 0246
область дампа область стека
Область кода показывает машинный код и дизассемблированные машинные инструкции вашей программы. Здесь могут также выводиться строки исходного кода. В области регистров выводится содержимое регистров ЦП. В области флагов показывается состояние 8 флагов процессора. В области дампа выводится шестнадцатиричный дамп любой области памяти, доступной для программы. Область стека показывает шестнадцатиричное содержимое стека программы. Область селекторов доступна только для TDW и показывает все селекторы Windows. Для адресных ссылок вне текущего сегмента в окне CPU выводятся знаки вопроса. Клавиша Ctrl в сочетании со стрелками позволяет сдвигать вывод на 1 байт. При выполнении кода Windows, модуля без отладочной информации, остановке программы на инструкции внутри строки исходного кода или при трассировке инструкций с помощью Alt+F7 окно CPU выводится автоматически. Область кодаВ левой части области кода выводятся адреса дизассемблированных инструкций. Для 16-разрядного кода они имеют вид "сегмент:смещение", а для 32-разрядного это 32-разрядные адреса. Стрелка (>) справа от адреса памяти указывает текущий адрес программы (следующую выполняемую инструкцию). Справа выводится шестнадцатиричный машинный код с соответствующей дизассемблированной инструкцией. Глобальные идентификаторы выводятся в виде имени, статические - в виде имени модуля с символов # и именем идентификатора, а номера строк представлены как имя модуля, # и номер строки. Клавиша F2 позволяет устанавливать/отменять точки останова. Меню SpeedMenu области кода содержит команды, позволяющие перемещаться по ней и ассемблировать вводимые инструкции. TDW имеет дополнительную команду ввода-вывода, а TD32 - команды Threads и OS Exceptions.
Область регистров и флаговВ области регистров (верхняя область справа от области кода) выводится содержимое регистров процессора. Вид этой области зависит от отладчика (TD32 или TDW). По умолчанию TDW выводит 13 16-разрядных регистров, а TD32 - всегда выводит 15 регистров процессора 80386 и старше. С помощью команд SpeedMenu области регистров вы можете модифицировать или сбрасывать содержимое регистров. Команда Increment добавляет 1 к текущему подсвеченному регистру, Decrement вычитает 1 из содержимого текущего подсвеченного регистр, а Change позволяет изменить содержимое регистра, выводя диалоговое окно Enter New Value для ввода нового значения. Последняя команда вызывается автоматически, если вы начинаете набор в области регистров. Команда Registers 32-bit, доступная только в TDW, переключает вывод регистров с 16-битовых на 32-битовые (сегментные регистры остаются 16-битовыми). Область флаговВ области флагов показано значение каждого флага ЦП. Список различных флагов и то, как они выводятся в области флагов, показан в следующей таблице: Буква в области Название флага c Флаг переноса z Флаг нуля s Флаг знака o Флаг переполнения p Флаг четности a Флаг дополнитель- ного переноса i Флаг разрешения прерывания d флаг направления | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SpeedMenu этой области содержит содержит команду Toggle, переключающую значение подсвеченного флага между 0 и 1.
В этой области выводится в шестнадцатиричном виде содержимое области памяти. В левой части каждой строки показан адрес (в виде "сегмент:смещение" или 32-разрядного адреса). Порядок регистров в области Dump имеет вид: DS, ES, SS, CS. Справа от адреса выводятся значения элементов данных в выбранном формате.
SpeedMenu области Dump содержит команды для перемещения по области, модификации содержимого, перемещению по указателям, задания формата вывода и работы с блоками памяти.
| Goto | Выводит диалоговое окно Enter Address to Position To, где вы можете ввести выражение, при вычислении которого получается адрес памяти, доступный программе. |
| Search | Ищет строку символов или список байт, начиная с адреса, указанного курсором. |
| Next | Ищет следующий экземпляр элемента, заданного в команде поиска. |
| Change | Позволяет модифицировать байты по текущему месту расположения курсора. При выводе в формате ASCII или шестнадцатиричном виде запрашивается список байт, в противном случае - элемент текущего формата вывода. |
| Follow |
Открывает меню с командами, позволяющими проверить данные по
адресам указателей near и far. TD32 содержит команды для 32-разрядной адресации.
Команда Near Code этого меню интерпретирует слово под курсором в области данных, как смещение в текущем сегменте кода (как это задается регистром CS). Область кода становится текущей областью и позиционируется на данный адрес. Команда Far Code интерпретирует двойное слово под курсором в области данных, как адрес дальнего типа (сегмент и смещение). Область кода становится текущей и позиционируется на данный адрес. Команда Offset to Data позволяет вам следовать по цепочке указателей размером в слово (ближнего типа, где используется только смещение). Область данных устанавливается в соответствии со смещением, заданным словом в памяти по текущей позиции курсора. Команда Segment:Offset to Data позволяет следовать по цепочке указателей дальнего типа размером в двойное слово (где используется сегмент и смещение). Область данных устанавливается в соответствии со смещением, заданным двойным словом в памяти по текущей позиции курсора. Команда Base Segment:0 to Data команда интерпретирует слово под курсором, как адрес сегмента, и позиционирует область данных на начало сегмента. |
| Previous | Восстанавливает адрес области данных в адрес, который был до последней команды, явно изменившей значение текущего адреса. Использование клавиш стрелок и клавиш перемещения курсора не приводит к запоминанию позиции. Отладчик поддерживает стек из пяти последних адресов, поэтому вы можете вернуться назад после многократного (< 5) использования команд локального меню Follow, или команды Goto. |
| Display As | Позволяет выбирать формат вывода в области данных. Вы можете выбирать один из форматов данных, использующихся в языке Си, Pascal или ассемблер. Эти форматы можно выбрать из меню. Команда Byte устанавливает область данных в режим вывода шестнадцатиричных байтовых данных. Word устанавливает область данных в режим вывода шестнадцатиричных слов. Long задает режим вывода длинных шестнадцатиричных целых чисел. Comp устанавливает режим вывода 8-байтовых целых чисел. Выводится десятичное значение числа. Float устанавливает режим вывода 6-байтовых чисел с плавающей точкой. Выводится значение числа с плавающей точкой в научном представлении. Double выводит 8-байтовые числа с плавающей точкой. Выводится значение числа в научном представлении. Extended устанавливает режим вывода 10-байтовых чисел с плавающей точкой в научном представлении. |
| Block | Позволяет работать с блоками памяти. Вы можете перемещать, очищать, присваивать значения блокам памяти, а также записывать и считывать блоки памяти из файлов на диске. По данной команде на экран выводится всплывающее меню. Команда Clear этого меню устанавливает непрерывный блок в памяти в значение 0. Адрес блока и число байт, которые требуется очистить, запрашиваются в выводимой подсказке. Move копирует блок памяти из одного адреса в другой. Адреса исходного и целевого блока, а также число копируемых байт, будут запрашиваться в подсказке. Set присваивает непрерывному блоку в памяти конкретное байтовое значение. Адрес блока, число байт, которым требуется присвоить значение, а также само значение запрашиваются в подсказке. Read считывает все содержимое или часть файла в блок памяти. Вам выводится подсказка для ввода имени считываемого файла, затем адреса, куда требуется считать информацию, и числа считываемых байт. Write записывает блок памяти в файл. Выводится подсказка для ввода имени файла, куда требуется записать данные, затем блока памяти, который нужно записать, и число считываемых байт. |
Эта область показывает шестнадцатиричное содержимое программного стека. Текущий указатель стека отмечается указателем >. SpeedMenu этой области содержит команды Goto, Origin, Follow, Previous и Change, аналогичные описанным выше командам.
В этой области (только для TDW) выводится список селекторов защищенного режима и указывается некоторая информация для каждого из них. Селектор может быть допустимым или нет. Допустимый селектор указывает на ячейку таблицы дескрипторов защищенного режима, соответствующего адресу памяти. Если селектор недопустим, то он не используется. Для допустимого селектора в области выводится следующее:
Если селектор ссылается на сегмент данных, то имеется дополнительная информация по полномочиям доступа (Read/Write - Чтение/ Запись или Read only - только чтение) и направление расширения сегмента в памяти (Up - вверх или Down - вниз).
Локальное меню области можно использовать для перехода к новому селектору или просмотра содержимого подсвеченного. В зависимости от характера данных, содержимое выводится в области кода или области дампа.
Команда Selector выводит подсказку для ввода селектора, который нужно вывести в области. Для ввода селектора вы можете использовать полный синтаксис выражений. Если вы вводите числовое значение, то TDW подразумевает, что оно десятичное (если вы не используете синтаксис текущего языка для указания того, что значение является шестнадцатиричным).
Другим методом ввода значения селектора является вывод окна CPU и проверка содержимого сегментных регистров. Если регистр содержит интересующий вас селектор, то вы можете ввести имя регистра с предшествующим символом подчеркивания (_). Например, вы можете задать имя сегментного регистра данных, как _DS.
Команда Examine выводит содержимое области памяти, на которую ссылается текущий селектор, и переключается в область, где выводится содержимое. Если селектор указывает на сегмент кода, то содержимое выводится в области кода. Если содержимое представляет собой данные, то оно выводится в области данных.
В этом окне выводится в непосредственном виде дамп любой области памяти. Оно работает так же, как область данных окна CPU.
[*] Dump 3 [^][v]
ds:0000 CD 20 00 A0 00 9A F0 FE = & U** ^
ds:0008 1B 02 B2 01 22 31 7C 01 <.^% .`
ds:0010 22 31 88 02 52 2B E2 1D * X 4-#
ds:0018 01 01 01 00 03 FF FF FF v
< >
С помощью команды View Another Dump вы можете одновременно открыть несколько окон Dump.
В окне Registers выводится содержимое регистров и флагов центрального процессора. оно работает, как сочетание областей регистров и флагов в окне CPU и имеет те же команды.
Назад | Содержание | Вперед
|
CITForum © 1997–2025