«Ричард Столмен, Роланд Пеш, Стан Шебс и другие. (Присылайте сообщения об ошибках и комментарии к GDB по адресу bug-gdb Отладка с помощью GDB TEXinfo 1999-10-01.07 Copyright c 1988-2000 Free Software ...»
Ошибки диапазона могут возникать при числовом переполнении, при превышении границы индексации массива или при использовании константы, не принадлежащей ни к одному типу. Однако, некоторые языки не считают переполнение ошибкой. Во многих реализациях Си, математическое переполнение вызывает “циклический переход” к меньшему значению. Например, если m—наибольшее целое значение, а s—наименьшее, то Это также является специфичным для конкретных языков, а в некоторых случаях—для отдельного компилятора или машины. Для дальнейших сведений по отдельным языкам, См. Раздел 9.4 [Поддерживаемые языки], с. 81.
GDB обеспечивает некоторые дополнительные команды для контроля проверки диапазона:
set check range auto Включить или отключить контроль диапазона, в зависимости от текущего рабочего языка. См. Раздел 9.4 [Поддерживаемые языки], с. 81, для получения информации об установках по умолчанию для каждого языка.
Глава 9: Использование GDB с различными языками программирования set check range on set check range off Включить или отключить контроль типов, пренебрегая установкой по умолчанию для текущего рабочего языка. Если установка не соответствует используемой по умолчанию, выводится предупреждающее сообщение. Если происходит ошибка диапазона и контроль включен, выводится сообщение и вычисление выражения прерывается.
set check range warn При выявлении ошибки диапазона, GDB выведет предупреждающее сообщение, но попытается вычислить выражение. Тем не менее, вычисление выражения может быть невозможным по другим причинам, таким как обращение к памяти, которой процесс не владеет (типичный пример для многих систем Unix).
show range Показать текущую установку проверки диапазона и была ли она установлена 9.4 Поддерживаемые языки GDB поддерживает Си, Си++, Фортран, Java, Chill, ассемблер и Модула-2. Некоторые возможности GDB могут быть задействованы в выражениях независимо от используемого языка: операторы GDB @ и :: и конструкция ‘{тип}адрес’ (см. Раздел 8.1 [Выражения], с. 61) могут быть использованы в конструкциях любого поддерживаемого языка.
Следующие разделы подробно описывают, до какой степени каждый из исходных языков поддерживается GDB. Эти разделы не задумывались как учебники или руководства по языкам; они лишь служат справочным руководством по тому, что допускает анализатор выражений GDB, и как должны выглядеть входные и выходные форматы в различных языках. Существует много хороших книг по каждому из этих языков; пожалуйста, загляните в них, если вам нужен учебник или справочник по языку.
9.4.1 Си и Си++ Поскольку Си и Си++ тесно связаны, многие возможности GDB применимы к ним обоим. Когда это имеет место, мы обсуждаем эти языки вместе.
Средства отладки Си++ обеспечиваются совместно компилятором Си++ и GDB. Следовательно, для эффективной отладки программы на Си++, вам следует пользоваться одним из поддерживаемых компиляторов, например gnu g++, или компилятором HP ANSI Си++ (aCC).
При использовании gnu Си++, для получения наилучших результатов используйте формат отладочной информации stabs. Вы можете выбрать его явно с помощью ключа командной строки ‘-gstabs’ или ‘-gstabs+’. Смотрите раздел “Ключи для отладки вашей программы или gnu CC” в Использование gnu CC, для дополнительной информации.
9.4.1.1 Операторы Си и Си++ Операторы должны быть определены на значениях определенных типов. Например, + определен на числах, но не на структурах. Операторы часто определяются на группах типов.
Для целей Си и Си++, имеют место следующие определения:
• Целые типы включают int с любыми спецификаторами класса памяти; char; enum; и, для Си++, bool.
• Типы с плавающей точкой включают float, double и long double (если поддерживается целевой платформой).
• Типы указателей включают все типы, определенные как (тип *).
• Скалярные типы включают все вышеперечисленные типы.
Поддерживаются следующие операторы, перечисленные здесь в порядке возрастания приоритета:
Запятая, или оператор последовательного выполнения. Выражения, разделенные в списке запятыми, вычисляются слева направо; результатом всего выражения является результат, полученный последним.
Присваивание. Значение выражения приваивания—присвоенное значение.
опер= Используется в выражениях в форме a опер= b и преобразовывается в a = a опер b. опер= и = имеют одинаковый приоритет. опер может быть одним Тернарный оператор. a ? b : c истолковывается так: если a, то b, иначе c. a Логическое или. Определено на целых типах.
Логическое и. Определено на целых типах.
Побитовое или. Определено на целых типах.
Побитовое исключающее или. Определено на целых типах.
Равенство и неравенство. Определено на скалярных типах. Значение этих ==, != Меньше чем, больше чем, меньше или равно, больше или равно. Определено на скалярных типах. Значение этих выражений равно 0 для лжи и отлично от Левый сдвиг и правый сдвиг. Определено на целых типах.
Оператор GDB создания “искусственного массива” (см. Раздел 8.1 [Выражения], с. 61).
Сложение и вычитание. Определено на целочисленных типах, типах с плавающей точкой и указателях.
Умножение, деление и остаток. Умножение и деление определены на целочисленных типах и типах с плавающей точкой. Остаток определен на целочисленных типах.
Инкремент и декремент. При появлении перед переменной, операция выполняется прежде, чем переменная используется в выражении; при появлении после переменной, значение переменной используется до выполнения операции.
Разыменование указателя. Определено для указателей. Имеет тот же приоритет, что и ++.
Оператор получения адреса. Определен на переменных. Имеет тот же приоритет, что и ++.
Для отладки Си++, GDB реализует использование ‘&’ независимо от того, что позволяет сам язык Си++: вы можете использовать ‘&(&ссылка)’ (или просто ‘&&ссылка’), чтобы исследовать адрес, по которому хранится переменнаяссылка Си++ (объявленная с помощью ‘&ссылка’).
Глава 9: Использование GDB с различными языками программирования Унарный минус. Определен на целочисленных типах и типах с плавающей точкой. Имеет тот же приоритет, что и ++.
Логическое отрицание. Определено на целочисленных типах. Имеет тот же Оператор побитового дополнения. Определен на целочисленных типах. Имеет Элемент структуры и указатель на элемент структуры. Для удобства, GDB., -> считает их эквивалентными, определяя, следует ли разыменовывать указатель, основываясь на сохраненной информации о типах. Определен на данных структуры (struct) и объединения (union).
Разыменовывание указателя на элемент.
.*, ->* Индексация массива. a[i] определяется как *(a+i). Имеет тот же приоритет, Список параметров функции. Имеет тот же приоритет, что и ->.
Оператор Си++ определения области видимости. Определен на типах struct, Двойное двоеточие также представляет оператор GDB области видимости (см.
Раздел 8.1 [Выражения], с. 61). Имеет тот же приоритет, что и ::, описанный Если оператор переопределен в пользовательском коде, GDB обычно пытается выполнить переопределенную версию, а не использовать предопределенное значение оператора.
9.4.1.2 Константы Си и Си++ GDB позволяет вам выражать константы Си и Си++ следующими способами:
• Целочисленные константы—это последовательности цифр. Восьмеричные константы начинаются с ‘0’ (с нуля), а шестнадцатеричные константы—с ‘0x’ или ‘0X’. Константы также могут заканчиваться буквой ‘l’, указывая, что значение константы должно рассматриваться как длинное (long).
• Константы с плавающей точкой—это последовательность цифр, за которой следует десятичная точка, другая последовательность цифр, и, возможно, порядок. Порядок указывается в форме ‘e[[+]|-]nnn’, где nnn—другая последовательность цифр. Для положительных порядков ‘+’ является необязательным. Константа с плавающей точкой может также заканчиваться буквой ‘f’ или ‘F’, это указывает на то, что константа должна рассматриваться как float (в отличие от double по умолчанию), или буквой ‘l’ или ‘L’, что указывает на константу типа long double.
• Перечисляемые константы состоят из перечисляемых идентификаторов, или их целочисленных эквивалентов.
• Символьные константы—это одиночный символ, заключенный в одиночные кавычки (’), или число—порядковое значение соответствующего символа (обычно его значение ascii). Внутри кавычек, одиночный символ может быть представлен либо буквой, либо экранирующей последовательностью, которая имеет форму ‘\nnn’, где nnn является восьмеричным представлением порядкового значения символа; или форму ‘\x’, где ‘x’—специальный предопределенный знак, например, ‘\n’ для знака новой строки.
• Строковые константы—последовательность символьных констант (без одиночных кавычек), заключенная в двойные кавычки ("). Туда могут входить любые допустимые символьные константы (как описано выше). Двойным кавычкам внутри строки должна предшествовать обратная косая черта, так что ‘"a\"b’c"’, например, является строкой из пяти символов.
• Константы-указатели представляют собой целочисленные значения. Вы можете также записывать указатели на константы, используя оператор Cи ‘&’.
• Константы-массивы—заключенные в фигурные скобки (‘{’ и ‘}’) списки элементов, разделенные запятыми; например, ‘{1,2,3}’ является массивом с тремя целочисленными элементами, ‘{{1,2}, {3,4}, {5,6}}’ является массивом размерности три на два, и ‘{&"hi", &"there", &"fred"}’ является трехэлементным массивом указателей.
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 overloadresolution off. См. Раздел 9.4.1.7 [Возможности GDB для Си++], с. 85.
Вы должны указать set overload-resolution off, чтобы задать функцию явно при вызове перегруженной функции, как в примере p ’foo(char,int)’(’x’, 13) Возможности GDB для завершения команд могут упростить это; смотрите Раздел 3. [Завершение команд], с. 15.
4. GDB понимает переменные, объявленные как ссылки Си++; вы можете использовать их в выражениях, точно как вы делаете в исходном тексте Си++—они автоматически разыменовываются.
В списке параметров, показываемом GDB при отображении кадра стека, значения переменных-ссылок не отображаются (в отличие от других переменных); это позволяет избежать неудобств из-за того, что ссылки часто используются для больших структур. Адрес переменной-ссылки всегда выводится, если только вы не установили ‘set print address off’.
Глава 9: Использование GDB с различными языками программирования 5. GDB поддерживает оператор Си++ определения области видимости имени ::—ваши выражения могут использовать его так же, как в вашей программе. Так как одна область видимости может быть определена внутри другой, вы можете при необходимости неоднократно использовать ::, например, в выражении типа ‘обл1::обл2::имя’.
GDB также позволяет определить область видимости имени путем ссылки на исходный файл, при отладке как Си, так и Си++ (см. Раздел 8.2 [Переменные программы], Кроме того, при использовании с компилятором HP Си++, GDB правильно поддерживает вызов виртуальных функций, вывод виртуальный баз объектов, вызов функций в базовом подобъекте, приведение объектов и выполнение операторов, определенных пользвателем.
9.4.1.4 Значения Си и Си++ по умолчанию Если вы разрешаете GDB устанавливать проверки диапазона и принадлежности типу автоматически, обе они по умолчанию отключены, если рабочий язык изменяется на Си или Си++. Это происходит независимо от того, выбираете рабочий язык вы или GDB.
Если вы разрешаете GDB устанавливать язык автоматически, он распознает исходные файлы, чьи имена заканчиваются расширением ‘.c’, ‘.C’ или ‘.cc’, и так далее, и когда GDB начинает обработку кода, скомпилированного из одного из этих файлов, он устанавливает рабочий язык в Си или Си++. См. Раздел 9.1.3 [Распознавание GDB рабочего языка], с. 78, для более подробного обсуждения.
9.4.1.5 Проверки диапазона и принадлежности типу в Си и Си++ Когда GDB производит разбор выражений Си или Си++, по умолчанию проверки соответствия типов не проводятся. Однако, если вы их включите, GDB считает типы двух переменных эквивалентными, если:
• Обе переменные структурированы и имеют один и тот же тег структуры, объединения или перечисления.
• Имена типов обеих переменных совпадают или были объявлены эквивалентными через typedef.
Проверка диапазона, если она включена, выполняется для математических операций.
Индексы массивов не проверяются, так как они часто применяются для индексирования указателей, которые сами по себе массивами не являются.
9.4.1.6 GDB и Си Команды set print union и show print union применимы к типу union. При установке в ‘on’, любые объединения, находящиеся внутри структуры или класса, также выводятся.
В противном случае, они отображаются как ‘{...}’.
Оператор @ помогает при отладке динамических массивов, сформированных с помощью указателей и функции выделения памяти. См. Раздел 8.1 [Выражения], с. 61.
9.4.1.7 Возможности GDB для Си++ Некоторые команды GDB особенно полезны при использовании с Си++, а некоторые разработаны специально для него. Ниже приведено их краткое описание:
меню точки останова Когда вы хотите установить точку останова в перегруженной функции, меню точки останова GDB помогает вам указать, какое определение функции вам нужно. См. Раздел 5.1.8 [Меню точки останова], с. 42.
rbreak рег-выр Установка точек останова при помощи регулярных выражений полезна при использовании перегруженных функций, не являющихся членами специальных классов. См. Раздел 5.1.1 [Установка точек останова], с. 32.
catch throw catch catch Отлаживайте обработку исключений Си++ с помощью этих команд. См. Раздел 5.1.3 [Установка точек перехвата], с. 37.
ptype имя-типа Вывести отношения наследования вместе с другой информацией для типа имятипа. См. Глава 10 [Исследование таблицы символов], с. 97.
set print demangle show print demangle set print asm-demangle show print asm-demangle Управляет отображением символов Си++ в их исходной форме, как при выводе кода в виде исходного текста Си++, так и при выводе результата дисассемблирования. См. Раздел 8.7 [Параметры вывода], с. 68.
set print object show print object Выбрать, выводить производные (реальные) или описанные типы объектов.
См. Раздел 8.7 [Параметры вывода], с. 68.
set print vtbl show print vtbl Управляет форматом вывода таблиц виртуальных функций. См. Раздел 8. [Параметры вывода], с. 68. (Команды vtbl не работают для программ, скомпилированных компилятором HP ANSI Си++ (aCC).) set overload-resolution on Включить разрешение перегруженных символов при вычислении выражений Си++. Значение по умолчанию on. Для перегруженных функций, GDB вычисляет аргументы и ищет функции, чьи сигнатуры удовлетворяют типам аргументов, используя стандартные правила преобразования Си++ (смотрите Раздел 9.4.1.3 [Выражения Си++], с. 84, для дополнительной информации). Если GDB не может найти такие функции, он выводит сообщение.
set overload-resolution off Отключить разрешение перегруженных символов при вычислении выражений Си++. Для перегруженных функций, не являющихся функциями-членами класса, GDB выбирает функцию с указанным именем, которую он первой находит в таблице символов, в не зависимости от того, правильного типа ее аргументы или нет. Для перегруженных функций, являющихся функциями-членами класса, GDB ищет функцию, чья сигнатура точно совпадает с типами аргументов.
Перегруженные имена смиволов Вы можете указать конкретное определение перегруженного символа, используя ту же запись, что и для объявления таких символов в Си++: введите символ(типы) вместо просто символ. Вы также можете воспользоваться средствами завершения слова командной строки GDB, чтобы вывести список возможных вариантов, или чтобы завершить набор за вас. См. Раздел 3.2 [Завершение команд], с. 15, для подробного обсуждения, как это сделать.
Глава 9: Использование GDB с различными языками программирования 9.4.2 Модула- Расширения, сделанные в GDB для поддержки Модулы-2, поддерживаются только для программ, скомпилированных gnu компилятором Модулы-2 (который сейчас разрабатывается). Другие компиляторы Модулы-2 в настоящее время не поддерживаются, и попытка отладки исполняемых программ, полученных ими, скорее всего приведет к ошибке при считывании GDB таблицы символов этой программы.
9.4.2.1 Операторы Модулы- Операторы должны быть определены на значениях определенных типов. Например, + определен на числах, но не на структурах. Операторы часто определяются на группах типов. Для целей Модулы-2, имеют место следующие определения:
• Целые типы состоят из INTEGER, CARDINAL и их поддиапазонов.
• Символьные типы состоят из CHAR и его поддиапазонов.
• Типы с плавающей точкой состоят из REAL.
• Типы-указатели состоят из всего, объявленного как POINTER TO тип.
• Скалярные типы включают все вышеперечисленное.
• Типы-множества состоят из типов SET и BITSET.
• Булевый тип состоит из BOOLEAN.
Поддерживаются следующие операторы; они представлены в порядке возрастания приоритета:
Разделитель аргументов функции или индексов массива.
Присваивание. Значением перем := знач является знач.
Меньше чем, больше чем для целочисленных типов, типов с плавающей точкой Меньше или равно, больше или равно. Определено на целочисленных типах, типах с плавающей точкой и перечислимых типах. Включение для множеств.
T001: gdbserver comm программа [ арг... ] comm—это или имя устройства (для использования последовательной линии), или имя рабочей машины и номер порта TCP. Например, для отладки Emacs с параметром ‘foo.txt’ и взаимодействия с GDB через последовательный порт target> gdbserver /dev/com1 emacs foo.txt gdbserver пассивно ждет рабочего GDB для связи с ним.
При использовании TCP-соединения вместо последовательной линии:
target> gdbserver host:2345 emacs foo.txt Единственное отличие от предыдущего примера состоит в первом параметре, определяющем, что вы связываетесь с рабочим GDB через TCP. Параметр ‘host:2345’ означает, что gdbserver должен ожидать TCP-соединение от машины ‘host’ к локальному порту TCP 2345. (В настояшее время часть ‘host’ игнорируется.) Вы можете выбрать любой номер порта, какой захотите, если при этом он не конфликтует с какими-либо портами TCP, уже использующимися на целевой системе (например, 23 зарезервирован для telnet).1 Вы должны использовать тот же номер порта с командой рабочего GDB target remote.
На рабочей машине GDB вам нужна копия вашей программы с символьными данными, так как GDB нужна информация о символах и отладочная информация. Запустите GDB как обычно, используя имя локальной копии вашей программы в качестве первого аргумента. (Вам также может понадобиться ключ ‘-baud’, если последовательная линия работает на скорости, отличной от 9600 бит/сек.) После этого, используйте target remote, чтобы установить связь с gdbserver. Ее параметры—либо имя устройства (обычно последовательного устройства, такого как ‘/dev/ttyb’), либо дескриптор порта TCP в форме машина:порт. Например:
взаимодействует с сервером через последовательную линию ‘/dev/ttyb’, а взаимодействует через TCP-соединение с портом 2345 на рабочей машине ‘the-target’. Для TCP-соединения, вы должны запустить gdbserver до использования команды target remote. Иначе вы можете получить ошибку, текст которой зависит от рабочей системы, но обычно он выглядит примерно так: ‘Connection refused’.
13.4.1.6 Использование программы gdbserve.nlm gdbserve.nlm—это управляющая программа для систем NetWare, которая позволяет вам установить соединение вашей программы с удаленным GDB посредством target remote.
GDB и gdbserve.nlm общаются через последовательную линию, используя стандартный удаленный последовательный протокол GDB.
На целевой машине вам необходимо иметь копию программы, которую вы хотите отладить.
gdbserve.nlm не нуждается в таблице символов вашей программы, так что вы можете ее исключить, если необходимо сохранить пространство. GDB осуществляет всю обработку символов на рабочей машине.
Чтобы использовать сервер, вы должны сообщить ему как взаимодействовать с GDB, имя вашей программы и ее аргументы. Синтаксис следующий:
Плата и порт определяют последовательную линию; бод определяет скорость в бодах, используемую соединением. Значения порт и node по умолчанию равны 0, бод по умолчанию 9600 бит/сек.
Например, для отладки Emacs с параметром ‘foo.txt’ и взаимодействия с GDB через последовательный порт номер 2 на плате 1, используя соединение load gdbserve BOARD=1 PORT=2 BAUD=19200 emacs foo.txt На рабочей машине GDB вам нужна копия вашей программы с символьными данными, так как GDB требуется символьная и отладочная информация. Запустите GDB как обычно, Если вы выберете номер порта, который конфликтует с другим сервисом, gdbserver печатает сообщение об ошибке и завершает работу.
используя имя локальной копии вашей программы в качестве первого параметра. (Вам также может понадобиться ключ ‘-baud’, если последовательная линия работает на скорости, отличной от 9600 бит/сек.) После этого, используйте target remote для установки связи с gdbserve.nlm. Ее аргумент—имя устройства (обычно последовательного устройства, такого как ‘/dev/ttyb’). Например:
соединение с сервером через последовательную линию ‘/dev/ttyb’.
13.5 Отображение объектов ядра Некоторые цели поддерживают отображение объектов ядра. При помощи этих возможностей, GDB взаимодействует непосредственно с операционной системой и может выводить информацию об объектах уровня операционной системы, например, о блокировках и других объектах синхронизации. Какие именно объекты могут быть отображены, определяется в зависимости от конкретной ОС.
Используйте команду set os, чтобы установить тип операционной системы. Это говорит GDB, какой модуль отображения объектов ядра инициализировать:
(gdb) set os cisco Если команда set os выполнится успешно, GDB выведет некоторую информацию об операционной системе, и создаст новую команду info, которая может быть использована для посылки запросов на целевую машину. Название команды info выбирается в зависимости от операционной системы:
(gdb) info cisco List of Cisco Kernel Objects Дальнейшие подкоманды могут использоваться для запросов о конкретных объектах, информация о которых есть в ядре.
В настоящее время не существует другого способа определить, поддерживается та или иная операционная система, кроме как попробовать.
14 Информация о конфигурации В то время как почти все команды GDB доступны для всех чистых и кросс-версий отладчика, существуют некоторые исключения. Эта глава описывает вещи, доступные только в определенных конфигурациях.
Существует три основные категории конфигураций: чистые конфигурации, где рабочая и целевая машины совпадают, конфигурации для встроенных операционных систем, которые обычно совпадают для нескольких различных архитектур процессоров, и отдельные встроенные процессоры, которые сильно отличаются друг от друга.
14.1 Чистая конфигурация Этот раздел описывает детали, специфичные для определенных чистых конфигураций.
14.1.1 HP-UX В системах HP-UX, если вы ссылаетесь на функцию или переменную, имя которой начинается со знака доллара, GDB сперва ищет имя пользователя или системы, до поиска вспомогательной переменной.
14.1.2 Информация о процессах SVR Многие версии SVR4 предоставляют возможность, называемую ‘/proc’, которая может быть использована для исследования образа выполняемого процесса, используя подпрограммы файловой системы. Если GDB сконфигурирован для операционной системы, поддерживающей эту возможность, команда info proc доступна для получения отчета по некоторым видам информации о процессе, выполняющем вашу программу. info proc работает только на системах SVR4, которые включают код procfs. Среди этих систем:
OSF/1 (Digital Unix), Solaris, Irix и Unixware, но не HP-UX или Linux, к примеру.
info proc Выдает доступную суммарную информацию о процессе.
info proc mappings Сообщает диапазоны адресов, доступных в программе, с информацией, может ли ваша программа читать, записывать, или исполнять каждый из диапазонов.
info proc times Время запуска, время пользовательского и системного ЦП для вашей программы и ее потомков.
info proc id Сообщает информацию об идентификаторах процессов, относящихся к вашей программе: ее собственный идентификатор, идентификатор ее родителя, группы процесса и сеанса.
info proc status Общая информация о состоянии процесса. Если процесс остановлен, то этот отчет включает причину останова и любые полученные сигналы.
info proc all Показывает всю вышеперечисленную информацию о процессе.
14.2 Встроенные операционные системы Этот раздел описывает конфигурации, задействующие отладку встроенных операционных систем, которые доступны для нескольких различных архитектур.
GDB включает возможность отлаживать программы, выполняющиеся в различных операционных системах реального времени.
14.2.1 Использование GDB с VxWorks target vxworks имя-машины Система VxWorks, присоединенная посредством TCP/IP. Аргумент имя-машины есть имя или IP-адрес машины целевой системы.
На VxWorks, load компонует имя-файла динамически на текущей целевой системе, и добавляет ее символьную информацию в GDB.
GDB позволяет разработчикам запускать и отлаживать с Unix-машин задачи, выполняющиеся на сетевых целях VxWorks. Уже выполняющиеся задачи, запущенные из оболочки VxWorks, также могут быть отлажены. GDB использует код, который может выполняться как на машине Unix, так и на целевой машине VxWorks. Программа gdb устанавливается и выполняется на Unix-машине. (Она может быть установлена под именем vxgdb, чтобы отличать ее от GDB для отладки программ на рабочей машине.) VxWorks-timeout арг Сейчас все цели, базирующиеся на VxWorks, поддерживают параметр vxworkstimeout. Этот параметр устанавливается пользователем, и арг представляют число секунд, в течение которых GDB ожидает ответы на вызовы удаленных процедур. Вы можете использовать это, если ваша целевая машина VxWorks является медленным программным эмулятором, или находится далеко на другом конце медленного сетевого соединения.
Следующая информация о соединении к VxWorks была свежей, когда это руководство было написано; более новые выпуски VxWorks могут использовать обновленные процедуры.
Для использования GDB с VxWorks, вы должны пересобрать ваше ядро VxWorks, чтобы включить подпрограммы интерфейса удаленной отладки в библиотеку VxWorks ‘rdb.a’. Чтобы это сделать, определите INCLUDE_RDB в конфигурационном файле VxWorks ‘configAll.h’ и пересоберите ядро VxWorks. Получившееся ядро содержит ‘rdb.a’, и порождает задачу отладки исходного кода tRdbTask, когда VxWorks загружается. Для большей информации по конфигурированию и сборке VxWorks, смотрите руководство изготовителя.
Когда вы включили ‘rdb.a’ в образ вашей системы VxWorks и так установили ваши пути поиска выполняемых файлов, чтобы можно было найти GDB, вы готовы к вызову отладчика. Из вашей рабочей Unix-машины, выполните gdb (или vxgdb, в зависимости от вашей установки).
GDB появляется и показывает приглашение:
14.2.1.1 Соединение к VxWorks Команда GDB target позволяет вам соединяться с целевой машиной VxWorks в сети.
Для соединения с целью, имя которой есть “tt”, введите:
(vxgdb) target vxworks tt GDB покажет сообщения, аналогичные этим:
Attaching remote machine across net...
Connected to tt.
Затем GDB пытается считать таблицы символов всех объектных модулей, загруженных на целевой машине VxWorks с того момента, как она была включена. GDB находит эти файлы путем поиска в каталогах, перечисленных в путях поиска команд (см. Раздел 4. [Рабочая среда вашей программы], с. 23); если ему не удается найти объектный файл, он выводит подобное сообщение:
prog.o: No such file or directory.
Когда это происходит, добавьте соответствующий каталог к путям поиска с помощью команды GDB path, и выполните команду target снова.
14.2.1.2 Загрузка на VxWorks Если вы соединились с целевой машиной VxWorks и хотите отладить объект, который еще не был загружен, вы можете использовать команду GDB load, чтобы загрузить файл из Unix в VxWorks. Объектный файл, заданный в качестве аргумента к load, в действительности открывается дважды: сначала целевой машиной VxWorks, чтобы загрузить код, а затем GDB, чтобы считать таблицу символов. Это может привести к проблемам, если текущие рабочие каталоги в этих системах различаются. Если обе системы монтируют по NFS одинаковые файловые системы, вы можете избежать этих проблем, используя абсолютные пути. В противном случае, проще всего установить рабочий каталог на обеих системах в тот, в котором расположен объектный файл, и затем ссылаться на него по имени, без пути. Например, программа ‘prog.o’ может находиться в ‘vxpath/vw/demo/rdb’ на VxWorks и в ‘hostpath/vw/demo/rdb’ на рабочей машине. Для загрузки этой программы, введите в VxWorks следующее:
-> cd "vxpath/vw/demo/rdb" Затем, в GDB, введите:
(vxgdb) cd hostpath/vw/demo/rdb (vxgdb) load prog.o GDB отобразит ответ, аналогичный этому:
Reading symbol data from wherever/vw/demo/rdb/prog.o... done.
Вы также можете использовать команду load, чтобы заново загрузить объектный модуль, после редактирования и повторной компиляции соответствующего исходного файла.
Заметьте, что при этом GDB удаляет все определенные точки останова, автоматические отображения, вспомогательные переменные, и очищает историю значений. (Это необходимо для того, чтобы сохранить целостность структур данных отладчика, которые ссылаются на таблицу символов целевой системы.) 14.2.1.3 Запуск задач Вы также можете присоединиться к существующей задаче, используя команду attach следующим образом:
(vxgdb) attach задача где задача является шестнадцатеричным идентификатором задачи VxWorks. Когда вы присоединяетесь к задаче, она может выполняться либо быть приостановленной. Выполняющаяся задача приостанавливается в момент присоединения.
14.3 Встроенные процессоры Этот раздел описывает детали, специфичные для определенных встроенных конфигураций.
14.3.1 Встроенный AMD A29K target adapt устр target amd-eb устр скорость прог Удаленная PC-резидентная плата AMD EB29K, присоединенная по последовательным линиям. Устр является последовательным устройством, также как для target remote; скорость позволяет вам указать скорость линии; а прог является именем программы, которая будет отлаживаться, так, как оно появляется в ДОС на ПК. См. Раздел 14.3.1.2 [Протокол EBMON для AMD29K], 14.3.1.1 A29K UDI Для отладки процессоров семейства a29k, GDB поддерживает протокол AMD UDI (“Universal Debugger Interface”1 ). Для использования этой конфигурации с целями AMD, на которых выполняется монитор MiniMON, вам нужна программа MONTIP, доступная бесплатно у AMD. Вы можете также использовать GDB с программой ISSTIP, UDIсовместимым эмулятором a29k, также доступным у AMD.
target udi кл-слово Выбрать интерфейс UDI к удаленной плате a29k или эмулятору. Здесь кл-слово является элементом в конфигурационном файле AMD ‘udi_soc’. Этот файл содержит в качестве элементов ключевые слова, которые определяют параметры, используемые при соединении к целям a29k. Если файл ‘udi_soc’ не находится в вашем рабочем каталоге, вы должны установить путь к нему в переменной 14.3.1.2 Протокол EBMON для AMD29K AMD распространяет плату разработки 29K, предназначенную для помещения в ПК, вместе с программой монитора EBMON, работающей в ДОС. Коротко эта система разработки называется “EB29K”. Чтобы использовать GDB из Unix-системы для выполнения программ на плате EB29K, вы должны сперва соединить последовательным кабелем ПК (в котором установлена плата EB29K) и последовательный порт на Unix-системе. Далее мы предполагаем, что вы соединили кабелем порт ПК ‘COM1’ и ‘/dev/ttya’ на Unix-системе.
14.3.1.3 Установка связи Следующим шагом нужно установить параметры порта ПК, сделав в ДОС что-то вроде этого:
C:\> MODE com1:9600,n,8,1,none Этот пример, выполненный в системе MS DOS 4.0, устанавливает порт ПК в 9600 бит/сек, без проверки четности, восьмибитные данные, один стоп-бит и отсутствие действия для “повтора”; вы должны использовать те же параметры связи при установке соединения со стороны Unix.
Чтобы передать управление с ПК стороне Unix, введите следующее в консоли ДОС:
Универсальный отладочный интерфейс. (Прим. переводчика) C:\> CTTY com (Позже, если вы хотите вернуть управление консоли ДОС, вы можете использовать команду CTTY con—но вы должны послать ее через устройство, имевшее управление, в нашем примере через последовательную линию ‘COM1’.) На Unix-машине, для связи с ПК используйте коммуникационную программу, такую как tip или cu. Например cu -s 9600 -l /dev/ttya Показанные ключи для cu определяют, соответственно, скорость линии и последовательный порт. Если вместо этого вы используете tip, ваша командная строка может выглядеть следующим образом:
tip -9600 /dev/ttya Ваша система может требовать другого имени в том месте, где мы показываем ‘/dev/ttya’ в качестве аргумента к tip. Параметры связи, включая используемый порт, ассоциированы с аргументом к tip в файле описаний “remote”—обычно это ‘/etc/remote’.
Используя соединение tip или cu, измените рабочий каталог ДОС в тот, который содержит копию вашей программы 29K, затем запустите на ПК программу EBMON (управляющая программа EB29K, поставляемая AMD с вашей платой). Вы должны увидеть начальный вывод EBMON, аналогичный следующему, заканчивающийся приглашением EBMON ‘#’:
G:\> CD \usr\joe\work29k G:\USR\JOE\WORK29K> EBMON Am29000 PC Coprocessor Board Monitor, version 3.0- Copyright 1990 Advanced Micro Devices, Inc.
Written by Gibbons and Associates, Inc.
Enter ’?’ or ’H’ for help PC Coprocessor Type = EB29K Available I-RAM Range = 0x8000 to 0x1fffff Available D-RAM Range = 0x80002000 to 0x801fffff Register Stack Size = 0x Byte Write Available = Yes Затем выйдите из программы cu или tip (в этом примере это сделано при помощи ввода ~. в приглашении EBMON). EBMON продолжает работать, готовый к тому, что GDB перехватит управление.
Для этого примера, мы предположили, что существует соединение PC/NFS, которое устанавливает файловую систему Unix-машины как “диск ‘G:’” на ПК. Это является, вероятно, самым удобным способом удостовериться, что одна и та же программа 29K находится и на ПК, и в Unix-системе. Если у вас нет PC/NFS или чего-нибудь аналогичного, соединяющего две системы, вы должны прибегнуть к другому способу передачи программы 29K из Unix на ПК—возможно переписать ее на дискету. GDB не загружает программы по последовательной линии.
14.3.1.4 Кросс-отладка EB29K Наконец, перейдите в каталог, содержащий образ вашей программы 29K в Unix-системе, и запустите GDB, указав имя программы в качестве аргумента:
cd /usr/joe/work29k gdb myfoo Теперь вы можете использовать команду target:
target amd-eb /dev/ttya 9600 MYFOO В этом примере мы предполагали, что ваша программа находится в файле ‘myfoo’. Заметьте, что имя файла, заданное в качестве последнего аргумента к target amd-eb, должно быть таким, каким его видит ДОС. В нашем примере, это просто MYFOO, но вообще оно может включать путь ДОС, и, в зависимости от механизма передачи, может быть не похоже на имя на Unix-машине.
В этом месте вы можете установить желаемые точки останова; когда вы будете готовы увидеть вашу программы выполняющейся на плате 29K, используйте команду GDB run.
Чтобы остановить отладку удаленной программы, используйте команду GDB detach.
Чтобы возвратить управление консоли ПК, используйте tip или cu снова, после завершения вашего сеанса GDB, чтобы присоединиться к EBMON. Затем вы можете ввести команду q, чтобы завершить работу EBMON, возвращая управление командному интерпретатору ДОС. Введите CTTY con, чтобы возвратить командный ввод основной консоли ДОС, и введите ~., чтобы покинуть tip или cu.
14.3.1.5 Удаленный журнал Команда target amd-eb создает в текущем рабочем каталоге файл ‘eb.log’, чтобы помочь отладить проблемы с соединением. ‘eb.log’ записывает весь вывод ‘EBMON’, включая эхо посланных ему команд. Выполнение ‘tail -f’ для этого файла в другом окне часто помогает понять проблемы с EBMON, или неожиданные события на стороне ПК.
14.3.2 ARM target rdi устр Монитор ARM Angel, через интерфейс библиотеки RDI к протоколу ADP. Вы можете использовать эту цель для взаимодействия как с платами, на которых выполняется монитор Angel, так и с устройством отладки EmbeddedICE JTAG.
target rdp устр 14.3.3 Hitachi H8/ target hms устр Плата Hitachi SH, H8/300 или H8/500, присоединенная через последовательную линию к вашей машине. Используйте специальные команды device и speed для управления последовательной линией и используемой скоростью связи.
target e7000 устр Эмулятор E7000 для Hitachi H8 и SH.
target sh3 устр target sh3e устр Целевые системы Hitachi SH-3 и SH-3E.
Когда вы выбираете удаленную отладку для платы Hitachi SH, H8/300 или H8/500, команда load загружает вашу программу на плату Hitachi, и также открывает ее как текущую выполняемую цель для GDB на вашей машине (как команда file).
Для общения с вашим Hitachi SH, H8/300 или H8/500, GDB необходимо знать следующие вещи:
1. что вы хотите использовать: ‘target hms’, удаленный отладочный интерфейс для микропроцессоров Hitachi, или ‘target e7000’, встроенный эмулятор для Hitachi SH и Hitachi 300H. (‘target hms’ используется по умолчанию, если GDB сконфигурирован специально для Hitachi SH, H8/300 или H8/500.) 2. какое последовательное устройство соединяет вашу машину с платой Hitachi (по умолчанию используется первое последовательное устройство, доступное на вашей машине).
3. какую скорость использовать для этого последовательного устройства.
14.3.3.1 Соединение с платами Hitachi Используйте специальную команду GDB ‘device порт’, если вам нужно явно установить последовательное устройство. По умолчанию используется первый порт, доступный на вашей машине. Это необходимо только на Unix-машинах, где это обычно что-то типа ‘/dev/ttya’.
GDB имеет другую специальную команду для установки скорости связи: ‘speed bps’.
Эта команда также используется только на Unix-машинах; в ДОС, устанавливайте скорость линии как обычно извне GDB командой mode (например, mode com2:9600,n,8,1,p для соединения 9600 бит/сек.
Команды ‘device’ и ‘speed’ доступны для отладки программ микропроцессора Hitachi, только если вы используете рабочую среду Unix. Если вы используете ДОС, для взаимодействия с платой разработки через последовательный порт ПК GDB полагается на вспомогательную резидентную программу asynctsr. Вы также должны использовать команду ДОС mode, чтобы подготовить порт со стороны ДОС.
Следующий пример сеанса иллюстрирует шаги, необходимые для запуска программы на H8/300 под управлением GDB. В нем используется программа H8/300 под названием ‘t.x’. Для Hitachi SH и H8/500 процедура та же самая.
Сперва подсоедините вашу плату разработки. В этом примере, мы используем плату, присоединенную к порту COM2. Если вы используете другой последовательный порт, подставьте его имя в агрументе команды mode. Когда вы вызываете asynctsr, вспомогательную программу связи, используемую отладчиком, вы передаете ей только числовую часть имени последовательного порта; например, ниже ‘asynctsr 2’ запускает asynctsr для COM2.
C:\H8300\TEST> asynctsr C:\H8300\TEST> mode com2:9600,n,8,1,p Resident portion of MODE loaded Предупреждение: Мы обнаружили ошибку в PC-NFS, которая конфликтует с asynctsr. Если вы также используете PC-NFS на вашей ДОС-машине, вам может потребоваться отключить его, или даже загрузить машину без него, чтобы использовать asynctsr для управления отладочной платой.
Теперь, когда связь установлена и плата разработки присоединена, вы можете запустить GDB. Вызовите gdb с именем вашей программы в качестве аргумента. GDB выводит обычное приглашение: ‘(gdb)’. Используйте две специальные команды для начала сеанса отладки: ‘target hms’ для задания кросс-отладки для платы Hitachi, и команду load для загрузки вашей программы на нее. load выводит имена разделов программы, и ‘*’ для каждых двух килобайт загруженных данных. (Если вы хотите обновить данные GDB для символов или для выполняемого файла без загрузки, используйте команды GDB file или symbol-file. Для описания этих команд, равно как и самой команды load, см.
Раздел 12.1 [Команды для задания файлов], с. 105.) (eg-C:\H8300\TEST) gdb t.x GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" GDB 5.0, Copyright 1992 Free Software Foundation, Inc...
(gdb) target hms Connected to remote H8/300 HMS system.
.text : 0x8000.. 0xabde ***********.stack : 0xf000.. 0xf014 * Теперь вы готовы выполнять или отлаживать вашу программу. С этого момента, вы можете использовать все обычные команды GDB. Команда break устанавливает точки останова; run запускает вашу программу; print или x отображает данные; команда continue возобновляет выполнение после остановки в точке останова. Вы можете использовать команду help в любой момент, чтобы узнать больше о командах GDB.
Помните, однако, что возможности операционной системы не доступны на вашей плате разработки; например, если ваша программа зависает, вы не можете послать сигнал прерывания—но можете нажать кнопку reset!
Используйте кнопку reset на вашей плате разработки • чтобы прервать вашу программу (не используйте ctl-C на машине с ДОС—у нее нет способа передать сигнал прерывания на плату разработки); и • для возврата к приглашению GDB после того, как ваша программа нормально завершается. Протокол связи не предусматривает другого способа для GDB определить, что ваша программа завершилась.
В любом случае, GDB видит результат нажатия reset на плате разработки как “нормальное завершение” вашей программы.
14.3.3.2 Использование встроенного эмулятора E Вы можете использовать встроенный эмулятор E7000 для разработки кода либо для Hitachi SH, либо для H8/300H. Используйте одну из этих форм команды ‘target e7000’ для соединения GDB с вашей E7000:
target e7000 порт скорость Используйте эту форму, если ваша E7000 присоединена к последовательному порту. Аргумент порт идентифицирует, какой последовательный порт использовать (например, ‘com2’). Третий аргумент является скоростью линии в битах в секунду (например, ‘9600’).
target e7000 имя-узла Если ваша E7000 установлена как узел сети TCP/IP, вы можете просто указать его имя; GDB использует для соединения telnet.
14.3.3.3 Специальные команды GDB для Hitachi Некоторые команды GDB доступны только для H8/300:
set machine h set machine h8300h Настраивайте GDB на один из двух вариантов архитектур H8/300 с помощью ‘set machine’. Вы можете использовать ‘show machine’, чтобы проверить, какой из вариантов действует в данный момент.
14.3.4 H8/ set memory мод show memory Укажите, какую модель памяти H8/500 (мод) вы используете с помощью ‘set memory’; проверяйте, какая модель используется при помощи ‘show memory’. Допустимыми значениями для мод являются small, big, medium и compact.
14.3.5 Intel i target mon960 устр Монитор MON960 для Intel i960.
target nindy имя-устр Плата Intel 960, управляемая Nindy Monitor. Имя-устр является именем последовательного устройства, которое должно использоваться для соединения, например ‘/dev/ttya’.
Nindy—это программа ROM Monitor для целевых систем Intel 960. Когда GDB сконфигурирован для управления удаленным Intel 960 с использованием Nindy, вы можете указать ему, как присоединиться к 960 несколькими способами:
• Указав последовательный порт, версию протокола Nindy и скорость связи через ключи командной строки;
• Ответив на запрос при старте;
• Используя команду target в любом месте вашего сеанса GDB. См. Раздел 13.2 [Команды для управления целями], с. 111.
С интерфейсом Nindy к плате Intel 960, команда load загружает имя-файла на 960, а также добавляет его символьные данные в GDB.
14.3.5.1 Вызов Nindy Если вы просто запустите gdb без использования ключей командной строки, у вас запросят, какой последовательный порт использовать, до того, как вы получите обычное приглашение GDB:
Attach /dev/ttyNN - specify NN, or "quit" to quit:
Ответьте на запрос с любым суффиксом (после ‘/dev/tty’), определяющим последовательный порт, который вы хотите использовать. Вы можете, по своему выбору, просто начать работу без соединения с Nindy, ответив на приглашение пустой строкой. Если вы сделаете это и позже захотите присоединиться к Nindy, используйте target (см. Раздел 13. [Команды для управления целями], с. 111).
14.3.5.2 Параметры для Nindy Вот параметры вызова для начала вашего сеанса GDB с подключенной платой Nindyr порт Задайте имя порта последовательного интерфейса, который должен использоваться для соединения с целевой системой. Этот ключ доступен только когда GDB сконфигурирован для целевой архитектуры Intel 960. Вы можете определить порт любым из следующих способов: полный путь (например, ‘-r /dev/ttya’), имя устройства в ‘/dev’ (например, ‘-r ttya’) или просто уникальный суффикс для определенного tty (например, ‘-r a’).
(Заглавная буква “O”, не ноль.) Определяет, что GDB должен использовать “старый” протокол монитора Nindy для соединения с целевой системой. Этот ключ доступен только когда GDB сконфигурирован для целевой архитектуры Предупреждение: если вы определите ‘-O’, но в действительности попытаетесь связаться с системой, которая ожидает более нового протокола, соединение не будет установлено, как будто не соответствуют скорости. GDB неоднократно пытается соединиться снова на нескольких различных скоростях линии. Вы можете остановить Определяет, что GDB должен сперва послать целевой системе сигнал BREAK, -brk пытаясь сбросить ее, перед соединением с целью Nindy.
Предупреждение: Многие целевые системы не имеют требуемых для этого аппаратных средств; это работает только на немногих Стандартный ключ ‘-b’ управляет скоростью линии, используемой на последовательном порту.
14.3.5.3 Команда сброса Nindy Для целей Nindy, эта команда посылает “break” удаленной целевой системе; она reset полезна, только если целевая система была оборудована схемой для выполнения аппаратного сброса (или других действий, представляющих интерес) при обнаружении прерывания.
14.3.6 Mitsubishi M32R/D target m32r устр Монитор ROM Mitsubishi M32R/D.
14.3.7 M68k Конфигурация Motorola m68k включает поддержку ColdFire, и команду target для следующих мониторов ROM.
target abug устр target cpu32bug устр Монитор CPU32BUG, выполняющийся на плате CPU32 (M68K).
target dbug устр Монитор dBUG ROM для Motorola ColdFire.
target est устр Монитор EST-300 ICE, выполняющийся на плате CPU32 (M68K).
target rom68k устр Монитор ROM 68K, выполняющийся на плате M68K IDP.
Если GDB сконфигурирован с m68*-ericsson-*, то вместо этого у него будет только одна специальная команда target:
target es1800 устр Эмулятор ES-1800 для M68K.
target rombug устр Монитор ROMBUG ROM для OS/9000.
14.3.8 M88K target bug устр Монитор BUG, выполняющийся на плате MVME187 (m88k).
14.3.9 Встроенный MIPS GDB может использовать удаленный отладочный протокол MIPS для взаимодействия с платой MIPS, присоединенной к последовательной линии. Эта возможность доступна, если вы сконфигурировали GDB с ‘-target=mips-idt-ecoff’.
Используйте эти команды GDB для определения соединения с вашей целевой платой:
target mips порт Для выполнения программы на плате, выполните gdb, задав имя программы в качестве аргумента. Для соединения с платой, используйте команду ‘target mips порт’, где порт—имя последовательного порта, присоединенного к плате.
Если программа еще не была загружена на плату, вы можете использовать команду load, чтобы это сделать. Затем вы можете использовать все обычные Например, эта последовательность команд устанавливает соединение к целевой плате через последовательный порт, загружает и начинает выполнение из отладчика программы с именем prog:
target mips имя-машины:номер-порта В некоторых рабочих конфигурациях GDB, вы можете задать TCP-соединение (например, к последовательной линии, управляемой терминальным концентратором) вместо последовательного порта, используя синтаксис ‘имя-машины:номер-порта’.
target pmon порт target ddb порт NEC DDB-разновидность PMON для Vr4300.
target lsi порт LSI-разновидность PMON.
target r3900 устр Densan DVE-R3900 монитор ROM для Toshiba R3900 Mips.
target array устр Плата контроллера RAID Array Tech LSI33K.
GDB также поддерживает следующие специальные команды для целей MIPS:
set processor арг show processor Используйте команду set processor для установки типа процессора MIPS, когда вы хотите обратиться к регистрам, уникальным для данного типа процессора. Например, set processor r3041 велит GDB использовать регистры CPO, соответствующие микросхеме 3041. Используйте команду show processor, чтобы узнать, какой процессор MIPS используется GDB. Используйте команду info reg чтобы узнать, какие регистры использует GDB.
set mipsfpu double set mipsfpu single set mipsfpu none show mipsfpu Если ваша целевая плата не поддерживает сопроцессор MIPS для вычислений с плавающей точкой, вы должны использовать команду ‘set mipsfpu none’ (если вам это нужно, вы можете поместить эту команду в ваш файл инициализации GDB). Это говорит GDB, как найти значения функций, которые возвращают величины с плавающей точкой. Это также позволяет GDB избежать сохранения регистров с плавающей точкой при вызове функций на плате. Если вы используете сопроцессор поддержки вычислений с плавающей точкой с поддержкой только одинарной точности, как на процессоре r4650, используйте команду ‘set mipsfpu single’. По умолчанию используется сопроцессор поддержки вычислений с плавающей точкой двойной точности; этот режим может быть выбран с помощью ‘set mipsfpu double’.
В предыдущих версиях, единственным выбором была двойная точность или отсутствие поддержки вычислений с плавающей точкой, так что ‘set mipsfpu on’ выберет режим двойной точности, а ‘set mipsfpu off’ отключит эту поддержку.
Как обычно, вы можете запросить значение переменной mipsfpu при помощи set remotedebug n show remotedebug Вы можете увидеть некоторую отладочную информацию о связи с платой, установив переменную remotedebug. Если вы установите ее в 1 при помощи ‘set remotedebug 1’, будет отображаться каждый пакет. Если вы установите ее в 2, то будет отображаться каждый символ. В любой момент вы можете проверить текущее значение переменной командой ‘show remotedebug’.
set timeout секунды set retransmit-timeout секунды show timeout show retransmit-timeout Вы можете управлять временем ожидания пакета, используемом в удаленном протоколе MIPS, при помощи команды set timeout секунды. Значение по умолчанию—5 секунд. Аналогично, вы можете управлять временем ожидания, используемом при ожидании подтверждения пакета с помощью команды set retransmit-timeout секунды. По умолчанию 3 секунды. Вы можете узнать обе эти величины с помощью show timeout и show retransmittimeout. (Эти команды доступны только если GDB сконфигурирован для цели ‘-target=mips-idt-ecoff’.) Время ожидания, установленное при помощи set timeout, не имеет значения, когда GDB ожидает остановки вашей программы. В этом случае, GDB ждет бесконечно, потому что у него нет способа узнать, сколько программа будет выполняться, пока не остановится.
14.3.10 PowerPC target dink32 устр target ppcbug устр target ppcbug1 устр Монитор ROM PPCBUG для PowerPC.
target sds устр Монитор SDS, выполняющийся на плате PowerPC (такой как Motorola ADS).
14.3.11 Встроенный HP PA target op50n устр Монитор OP50N, выполняющийся на плате OKI HPPA.
target w89k устр Монитор W89K, выполняющийся на плате Winbond HPPA.
14.3.12 Hitachi SH target hms устр Плата Hitachi SH, присоединенная через последовательную линию к вашей рабочей машине. Используйте специальные команды device и speed для управления последовательной линией и используемой скоростью связи.
target e7000 устр Эмулятор E7000 для Hitachi SH.
target sh3 устр target sh3e устр Целевые системы Hitachi SH-3 и SH-3E.
14.3.13 Tsqware Sparclet GDB позволяет разработчикам отлаживать с Unix-машины задачи, выполняющиеся на целевых системах Sparclet. GDB использует код, который выполняется как Unix-машине, так и на цели Sparclet. Программа gdb устанавливается и работает на Unix-машине.
remotetimeout арг GDB поддерживает параметр remotetimeout. Он устанавливатся пользователем, а арг представляет число секунд, в течение которых GDB ожидает ответы.
При компиляции для отладки, используйте ключи ‘-g’ для получения отладочной информации, и ‘-Ttext’ для того, чтобы разместить программу в том месте, в каком вы хотите загрузить ее на целевую машину. Вы также можете добавить ключ ‘-n’ или ‘-N’, чтобы уменьшить размеры разделов. Например:
sparclet-aout-gcc prog.c -Ttext 0x12010000 -g -o prog -N Для проверки, что адреса в действительности являются теми, которые вы подразумевали, можно использовать objdump:
sparclet-aout-objdump -headers -syms prog После того, как вы установили путь поиска выполняемых файлов, в котором присутствует GDB, вы готовы запустить отладчик. С вашей рабочей машины Unix, выполните gdb (или sparclet-aout-gdb, в зависимости от вашей установки).
GDB запустится и покажет приглашение:
14.3.13.1 Установка файла для отладки Команда GDB file позволяет вам выбрать программу для отладки.
(gdbslet) file prog Затем GDB пытается прочитать таблицу символов программы ‘prog’. Он находит файл путем поиска в каталогах, перечисленных в пути поиска команд. Если файл был скомпилирован с отладочной информацией (ключ ‘-g’), то также будет произведен поиск исходных файлов. GDB находит исходные файлы, производя поиск в каталогах, перечисленных в пути поиска каталогов (см. Раздел 4.4 [Рабочая среда вашей программы], с. 23). Если ему не удается найти файл, он выводит сообщение, подобное этому:
prog: No such file or directory.
Когда это случается, добавьте соответствующие каталоги в пути поиска с помощью команд GDB path и dir, и выполните команду target снова.
14.3.13.2 Соединение к Sparclet Команда GDB target позволяет вам установить соединение с целевой машиной Sparclet.
Для соединения с последовательным портом “ttya”, введите:
(gdbslet) target sparclet /dev/ttya Remote target sparclet connected to /dev/ttya main () at../prog.c: GDB выведет сообщение, подобное этому:
Connected to ttya.
14.3.13.3 Загрузка на Sparclet Когда вы установили соединение к цели Sparclet, вы можете использовать команду GDB load для загрузки файла с рабочей машины на целевую. Имя файла и смещение загрузки должно быть задано команде load в качестве аргумента. Так как формат файла aout, программа должна быть загружена по начальному адресу. Чтобы определить, чему равна эта величина, вы можете использовать objdump. Смещение загрузки—это смещение, которое добавляется к VMA (Virtual Memory Address2 ) каждого раздела файла. Например, если программа ‘prog’ была скомпонована с адресом текста 0x1201000, сегментом данных по адресу 0x12010160 и сегментом стека по адресу 0x12010170, введите в GDB:
(gdbslet) load prog 0x Loading section.text, size 0xdb0 vma 0x Если код загружается по адресу, отличному от того, по которому программа была скомпонована, вам может потребоваться использовать команды section и add-symbolfile, чтобы сообщить GDB, куда отобразить таблицу символов.
14.3.13.4 Выполнение и отладка Теперь вы можете начать отлаживать задачу, используя команды GDB для управления выполнением, b, step, run, и так далее. Все такие команды перечислены в этом руководстве.
(gdbslet) b main Breakpoint 1 at 0x12010000: file prog.c, line 3.
(gdbslet) run Starting program: prog Breakpoint 1, main (argc=1, argv=0xeffff21c) at prog.c: (gdbslet) step 14.3.14 Fujitsu Sparclite target sparclite устр Платы Fujitsu sparclite, используемые только с целью загрузки. Чтобы отлаживать программу, вы должны использовать дополнительную команду. Например, target remote устр, используя стандартный удаленный протокол GDB.
14.3.15 Tandem ST GDB может быть использован с телефонным коммутатором Tandem ST2000, поддерживающим протокол Tandem STDBUG.
Для соединения вашего ST2000 с рабочей машиной, смотрите руководство производителя. После того, как ST2000 физически подключен, вы можете выполнить:
target st2000 устр скорость чтобы установить его как вашу отладочную среду. Устр—это обычно имя последовательного устройства, такое как ‘/dev/ttya’, соединенного с ST2000 через последовательную линию. Вместо этого, вы можете указать устр как TCP-соединение (например, к последовательной линии, присоединенной через терминальный концентратор), используя синтаксис имя-машины:номер-порта.
виртуальный адрес памяти (Прим. переводчика) Команды load и attach не определены для этой цели; вы должны загрузить вашу программу на ST2000 также, как вы это обычно делаете для автономных действий. GDB читает отладочную информацию (например, символы) из отдельной, отладочной версии программы, которая доступна на вашем рабочем компьютере.
Следующие вспомогательные команды GDB доступны для облегчения работы в среде ST2000:
st2000 команда Послать команду монитору STDBUG. Доступные команды описаны в руководстве производителя.
Соединяет управляющий терминал с командным монитором STDBUG. Когда connect вы закончили взаимодействие с STDBUG, ввод одной из двух последовательностей символов возвратит вас назад к приглашению GDB: RET ~. (Return, за которым следует тильда и точка) или RET ~ C-d (Return, за которым следует 14.3.16 Zilog Z Будучи сконфигурированным для отладки целей Zilog Z8000, GDB включает имитатор Z8000.
Для семейства Z8000, ‘target sim’ имитирует либо Z8002 (не сегментированный вариант архитектуры Z8000), либо Z8001 (сегментированный вариант). Имитатор распознает подходящую архитектуру изучая объектный код.
target sim арг Отладка программ на имитируемом ЦП. Если имитатор поддерживает параметры установки, укажите их в арг.
После определения этой цели, вы можете отлаживать программы для имитированного ЦП таким же образом, как программы для вашего рабочего компьютера; используйте команду file для загрузки образа новой программы, команду run для запуска вашей программы, и так далее.
Помимо того, что доступны все обычные машинные регистры (см. Раздел 8.10 [Регистры], с. 74), имитатор Z8000 предоставляет три специально названных регистра с дополнительной информацией:
Считает тактовые импульсы с имитаторе.
cycles Считает инструкции, выполненные в имитаторе.
insts Время выполнения в шестидесятых долях секунды.
time Вы можете ссылаться на эти значения в выражениях GDB с помощью обычных соглашений; например, ‘b fputc if $cycles>5000’ устанавливает условную точку останова, которая срабатывает только после как минимум 5000 имитированных тактовых импульсов.
14.4 Архитектуры Этот раздел описывает свойства архитектур, которые воздействуют на все применения GDB с данной архитектурой, как при чистой отладке, так и при кросс-отладке.
14.4.1 A29K set rstack_high_address адрес В процессорах семейства AMD 29000, регистры сохраняются в отдельном стеке регистров. Для отладчика не существует способа определить размер этого стека. Обычно, GDB просто подразумевает, что стек “достаточно большой”.
Это может привести к тому, что GDB попытается обратиться несуществующей области памяти. В случае необходимости, вы можете решить эту проблему, указав конечный адрес стека регистров с помощью команды set rstack_high_ address. Аргумент должен быть адресом, который вы, вероятно, захотите начать с ‘0x’, чтобы задать его в шестнадцатеричном виде.
show rstack_high_address Отобразить текущее ограничение на стек регистров для процессоров семейства 14.4.2 Alpha Смотрите следующий раздел.
14.4.3 MIPS Компьютеры, базирующиеся на архитектурах Alpha и MIPS, используют необычный кадр стека, который иногда требует от GDB поиска в объектном коде в обратном направлении, чтобы найти начало функции.
Чтобы сократить время ответа (особенно для встроенных приложений, где GDB может быть ограничен медленной последовательной линией для этого поиска), вы можете захотеть ограничить область поиска, используя одну из этих команд:
set heuristic-fence-post предел Ограничить GDB для исследования не более предела байт при поиске начала функции. Значение 0 (по умолчанию) означает неограниченный поиск. Однако, исключая 0, чем больше предел, тем больше байт heuristic-fence-post должен просмотреть, и, следовательно, тем дольше он будет выполняться.
show heuristic-fence-post Отобразить текущее значение данного предела.
Эти команды доступны только когда GDB сконфигурирован для отладки программ на процессорах Alpha или MIPS.
150 Отладка с помощью GDB 15 Управление GDB Вы можете изменять способы взаимодействия GDB с вами, используя команду set.
Для команд, управляющих способами отображения данных GDB, смотрите Раздел 8. [Параметры вывода], с. 68. Другие установки описаны здесь.
15.1 Приглашение GDB демонстрирует свою готовность считать команду, выводя строку, называемую приглашением. Обычно это ‘(gdb)’. Вы можете изменить строку приглашения командой set prompt. Например, при отладке GDB с помощью GDB, полезно изменить приглашение в одном из сеансов так, чтобы вы всегда могли понять, с каким из них вы общаетесь.
Замечание: set prompt не добавляет пробелы после установленного вами приглашения.
Это позволяет устанавливать приглашение, заканчивающееся пробелом или нет.
set prompt новое-пригл Указывает GDB, что с этого момента надо использовать в качестве стpоки приглашения новое-пригл.
show prompt Печатает строку в форме: ‘Gdb’s prompt is: ваше-пригл’ 15.2 Редактирование команд GDB читает входные команды через интерфейс readline. Эта библиотека gnu обеспечивает согласованное поведение для программ, которые предоставляют пользователю интерфейс командной строки. Преимуществами являются стили редактирования командной строки gnu Emacs или vi, csh-подобная подстановка истории и сохранение и повторное использование истории команд между сеансами отладки.
Вы можете управлять поведением редактирования командной строки в GDB командой set.
set editing set editing on Включает редактирование командной строки (включено по умолчанию).
set editing off Отключает редактирование командной строки.
show editing Показывает, включено редактирование командной строки или нет.
15.3 История команд GDB может отслеживать команды, которые вы вводите во время сеансов отладки, чтобы вы могли точно знать, что происходило. Используйте следующие команды для управления возможностями истории команд GDB.
set history filename имя-файла Устанавливает имя файла истории команд GDB в имя-файла. Это файл, откуда GDB читает исходный список истории команд и куда он записывает историю команд при выходе из данного сеанса. Вы можете обращаться к этому списку через раскрывание истории или с помощью символов редактирования истории команд, перечисленных ниже. По умолчанию, этот файл есть значение переменной среды GDBHISTFILE, или, если эта переменная не установлена, ‘./.gdb_history’ (‘./_gdb_history’ в MS-DOS).
set history save set history save on Записать историю команд в файл, имя которого может быть определено командой set history filename. По умолчанию, эта возможность отключена.
set history save off Прекратить запись истории команд в файл.
set history size размер Установить число команд, которые GDB хранит в своем списке истории. Значение по умолчанию берется из переменной среды HISTSIZE, или приравнивается 256, если эта переменная не установлена.
Раскрывание истории назначает специальное значение знаку !.
Так как ! является также оператором логического отрицания в Си, раскрывание истории по умолчанию отключено. Если вы решите включить раскрывание истории командой set history expansion on, вы должны будете снабдить ! (когда он используется как логическое отрицание в выражении) последующим пробелом или символом табуляции, чтобы предохранить его от раскрывания. Средства истории Readline не делают попытки подстановки на строках != и !(, даже когда раскрывание истории включено.
Вот команды управления раскрыванием истории:
set history expansion on set history expansion Включить раскрывание истории. Раскрывание по умолчанию отключено.
set history expansion off Отключить раскрывание истории.
Библиотека Readline поставляется вместе с более полной документацией по возможностям редактирования и раскрывания истории. Пользователи, незнакомые с gnu Emacs или vi, могут почитать ее.
show history show history filename show history save show history size show history expansion Эти команды отображают состояние параметров истории GDB. Просто show history показывает все четыре состояния.
show commands Отобразить последние десять команд в истории.
show commands n Вывести десять команд, расположенных вокруг команды с номером n.
show commands + Вывести десять команд, расположенных сразу после последних выведенных.
15.4 Размер экрана Определенные команды GDB могут выводить большое количество информации на экран. Чтобы помочь вам всю ее прочитать, GDB приостанавливает вывод и запрашивает ввод в конце каждой страницы вывода. Нажмите RET, когда вы хотите продолжить вывод, или q для уничтожения оставшегося вывода. Также, установка ширины экрана определяет, когда переносить строки вывода. В зависимости от того, что выводится, GDB пытается разбить стpоку в удобочитаемом месте, вместо того чтобы просто продолжить ее на следующую строчку.
Обычно GDB узнает размер экрана из программы драйвера терминала. Например, в Unix GDB использует базу данных termcap, вместе со значением переменной среды TERM и установками stty rows и stty cols. Если это неправильно, вы можете заменить эти установки командами set height и set width:
set height lpp show height set width cpl show width Эти команды set определяют высоту экрана в lpp строк и ширину в cpl знаков.
Соответствующие команды show отображают текущие установки.
Если вы определите высоту в ноль строк, GDB не будет останавливаться при выводе, независимо от того, насколько он длинный. Это полезно, если вывод осуществляется в файл или буфер редактора.
Аналогично, вы можете определить ‘set width 0’, чтобы запретить GDB переносить строки вывода.
15.5 Числа Вы всегда можете вводить в GDB числа в восьмеричной, десятичной, или шестнадцатеричной системе в соответствии c обычными соглашениями: восьмеричные числа начинаются с ‘0’, десятичные числа оканчиваются на ‘.’ и шестнадцатеричные числа начинаются с ‘0x’. Числа, которые не начинаются ни c одного из этих знаков, по умолчанию считаются десятичными; аналогично, отображение чисел по умолчанию—если не определен никакой конкретный формат—осуществляется по основанию 10. Командой set radix вы можете изменять основание, устанавливаемое по умолчанию для ввода и вывода.
set input-radix основание Установить основание по умолчанию для числового ввода. Поддерживаемые варианты для основания—8, 10 или 16. Само основание должно быть определено либо недвусмысленно, либо с использованием текущего основания системы счисления по умолчанию; например, любая из команд устанавливает десятичное основание. С другой стороны, ‘set radix 10’ оставляет основание системы счисления без изменений независимо от того, каким set output-radix основание Установить основание по умолчанию для числового вывода. Поддерживаемые варианты для основания—8, 10 или 16. Само основание должно быть определено либо недвусмысленно, либо с использованием текущего основания системы счисления по умолчанию.
show input-radix Отобразить текущее основание по умолчанию для числового ввода.
show output-radix Отобразить текущее основание по умолчанию для числового вывода.
15.6 Необязательные предупреждения и сообщения По умолчанию, GDB ничего не сообщает о своей внутренней деятельности. Если вы работаете на медленной машине, то вы можете захотеть использовать команду set verbose.
Она велит GDB сообщать вам, когда он выполняет длинную внутреннюю операцию, чтобы вы не думали, что он завис.
В настоящее время, set verbose управляет только сообщениями о чтении таблиц символов исходного файла; смотрите Раздел 12.1 [Команды для задания файлов], с. 105, описание symbol-file.
set verbose on Разрешает GDB выводить опpеделенные информационные сообщения.
set verbose off Отключает вывод GDB опpеделенных информационных сообщений.
show verbose Сообщает, установлено set verbose в on или off.
По умолчанию, если GDB сталкивается с ошибками в таблице символов объектного файла, он не сообщает об этом; но если вы отлаживаете компилятор, эта информация может вам пригодиться (см. Раздел 12.2 [Ошибки чтения файлов с символами], с. 108).
set complaints предел Позволяет GDB выводить предел сообщений о каждом типе необычных символов прежде, чем пеpестать сообщать о проблеме. Установите предел в ноль для подавления всех сообщений, или очень большим, чтобы предотвратить подавление сообщений.
show complaints Выводит ограничение GDB на вывод сообщений о символах.
По умолчанию GDB осмотрителен, и задает, как иногда кажется, множество глупых вопросов, чтобы подтвердить определенные команды. Например, если вы пытаетесь выполнить программу, которая уже выполняется:
The program being debugged has been started already.
Start it from the beginning? (y or n) Если вы неуклонно желаете сами разбираться с последствиями ваших собственных команд, вы можете отключить эту “возможность”:
set confirm off Отключает запросы подтверждений.
set confirm on Включает запросы подтверждений (по умолчанию).
show confirm Показывает, выводятся ли запросы подтверждений.
15.7 Необязательные сообщения о внутренних событиях set debug arch Включает и отключает вывод отладочной информации gdbarch. По умолчанию show debug arch Отображает текущее состояние вывода отладочной информации gdbarch.
set debug event Включает и отключает вывод отладочной информации о событиях GDB. По show debug event Отображает текущее состояние вывода отладочной информации о событиях set debug expression Включает и отключает вывод отладочной информации о выражениях GDB. По show debug expression Отображает текущее состояние вывода отладочной информации о выражениях set debug overload Включает и выключает вывод GDB отладочной информации о перегруженных символах Си++. Это включает такую информацию, как упорядочивание функций, и так далее. По умолчанию отключено.
show debug overload Отображает текущее состояние вывода GDB отладочной информации о перегруженных символах Си++.
set debug remote Включает и выключает вывод отчета о всех пакетах, посланных вперед и назад по последовательной линии удаленной машине. Информация печатается в стандартный выходной поток GDB. По умолчанию отключено.
show debug remote Выводит состояние вывода удаленных пакетов.
set debug serial Включает и выключает вывод GDB отладочной информации о последовательном соединении. По умолчанию отключено.
show debug serial Отображает текущее состояние вывода GDB отладочной информации о последовательном соединении.
set debug target Включает и выключает вывод GDB отладочной информации о цели. Эта включает информацию о том, что происходит на уровне цели GDB. По умолчанию show debug target Отображает текущее состояние вывода GDB отладочной информации о цели.
set debug varobj Включает и отключает вывод GDB отладочной информации о переменных объектах. По умолчанию отключено.
show debug varobj Отображает текущее состояние вывода GDB отладочной информации о переменных объектах.
16 Фиксированные последовательности команд Кроме команд точки останова (см. Раздел 5.1.7 [Команды точки останова], с. 41), GDB предоставляет два способа сохранить последовательности команд для выполнения целиком: определяемые пользователем команды и командные файлы.
16.1 Команды, определяемые пользователем Команда, определяемая пользователем—это последовательность команд GDB, которой вы назначаете имя, как новой команде. Это осуществляется командой define. Пользовательские команды могут иметь до 10 параметров, разделенных пробелами. Внутри команды пользователя, доступ к параметрам производится посредством $arg0... $arg9. Вот простой пример:
define adder print $arg0 + $arg1 + $arg Для выполнения команды используйте:
Этот пример определяет команду adder, которая печатает сумму трех своих параметров.
Обратите внимание, что параметры являются текстовыми подстановками, так что они могут ссылаться на переменные, использовать сложные выражения или даже выполнять вызовы подчиненных функций.
define имя-команды Определить команду с именем имя-команды. Если команда с таким именем уже имеется, у вас запрашивается подтверждение на ее переопределение.
Определение команды состоит из других командных строк GDB, которые задаются после команды define. Конец этих команд отмечается стpокой, содержащей end.
Имеет один аргумент—вычисляемое выражение. Команда сопровождается поif следовательностью команд, которые выполняются, если выражение истинно (отлично от нуля). Затем может следовать необязательная стpока else, сопровождаемая последовательностью команд, которые выполняются только при ложном значении данного выражения. Конец списка отмечается стpокой, содержащей end.
Синтаксис подобен if: команда имеет один параметр, который является вычисwhile ляемым выражением и должен сопровождаться командами, по одной в стpоке, которые завершаются end. Выполнение команд повторяется, пока выражение document имя-команды Описывает определенную пользователем команду имя-команды, так, чтобы к ней можно было обращаться посредством help. Команда имя-команды должна быть определена ранее. Эта команда считывает стpоки документации точно так же, как define считывает стpоки определения команды, до строки end.
После завершения команды document, написанная вами документация будет отображаться командой help для команды имя-команды.
Вы можете использовать команду document неоднократно, чтобы изменить документацию команды. Переопределение команды посредством define не изменяет документации.
help user-defined Перечислить все определенные пользователем команды, вместе с первой строкой документации (если она есть).
show user show user имя-команды Вывести команды GDB, использовавшиеся для определения имя-команды (но не ее документацию). Если имя-команды не задано, вывести содержимое всех определенных пользователем команд.
При выполнении команд, определенных пользователем, команды определения не печатаются. Ошибка в любой из них останавливает выполнение всей определенной пользователем команды.
При использовании в интерактивном режиме, команды, обычно запрашивающие подтверждение, выполняются без запроса, если они используется внутри определенной пользователем команды. Многие команды GDB, которые обычно печатают сообщения о своих действиях, опускают их при использовании в команде, определенной пользователем.
16.2 Определяемые пользователем команды-ловушки Вы можете определять ловушки, которые являются специальным видом определяемых пользователем команд. Всякий раз, когда вы выполняете команду ‘foo’, перед ней выполняется определенная пользователем команда ‘hook-foo’ (без параметров), если она существует.
Кроме того, существует псевдокоманда ‘stop’. Определение (‘hook-stop’) велит выполняться связанным с ней командам при каждом останове вашей программы: перед выполнением команд точек останова, перед выводом на экран сообщений или кадров стека.
Например, чтобы игнорировать сигналы SIGALRM во время выполнения в пошаговом режиме, но обрабатывать их при нормальном выполнении, вы можете определить:
define hook-stop handle SIGALRM nopass define hook-run handle SIGALRM pass define hook-continue handle SIGLARM pass Вы можете определить ловушку для любой однословной команды GDB, но не для синонимов команды; вам следует определить ловушку для базового имени команды, например, backtrace, но не bt. Если во время выполнения вашей ловушки возникает ошибка, выполнение команд GDB останавливается, и он выдает приглашение (до того, как введенная вами команда начнет выполняться).
Если вы попытаетесь определить ловушку, не соответствующую никакой известной команде, вы получите предупреждение от команды define.
16.3 Командные файлы Командный файл для GDB—это файл, состоящий из строк с командами GDB. Такие файлы могут также включать комментарии (строки, начинающиеся с #). Пустая строка в командном файле ничего не делает; она не означает повторение последней команды, как это было бы при вводе с терминала.
Когда вы вызываете GDB, он автоматически выполняет команды из своих файлов инициализации. Это файлы, называющиеся ‘.gdbinit’ в Unix и ‘gdb.ini’ в DOS/Windows. Во время старта, GDB делает следующее:
1. считывает файл инициализации (если он существует) в вашем домашнем каталоге1.
2. Обрабатывает ключи и операнды командной строки.
3. Считывает файл инициализации (если он существует) в текущем рабочем каталоге.
4. Считывает командные файлы, заданные с помощью ключа ‘-x’.
Файл инициализации в вашем домашнем каталоге может устанавливать параметры (такие как ‘set complaints’), которые влияют на последующую обработку ключей и операндов командной строки. Файлы инициализации не выполняются, если вы используете ключ ‘-nx’ см. Раздел 2.1.2 [Выбор режимов], с. 11.
В некоторых конфигурациях GDB, файлу инициализации присваивается другое имя (обычно это среды, где специализированная форма GDB должна сосуществовать с другими формами, следовательно должно быть отличное имя для файла инициализации специализированной версии). Следующие среды используют специальные имена файлов инициализации:
• VxWorks (ОС реального времени Wind River Systems): ‘.vxgdbinit’ • OS68K (ОС реального времени Enea Data Systems): ‘.os68gdbinit’ • ES-1800 (эмулятор Ericsson Telecom AB M68000): ‘.esgdbinit’ Вы также можете запросить выполнение командного файла с помощью команды source:
source имя-файла Выполнить командный файл имя-файла.
Строки командного файла выполняются последовательно, при этом они не выводятся.
Ошибка в любой команде завершает выполнение всего командного файла.
Команды, запрашивающие подтверждение в интерактивном режиме, при выполнении в командном файле выполняются без запросов. Многие команды GDB, обычно выводящие сообщения о своих действиях, опускают эти сообщения при вызове из командных файлов.
16.4 Команды для управляемого вывода Во время выполнения командного файла или определенной пользователем команды, нормальный вывод GDB подавляется; единственый появляющийся вывод—тот, который производится явно командами из определения. В этом разделе описываются три команды, полезные для получения именно такого вывода, который вы хотите.
echo текст Напечатать текст. Непечатные знаки могут быть включены в текст при помощи экранирующих последовательностей Си, таких как ‘\n’ для перехода на новую строку. Переход на новую строку не печатается, если вы его не укажете.
В дополнение к стандартным экранирующим последовательностям Си, обратная косая черта, за которой следует пробел, обозначает пробел. Это полезно для отображения строки с пробелами в начале или конце, поскольку в противном случае начальные и конечные пробелы удаляются из всех аргументов.
Чтобы напечатать ‘ and foo = ’, используйте команду ‘echo \ and foo = \ ’.
Обратная косая черта в конце текста может использоваться, как и в Си, для продолжения команды на последующие строки. Например, В системах DOS/Windows, домашним каталогом считается тот, который указывает переменная среды производит такой же вывод как output выражение Напечатать значение выражения и ничего кроме него: никаких новых строк, никаких ‘$nn = ’. Значение также не заносится в историю значений. См. Раздел 8.1 [Выражения], с. 61, для дополнительной информации о выражениях.
output/формат выражение Вывести значение выражения в формате формат. Вы можете использовать те же форматы, что и для print. См. Раздел 8.4 [Форматы вывода], с. 64, для получения большей информации.
printf строка, выражения...
Напечатать значения выражений, причем формат вывода задает строка. Выражения разделяются запятыми и могут быть либо числами, либо указателями.
Их значения печатаются так, как определяет строка, в точности, как если бы ваша программа выполняла подпрограмму Си Например, вы можете напечатать два шестнадцатеричных значения:
printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-foo Единственые экранирующие последовательности с обратной косой чертой, которые вы можете использовать в строке формата—простые последовательности, состоящие из обратной косой черты, за которой следует буква.
17 Использование GDB под управлением gnu Emacs Специальный интерфейс позволяет вам использовать gnu Emacs для просмотра (и редактирования) исходных файлов программы, которую вы отлаживаете с помощью GDB.
Чтобы использовать этот интерфейс, используйте команду M-x gdb в Emacs. В качестве аргумента задайте выполняемый файл, который вы хотите отладить. Эта команда вызывает GDB как подпроцесс Emacs с вводом и выводом через заново созданный буфер.
Под управлением Emacs, GDB используется точно так же, как обычно, за исключением двух моментов:
• Весь “терминальный” ввод и вывод происходит через буфер Emacs.
Это относится как к командам GDB и их выводу, так и к вводу и выводу, производимыми отлаживаемой программой.
Это полезно, потому что вы можете копировать текст предыдущих команд и вводить их снова; вы даже можете использовать таким образом части вывода.
Все средства режима оболочки Emacs доступны для взаимодействия с вашей программой. В частности, вы можете посылать сигналы обычным путем— например, C-c C-c для прерывания, C-c C-z для остановки.
• GDB отображает исходный код через Emacs.
Каждый раз, когда GDB отображает кадр стека, Emacs автоматически находит исходный файл для него и помещает стрелку (‘=>’) на левом крае текущей строки. Emacs использует отдельный буфер для отображения исходного текста, и разделяет экран, чтобы отобразить как сеанс GDB, так и исходный текст.
Тем не менее, явные команды GDB list и search производят вывод как обычно, но у вас вероятно не будет причин использовать их из Emacs.
Предупреждение: Если каталог, в котором находится ваша программа, не является текущим, Emacs легко может ошибиться при определении местонахождения исходных файлов; в этом случае вспомогательный буфер с исходным текстом не появляется. GDB может искать программы, используя переменную среды PATH, так что сеансы ввода и вывода происходят нормально; но Emacs не получает достаточно информации от GDB, чтобы найти исходные файлы в такой ситуации. Чтобы избежать этой проблемы, либо запускайте режим GDB из каталога, где находится ваша программа, либо укажите абсолютное имя файла, когда будет запрошен параметр для M-x gdb.
Подобная путаница может возникнуть, если вы используете команду GDB file, чтобы переключиться к отладке программы, находящейся в каком-нибудь другом месте, из существующего буфера GDB в Emacs.
По умолчанию, M-x gdb вызывает программу с именем ‘gdb’. Если вам нужно вызвать GDB под другим именем (например, если вы храните несколько конфигураций под различными именами), вы можете установить переменную Emacs gdb-command-name; например, установка (setq gdb-command-name "mygdb") (которой предшествует M-: или ESC :, или если она введена в буфер *scratch* или в вашем файле ‘.emacs’), заставит Emacs вызвать программу “mygdb”.
В буфере ввода-вывода GDB, вы можете использовать следующие специальные команды Emacs в дополнение к стандартным командам режима оболочки:
Описывает возможности режима GDB Emacs.
C-h m Выполнить до другой строки исходного текста, подобно команде GDB step;
M-s также обновляет окно отображения для показа текущего файла и положения в Выполнить до следующей строки исходного текста в этой функции, пропусM-n кая все вызовы функций, подобно команде GDB next. Затем обновить окно отображения, чтобы показать текущий файл и положение в нем.
Выполнить одну инструкцию, подобно команде GDB stepi; обновляет окно M-i M-x gdb-nexti Выполнить до следующей инструкции, используя команду GDB nexti; обновляет окно отображения.
Выполнить до выхода из выбранного кадра стека, подобно команде GDB C-c C-f Продолжить выполнение вашей программы, подобно команде GDB continue.
M-c Предупреждение: В Emacs версии 19, эта команда вызывается посредством C-c Подняться вверх по стеку на число кадров, заданное числовым параметром, M-u подобно команде GDB up (см. раздел “Числовые аргументы” в Руководство по Предупреждение: В Emacs версии 19, эта команда вызывается посредством C-c Спуститься вниз по стеку на число кадров, заданное числовым параметром, M-d аналогично команде GDB down.
Предупреждение: В Emacs версии 19, эта команда вызывается посредством C-c Прочитать число в позиции курсора и вставить его в конец буфера вводаC-x & вывода GDB. Например, если вы хотите дисассемблировать код по адресу, отображенному ранее, наберите disassemble; затем переместите курсор на изображение адреса и задайте аргумент для disassemble, набрав C-x &.
Вы можете и дальше настраивать это, определяя элементы списка gdb-printcommand; если он определен, вы можете форматировать или как-либо иначе обрабатывать числа, задаваемые C-x &, перед их вставкой в буфер. Числовой аргумент к C-x & показывает, что вам нужно специальное форматирование, а также действует как индекс для выбора элемента из списка. Если элемент списка является строкой, то вставляемое число форматируется с использованием функции Emacs format; в противном случае, число передается как параметр соответствующему элементу списка.
В любом исходном файле, команда Emacs C-x SPC (gdb-break) велит GDB установить точку останова на строке исходного текста, в которой находится точка.
Если вы случайно удалите буфер отображения исходного текста, его можно легко вернуть обратно, введя команду f в буфере GDB, чтобы запросить отображение кадра; когда выполнение происходит под управлением Emacs, это при необходимости создает исходный буфер заново, чтобы показать вам текущий кадр.
Исходные файлы, отображаемые в Emacs, находятся в обычных буферах Emacs, которые получают доступ к исходным файлам обычным способом. При желании вы можете редактировать файлы в этих буферах; но помните, что GDB взаимодействует с Emacs в терминах номеров строк. Если вы добавите или удалите строки из текста, известные GDB номера строк больше не будут соответствовать коду.
18 Примечания GDB Эта глава описывает примечания в GDB. Примечания разработаны для согласования GDB с графическими интерфейсами пользователя или другими аналогичными программами, которые хотят взаимодействовать с GDB на относительно высоком уровне.
18.1 Что такое примечание?
Чтобы создавать примечания, запустите GDB с ключем --annotate=2.
Примечания начинаются с символа новой строки, двух символов ‘control-z’ и имени примечания. Если нет дополнительной информации, связанной с примечанием, непосредственно за его именем следует символ новой строки. Если дополнительная информация есть, за именем примечания следует пропуск, дополнительная информация и символ новой строки. Дополнительная информация не может содержать символа новой строки.
Любой вывод, не начинающийся с символа новой строки и двух ‘control-z’, означает буквальный вывод GDB. В настоящее время GDB не нужно выводить два ‘control-z’ вслед за символом новой строки, но если это понадобится, примечания могут быть расширены ‘экранирующим’ примечанием, которое означает вывод этих трех символов.
Вот простой пример запуска GDB с примечаниями:
$ gdb -annotate= Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "sparc-sun-sunos4.1.3" ^Z^Zpre-prompt ^Z^Zprompt ^Z^Zpost-prompt Здесь ‘quit’ является для GDB вводом; остальное—вывод GDB. Три строки, начинающиеся с ‘^Z^Z’ (где ‘^Z’ означает знак ‘control-z’), суть примечания; остальное является выводом GDB.
18.2 Префикс server Чтобы подать команду GDB, не оказывая влияния на определенные аспекты состояния, видимые для пользователей, начните ее с ‘server ’. Это означает, что данная команда не воздействует на историю команд, а также не влияет на понятие GDB о том, какую команду повторять, если в пустой строке нажата клавиша RET.
Префикс server не влияет на запись значений в историю значений; чтобы напечатать значение, не занося его в историю, используйте команду output вместо print.
18.3 Значения Когда значение выводится в различных контекстах, GDB использует примечания, чтобы отделить его от окружающего текста.
Если значение выводится с помощью print и добавляется в историю значений, примечание выглядит так:
^Z^Zvalue-history-begin номер-в-истории флаги-значения строка-истории ^Z^Zvalue-history-value ^Z^Zvalue-history-end где номер-в-истории—номер, который значение получает в истории, строка-истории— строка, такая как ‘$5 = ’, которая представляет значение пользователю, значение является выводом, соответствующим самому значению, а флаги-значения—‘*’ для значения, которое может быть разыменовано, и ‘-’, если нет.
Если значение не добавляется в историю значений (это может быть или неверное число с плавающей точкой, или оно выводится командой output), примечание выглядит похожим образом:
^Z^Zvalue-begin флаги-значения ^Z^Zvalue-end Когда GDB выводит аргумент функции (например, в выводе команды backtrace), он делает такие примечания:
^Z^Zarg-begin имя-аргумента ^Z^Zarg-name-end строка-разделитель ^Z^Zarg-value флаги-значения ^Z^Zarg-end где имя-аргумента есть имя аргумента, строка-разделитель—текст (такой как ‘=’), который отделяет имя от значения для удобства пользователя, а флаги-значения и значение имеют такой же смысл, что и в примечании value-history-begin.
При выводе структуры, GDB делает следующие примечания:
^Z^Zfield-begin флаги-значения ^Z^Zfield-name-end строка-разделитель ^Z^Zfield-value ^Z^Zfield-end где имя-поля есть имя поля, строка-разделитель—текст (такой как ‘=’), который отделяет имя от значения для удобства пользователя, а флаги-значения и значение имеют тот же смысл, что и в примечании value-history-begin.
При выводе массива, GDB делает следующие примечания: