1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<!-- Copyright (C) 1988-2021 Free Software Foundation, Inc.
4
5Permission is granted to copy, distribute and/or modify this document
6under the terms of the GNU Free Documentation License, Version 1.3 or
7any later version published by the Free Software Foundation; with the
8Invariant Sections being "Free Software" and "Free Software Needs
9Free Documentation", with the Front-Cover Texts being "A GNU Manual,"
10and with the Back-Cover Texts as in (a) below.
11
12(a) The FSF's Back-Cover Text is: "You are free to copy and modify
13this GNU Manual.  Buying copies from GNU Press supports the FSF in
14developing GNU and promoting software freedom." -->
15<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
16<head>
17<title>Debugging with GDB: Hooks</title>
18
19<meta name="description" content="Debugging with GDB: Hooks">
20<meta name="keywords" content="Debugging with GDB: Hooks">
21<meta name="resource-type" content="document">
22<meta name="distribution" content="global">
23<meta name="Generator" content="makeinfo">
24<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
25<link href="index.html#Top" rel="start" title="Top">
26<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
27<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
28<link href="Sequences.html#Sequences" rel="up" title="Sequences">
29<link href="Command-Files.html#Command-Files" rel="next" title="Command Files">
30<link href="Define.html#Define" rel="previous" title="Define">
31<style type="text/css">
32<!--
33a.summary-letter {text-decoration: none}
34blockquote.smallquotation {font-size: smaller}
35div.display {margin-left: 3.2em}
36div.example {margin-left: 3.2em}
37div.indentedblock {margin-left: 3.2em}
38div.lisp {margin-left: 3.2em}
39div.smalldisplay {margin-left: 3.2em}
40div.smallexample {margin-left: 3.2em}
41div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
42div.smalllisp {margin-left: 3.2em}
43kbd {font-style:oblique}
44pre.display {font-family: inherit}
45pre.format {font-family: inherit}
46pre.menu-comment {font-family: serif}
47pre.menu-preformatted {font-family: serif}
48pre.smalldisplay {font-family: inherit; font-size: smaller}
49pre.smallexample {font-size: smaller}
50pre.smallformat {font-family: inherit; font-size: smaller}
51pre.smalllisp {font-size: smaller}
52span.nocodebreak {white-space:nowrap}
53span.nolinebreak {white-space:nowrap}
54span.roman {font-family:serif; font-weight:normal}
55span.sansserif {font-family:sans-serif; font-weight:normal}
56ul.no-bullet {list-style: none}
57-->
58</style>
59
60
61</head>
62
63<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
64<a name="Hooks"></a>
65<div class="header">
66<p>
67Next: <a href="Command-Files.html#Command-Files" accesskey="n" rel="next">Command Files</a>, Previous: <a href="Define.html#Define" accesskey="p" rel="previous">Define</a>, Up: <a href="Sequences.html#Sequences" accesskey="u" rel="up">Sequences</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
68</div>
69<hr>
70<a name="User_002dDefined-Command-Hooks"></a>
71<h4 class="subsection">23.1.2 User-Defined Command Hooks</h4>
72<a name="index-command-hooks"></a>
73<a name="index-hooks_002c-for-commands"></a>
74<a name="index-hooks_002c-pre_002dcommand"></a>
75
76<a name="index-hook"></a>
77<p>You may define <em>hooks</em>, which are a special kind of user-defined
78command.  Whenever you run the command &lsquo;<samp>foo</samp>&rsquo;, if the user-defined
79command &lsquo;<samp>hook-foo</samp>&rsquo; exists, it is executed (with no arguments)
80before that command.
81</p>
82<a name="index-hooks_002c-post_002dcommand"></a>
83<a name="index-hookpost"></a>
84<p>A hook may also be defined which is run after the command you executed.
85Whenever you run the command &lsquo;<samp>foo</samp>&rsquo;, if the user-defined command
86&lsquo;<samp>hookpost-foo</samp>&rsquo; exists, it is executed (with no arguments) after
87that command.  Post-execution hooks may exist simultaneously with
88pre-execution hooks, for the same command.
89</p>
90<p>It is valid for a hook to call the command which it hooks.  If this
91occurs, the hook is not re-executed, thereby avoiding infinite recursion.
92</p>
93
94<a name="index-stop_002c-a-pseudo_002dcommand"></a>
95<p>In addition, a pseudo-command, &lsquo;<samp>stop</samp>&rsquo; exists.  Defining
96(&lsquo;<samp>hook-stop</samp>&rsquo;) makes the associated commands execute every time
97execution stops in your program: before breakpoint commands are run,
98displays are printed, or the stack frame is printed.
99</p>
100<p>For example, to ignore <code>SIGALRM</code> signals while
101single-stepping, but treat them normally during normal execution,
102you could define:
103</p>
104<div class="smallexample">
105<pre class="smallexample">define hook-stop
106handle SIGALRM nopass
107end
108
109define hook-run
110handle SIGALRM pass
111end
112
113define hook-continue
114handle SIGALRM pass
115end
116</pre></div>
117
118<p>As a further example, to hook at the beginning and end of the <code>echo</code>
119command, and to add extra text to the beginning and end of the message,
120you could define:
121</p>
122<div class="smallexample">
123<pre class="smallexample">define hook-echo
124echo &lt;&lt;&lt;---
125end
126
127define hookpost-echo
128echo ---&gt;&gt;&gt;\n
129end
130
131(gdb) echo Hello World
132&lt;&lt;&lt;---Hello World---&gt;&gt;&gt;
133(gdb)
134
135</pre></div>
136
137<p>You can define a hook for any single-word command in <small>GDB</small>, but
138not for command aliases; you should define a hook for the basic command
139name, e.g.  <code>backtrace</code> rather than <code>bt</code>.
140You can hook a multi-word command by adding <code>hook-</code> or
141<code>hookpost-</code> to the last word of the command, e.g.
142&lsquo;<samp>define target hook-remote</samp>&rsquo; to add a hook to &lsquo;<samp>target remote</samp>&rsquo;.
143</p>
144<p>If an error occurs during the execution of your hook, execution of
145<small>GDB</small> commands stops and <small>GDB</small> issues a prompt
146(before the command that you actually typed had a chance to run).
147</p>
148<p>If you try to define a hook which does not match any known command, you
149get a warning from the <code>define</code> command.
150</p>
151<hr>
152<div class="header">
153<p>
154Next: <a href="Command-Files.html#Command-Files" accesskey="n" rel="next">Command Files</a>, Previous: <a href="Define.html#Define" accesskey="p" rel="previous">Define</a>, Up: <a href="Sequences.html#Sequences" accesskey="u" rel="up">Sequences</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
155</div>
156
157
158
159</body>
160</html>
161