Кроме команд точки останова (см. раздел 5.1.7 Команды точки останова), GDB предоставляет два способа сохранить последовательности команд для выполнения целиком: определяемые пользователем команды и командные файлы.
Команда, определяемая пользователем---это последовательность команд
GDB, которой вы назначаете имя, как новой команде. Это
осуществляется командой define
. Пользовательские команды могут иметь
до 10 параметров, разделенных пробелами. Внутри команды пользователя,
доступ к параметрам производится посредством $arg0...$arg9.
Вот простой пример:
define adder print $arg0 + $arg1 + $arg2
Для выполнения команды используйте:
adder 1 2 3
Этот пример определяет команду adder
, которая печатает сумму трех
своих параметров. Обратите внимание, что параметры являются текстовыми
подстановками, так что они могут ссылаться на переменные, использовать
сложные выражения или даже выполнять вызовы подчиненных функций.
define имя-команды
define
. Конец этих команд
отмечается стpокой, содержащей end
.
if
else
, сопровождаемая последовательностью команд, которые
выполняются только при ложном значении данного выражения. Конец списка
отмечается стpокой, содержащей end
.
while
if
: команда имеет один параметр, который
является вычисляемым выражением и должен сопровождаться командами,
по одной в стpоке, которые завершаются end
. Выполнение команд
повторяется, пока выражение истинно.
document имя-команды
help
. Команда
имя-команды должна быть определена ранее. Эта команда
считывает стpоки документации точно так же, как define
считывает стpоки определения команды, до строки end
. После
завершения команды document
, написанная вами документация будет
отображаться командой help
для команды имя-команды.
Вы можете использовать команду document
неоднократно, чтобы
изменить документацию команды. Переопределение команды посредством
define
не изменяет документации.
help user-defined
show user
show user имя-команды
При выполнении команд, определенных пользователем, команды определения не печатаются. Ошибка в любой из них останавливает выполнение всей определенной пользователем команды.
При использовании в интерактивном режиме, команды, обычно запрашивающие подтверждение, выполняются без запроса, если они используется внутри определенной пользователем команды. Многие команды GDB, которые обычно печатают сообщения о своих действиях, опускают их при использовании в команде, определенной пользователем.
Вы можете определять ловушки, которые являются специальным видом определяемых пользователем команд. Всякий раз, когда вы выполняете команду `foo', перед ней выполняется определенная пользователем команда `hook-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
Вы можете определить ловушку для любой однословной команды
GDB, но не для синонимов команды; вам следует определить
ловушку для базового имени команды, например, backtrace
, но не
bt
. Если во время выполнения вашей ловушки возникает ошибка,
выполнение команд GDB останавливается, и
он выдает приглашение (до того, как введенная вами
команда начнет выполняться).
Если вы попытаетесь определить ловушку, не соответствующую никакой
известной команде, вы получите предупреждение от команды define
.
Командный файл для GDB---это файл, состоящий из строк с командами GDB. Такие файлы могут также включать комментарии (строки, начинающиеся с #). Пустая строка в командном файле ничего не делает; она не означает повторение последней команды, как это было бы при вводе с терминала.
Когда вы запускаете GDB, он автоматически выполняет команды из
своих файлов инициализации. Это файлы, называющиеся
`.gdbinit' в Unix или `gdb.ini' в DOS/Windows. Сначала
GDB читает файл инициализации (если он существует) в вашем
домашнем каталоге(17), затем
обрабатывает ключи и операнды командной строки, после чего читает файл
инициализации (если он существует) в текущем рабочем каталоге. Таким
образом, файл инициализации в вашем домашнем каталоге может
устанавливать параметры (такие как set complaints
), которые влияют на
обработку ключей и операндов командной строки. Файлы инициализации не
выполняются, если вы используете ключ `-nx'; см. раздел 2.1.2 Выбор режимов.
В некоторых конфигурациях GDB, файлу инициализации присваивается другое имя (обычно это среды, где специализированная форма GDB должна сосуществовать с другими формами, следовательно должно быть отличное имя для файла инициализации специализированной версии). Следующие среды используют специальные имена файлов инициализации:
Вы также можете запросить выполнение командного файла с помощью команды
source
:
source имя-файла
Строки командного файла выполняются последовательно, при этом они не выводятся. Ошибка в любой команде завершает выполнение всего командного файла.
Команды, запрашивающие подтверждение в интерактивном режиме, при выполнении в командном файле выполняются без запросов. Многие команды GDB, обычно выводящие сообщения о своих действиях, опускают эти сообщения при вызове из командных файлов.
Во время выполнения командного файла или определенной пользователем команды, нормальный вывод GDB подавляется; единственый появляющийся вывод--тот, который производится явно командами из определения. В этом разделе описываются три команды, полезные для получения именно такого вывода, который вы хотите.
echo текст
echo Вот пример текста,\n\ который занимает\n\ несколько строк.\nпроизводит такой же вывод как
echo Вот пример текста,\n echo который занимает\n echo несколько строк.\n
output выражение
output/формат выражение
print
. См. раздел 8.4 Форматы вывода, для получения большей информации.
printf строка, выражения...
printf (строка, выражения...);Например, вы можете напечатать два шестнадцатеричных значения:
printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-fooЕдинственые экранирующие последовательности с обратной косой чертой, которые вы можете использовать в строке формата--простые последовательности, состоящие из обратной косой черты, за которой следует буква.