hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2021 Free Software Foundation, Inc.
 
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Free Software" and "Free Software Needs
Free Documentation", with the Front-Cover Texts being "A GNU Manual,"
and with the Back-Cover Texts as in (a) below.
 
(a) The FSF's Back-Cover Text is: "You are free to copy and modify
this GNU Manual.  Buying copies from GNU Press supports the FSF in
developing GNU and promoting software freedom." -->
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Debugging with GDB: Sample Session</title>
 
<meta name="description" content="Debugging with GDB: Sample Session">
<meta name="keywords" content="Debugging with GDB: Sample Session">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="index.html#Top" rel="up" title="Top">
<link href="Invocation.html#Invocation" rel="next" title="Invocation">
<link href="Contributors.html#Contributors" rel="previous" title="Contributors">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Sample-Session"></a>
<div class="header">
<p>
Next: <a href="Invocation.html#Invocation" accesskey="n" rel="next">Invocation</a>, Previous: <a href="Summary.html#Summary" accesskey="p" rel="previous">Summary</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</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>
</div>
<hr>
<a name="A-Sample-GDB-Session"></a>
<h2 class="chapter">1 A Sample <small>GDB</small> Session</h2>
 
<p>You can use this manual at your leisure to read all about <small>GDB</small>.
However, a handful of commands are enough to get started using the
debugger.  This chapter illustrates those commands.
</p>
 
 
<p>One of the preliminary versions of <small>GNU</small> <code>m4</code> (a generic macro
processor) exhibits the following bug: sometimes, when we change its
quote strings from the default, the commands used to capture one macro
definition within another stop working.  In the following short <code>m4</code>
session, we define a macro <code>foo</code> which expands to <code>0000</code>; we
then use the <code>m4</code> built-in <code>defn</code> to define <code>bar</code> as the
same thing.  However, when we change the open quote string to
<code>&lt;QUOTE&gt;</code> and the close quote string to <code>&lt;UNQUOTE&gt;</code>, the same
procedure fails to define a new synonym <code>baz</code>:
</p>
<div class="smallexample">
<pre class="smallexample">$ <b>cd gnu/m4</b>
$ <b>./m4</b>
<b>define(foo,0000)</b>
 
<b>foo</b>
0000
<b>define(bar,defn(&lsquo;foo&rsquo;))</b>
 
<b>bar</b>
0000
<b>changequote(&lt;QUOTE&gt;,&lt;UNQUOTE&gt;)</b>
 
<b>define(baz,defn(&lt;QUOTE&gt;foo&lt;UNQUOTE&gt;))</b>
<b>baz</b>
<b>Ctrl-d</b>
m4: End of input: 0: fatal error: EOF in string
</pre></div>
 
<p>Let us use <small>GDB</small> to try to see what is going on.
</p>
<div class="smallexample">
<pre class="smallexample">$ <b>gdb m4</b>
GDB is free software and you are welcome to distribute copies
 of it under certain conditions; type &quot;show copying&quot; to see
 the conditions.
There is absolutely no warranty for GDB; type &quot;show warranty&quot;
 for details.
 
GDB 10.2.90.20210621-git, Copyright 1999 Free Software Foundation, Inc...
(gdb)
</pre></div>
 
<p><small>GDB</small> reads only enough symbol data to know where to find the
rest when needed; as a result, the first prompt comes up very quickly.
We now tell <small>GDB</small> to use a narrower display width than usual, so
that examples fit in this manual.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>set width 70</b>
</pre></div>
 
<p>We need to see how the <code>m4</code> built-in <code>changequote</code> works.
Having looked at the source, we know the relevant subroutine is
<code>m4_changequote</code>, so we set a breakpoint there with the <small>GDB</small>
<code>break</code> command.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>break m4_changequote</b>
Breakpoint 1 at 0x62f4: file builtin.c, line 879.
</pre></div>
 
<p>Using the <code>run</code> command, we start <code>m4</code> running under <small>GDB</small>
control; as long as control does not reach the <code>m4_changequote</code>
subroutine, the program runs as usual:
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>run</b>
Starting program: /work/Editorial/gdb/gnu/m4/m4
<b>define(foo,0000)</b>
 
<b>foo</b>
0000
</pre></div>
 
<p>To trigger the breakpoint, we call <code>changequote</code>.  <small>GDB</small>
suspends execution of <code>m4</code>, displaying information about the
context where it stops.
</p>
<div class="smallexample">
<pre class="smallexample"><b>changequote(&lt;QUOTE&gt;,&lt;UNQUOTE&gt;)</b>
 
Breakpoint 1, m4_changequote (argc=3, argv=0x33c70)
    at builtin.c:879
879         if (bad_argc(TOKEN_DATA_TEXT(argv[0]),argc,1,3))
</pre></div>
 
