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


16. Фиксированные последовательности команд

Кроме команд точки останова (см. раздел 5.1.7 Команды точки останова), GDB предоставляет два способа сохранить последовательности команд для выполнения целиком: определяемые пользователем команды и командные файлы.

16.1 Команды, определяемые пользователем

Команда, определяемая пользователем -- это последовательность команд GDB, которой вы назначаете имя как новой команде. Это осуществляется командой define. Пользовательские команды могут иметь до 10 параметров, разделенных пробелами. Внутри команды пользователя, доступ к параметрам производится посредством $arg0...$arg9. Вот простой пример:

define adder
  print $arg0 + $arg1 + $arg2

Для выполнения команды используйте:

adder 1 2 3

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

define имя-команды
Определить команду с именем имя-команды. Если команда с таким именем уже имеется, у вас запрашивается подтверждение на ее переопределение. Определение команды состоит из других командных строк GDB, которые задаются после команды define. Конец этих команд отмечается строкой, содержащей end.
if
Имеет один аргумент -- вычисляемое выражение. Команда сопровождается последовательностью команд, которые выполняются, если выражение истинно (отлично от нуля). Затем может следовать необязательная строка else, сопровождаемая последовательностью команд, которые выполняются только при ложном значении данного выражения. Конец списка отмечается строкой, содержащей end.
while
Синтаксис подобен if: команда имеет один параметр, который является вычисляемым выражением и должен сопровождаться командами, по одной в строке, которые завершаются end. Выполнение команд повторяется, пока выражение истинно.
document имя-команды
Документирует определенную пользователем команду имя-команды, чтобы к ней можно было обращаться посредством help. Команда имя-команды должна быть определена ранее. Эта команда считывает строки документации точно так же, как define считывает строки определения команды, до строки end. После завершения команды document, написанная вами документация будет отображаться командой help для команды имя-команды. Вы можете использовать команду document неоднократно, чтобы изменить документацию команды. Переопределение команды посредством define не изменяет документации.
help user-defined
Перечислить все определенные пользователем команды, вместе с первой строкой документации (если она есть).
show user
show user имя-команды
Вывести команды GDB, использовавшиеся для определения имя-команды (но не ее документацию). Если имя-команды не задано, вывести содержимое всех определенных пользователем команд.

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

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

16.2 Определяемые пользователем команды-ловушки

Вы можете определять ловушки, которые являются специальным видом определяемых пользователем команд. Всякий раз, когда вы выполняете команду `foo', перед ней выполняется определенная пользователем команда `hook-foo' (без параметров), если она существует.

Также может быть определена ловушка, которая вызывается после выполненной вами команды. Когда вы выполняете команду `foo', после нее вызывается (без аргументов) определенная пользователем команда `hookpost-foo', если она существует. Ловушки, срабатывающие после выполнения команды, могут существовать одновременно с ловушками, вызываемыми до выполнения той же команды.

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

Кроме того, существует псевдокоманда `stop'. Определение (`hook-stop') велит выполняться связанным с ней командам при каждом останове вашей программы: перед выполнением команд точек останова, перед выводом на экран сообщений или кадров стека.

Например, чтобы игнорировать сигналы SIGALRM во время выполнения в пошаговом режиме, но обрабатывать их при нормальном выполнении, вы можете определить:

define hook-stop
handle SIGALRM nopass
end

define hook-run
handle SIGALRM pass
end

define hook-continue
handle SIGLARM pass
end

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

define hook-echo
echo <<<---
end

define hookpost-echo
echo --->>>\n
end

(gdb) echo Hello World
<<<---Hello World--->>>
(gdb)

Вы можете определить ловушку для любой однословной команды GDB, но не для синонимов команды; вам следует определить ловушку для базового имени команды, например, backtrace, но не bt. Если во время выполнения вашей ловушки возникает ошибка, выполнение команд GDB останавливается, и он выдает приглашение (до того, как введенная вами команда начнет выполняться).

Если вы попытаетесь определить ловушку, не соответствующую никакой известной команде, вы получите предупреждение от команды define.

16.3 Командные файлы

Командный файл для GDB -- это файл, состоящий из строк с командами GDB. Такие файлы могут также включать комментарии (строки, начинающиеся с #). Пустая строка в командном файле ничего не делает; она не означает повторение последней команды, как это было бы при вводе с терминала.

Когда вы вызываете GDB, он автоматически выполняет команды из своих файлов инициализации. Это файлы, называющиеся `.gdbinit' в Unix и `gdb.ini' в DOS/Windows. Во время старта, GDB делает следующее:

  1. считывает файл инициализации (если он существует) в вашем домашнем каталоге(18).
  2. Обрабатывает ключи и операнды командной строки.
  3. Считывает файл инициализации (если он существует) в текущем рабочем каталоге.
  4. Считывает командные файлы, заданные с помощью ключа `-x'.

Файл инициализации в вашем домашнем каталоге может устанавливать параметры (такие как `set complaints'), которые влияют на последующую обработку ключей и операндов командной строки. Файлы инициализации не выполняются, если вы используете ключ `-nx' см. раздел 2.1.2 Выбор режимов.

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

Вы также можете запросить выполнение командного файла с помощью команды source:

source имя-файла
Выполнить командный файл имя-файла.

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

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

16.4 Команды для управляемого вывода

Во время выполнения командного файла или определенной пользователем команды нормальный вывод GDB подавляется; единственный появляющийся вывод -- тот, который производится явно командами из определения. В этом разделе описываются три команды, полезные для получения именно такого вывода, который вы хотите.

echo текст
Напечатать текст. Непечатные знаки могут быть включены в текст при помощи экранирующих последовательностей Си, таких как `\n' для перехода на новую строку. Переход на новую строку не печатается, если вы его не укажете. В дополнение к стандартным экранирующим последовательностям Си, обратная косая черта, за которой следует пробел, обозначает пробел. Это полезно для отображения строки с пробелами в начале или конце, поскольку в противном случае начальные и конечные пробелы удаляются из всех аргументов. Чтобы напечатать ` and foo = ', используйте команду `echo \ and foo = \ '. Обратная косая черта в конце текста может использоваться, как и в Си, для продолжения команды на последующие строки. Например,
echo Вот пример текста,\n\
который занимает\n\
несколько строк.\n
производит такой же вывод как
echo Вот пример текста,\n
echo который занимает\n
echo несколько строк.\n
output выражение
Напечатать значение выражения и ничего кроме него: никаких новых строк, никаких `$nn = '. Значение также не заносится в историю значений. См. раздел 8.1 Выражения, для дополнительной информации о выражениях.
output/формат выражение
Вывести значение выражения в формате формат. Вы можете использовать те же форматы, что и для print. См. раздел 8.4 Форматы вывода, для получения большей информации.
printf строка, выражения...
Напечатать значения выражений, причем формат вывода задает строка. Выражения разделяются запятыми и могут быть либо числами, либо указателями. Их значения печатаются так, как определяет строка, в точности, как если бы ваша программа выполняла подпрограмму Си
printf (строка, выражения...);
Например, вы можете напечатать два шестнадцатеричных значения:
printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-foo
Единственые экранирующие последовательности с обратной косой чертой, которые вы можете использовать в строке формата -- простые последовательности, состоящие из обратной косой черты, за которой следует буква.


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