[Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]  


19. Интерфейс GDB/MI

Назначение и цель

GDB/MI -- это построчный машинно-ориентированный текстовый интерфейс к GDB. Он предназначен специально для поддержки разработки систем, которые используют отладчик лишь как одну маленькую компоненту большой системы.

Эта глава является спецификацией интерфейса GDB/MI. Она написана в форме справочного руководства.

Заметьте, что GDB/MI все еще находится в стадии разработки, так что некоторые описанные ниже возможности являются неполными и могут быть изменены.

Система обозначений и терминология

Эта глава использует следующую систему обозначений:

19.1 Выражения признательности

В алфавитном порядке: Елена Заннони, Эндрю Кагни, Фернандо Нассер и Стан Шебс.

19.2 Синтаксис команд GDB/MI

19.2.1 Входной синтаксис GDB/MI

команда ==>
команда-cli | команда-mi
команда-cli ==>
[ лексема ] команда-cli nl, где команда-cli есть любая существующая команда GDB CLI.
команда-mi ==>
[ лексема ] "-" действие ( " " ключ )* [ " --" ] ( " " параметр )* nl
лексема ==>
"любая последовательность цифр"
ключ ==>
"-" параметр [ " " параметр ]
параметр ==>
непустая-последовательность | строка-Си
действие ==>
любое из действий, описанных в этой главе
непустая-последовательность ==>
все что угодно, не содержащее специальных знаков, таких как "-", nl, """ и, конечно, " "
строка-си ==>
""" содержимое-семибитной-строки-iso-си """
nl ==>
CR | CR-LF

Замечания:

Прагматические соображения:

19.2.2 Выходной синтаксис GDB/MI

Вывод GDB/MI состоит из нуля или более внеочередных записей, за которыми может следовать одна результирующая запись. Эта запись относится к самой последней команде. Последовательность выводимых записей завершается `(gdb)'.

Если входная команда начиналась с префикса лексема, то соответствующий вывод для этой команды также будет начинаться с того же префикса лексема.

вывод ==>
( внеочередная-запись )* [ результирующая-запись ] "(gdb)" nl
результирующая-запись ==>
[ лексема ] "^" результирующий-класс ( "," результат )* nl
внеочередная-запись ==>
асинхр-запись | поточн-запись
асинхр-запись ==>
асинхр-вывод-выполн | асинхр-вывод-статуса | асинхр-вывод-уведомл
асинхр-вывод-выполн ==>
[ лексема ] "*" асинхр-вывод
асинхр-вывод-статуса ==>
[ лексема ] "+" асинхр-вывод
асинхр-вывод-уведомл ==>
[ лексема ] "=" асинхр-вывод
асинхр-вывод ==>
асинхр-класс ( "," результат )* nl
результ-класс ==>
"done" | "running" | "connected" | "error" | "exit"
асинхр-класс ==>
"stopped" | другое (где другое будет добавлено по необходимости -- это все еще находится в стадии разработки).
результат ==>
переменная "=" значение
переменная ==>
строка
значение ==>
константа | набор | список
константа ==>
строка-си
набор ==>
"{}" | "{" результат ( "," результат )* "}"
список ==>
"[]" | "[" значение ( "," значение )* "]" | "[" результат ( "," результат )* "]"
поточн-запись ==>
консольн-поточн-вывод | целев-поточн-вывод | журн-поточн-вывод
консольн-поточн-вывод ==>
"~" строка-си
целев-поточн-вывод ==>
"@" строка-си
журн-поточн-вывод ==>
"&" строка-си
nl ==>
CR | CR-LF
лексема ==>
любая последовательность цифр.

Замечания:

См. раздел 19.4.2 Поточные записи GDB/MI, для более подробной информации о различных выводимых записях.

19.2.3 Простые примеры взаимодействия с GDB/MI

Этот подраздел представляет несколько простых примеров взаимодействия с использованием интерфейса GDB/MI. В этих примерах, `->' означает, что следующая строка передается GDB/MI в качестве ввода, а `<-' означает вывод, полученный от GDB/MI.

19.2.3.1 Останов цели

Вот пример останова подчиненного процесса:

-> -stop
<- (gdb)

и затем:

<- *stop,reason="stop",address="0x123",source="a.c:123"
<- (gdb)

19.2.3.2 Простая команда CLI

Вот пример простой команды CLI, передаваемой ему через GDB/MI.

-> print 1+2
<- ~3\n
<- (gdb)

19.2.3.3 Команда с побочными эффектами

-> -symbol-file xyz.exe
<- *breakpoint,nr="3",address="0x123",source="a.c:123"
<- (gdb)

19.2.3.4 Плохая команда

Вот что происходит, если вы передаете несуществующую команду:

-> -rubbish
<- error,"Rubbish not found"
<- (gdb)

19.3 Совместимость GDB/MI с CLI

Чтобы помочь пользователям, знакомым с существующим в GDB интерфейсом CLI, GDB/MI принимает существующие команды CLI. Как определено синтаксисом, такие команды могут быть непосредственно введены в интерфейс GDB/MI, и GDB будет отвечать.

Этот механизм предоставляется для помощи разработчикам клиентов GDB/MI, а не как надежный интерфейс к CLI. Так как команда интерпретируется в среде, которая подразумевает поведение GDB/MI, точные результаты таких команд в конечном итоге скорее всего станут неудобоваримой смесью вывода GDB/MI и CLI.

19.4 Выходные записи GDB/MI

19.4.1 Результирующие записи GDB/MI

В дополнение к множеству внеочередных уведомлений, ответ на команду GDB/MI включает один из следующих указателей результата:

"^done" [ "," результаты ]
Синхронная операция прошла успешно, возвращаемыми значениями являются результаты.
"^running"
Асинхронная операция была успешно начата. Цель выполняется.
"^error" "," строка-си
Операция завершилась с ошибкой. Строка-си содержит соответствующее сообщение об ошибке.

19.4.2 Поточные записи GDB/MI

GDB хранит несколько выходных потоков: консоль, цель и журнал. Вывод, предназначенный для этих потоков, пропускается через интерфейс GDB/MI при помощи поточных записей.

Каждая поточная запись начинается с уникального префиксного знака, который идентифицирует свой поток (см. раздел 19.2.2 Выходной синтаксис GDB/MI). Помимо префикса, каждая поточная запись содержит строку-вывод. Это либо простой текст (с подразумеваемым знаком новой строки), или Си-строка в кавычках (которая не содержит подразумеваемого знака новой строки).

"~" строка-вывод
Консольный поток вывода содержит текст, который должен быть отображен в консольном окне CLI. Он содержит текстовые ответы на команды CLI.
"@" строка-вывод
Целевой поток вывода содержит произвольный текстовый вывод от выполняемой цели.
"&" строка-вывод
Журнальный поток содержит отладочные сообщения, которые создает сам GDB.

19.4.3 Внеочередные записи GDB/MI

Внеочередные записи используются для уведомления клиента GDB/MI о произошедших дополнительных изменениях. Эти изменения могут либо исходить от GDB/MI (например, измененная точка останова), либо быть результатом действий цели (например, цель остановилась).

Ниже приведен предварительный список возможных внеочередных записей.

"*" "stop"

19.5 Формат описания команд GDB/MI

Оставшиеся разделы описывают блоки команд. Каждый блок команд схематично аналогичен этому разделу.

Заметьте, что разбиения строк в примерах присутствуют только для удобства чтения. Они не появляются в реальном выводе. Учтите также, что команды с недоступными примерами (Н.П.) еще не реализованы.

19.5.1 Мотивация

Мотивация для этого набора команд.

19.5.2 Введение

Краткое введение в этот набор команд в целом.

19.5.3 Команды

Для каждой команды в блоке, описано следующее:

19.5.3.1 Краткое описание

 -command арг...

19.5.3.2 Команда GDB

Соответствующая команда CLI GDB.

19.5.3.3 Результат

19.5.3.4 Внеочередные сообщения

19.5.3.5 Примечания

19.5.3.6 Пример

19.6 Команды GDB/MI для таблицы точек останова

Этот раздел описывает команды GDB/MI для управления точками останова.

19.6.1 Команда -break-after

19.6.1.1 Краткое описание

 -break-after номер число

Точка останова с номером номер не срабатывает, пока она не будет достигнута число раз. Чтобы увидеть, как это отражается на выводе команды `-break-list', смотрите ниже описание команды `-break-list'.

19.6.1.2 Команда GDB

Соответствующей командой GDB является `ignore'.

19.6.1.3 Пример

(gdb)
-break-insert main
^done,bkpt={number="1",addr="0x000100d0",file="hello.c",line="5"}
(gdb)
-break-after 1 3
~
^done
(gdb)
-break-list
^done,BreakpointTable={nr_rows="1",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x000100d0",func="main",file="hello.c",line="5",times="0",
ignore="3"}]}
(gdb)

19.6.2 Команда -break-condition

19.6.2.1 Краткое описание

 -break-condition номер выраж

Точка останова номер остановит программу, только если условие выраж истинно. Условие становится частью вывода `-break-list' (смотрите ниже описание команды `-break-list').

19.6.2.2 Команда GDB

Соответствующей командой GDB является `condition'.

19.6.2.3 Пример

(gdb)
-break-condition 1 1
^done
(gdb)
-break-list
^done,BreakpointTable={nr_rows="1",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x000100d0",func="main",file="hello.c",line="5",cond="1",
times="0",ignore="3"}]}
(gdb)

19.6.3 Команда -break-delete

19.6.3.1 Краткое описание

 -break-delete ( точка-останова )+

Удалить точки останова, чьи номера указаны в списке аргументов. Это очевидным образом отражается на списке точек останова.

19.6.3.2 Команда GDB

Соответствующей командой GDB является `delete'.

19.6.3.3 Пример

(gdb)
-break-delete 1
^done
(gdb)
-break-list
^done,BreakpointTable={nr_rows="0",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[]}
(gdb)

19.6.4 Команда -break-disable

19.6.4.1 Краткое описание

 -break-disable ( точка-останова )+

Отключить перечисленные точки-останова. Для указанных точек-останова поле `enabled' в списке точек останова теперь установлено в `n'.

19.6.4.2 Команда GDB

Соответствующей командой GDB является `disable'.

19.6.4.3 Пример

(gdb)
-break-disable 2
^done
(gdb)
-break-list
^done,BreakpointTable={nr_rows="1",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[bkpt={number="2",type="breakpoint",disp="keep",enabled="n",
addr="0x000100d0",func="main",file="hello.c",line="5",times="0"}]}
(gdb)

19.6.5 Команда -break-enable

19.6.5.1 Краткое описание

 -break-enable ( точка-останова )+

Включить (ранее отключенные) точки-останова.

19.6.5.2 Команда GDB

Соответствующей командой GDB является `enable'.

19.6.5.3 Пример

(gdb)
-break-enable 2
^done
(gdb)
-break-list
^done,BreakpointTable={nr_rows="1",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[bkpt={number="2",type="breakpoint",disp="keep",enabled="y",
addr="0x000100d0",func="main",file="hello.c",line="5",times="0"}]}
(gdb)

19.6.6 Команда -break-info

19.6.6.1 Краткое описание

 -break-info точка-останова

Получить информацию об одной точке останова.

19.6.6.2 Команда GDB

Соответствующей командой GDB является `info break точка-останова'.

19.6.6.3 Пример

Н.П.

19.6.7 Команда -break-insert

19.6.7.1 Краткое описание

 -break-insert [ -t ] [ -h ] [ -r ]
    [ -c условие ] [ -i счетчик-игнорирований ]
    [ -p нить ] [ строка | адрес ]

Строка, если указана, может быть одной из:

Вот возможные необязательные параметры этой команды:

`-t'
Вставить временную точку останова.
`-h'
Вставить аппаратную точку останова.
`-c условие'
Сделать точку останова условной с заданным условием.
`-i счетчик-игнорирований'
Инициализировать счетчик-игнорирований.
`-r'
Вставить обычную точку останова во всех функциях, чьи имена удовлетворяют данному регулярному выражению. Другие флаги к регулярному выражению неприменимы.

19.6.7.2 Результат

Результат имеет форму:

 ^done,bkptno="номер",func="имя-функции",
  file="имя-файла",line="ном-строки"

где номер является номером этой точки останова в GDB, имя-функции -- имя функции, в которой была вставлена точка останова, имя-файла -- имя исходного файла, в котором находится эта функция, а ном-строки является номером строки исходного текста в этом файле.

Замечание: этот формат может изменяться.

19.6.7.3 Команда GDB

Соответствующими командами GDB являются `break', `tbreak', `hbreak', `thbreak' и `rbreak'.

19.6.7.4 Пример

(gdb)
-break-insert main
^done,bkpt={number="1",addr="0x0001072c",file="recursive2.c",line="4"}
(gdb)
-break-insert -t foo
^done,bkpt={number="2",addr="0x00010774",file="recursive2.c",line="11"}
(gdb)
-break-list
^done,BreakpointTable={nr_rows="2",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x0001072c", func="main",file="recursive2.c",line="4",times="0"},
bkpt={number="2",type="breakpoint",disp="del",enabled="y",
addr="0x00010774",func="foo",file="recursive2.c",line="11",times="0"}]}
(gdb)
-break-insert -r foo.*
~int foo(int, int);
^done,bkpt={number="3",addr="0x00010774",file="recursive2.c",line="11"}
(gdb)

19.6.8 Команда -break-list

19.6.8.1 Краткое описание

 -break-list

Отображает список установленных точек останова, показывая следующие поля:

`Number'
номер точки останова
`Type'
тип точки останова: `breakpoint' или `watchpoint'
`Disposition'
эта точка останова должна быть удалена или отключена при срабатывании: `keep' или `nokeep'
`Enabled'
включена точка останова или нет: `y' или `n'
`Address'
местоположение в памяти, где установлена точка останова
`What'
логическое положение точки останова, выраженное именем функции, именем файла, номером строки
`Times'
Число раз, которое точка останова срабатывала

Если точек останова или наблюдения нет, поле body BreakpointTable является пустым списком.

19.6.8.2 Команда GDB

Соответствующей командой GDB является `info break'.

19.6.8.3 Пример

(gdb)
-break-list
^done,BreakpointTable={nr_rows="2",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x000100d0",func="main",file="hello.c",line="5",times="0"},
bkpt={number="2",type="breakpoint",disp="keep",enabled="y",
addr="0x00010114",func="foo",file="hello.c",line="13",times="0"}]}
(gdb)

Вот пример результата, когда точек останова нет:

(gdb)
-break-list
^done,BreakpointTable={nr_rows="0",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[]}
(gdb)

19.6.9 Команда -break-watch

19.6.9.1 Краткое описание

 -break-watch [ -a | -r ]

Создать точку наблюдения. С ключом `-a' будет создана точка наблюдения за доступом, то есть такая точка наблюдения, которая срабатывает либо при чтении, либо при записи в определенное местоположение в памяти. С ключом `-r' созданная точка наблюдения будет точкой наблюдения за чтением, то есть она будет срабатывать, только когда к определенному местоположению в памяти осуществляется доступ на чтение. Без этих ключей будет создана обычная точка наблюдения, то есть она будет срабатывать, когда к местоположению в памяти осуществляется доступ для записи. См. раздел 5.1.2 Установка точек наблюдения.

Заметьте, что `-break-list' выдаст единый список установленных точек наблюдения и останова.

19.6.9.2 Комада GDB

Соответствующими командами GDB являются `watch', `awatch' и `rwatch'.

19.6.9.3 Пример

Установка точки наблюдения за переменной в функции main:

(gdb)
-break-watch x
^done,wpt={number="2",exp="x"}
(gdb)
-exec-continue
^running
^done,reason="watchpoint-trigger",wpt={number="2",exp="x"},
value={old="-268439212",new="55"},
frame={func="main",args=[],file="recursive2.c",line="5"}
(gdb)

Установка точки наблюдения за локальной переменной функции. GDB дважды остановит выполнение программы: сначала при изменении значения переменной, затем при выходе точки наблюдения из области видимости.

(gdb)
-break-watch C
^done,wpt={number="5",exp="C"}
(gdb)
-exec-continue
^running
^done,reason="watchpoint-trigger",
wpt={number="5",exp="C"},value={old="-276895068",new="3"},
frame={func="callee4",args=[],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="13"}
(gdb)
-exec-continue
^running
^done,reason="watchpoint-scope",wpnum="5",
frame={func="callee3",args=[{name="strarg",
value="0x11940 \"A string argument.\""}],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="18"}
(gdb)

Получение списка точек останова и наблюдения в разных местах выполнения программы. Заметьте, что как только точка наблюдения выходит из области видимости, она удаляется.

(gdb)
-break-watch C
^done,wpt={number="2",exp="C"}
(gdb)
-break-list
^done,BreakpointTable={nr_rows="2",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x00010734",func="callee4",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8",times="1"},
bkpt={number="2",type="watchpoint",disp="keep",
enabled="y",addr="",what="C",times="0"}]}
(gdb)
-exec-continue
^running
^done,reason="watchpoint-trigger",wpt={number="2",exp="C"},
value={old="-276895068",new="3"},
frame={func="callee4",args=[],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="13"}
(gdb)
-break-list
^done,BreakpointTable={nr_rows="2",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x00010734",func="callee4",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8",times="1"},
bkpt={number="2",type="watchpoint",disp="keep",
enabled="y",addr="",what="C",times="-5"}]}
(gdb)
-exec-continue
^running
^done,reason="watchpoint-scope",wpnum="2",
frame={func="callee3",args=[{name="strarg",
value="0x11940 \"A string argument.\""}],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="18"}
(gdb)
-break-list
^done,BreakpointTable={nr_rows="1",nr_cols="6",
hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
{width="14",alignment="-1",col_name="type",colhdr="Type"},
{width="4",alignment="-1",col_name="disp",colhdr="Disp"},
{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
{width="10",alignment="-1",col_name="addr",colhdr="Address"},
{width="40",alignment="2",col_name="what",colhdr="What"}],
body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x00010734",func="callee4",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8",times="1"}]}
(gdb)

19.7 Управление данными GDB/MI

Этот раздел описывает команды GDB/MI для управления данными: исследование памяти и регистров, вычисление выражений и так далее.

19.7.1 Команда -data-disassemble

19.7.1.1 Краткое описание

 -data-disassemble
    [ -s нач-адр -e кон-адр ]
  | [ -f имя-файла -l ном-строки [ -n ст ] ]
  -- режим

Где:

`нач-адр'
начальный адрес (или $pc)
`кон-адр'
конечный адрес
`имя-файла'
имя файла для дисассемблирования
`ном-строки'
номер строки, в районе которой проводить дисассемблирование
`ст'
число строк дисассемблирования, которое необходимо произвести. Если равно -1 и кон-адр не указан, то будет дисассемблирована целая функция. Если кон-адр указан и не равен нулю, и ст меньше, чем количество строк дисассемблирования между нач-адр и кон-адр, отображаются только ст строк. Если ст больше, чем число строк между нач-адр и кон-адр, отображаются только строки до кон-адр.
`режим'
либо 0 (означает только результат дисассемблирования), либо 1 (означает смесь исходного текста и результата дисассемблирования).

19.7.1.2 Результат

Вывод для каждой инструкции состоит из четырех полей:

Заметьте, что то, что включено в поле инструкции, не обрабатывается непосредственно GDB/MI, то есть изменить его формат невозможно.

19.7.1.3 Команда GDB

Непосредственного отображения этой команды в CLI нет.

19.7.1.4 Пример

Дисассемблирование от текущего значения $pc до $pc + 20:

(gdb)
-data-disassemble -s $pc -e "$pc + 20" -- 0
^done,
asm_insns=[
{address="0x000107c0",func-name="main",offset="4",
inst="mov  2, %o0"},
{address="0x000107c4",func-name="main",offset="8",
inst="sethi  %hi(0x11800), %o2"},
{address="0x000107c8",func-name="main",offset="12",
inst="or  %o2, 0x140, %o1\t! 0x11940 <_lib_version+8>"},
{address="0x000107cc",func-name="main",offset="16",
inst="sethi  %hi(0x11800), %o2"},
{address="0x000107d0",func-name="main",offset="20",
inst="or  %o2, 0x168, %o4\t! 0x11968 <_lib_version+48>"}]
(gdb)

Дисассемблирование всей функции main. Строка 32 является частью main.

-data-disassemble -f basics.c -l 32 -- 0
^done,asm_insns=[
{address="0x000107bc",func-name="main",offset="0",
inst="save  %sp, -112, %sp"},
{address="0x000107c0",func-name="main",offset="4",
inst="mov   2, %o0"},
{address="0x000107c4",func-name="main",offset="8",
inst="sethi %hi(0x11800), %o2"},
[...]
{address="0x0001081c",func-name="main",offset="96",inst="ret "},
{address="0x00010820",func-name="main",offset="100",inst="restore "}]
(gdb)

Дисассемблирование 3 инструкций от начала main:

(gdb)
-data-disassemble -f basics.c -l 32 -n 3 -- 0
^done,asm_insns=[
{address="0x000107bc",func-name="main",offset="0",
inst="save  %sp, -112, %sp"},
{address="0x000107c0",func-name="main",offset="4",
inst="mov  2, %o0"},
{address="0x000107c4",func-name="main",offset="8",
inst="sethi  %hi(0x11800), %o2"}]
(gdb)

Дисассемблирование 3 инструкций от начала main в смешаном режиме:

(gdb)
-data-disassemble -f basics.c -l 32 -n 3 -- 1
^done,asm_insns=[
src_and_asm_line={line="31",
file="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb/ \
  testsuite/gdb.mi/basics.c",line_asm_insn=[
{address="0x000107bc",func-name="main",offset="0",
inst="save  %sp, -112, %sp"}]},
src_and_asm_line={line="32",
file="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb/ \
  testsuite/gdb.mi/basics.c",line_asm_insn=[
{address="0x000107c0",func-name="main",offset="4",
inst="mov  2, %o0"},
{address="0x000107c4",func-name="main",offset="8",
inst="sethi  %hi(0x11800), %o2"}]}]
(gdb)

19.7.2 Команда -data-evaluate-expression

19.7.2.1 Краткое описание

 -data-evaluate-expression выраж

Вычислить выражение выраж. Выражение может содержать подчиненный вызов функции. Вызов функции будет выполнен синхронно. Если выражение содержит пробелы, оно должно быть заключено в двойные кавычки.

19.7.2.2 Команда GDB

Соответствующими командами GDB являются `print', `output' и `call'. В gdbtk есть соответствующая команда `gdb_eval'.

19.7.2.3 Пример

В следующем примере числа, предшествующие командам, суть лексемы. Для их описания, см. раздел 19.2 Синтаксис команд GDB/MI. Обратите внимание на то, как GDB/MI возвращает те же лексемы в своем выводе.

211-data-evaluate-expression A
211^done,value="1"
(gdb)
311-data-evaluate-expression &A
311^done,value="0xefffeb7c"
(gdb)
411-data-evaluate-expression A+3
411^done,value="4"
(gdb)
511-data-evaluate-expression "A + 3"
511^done,value="4"
(gdb)

19.7.3 Команда -data-list-changed-registers

19.7.3.1 Краткое описание

 -data-list-changed-registers

Выводит список регистров, которые изменились.

19.7.3.2 Команда GDB

GDB не имеет прямого аналога этой команды; соответствующей командой gdbtk является `gdb_changed_register_list'.

19.7.3.3 Пример

На плате PPC MBX:

(gdb)
-exec-continue
^running

(gdb)
*stopped,reason="breakpoint-hit",bkptno="1",frame={func="main",
args=[],file="try.c",line="5"}
(gdb)
-data-list-changed-registers
^done,changed-registers=["0","1","2","4","5","6","7","8","9",
"10","11","13","14","15","16","17","18","19","20","21","22","23",
"24","25","26","27","28","30","31","64","65","66","67","69"]
(gdb)

19.7.4 Команда -data-list-register-names

19.7.4.1 Краткое описание

 -data-list-register-names [ ( ном-рег )+ ]

Показать список имен регистров текущей цели. Если аргументы не заданы, показывается список имен всех регистров. Если в качестве аргументов заданы целые числа, команда напечатает список имен регистров, соответствующих аргументам. Чтобы гарантировать согласованность имен регистров и их номеров, выводимый список может содержать имена пустых регистров.

19.7.4.2 Команда GDB

В GDB нет команды, которая соответствует `-data-list-register-names'. В gdbtk соответствующей командой является `gdb_regnames'.

19.7.4.3 Пример

Для платы PPC MBX:

(gdb)
-data-list-register-names
^done,register-names=["r0","r1","r2","r3","r4","r5","r6","r7",
"r8","r9","r10","r11","r12","r13","r14","r15","r16","r17","r18",
"r19","r20","r21","r22","r23","r24","r25","r26","r27","r28","r29",
"r30","r31","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9",
"f10","f11","f12","f13","f14","f15","f16","f17","f18","f19","f20",
"f21","f22","f23","f24","f25","f26","f27","f28","f29","f30","f31",
"", "pc","ps","cr","lr","ctr","xer"]
(gdb)
-data-list-register-names 1 2 3
^done,register-names=["r1","r2","r3"]
(gdb)

19.7.5 Команда -data-list-register-values

19.7.5.1 Краткое описание

 -data-list-register-values фмт [ ( ном-рег )*]

Отобразить содержимое регистров. Фмт является форматом, в соответствии с которым должно быть возвращено содержимое регистров, за которым следует необязательный список чисел, указывающих регистры, подлежащие отображению. Отсутствие списка чисел означает, что должно быть возвращено содержимое всех регистров.

Вот допустимые форматы для фмт:

x
Шестнадцатеричный
o
Восьмеричный
t
Двоичный
d
Десятичный
r
Без преобразования
N
Натуральный

19.7.5.2 Команда GDB

Соответствующими командами GDB являются `info reg', `info all-reg' и (в gdbtk) `gdb_fetch_registers'.

19.7.5.3 Пример

Для платы PPC MBX (имейте ввиду: переносы строк даны только для удобства чтения, они не появляются в реальном выводе):

(gdb)
-data-list-register-values r 64 65
^done,register-values=[{number="64",value="0xfe00a300"},
{number="65",value="0x00029002"}]
(gdb)
-data-list-register-values x
^done,register-values=[{number="0",value="0xfe0043c8"},
{number="1",value="0x3fff88"},{number="2",value="0xfffffffe"},
{number="3",value="0x0"},{number="4",value="0xa"},
{number="5",value="0x3fff68"},{number="6",value="0x3fff58"},
{number="7",value="0xfe011e98"},{number="8",value="0x2"},
{number="9",value="0xfa202820"},{number="10",value="0xfa202808"},
{number="11",value="0x1"},{number="12",value="0x0"},
{number="13",value="0x4544"},{number="14",value="0xffdfffff"},
{number="15",value="0xffffffff"},{number="16",value="0xfffffeff"},
{number="17",value="0xefffffed"},{number="18",value="0xfffffffe"},
{number="19",value="0xffffffff"},{number="20",value="0xffffffff"},
{number="21",value="0xffffffff"},{number="22",value="0xfffffff7"},
{number="23",value="0xffffffff"},{number="24",value="0xffffffff"},
{number="25",value="0xffffffff"},{number="26",value="0xfffffffb"},
{number="27",value="0xffffffff"},{number="28",value="0xf7bfffff"},
{number="29",value="0x0"},{number="30",value="0xfe010000"},
{number="31",value="0x0"},{number="32",value="0x0"},
{number="33",value="0x0"},{number="34",value="0x0"},
{number="35",value="0x0"},{number="36",value="0x0"},
{number="37",value="0x0"},{number="38",value="0x0"},
{number="39",value="0x0"},{number="40",value="0x0"},
{number="41",value="0x0"},{number="42",value="0x0"},
{number="43",value="0x0"},{number="44",value="0x0"},
{number="45",value="0x0"},{number="46",value="0x0"},
{number="47",value="0x0"},{number="48",value="0x0"},
{number="49",value="0x0"},{number="50",value="0x0"},
{number="51",value="0x0"},{number="52",value="0x0"},
{number="53",value="0x0"},{number="54",value="0x0"},
{number="55",value="0x0"},{number="56",value="0x0"},
{number="57",value="0x0"},{number="58",value="0x0"},
{number="59",value="0x0"},{number="60",value="0x0"},
{number="61",value="0x0"},{number="62",value="0x0"},
{number="63",value="0x0"},{number="64",value="0xfe00a300"},
{number="65",value="0x29002"},{number="66",value="0x202f04b5"},
{number="67",value="0xfe0043b0"},{number="68",value="0xfe00b3e4"},
{number="69",value="0x20002b03"}]
(gdb)

19.7.6 Команда -data-read-memory

19.7.6.1 Краткое описание

 -data-read-memory [ -o смещение ]
   адрес формат-слова размер-слова
   число-строк число-колонок [ asзнак ]

где:

`адрес'
Выражение, определяющее адрес в памяти первого слова, которое надо прочитать. Сложные выражения, содержащие пробельные знаки, должны заключаться в кавычки с использованием соглашений Си.
`формат-слова'
Формат, который должен быть использован для печати слов памяти. Обозначения те же, что и для команды GDB print (см. раздел 8.4 Форматы вывода).
`размер-слова'
Размер в байтах каждого слова в памяти.
`число-строк'
Число строк в выходной таблице.
`число-колонок'
Число колонок в выходной таблице.
`asзнак'
В настоящее время означает, что каждая строка должна включать ASCII-дамп. Значение asзнак используется в качестве заполняющего знака, когда байт не является элементом набора печатных знаков ASCII (печатные знаки ASCII это те знаки, чьи коды находятся между 32 и 126 включительно).
`смещение'
Смещение, которое надо добавить к адресу перед тем, как начать извлечение из памяти.

Эта команда отображает содержимое памяти в виде таблицы из число-строк на число-колонок слов, причем каждое слово занимает размер-слова байт. В общей сложности считывается число-строк * число-колонок * размер-слова байт (возвращается как `total-bytes'). Если цель должна возвратить меньше запрошенного числа байт, отсутствующие слова идентифицируются при помощи `N/A'. Число байт, прочитанное с цели, возвращается в `nr-bytes', а начальный адрес, использованный для чтении памяти, в `addr'.

Адрес следующей/предыдущей строки или страницы доступен в `next-row' и `prev-row', `next-page' и `prev-page'.

19.7.6.2 Команда GDB

Соответствующей командой GDB является `x'. gdbtk имеет команду чтения памяти `gdb_get_mem'.

19.7.6.3 Пример

Прочитать шесть байт памяти, начиная с bytes+6, но сместиться на -6 байт. Форматировать в три ряда по две колонки. Один байт на слово. Отображать каждое слово в шестнадцатеричном виде.

(gdb)
9-data-read-memory -o -6 -- bytes+6 x 1 3 2
9^done,addr="0x00001390",nr-bytes="6",total-bytes="6",
next-row="0x00001396",prev-row="0x0000138e",next-page="0x00001396",
prev-page="0x0000138a",memory=[
{addr="0x00001390",data=["0x00","0x01"]},
{addr="0x00001392",data=["0x02","0x03"]},
{addr="0x00001394",data=["0x04","0x05"]}]
(gdb)

Прочитать два байта памяти, начиная с адреса shorts + 64 и отобразить в виде одного слова в десятичном виде.

(gdb)
5-data-read-memory shorts+64 d 2 1 1
5^done,addr="0x00001510",nr-bytes="2",total-bytes="2",
next-row="0x00001512",prev-row="0x0000150e",
next-page="0x00001512",prev-page="0x0000150e",memory=[
{addr="0x00001510",data=["128"]}]
(gdb)

Прочитать тридцать два байта памяти, начиная с bytes+16, и форматировать на восемь рядов по четыре колонки. Включить строку, закодированную с использованием `x' в качестве непечатного знака.

(gdb)
4-data-read-memory bytes+16 x 1 8 4 x
4^done,addr="0x000013a0",nr-bytes="32",total-bytes="32",
next-row="0x000013c0",prev-row="0x0000139c",
next-page="0x000013c0",prev-page="0x00001380",memory=[
{addr="0x000013a0",data=["0x10","0x11","0x12","0x13"],ascii="xxxx"},
{addr="0x000013a4",data=["0x14","0x15","0x16","0x17"],ascii="xxxx"},
{addr="0x000013a8",data=["0x18","0x19","0x1a","0x1b"],ascii="xxxx"},
{addr="0x000013ac",data=["0x1c","0x1d","0x1e","0x1f"],ascii="xxxx"},
{addr="0x000013b0",data=["0x20","0x21","0x22","0x23"],ascii=" !\"#"},
{addr="0x000013b4",data=["0x24","0x25","0x26","0x27"],ascii="$%&'"},
{addr="0x000013b8",data=["0x28","0x29","0x2a","0x2b"],ascii="()*+"},
{addr="0x000013bc",data=["0x2c","0x2d","0x2e","0x2f"],ascii=",-./"}]
(gdb)

19.7.7 Команда -display-delete

19.7.7.1 Краткое описание

 -display-delete номер

Удалить элемент с указанным номером из списка выражений, подлежащих отображению.

19.7.7.2 Команда GDB

Соответствующей командой GDB является `delete display'.

19.7.7.3 Пример

Н.П.

19.7.8 Команда -display-disable

19.7.8.1 Краткое описание

 -display-disable номер

Отключить элемент списка выражений с указанным номером.

19.7.8.2 Команда GDB

Соответствующей командой GDB является `disable display'.

19.7.8.3 Пример

Н.П.

19.7.9 Команда -display-enable

19.7.9.1 Краткое описание

 -display-enable номер

Включить элемент списка выражений с указанным номером.

19.7.9.2 Команда GDB

Соответствующей командой GDB является `enable display'.

19.7.9.3 Пример

Н.П.

19.7.10 Команда -display-insert

19.7.10.1 Краткое описание

 -display-insert выражение

Отображать выражение всякий раз, когда программа останавливается.

19.7.10.2 Команда GDB

Соответствующей командой GDB является `display'.

19.7.10.3 Пример

Н.П.

19.7.11 Команда -display-list

19.7.11.1 Краткое описание

 -display-list

Перечислить элементы списка выражений, подлежащих автоматическому отображению. Текущие значения не показывать.

19.7.11.2 Команда GDB

Соответствующей командой GDB является `info display'.

19.7.11.3 Пример

Н.П.

19.7.12 Команда -environment-cd

19.7.12.1 Краткое описание

 -environment-cd кат

Установить рабочий каталог GDB.

19.7.12.2 Команда GDB

Соответствующей командой GDB является `cd'.

19.7.12.3 Пример

(gdb)
-environment-cd /kwikemart/marge/ezannoni/flathead-dev/devo/gdb
^done
(gdb)

19.7.13 Команда -environment-directory

19.7.13.1 Краткое описание

 -environment-directory кат

Добавить каталог кат в начало пути поиска исходных файлов.

19.7.13.2 Команда GDB

Соответствующей командой GDB является `dir'.

19.7.13.3 Пример

(gdb)
-environment-directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb
^done
(gdb)

19.7.14 Команда -environment-path

19.7.14.1 Краткое описание

 -environment-path ( кат )+

Добавить каталоги кат в начало пути поиска объектных файлов.

19.7.14.2 Команда GDB

Соответствующей командой GDB является `path'.

19.7.14.3 Пример

(gdb)
-environment-path /kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb
^done
(gdb)

19.7.15 Команда -environment-pwd

19.7.15.1 Краткое описание

 -environment-pwd

Показать текущий рабочий каталог.

19.7.15.2 Команда GDB

Соответствующей командой GDB является `pwd'.

19.7.15.3 Пример

(gdb)
-environment-pwd
~Working directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb.
^done
(gdb)

19.8 Управление программой GDB/MI

19.8.0.1 Завершение программы

В процессе выполнения, подчиненная программа может достигнуть конца, если она не встретит ни одной точки останова. В этом случае вывод будет включать код завершения, если программа завершилась ненормально.

19.8.0.2 Примеры

Программа завершилась нормально:

(gdb)
-exec-run
^running
(gdb)
x = 55
*stopped,reason="exited-normally"
(gdb)

Программа завершилась ненормально:

(gdb)
-exec-run
^running
(gdb)
x = 55
*stopped,reason="exited",exit-code="01"
(gdb)

Кроме того, программа может завершиться так, как если бы она получила сигнал, например SIGINT. В этом случае GDB/MI отображает следующее:

(gdb)
*stopped,reason="exited-signalled",signal-name="SIGINT",
signal-meaning="Interrupt"

19.8.1 Команда -exec-abort

19.8.1.1 Краткое описание

 -exec-abort

Убить выполняющуюся подчиненную программу.

19.8.1.2 Команда GDB

Соответствующей командой GDB является `kill'.

19.8.1.3 Пример

Н.П.

19.8.2 Команда -exec-arguments

19.8.2.1 Краткое описание

 -exec-arguments арг

Установить аргументы подчиненной программы, которые должны быть использованы при следующем `-exec-run'.

19.8.2.2 Команда GDB

Соответствующей командой GDB является `set args'.

19.8.2.3 Пример

Пока нет.

19.8.3 Команда -exec-continue

19.8.3.1 Краткое описание

 -exec-continue

Асинхронная команда. Возобновляет выполнение подчиненной программы до тех пор, пока не будет встречена точка останова, или пока подчиненная программа не завершится.

19.8.3.2 Команда GDB

Соответствующей командой GDB является `continue'.

19.8.3.3 Пример

-exec-continue
^running
(gdb)
@Hello world
*stopped,reason="breakpoint-hit",bkptno="2",frame={func="foo",args=[],
file="hello.c",line="13"}
(gdb)

19.8.4 Команда -exec-finish

19.8.4.1 Краткое описание

 -exec-finish

Асинхронная команда. Возобновляет выполнение подчиненной программы до тех пор, пока не завершится текущая функция. Отображает результаты, возвращенные функцией.

19.8.4.2 Команда GDB

Соответствующей командой GDB является `finish'.

19.8.4.3 Пример

Функция, возвращающая void.

-exec-finish
^running
(gdb)
@hello from foo
*stopped,reason="function-finished",frame={func="main",args=[],
file="hello.c",line="7"}
(gdb)

Функция, возвращающая что-либо отличное от void. Печатается имя внутренней переменной GDB, хранящей результат, а также и сам результат.

-exec-finish
^running
(gdb)
*stopped,reason="function-finished",frame={addr="0x000107b0",func="foo",
args=[{name="a",value="1"],{name="b",value="9"}},
file="recursive2.c",line="14"},
gdb-result-var="$1",return-value="0"
(gdb)

19.8.5 Команда -exec-interrupt

19.8.5.1 Краткое описание

 -exec-interrupt

Асинхронная команда. Прерывает фоновое исполнение цели. Заметьте, что лексема, ассоциированная с сообщением об останове, совпадает с лексемой для выполнения команды, которая была прервана. Лексема для самого прерывания появляется только в выводе `^done'. Если пользователь пытается прервать невыполняющуюся программу, будет выведено сообщение об ошибке.

19.8.5.2 Команда GDB

Соответствующей командой GDB является `interrupt'.

19.8.5.3 Пример

(gdb)
111-exec-continue
111^running

(gdb)
222-exec-interrupt
222^done
(gdb)
111*stopped,signal-name="SIGINT",signal-meaning="Interrupt",
frame={addr="0x00010140",func="foo",args=[],file="try.c",line="13"}
(gdb)

(gdb)
-exec-interrupt
^error,msg="mi_cmd_exec_interrupt: Inferior not executing."
(gdb)

19.8.6 Команда -exec-next

19.8.6.1 Краткое описание

 -exec-next

Асинхронная команда. Возобновляет выполнение подчиненной программы, останавливая ее, когда достигается начало следующей строки исходного текста.

19.8.6.2 Команда GDB

Соответствующей командой GDB является `next'.

19.8.6.3 Пример

-exec-next
^running
(gdb)
*stopped,reason="end-stepping-range",line="8",file="hello.c"
(gdb)

19.8.7 Команда -exec-next-instruction

19.8.7.1 Краткое описание

 -exec-next-instruction

Асинхронная команда. Выполняет одну машинную инструкцию. Если инструкция является вызовом функции, выполнение продолжается до возврата из функции. Если программа останавливается на инструкции в середине строки исходного текста, печатается также адрес.

19.8.7.2 Команда GDB

Соответствующей командой GDB является `nexti'.

19.8.7.3 Пример

(gdb)
-exec-next-instruction
^running

(gdb)
*stopped,reason="end-stepping-range",
addr="0x000100d4",line="5",file="hello.c"
(gdb)

19.8.8 Команда -exec-return

19.8.8.1 Краткое описание

 -exec-return

Велит текущей функции немедленно вернуться. Не выполняет подчиненную программу. Отображает новый текущий кадр.

19.8.8.2 Команда GDB

Соответствующей командой GDB является `return'.

19.8.8.3 Пример

(gdb)
200-break-insert callee4
200^done,bkpt={number="1",addr="0x00010734",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"}
(gdb)
000-exec-run
000^running
(gdb)
000*stopped,reason="breakpoint-hit",bkptno="1",
frame={func="callee4",args=[],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"}
(gdb)
205-break-delete
205^done
(gdb)
111-exec-return
111^done,frame={level="0 ",func="callee3",
args=[{name="strarg",
value="0x11940 \"A string argument.\""}],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="18"}
(gdb)

19.8.9 Команда -exec-run

19.8.9.1 Краткое описание

 -exec-run

Асинхронная команда. Начинает выполнение подчиненной программы с начала. Она выполняется до тех пор, пока либо не встретится точка останова, либо программа не завершится.

19.8.9.2 Команда GDB

Соответствующей командой GDB является `run'.

19.8.9.3 Пример

(gdb)
-break-insert main
^done,bkpt={number="1",addr="0x0001072c",file="recursive2.c",line="4"}
(gdb)
-exec-run
^running
(gdb)
*stopped,reason="breakpoint-hit",bkptno="1",
frame={func="main",args=[],file="recursive2.c",line="4"}
(gdb)

19.8.10 Команда -exec-show-arguments

19.8.10.1 Краткое описание

 -exec-show-arguments

Печатает аргументы программы.

19.8.10.2 Команда GDB

Соответствующей командой GDB является `show args'.

19.8.10.3 Пример

Н.П.

19.8.11 Команда -exec-step

19.8.11.1 Краткое описание

 -exec-step

Асинхронная команда. Возобновляет выполнение подчиненной программы, останавливая ее, когда будет достигнуто начало следующей строки исходного файла, при условии, что она не является вызовом функции. Если же следующая строка является вызовом функции, программа останавливается на первой инструкции этой функции.

19.8.11.2 Команда GDB

Соответствующей командой GDB является `step'.

19.8.11.3 Пример

Пошаговый вход в функцию:

-exec-step
^running
(gdb)
*stopped,reason="end-stepping-range",
frame={func="foo",args=[{name="a",value="10"},
{name="b",value="0"}],file="recursive2.c",line="11"}
(gdb)

Обычное пошаговое выполнение:

-exec-step
^running
(gdb)
*stopped,reason="end-stepping-range",line="14",file="recursive2.c"
(gdb)

19.8.12 Команда -exec-step-instruction

19.8.12.1 Краткое описание

 -exec-step-instruction

Асинхронная команда. Возобновляет выполнение подчиненной программы, выполняя одну машинную инструкцию. Вывод, когда GDB остановится, будет различаться в зависимости от того, остановились мы в середине исходной строки или нет. В первом случае, адрес, по которому программа остановлена, также будет напечатан.

19.8.12.2 Команда GDB

Соответствующей командой GDB является `stepi'.

19.8.12.3 Пример

(gdb)
-exec-step-instruction
^running

(gdb)
*stopped,reason="end-stepping-range",
frame={func="foo",args=[],file="try.c",line="10"}
(gdb)
-exec-step-instruction
^running

(gdb)
*stopped,reason="end-stepping-range",
frame={addr="0x000100f4",func="foo",args=[],file="try.c",line="10"}
(gdb)

19.8.13 Команда -exec-until

19.8.13.1 Краткое описание

 -exec-until [ местоположение ]

Асинхронная команда. Выполняет подчиненную программу до тех пор, пока не будет достигнуто указанное в аргументе местоположение. Если аргумента нет, подчиненная программа выполняется, пока не будет достигнута строка исходного текста, превышающая текущую. В этом случае, причиной остановки будет `location-reached'.

19.8.13.2 Команда GDB

Соответствующей командой GDB является `until'.

19.8.13.3 Пример

(gdb)
-exec-until recursive2.c:6
^running
(gdb)
x = 55
*stopped,reason="location-reached",frame={func="main",args=[],
file="recursive2.c",line="6"}
(gdb)

19.8.14 Команда -file-exec-and-symbols

19.8.14.1 Краткое описание

 -file-exec-and-symbols файл

Указать выполняемый файл для отладки. Это тот файл, из которого также читается таблица символов. Если файл не указан, команда очищает информацию о выполняемом файле и символах. Если при использовании этой команды без аргументов установлены точки останова, GDB выдаст сообщение об ошибке. В противном случае, никакого вывода не будет, за исключением уведомления о завершении.

19.8.14.2 Команда GDB

Соответствующей командой GDB является `file'.

19.8.14.3 Пример

(gdb)
-file-exec-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
^done
(gdb)

19.8.15 Команда -file-exec-file

19.8.15.1 Краткое описание

 -file-exec-file файл

Указать выполняемый файл для отладки. В отличие от `-file-exec-and-symbols', таблица символов не считывается из этого файла. При использовании без аргумента, GDB очищает информацию о выполняемом файле. Никакого вывода не производится, за исключением уведомления о завершении.

19.8.15.2 Команда GDB

Соответствующей командой GDB является `exec-file'.

19.8.15.3 Пример

(gdb)
-file-exec-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
^done
(gdb)

19.8.16 Команда -file-list-exec-sections

19.8.16.1 Краткое описание

 -file-list-exec-sections

Перечисляет разделы текущего выполняемого файла.

19.8.16.2 Команда GDB

Команда GDB `info file' показывает, помимо всего прочего, ту же информацию, что и эта команда. gdbtk имеет соответствующую команду `gdb_load_info'.

19.8.16.3 Пример

Н.П.

19.8.17 Команда -file-list-exec-source-files

19.8.17.1 Краткое описание

 -file-list-exec-source-files

Перечисляет исходные файлы для текущего выполняемого файла.

19.8.17.2 Команда GDB

В GDB нет команды, непосредственно соответствующей этой. gdbtk имеет аналогичную команду `gdb_listfiles'.

19.8.17.3 Пример

Н.П.

19.8.18 Команда -file-list-shared-libraries

19.8.18.1 Краткое описание

 -file-list-shared-libraries

Перечисляет используемые программой разделяемые библиотеки.

19.8.18.2 Команда GDB

Соответствующей командой GDB является `info shared'.

19.8.18.3 Пример

Н.П.

19.8.19 Команда -file-list-symbol-files

19.8.19.1 Краткое описание

 -file-list-symbol-files

Перечисляет файлы символов.

19.8.19.2 Команда GDB

Соответствующей командой GDB является `info file' (ее часть).

19.8.19.3 Пример

Н.П.

19.8.20 Команда -file-symbol-file

19.8.20.1 Краткое описание

 -file-symbol-file файл

Прочитать информацию символьной таблицы из указанного в аргументе файла. Будучи использованной без аргументов, очищает таблицу символьной информации GDB. Никакого вывода не производится, кроме уведомления о завершении.

19.8.20.2 Команда GDB

Соответствующей командой GDB является `symbol-file'.

19.8.20.3 Пример

(gdb)
-file-symbol-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
^done
(gdb)

19.9 Разные команды GDB в GDB/MI

19.9.1 Команда -gdb-exit

19.9.1.1 Краткое описание

 -gdb-exit

Немедленно выйти из GDB.

19.9.1.2 Команда GDB

Примерно соответствует команде `quit'.

19.9.1.3 Пример

(gdb)
-gdb-exit

19.9.2 Команда -gdb-set

19.9.2.1 Краткое описание

 -gdb-set

Установить внутреннюю переменную GDB.

19.9.2.2 Команда GDB

Соответствующей командой GDB является `set'.

19.9.2.3 Пример

(gdb)
-gdb-set $foo=3
^done
(gdb)

19.9.3 Команда -gdb-show

19.9.3.1 Краткое описание

 -gdb-show

Показать текущее значение переменной GDB.

19.9.3.2 Команда GDB

Соответствующей командой GDB является `show'.

19.9.3.3 Пример

(gdb)
-gdb-show annotate
^done,value="0"
(gdb)

19.9.4 Команда -gdb-version

19.9.4.1 Краткое описание

 -gdb-version

Вывести информацию о версии GDB. Используется преимущественно при тестировании.

19.9.4.2 Команда GDB

Эквивалентной команды GDB нет. По умолчанию, GDB показывает эту информацию, когда вы вызываете интерактивный сеанс.

19.9.4.3 Пример

(gdb)
-gdb-version
~GNU gdb 5.2.1
~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 
 "--host=sparc-sun-solaris2.5.1 --target=ppc-eabi".
^done
(gdb)

19.10 Команды GDB/MI управления стеком

19.10.1 Команда -stack-info-frame

19.10.1.1 Краткое описание

 -stack-info-frame

Получить информацию о текущем кадре.

19.10.1.2 Команда GDB

Соответствующей командой GDB является `info frame' или `frame' (без аргументов).

19.10.1.3 Пример

Н.П.

19.10.2 Команда -stack-info-depth

19.10.2.1 Краткое описание

 -stack-info-depth [ макс-глуб ]

Возвращает глубину стека. Если указан целочисленный аргумент макс-глуб, не считать более макс-глуб кадров.

19.10.2.2 Команда GDB

Эквивалентной команды GDB нет.

19.10.2.3 Пример

Для стека с уровнями кадров от 0 до 11:

(gdb)
-stack-info-depth
^done,depth="12"
(gdb)
-stack-info-depth 4
^done,depth="4"
(gdb)
-stack-info-depth 12
^done,depth="12"
(gdb)
-stack-info-depth 11
^done,depth="11"
(gdb)
-stack-info-depth 13
^done,depth="12"
(gdb)

19.10.3 Команда -stack-list-arguments

19.10.3.1 Краткое описание

 -stack-list-arguments показ-знач
    [ нижн-кадр верхн-кадр ]

Отобразить список аргументов для кадров от нижн-кадр до верхн-кадр (включительно). Если нижн-кадр и верхн-кадр не указаны, перечислить аргументы для всего стека вызовов.

Аргумент показ-знач должен иметь значение 0 или 1. Значение 0 означает, что выводятся только имена аргументов, а 1 -- что печатаются как имена, так и значения аргументов.

19.10.3.2 Команда GDB

GDB не имеет эквивалентной команды. В gdbtk есть команда `gdb_get_args', которая частично перекрывается с действием `-stack-list-arguments'.

19.10.3.3 Пример

(gdb)
-stack-list-frames
^done,
stack=[
frame={level="0 ",addr="0x00010734",func="callee4",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"},
frame={level="1 ",addr="0x0001076c",func="callee3",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="17"},
frame={level="2 ",addr="0x0001078c",func="callee2",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="22"},
frame={level="3 ",addr="0x000107b4",func="callee1",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="27"},
frame={level="4 ",addr="0x000107e0",func="main",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="32"}]
(gdb)
-stack-list-arguments 0
^done,
stack-args=[
frame={level="0",args=[]},
frame={level="1",args=[name="strarg"]},
frame={level="2",args=[name="intarg",name="strarg"]},
frame={level="3",args=[name="intarg",name="strarg",name="fltarg"]},
frame={level="4",args=[]}]
(gdb)
-stack-list-arguments 1
^done,
stack-args=[
frame={level="0",args=[]},
frame={level="1",
 args=[{name="strarg",value="0x11940 \"Строковый аргумент.\""}]},
frame={level="2",args=[
{name="intarg",value="2"},
{name="strarg",value="0x11940 \"Строковый аргумент.\""}]},
{frame={level="3",args=[
{name="intarg",value="2"},
{name="strarg",value="0x11940 \"Строковый аргумент.\""},
{name="fltarg",value="3.5"}]},
frame={level="4",args=[]}]
(gdb)
-stack-list-arguments 0 2 2
^done,stack-args=[frame={level="2",args=[name="intarg",name="strarg"]}]
(gdb)
-stack-list-arguments 1 2 2
^done,stack-args=[frame={level="2",
args=[{name="intarg",value="2"},
{name="strarg",value="0x11940 \"Строковый аргумент.\""}]}]
(gdb)

19.10.4 Команда -stack-list-frames

19.10.4.1 Краткое описание

 -stack-list-frames [ нижн-кадр верхн-кадр ]

Перечисляет кадры, находящиеся в данный момент в стеке. Для каждого кадра, команда отображает следующую информацию:

`level'
Номер кадра, 0 для самого верхнего, то есть для самой внутренней функции.
`addr'
Значение $pc для этого кадра.
`func'
Имя функции.
`file'
Имя исходного файла, где находится функция.
`line'
Номер строки, соответствующий $pc.

Будучи вызванной без аргументов, эта команда печатает цепочку вызовов для всего стека. Если задано два целочисленных аргумента, она показывает кадры с уровнями между этими аргументами (включительно). Если аргументы равны, она показывает один единственный кадр соответствующего уровня.

19.10.4.2 Команда GDB

Соответствующими командами GDB являются `backtrace' и `where'.

19.10.4.3 Пример

Цепочка вызовов стека целиком:

(gdb)
-stack-list-frames
^done,stack=
[frame={level="0 ",addr="0x0001076c",func="foo",
  file="recursive2.c",line="11"},
frame={level="1 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="2 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="3 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="4 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="5 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="6 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="7 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="8 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="9 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="10",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="11",addr="0x00010738",func="main",
  file="recursive2.c",line="4"}]
(gdb)

Показать кадры между нижн-кадр и верхн-кадр:

(gdb)
-stack-list-frames 3 5
^done,stack=
[frame={level="3 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="4 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"},
frame={level="5 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"}]
(gdb)

Показать один кадр:

(gdb)
-stack-list-frames 3 3
^done,stack=
[frame={level="3 ",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"}]
(gdb)

19.10.5 Команда -stack-list-locals

19.10.5.1 Краткое описание

 -stack-list-locals печатать-значения

Вывести имена локальных переменных для текущего кадра. С параметром 0 выводит только имена переменных, с параметром 1 выводит также их значения.

19.10.5.2 Команда GDB

`info locals' в GDB, `gdb_get_locals' в gdbtk.

19.10.5.3 Пример

(gdb)
-stack-list-locals 0
^done,locals=[name="A",name="B",name="C"]
(gdb)
-stack-list-locals 1
^done,locals=[{name="A",value="1"},{name="B",value="2"},
  {name="C",value="3"}]
(gdb)

19.10.6 Команда -stack-select-frame

19.10.6.1 Краткое описание

 -stack-select-frame ном-кадра

Изменить текущий кадр. Выбрать другой кадр ном-кадра в стеке.

19.10.6.2 Команда GDB

Соответствующими командами GDB являются `frame', `up', `down', `select-frame', `up-silent' и `down-silent'.

19.10.6.3 Пример

(gdb)
-stack-select-frame 2
^done
(gdb)

19.11 Команды GDB/MI запросов о символах

19.11.1 Команда -symbol-info-address

19.11.1.1 Краткое описание

 -symbol-info-address символ

Описать, где хранится символ.

19.11.1.2 Команда GDB

Соответствующей командой GDB является `info address'.

19.11.1.3 Пример

Н.П.

19.11.2 Команда -symbol-info-file

19.11.2.1 Краткое описание

 -symbol-info-file

Показать файл для символа.

19.11.2.2 Команда GDB

Эквивалентной команды GDB нет. В gdbtk есть команда `gdb_find_file'.

19.11.2.3 Пример

Н.П.

19.11.3 Команда -symbol-info-function

19.11.3.1 Краткое описание

 -symbol-info-function

Показать, в какой функции находится символ.

19.11.3.2 Команда GDB

`gdb_get_function' в gdbtk.

19.11.3.3 Пример

Н.П.

19.11.4 Команда -symbol-info-line

19.11.4.1 Краткое описание

 -symbol-info-line

Показать адреса памяти кода для текущей строки.

19.11.4.2 Команда GDB

Соответствующей командой GDB является `info line'. В gdbtk есть команды `gdb_get_line' и `gdb_get_file'.

19.11.4.3 Пример

Н.П.

19.11.5 Команда -symbol-info-symbol

19.11.5.1 Краткое описание

 -symbol-info-symbol адрес

Описать, какой символ находится в местоположении адрес.

19.11.5.2 Команда GDB

Соответствующей командой GDB является `info symbol'.

19.11.5.3 Пример

Н.П.

19.11.6 Команда -symbol-list-functions

19.11.6.1 Краткое описание

 -symbol-list-functions

Перечислить функции, находящиеся в выполняемом файле.

19.11.6.2 Команда GDB

`info functions' в GDB, `gdb_listfunc' и `gdb_search' в gdbtk.

19.11.6.3 Пример

Н.П.

19.11.7 Команда -symbol-list-types

19.11.7.1 Краткое описание

 -symbol-list-types

Перечислить все имена типов.

19.11.7.2 Команда GDB

Соответствующими командами являются `info types' в GDB и `gdb_search' в gdbtk.

19.11.7.3 Пример

Н.П.

19.11.8 Команда -symbol-list-variables

19.11.8.1 Краткое описание

 -symbol-list-variables

Перечислить имена всех глобальных и статических переменных.

19.11.8.2 Команда GDB

`info variables' в GDB, `gdb_search' в gdbtk.

19.11.8.3 Пример

Н.П.

19.11.9 Команда -symbol-locate

19.11.9.1 Краткое описание

 -symbol-locate

19.11.9.2 Команда GDB

`gdb_loc' в gdbtk.

19.11.9.3 Пример

Н.П.

19.11.10 Команда -symbol-type

19.11.10.1 Краткое описание

 -symbol-type переменная

Показать тип переменной.

19.11.10.2 Команда GDB

Соответствующей командой GDB является `ptype', в gdbtk есть команда `gdb_obj_variable'.

19.11.10.3 Пример

Н.П.

19.12 Команды GDB/MI управления целью

19.12.1 Команда -target-attach

19.12.1.1 Краткое описание

 -target-attach ид-проц | файл

Присоединиться к процессу ид-проц или файлу файл вне GDB.

19.12.1.2 Команда GDB

Соответствующей командой GDB является `attach'.

19.12.1.3 Пример

Н.П.

19.12.2 Команда -target-compare-sections

19.12.2.1 Краткое описание

 -target-compare-sections [ раздел ]

Сравнить данные раздела раздел на цели с выполняемым файлом. Без аргумента сравниваются все разделы.

19.12.2.2 Команда GDB

Эквивалентной командой в GDB является `compare-sections'.

19.12.2.3 Пример

Н.П.

19.12.3 Команда -target-detach

19.12.3.1 Краткое описание

 -target-detach

Отсоединиться от удаленной цели. Никакого вывода не производится.

19.12.3.2 Команда GDB

Соответствующей командой GDB является `detach'.

19.12.3.3 Пример

(gdb)
-target-detach
^done
(gdb)

19.12.4 Команда -target-download

19.12.4.1 Краткое описание

 -target-download

Загружает выполняемый файл на удаленную цель. Команда два раза в секунду обновляет сообщение, которое включает поля:

`section'
Имя раздела.
`section-sent'
Размер переданного на данный момент участка для этого раздела.
`section-size'
Размер раздела.
`total-sent'
Общий размер переданной на данный момент информации (текущий и предыдущие разделы).
`total-size'
Размер всего выполняемого файла, подлежащего загрузке.

Каждое сообщение посылается в виде сообщения статуса (см. раздел 19.2.2 Выходной синтаксис GDB/MI).

Кроме того, команда печатает имена и размеры разделов, по мере их загрузки. Эти сообщения включают следующие поля:

`section'
Имя раздела.
`section-size'
Размер раздела.
`total-size'
Размер всего выполняемого файла, подлежащего загрузке.

В конце печатается суммарная информация.

19.12.4.2 Команда GDB

Соответствующей командой GDB является `load'.

19.12.4.3 Пример

Замечание: каждое сообщение статуса появляется на одной строке. Здесь сообщения были разбиты на несколько строк, чтобы они могли влезть на страницу.

(gdb)
-target-download
+download,{section=".text",section-size="6668",total-size="9880"}
+download,{section=".text",section-sent="512",section-size="6668",
total-sent="512",total-size="9880"}
+download,{section=".text",section-sent="1024",section-size="6668",
total-sent="1024",total-size="9880"}
+download,{section=".text",section-sent="1536",section-size="6668",
total-sent="1536",total-size="9880"}
+download,{section=".text",section-sent="2048",section-size="6668",
total-sent="2048",total-size="9880"}
+download,{section=".text",section-sent="2560",section-size="6668",
total-sent="2560",total-size="9880"}
+download,{section=".text",section-sent="3072",section-size="6668",
total-sent="3072",total-size="9880"}
+download,{section=".text",section-sent="3584",section-size="6668",
total-sent="3584",total-size="9880"}
+download,{section=".text",section-sent="4096",section-size="6668",
total-sent="4096",total-size="9880"}
+download,{section=".text",section-sent="4608",section-size="6668",
total-sent="4608",total-size="9880"}
+download,{section=".text",section-sent="5120",section-size="6668",
total-sent="5120",total-size="9880"}
+download,{section=".text",section-sent="5632",section-size="6668",
total-sent="5632",total-size="9880"}
+download,{section=".text",section-sent="6144",section-size="6668",
total-sent="6144",total-size="9880"}
+download,{section=".text",section-sent="6656",section-size="6668",
total-sent="6656",total-size="9880"}
+download,{section=".init",section-size="28",total-size="9880"}
+download,{section=".fini",section-size="28",total-size="9880"}
+download,{section=".data",section-size="3156",total-size="9880"}
+download,{section=".data",section-sent="512",section-size="3156",
total-sent="7236",total-size="9880"}
+download,{section=".data",section-sent="1024",section-size="3156",
total-sent="7748",total-size="9880"}
+download,{section=".data",section-sent="1536",section-size="3156",
total-sent="8260",total-size="9880"}
+download,{section=".data",section-sent="2048",section-size="3156",
total-sent="8772",total-size="9880"}
+download,{section=".data",section-sent="2560",section-size="3156",
total-sent="9284",total-size="9880"}
+download,{section=".data",section-sent="3072",section-size="3156",
total-sent="9796",total-size="9880"}
^done,address="0x10004",load-size="9880",transfer-rate="6586",
write-rate="429"
(gdb)

19.12.5 Команда -target-exec-status

19.12.5.1 Краткое описание

 -target-exec-status

Предоставить информацию о состоянии цели (например, выполняется она или нет).

19.12.5.2 Команда GDB

Эквивалентной команды GDB нет.

19.12.5.3 Пример

Н.П.

19.12.6 Команда -target-list-available-targets

19.12.6.1 Краткое описание

 -target-list-available-targets

Перечислить цели, к которым можно установить соединение.

19.12.6.2 Команда GDB

Соответствующей командой GDB является `help target'.

19.12.6.3 Пример

Н.П.

19.12.7 Команда -target-list-current-targets

19.12.7.1 Краткое описание

 -target-list-current-targets

Описать текущую цель.

19.12.7.2 Команда GDB

Соответствующая информация (вместе с другой) печатается командой `info file'.

19.12.7.3 Пример

Н.П.

19.12.8 Команда -target-list-parameters

19.12.8.1 Краткое описание

 -target-list-parameters

19.12.8.2 Команда GDB

Эквивалента нет.

19.12.8.3 Пример

Н.П.

19.12.9 Команда -target-select

19.12.9.1 Краткое описание

 -target-select тип параметры ...

Соединить GDB с удаленной целью. Эта команда допускает два аргумента:

`тип'
Тип цели, например, `async', `remote', и т.д.
`параметры'
Имена устройств, названия машин и тому подобное. См. раздел 13.2 Команды для управления целями, для более полной информации.

Результатом является уведомление о соединении, за которым следует адрес, по которому находится целевая программа, в следующей форме:

^connected,addr="адрес",func="имя функции",
  args=[список аргументов]

19.12.9.2 Команда GDB

Соответствующей командой GDB является `target'.

19.12.9.3 Пример

(gdb)
-target-select async /dev/ttya
^connected,addr="0xfe00a300",func="??",args=[]
(gdb)

19.13 Команды GDB/MI для нитей

19.13.1 Команда -thread-info

19.13.1.1 Краткое описание

 -thread-info

19.13.1.2 Команда GDB

Эквивалента нет.

19.13.1.3 Пример

Н.П.

19.13.2 Команда -thread-list-all-threads

19.13.2.1 Краткое описание

 -thread-list-all-threads

19.13.2.2 Команда GDB

Эквивалентной командой GDB является `info threads'.

19.13.2.3 Пример

Н.П.

19.13.3 Команда -thread-list-ids

19.13.3.1 Краткое описание

 -thread-list-ids

Выводит список известных GDB в данный момент идентификаторов нитей. В конце списка также выводится общее число таких нитей.

19.13.3.2 Команда GDB

Часть `info threads' предоставляет ту же информацию.

19.13.3.3 Пример

Кроме основного процесса нет ни одной нити:

(gdb)
-thread-list-ids
^done,thread-ids={},number-of-threads="0"
(gdb)

Несколько нитей:

(gdb)
-thread-list-ids
^done,thread-ids={thread-id="3",thread-id="2",thread-id="1"},
number-of-threads="3"
(gdb)

19.13.4 Команда -thread-select

19.13.4.1 Краткое описание

 -thread-select номер-нити

Сделать нить номер-нити текущей. Команда выводит номер новой текущей нити и самый верхний кадр для нее.

19.13.4.2 Команда GDB

Соответствующей командой GDB является `thread'.

19.13.4.3 Пример

(gdb)
-exec-next
^running
(gdb)
*stopped,reason="end-stepping-range",thread-id="2",line="187",
file="../../../devo/gdb/testsuite/gdb.threads/linux-dp.c"
(gdb)
-thread-list-ids
^done,
thread-ids={thread-id="3",thread-id="2",thread-id="1"},
number-of-threads="3"
(gdb)
-thread-select 3
^done,new-thread-id="3",
frame={level="0 ",func="vprintf",
args=[{name="format",value="0x8048e9c \"%*s%c %d %c\\n\""},
{name="arg",value="0x2"}],file="vprintf.c",line="31"}
(gdb)

19.14 Команды GDB/MI для точек трассировки

Команды для точек трассировки еще не реализованы.

19.15 Изменяемые объекты GDB/MI

19.15.1 Обоснование для изменяемых объектов в GDB/MI

Для реализации изменяемого отладочного окна (локальные переменные, наблюдаемые выражения, и т.д.), мы предлагаем модификацию существующего кода, используемого в Insight.

Вот две основные причины для этого:

  1. Он был проверен на практике (это уже его второе поколение).
  2. Это сократит время разработки (не стоит говорить, как это сейчас важно).

Первоначальный интерфейс был разработан для использования из кода на Tcl, так что он был немного изменен, чтобы его можно было использовать через GDB/MI. Этот раздел описывает операции GDB/MI, которые будут доступны, и дает некоторые советы по их использованию.

Замечание: В дополнение к описанному здесь набору операций, мы ожидаем, что GUI-реализация изменяемого окна будет требовать, как минимум, следующие операции:

19.15.2 Введение в изменяемые объекты в GDB/MI

Основной идеей изменяемых объектов является создание именованного объекта для представления переменной, выражения, местоположения в памяти или даже регистра ЦП. Для каждого созданного объекта существует набор операций для изучения или изменения его свойств.

Более того, сложные типы данных, такие как структуры Си, представлены в древовидном формате. Например, переменная типа struct является корнем, а потомки будут представлять элементы этой структуры. Если потомок сам является сложным типом, он также будет иметь своих потомков. Соответствующие различия языков учитываются для Си, Си++ и Java.

При возврате реальных значений объектов, эта возможность позволяет отдельно выбирать формат отображения, используемый при создании результата. Формат может быть таким: двоичный, десятичный, шестнадцатеричный, восьмеричный и обычный. Обычный -- это формат по умолчанию, выбираемый автоматически в зависимости от типа переменной (например, десятичный для int, шестнадцатеричный для указателей, и т.д.).

Далее следует полный набор операций GDB/MI, определенный для доступа к этим возможностям:
Операция Описание
-var-create создать изменяемый объект
-var-delete удалить изменяемый объект и его потомков
-var-set-format установить формат отображения для этой переменной
-var-show-format показать формат отображения для этой переменной
-var-info-num-children сообщает, сколько потомков имеет данный объект
-var-list-children возвращает список потомков объекта
-var-info-type показать тип этого изменяемого объекта
-var-info-expression напечатать, что представляет этот изменяемый объект
-var-show-attributes является ли эта переменная редактируемой? она здесь существует?
-var-evaluate-expression получить значение этой переменной
-var-assign установить значение этой переменной
-var-update скорректировать переменную и ее потомков

В следующем подразделе мы подробно описываем каждую операцию и предлагаем возможный способ ее использования.

19.15.3 Описание и использование операций для изменяемых объектов

19.15.4 Команда -var-create

19.15.4.1 Краткое описание

 -var-create {имя | "-"}
    {адрес-кадра | "*"} выражение

Данная операция создает изменяемый объект. Это позволяет наблюдать за переменной, результатом выражения, ячейкой памяти или регистром ЦП.

Параметр имя является строкой, по которой можно ссылаться на объект. Она должна быть уникальной. Если указан `-', система изменяемых объектов автоматически сгенерирует строку "varNNNNNN". Она будет уникальной, при условии, что имя не будет указано в этом формате. Команда завершается ошибкой, если найдено повторяющееся имя.

В адресе-кадра может быть задан кадр, в котором должно быть вычислено выражение. `*' указывает, что должен использоваться текущий кадр.

Выражение -- это произвольное выражение, правильное в текущем наборе языков (не должно начинаться со `*'), или одно из следующего:

19.15.4.2 Результат

Эта операция возвращает имя, число потомков и тип созданного объекта. Тип возвращается как строка, как будто она создана GDB CLI:

 name="имя",numchild="N",type="тип"

19.15.5 Команда -var-delete

19.15.5.1 Краткое описание

 -var-delete имя

Удаляет созданный ранее изменяемый объект и всех его потомков.

Возвращает ошибку, если объект с именем имя не найден.

19.15.6 Команда -var-set-format

19.15.6.1 Краткое описание

 -var-set-format имя специф-формата

Устанавливает формат вывода в специф-формата для значения объекта имя.

Синтаксис специф-формата следующий:

 специф-формата ==>
 {binary | decimal | hexadecimal | octal | natural}

19.15.7 Команда -var-show-format

19.15.7.1 Краткое описание

 -var-show-format имя

Возвращает формат, используемый для отображения значений объекта имя.

 формат ==>
 специф-формата

19.15.8 Команда -var-info-num-children

19.15.8.1 Краткое описание

 -var-info-num-children имя

Возвращает число потомков изменяемого объекта с именем имя:

 numchild=n

19.15.9 Команда -var-list-children

19.15.9.1 Краткое описание

 -var-list-children имя

Возвращает список потомков указанного изменяемого объекта:

 numchild=n,children={{name=имя,
 numchild=n,type=тип},(повторяется N раз)}

19.15.10 Команда -var-info-type

19.15.10.1 Краткое описание

 -var-info-type имя

Возвращает тип указанного изменяемого объекта имя. Тип возвращается как строка в том же формате, в котором она выдается GDB CLI:

 type=имя-типа

19.15.11 Команда -var-info-expression

19.15.11.1 Краткое описание

 -var-info-expression имя

Возвращает то, что представляет изменяемый объект с именем имя:

 lang=специф-языка,exp=выражение

где специф-языка есть {"C" | "C++" | "Java"}.

19.15.12 Команда -var-show-attributes

19.15.12.1 Краткое описание

 -var-show-attributes имя

Перечисляет атрибуты заданного изменяемого объекта имя:

 status=атр [ ( ,атр )* ]

где атр есть { { editable | noneditable } | TBD }.

19.15.13 Команда -var-evaluate-expression

19.15.13.1 Краткое описание

 -var-evaluate-expression имя

Вычисляет выражение, которое представлено указанным изменяемым объектом и возвращает его значение в виде строки в текущем формате, определенном для объекта:

 value=значение

19.15.14 Команда -var-assign

19.15.14.1 Краткое описание

 -var-assign имя выражение

Присваивает значение выражения изменяемому объекту, заданному именем. Объект должен быть в состоянии `editable'.

19.15.15 Команда -var-update

19.15.15.1 Краткое описание

 -var-update {имя | "*"}

Обновить значение изменяемого объекта с именем имя путем вычисления его выражения, после получения всех новых значений из памяти или регистров. `*' приводит к обновлению всех существующих изменяемых объектов.


[Содержание]   [Назад]   [Пред]   [Вверх]   [След]   [Вперед]