GDB PDF
GDB PDF
(GDB)
Table of Contents
Summary of gdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Free Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Free Software Needs Free Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Contributors to gdb. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 gdb Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1 Command Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 Command Completion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3 Getting Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
13 Tracepoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
13.1 Commands to Set Tracepoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
13.1.1 Create and Delete Tracepoints . . . . . . . . . . . . . . . . . . . . . . . . . 160
13.1.2 Enable and Disable Tracepoints . . . . . . . . . . . . . . . . . . . . . . . . 162
13.1.3 Tracepoint Passcounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
13.1.4 Tracepoint Conditions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
13.1.5 Trace State Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
13.1.6 Tracepoint Action Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
13.1.7 Listing Tracepoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
13.1.8 Listing Static Tracepoint Markers . . . . . . . . . . . . . . . . . . . . . . 167
13.1.9 Starting and Stopping Trace Experiments . . . . . . . . . . . . . . 168
13.1.10 Tracepoint Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
13.2 Using the Collected Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
13.2.1 tfind n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
13.2.2 tdump. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
13.2.3 save tracepoints filename . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
13.3 Convenience Variables for Tracepoints . . . . . . . . . . . . . . . . . . . . . . . 174
13.4 Using Trace Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Summary of gdb
The purpose of a debugger such as gdb is to allow you to see what is going on “inside”
another program while it executes—or what another program was doing at the moment it
crashed.
gdb can do four main kinds of things (plus other things in support of these) to help you
catch bugs in the act:
• Start your program, specifying anything that might affect its behavior.
• Make your program stop on specified conditions.
• Examine what has happened, when your program has stopped.
• Change things in your program, so you can experiment with correcting the effects of
one bug and go on to learn about another.
You can use gdb to debug programs written in C and C++. For more information, see
Section 15.4 [Supported Languages], page 187. For more information, see Section 15.4.1 [C
and C++], page 187.
Support for D is partial. For information on D, see Section 15.4.2 [D], page 193.
Support for Modula-2 is partial. For information on Modula-2, see Section 15.4.8
[Modula-2], page 196.
Support for OpenCL C is partial. For information on OpenCL C, see Section 15.4.5
[OpenCL C], page 195.
Debugging Pascal programs which use sets, subranges, file variables, or nested functions
does not currently work. gdb does not support entering expressions, printing values, or
similar features using Pascal syntax.
gdb can be used to debug programs written in Fortran, although it may be necessary
to refer to some variables with a trailing underscore.
gdb can be used to debug programs written in Objective-C, using either the Ap-
ple/NeXT or the GNU Objective-C runtime.
Free Software
gdb is free software, protected by the gnu General Public License (GPL). The GPL gives
you the freedom to copy or adapt a licensed program—but every person getting a copy also
gets with it the freedom to modify that copy (which means that they must get access to the
source code), and the freedom to distribute further copies. Typical software companies use
copyrights to limit your freedoms; the Free Software Foundation uses the GPL to preserve
these freedoms.
Fundamentally, the General Public License is a license which says that you have these
freedoms and that you cannot take these freedoms away from anyone else.
texts. Documentation is an essential part of any software package; when an important free
software package does not come with a free manual and a free tutorial, that is a major gap.
We have many such gaps today.
Consider Perl, for instance. The tutorial manuals that people normally use are non-free.
How did this come about? Because the authors of those manuals published them with
restrictive terms—no copying, no modification, source files not available—which exclude
them from the free software world.
That wasn’t the first time this sort of thing happened, and it was far from the last.
Many times we have heard a GNU user eagerly describe a manual that he is writing, his
intended contribution to the community, only to learn that he had ruined everything by
signing a publication contract to make it non-free.
Free documentation, like free software, is a matter of freedom, not price. The problem
with the non-free manual is not that publishers charge a price for printed copies—that in
itself is fine. (The Free Software Foundation sells printed copies of manuals, too.) The
problem is the restrictions on the use of the manual. Free manuals are available in source
code form, and give you permission to copy and modify. Non-free manuals do not allow
this.
The criteria of freedom for a free manual are roughly the same as for free software.
Redistribution (including the normal kinds of commercial redistribution) must be permitted,
so that the manual can accompany every copy of the program, both on-line and on paper.
Permission for modification of the technical content is crucial too. When people mod-
ify the software, adding or changing features, if they are conscientious they will change
the manual too—so they can provide accurate and clear documentation for the modified
program. A manual that leaves you no choice but to write a new manual to document a
changed version of the program is not really available to our community.
Some kinds of limits on the way modification is handled are acceptable. For example,
requirements to preserve the original author’s copyright notice, the distribution terms, or
the list of authors, are ok. It is also no problem to require modified versions to include
notice that they were modified. Even entire sections that may not be deleted or changed
are acceptable, as long as they deal with nontechnical topics (like this one). These kinds of
restrictions are acceptable because they don’t obstruct the community’s normal use of the
manual.
However, it must be possible to modify all the technical content of the manual, and then
distribute the result in all the usual media, through all the usual channels. Otherwise, the
restrictions obstruct the use of the manual, it is not free, and we need another manual to
replace it.
Please spread the word about this issue. Our community continues to lose manuals
to proprietary publishing. If we spread the word that free software needs free reference
manuals and free tutorials, perhaps the next person who wants to contribute by writing
documentation will realize, before it is too late, that only free manuals contribute to the
free software community.
If you are writing documentation, please insist on publishing it under the GNU Free
Documentation License or another free documentation license. Remember that this deci-
sion requires your approval—you don’t have to let the publisher decide. Some commercial
publishers will use a free license if you insist, but they will not propose the option; it is up
Summary of gdb 3
to you to raise the issue and say firmly that this is what you want. If the publisher you
are dealing with refuses, please try other publishers. If you’re not sure whether a proposed
license is free, write to [email protected].
You can encourage commercial publishers to sell more free, copylefted manuals and
tutorials by buying them, and particularly by buying copies from the publishers that paid
for their writing or for major improvements. Meanwhile, try to avoid buying non-free
documentation at all. Check the distribution terms of a manual before you buy it, and
insist that whoever seeks your business must respect your freedom. Check the history of
the book, and try to reward the publishers that have paid or pay the authors to work on it.
The Free Software Foundation maintains a list of free documentation published by other
publishers, at http://www.fsf.org/doc/other-free-books.html.
Contributors to gdb
Richard Stallman was the original author of gdb, and of many other gnu programs. Many
others have contributed to its development. This section attempts to credit major contrib-
utors. One of the virtues of free software is that everyone is free to contribute to it; with
regret, we cannot actually acknowledge everyone here. The file ‘ChangeLog’ in the gdb
distribution approximates a blow-by-blow account.
Changes much prior to version 2.0 are lost in the mists of time.
Plea: Additions to this section are particularly welcome. If you or your friends
(or enemies, to be evenhanded) have been unfairly omitted from this list, we
would like to add your names!
So that they may not regard their many labors as thankless, we particularly thank those
who shepherded gdb through major releases: Andrew Cagney (releases 6.3, 6.2, 6.1, 6.0,
5.3, 5.2, 5.1 and 5.0); Jim Blandy (release 4.18); Jason Molenda (release 4.17); Stan Shebs
(release 4.14); Fred Fish (releases 4.16, 4.15, 4.13, 4.12, 4.11, 4.10, and 4.9); Stu Grossman
and John Gilmore (releases 4.8, 4.7, 4.6, 4.5, and 4.4); John Gilmore (releases 4.3, 4.2, 4.1,
4.0, and 3.9); Jim Kingdon (releases 3.5, 3.4, and 3.3); and Randy Smith (releases 3.2, 3.1,
and 3.0).
Richard Stallman, assisted at various times by Peter TerMaat, Chris Hanson, and
Richard Mlynarik, handled releases through 2.8.
Michael Tiemann is the author of most of the gnu C++ support in gdb, with significant
additional contributions from Per Bothner and Daniel Berlin. James Clark wrote the gnu
C++ demangler. Early work on C++ was by Peter TerMaat (who also did much general
update work leading to release 3.0).
gdb uses the BFD subroutine library to examine multiple object-file formats; BFD was
a joint project of David V. Henkel-Wallace, Rich Pixley, Steve Chamberlain, and John
Gilmore.
David Johnson wrote the original COFF support; Pace Willison did the original support
for encapsulated COFF.
Brent Benson of Harris Computer Systems contributed DWARF 2 support.
Adam de Boor and Bradley Davis contributed the ISI Optimum V support. Per Bothner,
Noboyuki Hikichi, and Alessandro Forin contributed MIPS support. Jean-Daniel Fekete
contributed Sun 386i support. Chris Hanson improved the HP9000 support. Noboyuki
4 Debugging with gdb
Hikichi and Tomoyuki Hasei contributed Sony/News OS 3 support. David Johnson con-
tributed Encore Umax support. Jyrki Kuoppala contributed Altos 3068 support. Jeff
Law contributed HP PA and SOM support. Keith Packard contributed NS32K support.
Doug Rabson contributed Acorn Risc Machine support. Bob Rusk contributed Harris
Nighthawk CX-UX support. Chris Smith contributed Convex support (and Fortran de-
bugging). Jonathan Stone contributed Pyramid support. Michael Tiemann contributed
SPARC support. Tim Tucker contributed support for the Gould NP1 and Gould Powern-
ode. Pace Willison contributed Intel 386 support. Jay Vosburgh contributed Symmetry
support. Marko Mlinar contributed OpenRISC 1000 support.
Andreas Schwab contributed M68K gnu/Linux support.
Rich Schaefer and Peter Schauer helped with support of SunOS shared libraries.
Jay Fenlason and Roland McGrath ensured that gdb and GAS agree about several
machine instruction sets.
Patrick Duval, Ted Goldstein, Vikram Koka and Glenn Engel helped develop remote
debugging. Intel Corporation, Wind River Systems, AMD, and ARM contributed remote
debugging modules for the i960, VxWorks, A29K UDI, and RDI targets, respectively.
Brian Fox is the author of the readline libraries providing command-line editing and
command history.
Andrew Beers of SUNY Buffalo wrote the language-switching code, the Modula-2 sup-
port, and contributed the Languages chapter of this manual.
Fred Fish wrote most of the support for Unix System Vr4. He also enhanced the
command-completion support to cover C++ overloaded symbols.
Hitachi America (now Renesas America), Ltd. sponsored the support for H8/300,
H8/500, and Super-H processors.
NEC sponsored the support for the v850, Vr4xxx, and Vr5xxx processors.
Mitsubishi (now Renesas) sponsored the support for D10V, D30V, and M32R/D proces-
sors.
Toshiba sponsored the support for the TX39 Mips processor.
Matsushita sponsored the support for the MN10200 and MN10300 processors.
Fujitsu sponsored the support for SPARClite and FR30 processors.
Kung Hsu, Jeff Law, and Rick Sladkey added support for hardware watchpoints.
Michael Snyder added support for tracepoints.
Stu Grossman wrote gdbserver.
Jim Kingdon, Peter Schauer, Ian Taylor, and Stu Grossman made nearly innumerable
bug fixes and cleanups throughout gdb.
The following people at the Hewlett-Packard Company contributed support for the PA-
RISC 2.0 architecture, HP-UX 10.20, 10.30, and 11.0 (narrow mode), HP’s implementation
of kernel threads, HP’s aC++ compiler, and the Text User Interface (nee Terminal User
Interface): Ben Krepp, Richard Title, John Bishop, Susan Macchia, Kathy Mann, Satish
Pai, India Paul, Steve Rehrauer, and Elena Zannoni. Kim Haase provided HP-specific
information in this manual.
DJ Delorie ported gdb to MS-DOS, for the DJGPP project. Robert Hoehne made
significant contributions to the DJGPP port.
Summary of gdb 5
Cygnus Solutions has sponsored gdb maintenance and much of its development since
1991. Cygnus engineers who have worked on gdb fulltime include Mark Alexander, Jim
Blandy, Per Bothner, Kevin Buettner, Edith Epstein, Chris Faylor, Fred Fish, Martin
Hunt, Jim Ingham, John Gilmore, Stu Grossman, Kung Hsu, Jim Kingdon, John Metzler,
Fernando Nasser, Geoffrey Noer, Dawn Perchik, Rich Pixley, Zdenek Radouch, Keith Seitz,
Stan Shebs, David Taylor, and Elena Zannoni. In addition, Dave Brolley, Ian Carmichael,
Steve Chamberlain, Nick Clifton, JT Conklin, Stan Cox, DJ Delorie, Ulrich Drepper, Frank
Eigler, Doug Evans, Sean Fagan, David Henkel-Wallace, Richard Henderson, Jeff Holcomb,
Jeff Law, Jim Lemke, Tom Lord, Bob Manson, Michael Meissner, Jason Merrill, Catherine
Moore, Drew Moseley, Ken Raeburn, Gavin Romig-Koch, Rob Savoye, Jamie Smith, Mike
Stump, Ian Taylor, Angela Thomas, Michael Tiemann, Tom Tromey, Ron Unrau, Jim
Wilson, and David Zuhn have made contributions both large and small.
Andrew Cagney, Fernando Nasser, and Elena Zannoni, while working for Cygnus Solu-
tions, implemented the original gdb/mi interface.
Jim Blandy added support for preprocessor macros, while working for Red Hat.
Andrew Cagney designed gdb’s architecture vector. Many people including Andrew
Cagney, Stephane Carrez, Randolph Chung, Nick Duffek, Richard Henderson, Mark Ket-
tenis, Grace Sainsbury, Kei Sakamoto, Yoshinori Sato, Michael Snyder, Andreas Schwab,
Jason Thorpe, Corinna Vinschen, Ulrich Weigand, and Elena Zannoni, helped with the
migration of old architectures to this new framework.
Andrew Cagney completely re-designed and re-implemented gdb’s unwinder framework,
this consisting of a fresh new design featuring frame IDs, independent frame sniffers, and
the sentinel frame. Mark Kettenis implemented the dwarf 2 unwinder, Jeff Johnston the
libunwind unwinder, and Andrew Cagney the dummy, sentinel, tramp, and trad unwinders.
The architecture-specific changes, each involving a complete rewrite of the architecture’s
frame code, were carried out by Jim Blandy, Joel Brobecker, Kevin Buettner, Andrew
Cagney, Stephane Carrez, Randolph Chung, Orjan Friberg, Richard Henderson, Daniel
Jacobowitz, Jeff Johnston, Mark Kettenis, Theodore A. Roth, Kei Sakamoto, Yoshinori
Sato, Michael Snyder, Corinna Vinschen, and Ulrich Weigand.
Christian Zankel, Ross Morley, Bob Wilson, and Maxim Grigoriev from Tensilica, Inc.
contributed support for Xtensa processors. Others who have worked on the Xtensa port of
gdb in the past include Steve Tjiang, John Newlin, and Scott Foehner.
Michael Eager and staff of Xilinx, Inc., contributed support for the Xilinx MicroBlaze
architecture.
Chapter 1: A Sample gdb Session 7
foo
0000
define(bar,defn(‘foo’))
bar
0000
changequote(<QUOTE>,<UNQUOTE>)
define(baz,defn(<QUOTE>foo<UNQUOTE>))
baz
Ctrl-d
m4: End of input: 0: fatal error: EOF in string
Let us use gdb to try to see what is going on.
$ gdb m4
gdb is free software and you are welcome to distribute copies
of it under certain conditions; type "show copying" to see
the conditions.
There is absolutely no warranty for gdb; type "show warranty"
for details.
(gdb) run
Starting program: /work/Editorial/gdb/gnu/m4/m4
define(foo,0000)
foo
0000
To trigger the breakpoint, we call changequote. gdb suspends execution of m4, displaying
information about the context where it stops.
changequote(<QUOTE>,<UNQUOTE>)
The last line displayed looks a little odd; we can examine the variables lquote and rquote
to see if they are in fact the new left and right quotes we specified. We use the command
p (print) to see their values.
(gdb) p lquote
$1 = 0x35d40 "<QUOTE>"
(gdb) p rquote
$2 = 0x35d50 "<UNQUOTE>"
lquote and rquote 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 l (list) command.
(gdb) l
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
Let us step past the two lines that set len_lquote and len_rquote, and then examine the
values of those variables.
(gdb) n
539 len_rquote = strlen(lquote);
(gdb) n
540 }
(gdb) p len lquote
$3 = 9
(gdb) p len rquote
$4 = 7
That certainly looks wrong, assuming len_lquote and len_rquote are meant to be the
lengths of lquote and rquote respectively. We can set them to better values using the p
command, since it can print the value of any expression—and that expression can include
subroutine calls and assignments.
(gdb) p len lquote=strlen(lquote)
$5 = 7
(gdb) p len rquote=strlen(rquote)
$6 = 9
Is that enough to fix the problem of using the new quotes with the m4 built-in defn? We can
allow m4 to continue executing with the c (continue) command, and then try the example
that caused trouble initially:
(gdb) c
Continuing.
define(baz,defn(<QUOTE>foo<UNQUOTE>))
baz
0000
10 Debugging with gdb
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 m4 exit by giving it an
EOF as input:
Ctrl-d
Program exited normally.
The message ‘Program exited normally.’ is from gdb; it indicates m4 has finished execut-
ing. We can end our gdb session with the gdb quit command.
(gdb) quit
Chapter 2: Getting In and Out of gdb 11
-init-command file
-ix file Execute commands from file file before loading the inferior (but after loading
gdbinit files). See Section 2.1.3 [Startup], page 16.
-init-eval-command command
-iex command
Execute a single gdb command before loading the inferior (but after loading
gdbinit files). See Section 2.1.3 [Startup], page 16.
Chapter 2: Getting In and Out of gdb 13
-directory directory
-d directory
Add directory to the path to search for source and script files.
-r
-readnow Read each symbol file’s entire symbol table immediately, rather than the default,
which is to read it incrementally as it is needed. This makes startup slower,
but makes future operations faster.
Batch mode may be useful for running gdb as a filter, for example to download
and run a program on another computer; in order to make this more useful, the
message
Program exited normally.
(which is ordinarily issued whenever a program running under gdb control
terminates) is not issued when running in batch mode.
-batch-silent
Run in batch mode exactly like ‘-batch’, but totally silently. All gdb output to
stdout is prevented (stderr is unaffected). This is much quieter than ‘-silent’
and would be useless for an interactive session.
This is particularly useful when using targets that give ‘Loading section’ mes-
sages, for example.
Note that targets that give their output via gdb, as opposed to writing directly
to stdout, will also be made silent.
-return-child-result
The return code from gdb will be the return code from the child process (the
process being debugged), with the following exceptions:
• gdb exits abnormally. E.g., due to an incorrect argument or an internal
error. In this case the exit code is the same as it would have been without
‘-return-child-result’.
• The user quits with an explicit value. E.g., ‘quit 1’.
• The child process never runs, or is not allowed to terminate, in which case
the exit code will be -1.
This option is useful in conjunction with ‘-batch’ or ‘-batch-silent’, when
gdb is being used as a remote program loader or simulator interface.
-nowindows
-nw “No windows”. If gdb comes with a graphical user interface (GUI) built in,
then this option tells gdb to only use the command-line interface. If no GUI is
available, this option has no effect.
-windows
-w If gdb includes a GUI, then this option requires it to be used if possible.
-cd directory
Run gdb using directory as its working directory, instead of the current direc-
tory.
-data-directory directory
-D directory
Run gdb using directory as its data directory. The data directory is where gdb
searches for its auxiliary files. See Section 18.6 [Data Files], page 245.
-fullname
-f gnu Emacs sets this option when it runs gdb as a subprocess. It tells gdb to
output the full file name and line number in a standard, recognizable fashion
each time a stack frame is displayed (which includes each time your program
Chapter 2: Getting In and Out of gdb 15
stops). This recognizable format looks like two ‘\032’ characters, followed by
the file name, line number and character position separated by colons, and a
newline. The Emacs-to-gdb interface program uses the two ‘\032’ characters
as a signal to display the source code for the frame.
-annotate level
This option sets the annotation level inside gdb. Its effect is identical to using
‘set annotate level’ (see Chapter 28 [Annotations], page 537). The annota-
tion level controls how much information gdb prints together with its prompt,
values of expressions, source lines, and other types of output. Level 0 is the
normal, level 1 is for use when gdb is run as a subprocess of gnu Emacs, level
3 is the maximum annotation suitable for programs that control gdb, and level
2 has been deprecated.
The annotation mechanism has largely been superseded by gdb/mi (see
Chapter 27 [GDB/MI], page 451).
--args Change interpretation of command line so that arguments following the exe-
cutable file are passed as command line arguments to the inferior. This option
stops option processing.
-baud bps
-b bps Set the line speed (baud rate or bits per second) of any serial interface used by
gdb for remote debugging.
-l timeout
Set the timeout (in seconds) of any communication used by gdb for remote
debugging.
-tty device
-t device Run using device for your program’s standard input and output.
-tui Activate the Text User Interface when starting. The Text User Interface man-
ages several text windows on the terminal, showing source, assembly, regis-
ters and gdb command outputs (see Chapter 25 [gdb Text User Interface],
page 443). Do not use this option if you run gdb from Emacs (see Chapter 26
[Using gdb under gnu Emacs], page 449).
-interpreter interp
Use the interpreter interp for interface with the controlling program or device.
This option is meant to be set by programs which communicate with gdb using
it as a back end. See Chapter 24 [Command Interpreters], page 441.
‘--interpreter=mi’ (or ‘--interpreter=mi2’) causes gdb to use the gdb/mi
interface (see Chapter 27 [The gdb/mi Interface], page 451) included since gdb
version 6.0. The previous gdb/mi interface, included in gdb version 5.3 and
selected with ‘--interpreter=mi1’, is deprecated. Earlier gdb/mi interfaces
are no longer supported.
-write Open the executable and core files for both reading and writing. This is equiv-
alent to the ‘set write on’ command inside gdb (see Section 17.6 [Patching],
page 226).
16 Debugging with gdb
-statistics
This option causes gdb to print statistics about time and memory usage after
it completes each command and returns to the prompt.
-version This option causes gdb to print its version number and no-warranty blurb, and
exit.
-configuration
This option causes gdb to print details about its build-time configuration pa-
rameters, and then exit. These details can be important when reporting gdb
bugs (see Chapter 31 [GDB Bugs], page 549).
Init files use the same syntax as command files (see Section 23.1.3 [Command Files],
page 314) and are processed by gdb in the same way. The init file in your home directory
can set options (such as ‘set complaints’) that affect subsequent processing of command
line options and operands. Init files are not executed if you use the ‘-nx’ option (see
Section 2.1.2 [Choosing Modes], page 13).
To display the list of init files loaded by gdb at startup, you can use gdb --help.
The gdb init files are normally called ‘.gdbinit’. The DJGPP port of gdb uses the
name ‘gdb.ini’, due to the limitations of file names imposed by DOS filesystems. The
Windows port of gdb uses the standard name, but if it finds a ‘gdb.ini’ file in your home
directory, it warns you about that and suggests to rename the file to the standard name.
An interrupt (often Ctrl-c) does not exit from gdb, but rather terminates the action
of any gdb command that is in progress and returns to gdb command level. It is safe to
type the interrupt character at any time because gdb does not allow it to take effect until
a time when it is safe.
If you have been using gdb to control an attached process or device, you can release
it with the detach command (see Section 4.7 [Debugging an Already-running Process],
page 32).
shell command-string
!command-string
Invoke a standard shell to execute command-string. Note that no space is
needed between ! and command-string. If it exists, the environment variable
SHELL determines which shell to run. Otherwise gdb uses the default shell
(‘/bin/sh’ on Unix systems, ‘COMMAND.COM’ on MS-DOS, etc.).
The utility make is often needed in development environments. You do not have to use
the shell command for this purpose in gdb:
make make-args
Execute the make program with the specified arguments. This is equivalent to
‘shell make make-args’.
18 Debugging with gdb
3 gdb Commands
You can abbreviate a gdb command to the first few letters of the command name, if that
abbreviation is unambiguous; and you can repeat certain gdb commands by typing just
RET. You can also use the TAB key to get gdb to fill out the rest of a word in a command
(or to show you the alternatives available, if there is more than one possibility).
completion to work in this situation, you may enclose words in ’ (single quote marks) in
gdb commands.
The most likely situation where you might need this is in typing the name of a C++
function. This is because C++ allows function overloading (multiple definitions of the same
function, distinguished by argument type). For example, when you want to set a breakpoint
you may need to distinguish whether you mean the version of name that takes an int
parameter, name(int), or the version that takes a float parameter, name(float). To use
the word-completion facilities in this situation, type a single quote ’ at the beginning of the
function name. This alerts gdb that it may need to consider more information than usual
when you press TAB or M-? to request word completion:
(gdb) b ’bubble( M-?
bubble(double,double) bubble(int,int)
(gdb) b ’bubble(
In some cases, gdb can tell that completing a name requires using quotes. When this
happens, gdb inserts the quote for you (while completing as much as it can) if you do not
type the quote in the first place:
(gdb) b bub TAB
gdb alters your input line to the following, and rings a bell:
(gdb) b ’bubble(
In general, gdb can tell that a quote is needed (and inserts it) if you have not yet started
typing the argument list when you ask for completion on an overloaded symbol.
For more information about overloaded functions, see Section 15.4.1.3 [C++ Expressions],
page 190. You can use the command set overload-resolution off to disable overload
resolution; see Section 15.4.1.7 [gdb Features for C++], page 191.
When completing in an expression which looks up a field in a structure, gdb also tries1
to limit completions to the field names available in the type of the left-hand-side:
(gdb) p gdb_stdout.M-?
magic to_fputs to_rewind
to_data to_isatty to_write
to_delete to_put to_write_async_safe
to_flush to_read
This is because the gdb_stdout is a variable of the type struct ui_file that is defined in
gdb sources as follows:
struct ui_file
{
int *magic;
ui_file_flush_ftype *to_flush;
ui_file_write_ftype *to_write;
ui_file_write_async_safe_ftype *to_write_async_safe;
ui_file_fputs_ftype *to_fputs;
ui_file_read_ftype *to_read;
ui_file_delete_ftype *to_delete;
ui_file_isatty_ftype *to_isatty;
ui_file_rewind_ftype *to_rewind;
ui_file_put_ftype *to_put;
void *to_data;
}
1
The completer can be confused by certain kinds of invalid expressions. Also, it only examines the static
type of the expression, not the dynamic type.
22 Debugging with gdb
help
h You can use help (abbreviated h) with no arguments to display a short list of
named classes of commands:
(gdb) help
List of classes of commands:
help class
Using one of the general help classes as an argument, you can get a list of the
individual commands in that class. For example, here is the help display for
the class status:
(gdb) help status
Status inquiries.
List of commands:
help command
With a command name as help argument, gdb displays a short paragraph on
how to use that command.
Chapter 3: gdb Commands 23
apropos args
The apropos command searches through all of the gdb commands, and their
documentation, for the regular expression specified in args. It prints out all
matches found. For example:
apropos alias
results in:
alias -- Define a new command that is an alias of an existing command
aliases -- Aliases of other commands
d -- Delete some breakpoints or auto-display expressions
del -- Delete some breakpoints or auto-display expressions
delete -- Delete some breakpoints or auto-display expressions
complete args
The complete args command lists all the possible completions for the begin-
ning of a command. Use args to specify the beginning of the command you
want completed. For example:
complete i
results in:
if
ignore
info
inspect
This is intended for use by gnu Emacs.
In addition to help, you can use the gdb commands info and show to inquire about
the state of your program, or the state of gdb itself. Each command supports many topics
of inquiry; this manual introduces each of them in the appropriate context. The listings
under info and under show in the Command, Variable, and Function Index point to all the
sub-commands. See [Command and Variable Index], page 733.
info This command (abbreviated i) is for describing the state of your program. For
example, you can show the arguments passed to a function with info args,
list the registers currently in use with info registers, or list the breakpoints
you have set with info breakpoints. You can get a complete list of the info
sub-commands with help info.
set You can assign the result of an expression to an environment variable with set.
For example, you can set the gdb prompt to a $-sign with set prompt $.
show In contrast to info, show is for describing the state of gdb itself. You can
change most of the things you can show, by using the related command set;
for example, you can control what number system is used for displays with set
radix, or simply inquire which is currently in use with show radix.
To display all the settable parameters and their current values, you can use
show with no arguments; you may also use info set. Both commands produce
the same display.
Here are several miscellaneous show subcommands, all of which are exceptional in lacking
corresponding set commands:
24 Debugging with gdb
show version
Show what version of gdb is running. You should include this information in
gdb bug-reports. If multiple versions of gdb are in use at your site, you may
need to determine which version of gdb you are running; as gdb evolves, new
commands are introduced, and old ones may wither away. Also, many system
vendors ship variant versions of gdb, and there are variant versions of gdb in
gnu/Linux distributions as well. The version number is the same as the one
announced when you start gdb.
show copying
info copying
Display information about permission for copying gdb.
show warranty
info warranty
Display the gnu “NO WARRANTY” statement, or a warranty, if your version
of gdb comes with one.
show configuration
Display detailed information about the way gdb was configured when it was
built. This displays the optional arguments passed to the ‘configure’ script
and also configuration parameters detected automatically by configure. When
reporting a gdb bug (see Chapter 31 [GDB Bugs], page 549), it is important
to include this information in your report.
Chapter 4: Running Programs Under gdb 25
When you run a program under gdb, you must first generate debugging information when
you compile it.
You may start gdb with its arguments, if any, in an environment of your choice. If you
are doing native debugging, you may redirect your program’s input and output, debug an
already running process, or kill a child process.
To request debugging information, specify the ‘-g’ option when you run the compiler.
Programs that are to be shipped to your customers are compiled with optimizations,
using the ‘-O’ compiler option. However, some compilers are unable to handle the ‘-g’ and
‘-O’ options together. Using those compilers, you cannot generate optimized executables
containing debugging information.
gcc, the gnu C/C++ compiler, supports ‘-g’ with or without ‘-O’, making it possible
to debug optimized code. We recommend that you always use ‘-g’ whenever you compile
a program. You may think your program is correct, but there is no sense in pushing your
luck. For more information, see Chapter 11 [Optimized Code], page 151.
Older versions of the gnu C compiler permitted a variant option ‘-gg’ for debugging
information. gdb no longer supports this format; if your gnu C compiler has this option,
do not use it.
gdb knows about preprocessor macros and can show you their expansion (see Chapter 12
[Macros], page 155). Most compilers do not include information about preprocessor macros
in the debugging information if you specify the ‘-g’ flag alone. Version 3.1 and later of gcc,
the gnu C compiler, provides macro information if you are using the DWARF debugging
format, and specify the option ‘-g3’.
See Section “Options for Debugging Your Program or GCC” in Using the gnu Compiler
Collection (GCC), for more information on gcc options affecting debug information.
You will have the best debugging experience if you use the latest version of the DWARF
debugging format that your compiler supports. DWARF is currently the most expressive
and best supported debugging format in gdb.
26 Debugging with gdb
When you issue the run command, your program begins to execute immediately. See
Chapter 5 [Stopping and Continuing], page 45, for discussion of how to arrange for your
program to stop. Once your program has stopped, you may call functions in your program,
using the print or call commands. See Chapter 10 [Examining Data], page 109.
If the modification time of your symbol file has changed since the last time gdb read its
symbols, gdb discards its symbol table, and reads it again. When it does this, gdb tries to
retain your current breakpoints.
start The name of the main procedure can vary from language to language. With
C or C++, the main procedure name is always main, but other languages such
as Ada do not require a specific name for their main procedure. The debugger
provides a convenient way to start the execution of the program and to stop at
the beginning of the main procedure, depending on the language used.
The ‘start’ command does the equivalent of setting a temporary breakpoint
at the beginning of the main procedure and then invoking the ‘run’ command.
Some programs contain an elaboration phase where some startup code is exe-
cuted before the main procedure is called. This depends on the languages used
to write your program. In C++, for instance, constructors for static and global
objects are executed before main is called. It is therefore possible that the
debugger stops before reaching the main procedure. However, the temporary
breakpoint will remain to halt execution.
Specify the arguments to give to your program as arguments to the ‘start’
command. These arguments will be given verbatim to the underlying ‘run’
command. Note that the same arguments will be reused if no argument is
provided during subsequent calls to ‘start’ or ‘run’.
It is sometimes necessary to debug the program during elaboration. In these
cases, using the start command would stop the execution of your program
too late, as the program would have already completed the elaboration phase.
Under these circumstances, insert breakpoints in your elaboration code before
running your program.
set exec-wrapper wrapper
show exec-wrapper
unset exec-wrapper
When ‘exec-wrapper’ is set, the specified wrapper is used to launch programs
for debugging. gdb starts your program with a shell command of the form exec
wrapper program. Quoting is added to program and its arguments, but not to
wrapper, so you should add quotes if appropriate for your shell. The wrapper
runs until it executes your program, and then gdb takes control.
You can use any program that eventually calls execve with its arguments as
a wrapper. Several standard Unix utilities do this, e.g. env and nohup. Any
Unix shell script ending with exec "$@" will also work.
For example, you can use env to pass an environment variable to the debugged
program, without setting the variable in your shell’s environment:
(gdb) set exec-wrapper env ’LD_PRELOAD=libtest.so’
(gdb) run
28 Debugging with gdb
In case you connected explicitly to the native target, gdb remains connected
even if all inferiors exit, ready for the next run command. Use the disconnect
command to disconnect.
Examples of other commands that likewise respect the auto-connect-native-
target setting: attach, info proc, info os.
set disable-randomization
set disable-randomization on
This option (enabled by default in gdb) will turn off the native randomiza-
tion of the virtual address space of the started program. This option is useful
for multiple debugging sessions to make the execution better reproducible and
memory addresses reusable across debugging sessions.
This feature is implemented only on certain targets, including gnu/Linux. On
gnu/Linux you can get the same behavior using
(gdb) set exec-wrapper setarch ‘uname -m‘ -R
When you use attach, the debugger finds the program running in the process first by
looking in the current working directory, then (if the program is not found) by using the
source file search path (see Section 9.5 [Specifying Source Directories], page 102). You can
also use the file command to load the program. See Section 18.1 [Commands to Specify
Files], page 231.
The first thing gdb does after arranging to debug the specified process is to stop it. You
can examine and modify an attached process with all the gdb commands that are ordinarily
available when you start processes with run. You can insert breakpoints; you can step and
continue; you can modify storage. If you would rather the process continue running, you
may use the continue command after attaching gdb to the process.
detach When you have finished debugging the attached process, you can use the detach
command to release it from gdb control. Detaching the process continues its
execution. After the detach command, that process and gdb become com-
pletely independent once more, and you are ready to attach another process
or start one with run. detach does not repeat if you press RET again after
executing the command.
If you exit gdb while you have an attached process, you detach that process. If you use
the run command, you kill that process. By default, gdb asks for confirmation if you try
to do either of these things; you can control whether or not you need to confirm by using
the set confirm command (see Section 22.8 [Optional Warnings and Messages], page 305).
some embedded targets may have several inferiors running in different parts of a single
address space. Each inferior may in turn have multiple threads running in it.
To find out what inferiors exist at any moment, use info inferiors:
info inferiors
Print a list of all inferiors currently being managed by gdb.
gdb displays for each inferior (in this order):
1. the inferior number assigned by gdb
2. the target system’s inferior identifier
3. the name of the executable the inferior is running.
An asterisk ‘*’ preceding the gdb inferior number indicates the current inferior.
For example,
(gdb) info inferiors
Num Description Executable
2 process 2307 hello
* 1 process 3401 goodbye
To switch focus between inferiors, use the inferior command:
inferior infno
Make inferior number infno the current inferior. The argument infno is the infe-
rior number assigned by gdb, as shown in the first field of the ‘info inferiors’
display.
You can get multiple executables into a debugging session via the add-inferior and
clone-inferior commands. On some systems gdb can add inferiors to the debug session
automatically by following calls to fork and exec. To remove inferiors from the debugging
session use the remove-inferiors command.
add-inferior [ -copies n ] [ -exec executable ]
Adds n inferiors to be run using executable as the executable; n defaults to 1.
If no executable is specified, the inferiors begins empty, with no program. You
can still assign or change the program assigned to the inferior at any time by
using the file command with the executable name as its argument.
clone-inferior [ -copies n ] [ infno ]
Adds n inferiors ready to execute the same program as inferior infno; n defaults
to 1, and infno defaults to the number of the current inferior. This is a conve-
nient command when you want to run another instance of the inferior you are
debugging.
(gdb) info inferiors
Num Description Executable
* 1 process 29964 helloworld
(gdb) clone-inferior
Added inferior 2.
1 inferiors added.
(gdb) info inferiors
Num Description Executable
2 <null> helloworld
* 1 process 29964 helloworld
You can now simply switch focus to inferior 2 and run it.
Chapter 4: Running Programs Under gdb 35
remove-inferiors infno...
Removes the inferior or inferiors infno . . . . It is not possible to remove an
inferior that is running with this command. For those, use the kill or detach
command first.
To quit debugging one of the running inferiors that is not the current inferior, you
can either detach from it by using the detach inferior command (allowing it to run
independently), or kill it using the kill inferiors command:
detach inferior infno...
Detach from the inferior or inferiors identified by gdb inferior number(s)
infno . . . . Note that the inferior’s entry still stays on the list of inferiors shown
by info inferiors, but its Description will show ‘<null>’.
kill inferiors infno...
Kill the inferior or inferiors identified by gdb inferior number(s) infno . . . .
Note that the inferior’s entry still stays on the list of inferiors shown by info
inferiors, but its Description will show ‘<null>’.
After the successful completion of a command such as detach, detach inferiors, kill
or kill inferiors, or after a normal process exit, the inferior is still valid and listed with
info inferiors, ready to be restarted.
To be notified when inferiors are started or exit under gdb’s control use
set print inferior-events:
set print inferior-events
set print inferior-events on
set print inferior-events off
The set print inferior-events command allows you to enable or disable
printing of messages when gdb notices that new inferiors have started or that
inferiors have exited or have been detached. By default, these messages will
not be printed.
show print inferior-events
Show whether messages will be printed when gdb detects that inferiors have
started, exited or have been detached.
Many commands will work the same with multiple programs as with a single program:
e.g., print myglobal will simply display the value of myglobal in the current inferior.
Occasionaly, when debugging gdb itself, it may be useful to get more info about the
relationship of inferiors, programs, address spaces in a debug session. You can do that with
the maint info program-spaces command.
maint info program-spaces
Print a list of all program spaces currently being managed by gdb.
gdb displays for each program space (in this order):
1. the program space number assigned by gdb
2. the name of the executable loaded into the program space, with e.g., the
file command.
36 Debugging with gdb
An asterisk ‘*’ preceding the gdb program space number indicates the current
program space.
In addition, below each program space line, gdb prints extra information that
isn’t suitable to display in tabular form. For example, the list of inferiors bound
to the program space.
(gdb) maint info program-spaces
Id Executable
2 goodbye
Bound inferiors: ID 1 (process 21561)
* 1 hello
Here we can see that no inferior is running the program hello, while process
21561 is running the program goodbye. On some targets, it is possible that
multiple inferiors are bound to the same program space. The most common
example is that of debugging both the parent and child processes of a vfork
call. For example,
(gdb) maint info program-spaces
Id Executable
* 1 vfork-test
Bound inferiors: ID 2 (process 18050), ID 1 (process 18045)
Here, both inferior 2 and inferior 1 are running in the same program space as
a result of inferior 1 having executed a vfork call.
(gdb) thread 2
[Switching to thread 2 (Thread 0xb7fdab70 (LWP 12747))]
#0 some_function (ignore=0x0) at example.c:8
8 printf ("hello\n");
As with the ‘[New ...]’ message, the form of the text after ‘Switching to’
depends on your system’s conventions for identifying threads.
The debugger convenience variable ‘$_thread’ contains the number of the cur-
rent thread. You may find this useful in writing breakpoint conditional ex-
pressions, command scripts, and so forth. See See Section 10.11 [Convenience
Variables], page 132, for general information on convenience variables.
thread apply [threadno | all [-ascending]] command
The thread apply command allows you to apply the named command to one
or more threads. Specify the numbers of the threads that you want affected
with the command argument threadno. It can be a single thread number, one
of the numbers shown in the first field of the ‘info threads’ display; or it could
be a range of thread numbers, as in 2-4. To apply a command to all threads
in descending order, type thread apply all command. To apply a command to
all threads in ascending order, type thread apply all -ascending command.
thread name [name]
This command assigns a name to the current thread. If no argument is given,
any existing user-specified name is removed. The thread name appears in the
‘info threads’ display.
On some systems, such as gnu/Linux, gdb is able to determine the name of
the thread as given by the OS. On these systems, a name specified with ‘thread
name’ will override the system-give name, and removing the user-specified name
will cause gdb to once again display the system-specified name.
thread find [regexp]
Search for and display thread ids whose name or systag matches the supplied
regular expression.
As well as being the complement to the ‘thread name’ command, this command
also allows you to identify a thread by its target systag. For instance, on
gnu/Linux, the target systag is the LWP id.
(gdb) thread find 26688
Thread 4 has target id ’Thread 0x41e02940 (LWP 26688)’
(gdb) info thread 4
Id Target Id Frame
4 Thread 0x41e02940 (LWP 26688) 0x00000031ca6cd372 in select ()
in any code which the child then executes, the child will get a SIGTRAP signal which (unless
it catches the signal) will cause it to terminate.
However, if you want to debug the child process there is a workaround which isn’t too
painful. Put a call to sleep in the code which the child process executes after the fork. It
may be useful to sleep only if a certain environment variable is set, or a certain file exists,
so that the delay need not occur when you don’t want to run gdb on the child. While the
child is sleeping, use the ps program to get its process ID. Then tell gdb (a new invocation
of gdb if you are also debugging the parent process) to attach to the child process (see
Section 4.7 [Attach], page 32). From that point on you can debug the child process just like
any other process which you attached to.
On some systems, gdb provides support for debugging programs that create additional
processes using the fork or vfork functions. Currently, the only platforms with this feature
are HP-UX (11.x and later only?) and gnu/Linux (kernel version 2.5.60 and later).
By default, when a program forks, gdb will continue to debug the parent process and
the child process will run unimpeded.
If you want to follow the child process instead of the parent process, use the command
set follow-fork-mode.
set follow-fork-mode mode
Set the debugger response to a program call of fork or vfork. A call to fork
or vfork creates a new process. The mode argument can be:
parent The original process is debugged after a fork. The child process
runs unimpeded. This is the default.
child The new process is debugged after a fork. The parent process runs
unimpeded.
show follow-fork-mode
Display the current debugger response to a fork or vfork call.
On Linux, if you want to debug both the parent and child processes, use the command
set detach-on-fork.
set detach-on-fork mode
Tells gdb whether to detach one of the processes after a fork, or retain debugger
control over them both.
on The child process (or parent process, depending on the value of
follow-fork-mode) will be detached and allowed to run indepen-
dently. This is the default.
off Both processes will be held under the control of gdb. One process
(child or parent, depending on the value of follow-fork-mode) is
debugged as usual, while the other is held suspended.
show detach-on-fork
Show whether detach-on-fork mode is on/off.
If you choose to set ‘detach-on-fork’ mode off, then gdb will retain control of all forked
processes (including nested forks). You can list the forked processes under the control of gdb
Chapter 4: Running Programs Under gdb 41
by using the info inferiors command, and switch from one fork to another by using the
inferior command (see Section 4.9 [Debugging Multiple Inferiors and Programs], page 33).
To quit debugging one of the forked processes, you can either detach from it by using
the detach inferiors command (allowing it to run independently), or kill it using the
kill inferiors command. See Section 4.9 [Debugging Multiple Inferiors and Programs],
page 33.
If you ask to debug a child process and a vfork is followed by an exec, gdb executes
the new target up to the first breakpoint in the new target. If you have a breakpoint set on
main in your original program, the breakpoint will also be set on the child process’s main.
On some systems, when a child process is spawned by vfork, you cannot debug the child
or parent until an exec call completes.
If you issue a run command to gdb after an exec call executes, the new target restarts.
To restart the parent process, use the file command with the parent executable name
as its argument. By default, after an exec call executes, gdb discards the symbols of the
previous executable image. You can change this behaviour with the set follow-exec-mode
command.
set follow-exec-mode mode
Set debugger response to a program call of exec. An exec call replaces the
program image of a process.
follow-exec-mode can be:
new gdb creates a new inferior and rebinds the process to this new
inferior. The program the process was running before the exec call
can be restarted afterwards by restarting the original inferior.
For example:
(gdb) info inferiors
(gdb) info inferior
Id Description Executable
* 1 <null> prog1
(gdb) run
process 12020 is executing new program: prog2
Program exited normally.
(gdb) info inferiors
Id Description Executable
* 2 <null> prog2
1 <null> prog1
same gdb keeps the process bound to the same inferior. The new exe-
cutable image replaces the previous executable loaded in the infe-
rior. Restarting the inferior after the exec call, with e.g., the run
command, restarts the executable the process was running after the
exec call. This is the default mode.
For example:
(gdb) info inferiors
Id Description Executable
* 1 <null> prog1
(gdb) run
process 12020 is executing new program: prog2
Program exited normally.
42 Debugging with gdb
You can use the catch command to make gdb stop whenever a fork, vfork, or exec
call is made. See Section 5.1.3 [Setting Catchpoints], page 55.
Returning to a previously saved checkpoint will restore the user state of the program
being debugged, plus a significant subset of the system (OS) state, including file pointers. It
won’t “un-write” data from a file, but it will rewind the file pointer to the previous location,
so that the previously written data can be overwritten. For files opened in read mode, the
pointer will also be restored so that the previously read data can be read again.
Of course, characters that have been sent to a printer (or other external device) cannot
be “snatched back”, and characters received from eg. a serial device can be removed from
internal program buffers, but they cannot be “pushed back” into the serial pipeline, ready
to be received again. Similarly, the actual contents of files that have been changed cannot
be restored (at this time).
However, within those constraints, you actually can “rewind” your program to a previ-
ously saved point in time, and begin debugging it again — and you can change the course
of events so as to debug a different execution path this time.
Finally, there is one bit of internal program state that will be different when you return
to a checkpoint — the program’s process id. Each checkpoint will have a unique process id
(or pid), and each will be different from the program’s original pid. If your program has
saved a local copy of its process id, this could potentially pose a problem.
is automatically deleted after the first time your program stops there. See
Section 5.1.5 [Disabling Breakpoints], page 59.
hbreak args
Set a hardware-assisted breakpoint. The args are the same as for the break
command and the breakpoint is set in the same way, but the breakpoint re-
quires hardware support and some target hardware may not have this support.
The main purpose of this is EPROM/ROM code debugging, so you can set
a breakpoint at an instruction without changing the instruction. This can be
used with the new trap-generation provided by SPARClite DSU and most x86-
based targets. These targets will generate traps when a program accesses some
data or instruction address that is assigned to the debug registers. However
the hardware breakpoint registers can take a limited number of breakpoints.
For example, on the DSU, only two data breakpoints can be set at a time, and
gdb will reject this command if more than two are used. Delete or disable
unused hardware breakpoints before setting new ones (see Section 5.1.5 [Dis-
abling Breakpoints], page 59). See Section 5.1.6 [Break Conditions], page 60.
For remote targets, you can restrict the number of hardware breakpoints gdb
will use, see [set remote hardware-breakpoint-limit], page 259.
thbreak args
Set a hardware-assisted breakpoint enabled only for one stop. The args are the
same as for the hbreak command and the breakpoint is set in the same way.
However, like the tbreak command, the breakpoint is automatically deleted
after the first time your program stops there. Also, like the hbreak command,
the breakpoint requires hardware support and some target hardware may not
have this support. See Section 5.1.5 [Disabling Breakpoints], page 59. See also
Section 5.1.6 [Break Conditions], page 60.
rbreak regex
Set breakpoints on all functions matching the regular expression regex. This
command sets an unconditional breakpoint on all matches, printing a list of all
breakpoints it set. Once these breakpoints are set, they are treated just like the
breakpoints set with the break command. You can delete them, disable them,
or make them conditional the same way as any other breakpoint.
The syntax of the regular expression is the standard one used with tools like
‘grep’. Note that this is different from the syntax used by shells, so for instance
foo* matches all functions that include an fo followed by zero or more os. There
is an implicit .* leading and trailing the regular expression you supply, so to
match only functions that begin with foo, use ^foo.
When debugging C++ programs, rbreak is useful for setting breakpoints on
overloaded functions that are not members of any special classes.
The rbreak command can be used to set breakpoints in all the functions in a
program, like this:
(gdb) rbreak .
48 Debugging with gdb
rbreak file:regex
If rbreak is called with a filename qualification, it limits the search for functions
matching the given regular expression to the specified file. This can be used,
for example, to set breakpoints on every function in a given file:
(gdb) rbreak file.c:.
The colon separating the filename qualifier from the regex may optionally be
surrounded by spaces.
info breakpoints [n...]
info break [n...]
Print a table of all breakpoints, watchpoints, and catchpoints set and not
deleted. Optional argument n means print information only about the spec-
ified breakpoint(s) (or watchpoint(s) or catchpoint(s)). For each breakpoint,
following columns are printed:
Breakpoint Numbers
Type Breakpoint, watchpoint, or catchpoint.
Disposition
Whether the breakpoint is marked to be disabled or deleted when
hit.
Enabled or Disabled
Enabled breakpoints are marked with ‘y’. ‘n’ marks breakpoints
that are not enabled.
Address Where the breakpoint is in your program, as a memory address.
For a pending breakpoint whose address is not yet known, this
field will contain ‘<PENDING>’. Such breakpoint won’t fire until a
shared library that has the symbol or line referred by breakpoint is
loaded. See below for details. A breakpoint with several locations
will have ‘<MULTIPLE>’ in this field—see below for details.
What Where the breakpoint is in the source for your program, as a file and
line number. For a pending breakpoint, the original string passed
to the breakpoint command will be listed as it cannot be resolved
until the appropriate shared library is loaded in the future.
If a breakpoint is conditional, there are two evaluation modes: “host” and
“target”. If mode is “host”, breakpoint condition evaluation is done by gdb on
the host’s side. If it is “target”, then the condition is evaluated by the target.
The info break command shows the condition on the line following the affected
breakpoint, together with its condition evaluation mode in between parentheses.
Breakpoint commands, if any, are listed after that. A pending breakpoint is
allowed to have a condition specified for it. The condition is not parsed for
validity until a shared library is loaded that allows the pending breakpoint to
resolve to a valid location.
info break with a breakpoint number n as argument lists only that break-
point. The convenience variable $_ and the default examining-address for the
x command are set to the address of the last breakpoint listed (see Section 10.6
[Examining Memory], page 117).
Chapter 5: Stopping and Continuing 49
info break displays a count of the number of times the breakpoint has been
hit. This is especially useful in conjunction with the ignore command. You
can ignore a large number of breakpoint hits, look at the breakpoint info to see
how many times the breakpoint was hit, and then run again, ignoring one less
than that number. This will get you quickly to the last hit of that breakpoint.
For a breakpoints with an enable count (xref) greater than 1, info break also
displays that count.
gdb allows you to set any number of breakpoints at the same place in your program.
There is nothing silly or meaningless about this. When the breakpoints are conditional,
this is even useful (see Section 5.1.6 [Break Conditions], page 60).
It is possible that a breakpoint corresponds to several locations in your program. Ex-
amples of this situation are:
• Multiple functions in the program may have the same name.
• For a C++ constructor, the gcc compiler generates several instances of the function
body, used in different cases.
• For a C++ template function, a given line in the function can correspond to any number
of instantiations.
• For an inlined function, a given source line can correspond to several places where that
function is inlined.
In all those cases, gdb will insert a breakpoint at all the relevant locations.
A breakpoint with multiple locations is displayed in the breakpoint table using several
rows—one header row, followed by one row for each breakpoint location. The header row
has ‘<MULTIPLE>’ in the address column. The rows for individual locations contain the
actual addresses for locations, and show the functions to which those locations belong. The
number column for a location is of the form breakpoint-number.location-number.
For example:
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
stop only if i==1
breakpoint already hit 1 time
1.1 y 0x080486a2 in void foo<int>() at t.cc:8
1.2 y 0x080486ca in void foo<double>() at t.cc:8
Each location can be individually enabled or disabled by passing breakpoint-
number.location-number as argument to the enable and disable commands. Note that
you cannot delete the individual locations from the list, you can only delete the entire
list of locations that belong to their parent breakpoint (with the delete num command,
where num is the number of the parent breakpoint, 1 in the above example). Disabling
or enabling the parent breakpoint (see Section 5.1.5 [Disabling], page 59) affects all of the
locations that belong to that breakpoint.
It’s quite common to have a breakpoint inside a shared library. Shared libraries can
be loaded and unloaded explicitly, and possibly repeatedly, as the program is executed.
To support this use case, gdb updates breakpoint locations whenever any shared library
is loaded or unloaded. Typically, you would set a breakpoint in a shared library at the
beginning of your debugging session, when the library is not loaded, and when the symbols
50 Debugging with gdb
from the library are not available. When you try to set breakpoint, gdb will ask you if you
want to set a so called pending breakpoint—breakpoint whose address is not yet resolved.
After the program is run, whenever a new shared library is loaded, gdb reevaluates all the
breakpoints. When a newly loaded shared library contains the symbol or line referred to by
some pending breakpoint, that breakpoint is resolved and becomes an ordinary breakpoint.
When a library is unloaded, all breakpoints that refer to its symbols or source lines become
pending again.
This logic works for breakpoints with multiple locations, too. For example, if you have
a breakpoint in a C++ template function, and a newly loaded shared library has an instan-
tiation of that template, a new location is added to the list of locations for the breakpoint.
Except for having unresolved address, pending breakpoints do not differ from regular
breakpoints. You can set conditions or commands, enable and disable them and perform
other breakpoint operations.
gdb provides some additional commands for controlling what happens when the ‘break’
command cannot resolve breakpoint address specification to an address:
set breakpoint pending auto
This is the default behavior. When gdb cannot find the breakpoint location,
it queries you whether a pending breakpoint should be created.
set breakpoint pending on
This indicates that an unrecognized breakpoint location should automatically
result in a pending breakpoint being created.
set breakpoint pending off
This indicates that pending breakpoints are not to be created. Any unrecog-
nized breakpoint location results in an error. This setting does not affect any
pending breakpoints previously created.
show breakpoint pending
Show the current behavior setting for creating pending breakpoints.
The settings above only affect the break command and its variants. Once breakpoint is
set, it will be automatically updated as shared libraries are loaded and unloaded.
For some targets, gdb can automatically decide if hardware or software breakpoints
should be used, depending on whether the breakpoint address is read-only or read-write.
This applies to breakpoints set with the break command as well as to internal breakpoints
set by commands like next and finish. For breakpoints set with hbreak, gdb will always
use hardware breakpoints.
You can control this automatic behaviour with the following commands::
set breakpoint auto-hw on
This is the default behavior. When gdb sets a breakpoint, it will try to use the
target memory map to decide if software or hardware breakpoint must be used.
set breakpoint auto-hw off
This indicates gdb should not automatically select breakpoint type. If the
target provides a memory map, gdb will warn when trying to set software
breakpoint at a read-only address.
Chapter 5: Stopping and Continuing 51
gdb normally implements breakpoints by replacing the program code at the breakpoint
address with a special instruction, which, when executed, given control to the debugger.
By default, the program code is so modified only when the program is resumed. As soon as
the program stops, gdb restores the original instructions. This behaviour guards against
leaving breakpoints inserted in the target should gdb abrubptly disconnect. However, with
slow remote targets, inserting and removing breakpoint can reduce the performance. This
behavior can be controlled with the following commands::
set breakpoint always-inserted off
All breakpoints, including newly added by the user, are inserted in the target
only when the target is resumed. All breakpoints are removed from the target
when it stops. This is the default mode.
set breakpoint always-inserted on
Causes all breakpoints to be inserted in the target at all times. If the user adds
a new breakpoint, or changes an existing breakpoint, the breakpoints in the
target are updated immediately. A breakpoint is removed from the target only
when breakpoint itself is deleted.
gdb handles conditional breakpoints by evaluating these conditions when a breakpoint
breaks. If the condition is true, then the process being debugged stops, otherwise the process
is resumed.
If the target supports evaluating conditions on its end, gdb may download the break-
point, together with its conditions, to it.
This feature can be controlled via the following commands:
set breakpoint condition-evaluation host
This option commands gdb to evaluate the breakpoint conditions on the host’s
side. Unconditional breakpoints are sent to the target which in turn receives
the triggers and reports them back to GDB for condition evaluation. This is
the standard evaluation mode.
set breakpoint condition-evaluation target
This option commands gdb to download breakpoint conditions to the target at
the moment of their insertion. The target is responsible for evaluating the con-
ditional expression and reporting breakpoint stop events back to gdb whenever
the condition is true. Due to limitations of target-side evaluation, some condi-
tions cannot be evaluated there, e.g., conditions that depend on local data that
is only known to the host. Examples include conditional expressions involving
convenience variables, complex types that cannot be handled by the agent ex-
pression parser and expressions that are too long to be sent over to the target,
specially when the target is a remote system. In these cases, the conditions will
be evaluated by gdb.
set breakpoint condition-evaluation auto
This is the default mode. If the target supports evaluating breakpoint condi-
tions on its end, gdb will download breakpoint conditions to the target (limi-
tations mentioned previously apply). If the target does not support breakpoint
condition evaluation, then gdb will fallback to evaluating all these conditions
on the host’s side.
52 Debugging with gdb
gdb itself sometimes sets breakpoints in your program for special purposes, such as
proper handling of longjmp (in C programs). These internal breakpoints are assigned
negative numbers, starting with -1; ‘info breakpoints’ does not display them. You can
see these breakpoints with the gdb maintenance command ‘maint info breakpoints’ (see
[maint info breakpoints], page 589).
exception
An Ada exception being raised. If an exception name is specified
at the end of the command (eg catch exception Program_Error),
the debugger will stop only when this specific exception is raised.
Otherwise, the debugger stops execution when any Ada exception
is raised.
When inserting an exception catchpoint on a user-defined exception
whose name is identical to one of the exceptions defined by the lan-
guage, the fully qualified name must be used as the exception name.
Otherwise, gdb will assume that it should stop on the pre-defined
exception rather than the user-defined one. For instance, assum-
ing an exception called Constraint_Error is defined in package
Pck, then the command to use to catch such exceptions is catch
exception Pck.Constraint_Error.
exception unhandled
An exception that was raised but is not handled by the program.
assert A failed Ada assertion.
exec A call to exec. This is currently only available for HP-UX and
gnu/Linux.
syscall
syscall [name | number] ...
A call to or return from a system call, a.k.a. syscall. A syscall is a
mechanism for application programs to request a service from the
operating system (OS) or one of the OS system services. gdb can
catch some or all of the syscalls issued by the debuggee, and show
the related information for each syscall. If no argument is specified,
calls to and returns from all system calls will be caught.
name can be any system call name that is valid for the underlying
OS. Just what syscalls are valid depends on the OS. On GNU and
Unix systems, you can find the full list of valid syscall names on
‘/usr/include/asm/unistd.h’.
Normally, gdb knows in advance which syscalls are valid for each
OS, so you can use the gdb command-line completion facilities (see
Section 3.2 [command completion], page 19) to list the available
choices.
You may also specify the system call numerically. A syscall’s num-
ber is the value passed to the OS’s syscall dispatcher to identify
the requested service. When you specify the syscall by its name,
gdb uses its database of syscalls to convert the name into the cor-
responding numeric code, but using the number directly may be
useful if gdb’s database does not have the complete list of syscalls
on your system (e.g., because gdb lags behind the OS upgrades).
The example below illustrates how this command works if you don’t
provide arguments to it:
Chapter 5: Stopping and Continuing 57
• Enabled. The breakpoint stops your program. A breakpoint set with the break com-
mand starts out in this state.
• Disabled. The breakpoint has no effect on your program.
• Enabled once. The breakpoint stops your program, but then becomes disabled.
• Enabled for a count. The breakpoint stops your program for the next N times, then
becomes disabled.
• Enabled for deletion. The breakpoint stops your program, but immediately after it
does so it is deleted permanently. A breakpoint set with the tbreak command starts
out in this state.
You can use the following commands to enable or disable breakpoints, watchpoints, and
catchpoints:
disable [breakpoints] [range...]
Disable the specified breakpoints—or all breakpoints, if none are listed. A
disabled breakpoint has no effect but is not forgotten. All options such as
ignore-counts, conditions and commands are remembered in case the breakpoint
is enabled again later. You may abbreviate disable as dis.
enable [breakpoints] [range...]
Enable the specified breakpoints (or all defined breakpoints). They become
effective once again in stopping your program.
enable [breakpoints] once range...
Enable the specified breakpoints temporarily. gdb disables any of these break-
points immediately after stopping your program.
enable [breakpoints] count count range...
Enable the specified breakpoints temporarily. gdb records count with each of
the specified breakpoints, and decrements a breakpoint’s count when it is hit.
When any count reaches 0, gdb disables that breakpoint. If a breakpoint has
an ignore count (see Section 5.1.6 [Break Conditions], page 60), that will be
decremented to 0 before count is affected.
enable [breakpoints] delete range...
Enable the specified breakpoints to work once, then die. gdb deletes any of
these breakpoints as soon as your program stops there. Breakpoints set by the
tbreak command start out in this state.
Except for a breakpoint set with tbreak (see Section 5.1.1 [Setting Breakpoints],
page 46), breakpoints that you set are initially enabled; subsequently, they become
disabled or enabled only when you use one of the commands above. (The command until
can set and delete a breakpoint of its own, but it does not change the state of your other
breakpoints; see Section 5.2 [Continuing and Stepping], page 68.)
a condition evaluates the expression each time your program reaches it, and your program
stops only if the condition is true.
This is the converse of using assertions for program validation; in that situation, you
want to stop when the assertion is violated—that is, when the condition is false. In C, if
you want to test an assertion expressed by the condition assert, you should set the condition
‘! assert’ on the appropriate breakpoint.
Conditions are also accepted for watchpoints; you may not need them, since a watchpoint
is inspecting the value of an expression anyhow—but it might be simpler, say, to just set a
watchpoint on a variable name, and specify a condition that tests whether the new value is
an interesting one.
Break conditions can have side effects, and may even call functions in your program. This
can be useful, for example, to activate functions that log program progress, or to use your
own print functions to format special data structures. The effects are completely predictable
unless there is another enabled breakpoint at the same address. (In that case, gdb might
see the other breakpoint first and stop your program without checking the condition of
this one.) Note that breakpoint commands are usually more convenient and flexible than
break conditions for the purpose of performing side effects when a breakpoint is reached
(see Section 5.1.7 [Breakpoint Command Lists], page 62).
Breakpoint conditions can also be evaluated on the target’s side if the target supports
it. Instead of evaluating the conditions locally, gdb encodes the expression into an agent
expression (see Appendix F [Agent Expressions], page 663) suitable for execution on the
target, independently of gdb. Global variables become raw memory locations, locals become
stack accesses, and so forth.
In this case, gdb will only be notified of a breakpoint trigger when its condition evaluates
to true. This mechanism may provide faster response times depending on the performance
characteristics of the target since it does not need to keep gdb informed about every break-
point trigger, even those with false conditions.
Break conditions can be specified when a breakpoint is set, by using ‘if’ in the arguments
to the break command. See Section 5.1.1 [Setting Breakpoints], page 46. They can also be
changed at any time with the condition command.
You can also use the if keyword with the watch command. The catch command does
not recognize the if keyword; condition is the only way to impose a further condition on
a catchpoint.
condition bnum expression
Specify expression as the break condition for breakpoint, watchpoint, or catch-
point number bnum. After you set a condition, breakpoint bnum stops your
program only if the value of expression is true (nonzero, in C). When you
use condition, gdb checks expression immediately for syntactic correctness,
and to determine whether symbols in it have referents in the context of your
breakpoint. If expression uses symbols not referenced in the context of the
breakpoint, gdb prints an error message:
No symbol "foo" in current context.
gdb does not actually evaluate expression at the time the condition command
(or a command that sets a breakpoint with a condition, like break if ...) is
given, however. See Section 10.1 [Expressions], page 111.
62 Debugging with gdb
condition bnum
Remove the condition from breakpoint number bnum. It becomes an ordinary
unconditional breakpoint.
A special case of a breakpoint condition is to stop only when the breakpoint has been
reached a certain number of times. This is so useful that there is a special way to do it,
using the ignore count of the breakpoint. Every breakpoint has an ignore count, which is
an integer. Most of the time, the ignore count is zero, and therefore has no effect. But if
your program reaches a breakpoint whose ignore count is positive, then instead of stopping,
it just decrements the ignore count by one and continues. As a result, if the ignore count
value is n, the breakpoint does not stop the next n times your program reaches it.
ignore bnum count
Set the ignore count of breakpoint number bnum to count. The next count
times the breakpoint is reached, your program’s execution does not stop; other
than to decrement the ignore count, gdb takes no action.
To make the breakpoint stop the next time it is reached, specify a count of zero.
When you use continue to resume execution of your program from a break-
point, you can specify an ignore count directly as an argument to continue,
rather than using ignore. See Section 5.2 [Continuing and Stepping], page 68.
If a breakpoint has a positive ignore count and a condition, the condition is
not checked. Once the ignore count reaches zero, gdb resumes checking the
condition.
You could achieve the effect of the ignore count with a condition such as
‘$foo-- <= 0’ using a debugger convenience variable that is decremented each
time. See Section 10.11 [Convenience Variables], page 132.
Ignore counts apply to breakpoints, watchpoints, and catchpoints.
Pressing RET as a means of repeating the last gdb command is disabled within a
command-list.
You can use breakpoint commands to start your program up again. Simply use the
continue command, or step, or any other command that resumes execution.
Any other commands in the command list, after a command that resumes execution, are
ignored. This is because any time you resume execution (even with a simple next or step),
you may encounter another breakpoint—which could have its own command list, leading
to ambiguities about which list to execute.
If the first command you specify in a command list is silent, the usual message about
stopping at a breakpoint is not printed. This may be desirable for breakpoints that are
to print a specific message and then continue. If none of the remaining commands print
anything, you see no sign that the breakpoint was reached. silent is meaningful only at
the beginning of a breakpoint command list.
The commands echo, output, and printf allow you to print precisely controlled output,
and are often useful in silent breakpoints. See Section 23.1.4 [Commands for Controlled
Output], page 315.
For example, here is how you could use breakpoint commands to print the value of x at
entry to foo whenever x is positive.
break foo if x>0
commands
silent
printf "x is %d\n",x
cont
end
One application for breakpoint commands is to compensate for one bug so you can test
for another. Put a breakpoint just after the erroneous line of code, give it a condition
to detect the case in which something erroneous has been done, and give it commands to
assign correct values to any variables that need them. End with the continue command so
that your program does not stop, and start with the silent command so that no output
is produced. Here is an example:
break 403
commands
silent
set x = y + 4
cont
end
If you are doing remote debugging with a stub or agent, you can also ask to have the
printf handled by the remote agent. In addition to ensuring that the output goes to the
remote program’s device along with any other output the program might produce, you can
also ask that the dprintf remain active even after disconnecting from the remote target.
Using the stub/agent is also more efficient, as it can do everything without needing to
communicate with gdb.
dprintf location,template,expression[,expression...]
Whenever execution reaches location, print the values of one or more expressions
under the control of the string template. To print several values, separate them
with commas.
set dprintf-style style
Set the dprintf output to be handled in one of several different styles enumerated
below. A change of style affects all existing dynamic printfs immediately. (If
you need individual control over the print commands, simply define normal
breakpoints with explicitly-supplied command lists.)
gdb Handle the output using the gdb printf command.
call Handle the output by calling a function in your program (normally printf).
agent Have the remote debugging agent (such as gdbserver) handle the output itself.
This style is only available for agents that support running commands on the
target.
set dprintf-function function
Set the function to call if the dprintf style is call. By default its value is
printf. You may set it to any expression. that gdb can evaluate to a function,
as per the call command.
set dprintf-channel channel
Set a “channel” for dprintf. If set to a non-empty value, gdb will evaluate it as
an expression and pass the result as a first argument to the dprintf-function,
in the manner of fprintf and similar functions. Otherwise, the dprintf format
string will be the first argument, in the manner of printf.
As an example, if you wanted dprintf output to go to a logfile that is a standard
I/O stream assigned to the variable mylog, you could do the following:
(gdb) set dprintf-style call
(gdb) set dprintf-function fprintf
(gdb) set dprintf-channel mylog
(gdb) dprintf 25,"at line 25, glob=%d\n",glob
Dprintf 1 at 0x123456: file main.c, line 25.
(gdb) info break
1 dprintf keep y 0x00123456 in main at main.c:25
call (void) fprintf (mylog,"at line 25, glob=%d\n",glob)
continue
(gdb)
Note that the info break displays the dynamic printf commands as normal
breakpoint commands; you can thus easily see the effect of the variable settings.
Chapter 5: Stopping and Continuing 65
set disconnected-dprintf on
set disconnected-dprintf off
Choose whether dprintf commands should continue to run if gdb has discon-
nected from the target. This only applies if the dprintf-style is agent.
show disconnected-dprintf off
Show the current choice for disconnected dprintf.
gdb does not check the validity of function and channel, relying on you to supply values
that are meaningful for the contexts in which they are being used. For instance, the function
and channel may be the values of local variables, but if that is the case, then all enabled
dynamic prints must be at locations within the scope of those locals. If evaluation fails,
gdb will report an error.
other method (e.g., break file:line), then gdb will not automatically set the semaphore.
DTrace probes do not support semaphores.
You can examine the available static static probes using info probes, with optional
arguments:
info probes [type] [provider [name [objfile]]]
If given, type is either stap for listing SystemTap probes or dtrace for listing
DTrace probes. If omitted all probes are listed regardless of their types.
If given, provider is a regular expression used to match against provider names
when selecting which probes to list. If omitted, probes by all probes from all
providers are listed.
If given, name is a regular expression to match against probe names when
selecting which probes to list. If omitted, probe names are not considered when
deciding whether to display them.
If given, objfile is a regular expression used to select which object files (exe-
cutable or shared libraries) to examine. If not given, all object files are consid-
ered.
info probes all
List the available static probes, from all types.
Some probe points can be enabled and/or disabled. The effect of enabling or disabling
a probe depends on the type of probe being handled. Some DTrace probes can be enabled
or disabled, but SystemTap probes cannot be disabled.
You can enable (or disable) one or more probes using the following commands, with
optional arguments:
enable probes [provider [name [objfile]]]
If given, provider is a regular expression used to match against provider names
when selecting which probes to enable. If omitted, all probes from all providers
are enabled.
If given, name is a regular expression to match against probe names when
selecting which probes to enable. If omitted, probe names are not considered
when deciding whether to enable them.
If given, objfile is a regular expression used to select which object files (exe-
cutable or shared libraries) to examine. If not given, all object files are consid-
ered.
disable probes [provider [name [objfile]]]
See the enable probes command above for a description of the optional argu-
ments accepted by this command.
A probe may specify up to twelve arguments. These are available at the point at which
the probe is defined—that is, when the current PC is at the probe’s location. The argu-
ments are available using the convenience variables (see Section 10.11 [Convenience Vars],
page 132) $_probe_arg0. . . $_probe_arg11. In SystemTap probes each probe argument is
an integer of the appropriate size; types are not preserved. In DTrace probes types are
preserved provided that they are recognized as such by gdb; otherwise the value of the
Chapter 5: Stopping and Continuing 67
probe argument will be a long integer. The convenience variable $_probe_argc holds the
number of arguments at the current probe point.
These variables are always available, but attempts to access them at any location other
than a probe point will cause gdb to give an error message.
This message is printed when you attempt to resume the program, since only then gdb
knows exactly how many hardware breakpoints and watchpoints it needs to insert.
When this message is printed, you need to disable or remove some of the hardware-
assisted breakpoints and watchpoints, and then continue.
Such warnings are printed both for user settable and gdb’s internal breakpoints. If you
see one of these warnings, you should verify that a breakpoint set at the adjusted address
will have the desired affect. If not, the breakpoint in question may be removed and other
breakpoints may be set which will have the desired behavior. E.g., it may be sufficient to
place the breakpoint at a later instruction. A conditional breakpoint may also be useful in
some cases to prevent the breakpoint from triggering too often.
gdb will also issue a warning when stopping at one of these adjusted breakpoints:
warning: Breakpoint 1 address previously adjusted from 0x00010414
to 0x00010410.
When this warning is encountered, it may be too late to take remedial action except in
cases where the breakpoint is hit earlier or more frequently than expected.
68 Debugging with gdb
continue [ignore-count]
c [ignore-count]
fg [ignore-count]
Resume program execution, at the address where your program last stopped;
any breakpoints set at that address are bypassed. The optional argument
ignore-count allows you to specify a further number of times to ignore a break-
point at this location; its effect is like that of ignore (see Section 5.1.6 [Break
Conditions], page 60).
The argument ignore-count is meaningful only when your program stopped due
to a breakpoint. At other times, the argument to continue is ignored.
The synonyms c and fg (for foreground, as the debugged program is deemed
to be the foreground program) are provided purely for convenience, and have
exactly the same behavior as continue.
To resume execution at a different place, you can use return (see Section 17.4 [Returning
from a Function], page 224) to go back to the calling function; or jump (see Section 17.2
[Continuing at a Different Address], page 222) to go to an arbitrary location in your program.
A typical technique for using stepping is to set a breakpoint (see Section 5.1 [Breakpoints;
Watchpoints; and Catchpoints], page 45) at the beginning of the function or the section
of your program where a problem is believed to lie, run your program until it stops at
that breakpoint, and then step through the suspect area, examining the variables that are
interesting, until you see the problem happen.
step Continue running your program until control reaches a different source line,
then stop it and return control to gdb. This command is abbreviated s.
Warning: If you use the step command while control is within
a function that was compiled without debugging information, ex-
ecution proceeds until control reaches a function that does have
debugging information. Likewise, it will not step into a function
which is compiled without debugging information. To step through
functions without debugging information, use the stepi command,
described below.
The step command only stops at the first instruction of a source line. This pre-
vents the multiple stops that could otherwise occur in switch statements, for
loops, etc. step continues to stop if a function that has debugging information
is called within the line. In other words, step steps inside any functions called
within the line.
Chapter 5: Stopping and Continuing 69
Also, the step command only enters a function if there is line number infor-
mation for the function. Otherwise it acts like the next command. This avoids
problems when using cc -gl on MIPS machines. Previously, step entered sub-
routines if there was any debugging information about the routine.
step count
Continue running as in step, but do so count times. If a breakpoint is reached,
or a signal not related to stepping occurs before count steps, stepping stops
right away.
next [count]
Continue to the next source line in the current (innermost) stack frame. This
is similar to step, but function calls that appear within the line of code are
executed without stopping. Execution stops when control reaches a different
line of code at the original stack level that was executing when you gave the
next command. This command is abbreviated n.
An argument count is a repeat count, as for step.
The next command only stops at the first instruction of a source line. This
prevents multiple stops that could otherwise occur in switch statements, for
loops, etc.
set step-mode
set step-mode on
The set step-mode on command causes the step command to stop at the first
instruction of a function which contains no debug line information rather than
stepping over it.
This is useful in cases where you may be interested in inspecting the machine
instructions of a function which has no symbolic info and do not want gdb to
automatically skip over this function.
set step-mode off
Causes the step command to step over any functions which contains no debug
information. This is the default.
show step-mode
Show whether gdb will stop in or step over functions without source line debug
information.
finish Continue running until just after function in the selected stack frame returns.
Print the returned value (if any). This command can be abbreviated as fin.
Contrast this with the return command (see Section 17.4 [Returning from a
Function], page 224).
until
u Continue running until a source line past the current line, in the current stack
frame, is reached. This command is used to avoid single stepping through a loop
more than once. It is like the next command, except that when until encoun-
ters a jump, it automatically continues execution until the program counter is
greater than the address of the jump.
70 Debugging with gdb
This means that when you reach the end of a loop after single stepping though
it, until makes your program continue execution until it exits the loop. In con-
trast, a next command at the end of a loop simply steps back to the beginning
of the loop, which forces you to step through the next iteration.
until always stops your program if it attempts to exit the current stack frame.
until may produce somewhat counterintuitive results if the order of machine
code does not match the order of the source lines. For example, in the following
excerpt from a debugging session, the f (frame) command shows that execution
is stopped at line 206; yet when we use until, we get to line 195:
(gdb) f
#0 main (argc=4, argv=0xf7fffae8) at m4.c:206
206 expand_input();
(gdb) until
195 for ( ; argc > 0; NEXTARG) {
This happened because, for execution efficiency, the compiler had generated
code for the loop closure test at the end, rather than the start, of the loop—
even though the test in a C for-loop is written before the body of the loop.
The until command appeared to step back to the beginning of the loop when
it advanced to this expression; however, it has not really gone to an earlier
statement—not in terms of the actual machine code.
until with no argument works by means of single instruction stepping, and
hence is slower than until with an argument.
until location
u location
Continue running your program until either the specified location is reached,
or the current stack frame returns. The location is any of the forms described
in Section 9.2 [Specify Location], page 100. This form of the command uses
temporary breakpoints, and hence is quicker than until without an argument.
The specified location is actually reached only if it is in the current frame. This
implies that until can be used to skip over recursive function invocations. For
instance in the code below, if the current location is line 96, issuing until 99
will execute the program up to line 99 in the same invocation of factorial, i.e.,
after the inner invocations have returned.
94 int factorial (int value)
95 {
96 if (value > 1) {
97 value *= factorial (value - 1);
98 }
99 return (value);
100 }
advance location
Continue running the program up to the given location. An argument is re-
quired, which should be of one of the forms described in Section 9.2 [Specify
Location], page 100. Execution will also stop upon exit from the current stack
frame. This command is similar to until, but advance will not skip over re-
cursive function calls, and the target location doesn’t have to be in the same
frame as the current one.
Chapter 5: Stopping and Continuing 71
stepi
stepi arg
si Execute one machine instruction, then stop and return to the debugger.
It is often useful to do ‘display/i $pc’ when stepping by machine instructions.
This makes gdb automatically display the next instruction to be executed, each
time your program stops. See Section 10.7 [Automatic Display], page 120.
An argument is a repeat count, as in step.
nexti
nexti arg
ni Execute one machine instruction, but if it is a function call, proceed until the
function returns.
An argument is a repeat count, as in next.
By default, and if available, gdb makes use of target-assisted range stepping. In other
words, whenever you use a stepping command (e.g., step, next), gdb tells the target to
step the corresponding range of instruction addresses instead of issuing multiple single-steps.
This speeds up line stepping, particularly for remote targets. Ideally, there should be no
reason you would want to turn range stepping off. However, it’s possible that a bug in the
debug info, a bug in the remote stub (for remote targets), or even a bug in gdb could make
line stepping behave incorrectly when target-assisted range stepping is enabled. You can
use the following command to turn off range stepping if necessary:
set range-stepping
show range-stepping
Control whether range stepping is enabled.
If on, and the target supports it, gdb tells the target to step a range of addresses
itself, instead of issuing multiple single-steps. If off, gdb always issues single-
steps, even if range stepping is supported by the target. The default is on.
You can also instruct gdb to skip all functions in a file, with, for example, skip file
boring.c.
skip [linespec]
skip function [linespec]
After running this command, the function named by linespec or the function
containing the line named by linespec will be skipped over when stepping. See
Section 9.2 [Specify Location], page 100.
If you do not specify linespec, the function you’re currently debugging will be
skipped.
(If you have a function called file that you want to skip, use skip function
file.)
skip file [filename]
After running this command, any function whose source lives in filename will
be skipped over when stepping.
If you do not specify filename, functions whose source lives in the file you’re
currently debugging will be skipped.
Skips can be listed, deleted, disabled, and enabled, much like breakpoints. These are
the commands for managing your list of skips:
info skip [range]
Print details about the specified skip(s). If range is not specified, print a table
with details about all functions and files marked for skipping. info skip prints
the following information about each skip:
Identifier A number identifying this skip.
Type The type of this skip, either ‘function’ or ‘file’.
Enabled or Disabled
Enabled skips are marked with ‘y’. Disabled skips are marked with
‘n’.
Address For function skips, this column indicates the address in memory
of the function being skipped. If you’ve set a function skip on
a function which has not yet been loaded, this field will contain
‘<PENDING>’. Once a shared library which has the function is
loaded, info skip will show the function’s address here.
What For file skips, this field contains the filename being skipped. For
functions skips, this field contains the function name and its line
number in the file where it is defined.
skip delete [range]
Delete the specified skip(s). If range is not specified, delete all skips.
skip enable [range]
Enable the specified skip(s). If range is not specified, enable all skips.
skip disable [range]
Disable the specified skip(s). If range is not specified, disable all skips.
Chapter 5: Stopping and Continuing 73
5.4 Signals
A signal is an asynchronous event that can happen in a program. The operating system
defines the possible kinds of signals, and gives each kind a name and a number. For example,
in Unix SIGINT is the signal a program gets when you type an interrupt character (often
Ctrl-c); SIGSEGV is the signal a program gets from referencing a place in memory far
away from all the areas in use; SIGALRM occurs when the alarm clock timer goes off (which
happens only if your program has requested an alarm).
Some signals, including SIGALRM, are a normal part of the functioning of your program.
Others, such as SIGSEGV, indicate errors; these signals are fatal (they kill your program
immediately) if the program has not specified in advance some other way to handle the
signal. SIGINT does not indicate an error in your program, but it is normally fatal so it can
carry out the purpose of the interrupt: to kill the program.
gdb has the ability to detect any occurrence of a signal in your program. You can tell
gdb in advance what to do for each kind of signal.
Normally, gdb is set up to let the non-erroneous signals like SIGALRM be silently passed
to your program (so as not to interfere with their role in the program’s functioning) but to
stop your program immediately whenever an error signal happens. You can change these
settings with the handle command.
info signals
info handle
Print a table of all the kinds of signals and how gdb has been told to handle
each one. You can use this to see the signal numbers of all the defined types of
signals.
info signals sig
Similar, but print information only about the specified signal number.
info handle is an alias for info signals.
catch signal [signal... | ‘all’]
Set a catchpoint for the indicated signals. See Section 5.1.3 [Set Catchpoints],
page 55, for details about this command.
handle signal [keywords...]
Change the way gdb handles signal signal. The signal can be the number of a
signal or its name (with or without the ‘SIG’ at the beginning); a list of signal
numbers of the form ‘low-high’; or the word ‘all’, meaning all the known
signals. Optional arguments keywords, described below, say what change to
make.
The keywords allowed by the handle command can be abbreviated. Their full names
are:
nostop gdb should not stop your program when this signal happens. It may still print
a message telling you that the signal has come in.
stop gdb should stop your program when this signal happens. This implies the
print keyword as well.
print gdb should print a message when this signal happens.
74 Debugging with gdb
noprint gdb should not mention the occurrence of the signal at all. This implies the
nostop keyword as well.
pass
noignore gdb should allow your program to see this signal; your program can handle the
signal, or else it may terminate if the signal is fatal and not handled. pass and
noignore are synonyms.
nopass
ignore gdb should not allow your program to see this signal. nopass and ignore are
synonyms.
When a signal stops your program, the signal is not visible to the program until you
continue. Your program sees the signal then, if pass is in effect for the signal in question
at that time. In other words, after gdb reports a signal, you can use the handle command
with pass or nopass to control whether your program sees that signal when you continue.
The default is set to nostop, noprint, pass for non-erroneous signals such as SIGALRM,
SIGWINCH and SIGCHLD, and to stop, print, pass for the erroneous signals.
You can also use the signal command to prevent your program from seeing a signal, or
cause it to see a signal it normally would not see, or to give it any signal at any time. For
example, if your program stopped due to some sort of memory reference error, you might
store correct values into the erroneous variables and continue, hoping to see more execution;
but your program would probably terminate immediately as a result of the fatal signal once
it saw the signal. To prevent this, you can continue with ‘signal 0’. See Section 17.3
[Giving your Program a Signal], page 223.
gdb optimizes for stepping the mainline code. If a signal that has handle nostop and
handle pass set arrives while a stepping command (e.g., stepi, step, next) is in progress,
gdb lets the signal handler run and then resumes stepping the mainline code once the signal
handler returns. In other words, gdb steps over the signal handler. This prevents signals
that you’ve specified as not interesting (with handle nostop) from changing the focus of
debugging unexpectedly. Note that the signal handler itself may still hit a breakpoint, stop
for another signal that has handle stop in effect, or for any other event that normally
results in stopping the stepping command sooner. Also note that gdb still informs you that
the program received a signal if handle print is set.
If you set handle pass for a signal, and your program sets up a handler for it, then
issuing a stepping command, such as step or stepi, when your program is stopped due to
the signal will step into the signal handler (if the target supports that).
Likewise, if you use the queue-signal command to queue a signal to be delivered to
the current thread when execution of the thread resumes (see Section 17.3 [Giving your
Program a Signal], page 223), then a stepping command will step into the signal handler.
Here’s an example, using stepi to step to the first instruction of SIGUSR1’s handler:
(gdb) handle SIGUSR1
Signal Stop Print Pass to program Description
SIGUSR1 Yes Yes Yes User defined signal 1
(gdb) c
Continuing.
28 p = 0;
(gdb) si
sigusr1_handler () at sigusr1.c:9
9 {
The same, but using queue-signal instead of waiting for the program to receive the
signal first:
(gdb) n
28 p = 0;
(gdb) queue-signal SIGUSR1
(gdb) si
sigusr1_handler () at sigusr1.c:9
9 {
(gdb)
On some targets, gdb can inspect extra signal information associated with the inter-
cepted signal, before it is actually delivered to the program being debugged. This informa-
tion is exported by the convenience variable $_siginfo, and consists of data that is passed
by the kernel to the signal handler at the time of the receipt of a signal. The data type of
the information itself is target dependent. You can see the data type using the ptype $_
siginfo command. On Unix systems, it typically corresponds to the standard siginfo_t
type, as defined in the ‘signal.h’ system header.
Here’s an example, on a gnu/Linux system, printing the stray referenced address that
raised a segmentation fault.
(gdb) continue
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400766 in main ()
69 *(int *)p = 0;
(gdb) ptype $_siginfo
type = struct {
int si_signo;
int si_errno;
int si_code;
union {
int _pad[28];
struct {...} _kill;
struct {...} _timer;
struct {...} _rt;
struct {...} _sigchld;
struct {...} _sigfault;
struct {...} _sigpoll;
} _sifields;
}
(gdb) ptype $_siginfo._sifields._sigfault
type = struct {
void *si_addr;
}
(gdb) p $_siginfo._sifields._sigfault.si_addr
$1 = (void *) 0x7ffff7ff7000
Depending on target support, $_siginfo may also be writable.
your program within the debugger. In the default mode, referred to as all-stop mode, when
any thread in your program stops (for example, at a breakpoint or while being stepped), all
other threads in the program are also stopped by gdb. On some targets, gdb also supports
non-stop mode, in which other threads can continue to run freely while you examine the
stopped thread in the debugger.
exit), while you debug the child. In other situations, you may not be interested in inspecting
the current state of any of the processes gdb is attached to, and you may want to resume
them all until some breakpoint is hit. In the latter case, you can instruct gdb to allow all
threads of all the inferiors to run with the set schedule-multiple command.
set schedule-multiple
Set the mode for allowing threads of multiple processes to be resumed when an
execution command is issued. When on, all threads of all processes are allowed
to run. When off, only the threads of the current process are resumed. The
default is off. The scheduler-locking mode takes precedence when set to
on, or while you are stepping and set to step.
show schedule-multiple
Display the current mode for resuming the execution of threads of multiple
processes.
it is generally not possible to switch modes once debugging has started. Furthermore, since
not all targets support non-stop mode, even when you have enabled non-stop mode, gdb
may still fall back to all-stop operation by default.
In non-stop mode, all execution commands apply only to the current thread by default.
That is, continue only continues one thread. To continue all threads, issue continue -a
or c -a.
You can use gdb’s background execution commands (see Section 5.5.3 [Background
Execution], page 78) to run some threads in the background while you continue to examine
or step others from gdb. The MI execution commands (see Section 27.15 [GDB/MI Program
Execution], page 484) are always executed asynchronously in non-stop mode.
Suspending execution is done with the interrupt command when running in the back-
ground, or Ctrl-c during foreground execution. In all-stop mode, this stops the whole
process; but in non-stop mode the interrupt applies only to the current thread. To stop the
whole program, use interrupt -a.
Other execution commands do not currently support the -a option.
In non-stop mode, when a thread stops, gdb doesn’t automatically make that thread
current, as it does in all-stop mode. This is because the thread stop notifications are
asynchronous with respect to gdb’s command interpreter, and it would be confusing if gdb
unexpectedly changed to a different thread just as you entered a command to operate on
the previously current thread.
Background execution is especially useful in conjunction with non-stop mode for debug-
ging programs with multiple threads; see Section 5.5.2 [Non-Stop Mode], page 77. However,
you can also use these commands in the normal all-stop mode with the restriction that you
cannot issue another execution command until the previous one finishes. Examples of com-
mands that are valid in all-stop mode while the program is running include help and info
break.
You can interrupt your program while it is running in the background by using the
interrupt command.
interrupt
interrupt -a
Suspend execution of the running program. In all-stop mode, interrupt stops
the whole process, but in non-stop mode, it stops only the current thread. To
stop the whole program in non-stop mode, use interrupt -a.
Thread-specific breakpoints are automatically deleted when gdb detects the correspond-
ing thread is no longer in the thread list. For example:
(gdb) c
Thread-specific breakpoint 3 deleted - thread 28 no longer in the thread list.
There are several ways for a thread to disappear, such as a regular thread exit, but also
when you detach from the process with the detach command (see Section 4.7 [Debugging an
Already-running Process], page 32), or if gdb loses the remote connection (see Chapter 20
[Remote Debugging], page 251), etc. Note that with some targets, gdb is only able to
detect a thread has exited when the user explictly asks for the thread list with the info
threads command.
80 Debugging with gdb
The call to sleep will return early if a different thread stops at a breakpoint or for some
other reason.
Instead, write this:
int unslept = 10;
while (unslept > 0)
unslept = sleep (unslept);
A system call is allowed to return early, so the system is still conforming to its specifica-
tion. But gdb does cause your multi-threaded program to behave differently than it would
without gdb.
Also, gdb uses internal breakpoints in the thread library to monitor certain events such
as thread creation and thread destruction. When such an event happens, a system call
in another thread may return prematurely, even though your program does not appear to
stop.
set observer on
set observer off
When set to on, this disables all the permission variables below (except for
insert-fast-tracepoints), plus enables non-stop debugging. Setting this to
off switches back to normal debugging, though remaining in non-stop mode.
show observer
Show whether observer mode is on or off.
Chapter 5: Stopping and Continuing 81
set may-write-registers on
set may-write-registers off
This controls whether gdb will attempt to alter the values of registers, such as
with assignment expressions in print, or the jump command. It defaults to on.
show may-write-registers
Show the current permission to write registers.
set may-write-memory on
set may-write-memory off
This controls whether gdb will attempt to alter the contents of memory, such
as with assignment expressions in print. It defaults to on.
show may-write-memory
Show the current permission to write memory.
set may-insert-breakpoints on
set may-insert-breakpoints off
This controls whether gdb will attempt to insert breakpoints. This affects all
breakpoints, including internal breakpoints defined by gdb. It defaults to on.
show may-insert-breakpoints
Show the current permission to insert breakpoints.
set may-insert-tracepoints on
set may-insert-tracepoints off
This controls whether gdb will attempt to insert (regular) tracepoints at the
beginning of a tracing experiment. It affects only non-fast tracepoints, fast tra-
cepoints being under the control of may-insert-fast-tracepoints. It defaults
to on.
show may-insert-tracepoints
Show the current permission to insert tracepoints.
set may-insert-fast-tracepoints on
set may-insert-fast-tracepoints off
This controls whether gdb will attempt to insert fast tracepoints at the begin-
ning of a tracing experiment. It affects only fast tracepoints, regular (non-fast)
tracepoints being under the control of may-insert-tracepoints. It defaults
to on.
show may-insert-fast-tracepoints
Show the current permission to insert fast tracepoints.
set may-interrupt on
set may-interrupt off
This controls whether gdb will attempt to interrupt or stop program execution.
When this variable is off, the interrupt command will have no effect, nor will
Ctrl-c. It defaults to on.
show may-interrupt
Show the current permission to interrupt or stop the program.
Chapter 6: Running programs backward 83
instruction executed prior to that one. For instance, if the last instruction was
a jump, reverse-stepi will take you back from the destination of the jump to
the jump instruction itself.
reverse-next [count]
Run backward to the beginning of the previous line executed in the current
(innermost) stack frame. If the line contains function calls, they will be “un-
executed” without stopping. Starting from the first line of a function, reverse-
next will take you back to the caller of that function, before the function was
called, just as the normal next command would take you from the last line of
a function back to its return to its caller2 .
reverse-nexti [count]
Like nexti, reverse-nexti executes a single instruction in reverse, except
that called functions are “un-executed” atomically. That is, if the previously
executed instruction was a return from another function, reverse-nexti will
continue to execute in reverse until the call to that function (from the current
stack frame) is reached.
reverse-finish
Just as the finish command takes you to the point where the current function
returns, reverse-finish takes you to the point where it was called. Instead
of ending up at the end of the current function invocation, you end up at the
beginning.
set exec-direction
Set the direction of target execution.
set exec-direction reverse
gdb will perform all execution commands in reverse, until the exec-direction
mode is changed to “forward”. Affected commands include step, stepi,
next, nexti, continue, and finish. The return command cannot be used
in reverse mode.
set exec-direction forward
gdb will perform all execution commands in the normal fashion. This is the
default.
2
Unless the code is too heavily optimized.
Chapter 7: Recording Inferior’s Execution and Replaying It 85
cases, being able to inspect variables might be useful. You can use the following
command for that:
set record btrace replay-memory-access
Control the behavior of the btrace recording method when accessing memory
during replay. If read-only (the default), gdb will only allow accesses to
read-only memory. If read-write, gdb will allow accesses to read-only and to
read-write memory. Beware that the accessed memory corresponds to the live
target and not necessarily to the current replay position.
show record btrace replay-memory-access
Show the current setting of replay-memory-access.
set record btrace bts buffer-size size
set record btrace bts buffer-size unlimited
Set the requested ring buffer size for branch tracing in BTS format. Default is
64KB.
If size is a positive number, then gdb will try to allocate a buffer of at least size
bytes for each new thread that uses the btrace recording method and the BTS
format. The actually obtained buffer size may differ from the requested size.
Use the info record command to see the actual buffer size for each thread that
uses the btrace recording method and the BTS format.
If limit is unlimited or zero, gdb will try to allocate a buffer of 4MB.
Bigger buffers mean longer traces. On the other hand, gdb will also need longer
to process the branch trace data before it can be used.
show record btrace bts buffer-size size
Show the current setting of the requested ring buffer size for branch tracing in
BTS format.
info record
Show various statistics about the recording depending on the recording method:
full For the full recording method, it shows the state of process record
and its in-memory execution log buffer, including:
• Whether in record mode or replay mode.
• Lowest recorded instruction number (counting from when the
current execution log started recording instructions).
• Highest recorded instruction number.
• Current instruction about to be replayed (if in replay mode).
• Number of instructions contained in the execution log.
• Maximum number of instructions that may be contained in the
execution log.
btrace For the btrace recording method, it shows:
• Recording format.
• Number of instructions that have been recorded.
• Number of blocks of sequential control-flow formed by the
recorded instructions.
Chapter 7: Recording Inferior’s Execution and Replaying It 89
that function, the source lines for this instruction sequence (if the /l modifier
is specified), and the instructions numbers that form the sequence (if the /i
modifier is specified). The function names are indented to reflect the call stack
depth if the /c modifier is specified. The /l, /i, and /c modifiers can be given
together.
(gdb) list 1, 10
1 void foo (void)
2 {
3 }
4
5 void bar (void)
6 {
7 ...
8 foo ();
9 ...
10 }
(gdb) record function-call-history /ilc
1 bar inst 1,4 at foo.c:6,8
2 foo inst 5,10 at foo.c:2,3
3 bar inst 11,13 at foo.c:9,10
By default, ten lines are printed. This can be changed using the set record
function-call-history-size command. Functions are printed in execution
order. There are several ways to specify what to print:
record function-call-history func
Prints ten functions starting from function number func.
record function-call-history func, +/-n
Prints n functions around function number func. If n is preceded
with +, prints n functions after function number func. If n is pre-
ceded with -, prints n functions before function number func.
record function-call-history
Prints ten more functions after the last ten-line print.
record function-call-history -
Prints ten more functions before the last ten-line print.
record function-call-history begin end
Prints functions beginning with function number begin until func-
tion number end. The function number end is included.
This command may not be available for all recording methods.
set record function-call-history-size size
set record function-call-history-size unlimited
Define how many lines to print in the record function-call-history com-
mand. The default value is 10. A size of unlimited means unlimited lines.
show record function-call-history-size
Show how many lines to print in the record function-call-history com-
mand.
Chapter 8: Examining the Stack 91
these function invocations. If the innermost function invocation has no stack frame, gdb
nevertheless regards it as though it had a separate frame, which is numbered zero as usual,
allowing correct tracing of the function call chain. However, gdb has no provision for
frameless functions elsewhere in the stack.
frame [framespec]
The frame command allows you to move from one stack frame to another, and
to print the stack frame you select. The framespec may be either the address
of the frame or the stack frame number. Without an argument, frame prints
the current stack frame.
select-frame
The select-frame command allows you to move from one stack frame to an-
other without printing the frame. This is the silent version of frame.
8.2 Backtraces
A backtrace is a summary of how your program got where it is. It shows one line per frame,
for many frames, starting with the currently executing frame (frame zero), followed by its
caller (frame one), and on up the stack.
backtrace
bt Print a backtrace of the entire stack: one line per frame for all frames in the
stack.
You can stop the backtrace at any time by typing the system interrupt charac-
ter, normally Ctrl-c.
backtrace n
bt n Similar, but print only the innermost n frames.
backtrace -n
bt -n Similar, but print only the outermost n frames.
backtrace full
bt full
bt full n
bt full -n
Print the values of the local variables also. As described above, n specifies the
number of frames to print.
backtrace no-filters
bt no-filters
bt no-filters n
bt no-filters -n
bt no-filters full
bt no-filters full n
bt no-filters full -n
Do not run Python frame filters on this backtrace. See Section 23.2.2.9 [Frame
Filter API], page 337, for more information. Additionally use [disable frame-
filter all], page 95 to turn off all frame filters. This is only relevant when gdb
has been configured with Python support.
Chapter 8: Examining the Stack 93
The names where and info stack (abbreviated info s) are additional aliases for
backtrace.
In a multi-threaded program, gdb by default shows the backtrace only for the current
thread. To display the backtrace for several or all of the threads, use the command thread
apply (see Section 4.10 [Threads], page 36). For example, if you type thread apply all
backtrace, gdb will display the backtrace for all the threads; this is handy when you debug
a core dump of a multi-threaded program.
Each line in the backtrace shows the frame number and the function name. The program
counter value is also shown—unless you use set print address off. The backtrace also
shows the source file name and line number, as well as the arguments to the function. The
program counter value is omitted if it is at the beginning of the code for that line number.
Here is an example of a backtrace. It was made with the command ‘bt 3’, so it shows
the innermost three frames.
#0 m4_traceon (obs=0x24eb0, argc=1, argv=0x2b8c8)
at builtin.c:993
#1 0x6e38 in expand_macro (sym=0x2b600, data=...) at macro.c:242
#2 0x6840 in expand_token (obs=0x0, t=177664, td=0xf7fffb08)
at macro.c:71
(More stack frames follow...)
The display for frame zero does not begin with a program counter value, indicating that
your program has stopped at the beginning of the code for line 993 of builtin.c.
The value of parameter data in frame 1 has been replaced by .... By default, gdb prints
the value of a parameter only if it is a scalar (integer, pointer, enumeration, etc). See
command set print frame-arguments in Section 10.8 [Print Settings], page 121 for more
details on how to configure the way function parameter values are printed.
If your program was compiled with optimizations, some compilers will optimize away
arguments passed to functions if those arguments are never used after the call. Such opti-
mizations generate code that passes arguments through registers, but doesn’t store those
arguments in the stack frame. gdb has no way of displaying such arguments in stack frames
other than the innermost one. Here’s what such a backtrace might look like:
#0 m4_traceon (obs=0x24eb0, argc=1, argv=0x2b8c8)
at builtin.c:993
#1 0x6e38 in expand_macro (sym=<optimized out>) at macro.c:242
#2 0x6840 in expand_token (obs=0x0, t=<optimized out>, td=0xf7fffb08)
at macro.c:71
(More stack frames follow...)
The values of arguments that were not saved in their stack frames are shown as ‘<optimized
out>’.
If you need to display the values of such optimized-out arguments, either deduce that
from other variables whose values depend on the one you are interested in, or recompile
without optimizations.
Most programs have a standard user entry point—a place where system libraries and
startup code transition into user code. For C this is main1 . When gdb finds the entry
function in a backtrace it will terminate the backtrace, to avoid tracing into highly system-
specific (and generally uninteresting) code.
1
Note that embedded programs (the so-called “free-standing” environment) are not required to have a
main function as the entry point. They could even have multiple entry points.
94 Debugging with gdb
If you need to examine the startup code, or limit the number of levels in a backtrace,
you can change this behavior:
set filename-display
set filename-display relative
Display file names relative to the compilation directory. This is the default.
show filename-display
Show the current way to display filenames.
Chapter 8: Examining the Stack 95
global frame-filters:
Priority Enabled Name
1000 No PrimaryFunctionFilter
100 Yes Reverse
global frame-filters:
Priority Enabled Name
1000 No PrimaryFunctionFilter
100 Yes Reverse
global frame-filters:
Priority Enabled Name
1000 Yes PrimaryFunctionFilter
100 Yes Reverse
global frame-filters:
Priority Enabled Name
1000 Yes PrimaryFunctionFilter
100 Yes Reverse
global frame-filters:
Priority Enabled Name
1000 Yes PrimaryFunctionFilter
50 Yes Reverse
up-silently n
down-silently n
These two commands are variants of up and down, respectively; they differ in
that they do their work silently, without causing display of the new frame. They
are intended primarily for use in gdb command scripts, where the output might
be unnecessary and distracting.
list linespec
Print lines centered around the line specified by linespec.
list first,last
Print lines from first to last. Both arguments are linespecs. When a list
command has two linespecs, and the source file of the second linespec is omitted,
this refers to the same source file as the first linespec.
list ,last
Print lines ending with last.
list first,
Print lines starting with first.
list + Print lines just after the lines last printed.
list - Print lines just before the lines last printed.
list As described in the preceding table.
label Specifies the line at which the label named label appears. gdb searches for
the label in the function corresponding to the currently selected stack frame.
If there is no current selected stack frame (for instance, if the inferior is not
running), then gdb will not search for a label.
*address Specifies the program address address. For line-oriented commands, such as
list and edit, this specifies a source line that contains address. For break
and other breakpoint oriented commands, this can be used to set breakpoints
in parts of your program which do not have debugging information or source
files.
Here address may be any expression valid in the current working language (see
Chapter 15 [Languages], page 183) that specifies a code address. In addition,
as a convenience, gdb extends the semantics of expressions used in locations
to cover the situations that frequently happen during debugging. Here are the
various forms of address:
expression
Any expression valid in the current working language.
funcaddr An address of a function or procedure derived from its name. In
C, C++, Java, Objective-C, Fortran, minimal, and assembly, this
is simply the function’s name function (and actually a special case
of a valid expression). In Pascal and Modula-2, this is &function.
In Ada, this is function’Address (although the Pascal form also
works).
This form specifies the address of the function’s first instruction,
before the stack frame and arguments have been set up.
’filename’:funcaddr
Like funcaddr above, but also specifies the name of the source file
explicitly. This is useful if the name of the function does not specify
the function unambiguously, e.g., if there are several functions with
identical names in different source files.
-pstap|-probe-stap [objfile:[provider:]]name
The gnu/Linux tool SystemTap provides a way for applications to embed static
probes. See Section 5.1.10 [Static Probe Points], page 65, for more information
on finding and using static probes. This form of linespec specifies the location
of such a static probe.
If objfile is given, only probes coming from that shared library or executable
matching objfile as a regular expression are considered. If provider is given,
then only probes from that provider are considered. If several probes match
the spec, gdb will insert a breakpoint at each one of those probes.
edit location
Edit the source file specified by location. Editing starts at that location,
e.g., at the specified source line of the specified file. See Section 9.2 [Specify
Location], page 100, for all the possible forms of the location argument; here
are the forms of the edit command most commonly used:
edit number
Edit the current source file with number as the active line number.
edit function
Edit the file containing function at the beginning of its definition.
the directories in the list, in the order they are present in the list, until it finds a file with
the desired name.
For example, suppose an executable references the file ‘/usr/src/foo-1.0/lib/foo.c’,
and our source path is ‘/mnt/cross’. The file is first looked up literally; if this fails,
‘/mnt/cross/usr/src/foo-1.0/lib/foo.c’ is tried; if this fails, ‘/mnt/cross/foo.c’ is
opened; if this fails, an error message is printed. gdb does not look up the parts of the source
file name, such as ‘/mnt/cross/src/foo-1.0/lib/foo.c’. Likewise, the subdirectories of
the source path are not searched: if the source path is ‘/mnt/cross’, and the binary refers
to ‘foo.c’, gdb would not find it under ‘/mnt/cross/usr/src/foo-1.0/lib’.
Plain file names, relative file names with leading directories, file names containing dots,
etc. are all treated as described above; for instance, if the source path is ‘/mnt/cross’, and
the source file is recorded as ‘../lib/foo.c’, gdb would first try ‘../lib/foo.c’, then
‘/mnt/cross/../lib/foo.c’, and after that—‘/mnt/cross/foo.c’.
Note that the executable search path is not used to locate the source files.
Whenever you reset or rearrange the source path, gdb clears out any information it has
cached about where source files are found and where each line is in the file.
When you start gdb, its source path includes only ‘cdir’ and ‘cwd’, in that order. To
add other directories, use the directory command.
The search path is used to find both program source files and gdb script files (read using
the ‘-command’ option and ‘source’ command).
In addition to the source path, gdb provides a set of commands that manage a list of
source path substitution rules. A substitution rule specifies how to rewrite source directories
stored in the program’s debug information in case the sources were moved to a different
directory between compilation and debugging. A rule is made of two strings, the first
specifying what needs to be rewritten in the path, and the second specifying how it should
be rewritten. In [set substitute-path], page 104, we name these two parts from and to
respectively. gdb does a simple string replacement of from with to at the start of the
directory part of the source file name, and uses that result instead of the original file name
to look up the sources.
Using the previous example, suppose the ‘foo-1.0’ tree has been moved from ‘/usr/src’
to ‘/mnt/cross’, then you can tell gdb to replace ‘/usr/src’ in all source path names with
‘/mnt/cross’. The first lookup will then be ‘/mnt/cross/foo-1.0/lib/foo.c’ in place of
the original location of ‘/usr/src/foo-1.0/lib/foo.c’. To define a source path substitu-
tion rule, use the set substitute-path command (see [set substitute-path], page 104).
To avoid unexpected substitution results, a rule is applied only if the from part
of the directory name ends at a directory separator. For instance, a rule substituting
‘/usr/source’ into ‘/mnt/cross’ will be applied to ‘/usr/source/foo-1.0’ but not
to ‘/usr/sourceware/foo-2.0’. And because the substitution is applied only at the
beginning of the directory name, this rule will not be applied to ‘/root/usr/source/baz.c’
either.
In many cases, you can achieve the same result using the directory command. However,
set substitute-path can be more efficient in the case where the sources are organized in
a complex tree with multiple subdirectories. With the directory command, you need to
add each subdirectory of your project. If you moved the entire tree while preserving its
104 Debugging with gdb
internal organization, then set substitute-path allows you to direct the debugger to all
the sources with one single command.
set substitute-path is also more than just a shortcut command. The source path
is only used if the file at the original location no longer exists. On the other hand, set
substitute-path modifies the debugger behavior to look at the rewritten location instead.
So, if for any reason a source file that is not relevant to your executable is located at the
original location, a substitution rule is the only method available to point gdb at the new
location.
You can configure a default source path substitution rule by configuring gdb with the
‘--with-relocated-sources=dir’ option. The dir should be the name of a directory under
gdb’s configured prefix (set with ‘--prefix’ or ‘--exec-prefix’), and directory names in
debug information under dir will be adjusted automatically if the installed gdb is moved
to a new location. This is useful if gdb, libraries or executables with debug information
and corresponding source code are being moved together.
In the case when more than one substitution rule have been defined, the rules
are evaluated one by one in the order where they have been defined. The first
one matching, if any, is selected to perform the substitution.
For instance, if we had entered the following commands:
(gdb) set substitute-path /usr/src/include /mnt/include
(gdb) set substitute-path /usr/src /mnt/src
gdb would then rewrite ‘/usr/src/include/defs.h’ into ‘/mnt/include/defs.h’
by using the first rule. However, it would use the second rule to rewrite
‘/usr/src/lib/foo.c’ into ‘/mnt/src/lib/foo.c’.
unset substitute-path [path]
If a path is specified, search the current list of substitution rules for a rule that
would rewrite that path. Delete that rule if found. A warning is emitted by
the debugger if no rule could be found.
If no path is specified, then all substitution rules are deleted.
show substitute-path [path]
If a path is specified, then print the source path substitution rule which would
rewrite that path, if any.
If no path is specified, then print all existing source path substitution rules.
If your source path is cluttered with directories that are no longer of interest, gdb may
sometimes cause confusion by finding the wrong versions of source. You can correct the
situation as follows:
1. Use directory with no argument to reset the source path to its default value.
2. Use directory with suitable arguments to reinstall the directories you want in the
source path. You can add all the directories in one command.
6 printf ("Hello.\n");
=> 0x0804833c <+12>: movl $0x8048440,(%esp)
0x08048343 <+19>: call 0x8048284 <puts@plt>
7 return 0;
8 }
0x08048348 <+24>: mov $0x0,%eax
0x0804834d <+29>: leave
0x0804834e <+30>: ret
disassembly of the next instruction instead of showing the next source line. If
AUTO, gdb will display disassembly of next instruction only if the source line
cannot be displayed. This setting causes gdb to display some feedback when
you step through a function with no line info or whose source file is unavailable.
The default is OFF, which means never display the disassembly of the next line
or instruction.
Chapter 10: Examining Data 109
10 Examining Data
The usual way to examine data in your program is with the print command (abbreviated p),
or its synonym inspect. It evaluates and prints the value of an expression of the language
your program is written in (see Chapter 15 [Using gdb with Different Languages], page 183).
It may also print the expression using a Python-based pretty-printer (see Section 10.9
[Pretty Printing], page 129).
print expr
print /f expr
expr is an expression (in the source language). By default the value of expr is
printed in a format appropriate to its data type; you can choose a different for-
mat by specifying ‘/f’, where f is a letter specifying the format; see Section 10.5
[Output Formats], page 116.
print
print /f If you omit expr, gdb displays the last value again (from the value history;
see Section 10.10 [Value History], page 131). This allows you to conveniently
inspect the same value in an alternative format.
A more low-level way of examining data is with the x command. It examines data
in memory at a specified address and prints it in a specified format. See Section 10.6
[Examining Memory], page 117.
If you are interested in information about types, or about how the fields of a struct
or a class are declared, use the ptype exp command rather than print. See Chapter 16
[Examining the Symbol Table], page 213.
Another way of examining values of expressions and type information is through the
Python extension command explore (available only if the gdb build is configured with
--with-python). It offers an interactive way to start at the highest level (or, the most
abstract level) of the data type of an expression (or, the data type itself) and explore all
the way down to leaf scalar values/fields embedded in the higher level data types.
explore arg
arg is either an expression (in the source language), or a type visible in the
current context of the program being debugged.
The working of the explore command can be illustrated with an example. If a data
type struct ComplexStruct is defined in your C program as
struct SimpleStruct
{
int i;
double d;
};
struct ComplexStruct
{
struct SimpleStruct *ss_p;
int arr[10];
};
followed by variable declarations as
110 Debugging with gdb
(cs.arr)[5] = 4
The explore command also has two sub-commands, explore value and explore type.
The former sub-command is a way to explicitly specify that value exploration of the argu-
ment is being invoked, while the latter is a way to explicitly specify that type exploration
of the argument is being invoked.
explore value expr
This sub-command of explore explores the value of the expression expr (if expr
is an expression valid in the current context of the program being debugged).
The behavior of this command is identical to that of the behavior of the explore
command being passed the argument expr.
explore type arg
This sub-command of explore explores the type of arg (if arg is a type vis-
ible in the current context of program being debugged), or the type of the
value/expression arg (if arg is an expression valid in the current context of the
program being debugged). If arg is a type, then the behavior of this command
is identical to that of the explore command being passed the argument arg.
If arg is an expression, then the behavior of this command will be identical to
that of the explore command being passed the type of arg as the argument.
10.1 Expressions
print and many other gdb commands accept an expression and compute its value. Any
kind of constant, variable or operator defined by the programming language you are using
is valid in an expression in gdb. This includes conditional expressions, function calls, casts,
and string constants. It also includes preprocessor macros, if you compiled your program
to include this information; see Section 4.1 [Compilation], page 25.
gdb supports array constants in expressions input by the user. The syntax is {element,
element. . . }. For example, you can use the command print {1, 2, 3} to create an array
of three integers. If you pass an array to a function or assign it to a program variable, gdb
copies the array to memory that is malloced in the target program.
Because C is so widespread, most of the expressions shown in examples in this manual
are in C. See Chapter 15 [Using gdb with Different Languages], page 183, for information
on how to use expressions in other languages.
In this section, we discuss operators that you can use in gdb expressions regardless of
your programming language.
Casts are supported in all languages, not just in C, because it is so useful to cast a
number into a pointer in order to examine a structure at that address in memory.
gdb supports these operators, in addition to those common to programming languages:
@ ‘@’ is a binary operator for treating parts of memory as arrays. See Section 10.4
[Artificial Arrays], page 115, for more information.
:: ‘::’ allows you to specify a variable in terms of the file or function where it is
defined. See Section 10.3 [Program Variables], page 113.
{type} addr
Refers to an object of type type stored at address addr in memory. The address
addr may be any expression whose value is an integer or pointer (but parenthe-
112 Debugging with gdb
ses are required around binary operators, just as in a cast). This construct is
allowed regardless of what kind of data is normally supposed to reside at addr.
the expression. For instance, printing the address of an overloaded function will
result in the use of the menu.
When mode is set to ask, the debugger always uses the menu when an ambiguity
is detected.
Finally, when mode is set to cancel, the debugger reports an error due to the
ambiguity and the command is aborted.
show multiple-symbols
Show the current value of the multiple-symbols setting.
void
foo (int a)
{
if (a < 10)
bar (a);
else
process (a); /* Stop here */
}
int
bar (int a)
{
foo (a + 5);
}
For example, if there is a breakpoint at the commented line, here is what you might see
when the program stops after executing the call bar(0):
(gdb) p a
$1 = 10
(gdb) p bar::a
$2 = 5
(gdb) up 2
#2 0x080483d0 in foo (a=5) at foobar.c:12
(gdb) p a
$3 = 5
(gdb) p bar::a
$4 = 0
These uses of ‘::’ are very rarely in conflict with the very similar use of the same notation
in C++. When they are in conflict, the C++ meaning takes precedence; however, this can be
overridden by quoting the file or function name with single quotes.
For example, suppose the program is stopped in a method of a class that has a field
named includefile, and there is also an include file named ‘includefile’ that defines a
variable, some_global.
(gdb) p includefile
$1 = 23
(gdb) p includefile::some_global
A syntax error in expression, near ‘’.
(gdb) p ’includefile’::some_global
$2 = 27
Warning: Occasionally, a local variable may appear to have the wrong value
at certain points in a function—just after entry to a new scope, and just before
exit.
You may see this problem when you are stepping by machine instructions. This is
because, on most machines, it takes more than one instruction to set up a stack frame
(including local variable definitions); if you are stepping by machine instructions, variables
may appear to have the wrong values until the stack frame is completely built. On exit, it
usually also takes more than one machine instruction to destroy a stack frame; after you
begin stepping through that group of instructions, local variable definitions may be gone.
This may also happen when the compiler does significant optimizations. To be sure of
always seeing accurate values, turn off all optimization when compiling.
Another possible effect of compiler optimizations is to optimize unused variables out of
existence, or assign variables to registers (as opposed to memory addresses). Depending
Chapter 10: Examining Data 115
on the support for such cases offered by the debug info format used by the compiler, gdb
might not be able to display values for such local variables. If that happens, gdb will print
a message like this:
No symbol "foo" in current context.
To solve such problems, either recompile without optimizations, or use a different debug
info format, if the compiler supports several such formats. See Section 4.1 [Compilation],
page 25, for more information on choosing compiler options. See Section 15.4.1 [C and
C++], page 187, for more information about debug info formats that are best suited to C++
programs.
If you ask to print an object whose contents are unknown to gdb, e.g., because its
data type is not completely specified by the debug information, gdb will say ‘<incomplete
type>’. See Chapter 16 [Symbols], page 213, for more about this.
If you append @entry string to a function parameter name you get its value at the time
the function got called. If the value is not available an error message is printed. Entry
values are available only with some compilers. Entry values are normally also printed at
the function parameter list according to [set print entry-values], page 124.
Breakpoint 1, d (i=30) at gdb.base/entry-value.c:29
29 i++;
(gdb) next
30 e (i);
(gdb) print i
$1 = 31
(gdb) print i@entry
$2 = 30
Strings are identified as arrays of char values without specified signedness. Arrays of
either signed char or unsigned char get printed as arrays of 1 byte sized integers. -
fsigned-char or -funsigned-char gcc options have no effect as gdb defines literal string
type "char" as char without a sign. For program code
char var0[] = "A";
signed char var1[] = "A";
You get during debugging
(gdb) print var0
$1 = "A"
(gdb) print var1
$2 = {65 ’A’, 0 ’\0’}
x/nfu addr
x addr
x Use the x command to examine memory.
n, f, and u are all optional parameters that specify how much memory to display and how
to format it; addr is an expression giving the address where you want to start displaying
memory. If you use defaults for nfu, you need not type the slash ‘/’. Several commands set
convenient defaults for addr.
n, the repeat count
The repeat count is a decimal integer; the default is 1. It specifies how much
memory (counting by units u) to display.
f, the display format
The display format is one of the formats used by print (‘x’, ‘d’, ‘u’, ‘o’, ‘t’,
‘a’, ‘c’, ‘f’, ‘s’), and in addition ‘i’ (for machine instructions). The default is
‘x’ (hexadecimal) initially. The default changes each time you use either x or
print.
u, the unit size
The unit size is any of
b Bytes.
h Halfwords (two bytes).
w Words (four bytes). This is the initial default.
g Giant words (eight bytes).
Each time you specify a unit size with x, that size becomes the default unit
the next time you use x. For the ‘i’ format, the unit size is ignored and is
normally not written. For the ‘s’ format, the unit size defaults to ‘b’, unless it
is explicitly given. Use x /hs to display 16-bit char strings and x /ws to display
32-bit strings. The next use of x /s will again display 8-bit strings. Note that
the results depend on the programming language of the current compilation
unit. If the language is C, the ‘s’ modifier will use the UTF-16 encoding while
‘w’ will use UTF-32. The encoding is set by the programming language and
cannot be altered.
addr, starting display address
addr is the address where you want gdb to begin displaying memory. The ex-
pression need not have a pointer value (though it may); it is always interpreted
as an integer address of a byte of memory. See Section 10.1 [Expressions],
page 111, for more information on expressions. The default for addr is usu-
ally just after the last address examined—but several other commands also set
the default address: info breakpoints (to the address of the last breakpoint
listed), info line (to the starting address of a line), and print (if you use it
to display a value from memory).
For example, ‘x/3uh 0x54320’ is a request to display three halfwords (h) of memory,
formatted as unsigned decimal integers (‘u’), starting at address 0x54320. ‘x/4xw $sp’
Chapter 10: Examining Data 119
prints the four words (‘w’) of memory above the stack pointer (here, ‘$sp’; see Section 10.13
[Registers], page 137) in hexadecimal (‘x’).
Since the letters indicating unit sizes are all distinct from the letters specifying output
formats, you do not have to remember whether unit size or format comes first; either order
works. The output specifications ‘4xw’ and ‘4wx’ mean exactly the same thing. (However,
the count n must come first; ‘wx4’ does not work.)
Even though the unit size u is ignored for the formats ‘s’ and ‘i’, you might still want to
use a count n; for example, ‘3i’ specifies that you want to see three machine instructions,
including any operands. For convenience, especially when used with the display command,
the ‘i’ format also prints branch delay slot instructions, if any, beyond the count specified,
which immediately follow the last instruction that is within the count. The command
disassemble gives an alternative way of inspecting machine instructions; see Section 9.6
[Source and Machine Code], page 105.
All the defaults for the arguments to x are designed to make it easy to continue scanning
memory with minimal specifications each time you use x. For example, after you have
inspected three machine instructions with ‘x/3i addr’, you can inspect the next seven with
just ‘x/7’. If you use RET to repeat the x command, the repeat count n is used again; the
other arguments default as for successive uses of x.
When examining machine instructions, the instruction at current program counter is
shown with a => marker. For example:
(gdb) x/5i $pc-6
0x804837f <main+11>: mov %esp,%ebp
0x8048381 <main+13>: push %ecx
0x8048382 <main+14>: sub $0x4,%esp
=> 0x8048385 <main+17>: movl $0x8048460,(%esp)
0x804838c <main+24>: call 0x80482d4 <puts@plt>
The addresses and contents printed by the x command are not saved in the value history
because there is often too much of them and they would get in the way. Instead, gdb
makes these values available for subsequent use in expressions as values of the convenience
variables $_ and $__. After an x command, the last address examined is available for use
in expressions in the convenience variable $_. The contents of that address, as examined,
are available in the convenience variable $__.
If the x command has a repeat count, the address and contents saved are from the last
memory unit printed; this is not the same as the last address printed if several units were
printed on the last line of output.
When you are debugging a program running on a remote target machine (see Chapter 20
[Remote Debugging], page 251), you may wish to verify the program’s image in the remote
machine’s memory against the executable file you downloaded to the target. Or, on any
target, you may want to check whether the program has corrupted its own read-only sections.
The compare-sections command is provided for such situations.
compare-sections [section-name|-r]
Compare the data of a loadable section section-name in the executable file of the
program being debugged with the same section in the target machine’s memory,
and report any mismatches. With no arguments, compares all loadable sections.
With an argument of -r, compares all loadable read-only sections.
120 Debugging with gdb
Note: for remote targets, this command can be accelerated if the target sup-
ports computing the CRC checksum of a block of memory (see [qCRC packet],
page 612).
Specify the numbers of the displays that you want affected with the command
argument dnums. It can be a single display number, one of the numbers shown
in the first field of the ‘info display’ display; or it could be a range of display
numbers, as in 2-4.
enable display dnums...
Enable display of item numbers dnums. It becomes effective once again in auto
display of its expression, until you specify otherwise. Specify the numbers of
the displays that you want affected with the command argument dnums. It can
be a single display number, one of the numbers shown in the first field of the
‘info display’ display; or it could be a range of display numbers, as in 2-4.
display Display the current values of the expressions on the list, just as is done when
your program stops.
info display
Print the list of expressions previously set up to display automatically, each
one with its item number, but without showing the values. This includes dis-
abled expressions, which are marked as such. It also includes expressions which
would not be displayed right now because they refer to automatic variables not
currently available.
If a display expression refers to local variables, then it does not make sense outside the
lexical context for which it was set up. Such an expression is disabled when execution enters
a context where one of its variables is not defined. For example, if you give the command
display last_char while inside a function with an argument last_char, gdb displays
this argument while your program continues to stop inside that function. When it stops
elsewhere—where there is no variable last_char—the display is disabled automatically.
The next time your program stops where last_char is meaningful, you can enable the
display expression once again.
By default, only scalar arguments are printed. This command can be used to
configure the debugger to print the value of all arguments, regardless of their
type. However, it is often advantageous to not print the value of more complex
parameters. For instance, it reduces the amount of information printed in each
frame, making the backtrace more readable. Also, it improves performance
when displaying Ada frames, because the computation of large arguments can
sometimes be CPU-intensive, especially in large applications. Setting print
frame-arguments to scalars (the default) or none avoids this computation,
thus speeding up the display of each Ada frame.
show print frame-arguments
Show how the value of arguments should be displayed when printing a frame.
set print raw frame-arguments on
Print frame arguments in raw, non pretty-printed, form.
set print raw frame-arguments off
Print frame arguments in pretty-printed form, if there is a pretty-printer for the
value (see Section 10.9 [Pretty Printing], page 129), otherwise print the value
in raw form. This is the default.
show print raw frame-arguments
Show whether to print frame arguments in raw form.
set print entry-values value
Set printing of frame argument values at function entry. In some cases gdb can
determine the value of function argument which was passed by the function
caller, even if the value was modified inside the called function and therefore is
different. With optimized code, the current value could be unavailable, but the
entry value may still be known.
The default value is default (see below for its description). Older gdb behaved
as with the setting no. Compilers not supporting this feature will behave in the
default setting the same way as with the no setting.
Chapter 10: Examining Data 125
#0 equal (val=val@entry=5)
#0 different (val=6, val@entry=5)
#0 lost (val@entry=5)
#0 born (val=10)
#0 invalid (val=<optimized out>)
default Always print the actual parameter value. Print also its value from
function entry point, but only if it is known. If not in MI mode (see
Chapter 27 [GDB/MI], page 451) and if both values are known and
identical, print the shortened param=param@entry=VALUE notation.
#0 equal (val=val@entry=5)
#0 different (val=6, val@entry=5)
#0 lost (val=<optimized out>, val@entry=5)
#0 born (val=10)
#0 invalid (val=<optimized out>)
struct thing {
Species it;
union {
Tree_forms tree;
Bug_forms bug;
} form;
};
Example:
Suppose we have three pretty-printers installed: one from library1.so named foo that
prints objects of type foo, and another from library2.so named bar that prints two types
of objects, bar1 and bar2.
(gdb) info pretty-printer
library1.so:
foo
library2.so:
bar
bar1
bar2
(gdb) info pretty-printer library2
library2.so:
bar
bar1
bar2
(gdb) disable pretty-printer library1
1 printer disabled
2 of 3 printers enabled
(gdb) info pretty-printer
library1.so:
foo [disabled]
library2.so:
bar
bar1
bar2
(gdb) disable pretty-printer library2 bar:bar1
1 printer disabled
1 of 3 printers enabled
(gdb) info pretty-printer library2
library1.so:
foo [disabled]
library2.so:
bar
bar1 [disabled]
bar2
(gdb) disable pretty-printer library2 bar
1 printer disabled
0 of 3 printers enabled
(gdb) info pretty-printer library2
library1.so:
foo [disabled]
library2.so:
bar [disabled]
bar1 [disabled]
bar2
Note that for bar the entire printer can be disabled, as can each individual subprinter.
The values printed are given history numbers by which you can refer to them. These
are successive integers starting with one. print shows you the history number assigned to
a value by printing ‘$num = ’ before the value; here num is the history number.
To refer to any previous value, use ‘$’ followed by the value’s history number. The way
print labels its output is designed to remind you of this. Just $ refers to the most recent
value in the history, and $$ refers to the value before that. $$n refers to the nth value from
the end; $$2 is the value just prior to $$, $$1 is equivalent to $$, and $$0 is equivalent to
$.
For example, suppose you have just printed a pointer to a structure and want to see the
contents of the structure. It suffices to type
p *$
If you have a chain of structures where the component next points to the next one, you
can print the contents of the next one with this:
p *$.next
You can print successive links in the chain by repeating this command—which you can do
by just typing RET.
Note that the history records values, not expressions. If the value of x is 4 and you type
these commands:
print x
set x=5
then the value recorded in the value history by the print command remains 4 even though
the value of x has changed.
show values
Print the last ten values in the value history, with their item numbers. This is
like ‘p $$9’ repeated ten times, except that show values does not change the
history.
show values n
Print ten history values centered on history item number n.
show values +
Print ten history values just after the values last printed. If no more values are
available, show values + produces no display.
Pressing RET to repeat show values n has exactly the same effect as ‘show values +’.
To distinguish between whether the program being debugged has exited (i.e.,
$_exitcode is not void) or signalled (i.e., $_exitsignal is not void), the
convenience function $_isvoid can be used (see Section 10.12 [Convenience
Functions], page 135). For example, considering the following source code:
#include <signal.h>
int
main (int argc, char *argv[])
{
raise (SIGALRM);
return 0;
}
A valid way of telling whether the program being debugged has exited or sig-
nalled would be:
(gdb) define has_exited_or_signalled
Type commands for definition of ‘‘has_exited_or_signalled’’.
End with a line saying just ‘‘end’’.
>if $_isvoid ($_exitsignal)
>echo The program has exited\n
>else
>echo The program has signalled\n
>end
>end
(gdb) run
Starting program:
$_tlb The variable $_tlb is automatically set when debugging applications running
on MS-Windows in native mode or connected to gdbserver that supports the
qGetTIBAddr request. See Section E.4 [General Query Packets], page 611. This
variable contains the address of the thread information block.
On HP-UX systems, if you refer to a function or variable name that begins with a dollar
sign, gdb searches for a user or system name first, before it searches for a convenience
variable.
$3 = void
(gdb) print $_isvoid ($v)
$4 = 1
$_caller_matches(regexp[, number_of_frames])
Returns one if the calling function’s name matches the regular expression reg-
exp. Otherwise it returns zero.
If the optional argument number of frames is provided, it is the number of
frames up in the stack to look. The default is 1.
$_any_caller_is(name[, number_of_frames])
Returns one if any calling function’s name is equal to name. Otherwise it
returns zero.
If the optional argument number of frames is provided, it is the number of
frames up in the stack to look. The default is 1.
Chapter 10: Examining Data 137
This function differs from $_caller_is in that this function checks all stack
frames from the immediate caller to the frame specified by number of frames,
whereas $_caller_is only checks the frame specified by number of frames.
$_any_caller_matches(regexp[, number_of_frames])
Returns one if any calling function’s name matches the regular expression reg-
exp. Otherwise it returns zero.
If the optional argument number of frames is provided, it is the number of
frames up in the stack to look. The default is 1.
This function differs from $_caller_matches in that this function checks
all stack frames from the immediate caller to the frame specified by
number of frames, whereas $_caller_matches only checks the frame specified
by number of frames.
gdb provides the ability to list and get help on convenience functions.
help function
Print a list of all convenience functions.
10.13 Registers
You can refer to machine register contents, in expressions, as variables with names starting
with ‘$’. The names of registers are different for each machine; use info registers to see
the names used on your machine.
info registers
Print the names and values of all registers except floating-point and vector
registers (in the selected stack frame).
info all-registers
Print the names and values of all registers, including floating-point and vector
registers (in the selected stack frame).
info registers regname ...
Print the relativized value of each specified register regname. As discussed in
detail below, register values are normally relative to the selected stack frame.
The regname may be any register name valid on the machine you are using,
with or without the initial ‘$’.
gdb has four “standard” register names that are available (in expressions) on most
machines—whenever they do not conflict with an architecture’s canonical mnemonics for
registers. The register names $pc and $sp are used for the program counter register and
the stack pointer. $fp is used for a register that contains a pointer to the current stack
frame, and $ps is used for a register that contains the processor status. For example, you
could print the program counter in hex with
p/x $pc
or print the instruction to be executed next with
x/i $pc
or add four to the stack pointer2 with
2
This is a way of removing one word from the stack, on machines where stacks grow downward in memory
(most machines, nowadays). This assumes that the innermost stack frame is selected; setting $sp is not
138 Debugging with gdb
set $sp += 4
Whenever possible, these four standard register names are available on your machine
even though the machine has different canonical mnemonics, so long as there is no conflict.
The info registers command shows the canonical names. For example, on the SPARC,
info registers displays the processor status register as $psr but you can also refer to it
as $ps; and on x86-based machines $ps is an alias for the eflags register.
gdb always considers the contents of an ordinary register as an integer when the register
is examined in this way. Some machines have special registers which can hold nothing but
floating point; these registers are considered to have floating point values. There is no way
to refer to the contents of an ordinary register as floating point value (although you can
print it as a floating point value with ‘print/f $regname’).
Some registers have distinct “raw” and “virtual” data formats. This means that the data
format in which the register contents are saved by the operating system is not the same
one that your program normally sees. For example, the registers of the 68881 floating point
coprocessor are always saved in “extended” (raw) format, but all C programs expect to work
with “double” (virtual) format. In such cases, gdb normally works with the virtual format
only (the format that makes sense for your program), but the info registers command
prints the data in both formats.
Some machines have special registers whose contents can be interpreted in several differ-
ent ways. For example, modern x86-based machines have SSE and MMX registers that can
hold several values packed together in several different formats. gdb refers to such registers
in struct notation:
(gdb) print $xmm1
$1 = {
v4_float = {0, 3.43859137e-038, 1.54142831e-044, 1.821688e-044},
v2_double = {9.92129282474342e-303, 2.7585945287983262e-313},
v16_int8 = "\000\000\000\000\3706;\001\v\000\000\000\r\000\000",
v8_int16 = {0, 0, 14072, 315, 11, 0, 13, 0},
v4_int32 = {0, 20657912, 11, 13},
v2_int64 = {88725056443645952, 55834574859},
uint128 = 0x0000000d0000000b013b36f800000000
}
To set values of such registers, you need to tell gdb which view of the register you wish to
change, as if you were assigning value to a struct member:
(gdb) set $xmm1.uint128 = 0x000000000000000000000000FFFFFFFF
Normally, register values are relative to the selected stack frame (see Section 8.4 [Select-
ing a Frame], page 97). This means that you get the value that the register would contain
if all stack frames farther in were exited and their saved registers restored. In order to see
the true contents of hardware registers, you must select the innermost frame (with ‘frame
0’).
Usually ABIs reserve some registers as not needed to be saved by the callee (a.k.a.:
“caller-saved”, “call-clobbered” or “volatile” registers). It may therefore not be possible for
gdb to know the value a register had before the call (in other words, in the outer frame),
if the register value has since been changed by the callee. gdb tries to deduce where
allowed when other stack frames are selected. To pop entire frames off the stack, regardless of machine
architecture, use return; see Section 17.4 [Returning from a Function], page 224.
Chapter 10: Examining Data 139
the inner frame saved (“callee-saved”) registers, from the debug info, unwind info, or the
machine code generated by your compiler. If some register is not saved, and gdb knows the
register is “caller-saved” (via its own knowledge of the ABI, or because the debug/unwind
info explicitly says the register’s value is undefined), gdb displays ‘<not saved>’ as the
register’s value. With targets that gdb has no knowledge of the register saving convention,
if a register was not saved by the callee, then its value and location in the outer frame are
assumed to be the same of the inner frame. This is usually harmless, because if the register
is call-clobbered, the caller either does not care what is in the register after the call, or has
code to restore the value that it does care about. Note, however, that if you change such
a register in the outer frame, you may also be affecting the inner frame. Also, the more
“outer” the frame is you’re looking at, the more likely a call-clobbered register’s value is
to be wrong, in the sense that it doesn’t actually represent the value the register had just
before the call.
displays each value in the most appropriate form for a recognized tag, and in
hexadecimal for an unrecognized tag.
On some targets, gdb can access operating system-specific information and show it to
you. The types of information available will differ depending on the type of operating system
running on the target. The mechanism used to fetch the data is described in Appendix H
[Operating System Information], page 685. For remote targets, this functionality depends
on the remote stub’s support of the ‘qXfer:osdata:read’ packet, see [qXfer osdata read],
page 628.
info os infotype
Display OS information of the requested type.
On gnu/Linux, the following values of infotype are valid:
processes
Display the list of processes on the target. For each process, gdb
prints the process identifier, the name of the user, the command
corresponding to the process, and the list of processor cores that
the process is currently running on. (To understand what these
properties mean, for this and the following info types, please consult
the general gnu/Linux documentation.)
procgroups
Display the list of process groups on the target. For each process,
gdb prints the identifier of the process group that it belongs to, the
command corresponding to the process group leader, the process
identifier, and the command line of the process. The list is sorted
first by the process group identifier, then by the process identifier,
so that processes belonging to the same process group are grouped
together and the process group leader is listed first.
threads Display the list of threads running on the target. For each thread,
gdb prints the identifier of the process that the thread belongs to,
the command of the process, the thread identifier, and the processor
core that it is currently running on. The main thread of a process
is not listed.
files Display the list of open file descriptors on the target. For each
file descriptor, gdb prints the identifier of the process owning the
descriptor, the command of the owning process, the value of the
descriptor, and the target of the descriptor.
sockets Display the list of Internet-domain sockets on the target. For each
socket, gdb prints the address and port of the local and remote
endpoints, the current state of the connection, the creator of the
socket, the IP address family of the socket, and the type of the
connection.
shm Display the list of all System V shared-memory regions on the tar-
get. For each shared-memory region, gdb prints the region key,
the shared-memory identifier, the access permissions, the size of
Chapter 10: Examining Data 141
the region, the process that created the region, the process that
last attached to or detached from the region, the current number of
live attaches to the region, and the times at which the region was
last attached to, detach from, and changed.
semaphores
Display the list of all System V semaphore sets on the target.
For each semaphore set, gdb prints the semaphore set key, the
semaphore set identifier, the access permissions, the number of
semaphores in the set, the user and group of the owner and creator
of the semaphore set, and the times at which the semaphore set
was operated upon and changed.
msg Display the list of all System V message queues on the target. For
each message queue, gdb prints the message queue key, the message
queue identifier, the access permissions, the current number of bytes
on the queue, the current number of messages on the queue, the
processes that last sent and received a message on the queue, the
user and group of the owner and creator of the message queue, the
times at which a message was last sent and received on the queue,
and the time at which the message queue was last changed.
modules Display the list of all loaded kernel modules on the target. For
each module, gdb prints the module name, the size of the module
in bytes, the number of times the module is used, the dependencies
of the module, the status of the module, and the address of the
loaded module in memory.
info os If infotype is omitted, then list the possible values for infotype and the kind of
OS information available for each infotype. If the target does not return a list
of possible types, this command will report an error.
10.17.1 Attributes
10.17.1.1 Memory Access Mode
The access mode attributes set whether gdb may make read or write accesses to a memory
region.
While these attributes prevent gdb from performing invalid memory accesses, they do
nothing to prevent the target system, I/O DMA, etc. from accessing memory.
ro Memory is read only.
wo Memory is write only.
rw Memory is read/write. This is the default.
If you give gdb the command set target-charset EBCDIC-US, then gdb translates be-
tween ebcdic and Latin 1 as you print character or string values, or use character and
string literals in expressions.
gdb has no way to automatically recognize which character set the inferior program
uses; you must tell it, using the set target-charset command, described below.
Here are the commands for controlling gdb’s character set support:
set target-charset charset
Set the current target character set to charset. To display the list of supported
target character sets, type set target-charset TABTAB.
set host-charset charset
Set the current host character set to charset.
By default, gdb uses a host character set appropriate to the system it is run-
ning on; you can override that default using the set host-charset command.
On some systems, gdb cannot automatically determine the appropriate host
character set. In this case, gdb uses ‘UTF-8’.
gdb can only use certain character sets as its host character set. If you type
set host-charset TABTAB, gdb will list the host character sets it supports.
set charset charset
Set the current host and target character sets to charset. As above, if you type
set charset TABTAB, gdb will list the names of the character sets that can be
used for both host and target.
show charset
Show the names of the current host and target character sets.
show host-charset
Show the name of the current host character set.
show target-charset
Show the name of the current target character set.
set target-wide-charset charset
Set the current target’s wide character set to charset. This is the character
set used by the target’s wchar_t type. To display the list of supported wide
character sets, type set target-wide-charset TABTAB.
show target-wide-charset
Show the name of the current target’s wide character set.
Here is an example of gdb’s character set support in action. Assume that the following
source code has been placed in the file ‘charset-test.c’:
#include <stdio.h>
char ascii_hello[]
= {72, 101, 108, 108, 111, 44, 32, 119,
111, 114, 108, 100, 33, 10, 0};
char ibm1047_hello[]
= {200, 133, 147, 147, 150, 107, 64, 166,
150, 153, 147, 132, 90, 37, 0};
146 Debugging with gdb
main ()
{
printf ("Hello, world!\n");
}
In this program, ascii_hello and ibm1047_hello are arrays containing the string
‘Hello, world!’ followed by a newline, encoded in the ascii and ibm1047 character sets.
We compile the program, and invoke the debugger on it:
$ gcc -g charset-test.c -o charset-test
$ gdb -nw charset-test
GNU gdb 2001-12-19-cvs
Copyright 2001 Free Software Foundation, Inc.
...
(gdb)
We can use the show charset command to see what character sets gdb is currently
using to interpret and display characters and strings:
(gdb) show charset
The current host and target character set is ‘ISO-8859-1’.
(gdb)
For the sake of printing this manual, let’s use ascii as our initial character set:
(gdb) set charset ASCII
(gdb) show charset
The current host and target character set is ‘ASCII’.
(gdb)
Let’s assume that ascii is indeed the correct character set for our host system — in
other words, let’s assume that if gdb prints characters using the ascii character set, our
terminal will display them properly. Since our current target character set is also ascii, the
contents of ascii_hello print legibly:
(gdb) print ascii_hello
$1 = 0x401698 "Hello, world!\n"
(gdb) print ascii_hello[0]
$2 = 72 ’H’
(gdb)
gdb uses the target character set for character and string literals you use in expressions:
(gdb) print ’+’
$3 = 43 ’+’
(gdb)
The ascii character set uses the number 43 to encode the ‘+’ character.
gdb relies on the user to tell it which character set the target program uses. If we print
ibm1047_hello while our target character set is still ascii, we get jibberish:
(gdb) print ibm1047_hello
$4 = 0x4016a8 "\310\205\223\223\226k@\246\226\231\223\204Z%"
(gdb) print ibm1047_hello[0]
$5 = 200 ’\310’
(gdb)
If we invoke the set target-charset followed by TABTAB, gdb tells us the character
sets it supports:
(gdb) set target-charset
ASCII EBCDIC-US IBM1047 ISO-8859-1
(gdb) set target-charset
Chapter 10: Examining Data 147
We can select ibm1047 as our target character set, and examine the program’s strings
again. Now the ascii string is wrong, but gdb translates the contents of ibm1047_hello
from the target character set, ibm1047, to the host character set, ascii, and they display
correctly:
(gdb) set target-charset IBM1047
(gdb) show charset
The current host character set is ‘ASCII’.
The current target character set is ‘IBM1047’.
(gdb) print ascii_hello
$6 = 0x401698 "\110\145%%?\054\040\167?\162%\144\041\012"
(gdb) print ascii_hello[0]
$7 = 72 ’\110’
(gdb) print ibm1047_hello
$8 = 0x4016a8 "Hello, world!\n"
(gdb) print ibm1047_hello[0]
$9 = 200 ’H’
(gdb)
As above, gdb uses the target character set for character and string literals you use in
expressions:
(gdb) print ’+’
$10 = 78 ’+’
(gdb)
The ibm1047 character set uses the number 78 to encode the ‘+’ character.
show stack-cache
Show the current state of data caching for memory accesses.
set code-cache on
set code-cache off
Enable or disable caching of code segment accesses. When on, use caching. By
default, this option is on. This improves performance of disassembly in remote
debugging.
show code-cache
Show the current state of target memory cache for code segment accesses.
info dcache [line]
Print the information about the performance of data cache of the current infe-
rior’s address space. The information displayed includes the dcache width and
depth, and for each cache line, its number, address, and how many times it was
referenced. This command is useful for debugging the data cache operation.
If a line number is specified, the contents of that line will be printed in hex.
set dcache size size
Set maximum number of entries in dcache (dcache depth above).
set dcache line-size line-size
Set number of bytes each dcache entry caches (dcache width above). Must be
a power of 2.
show dcache size
Show maximum number of dcache entries. See Section 10.21 [Caching Target
Data], page 147.
show dcache line-size
Show default size of dcache lines.
All values are interpreted in the current language. This means, for example,
that if the current source language is C/C++ then searching for the string “hello”
includes the trailing ’\0’.
If the value size is not specified, it is taken from the value’s type in the current
language. This is useful when one wants to specify the search pattern as a
mixture of types. Note that this means, for example, that in the case of C-like
languages a search for an untyped 0x42 will search for ‘(int) 0x42’ which is
typically four bytes.
n, maximum number of finds
The maximum number of matches to print. The default is to print all finds.
You can use strings as search values. Quote them with double-quotes ("). The string
value is copied into the search pattern byte by byte, regardless of the endianness of the
target and the size specification.
The address of each match found is printed as well as a count of the number of matches
found.
The address of the last value found is stored in convenience variable ‘$_’. A count of the
number of matches is stored in ‘$numfound’.
For example, if stopped at the printf in this function:
void
hello ()
{
static char hello[] = "hello-hello";
static struct { char c; short s; int i; }
__attribute__ ((packed)) mixed
= { ’c’, 0x1234, 0x87654321 };
printf ("%s\n", hello);
}
you get during debugging:
(gdb) find &hello[0], +sizeof(hello), "hello"
0x804956d <hello.1620+6>
1 pattern found
(gdb) find &hello[0], +sizeof(hello), ’h’, ’e’, ’l’, ’l’, ’o’
0x8049567 <hello.1620>
0x804956d <hello.1620+6>
2 patterns found
(gdb) find /b1 &hello[0], +sizeof(hello), ’h’, 0x65, ’l’
0x8049567 <hello.1620>
1 pattern found
(gdb) find &mixed, +sizeof(mixed), (char) ’c’, (short) 0x1234, (int) 0x87654321
0x8049560 <mixed.1625>
1 pattern found
(gdb) print $numfound
$1 = 1
(gdb) print $_
$2 = (void *) 0x8049560
Chapter 11: Debugging Optimized Code 151
• Setting breakpoints at the call site of an inlined function may not work, because the
call site does not contain any code. gdb may incorrectly move the breakpoint to the
next line of the enclosing function, after the call. This limitation will be removed in
a future version of gdb; until then, set a breakpoint on an earlier line or inside the
inlined function instead.
• gdb cannot locate the return value of inlined calls after using the finish command.
This is a limitation of compiler-generated debugging information; after finish, you
can step to the next line and print a variable where your program stored the return
value.
The detection of all the possible code path executions can find them ambiguous. There is
no execution history stored (possible Chapter 6 [Reverse Execution], page 83 is never used
for this purpose) and the last known caller could have reached the known callee by multiple
different jump sequences. In such case gdb still tries to show at least all the unambiguous
top tail callers and all the unambiguous bottom tail calees, if any.
(gdb) bt
#0 c (i=i@entry=0) at t.c:2
#1 0x0000000000400428 in a (DW_OP_GNU_entry_value resolving has found
function "a" at 0x400420 can call itself via tail calls
i=<optimized out>) at t.c:6
#2 0x000000000040036e in main () at t.c:7
gdb cannot find out from the inferior state if and how many times did function a call
itself (via function b) as these calls would be tail calls. Such tail calls would modify thue
i variable, therefore gdb cannot be sure the value it knows would be right - gdb prints
<optimized out> instead.
Chapter 12: C Preprocessor Macros 155
12 C Preprocessor Macros
Some languages, such as C and C++, provide a way to define and invoke “preprocessor
macros” which expand into strings of tokens. gdb can evaluate expressions containing
macro invocations, show the result of macro expansion, and show a macro’s definition,
including where it was defined.
You may need to compile your program specially to provide gdb with information about
preprocessor macros. Most compilers do not include macros in their debugging information,
even when you compile with the ‘-g’ flag. See Section 4.1 [Compilation], page 25.
A program may define a macro at one point, remove that definition later, and then
provide a different definition after that. Thus, at different points in the program, a macro
may have different definitions, or have no definition at all. If there is a current stack frame,
gdb uses the macros in scope at that frame’s source code line. Otherwise, gdb uses the
macros in scope at the current listing location; see Section 9.1 [List], page 99.
Whenever gdb evaluates an expression, it always expands any macro invocations present
in the expression. gdb also provides the following commands for working with macros
explicitly.
macro expand expression
macro exp expression
Show the results of expanding all preprocessor macro invocations in expression.
Since gdb simply expands macros, but does not parse the result, expression
need not be a valid expression; it can be any string of tokens.
macro expand-once expression
macro exp1 expression
(This command is not yet implemented.) Show the results of expanding those
preprocessor macro invocations that appear explicitly in expression. Macro
invocations appearing in that expansion are left unchanged. This command
allows you to see the effect of a particular macro more clearly, without being
confused by further expansions. Since gdb simply expands macros, but does
not parse the result, expression need not be a valid expression; it can be any
string of tokens.
info macro [-a|-all] [--] macro
Show the current definition or all definitions of the named macro, and describe
the source location or compiler command-line where that definition was estab-
lished. The optional double dash is to signify the end of argument processing
and the beginning of macro for non C-like macros where the macro may begin
with a hyphen.
info macros linespec
Show all macro definitions that are in effect at the location specified by line-
spec, and describe the source location or compiler command-line where those
definitions were established.
macro define macro replacement-list
macro define macro(arglist) replacement-list
Introduce a definition for a preprocessor macro named macro, invocations of
which are replaced by the tokens given in replacement-list. The first form of
156 Debugging with gdb
#define M 42
#define ADD(x) (M + x)
main ()
{
#define N 28
printf ("Hello, world!\n");
#undef N
printf ("We’re so creative.\n");
#define N 1729
printf ("Goodbye, world!\n");
}
$ cat sample.h
#define Q <
$
Now, we compile the program using the gnu C compiler, gcc. We pass the ‘-gdwarf-2’1
and ‘-g3’ flags to ensure the compiler includes information about preprocessor macros in
the debugging information.
$ gcc -gdwarf-2 -g3 sample.c -o sample
$
Now, we start gdb on our sample program:
$ gdb -nw sample
GNU gdb 2002-05-06-cvs
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, ...
(gdb)
1
This is the minimum. Recent versions of gcc support ‘-gdwarf-3’ and ‘-gdwarf-4’; we recommend
always choosing the most recent version of DWARF.
Chapter 12: C Preprocessor Macros 157
We can expand macros and examine their definitions, even when the program is not
running. gdb uses the current listing position to decide which macro definitions are in
scope:
(gdb) list main
3
4 #define M 42
5 #define ADD(x) (M + x)
6
7 main ()
8 {
9 #define N 28
10 printf ("Hello, world!\n");
11 #undef N
12 printf ("We’re so creative.\n");
(gdb) info macro ADD
Defined at /home/jimb/gdb/macros/play/sample.c:5
#define ADD(x) (M + x)
(gdb) info macro Q
Defined at /home/jimb/gdb/macros/play/sample.h:1
included at /home/jimb/gdb/macros/play/sample.c:2
#define Q <
(gdb) macro expand ADD(1)
expands to: (42 + 1)
(gdb) macro expand-once ADD(1)
expands to: once (M + 1)
(gdb)
In the example above, note that macro expand-once expands only the macro invocation
explicit in the original text — the invocation of ADD — but does not expand the invocation
of the macro M, which was introduced by ADD.
Once the program is running, gdb uses the macro definitions in force at the source line
of the current stack frame:
(gdb) break main
Breakpoint 1 at 0x8048370: file sample.c, line 10.
(gdb) run
Starting program: /home/jimb/gdb/macros/play/sample
13 Tracepoints
In some applications, it is not feasible for the debugger to interrupt the program’s execution
long enough for the developer to learn anything helpful about its behavior. If the program’s
correctness depends on its real-time behavior, delays introduced by a debugger might cause
the program to change its behavior drastically, or perhaps fail, even when the code itself is
correct. It is useful to be able to observe the program’s behavior without interrupting it.
Using gdb’s trace and collect commands, you can specify locations in the program,
called tracepoints, and arbitrary expressions to evaluate when those tracepoints are reached.
Later, using the tfind command, you can examine the values those expressions had when
the program hit the tracepoints. The expressions may also denote objects in memory—
structures or arrays, for example—whose values gdb should record; while visiting a partic-
ular tracepoint, you may inspect those objects as if they were in memory at that moment.
However, because gdb records these values without interacting with you, it can do so quickly
and unobtrusively, hopefully not disturbing the program’s behavior.
The tracepoint facility is currently available only for remote targets. See Chapter 19
[Targets], page 247. In addition, your remote target must know how to collect trace data.
This functionality is implemented in the remote stub; however, none of the stubs distributed
with gdb support tracepoints as of this writing. The format of the remote packets used to
implement tracepoints are described in Section E.6 [Tracepoint Packets], page 631.
It is also possible to get trace data from a file, in a manner reminiscent of corefiles;
you specify the filename, and use tfind to search through the file. See Section 13.4 [Trace
Files], page 175, for more details.
This chapter describes the tracepoint commands and features.
points, also known as markers, are embedded in the target program, and can be activated
or deactivated by name or address. These are usually placed at locations which facilitate
investigating what the target is actually doing. gdb’s support for static tracing includes
being able to list instrumentation points, and attach them with gdb defined high level tra-
cepoints that expose the whole range of convenience of gdb’s tracepoints support. Namely,
support for collecting registers values and values of global or local (to the instrumentation
point) variables; tracepoint conditions and trace state variables. The act of installing a gdb
static tracepoint on an instrumentation point, or marker, is referred to as probing a static
tracepoint marker.
gdbserver supports tracepoints on some target systems. See Section 20.3 [Tracepoints
support in gdbserver], page 253.
This section describes commands to set tracepoints and associated conditions and ac-
tions.
[etc...]
with “$”), but they are stored on the target. They must be created explicitly, using a
tvariable command. They are always 64-bit signed integers.
Trace state variables are remembered by gdb, and downloaded to the target along with
tracepoint information when the trace experiment starts. There are no intrinsic limits on
the number of trace state variables, beyond memory limitations of the target.
Although trace state variables are managed by the target, you can use them in print
commands and expressions as if they were convenience variables; gdb will get the current
value from the target while the trace experiment is running. Trace state variables share the
same namespace as other “$” variables, which means that you cannot have trace state vari-
ables with names like $23 or $pc, nor can you have a trace state variable and a convenience
variable with the same name.
tvariable $name [ = expression ]
The tvariable command creates a new trace state variable named $name, and
optionally gives it an initial value of expression. The expression is evaluated
when this command is entered; the result will be converted to an integer if
possible, otherwise gdb will report an error. A subsequent tvariable command
specifying the same name does not create a variable, but instead assigns the
supplied initial value to the existing variable of that name, overwriting any
previous initial value. The default initial value is 0.
info tvariables
List all the trace state variables along with their initial values. Their current
values may also be displayed, if the trace experiment is currently running.
delete tvariable [ $name ... ]
Delete the given trace state variables, or all of them if no arguments are speci-
fied.
In the following example, the action list begins with collect commands in-
dicating the things to be collected when the tracepoint is hit. Then, in order
to single-step and collect additional data following the tracepoint, a while-
stepping command is used, followed by the list of things to be collected after
each step in a sequence of single steps. The while-stepping command is ter-
minated by its own separate end command. Lastly, the action list is terminated
by an end command.
(gdb) trace foo
(gdb) actions
Enter actions for tracepoint 1, one per line:
> collect bar,baz
> collect $regs
> while-stepping 12
> collect $pc, arr[i]
> end
end
collect[/mods] expr1, expr2, ...
Collect values of the given expressions when the tracepoint is hit. This com-
mand accepts a comma-separated list of any valid expressions. In addition to
global, static, or local variables, the following special arguments are supported:
$regs Collect all registers.
$args Collect all function arguments.
$locals Collect all local variables.
$_ret Collect the return address. This is helpful if you want to see more
of a backtrace.
$_probe_argc
Collects the number of arguments from the static probe at which
the tracepoint is located. See Section 5.1.10 [Static Probe Points],
page 65.
$_probe_argn
n is an integer between 0 and 11. Collects the nth argument
from the static probe at which the tracepoint is located. See
Section 5.1.10 [Static Probe Points], page 65.
$_sdata Collect static tracepoint marker specific data. Only available for
static tracepoints. See Section 13.1.6 [Tracepoint Action Lists],
page 164. On the UST static tracepoints library backend, an in-
strumentation point resembles a printf function call. The tracing
library is able to collect user specified data formatted to a character
string using the format provided by the programmer that instru-
mented the program. Other backends have similar mechanisms.
Here’s an example of a UST marker call:
const char master_name[] = "$your_name";
trace_mark(channel1, marker1, "hello %s", master_name)
In this case, collecting $_sdata collects the string ‘hello
$yourname’. When analyzing the trace buffer, you can inspect
‘$_sdata’ like any other variable available to gdb.
166 Debugging with gdb
You can give several consecutive collect commands, each one with a single
argument, or one collect command with several arguments separated by com-
mas; the effect is the same.
The optional mods changes the usual handling of the arguments. s requests
that pointers to chars be handled as strings, in particular collecting the contents
of the memory being pointed at, up to the first zero. The upper bound is by
default the value of the print elements variable; if s is followed by a decimal
number, that is the upper bound instead. So for instance ‘collect/s25 mystr’
collects as many as 25 characters at ‘mystr’.
The command info scope (see Chapter 16 [Symbols], page 213) is particularly
useful for figuring out what data to collect.
teval expr1, expr2, ...
Evaluate the given expressions when the tracepoint is hit. This command ac-
cepts a comma-separated list of expressions. The results are discarded, so this
is mainly useful for assigning values to trace state variables (see Section 13.1.5
[Trace State Variables], page 163) without adding those values to the trace
buffer, as would be the case if the collect action were used.
while-stepping n
Perform n single-step instruction traces after the tracepoint, collecting new data
after each step. The while-stepping command is followed by the list of what
to collect while stepping (followed by its own end command):
> while-stepping 12
> collect $regs, myglobal
> end
>
Note that $pc is not automatically collected by while-stepping; you need
to explicitly collect that register if you need it. You may abbreviate while-
stepping as ws or stepping.
set default-collect expr1, expr2, ...
This variable is a list of expressions to collect at each tracepoint hit. It is
effectively an additional collect action prepended to every tracepoint action
list. The expressions are parsed individually for each tracepoint, so for instance
a variable named xyz may be interpreted as a global for one tracepoint, and a
local for another, as appropriate to the tracepoint’s location.
show default-collect
Show the list of expressions that are collected by default at each tracepoint hit.
show disconnected-tracing
Show the current choice for disconnected tracing.
When you reconnect to the target, the trace experiment may or may not still be running;
it might have filled the trace buffer in the meantime, or stopped for one of the other reasons.
If it is running, it will continue after reconnection.
Upon reconnection, the target will upload information about the tracepoints in effect.
gdb will then compare that information to the set of tracepoints currently defined, and
attempt to match them up, allowing for the possibility that the numbers may have changed
due to creation and deletion in the meantime. If one of the target’s tracepoints does not
match any in gdb, the debugger will create a new tracepoint, so that you have a number
with which to specify that tracepoint. This matching-up process is necessarily heuristic,
and it may result in useless tracepoints being created; you may simply delete them if they
are of no use.
If your target agent supports a circular trace buffer, then you can run a trace experiment
indefinitely without filling the trace buffer; when space runs out, the agent deletes already-
collected trace frames, oldest first, until there is enough room to continue collecting. This
is especially useful if your tracepoints are being hit too often, and your trace gets termi-
nated prematurely because the buffer is full. To ask for a circular trace buffer, simply set
‘circular-trace-buffer’ to on. You can set this at any time, including during tracing;
if the agent can do it, it will change buffer handling on the fly, otherwise it will not take
eff