Хотя языки программирования обычно имеют общие аспекты, их выражения редко
выглядят одинаково. Например, в ANSI Си, разыменование указателя
p
осуществляется операцией *p
, а в Модуле-2 это
выполняется как p^
. Представление (и отображение) значений также
может быть различным. Шестнадцатеричные числа в Си отображаются как
`0x1ae', в то время как в Модуле-2 они отображаются как `1AEH'.
В GDB встроена специальная информация о некоторых языках, которая позволяет описывать действия, подобные упомянутым, на языке вашей программы, и позволяет GDB выводить значения в виде, принятом в языке, на котором написана ваша программа. Язык, которым вы пользуетесь для построения выражений, называется рабочим языком.
Существует два способа управления рабочим языком: либо GDB
устанавливает его автоматически, либо вы можете сделать это
самостоятельно. Для этих целей вы можете воспользоваться командой set
language
. По умолчанию, при старте GDB устанавливает язык
автоматически. Рабочий язык используется, чтобы определить, как
интерпретируются вводимые вами выражения, как выводятся значения, и так
далее.
В дополнение к рабочему языку, каждый исходный файл, с
которым работает GDB, имеет свой собственный рабочий язык. Для
некоторых форматов объектных файлов компилятор может указывать, на
каком языке написан конкретный исходный файл. Однако, чаще всего
GDB распознает язык по имени файла. Язык исходного файла
определяет, будут ли восстанавливаться имена Си++; таким образом,
backtrace
может показывать каждый кадр в соответствии с
исходным языком. Не существует способа установить язык исходного файла
из GDB, но вы можете установить язык, ассоциированный с
расширением файла. См. раздел 9.2 Отображение языка программирования.
Наиболее часто эта проблема возникает, когда вы используете программу,
такую как cfront
или f2c
, которая создает текст на Си, но
написана на другом языке. В этом случае нужно сделать, чтобы программа
использовала директивы #line
в выводе текста Си; тогда
GDB будет знать правильный язык исходного текста первоначальной
программы, и выведет этот исходный код, а не сгенерированный код Си.
Если имя исходного файла заканчивается одним из следующих расширений, то GDB воспринимает это как указание на обозначенный язык.
В дополнение к этому, вы можете установить язык, ассоциированный с расширением имени файла. См. раздел 9.2 Отображение языка программирования.
Если вы позволяете GDB устанавливать язык автоматически, выражения в сеансе отладки и в вашей программе интерпретируются одинаково.
По желанию, вы можете установить язык сами. Для этого
воспользуйтесь командой `set language язык', где
язык -- название языка, например, c
или modula-2
.
Чтобы получить перечень поддерживаемых языков, наберите `set language'.
Установка языка вручную запрещает GDB автоматически переключать рабочий язык. Это может привести к неприятным последствиям, если вы попытаетесь отладить программу, когда рабочий язык не совпадает с исходным языком, а выражение допустимо в обоих языках, но означает разные вещи. Например, если текущий исходный файл написан на Си, а в GDB выбрана Модула-2, команда
print a = b + c
может не привести к ожидаемому результату. В Си это означает
сложить b
и c
и поместить результат в a
.
Выведенным результатом будет значение a
. В Модуле-2 это
означает сравнение a
с результатом b+c
, выдающее значение
типа BOOLEAN
.
Для автоматической установки рабочего языка, используйте `set language local' или `set language auto'. Тогда GDB будет определять рабочий язык автоматически. То есть при остановке вашей программы в кадре стека (обычно, в точке останова), GDB устанавливает рабочий язык в тот, который записан для функции в этом кадре. Если язык для кадра неизвестен (то есть, если функция или блок, соответствующие кадру, были определены в исходном файле, не имевшем распознаваемого расширения), текущий рабочий язык не изменяется, а GDB выдает предупреждающее сообщение.
Для большинства программ, которые написаны целиком на одном языке, автоматическая установка языка может показаться ненужной. Однако, в основной программе, написанной на одном исходном языке, могут использоваться программные модули и библиотеки, написанные на другом исходном языке. Использование в этом случае `set language auto' освобождает вас от установки рабочего языка вручную.
Следующие команды помогают вам определить, какой язык является рабочим, а также на каком языке были написаны исходные файлы.
show language
print
для построения и вычисления
выражений, в которые могут входить переменные вашей программы.
info frame
info source
При необычных обстоятельствах, у вас могут быть исходные файлы с расширениями, не входящими в стандартный список. Вы можете явно установить расширение, ассоциированное с языком:
set extension-language .расш язык
info extensions
Предупреждение: В этот выпуск включены команды GDB для проверки диапазона и соответствия типов, но они пока не оказывают никакого действия. Этот раздел описывает их предполагаемые возможности.
Некоторые языки обеспечивают защиту от достаточно общих ошибок с помощью набора проверок времени компиляции и времени выполнения. Это включает проверку типов аргументов функций и операторов и обеспечивает проверку математического переполнения во время выполнения. Проверки такого рода помогают убедиться в корректности программы после ее компиляции путем устранения несоответствия типов, и предоставляя активную проверку ошибок выхода за пределы диапазона во время выполнения.
По вашему желанию, GDB может проводить подобные проверки. Хотя
GDB не проверяет операторы вашей программы, он может, например, проверять
выражения, введенные непосредственно в GDB для вычисления
командой print
. Как и в случае рабочего языка,
GDB может также автоматически решить, выполнять проверку или нет,
основываясь на исходном языке вашей программы. См. раздел 9.4 Поддерживаемые языки, для информации об установках по умолчанию для
поддерживаемых языков.
Некоторые языки, такие как Модула-2, должны иметь жесткое соответствие типов, то есть аргументы операторов и функций должны иметь правильный тип, в противном случае возникает ошибка. Описанные здесь проверки предотвращают ошибки несоответствия типов, которые могут вызвать ошибки времени выполнения. Например,
1 + 2 => 3 но error--> 1 + 2.3
Во втором примере ошибка, потому что CARDINAL
1 не совместим по
типу с REAL
2.3.
Для выражений, используемых вами в командах GDB, вы можете указать GDB не производить проверку; или же рассматривать любое несоответствие как ошибку и прекращать обработку выражения; или только выводить предупреждение в случае возникновения несоответствия, но вычислять выражение в любом случае. В последнем случае, GDB вычисляет выражения, подобные второму примеру, но также выводит предупреждающее сообщение.
Даже если вы отключили проверку типов, GDB может прекратить
обработку выражения по другим причинам, связанным с типами. Например,
GDB не знает, как сложить int
и struct foo
. Такие
типы ошибок не имеют ничего общего с используемым языком и
обычно возникают из выражений, подобных описанному выше, которые нет смысла
вычислять.
Каждый язык определяет степень строгости контроля типов. Например, как Модула-2, так и Си требуют, чтобы аргументы арифметических операций были числами. В Си, перечисляемые типы и указатели могут быть представлены в виде чисел, так что они допустимы в качестве аргументов математических операторов. См. раздел 9.4 Поддерживаемые языки, для более подробного обсуждения конкретных языков.
GDB предоставляет некоторые дополнительные команды для контроля проверки типов:
set check type auto
set check type on
set check type off
set check type warn
show type
В некоторых языках (например, в Модуле-2), выход за границы диапазона типа считается ошибкой; эти ошибки отслеживаются с помощью контроля времени выполнения. Эти проверки диапазона служат для того, чтобы избежать переполнения при вычислениях и не допустить превышения индексами элементов массива границ индексации.
В выражениях, используемых вами в командах GDB, вы можете указать GDB обрабатывать ошибки диапазона одним из трех способов: игнорировать их, всегда рассматривать как ошибки и прерывать обработку выражения, или выводить предупреждение и продолжать вычисление выражения.
Ошибки диапазона могут возникать при числовом переполнении, при превышении границы индексации массива или при использовании константы, не принадлежащей ни одному типу. Однако, некоторые языки не считают переполнение ошибкой. Во многих реализациях Си математическое переполнение вызывает "циклический переход" к меньшему значению. Например, если m -- наибольшее целое значение, а s -- наименьшее, то
m + 1 => s
Это также является специфичным для конкретных языков, а в некоторых случаях -- для отдельного компилятора или машины. Для дальнейших сведений по отдельным языкам, См. раздел 9.4 Поддерживаемые языки.
GDB обеспечивает некоторые дополнительные команды для контроля проверки диапазона:
set check range auto
set check range on
set check range off
set check range warn
show range
GDB поддерживает Си, Си++, Фортран, Java, Chill, Ассемблер и
Модулу-2. Некоторые возможности GDB могут быть задействованы в
выражениях независимо от используемого языка: операторы GDB
@
и ::
и конструкция `{тип}адрес'
(см. раздел 8.1 Выражения) могут быть использованы в конструкциях
любого поддерживаемого языка.
Следующие разделы подробно описывают, до какой степени каждый из исходных языков поддерживается GDB. Эти разделы не задумывались как учебники или руководства по языкам; они лишь служат справочным руководством по тому, что допускает анализатор выражений GDB, и как должны выглядеть входные и выходные форматы в различных языках. Существует много хороших книг по каждому из этих языков; пожалуйста, загляните в них, если вам нужен учебник или справочник по языку.
Поскольку Си и Си++ тесно связаны, многие возможности GDB применимы к ним обоим. Когда это имеет место, мы обсуждаем эти языки вместе.
Средства отладки Си++ обеспечиваются совместно компилятором Си++
и GDB. Следовательно, для эффективной отладки программы на
Си++, вам следует пользоваться одним из поддерживаемых компиляторов,
например GNU g++
, или компилятором HP ANSI Си++
(aCC
).
При использовании GNU Си++, для получения наилучших результатов используйте формат отладочной информации stabs. Вы можете выбрать его явно с помощью ключа командной строки `-gstabs' или `-gstabs+'. Смотрите раздел `Ключи для отладки вашей программы или GNU CC' в Использование GNU CC, для дополнительной информации.
Операторы должны быть определены на значениях определенных типов.
Например, +
определен на числах, но не на структурах.
Операторы часто определяются на группах типов.
Для целей Си и Си++, имеют место следующие определения:
int
с любыми спецификаторами
класса памяти; char
; enum
; и, для Си++, bool
.
float
, double
и
long double
(если поддерживается целевой платформой).
(тип *)
.
Поддерживаются следующие операторы, перечисленные здесь в порядке возрастания приоритета:
,
=
опер=
a опер= b
и преобразовывается в a = a опер b
.
опер=
и =
имеют одинаковый приоритет.
опер может быть одним из операторов |
, ^
, &
,
<<
, >>
, +
, -
, *
,
/
, %
.
?:
a ? b : c
истолковывается
так: если a, то b, иначе c. a
должно быть целого типа.
||
&&
|
^
&
==, !=
<, >, <=, >=
<<, >>
@
+, -
*, /, %
++, --
*
++
.
&
++
.
Для отладки Си++, GDB реализует использование `&'
независимо от того, что позволяет сам язык Си++: вы можете использовать
`&(&ссылка)' (или просто `&&ссылка'),
чтобы исследовать адрес, по которому хранится
переменная-ссылка Си++ (объявленная с помощью `&ссылка').
-
++
.
!
++
.
~
++
.
., ->
struct
) и объединения (union
).
.*, ->*
[]
a[i]
определяется как
*(a+i)
. Имеет тот же приоритет, что и ->
.
()
->
.
::
struct
, union
и class
.
::
::
, описанный выше.
Если оператор переопределен в пользовательском коде, GDB обычно пытается выполнить переопределенную версию, а не использовать предопределенное значение оператора.
GDB позволяет вам выражать константы Си и Си++ следующими способами:
long
).
float
(в отличие от
double
по умолчанию), или буквой `l' или `L', что
указывает на константу типа long double
.
'
), или число -- порядковое значение соответствующего
знака (обычно его значение ASCII). Внутри кавычек, одиночный
знак может быть представлен либо буквой, либо экранирующей
последовательностью, которая имеет форму `\nnn', где
nnn является восьмеричным представлением порядкового значения
знака; или форму `\x', где `x' -- специальный
предопределенный знак, например, `\n' для знака новой строки.
"
). Туда
могут входить любые допустимые знаковые константы (как описано выше).
Двойным кавычкам внутри строки должна предшествовать обратная косая
черта, так что `"a\"b'c"', например, является строкой из пяти
знаков.
Обработчик выражений GDB может интерпретировать большинство выражений Си++.
Предупреждение: GDB может отлаживать программы на Си++, только если вы используете подходящий компилятор. Обычно отладка Си++ зависит от использования дополнительной отладочной информации в таблице символов и, таким образом, требует специальной поддержки. В частности, если ваш компилятор генерирует a.out, MIPS ECOFF, RS/6000 XCOFF или ELF с расширениями stabs к таблице символов, все эти средства доступны. (С GNU CC вы можете использовать ключ `-gstabs', чтобы явно запросить расширения отладки stabs). С другой стороны, если формат объектного кода -- стандартный COFF или DWARF в ELF, значительная часть поддержки Си++ в GDB не работает.
count = aml->GetOriginal(x, y)
this
по тем же правилам, что и Си++.
set overload-resolution off
. См. раздел 9.4.1.7 Возможности GDB для Си++.
Вы должны указать set overload-resolution off
, чтобы задать
функцию явно при вызове перегруженной функции, как в примере
p 'foo(char,int)'('x', 13)Возможности GDB для завершения команд могут упростить это; смотрите раздел 3.2 Завершение команд.
::
-- ваши выражения могут использовать его так же, как в вашей
программе. Так как одна область видимости может быть определена
внутри другой, вы можете при необходимости неоднократно использовать
::
, например, в выражении типа
`обл1::обл2::имя'. GDB также
позволяет определить область видимости имени путем ссылки на исходный
файл, при отладке как Си, так и Си++ (см. раздел 8.2 Переменные программы).
Кроме того, при использовании с компилятором HP Си++, GDB правильно поддерживает вызов виртуальных функций, вывод виртуальных баз объектов, вызов функций в базовом подобъекте, приведение объектов и выполнение операторов, определенных пользователем.
Если вы разрешаете GDB устанавливать проверки диапазона и принадлежности типу автоматически, обе они по умолчанию отключены, если рабочий язык изменяется на Си или Си++. Это происходит независимо от того, выбираете рабочий язык вы или GDB.
Если вы разрешаете GDB устанавливать язык автоматически, он распознает исходные файлы, чьи имена заканчиваются расширением `.c', `.C' или `.cc' и так далее, и когда GDB начинает обработку кода, скомпилированного из одного из этих файлов, он устанавливает рабочий язык в Си или Си++. См. раздел 9.1.3 Распознавание GDB исходного языка, для более подробного обсуждения.
Когда GDB производит разбор выражений Си или Си++, по умолчанию проверки соответствия типов не проводятся. Однако, если вы их включите, GDB считает типы двух переменных эквивалентными, если:
typedef
.
Проверка диапазона, если она включена, выполняется для математических операций. Индексы массивов не проверяются, так как они часто применяются для индексирования указателей, которые сами по себе массивами не являются.
Команды set print union
и show print union
применимы к типу
union
. При установке в `on', любые объединения, находящиеся внутри
структуры или класса, также выводятся. В противном случае, они
отображаются как `{...}'.
Оператор @
помогает при отладке динамических массивов,
сформированных с помощью указателей и функции выделения памяти.
См. раздел 8.1 Выражения.
Некоторые команды GDB особенно полезны при использовании с Си++, а некоторые разработаны специально для него. Ниже приведено их краткое описание:
меню точки останова
rbreak рег-выр
catch throw
catch catch
ptype имя-типа
set print demangle
show print demangle
set print asm-demangle
show print asm-demangle
set print object
show print object
set print vtbl
show print vtbl
vtbl
не работают для программ, скомпилированных
компилятором HP ANSI Си++ (aCC
).)
set overload-resolution on
on
. Для перегруженных функций,
GDB вычисляет аргументы и ищет функции, чьи сигнатуры
удовлетворяют типам аргументов, используя стандартные правила
преобразования Си++ (смотрите раздел 9.4.1.3 Выражения Си++, для
дополнительной информации). Если GDB не может найти такие
функции, он выводит сообщение.
set overload-resolution off
Перегруженные имена символов
символ(типы)
вместо просто
символ. Вы также можете воспользоваться средствами завершения
слова командной строки GDB, чтобы вывести список возможных
вариантов, или чтобы завершить набор за вас.
См. раздел 3.2 Завершение команд, для подробного обсуждения, как это
сделать.
Расширения, сделанные в GDB для поддержки Модулы-2, поддерживаются только для программ, скомпилированных компилятором Модулы-2 GNU (который сейчас разрабатывается). Другие компиляторы Модулы-2 в настоящее время не поддерживаются, и попытка отладки исполняемых программ, полученных ими, скорее всего приведет к ошибке при считывании GDB таблицы символов этой программы.
Операторы должны быть определены на значениях определенных типов.
Например, +
определен на числах, но не на структурах.
Операторы часто определяются на группах типов. Для целей Модулы-2,
имеют место следующие определения:
INTEGER
, CARDINAL
и их поддиапазонов.
CHAR
и его поддиапазонов.
REAL
.
POINTER TO
тип
.
SET
и BITSET
.
BOOLEAN
.
Поддерживаются следующие операторы; они представлены в порядке возрастания приоритета:
,
:=
перем := знач
является
знач.
<, >
<=, >=
<
.
=, <>, #
<
. В сценариях
GDB, для неравенства допустимо только <>
, так как
#
конфликтует со знаком комментария.
IN
<
.
OR
AND, &
@
+, -
*
/
*
.
DIV, MOD
*
.
-
INTEGER
и REAL
.
^
NOT
^
.
.
RECORD
. Определен для данных типа RECORD
.
Такое же приоритет, как у ^
.
[]
ARRAY
. Такой же
приоритет, как у ^
.
()
PROCEDURE
.
Такой же приоритет, как у ^
.
::, .
Предупреждение: Множества и операции над ними еще не поддерживаются, так что GDB трактует использование оператора
IN
или операторов+
,-
,*
,/
,=
, ,<>
,#
,<=
, и>=
на множествах как ошибку.
Модула-2 также делает доступными несколько встроенных процедур и функций. При их описании используются следующие метапеременные:
ARRAY
.
CHAR
.
SET OF метатип
(где метатип -- тип m).
Ниже описаны все встроенные процедуры Модулы-2, возвращающие результат.
ABS(n)
CAP(c)
CHR(i)
DEC(v)
DEC(v,i)
EXCL(m,s)
FLOAT(i)
HIGH(a)
INC(v)
INC(v,i)
INCL(m,s)
MAX(t)
MIN(t)
ODD(i)
ORD(x)
SIZE(x)
TRUNC(r)
VAL(t,i)
Предупреждение: Множества и операции над ними еще не поддерживаются, так что GDB рассматривает использование процедур
INCL
иEXCL
как ошибку.
GDB позволяет вам выражать константы Модулы-2 следующими способами:
'
), либо двойных ("
).
Они также могут быть заданы своим порядковым значением (обычно
ASCII-значением), за которым следует `C'.
'
), либо двойных
("
). Также допускаются экранирующие последовательности в
стиле Си. См. раздел 9.4.1.2 Константы Си и Си++, для краткого
объяснения экранирующих последовательностей.
TRUE
и FALSE
.
Если проверка диапазона или принадлежности типу устанавливается
GDB автоматически, то по умолчанию обе они устанавливаются в
on
, если рабочим языком становится Модула-2. Это происходит
независимо от того, кто выбрал рабочий язык -- вы или GDB.
Если вы разрешаете GDB выбирать язык автоматически, то при анализе кода, скомпилированного из файла, чье имя оканчивается на `.mod', GDB установит рабочим языком Модулу-2. См. раздел 9.1.3 Распознавание GDB исходного языка, для дополнительной информации.
Для упрощения отладки программ на Модуле-2 было сделано несколько изменений. В основном, это сделано путем ослабления строгости контроля типов:
:=
) возвращает значение своего правого аргумента.
Предупреждение: в этом выпуске, GDB еще не выполняет проверки диапазона и принадлежности типу.
GDB считает две переменные Модулы-2 эквивалентными по типу, если:
TYPE
t1 = t2
Пока проверка соответствия типов включена, любая попытка скомбинировать переменные неэквивалентных типов является ошибкой.
Проверка диапазона выполняется во всех математических операциях, присваиваниях, при индексации массивов и во всех встроенных функциях и процедурах.
::
и .
Существует несколько тонких различий между операторами области видимости
Модулы-2 (.
) и GDB (::
). Оба имеют похожий синтаксис:
модуль . идент область :: идент
где область -- имя модуля или процедуры, модуль -- имя модуля, а идент -- любой идентификатор, описанный в пределах вашей программы, за исключением другого модуля.
Использование оператора ::
заставляет GDB искать
идентификатор идент в области. Если он в ней
не найден, GDB ищет его во всех областях,
содержащих область.
Использование оператора .
заставляет GDB искать
идентификатор идент, который был импортирован из модуля определения
модуль, в текущей области видимости. В этом операторе cчитается
ошибкой, если идентификатор идент не был
импортирован из модуля определения модуль, или если идент не
является в нем идентификатором.
Некоторые команды GDB имеют мало смысла при отладке программ на
Модуле-2. Пять подкоманд из команд set print
и show
print
применимы исключительно к Си и Си++: `vtbl', `demangle',
`asm-demangle', `object' и `union'. Первые четыре
применимы к Си++, а последняя к типу Си union
, который не имеет
прямого аналога в Модуле-2.
Оператор @
(см. раздел 8.1 Выражения), хоть и доступен при
использовании любого языка, бесполезен при работе с Модулой-2. Его цель
состоит в том, чтобы помочь при отладке динамических массивов, которые
не могут быть созданы в Модуле-2 в отличие от Си или Си++. Однако,
конструкция `{тип}адр-выр' все же полезна, так как
адрес может быть определен целочисленной константой.
В сценариях GDB, оператор неравенства Модулы-2 #
интерпретируется как начало комментария. Используйте вместо него <>
.
Расширения, сделанные в GDB для поддержки Chill, работают только с программами, созданными компилятором GNU Chill. Другие компиляторы Chill в настоящее время не поддерживаются, и попытка отладить программы, полученные с их помощью, скорее всего приведет к ошибке в тот момент, когда GDB будет считывать таблицу символов выполняемого файла.
Этот раздел охватывает темы, связанные с Chill, и возможности GDB для их поддержки.
Поддержка GDB типов данных (режимов) Chill непосредственно связана с возможностями компилятора GNU Chill и, следовательно, слегка отличается от стандартной спецификации языка. Вот предоставляемые режимы:
Дискретные режимы:
BYTE,
UBYTE, INT, UINT, LONG, ULONG
,
BOOL
,
CHAR
,
SET
.
(gdb) ptype x type = SET (karli = 10, susi = 20, fritzi = 100)Если тип является ненумерованным множеством, значения элементов множества опускаются.
тип = <базовый-режим>(<нижняя граница> : <верхняя граница>)
где <нижняя граница>, <верхняя граница>
может быть любым
дискретным буквенным выражением (например, имена элементов множества).
Режим powerset:
POWERSET
, за
которым следует режим элемента.
(gdb) ptype x type = POWERSET SET (egon, hugo, otto)
Режимы-ссылки:
REF
, за которым следует название режима, к которому ссылка
привязана.
PTR
.
Процедурный режим
тип = PROC(<список параметров>)
<возвращаемый режим> EXCEPTIONS (<список исключений>)
. <список
параметров>
представляет собой список режимов параметров.
<возвращаемый режим>
указывает режим результата процедуры, если
она возвращает результат. <список исключений>
перечисляет все
возможные исключения, которые могут быть возбуждены процедурой.
Синхронизационные режимы:
EVENT (<длина события>)
где <длина события>
является необязательной.
BUFFER (<длина буфера>)<режим элементов буфера>
где (<длина буфера>)
является необязательной.
Режимы времени:
DURATION
TIME
Вещественные режимы:
REAL
и LONG_REAL
.
Строковые режимы:
CHARS(<длина строки>)
за которым следует ключевое слово VARYING
, если строковый режим
является изменяющимся режимом
BOOLS(<длина строки>)
Режим массива:
ARRAY(<диапазон>)
,
за которым следует режим элементов (который, в свою очередь, может быть
режимом массива).
(gdb) ptype x type = ARRAY (1:42) ARRAY (1:20) SET (karli = 10, susi = 20, fritzi = 100)
Структурный режим
STRUCT(<список
полей>)
. <список полей>
состоит из имен и режимов полей
структуры. Структуры с вариантами имеют ключевое слово CASE
<поле> OF <варианты поля> ESAC
в их списке полей. Так как текущая
версия компилятора GNU Chill не реализует обработку тегов (нет
проверок времени выполнения вариантных полей и, следовательно, нет
отладочной информации), вывод всегда содержит все вариантные поля.
(gdb) ptype str type = STRUCT ( as x, bs x, CASE bs OF (karli): cs a (ott): ds x ESAC )
Местоположением в Chill является объект, который может содержать значения.
Доступ к значению местоположения обычно производится посредством (описанного) имени местоположения. Вывод удовлетворяет спецификации значений в программах на Chill. То, как значения задаются, является темой следующего раздела, смотрите раздел 9.4.3.3 Значения и операции с ними.
Псевдоместоположение RESULT
(или result
) может
использоваться для отображения или изменения результата процедуры,
активной в настоящий момент:
set result := EXPR
Это делает то же самое, что и действие Chill RESULT EXPR
(которое
в GDB недоступно).
Значения местоположений режима ссылок выводятся, в случае режима
свободной ссылки, посредством
PTR(<шестнадцатеричное значение>)
, и с помощью (REF <режим ссылки>) (<шестнадцатеричное
значение>)
в случае привязанной ссылки. <шестнадцатеричное
значение>
представляет адрес, на который указывает ссылка. Для доступа
к значению местоположения, указываемого ссылкой, используйте оператор
разыменовывания `->'.
Значения местоположений процедурного режима отображаются как
{ PROC
(<режимы аргументов> ) <возвращаемый режим> } <адрес> <имя
местоположения процедуры>
<режимы аргументов>
-- это список
режимов, в соответствии со спецификацией параметров процедуры, а
<адрес>
указывает адрес точки входа.
Подструктуры значений строковых режимов, режимов массивов или структур (например, срезы массивов, поля структурных местоположений) доступны при использовании определенных операторов, которые описаны в следующем разделе, смотрите раздел 9.4.3.3 Значения и операции с ними.
Значение местоположения может быть интерпретировано как имеющее другой
режим посредством преобразования местоположений. Это преобразование
режимов записывается как <имя режима>(<местоположение>)
.
Пользователь должен учесть, что размеры режимов должны быть равными, в
противном случае возникает ошибка. Более того, не производится никаких
проверок диапазона местоположения по сравнению с режимом назначения, и,
следовательно, результат может быть достаточно обескураживающим.
(gdb) print int (s(3 up 4)) XXX TO be filled in !! XXX
Значения используются для изменения местоположений, для более подробного изучения сложных структур и для отфильтровывания значимой информации из большого объема данных. Определено несколько операций (зависящих от режима), которые позволяют проводить подобные изучения. Эти операции применимы не только к значениям-константам, но также и к местоположениям, что может оказаться достаточно полезным при отладке сложных структур. Во время разбора командной строки (например, вычисляя выражение), GDB рассматривает имена местоположений как значения этих местоположений.
Этот раздел описывает, как должны задаваться значения, и какие операции допустимо использовать с этими значениями.
Буквенные значения
Значения-наборы
<имя режима>[<набор>]
, где <имя
режима>
может быть опущено, если режим набора определяется однозначно.
Эта однозначность определяется из контекста вычисляемого выражения.
<набор>
может быть одним из:
Значение элемента строки
<строковое значение>(<индекс>)
где <индекс>
является целочисленным
выражением. Это дает знаковое значение, которое эквивалентно знаку,
указываемому в строке индексом <индекс>
.
Значение среза строки
<значение строки>(<спецификация
среза>)
, где <спецификация среза>
может быть либо диапазоном
целых выражений, либо задаваться в виде <начальное выражение> up
<размер>
. <размер>
обозначает число элементов, которое содержит
срез. Полученная величина является строкой, которая является частью
указанной строки.
Значения элементов массива
<величина
массива>(<выр>)
и дает величину элемента массива с режимом как у
указанного массива.
Значение среза массива
<значение массива>(<спецификация
среза>)
, где <спецификация среза>
может быть диапазоном,
определенным либо выражениями, либо как <начальное выр> up
<размер>
. <размер>
обозначает число элементов массива, которое
содержит срез. Получаемое значение есть массив, который является
частью указанного.
Значение поля структуры
<значение структуры>.<имя
поля>
, где <имя поля>
указывает имя поля, заданное в определении
режима структуры. Режим полученного значения соответствует этому
определению режима в определении структуры.
Значения вызова процедуры
ULONG
.
Значения местоположений режима-времени выводятся как
TIME(<сек>:<нсек>)
.
Значение безаргументного оператора
Значения выражений
OR, ORIF, XOR
AND, ANDIF
NOT
=, /=
>, >=
<, <=
+, -
*, /, MOD, REM
-
//
()
->
->loc
), или для
разыменовывания ссылки местоположения (loc->
).
OR, XOR
AND
NOT
>, >=
<, <=
IN
GDB считает два режима переменных Chill эквивалентными, если их размеры равны. Это правило применяется рекурсивно для более сложных типов данных. Это означает, что сложные режимы считаются эквивалентными, если режимы всех элементов (которые тоже могут быть сложными, например, массивами, структурами, и так далее) имеют одинаковый размер.
Проверка диапазона производится для всех математических операций, присваиваний, границ индексов массива и всех встроенных процедур.
Строгие проверки типов включаются с помощью команды GDB
set check strong
. Это навязывает строгую проверку диапазона и
принадлежности типу для всех действий, где используются конструкции
Chill (выражения, встроенные функции и так далее), в соответствии с
семантикой, определенной в спецификации языка z.200.
Все проверки могут быть отключены командой GDB set check
off
.
Если проверки типа и диапазона установлены GDB автоматически, обе они по умолчанию включены, когда рабочий язык переключается на Chill. Это происходит независимо от того, вы выбрали рабочий язык или GDB.
Если вы разрешите GDB устанавливать рабочий язык автоматически, то при попадании в код, скомпилированный из файла, чье имя заканчивается на `.ch', он переключает рабочий язык на Chill. См. раздел 9.1.3 Распознавание GDB исходного языка, для дополнительной информации.