Отладка с помощью GDB - 9. Использование GDB с различными языками программирования

Отладка с помощью GDB - 9. Использование GDB с различными языками программирования [Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]  


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 исходного языка

Для автоматической установки 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 Поддерживаемые языки, для более п