Отладка с помощью GDB - 18. Примечания GDB
[Содержание] [Назад] [Пред] [Вверх] [След] [Вперед]18. Примечания GDB
Эта глава описывает примечания в GDB. Примечания разработаны для согласования GDB с графическими интерфейсами пользователя или другими аналогичными программами, которые хотят взаимодействовать с GDB на относительно высоком уровне.
18.1 Что такое примечание?
Чтобы создавать примечания, запустите 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.
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 делает следующие примечания:
^Z^Zarray-section-begin индекс-в-массиве флаги-значения
где индекс-в-массиве---индекс первого аннотируемого элемента, а
флаги-значения имеют такой же смысл, что и в примечании
value-history-begin
. За этим следует произвольное число
элементов. Элемент может быть либо одиночным
`,' пропуск ; опускается для первого элемента значение ^Z^Zelt
либо повторяющимся
`,' пропуск ; опускается для первого элемента значение ^Z^Zelt-rep число-повторений строка-повторений ^Z^Zelt-rep-end
В обоих случаях, значение является выводом значения элемента, а пропуск может содержать пробелы, символы табуляции и новой строки. В случае повторяющихся элементов, число-повторений представляет число последовательных элементов массива, которые содержат данное значение, а строка-повторений является строкой, которая предназначена для уведомления пользователя о том, что выводятся повторяющиеся элементы.
После того, как выведены все элементы массива, примечание к массиву заканчивается так:
^Z^Zarray-section-end
18.4 Кадры
Когда 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 Вывод исходного текста). В отличие от большинства примечаний, этот вывод производится вместо обычного текста, который был бы напечатан, а не в дополнение к нему.
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
Существуют следующие типы ввода:
prompt
- Когда GDB запрашивает команду (главное приглашение GDB).
commands
-
Когда GDB запрашивает набор команд, как в команде
commands
. Примечания повторяются для каждой введенной команды. overload-choice
- Когда GDB хочет, чтобы пользователь выбрал одну из нескольких перегруженных функций.
query
- Когда GDB хочет, чтобы пользователь подтвердил потенциально опасное действие.
prompt-for-continue
-
Когда GDB запрашивает у пользователя нажатие ввода для
продолжения. Замечание: не ожидайте, что это будет работать хорошо;
используйте вместо этого
set height 0
для отключения приглашений. Это происходит потому, что при наличии примечаний подсчет строк происходит неверно.
18.7 Ошибки
^Z^Zquit
Это примечание появляется непосредственно перед тем, как GDB отвечает на прерывание.
^Z^Zerror
Это примечание появляется сразу перед тем, как GDB отвечает на ошибку.
Примечания выхода и ошибки обозначают, что любое примечание, в середине
которого находился GDB, могут внезапно оборваться. Например,
если за примечанием value-history-begin
следует error
, то
не нужно ожидать соответствующий value-history-end
. Однако, не
следует также ожидать, что его точно не будет; примечание об ошибке не
обязательно означает, что GDB немедленно возвращается в начало
на самый верхний уровень.
Примечанию к ошибке или выходу может предшествовать
^Z^Zerror-begin
Весь вывод между этим и примечанием к ошибке или выходу является сообщением об ошибке.
Пока примечаний к предупреждающим сообщениям не делается.
18.8 Информация о точке останова
К выводу, производимому командой 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
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
, примечания продолжаются:вступительный-текст ^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 номер
- Программа достигла точки наблюдения с номером номер.
18.11 Вывод исходного текста
Следующие примечания используются вместо вывода исходного текста:
^Z^Zsource имя-файла:строка:символ:middle:адрес
где имя-файла указывает абсолютное имя файла, строка---это номер строки в этом файле (первая строка имеет номер 1), символ---позиция символа в файле (первый символ в исходном файле имеет номер 0) (для большинства отладочных форматов это будет обязательно указывать на начало строки), middle есть `middle', если адрес находится в середине строки, или `beg', если адрес находится в начале строки, а адрес является адресом в целевой программе, ассоциированным с выводимым исходным текстом. Адрес записан в форме `0x', за которым следует одна или несколько шестнадцатеричных цифр в нижнем регистре (заметьте, что это не зависит от языка).
18.12 Примечания, которые могут понадобиться с будущем
- target-invalid цель могла измениться (регистры, содержимое памяти или статус выполнения). Для эффективности выполнения, мы можем захотеть определять `register-invalid' и `all-register-invalid' с большей точностью - систематические примечания к параметрам set/show (включая сообщения о недостоверности). - аналогично, `info' возвращает список кандидатов на сообщение о недостоверности.
[Содержание] [Назад] [Пред] [Вверх] [След] [Вперед]