Кроме команд точки останова (see section Команды точки останова), GDB предоставляет два способа сохранить последовательности команд для выполнения целиком: определяемые пользователем команды и командные файлы.
define adder print $arg0 + $arg1 + $arg2
Для выполнения команды используйте:
adder 1 2 3
Этот пример определяет команду adder, которая печатает сумму трех своих параметров. Обратите внимание, что параметры являются текстовыми подстановками, так что они могут ссылаться на переменные, использовать сложные выражения или даже выполнять вызовы подчиненных функций.
При выполнении команд, определенных пользователем, команды определения не печатаются. Ошибка в любой из них останавливает выполнение всей определенной пользователем команды.
При использовании в интерактивном режиме, команды, обычно запрашивающие подтверждение, выполняются без запроса, если они используется внутри определенной пользователем команды. Многие команды 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 делает следующее:
Файл инициализации в вашем домашнем каталоге может устанавливать параметры (такие как `set complaints'), которые влияют на последующую обработку ключей и операндов командной строки. Файлы инициализации не выполняются, если вы используете ключ `-nx' see section Выбор режимов.
В некоторых конфигурациях GDB, файлу инициализации присваивается другое имя (обычно это среды, где специализированная форма GDB должна сосуществовать с другими формами, следовательно должно быть отличное имя для файла инициализации специализированной версии). Следующие среды используют специальные имена файлов инициализации:
Вы также можете запросить выполнение командного файла с помощью команды source:
Строки командного файла выполняются последовательно, при этом они не выводятся. Ошибка в любой команде завершает выполнение всего командного файла.
Команды, запрашивающие подтверждение в интерактивном режиме, при выполнении в командном файле выполняются без запросов. Многие команды GDB, обычно выводящие сообщения о своих действиях, опускают эти сообщения при вызове из командных файлов.
Во время выполнения командного файла или определенной пользователем команды, нормальный вывод GDB подавляется; единственый появляющийся вывод---тот, который производится явно командами из определения. В этом разделе описываются три команды, полезные для получения именно такого вывода, который вы хотите.
echo Вот пример текста,\n\ который занимает\n\ несколько строк.\n
echo Вот пример текста,\n echo который занимает\n echo несколько строк.\n
printf (<VAR>строка</VAR>, <VAR>выражения</VAR>...);
printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-foo