 |
позволяет исследовать поведение отдельных частей программы. В ка-
честве примера предположим, что вы хотите проверить поведение от-
дельных частей программы. Например, предположим, что вы хотите
проверить поведение какой-либо функции, при передаче ей некор-
ректных параметров. Вполне возможно, что сделать так, чтобы ваша
программа передала в функцию требуемое для этого значение, вам
сложно, однако вы можете получить нужный результат, изменив зна-
чение какой-либо переменной непосредственно перед тем, как прог-
рамма обратится к проверяемой функции.
Если для выхода из поля нового значения вы воспользуетесь
клавишей Esc (а не Ввод), то отладчик не будет менять значение
выражения. Мы советуем вам пользоваться этой клавишей в случае,
если вы по какой-либо причине изменили свои намерения и решили не
вводить нового значения.
Вы можете вычислить значение любого допустимого в Си
выражения, при условии, что оно не содержит:
# вызовы функции;
# описанные символы (с помощью define) или типы (с помощью
typedef). Например: *wordptr == 0x20 верно, тогда как *wordptr ==
SPACE - не допускается, так как SPACE является описанием);
# локальные или статические переменные, находящиеся вне
области действия выполняемой функции (за исключением случая, ког-
да они полностью специфицированы).
- 161,162 -
Спецификация имен переменных
-----------------------------------------------------------------
Существует две типичные ситуации, в которых возникает необ-
ходимость подробной спецификации имен переменных, использзуемых в
выражении:
# когда вы хотите проконтролировать значения переменных типа
static, находящихся в различных модулях;
# или, когда вы хотите просмотреть переменные типа auto (ло-
кальные) или типа static, находящиеся в другой функции.
Для полного описания имени переменной воспользуйтесь
следующим синтаксисом:
.<имя модуля>.<имя функции>.<имя переменной>
Отметим, что как имя модуля, так имя функции в определенных
случаях могут пропускаться. Например, если вы трассируете свою
функцию main и хотите узнать значение статической переменной с
именем myvar, находящуюся в другом модуле с именем mysubs, то вам
нужно ввести .mysubs.myvar. Если же переменная myvar находится в
функции myfunc модуля mysubs, то для определения ее значения вы
должны ввести .mysubs.myfunc.myvar. С другой стороны, если пере-
менная myfunc, расположенная в том же самом моделе, что и функция
main, то для определения ее значения вам достаточно ввести только
.myfunc.myvar.
- 163,164 -
Спецификаторы формата
-----------------------------------------------------------------
Для управления информацией, выводимой в окно Debug/Evaluate,
Турбо Си предоставляет вам спецификаторы формата выражений в поле
вычислений (которые подходят и для окна просмотра (Watch)). Спе-
цификаторы формата следуют за выражением, разделяются запятой и
могут быть набраны на верхнем или нижнем регистрах.
Спецификатор формата состоит из необязательного повторителя
(целого), следующего за ним символа формата; причем между повто-
рителем и символом формата не должно быть пробелов. В таблице 4.1
приводится список имеющихся символов формата и их описание.
Повторитель используется для вывода следующих подряд пере-
менных, типичным примером которых может служить массив. Например,
если list массив из 10 чисел, то выражение list будет выведено
следующим образом:
list: ( 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 )
Если вы хотите посмотреть часть массива, вы можете указать
индекс первого элемента и повторитель:
list[5],3: 60, 70, 80
Эта техника в частности полезна при выводе массивов большой
размерности, которые не помещаются в одной строке.
Применение повторителей не ограничивается массивами; за
любой переменной может следовать повторитель. Выражение
синтаксиса var, просто выводит последовательность из n пере-
менных такого же типа что и var, начиная с адреса var. Заметьте,
однако, что повторитель игнорируется если ваше выражение не соот-
ветствует переменной. В данной конструкции может использоваться
переменная если она находится в левой части оператора присваива-
ния или, если она используется в качестве аргумента функции.
- 165,166 -
Таблица 4.1 ОТЛАДОЧНЫЕ СПЕЦИФИКАЦИИ ФОРМАТА
-----------------------------------------------------------------
Символ Функция
-----------------------------------------------------------------
С Символ. Служит для замены управляющих символов
(ASCII от 0 до 31) на специальные символы. Напри-
мер ^С будет выведен как "Счастливое лицо" (Happy
face). Применяется для символов и строк.
S Строка. Выводит управляющие символы (ASCII от 0 до
31) как величины ASCII, в соответствии с принятыми
в Си управляющими последовательностями. Так как
функция выводит символ и строку по умолчанию, то
спецификатор S полезен только со спецификатором M.
D Десятичный. Все целые величины выводятся в
десятичном виде. Применяется для простых числовых
выражений, таких как массивы и структуры
содержащие числа.
H или X Шестнадцатиричный. Все целые величины выводятся в
шестнадцатеричном виде с префиксом 0x. Применяется
для простых числовых выражений, таких как массивы
и структуры, содержащие целые числа.
F С плавающей точкой. n - целое от 2 до 18,
обозначает количество значащих цифр,
предназначенных для вывода. Применяется только для
величин с плавающей точкой.
M Дамп памяти. Выводит дамп памяти, начиная с
адреса, указанного в выражении. Выражение может
быть конструкцией, допустимой в левой части опера-
тора присваивания, т.е. конструкцией, обозначающей
адрес памяти; в остальных случаях спецификатор M
игнорируется. По умолчанию, каждый байт переменной
представляется двумя шестнадцатиричными цифрами.
Если спецификатор M дополнен спецификатором D, то
байт представляется в виде десятичных цифр, если
же X или H, то в виде шестнадцатиричных. В случае
спецификаторов C или S переменные выводятся как
строки ( с или без специальных символов). По умол-
чанию, количество байт соответствует размеру пере-
- 167,168 -
менной, но может быть использован повторитель для
точного указания количества байт.
P Указатель. Выводит указатели в виде seg:ofs с
дополнительной информацией об адресе, это
предпочтительнее чем принятый по умолчанию машинно
-зависимый seg:ofs формат. Формат seg:ofs говорит
вам об области памяти, в которой размещен сегмент
и имени переменной по адресной ссылке. Ниже
приведены области памяти:
|