gdb: Hooks
23.1.2 User-defined Command Hooks
---------------------------------
You may define "hooks", which are a special kind of user-defined
command. Whenever you run the command 'foo', if the user-defined
command 'hook-foo' exists, it is executed (with no arguments) before
that command.
A hook may also be defined which is run after the command you
executed. Whenever you run the command 'foo', if the user-defined
command 'hookpost-foo' exists, it is executed (with no arguments) after
that command. Post-execution hooks may exist simultaneously with
pre-execution hooks, for the same command.
It is valid for a hook to call the command which it hooks. If this
occurs, the hook is not re-executed, thereby avoiding infinite
recursion.
In addition, a pseudo-command, 'stop' exists. Defining ('hook-stop')
makes the associated commands execute every time execution stops in your
program: before breakpoint commands are run, displays are printed, or
the stack frame is printed.
For example, to ignore 'SIGALRM' signals while single-stepping, but
treat them normally during normal execution, you could define:
define hook-stop
handle SIGALRM nopass
end
define hook-run
handle SIGALRM pass
end
define hook-continue
handle SIGALRM pass
end
As a further example, to hook at the beginning and end of the 'echo'
command, and to add extra text to the beginning and end of the message,
you could define:
define hook-echo
echo <<<---
end
define hookpost-echo
echo --->>>\n
end
(gdb) echo Hello World
<<<---Hello World--->>>
(gdb)
You can define a hook for any single-word command in GDB, but not for
command aliases; you should define a hook for the basic command name,
e.g. 'backtrace' rather than 'bt'. You can hook a multi-word command by
adding 'hook-' or 'hookpost-' to the last word of the command, e.g.
'define target hook-remote' to add a hook to 'target remote'.
If an error occurs during the execution of your hook, execution of
GDB commands stops and GDB issues a prompt (before the command that you
actually typed had a chance to run).
If you try to define a hook which does not match any known command,
you get a warning from the 'define' command.