[Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]  


9. Использование GDB с различными языками программирования

Хотя языки программирования обычно имеют общие аспекты, их выражения редко выглядят одинаково. Например, в ANSI Си, разыменование указателя p осуществляется операцией *p, а в Модуле-2 это выполняется как p^. Представление (и отображение) значений также может быть различным. Шестнадцатеричные числа в Си отображаются как `0x1ae', в то время как в Модуле-2 они отображаются как `1AEH'.

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

9.1 Переход от одного языка к другому

Существует два способа управления рабочим языком: либо GDB устанавливает его автоматически, либо вы можете сделать это самостоятельно. Для этих целей вы можете воспользоваться командой set language. По умолчанию, при старте GDB устанавливает язык автоматически. Рабочий язык используется, чтобы определить, как интерпретируются вводимые вами выражения, как выводятся значения, и так далее.

В дополнение к рабочему языку, каждый исходный файл, с которым работает GDB, имеет свой собственный рабочий язык. Для некоторых форматов объектных файлов компилятор может указывать, на каком языке написан конкретный исходный файл. Однако, чаще всего GDB распознает язык по имени файла. Язык исходного файла определяет, будут ли восстанавливаться имена Си++; таким образом, backtrace может показывать каждый кадр в соответствии с исходным языком. Не существует способа установить язык исходного файла из GDB, но вы можете установить язык, ассоциированный с расширением файла. См. раздел 9.2 Отображение языка программирования.

Наиболее часто эта проблема возникает, когда вы используете программу, такую как cfront или f2c, которая создает текст на Си, но написана на другом языке. В этом случае нужно сделать, чтобы программа использовала директивы #line в выводе текста Си; тогда GDB будет знать правильный язык исходного текста первоначальной программы, и выведет этот исходный код, а не сгенерированный код Си.

9.1.1 Соответствие расширений файлов и языков

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

`.c'
Исходный файл Си
`.C'
`.cc'
`.cp'
`.cpp'
`.cxx'
`.c++'
Исходный файл Си++
`.f'
`.F'
Исходный файл Фортрана
`.ch'
`.c186'
`.c286'
Исходный файл CHILL
`.mod'
Исходный файл Модулы-2
`.s'
`.S'
Исходный файл Ассемблера. В действительности, воспринимается почти также, как Си, но GDB не пропускает вводные части функций при пошаговом выполнении.

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

9.1.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.

9.1.3 Распознавание GDB исходного языка

Для автоматической установки рабочего языка, используйте `set language local' или `set language auto'. Тогда GDB будет определять рабочий язык автоматически. То есть при остановке вашей программы в кадре стека (обычно, в точке останова), GDB устанавливает рабочий язык в тот, который записан для функции в этом кадре. Если язык для кадра неизвестен (то есть, если функция или блок, соответствующие кадру, были определены в исходном файле, не имевшем распознаваемого расширения), текущий рабочий язык не изменяется, а GDB выдает предупреждающее сообщение.