<p>Now we use the command <code>n</code> (<code>next</code>) to advance execution to
the next line of the current function.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>n</b>
882         set_quotes((argc &gt;= 2) ? TOKEN_DATA_TEXT(argv[1])\
 : nil,
</pre></div>
 
<p><code>set_quotes</code> looks like a promising subroutine.  We can go into it
by using the command <code>s</code> (<code>step</code>) instead of <code>next</code>.
<code>step</code> goes to the next line to be executed in <em>any</em>
subroutine, so it steps into <code>set_quotes</code>.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>s</b>
set_quotes (lq=0x34c78 &quot;&lt;QUOTE&gt;&quot;, rq=0x34c88 &quot;&lt;UNQUOTE&gt;&quot;)
    at input.c:530
530         if (lquote != def_lquote)
</pre></div>
 
<p>The display that shows the subroutine where <code>m4</code> is now
suspended (and its arguments) is called a stack frame display.  It
shows a summary of the stack.  We can use the <code>backtrace</code>
command (which can also be spelled <code>bt</code>), to see where we are
in the stack as a whole: the <code>backtrace</code> command displays a
stack frame for each active subroutine.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>bt</b>
#0  set_quotes (lq=0x34c78 &quot;&lt;QUOTE&gt;&quot;, rq=0x34c88 &quot;&lt;UNQUOTE&gt;&quot;)
    at input.c:530
#1  0x6344 in m4_changequote (argc=3, argv=0x33c70)
    at builtin.c:882
#2  0x8174 in expand_macro (sym=0x33320) at macro.c:242
#3  0x7a88 in expand_token (obs=0x0, t=209696, td=0xf7fffa30)
    at macro.c:71
#4  0x79dc in expand_input () at macro.c:40
#5  0x2930 in main (argc=0, argv=0xf7fffb20) at m4.c:195
</pre></div>
 
<p>We step through a few more lines to see what happens.  The first two
times, we can use &lsquo;<samp>s</samp>&rsquo;; the next two times we use <code>n</code> to avoid
falling into the <code>xstrdup</code> subroutine.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>s</b>
0x3b5c  532         if (rquote != def_rquote)
(gdb) <b>s</b>
0x3b80  535         lquote = (lq == nil || *lq == '\0') ?  \
def_lquote : xstrdup(lq);
(gdb) <b>n</b>
536         rquote = (rq == nil || *rq == '\0') ? def_rquote\
 : xstrdup(rq);
(gdb) <b>n</b>
538         len_lquote = strlen(rquote);
</pre></div>
 
<p>The last line displayed looks a little odd; we can examine the variables
<code>lquote</code> and <code>rquote</code> to see if they are in fact the new left
and right quotes we specified.  We use the command <code>p</code>
(<code>print</code>) to see their values.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>p lquote</b>
$1 = 0x35d40 &quot;&lt;QUOTE&gt;&quot;
(gdb) <b>p rquote</b>
$2 = 0x35d50 &quot;&lt;UNQUOTE&gt;&quot;
</pre></div>
 
<p><code>lquote</code> and <code>rquote</code> are indeed the new left and right quotes.
To look at some context, we can display ten lines of source
surrounding the current line with the <code>l</code> (<code>list</code>) command.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>l</b>
533             xfree(rquote);
534
535         lquote = (lq == nil || *lq == '\0') ? def_lquote\
 : xstrdup (lq);
536         rquote = (rq == nil || *rq == '\0') ? def_rquote\
 : xstrdup (rq);
537
538         len_lquote = strlen(rquote);
539         len_rquote = strlen(lquote);
540     }
541
542     void
</pre></div>
 
<p>Let us step past the two lines that set <code>len_lquote</code> and
<code>len_rquote</code>, and then examine the values of those variables.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>n</b>
539         len_rquote = strlen(lquote);
(gdb) <b>n</b>
540     }
(gdb) <b>p len_lquote</b>
$3 = 9
(gdb) <b>p len_rquote</b>
$4 = 7
</pre></div>
 
<p>That certainly looks wrong, assuming <code>len_lquote</code> and
<code>len_rquote</code> are meant to be the lengths of <code>lquote</code> and
<code>rquote</code> respectively.  We can set them to better values using
the <code>p</code> command, since it can print the value of
any expression&mdash;and that expression can include subroutine calls and
assignments.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>p len_lquote=strlen(lquote)</b>
$5 = 7
(gdb) <b>p len_rquote=strlen(rquote)</b>
$6 = 9
</pre></div>
 
<p>Is that enough to fix the problem of using the new quotes with the
<code>m4</code> built-in <code>defn</code>?  We can allow <code>m4</code> to continue
executing with the <code>c</code> (<code>continue</code>) command, and then try the
example that caused trouble initially:
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>c</b>
Continuing.
 
<b>define(baz,defn(&lt;QUOTE&gt;foo&lt;UNQUOTE&gt;))</b>
 
baz
0000
</pre></div>
 
<p>Success!  The new quotes now work just as well as the default ones.  The
problem seems to have been just the two typos defining the wrong
lengths.  We allow <code>m4</code> exit by giving it an EOF as input:
</p>
<div class="smallexample">
<pre class="smallexample"><b>Ctrl-d</b>
Program exited normally.
</pre></div>
 
<p>The message &lsquo;<samp>Program exited normally.</samp>&rsquo; is from <small>GDB</small>; it
indicates <code>m4</code> has finished executing.  We can end our <small>GDB</small>
session with the <small>GDB</small> <code>quit</code> command.
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) <b>quit</b>
</pre></div>
 
<hr>
<div class="header">
<p>
Next: <a href="Invocation.html#Invocation" accesskey="n" rel="next">Invocation</a>, Previous: <a href="Summary.html#Summary" accesskey="p" rel="previous">Summary</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</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>
</div>
 
 
 
</body>
</html>