«Ричард Столмен, Роланд Пеш, Стан Шебс и другие. (Присылайте сообщения об ошибках и комментарии к GDB по адресу bug-gdb Отладка с помощью GDB TEXinfo 1999-10-01.07 Copyright c 1988-2000 Free Software ...»
^Z^Zarray-section-begin индекс-в-массиве флаги-значения где индекс-в-массиве—индекс первого аннотируемого элемента, а флаги-значения имеют такой же смысл, что и в примечании value-history-begin. За этим следует произвольное число элементов. Элемент может быть либо одиночным либо повторяющимся ^Z^Zelt-rep число-повторений строка-повторений ^Z^Zelt-rep-end В обоих случаях, значение является выводом значения элемента, а пропуск может содержать пробелы, символы табуляции и новой строки. В случае повторяющихся элементов, число-повторений представляет число последовательных элементов массива, которые содержат данное значение, а строка-повторений является строкой, которая предназначена для уведомления пользователя о том, что выводятся повторяющиеся элементы.
После того, как выведены все элементы массива, примечание к массиву заканчивается так:
^Z^Zarray-section-end 18.4 Кадры Когда GDB печатает кадр, он делает к нему примечания. Например, это применяется к кадрам, выводимым при остановке GDB, в результате вывода командами, такими как backtrace или up, и так далее.
Примечания к кадру начинаются с ^Z^Zframe-begin уровень адрес строка-уровня где уровень—это номер кадра (0 для самого внутреннего кадра, другие кадры имеют положительные номера), адрес—это адрес кода, выполняющегося в данном кадре, а строка-уровня—строка, предназначенная для передачи уровня пользователю. Адрес имеет форму ‘0x’, за которым следует одна или более шестнадцатеричных цифр в нижнем регистре (заметьте, что это не зависит от языка). Кадр заканчивается так:
Между этими комментариями находится основное тело кадра, которое может состоять строка-вызова-функции где строка-вызова-функции является текстом, предназначенным для уведомления пользователя, что этот кадр связан с вызовом функции, который GDB сделал в отлаживаемой программе.
^Z^Zsignal-handler-caller строка-вызова-обработчика-сигнала где строка-вызова-обработчика-сигнала—текст, предназначенный для уведомления пользователя, что этот кадр связан с тем механизмом, который использовался операционной системой при вызове обработчика сигнала (это тот кадр, из которого произошел вызов обработчика, а не кадр для самого обработчика).
• Обычный кадр.
Это может, возможно (в зависимости от того, считается ли это информацией, интересной для пользователя), начинаться с ^Z^Zframe-address ^Z^Zframe-address-end строка-разделитель здесь адрес—это адрес, где происходит выполнение в кадре (тот же адрес, что и в примечании frame-begin, но выведенный в форме, предназначенной для пользователя—в частности, синтаксис различается в зависимости от языка), а строка-разделитель является строкой, предназначенной для отделения этого адреса от того, что за ним следует для удобства пользователя.
Затем идет ^Z^Zframe-function-name где имя-функции есть имя функции, выполняющейся в кадре, или ‘??’, если оно не известно, а аргументы—это аргументы к кадру, со скобками вокруг них (каждый аргумент аннотируется также индивидуально, см. Раздел 18.3 [Примечания к значениям], с. 164).
Если доступна информация об исходных текстах, печатается ссылка на них:
^Z^Zframe-source-begin вводная-исходная-строка ^Z^Zframe-source-file ^Z^Zframe-source-file-end ^Z^Zframe-source-line ^Z^Zframe-source-end где вводная-исходная-строка отделяет ссылку от предшествуещего ей текста, для удобства пользователя, имя-файла—это имя исходного файла, номер-строки—номер строки в этом файле (первая строка имеет номер 1).
Если GDB печатает некоторую информацию о том, откуда появился этот кадр (какая библиотека, какой сегмент загрузки, и так далее; в настоящее время реализовано только на RS/6000), он делает такие примечания:
Затем, если исходный текст действительно должен быть отображен для этого кадра (например, это не верно для вывода от команды backtrace), тогда выводится примечание source (см. Раздел 18.11 [Примечания к исходному тексту], с. 170). В отличие от большинства примечаний, этот вывод производится вместо обычного текста, который был бы напечатан, а не в дополнение к нему.
18.5 Отображения Когда GDB велят отобразить что-то с помощью команды display, к результату отображения делаются примечания:
^Z^Zdisplay-begin ^Z^Zdisplay-number-end разделитель-номеров ^Z^Zdisplay-format ^Z^Zdisplay-expression ^Z^Zdisplay-expression-end разделитель-выражений ^Z^Zdisplay-value ^Z^Zdisplay-end здесь номер—это номер отображения, разделитель-номеров предназначен для отделения номеров от того, что следует затем для пользователя, формат включает информацию о том, как отображается значение, такую как размер, формат и так далее, выражение— это отображаемое выражение, разделитель-выражений предназначен для отделения выражения от следующего за ним текста для пользователя, и значение—это действительное значение, которое отображается.
18.6 Примечания ко вводу GDB Когда GDB выводит приглашение для ввода, он делает к этому примечания, так что становится возможным узнать, когда посылать данные, когда закончен вывод от данной команды, и так далее.
Каждый из различных видов ввода имеет различный тип ввода. Каждый тип ввода имеет три примечания: примечание pre-, обозначающее начало каждого выводимого приглашения, простое примечание, обозначающее конец приглашения, и затем примечание post-, обозначающее конец любого эхо, которое может быть ассоциировано (а может и не быть) со вводом. Например, характерной чертой типа ввода prompt являются следующие примечания:
^Z^Zpre-prompt ^Z^Zprompt ^Z^Zpost-prompt Существуют следующие типы ввода:
Когда GDB запрашивает команду (главное приглашение GDB).
prompt Когда GDB запрашивает набор команд, как в команде commands. Примечания commands повторяются для каждой введенной команды.
overload-choice Когда GDB хочет, чтобы пользователь выбрал одну из нескольких перегруженных функций.
Когда GDB хочет, чтобы пользователь подтвердил потенциально опасное дейquery prompt-for-continue Когда GDB запрашивает у пользователя нажатие ввода для продолжения. Замечание: не ожидайте, что это будет работать хорошо; используйте вместо этого set height 0 для отключения приглашений. Это происходит потому, что при наличии примечаний подсчет строк происходит неверно.
18.7 Ошибки ^Z^Zquit Это примечание появляется непосредственно перед тем, как GDB отвечает на прерывание.
^Z^Zerror Это примечание появляется сразу перед тем, как GDB отвечает на ошибку.
Примечания выхода и ошибки обозначают, что любое примечание, в середине которого находился GDB, могут внезапно оборваться. Например, если за примечанием valuehistory-begin следует error, то не нужно ожидать соответствующий value-history-end.
Однако, не следует также ожидать, что его точно не будет; примечание об ошибке не обязательно означает, что GDB немедленно возвращается в начало на самый верхний уровень.
Примечанию к ошибке или выходу может предшествовать ^Z^Zerror-begin Весь вывод между этим и примечанием к ошибке или выходу является сообщением об ошибке.
Пока примечаний к предупреждающим сообщениям не делается.
18.8 Информация о точке останова К выводу, производимому командой info breakpoints, делаются следующие примечания:
^Z^Zbreakpoints-headers элемент-заголовка ^Z^Zbreakpoints-table где элемент-заголовка имеет тот же синтаксис, что и элемент (смотрите ниже), но вместо данных, он содержит строки, которые предназначены для разъяснения пользователю значений каждого поля. Затем следует произвольное число элементов. Если поле не подходит к этому элементу, оно опускается. Поля могут содержать завершающие пропуски.
Каждое поле состоит из:
^Z^Zrecord счетчик-игнорирований Заметьте, что адрес предназначен для использования пользователем—синтаксис различается в зависимости от языка.
Вывод заканчивается так:
^Z^Zbreakpoints-table-end 18.9 Сообщения о недостоверности Следующие примечания говорят о том, что определенные куски информации, описывающие состояние, могли измениться.
^Z^Zframes-invalid Кадры (например, вывод команды backtrace) могли измениться.
^Z^Zbreakpoints-invalid Точки останова могли измениться. Например, пользователь только что добавил или удалил точку останова.
18.10 Выполнение программы Когда программа начинает выполняться вследствие команды GDB, такой как step или continue, выводится ^Z^Zstarting Когда программа останавливается, выводится ^Z^Zstopped Перед примечанием stopped, множество примечаний описывают, как программа остановилась.
^Z^Zexited код-выхода Программа завершилась, и код-выхода является кодом выхода (ноль при успешном завершении, в противном случае не ноль).
^Z^Zsignalled Программа завершилась по сигналу. После ^Z^Zsignalled, примечания продолжаются:
где имя является именем сигнала, таким как SIGILL или SIGSEGV, а строка представляет объяснение сигнала, такое как Illegal Instruction или Segmentation fault. Вступительный-текст, текст-в-середине и заключительный текст используются для удобства пользователя и не имеют определенного ^Z^Zsignal Синтаксис этого примечания такой же, как для signalled, но GDB сообщает, что программа лишь получила сигнал, а не то, что она остановилась из-за ^Z^Zbreakpoint номер Программа достигла точки останова с номером номер.
^Z^Zwatchpoint номер Программа достигла точки наблюдения с номером номер.
18.11 Вывод исходного текста Следующие примечания используются вместо вывода исходного текста:
^Z^Zsource имя-файла:строка:символ:middle:адрес где имя-файла указывает абсолютное имя файла, строка—это номер строки в этом файле (первая строка имеет номер 1), символ—позиция символа в файле (первый символ в исходном файле имеет номер 0) (для большинства отладочных форматов это будет обязательно указывать на начало строки), middle есть ‘middle’, если адрес находится в середине строки, или ‘beg’, если адрес находится в начале строки, а адрес является адресом в целевой программе, ассоциированным с выводимым исходным текстом. Адрес записан в форме ‘0x’, за которым следует одна или несколько шестнадцатеричных цифр в нижнем регистре (заметьте, что это не зависит от языка).
18.12 Примечания, которые могут понадобиться с будущем - target-invalid цель могла измениться (регистры, содержимое памяти или статус выполнения). Для эффективности выполнения, мы можем захотеть определять ‘register-invalid’ и ‘all-register-invalid’ с большей точностью - систематические примечания к параметрам set/show (включая сообщения о недостоверности).
- аналогично, ‘info’ возвращает список кандидатов на сообщение о недостоверности.
19 Интерфейс gdb/mi Назначение и цель gdb/mi является построчным, машинно-ориентированным текстовым интерфейсом к GDB. Он предназначен специально для поддержки разработки систем, которые используют отладчик лишь как одну маленькую компоненту большой системы.
Эта глава является спецификацией интерфейса gdb/mi. Она написана в форме справочного руководства.
Заметьте, что gdb/mi все еще находится в стадии разработки, так что некоторые описанные ниже возможности являются неполными и могут быть изменены.
Система обозначений и терминология Эта глава использует следующую систему обозначений:
• | разделяет две альтернативы.
• [ нечто ] указывает, что нечто является необязательным: оно может быть задано, а может и нет.
• ( группа )* означает, что группа в скобках может повторяться ноль и более раз.
• ( группа )+ означает, что группа в скобках может повторяться один и более раз.
• "строка" обозначает текст строка.
Выражения признательности В алфавитном порядке: Елена Заннони, Эндрю Кагни, Фернандо Нассер и Стан Шебс.
19.1 Синтаксис команд gdb/mi 19.1.1 Входной синтаксис gdb/mi команда команда-cli [ лексема ] команда-cli nl, где команда-cli есть любая существующая команда команда-mi лексема "любая последовательность цифр" ключ "-" параметр [ " " параметр ] параметр непустая-последовательность | строка-си действие любое из действий, описанных в этой главе непустая-последовательность все что угодно, не содержащее специальных знаков, таких как "-", nl, """ и, строка-си """ содержимое-семибитной-строки-iso-си """ Замечания:
• Команды CLI все еще обрабатываются интерпретатором mi; их вывод описан ниже.
• Лексема, если присутствует, передается назад, когда выполнение команды завершается.
• Некоторые команды mi допускают необязательные аргументы как часть списка параметров. Каждый ключ идентифицируется предшествующей ему чертой ‘-’, и за ним может следовать в качестве параметра необязательный аргумент. Ключи появляются в начале списка параметров и могут быть отделены от обычных параметров при помощи ‘-’ (это полезно, когда некоторые параметры начинаются с черты).
Прагматические соображения:
• Мы хотим получить простой доступ к существующему синтаксису CLI (для отладки).
• Мы хотим, чтобы работа mi была легко заметна.
19.1.2 Выходной синтаксис gdb/mi Вывод gdb/mi состоит из нуля или более внеочередных записей, за которыми может следовать одна результирующая запись. Эта запись относится к самой последней команде.
Последовательность выводимых записей завершается ‘(gdb)’.
Если входная команда начиналась с префикса лексема, то соответствующий вывод для этой команды также будет начинаться с того же префикса лексема.
вывод ( внеочередная-запись )* [ результирующая-запись ] "(gdb)" nl результирующая-запись [ лексема ] "^" результирующий-класс ( "," результат )* nl внеочередная-запись асинхр-запись | поточн-запись асинхр-запись асинхр-вывод-выполн | асинхр-вывод-статуса | асинхр-вывод-уведомл асинхр-вывод-выполн асинхр-вывод-статуса асинхр-вывод-уведомл асинхр-вывод асинхр-класс ( "," результат )* nl результ-класс "done" | "running" | "connected" | "error" | "exit" асинхр-класс "stopped" | другое (где другое будет добавлено по необходимости—это все еще находится в стадии разработки).
результат значение константа | "{" результат ( "," результат )* "}" константа поточн-запись консольн-поточн-вывод | целев-поточн-вывод | журн-поточн-вывод консольн-поточн-вывод целев-поточн-вывод журн-поточн-вывод лексема любая последовательность цифр.
Кроме того, следующее все еще находится в стадии разработки:
запрос Это действие пока не определено.
Замечания:
• Все выходные последовательности заканчиваются одной строкой, содержащей точку.
• Лексема берется из соответствующего запроса. Если выполнение команды прерывается командой ‘-exec-interrupt’, лексема, ассоциированная с сообщением ‘*stopped’, является лексемой исходной выполняемой команды, а не лексемой команды прерывания.
• Асинхр-вывод-статуса содержит последующую информацию состояния о выполнении медленной операции. Она может быть отброшена. Весь вывод состояния начинается с префикса ‘+’.
• Асинхр-вывод-выполн содержит асинхронное изменения состояния на цели (остановлена, запущена, исчезла). Весь асинхронный вывод начинается с префикса ‘*’.
• Асинхр-вывод-уведомл содержит сопровождающую информацию, которую должен обработать клиент (например, информацию о новой точке останова). Весь уведомительный вывод начинается с префикса ‘=’.
• Консольн-поточн-вывод является выводом, который должен быть отображен на консоли без изменений. Он является текстовым ответом на команду CLI. Весь консольный вывод начинается с префикса ‘~’.
• Целев-поточн-вывод является выводом, произведенным целевой программой. Весь целевой вывод начинается с префикса ‘@’.
• Журн-поточн-вывод является выходным текстом, происходящим от внутренней реализации GDB, например, сообщения, которые должны быть отображены как часть журнала ошибок. Весь журнальный вывод начинается с префикса ‘&’.
См. Раздел 19.3.2 [Поточные записи gdb/mi], с. 175, для более подробной информации о различных выводимых записях.
См. Раздел 19.15 [Черновик изменений к выходному синтаксису gdb/mi], с. 222, для предлагаемых изменений к выходному синтаксису.
19.1.3 Простые примеры взаимодействия с gdb/mi Этот подраздел представляет несколько простых примеров взаимодействия с использованием интерфейса gdb/mi. В этих примерах, ‘->’ означает, что следующая строка передается gdb/mi в качестве ввода, а ‘ -stop