Для большинства программ, которые написаны целиком на одном языке, автоматическая установка языка может показаться ненужной. Однако, в основной программе, написанной на одном исходном языке, могут использоваться программные модули и библиотеки, написанные на другом исходном языке. Использование в этом случае `set language auto' освобождает вас от установки рабочего языка вручную.

9.2 Отображение языка программирования

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

show language
Отобразить текущий рабочий язык. Это тот язык, который вы можете использовать в командах типа print для построения и вычисления выражений, в которые могут входить переменные вашей программы.
info frame
Отобразить исходный язык для данного кадра стека. Этот язык становится рабочим, если используется идентификатор из этого кадра. См. раздел 6.4 Информация о кадре стека, для дополнительной информации.
info source
Отобразить исходный язык данного исходного файла. См. раздел 10. Исследование таблицы символов, для получения дополнительной информации.

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

set extension-language .расш язык
Установить соответствие исходных файлов с расширением .расш с исходным языком язык.
info extensions
Перечислить все расширения имен файлов и соответствующие им языки.

9.3 Проверка диапазона и принадлежности типу

Предупреждение: В этот выпуск включены команды GDB для проверки диапазона и соответствия типов, но они пока не оказывают никакого действия. Этот раздел описывает их предполагаемые возможности.

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

По вашему желанию, GDB может проводить подобные проверки. Хотя GDB не проверяет операторы вашей программы, он может, например, проверять выражения, введенные непосредственно в GDB для вычисления командой print. Как и в случае рабочего языка, GDB может также автоматически решить, выполнять проверку или нет, основываясь на исходном языке вашей программы. См. раздел 9.4 Поддерживаемые языки, для информации об установках по умолчанию для поддерживаемых языков.

9.3.1 Краткий обзор проверки соответствия типов

Некоторые языки, такие как Модула-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
Включить или отключить контроль типов, в зависимости от текущего рабочего языка. См. раздел 9.4 Поддерживаемые языки, для установок по умолчанию для каждого языка.
set check type on
set check type off
Включить или отключить контроль типов, пренебрегая установкой по умолчанию для текущего рабочего языка. Вывести предупреждающее сообщение, если установка не соответствует используемой по умолчанию. Если возникает несоответствие типов во время вычисления выражения при включенном контроле типов, GDB выводит сообщение и прерывает вычисление выражения.
set check type warn
При возникновении несоответствия типов вывести предупреждающее сообщение, но попытаться вычислить выражение. Вычисление выражения все же может быть невозможным по другим причинам. Например, GDB не может складывать числа со структурами.
show type
Показать текущую установку проверки типов, а также была ли она установлена GDB автоматически.

9.3.2 Краткий обзор проверки диапазона

В некоторых языках (например, в Модуле-2), выход за границы диапазона типа считается ошибкой; эти ошибки отслеживаются с помощью контроля времени выполнения. Эти проверки диапазона служат для того, чтобы избежать переполнения при вычислениях и не допустить превышения индексами элементов массива границ индексации.

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

Ошибки диапазона могут возникать при числовом переполнении, при превышении границы индексации массива или при использовании константы, не принадлежащей ни одному типу. Однако, некоторые языки не считают переполнение ошибкой. Во многих реализациях Си математическое переполнение вызывает "циклический переход" к меньшему значению. Например, если m -- наибольшее целое значение, а s -- наименьшее, то

m + 1 => s

Это также является специфичным для конкретных языков, а в некоторых случаях -- для отдельного компилятора или машины. Для дальнейших сведений по отдельным языкам, См. раздел 9.4 Поддерживаемые языки.

GDB обеспечивает некоторые дополнительные команды для контроля проверки диапазона:

set check range auto
Включить или отключить контроль диапазона, в зависимости от текущего рабочего языка. См. раздел 9.4 Поддерживаемые языки, для получения информации об установках по умолчанию для каждого языка.
set check range on
set check range off
Включить или отключить контроль типов, пренебрегая установкой по умолчанию для текущего рабочего языка. Если установка не соответствует используемой по умолчанию, выводится предупреждающее сообщение. Если происходит ошибка диапазона и контроль включен, выводится сообщение и вычисление выражения прерывается.
set check range warn
При выявлении ошибки диапазона GDB выведет предупреждающее сообщение, но попытается вычислить выражение. Тем не менее, вычисление выражения может быть невозможным по другим причинам, таким как обращение к памяти, которой процесс не владеет (типичный пример для многих систем Unix).
show range
Показать текущую установку проверки диапазона, и была ли она установлена GDB автоматически.

9.4 Поддерживаемые языки

GDB поддерживает Си, Си++, Фортран, Java, Chill, Ассемблер и Модулу-2. Некоторые возможности GDB могут быть задействованы в выражениях независимо от используемого языка: операторы GDB @ и :: и конструкция `{тип}адрес' (см. раздел 8.1 Выражения) могут быть использованы в конструкциях любого поддерживаемого языка.

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

9.4.1 Си и Си++

Поскольку Си и Си++ тесно связаны, многие возможности GDB применимы к ним обоим. Когда это имеет место, мы обсуждаем эти языки вместе.

Средства отладки Си++ обеспечиваются совместно компилятором Си++ и GDB. Следовательно, для эффективной отладки программы на Си++, вам следует пользоваться одним из поддерживаемых компиляторов, например GNU g++, или компилятором HP ANSI Си++ (aCC).

При использовании GNU Си++, для получения наилучших результатов используйте формат отладочной информации stabs. Вы можете выбрать его явно с помощью ключа командной строки `-gstabs' или `-gstabs+'. Смотрите раздел `Ключи для отладки вашей программы или GNU CC' в Использование GNU CC, для дополнительной информации.

9.4.1.1 Операторы Си и Си++

Операторы должны быть определены на значениях определенных типов. Например, + определен на числах, но не на структурах. Операторы часто определяются на группах типов.

