Эта глава описывает примечания в GDB, символьном отладчике GNU. Примечания разработаны для согласования GDB с графическими интерфейсами пользователя или другими аналогичными программами, которые хотят взаимодействовать с GDB на относительно высоком уровне.
Чтобы создавать примечания, запустите GDB с ключем
--annotate=2
.
Примечания начинаются с символа новой строки, двух символов `control-z' и имени примечания. Если нет дополнительной информации, связанной с примечанием, непосредственно за его именем следует символ новой строки. Если дополнительная информация есть, за именем примечания следует пропуск, дополнительная информация и символ новой строки. Дополнительная информация не может содержать символа новой строки.
Любой вывод, не начинающийся с символа новой строки и двух `control-z', означает буквальный вывод GDB. В настоящее время, GDB не нужно выводить два `control-z' вслед за символом новой строки, но если это понадобится, примечания могут быть расширены `экранирующим' примечанием, которое означает вывод этих трех символов.
Вот простой пример запуска GDB с примечаниями:
$ gdb --annotate=2 GNU GDB 5.0 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 (gdb) ^Z^Zprompt quit ^Z^Zpost-prompt $
Здесь `quit' является для GDB вводом; остальное--вывод GDB. Три строки, начинающиеся с `^Z^Z' (где `^Z' означает знак `control-z'), суть примечания; остальное является выводом GDB.
Чтобы подать команду GDB, не оказывая влияния на определенные аспекты состояния, видимые для пользователей, начните ее с `server '. Это означает, что эта команда не воздействует на историю команд, и также не влияет на понятие GDB о том, какую команду повторять, если в пустой строке нажата клавиша RET.
Префикс server не влияет на запись значений в историю значений; чтобы
напечатать значение, не занося его в историю, используйте команду
output
вместо print
.
Когда значение выводится в различных контекстах, 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 делает следующие примечания:
^Z^Zarray-section-begin индекс-в-массиве флаги-значения
где индекс-в-массиве---индекс первого аннотируемого элемента, а
флаги-значения имеют такой же смысл, что и в примечании
value-history-begin
. За этим следует произвольное число
элементов, где элемент может быть либо одиночным
`,' пропуск ; опускается для первого элемента значение ^Z^Zelt
либо повторяющимся
`,' пропуск ; опускается для первого элемента значение ^Z^Zelt-rep число-повторений строка-повторений ^Z^Zelt-rep-end
В обоих случаях, значение является выводом значения элемента, а пропуск может содержать пробелы, символы табуляции и новой строки. В случае повторяющихся элементов, число-повторений представляет число последовательных элементов массива, которые содержат данное значение, а строка-повторений является строкой, которая предназначена для уведомления пользователя о том, что выводятся повторяющиеся элементы.
После того, как выведены все элементы массива, примечание к массиву заканчивается так:
^Z^Zarray-section-end
Когда GDB печатает кадр, он делает к нему примечания.
Например, это применяется к кадрам, выводимым при остановке GDB,
в результате вывода такими командами, как backtrace
или
up
, и так далее.
Комментарии к кадру начинаются с
^Z^Zframe-begin уровень адрес строка-уровня
где уровень---это номер кадра (0 для самого внутреннего кадра, другие кадры имеют положительные номера), адрес---это адрес кода, выполняющегося в данном кадре, а строка-уровня---строка, предназначенная для передачи уровня пользователю. Адрес имеет форму `0x', за которым следует одна или более шестнадцатеричных цифр в нижнем регистре (заметьте, что это не зависит от языка). Кадр заканчивается так:
^Z^Zframe-end
Между этими комментариями находится основное тело кадра, которое может состоять из
^Z^Zfunction-call строка-вызова-функциигде строка-вызова-функции является текстом, предназначенным для уведомления пользователя, что этот кадр связан с вызовом функции, который GDB сделал в отлаживаемой программе.
^Z^Zsignal-handler-caller строка-вызова-обработчика-сигналагде строка-вызова-обработчика-сигнала---текст, предназначенный для уведомления пользователя, что этот кадр связан с тем механизмом, который использовался операционной системой при вызове обработчика сигнала (это тот кадр, из которого произошел вызов обработчика, а не кадр для самого обработчика).
^Z^Zframe-address адрес ^Z^Zframe-address-end строка-разделительгде адрес---это адрес, где происходит выполнение в кадре (тот же адрес, что и в примечании
frame-begin
, но выведенный в форме,
предназначенной для пользователя--в частности, синтаксис различается в
зависимости от языка), а строка-разделитель является строкой,
предназначенной для отделения этого адреса от того, что за ним следует
для удобства пользователя.
Затем идет
^Z^Zframe-function-name имя-функции ^Z^Zframe-args аргументыгде имя-функции есть имя функции, выполняющейся в кадре, или `??' если оно не известно, а аргументы---это аргументы к кадру, со скобками вокруг них (каждый аргумент аннотируется также индивидуально, см. раздел 18.3 Значения). Если доступна информация об исходных текстах, печатается ссылка на них:
^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), он делает такие примечания:
^Z^Zframe-where информацияЗатем, если исходный текст действительно должен быть отображен для этого кадра (например, это не верно для вывода от команды
backtrace
),
тогда выводится примечание source
(см. раздел 18.11 Вывод исходного текста). В отличие от большинства примечаний, этот вывод производится
вместо обычного текста, который был бы напечатан, а не в дополнение к нему.
Когда 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
где номер---это номер отображения, разделитель-номеров предназначен для отделения номеров от того, что следует затем для пользователя, формат включает информацию о том, как отображается значение, такую как размер, формат и так далее, выражение---это отображаемое выражение, разделитель-выражений предназначен для отделения выражения от следующего за ним текста для пользователя, и значение---это действительное значение, которое отображается.
Когда GDB выводит приглашение для ввода, он делает к этому примечания, так что становится возможным узнать, когда посылать данные, когда закончен вывод от данной команды, и так далее.
Каждый из различных видов ввода имеет различный тип ввода. Каждый
тип ввода имеет три примечания: примечание pre-
, обозначающее
начало каждого выводимого приглашения, простое примечание, обозначающее
конец приглашения, и затем примечание post-
, обозначающее конец
любого эхо, которое может быть ассоциировано (а может и не быть) со
вводом. Например, характерной чертой типа ввода prompt
являются
следующие примечания:
^Z^Zpre-prompt ^Z^Zprompt ^Z^Zpost-prompt
Существуют следующие типы ввода:
prompt
commands
commands
.
Примечания повторяются для каждой введенной команды.
overload-choice
query
prompt-for-continue
set height 0
для отключения приглашений.
Это происходит потому, что при наличии примечаний подсчет строк
происходит неверно.
^Z^Zquit
Это примечание появляется непосредственно перед тем, как GDB отвечает на прерывание.
^Z^Zerror
Это примечание появляется сразу перед тем, как GDB отвечает на ошибку.
Примечания выхода и ошибки обозначают, что любое примечание, в середине
которого находился GDB, могут внезапно оборваться. Например,
если за примечанием value-history-begin
следует error
, то
не нужно ожидать соответствующий value-history-end
. Однако, не
следует также ожидать, что его точно не будет; примечание об ошибке не
обязательно означает, что GDB немедленно возвращается в начало
на самый верхний уровень.
Примечанию к ошибке или выходу может предшествовать
^Z^Zerror-begin
Весь вывод между этим и примечанием к ошибке или выходу является сообщением об ошибке.
Пока примечаний к предупреждающим сообщениям не делается.
К выводу, производимому командой info breakpoints
, делаются
следующие примечания:
^Z^Zbreakpoints-headers элемент-заголовка ^Z^Zbreakpoints-table
где элемент-заголовка имеет тот же синтаксис, что и элемент (смотрите ниже), но вместо данных, он содержит строки, которые предназначены для разъяснения пользователю значения каждого поля. Затем следует произвольное число элементов. Если поле не подходит к этому элементу, оно опускается. Поля могут содержать завершающие пропуски. Каждое поле состоит из:
^Z^Zrecord ^Z^Zfield 0 номер ^Z^Zfield 1 тип ^Z^Zfield 2 положение ^Z^Zfield 3 включена ^Z^Zfield 4 адрес ^Z^Zfield 5 что ^Z^Zfield 6 кадр ^Z^Zfield 7 условие ^Z^Zfield 8 счетчик-игнорирований ^Z^Zfield 9 команды
Заметьте, что адрес предназначен для использования пользователем--синтаксис различается в зависимости от языка.
Вывод заканчивается так:
^Z^Zbreakpoints-table-end
Следующие примечания говорят о том, что определенные куски информации, описывающие состояние, могли измениться.
^Z^Zframes-invalid
backtrace
) могли измениться.
^Z^Zbreakpoints-invalid
Когда программа начинает выполняться вследствие команды
GDB, такой как step
или continue
, выводится
^Z^Zstarting
Когда программа останавливается, выводится
^Z^Zstopped
Перед примечанием stopped
, множество примечаний описывают, как
программа остановилась.
^Z^Zexited код-выхода
^Z^Zsignalled
^Z^Zsignalled
, примечания
продолжаются:
вступительный-текст ^Z^Zsignal-name имя ^Z^Zsignal-name-end средний-текст ^Z^Zsignal-string строка ^Z^Zsignal-string-end заключительный-текстгде имя является именем сигнала, таким как
SIGILL
или
SIGSEGV
, а строка представляет объяснение сигнала, такое как
Illegal Instruction
или Segmentation fault
.
вступительный-текст, средний-текст и заключительный
текст используются для удобства пользователя и не имеют определенного
формата.
^Z^Zsignal
signalled
, но
GDB сообщает, что программа лишь получила сигнал, а не то, что
она остановилась из-за него.
^Z^Zbreakpoint номер
^Z^Zwatchpoint номер
Следующие примечания используются вместо вывода исходного текста:
^Z^Zsource имя-файла:строка:символ:middle:адрес
где имя-файла указывает абсолютное имя файла, строка---это номер строки в этом файле (первая строка имеет номер 1), символ---позиция символа в файле (первый символ в исходном файле имеет номер 0) (для большинства отладочных форматов это будет обязательно указывать на начало строки), middle есть `middle', если адрес находится в середине строки, или `beg', если адрес находится в начале строки, а адрес является адресом в целевой программе, ассоциированный с выводимым исходным текстом. Адрес записан в форме `0x', за которым следует одна или несколько шестнадцатеричных цифр в нижнем регистре (заметьте, что это не зависит от языка).
- target-invalid цель могла измениться (регистры, содержимое памяти или статус выполнения). Для эффективности выполнения, мы можем захотеть определять `register-invalid' и `all-register-invalid' с большей точностью - систематические примечания к параметрам set/show (включая сообщения о недостоверности). - аналогично, `info' возвращает список кандидатов на сообщение о недостоверности.