Для целей Си и Си++, имеют место следующие определения:

Поддерживаются следующие операторы, перечисленные здесь в порядке возрастания приоритета:

,
Запятая, или оператор последовательного выполнения. Выражения, разделенные в списке запятыми, вычисляются слева направо; результатом всего выражения является результат, полученный последним.
=
Присваивание. Значение выражения присваивания -- присвоенное значение. Определено на скалярных типах.
опер=
Используется в выражениях в форме a опер= b и преобразовывается в a = a опер b. опер= и = имеют одинаковый приоритет. опер может быть одним из операторов |, ^, &, <<, >>, +, -, *, /, %.
?:
Тернарный оператор. a ? b : c истолковывается так: если a, то b, иначе c. a должно быть целого типа.
||
Логическое ИЛИ. Определено на целых типах.
&&
Логическое И. Определено на целых типах.
|
Побитовое ИЛИ. Определено на целых типах.
^
Побитовое исключающее ИЛИ. Определено на целых типах.
&
Побитовое И. Определено на целых типах.
==, !=
Равенство и неравенство. Определено на скалярных типах. Значение этих выражений отлично от нуля для истины и 0 для лжи.
<, >, <=, >=
Меньше чем, больше чем, меньше или равно, больше или равно. Определено на скалярных типах. Значение этих выражений равно 0 для лжи и отлично от нуля для истины.
<<, >>
Левый сдвиг и правый сдвиг. Определено на целых типах.
@
Оператор GDB создания "искусственного массива" (см. раздел 8.1 Выражения).
+, -
Сложение и вычитание. Определено на целочисленных типах, типах с плавающей точкой и указателях.
*, /, %
Умножение, деление и остаток. Умножение и деление определены на целочисленных типах и типах с плавающей точкой. Остаток определен на целочисленных типах.
++, --
Инкремент и декремент. При появлении перед переменной, операция выполняется прежде, чем переменная используется в выражении; при появлении после переменной, значение переменной используется до выполнения операции.
*
Разыменование указателя. Определено для указателей. Имеет тот же приоритет, что и ++.
&
Оператор получения адреса. Определен на переменных. Имеет тот же приоритет, что и ++. Для отладки Си++, GDB реализует использование `&' независимо от того, что позволяет сам язык Си++: вы можете использовать `&(&ссылка)' (или просто `&&ссылка'), чтобы исследовать адрес, по которому хранится переменная-ссылка Си++ (объявленная с помощью `&ссылка').
-
Унарный минус. Определен на целочисленных типах и типах с плавающей точкой. Имеет тот же приоритет, что и ++.
!
Логическое отрицание. Определено на целочисленных типах. Имеет тот же приоритет, что и ++.
~
Оператор побитового дополнения. Определен на целочисленных типах. Имеет тот же приоритет, что и ++.
., ->
Элемент структуры и указатель на элемент структуры. Для удобства, GDB считает их эквивалентными, определяя, следует ли разыменовывать указатель, основываясь на сохраненной информации о типах. Определен на данных структуры (struct) и объединения (union).
.*, ->*
Разыменовывание указателя на элемент.
[]
Индексация массива. a[i] определяется как *(a+i). Имеет тот же приоритет, что и ->.
()
Список параметров функции. Имеет тот же приоритет, что и ->.
::
Оператор Си++ определения области видимости. Определен на типах struct, union и class.
::
Двойное двоеточие также представляет оператор GDB области видимости (см. раздел 8.1 Выражения). Имеет тот же приоритет, что и ::, описанный выше.

Если оператор переопределен в пользовательском коде, GDB обычно пытается выполнить переопределенную версию, а не использовать предопределенное значение оператора.

9.4.1.2 Константы Си и Си++

GDB позволяет вам выражать константы Си и Си++ следующими способами:

9.4.1.3 Выражения Си++

Обработчик выражений GDB может интерпретировать большинство выражений Си++.

Предупреждение: GDB может отлаживать программы на Си++, только если вы используете подходящий компилятор. Обычно отладка Си++ зависит от использования дополнительной отладочной информации в таблице символов и, таким образом, требует специальной поддержки. В частности, если ваш компилятор генерирует a.out, MIPS ECOFF, RS/6000 XCOFF или ELF с расширениями stabs к таблице символов, все эти средства доступны. (С GNU CC вы можете использовать ключ `-gstabs', чтобы явно запросить расширения отладки stabs). С другой стороны, если формат объектного кода -- стандартный COFF или DWARF в ELF, значительная часть поддержки Си++ в GDB не работает.

  1. Допускаются вызовы функций-членов; вы можете использовать выражения типа
    count = aml->GetOriginal(x, y)
    
  2. Пока функция-член активна (в выбранном кадре стека), вашим выражениям доступно то же пространство имен, что и функции-члену; то есть GDB допускает неявные ссылки на указатель экземпляра класса this по тем же правилам, что и Си++.
  3. Вы можете вызывать перегруженные функции; GDB производит вызов функции с правильным определением, но с некоторыми ограничениями. GDB не совершает преобразования, для выполнения которых требуются преобразования типов, определенные пользователем, вызовы конструкторов или конкретизации не существующих в программе шаблонов. Он также не может обрабатывать списки с неопределенным числом аргументов или аргументы со значениями по умолчанию. Он производит преобразования и расширения целочисленных типов, расширения типов с плавающей точкой, арифметические преобразования, преобразования указателей, преобразования класса объекта в базовые классы и стандартные преобразования, например функции или массива к указателю; это требует точного совпадения числа аргументов функции. Разрешение перегруженных имен производится всегда, если не указано set overload-resolution off. См. раздел 9.4.1.7 Возможности GDB для Си++. Вы должны указать set overload-resolution off, чтобы задать функцию явно при вызове перегруженной функции, как в примере
    p 'foo(char,int)'('x', 13)
    
    Возможности GDB для завершения команд могут упростить это; смотрите раздел 3.2 Завершение команд.
  4. GDB понимает переменные, объявленные как ссылки Си++; вы можете использовать их в выражениях, точно как вы делаете в исходном тексте Си++ -- они автоматически разыменовываются. В списке параметров, показываемом GDB при отображении кадра стека, значения переменных-ссылок не отображаются (в отличие от других переменных); это позволяет избежать неудобств из-за того, что ссылки часто используются для больших структур. Адрес переменной-ссылки всегда выводится, если только вы не установили `set print address off'.
  5. GDB поддерживает оператор Си++ определения области видимости имени :: -- ваши выражения могут использовать его так же, как в вашей программе. Так как одна область видимости может быть определена внутри другой, вы можете при необходимости неоднократно использовать ::, например, в выражении типа `обл1::обл2::имя'. GDB также позволяет определить область видимости имени путем ссылки на исходный файл, при отладке как Си, так и Си++ (см. раздел 8.2 Переменные программы).

Кроме того, при использовании с компилятором HP Си++, GDB правильно поддерживает вызов виртуальных функций, вывод виртуальных баз объектов, вызов функций в базовом подобъекте, приведение объектов и выполнение операторов, определенных пользователем.

9.4.1.4 Значения Си и Си++ по умолчанию

Если вы разрешаете GDB устанавливать проверки диапазона и принадлежности типу автоматически, обе они по умолчанию отключены, если рабочий язык изменяется на Си или Си++. Это происходит независимо от того, выбираете рабочий язык вы или GDB.

Если вы разрешаете GDB устанавливать язык автоматически, он распознает исходные файлы, чьи имена заканчиваются расширением `.c', `.C' или `.cc' и так далее, и когда GDB начинает обработку кода, скомпилированного из одного из этих файлов, он устанавливает рабочий язык в Си или Си++. См. раздел 9.1.3 Распознавание GDB исходного языка, для более подробного обсуждения.

9.4.1.5 Проверки диапазона и принадлежности типу в Си и Си++

Когда GDB производит разбор выражений Си или Си++, по умолчанию проверки соответствия типов не проводятся. Однако, если вы их включите, GDB считает типы двух переменных эквивалентными, если:

Проверка диапазона, если она включена, выполняется для математических операций. Индексы массивов не проверяются, так как они часто применяются для индексирования указателей, которые сами по себе массивами не являются.

9.4.1.6 GDB и Си

Команды set print union и show print union применимы к типу union. При установке в `on', любые объединения, находящиеся внутри структуры или класса, также выводятся. В противном случае, они отображаются как `{...}'.

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

9.4.1.7 Возможности GDB для Си++

Некоторые команды GDB особенно полезны при использовании с Си++, а некоторые разработаны специально для него. Ниже приведено их краткое описание:

меню точки останова
Когда вы хотите установить точку останова в перегруженной функции, меню точки останова GDB помогает вам указать, какое определение функции вам нужно. См. раздел 5.1.8 Меню точки останова.
rbreak рег-выр
Установка точек останова при помощи регулярных выражений полезна при использовании перегруженных функций, не являющихся членами специальных классов. См. раздел 5.1.1 Установка точек останова.
catch throw
catch catch
Отлаживайте обработку исключений Си++ с помощью этих команд. См. раздел 5.1.3 Установка точек перехвата.
ptype имя-типа
Вывести отношения наследования вместе с другой информацией для типа имя-типа. См. раздел 10. Исследование таблицы символов.
set print demangle
show print demangle
set print asm-demangle
show print asm-demangle
Управляет отображением символов Си++ в их исходной форме, как при выводе кода в виде исходного текста Си++, так и при выводе результата дисассемблирования. См. раздел 8.7 Параметры вывода.
set print object
show print object
Выбрать, выводить производные (реальные) или описанные типы объектов. См. раздел 8.7 Параметры вывода.
set print vtbl
show print vtbl
Управляет форматом вывода таблиц виртуальных функций. См. раздел 8.7 Параметры вывода. (Команды vtbl не работают для программ, скомпилированных компилятором HP ANSI Си++ (aCC).)
set overload-resolution on
Включить разрешение перегруженных символов при вычислении выражений Си++. Значение по умолчанию on. Для перегруженных функций, GDB вычисляет аргументы и ищет функции, чьи сигнатуры удовлетворяют типам аргументов, используя стандартные правила преобразования Си++ (смотрите раздел 9.4.1.3 Выражения Си++, для дополнительной информации). Если GDB не может найти такие функции, он выводит сообщение.
set overload-resolution off
Отключить разрешение перегруженных символов при вычислении выражений Си++. Для перегруженных функций, не являющихся функциями-членами класса, GDB выбирает функцию с указанным именем, которую он первой находит в таблице символов, вне зависимости от того, правильного типа ее аргументы или нет. Для перегруженных функций, являющихся функциями-членами класса, GDB ищет функцию, чья сигнатура точно совпадает с типами аргументов.
Перегруженные имена символов
Вы можете указать конкретное определение перегруженного символа, используя ту же запись, что и для объявления таких символов в Си++: введите символ(типы) вместо просто символ. Вы также можете воспользоваться средствами завершения слова командной строки GDB, чтобы вывести список возможных вариантов, или чтобы завершить набор за вас. См. раздел 3.2 Завершение команд, для подробного обсуждения, как это сделать.

9.4.2 Модула-2

Расширения, сделанные в GDB для поддержки Модулы-2, поддерживаются только для программ, скомпилированных компилятором Модулы-2 GNU (который сейчас разрабатывается). Другие компиляторы Модулы-2 в настоящее время не поддерживаются, и попытка отладки исполняемых программ, полученных ими, скорее всего приведет к ошибке при считывании GDB таблицы символов этой программы.

9.4.2.1 Операторы Модулы-2

Операторы должны быть определены на значениях определенных типов. Например, + определен на числах, но не на структурах. Операторы часто определяются на группах типов. Для целей Модулы-2, имеют место следующие определения:

Поддерживаются следующие операторы; они представлены в порядке возрастания приоритета:

,
Разделитель аргументов функции или индексов массива.
:=
Присваивание. Значением перем := знач является знач.
<, >
Меньше чем, больше чем для целочисленных типов, типов с плавающей точкой и перечислимых типов.
<=, >=
Меньше или равно, больше или равно. Определено на целочисленных типах, типах с плавающей точкой и перечислимых типах. Включение для множеств. Такой же приоритет, как у <.
=, <>, #
Равенство и два способа выражения неравенства; допустимо на скалярных типах. Такой же приоритет, как у <. В сценариях GDB, для неравенства допустимо только <>, так как # конфликтует со знаком комментария.
IN
Установка принадлежности. Определено на множествах и типах их элементов. Такой же приоритет, как у <.
OR
Дизъюнкция (логическое ИЛИ). Определена на булевых типах.
AND, &
Конъюнкция (логическое И). Определена на булевых типах.
@
Оператор "искусственного массива" GDB (см. раздел 8.1 Выражения).
+, -
Сложение и вычитание на целочисленных типах и типах с плавающей точкой или объединение и разность на множественных типах.
*
Умножение на целочисленных типах и типах с плавающей точкой или пересечение на типах-множествах.
/
Деление на типах с плавающей точкой. Симметрическая разность множеств на типах-множествах. Такой же приоритет, как у *.
DIV, MOD
Целочисленное деление и остаток. Определены на целочисленных типах. Такой же приоритет, как у *.
-
Отрицание. Определено на данных типов INTEGER и REAL.
^
Разыменовывание указателя. Определено на типах-указателях.
NOT
Булево отрицание. Определено на булевых типах. Такой же приоритет, как у ^.
.
Селектор полей RECORD. Определен для данных типа RECORD. Такое же приоритет, как у ^.
[]
Индексация массива. Определена для данных типа ARRAY. Такой же приоритет, как у ^.
()
Список параметров процедуры. Определен на объектах PROCEDURE. Такой же приоритет, как у ^.
::, .
Операторы GDB и Модулы-2 определения области видимости.

Предупреждение: Множества и операции над ними еще не поддерживаются, так что GDB трактует использование оператора IN или операторов +, -, *, /, =, , <>, #, <=, и >= на множествах как ошибку.

9.4.2.2 Встроенные функции и процедуры

Модула-2 также делает доступными несколько встроенных процедур и функций. При их описании используются следующие метапеременные:

a
представляет переменную типа ARRAY.
c
представляет константу или переменную типа CHAR.
i
представляет переменную или константу целого типа.
m
представляет идентификатор, принадлежащий множеству. Обычно используется в одной функции с метапеременной s. Тип s должен быть SET OF метатип (где метатип -- тип m).
n
представляет переменную или константу целого типа или типа с плавающей точкой.
r
представляет переменную или константу типа с плавающей точкой.
t
представляет тип.
v
представляет переменную.
x
представляет переменную или константу одного из нескольких типов. Смотрите пояснение к функции для дополнительной информации.

Ниже описаны все встроенные процедуры Модулы-2, возвращающие результат.

ABS(n)
Возвращает абсолютное значение n.
CAP(c)
Если c -- строчная буква, процедура возвращает ее эквивалент в верхнем регистре, иначе возвращает сам аргумент.
CHR(i)
Возвращает знак, порядковое значение которого есть i.
DEC(v)
Уменьшает значение переменной v на единицу. Возвращает новое значение.
DEC(v,i)
Уменьшает значение переменной v на i. Возвращает новое значение.
EXCL(m,s)
Удаляет элемент m из множества s. Возвращает новое множество.
FLOAT(i)
Возвращает эквивалент целого числа i в формате с плавающей точкой.
HIGH(a)
Возвращает индекс последнего элемента a.
INC(v)
Увеличивает значение переменной v на единицу. Возвращает новое значение.
INC(v,i)
Увеличивает значение переменной v на i. Возвращает новое значение.
INCL(m,s)
Добавляет элемент m в множество s, если его там еще нет. Возвращает новое множество.
MAX(t)
Возвращает максимальное значение типа t.
MIN(t)
Возвращает минимальное значение типа t.
ODD(i)
Возвращает булево значение TRUE, если число i нечетно.
ORD(x)
Возвращает порядковое значение своего аргумента. Например, порядковое значение знака -- его ASCII-значение (на машинах, поддерживающих набор знаков ASCII). x должна принадлежать упорядоченному типу, что включает целочисленные, знаковый и перечислимый типы.
SIZE(x)
Возвращает размер аргумента. x может быть переменной или типом.
TRUNC(r)
Возвращает целую часть r.
VAL(t,i)
Возвращает элемент типа t, порядковое значение которого есть i.

Предупреждение: Множества и операции над ними еще не поддерживаются, так что GDB рассматривает использование процедур INCL и EXCL как ошибку.

9.4.2.3 Константы

GDB позволяет вам выражать константы Модулы-2 следующими способами:

9.4.2.4 Установки по умолчанию Модулы-2

Если проверка диапазона или принадлежности типу устанавливается GDB автоматически, то по умолчанию обе они устанавливаются в on, если рабочим языком становится Модула-2. Это происходит независимо от того, кто выбрал рабочий язык -- вы или GDB.

Если вы разрешаете GDB выбирать язык автоматически, то при анализе кода, скомпилированного из файла, чье имя оканчивается на `.mod', GDB установит рабочим языком Модулу-2. См. раздел 9.1.3 Распознавание GDB исходного языка, для дополнительной информации.

9.4.2.5 Отклонения от стандарта Модулы-2

Для упрощения отладки программ на Модуле-2 было сделано несколько изменений. В основном, это сделано путем ослабления строгости контроля типов:

9.4.2.6 Проверки диапазона и принадлежности типу Модулы-2

Предупреждение: в этом выпуске, GDB еще не выполняет проверки диапазона и принадлежности типу.

GDB считает две переменные Модулы-2 эквивалентными по типу, если:

Пока проверка соответствия типов включена, любая попытка скомбинировать переменные неэквивалентных типов является ошибкой.

Проверка диапазона выполняется во всех математических операциях, присваиваниях, при индексации массивов и во всех встроенных функциях и процедурах.

9.4.2.7 Операторы определения области видимости :: и .

Существует несколько тонких различий между операторами области видимости Модулы-2 (.) и GDB (::). Оба имеют похожий синтаксис:


модуль . идент
область :: идент

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

Использование оператора :: заставляет GDB искать идентификатор идент в области. Если он в ней не найден, GDB ищет его во всех областях, содержащих область.

Использование оператора . заставляет GDB искать идентификатор идент, который был импортирован из модуля определения модуль, в текущей области видимости. В этом операторе cчитается ошибкой, если идентификатор идент не был импортирован из модуля определения модуль, или если идент не является в нем идентификатором.

9.4.2.8 GDB и Модула-2

Некоторые команды GDB имеют мало смысла при отладке программ на Модуле-2. Пять подкоманд из команд set print и show print применимы исключительно к Си и Си++: `vtbl', `demangle', `asm-demangle', `object' и `union'. Первые четыре применимы к Си++, а последняя к типу Си union, который не имеет прямого аналога в Модуле-2.

Оператор @ (см. раздел 8.1 Выражения), хоть и доступен при использовании любого языка, бесполезен при работе с Модулой-2. Его цель состоит в том, чтобы помочь при отладке динамических массивов, которые не могут быть созданы в Модуле-2 в отличие от Си или Си++. Однако, конструкция `{тип}адр-выр' все же полезна, так как адрес может быть определен целочисленной константой.

В сценариях GDB, оператор неравенства Модулы-2 # интерпретируется как начало комментария. Используйте вместо него <>.

9.4.3 Chill

Расширения, сделанные в GDB для поддержки Chill, работают только с программами, созданными компилятором GNU Chill. Другие компиляторы Chill в настоящее время не поддерживаются, и попытка отладить программы, полученные с их помощью, скорее всего приведет к ошибке в тот момент, когда GDB будет считывать таблицу символов выполняемого файла.

Этот раздел охватывает темы, связанные с Chill, и возможности GDB для их поддержки.

9.4.3.1 Как отображаются режимы

Поддержка GDB типов данных (режимов) Chill непосредственно связана с возможностями компилятора GNU Chill и, следовательно, слегка отличается от стандартной спецификации языка. Вот предоставляемые режимы:

Дискретные режимы:
Режим powerset:
Режим Powerset отображается ключевым словом POWERSET, за которым следует режим элемента.
(gdb) ptype x
type = POWERSET SET (egon, hugo, otto)
Режимы-ссылки:
Процедурный режим
Процедурный режим отображается в виде тип = PROC(<список параметров>) <возвращаемый режим> EXCEPTIONS (<список исключений>). <список параметров> представляет собой список режимов параметров. <возвращаемый режим> указывает режим результата процедуры, если она возвращает результат. <список исключений> перечисляет все возможные исключения, которые могут быть возбуждены процедурой.
Синхронизационные режимы:
Режимы времени:
Вещественные режимы:
Вещественные режимы предопределены как REAL и LONG_REAL.
Строковые режимы:
Режим массива:
Режим массива отображается ключевым словом 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
)

9.4.3.2 Местоположения и доступ к ним

Местоположением в 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

9.4.3.3 Значения и операции с ними

Значения используются для изменения местоположений, для более подробного изучения сложных структур и для отфильтровывания значимой информации из большого объема данных. Определено несколько операций (зависящих от режима), которые позволяют проводить подобные изучения. Эти операции применимы не только к значениям-константам, но также и к местоположениям, что может оказаться достаточно полезным при отладке сложных структур. Во время разбора командной строки (например, вычисляя выражение), GDB рассматривает имена местоположений как значения этих местоположений.

Этот раздел описывает, как должны задаваться значения, и какие операции допустимо использовать с этими значениями.

Буквенные значения
Буквенные значения определяются также, как в программах GNU Chill. Для подробной спецификации, смотрите главу 1.5 Руководства по реализации GNU Chill.
Значения-наборы
Набор может быть задан как <имя режима>[<набор>], где <имя режима> может быть опущено, если режим набора определяется однозначно. Эта однозначность определяется из контекста вычисляемого выражения. <набор> может быть одним из: Наборы-powerset, наборы массивов и наборы структур определяются так же, как в программах на Chill.
Значение элемента строки
Значение элемента строки задается как
<строковое значение>(<индекс>)
где <индекс> является целочисленным выражением. Это дает знаковое значение, которое эквивалентно знаку, указываемому в строке индексом <индекс>.
Значение среза строки
Значение среза строки задается как <значение строки>(<спецификация среза>), где <спецификация среза> может быть либо диапазоном целых выражений, либо задаваться в виде <начальное выражение> up <размер>. <размер> обозначает число элементов, которое содержит срез. Полученная величина является строкой, которая является частью указанной строки.
Значения элементов массива
Значение элемента массива указывается в виде <величина массива>(<выр>) и дает величину элемента массива с режимом как у указанного массива.
Значение среза массива
Срез массива задается как <значение массива>(<спецификация среза>), где <спецификация среза> может быть диапазоном, определенным либо выражениями, либо как <начальное выр> up <размер>. <размер> обозначает число элементов массива, которое содержит срез. Получаемое значение есть массив, который является частью указанного.
Значение поля структуры
Значение поля структуры получается как <значение структуры>.<имя поля>, где <имя поля> указывает имя поля, заданное в определении режима структуры. Режим полученного значения соответствует этому определению режима в определении структуры.
Значения вызова процедуры
Значение вызова процедуры получается из значения, возвращенного процедурой(13). Значения местоположений режима длительности представляются буквами ULONG. Значения местоположений режима-времени выводятся как
TIME(<сек>:<нсек>).
Значение безаргументного оператора
Значение безаргументного оператора получается из значения экземпляра для текущего активного процесса.
Значения выражений
Значение, доставляемое выражением, является результатом вычисления указанного выражения. В случае ошибки (несовместимость режимов и тому подобное), вычисление выражения прерывается с соответствующим сообщением об ошибке. Выражение может быть заключено в скобки, что приводит к вычислению этого выражения до любого другого, использующего результат выражения в скобках. GDB поддерживает следующие операторы:
OR, ORIF, XOR
AND, ANDIF
NOT
Логические операторы, определенные на операндах булевого режима.
=, /=
Операторы равенства и неравенства, определенные на всех режимах.
>, >=
<, <=
Операторы отношения, заданные на предопределенных режимах.
+, -
*, /, MOD, REM
Арифметические операторы, заданные на предопределенных режимах.
-
Оператор изменения знака.
//
Оператор соединения строк.
()
Оператор повторения строки.
->
Оператор ссылки местоположения, который может быть использован либо для получения адреса местоположения (->loc), или для разыменовывания ссылки местоположения (loc->).
OR, XOR
AND
NOT
Операторы режимов powerset и строки битов.
>, >=
<, <=
Операторы включения режима powerset.
IN
Оператор принадлежности.

9.4.3.4 Проверка диапазона и типов в Chill

GDB считает два режима переменных Chill эквивалентными, если их размеры равны. Это правило применяется рекурсивно для более сложных типов данных. Это означает, что сложные режимы считаются эквивалентными, если режимы всех элементов (которые тоже могут быть сложными, например, массивами, структурами, и так далее) имеют одинаковый размер.

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

Строгие проверки типов включаются с помощью команды GDB set check strong. Это навязывает строгую проверку диапазона и принадлежности типу для всех действий, где используются конструкции Chill (выражения, встроенные функции и так далее), в соответствии с семантикой, определенной в спецификации языка z.200.

Все проверки могут быть отключены командой GDB set check off.

9.4.3.5 Установки по умолчанию Chill

Если проверки типа и диапазона установлены GDB автоматически, обе они по умолчанию включены, когда рабочий язык переключается на Chill. Это происходит независимо от того, вы выбрали рабочий язык или GDB.

Если вы разрешите GDB устанавливать рабочий язык автоматически, то при попадании в код, скомпилированный из файла, чье имя заканчивается на `.ch', он переключает рабочий язык на Chill. См. раздел 9.1.3 Распознавание GDB исходного языка, для дополнительной информации.


[Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]