\input texinfo      @c -*-texinfo-*-
@c Copyright (C) 1988-2015 Free Software Foundation, Inc.
@c
@c %**start of header
@c makeinfo ignores cmds prev to setfilename, so its arg cannot make use
@c of @set vars.  However, you can override filename with makeinfo -o.
@setfilename gdb.info
@c
@c man begin INCLUDE
@include gdb-cfg.texi
@c man end
@c
@settitle Debugging with @value{GDBN}
@setchapternewpage odd
@c %**end of header

@iftex
@c @smallbook
@c @cropmarks
@end iftex

@finalout
@c To avoid file-name clashes between index.html and Index.html, when
@c the manual is produced on a Posix host and then moved to a
@c case-insensitive filesystem (e.g., MS-Windows), we separate the
@c indices into two: Concept Index and all the rest.
@syncodeindex ky fn
@syncodeindex tp fn

@c readline appendices use @vindex, @findex and @ftable,
@c annotate.texi and gdbmi use @findex.
@syncodeindex vr fn

@c !!set GDB manual's edition---not the same as GDB version!
@c This is updated by GNU Press.
@set EDITION Tenth

@c !!set GDB edit command default editor
@set EDITOR /bin/ex

@c THIS MANUAL REQUIRES TEXINFO 4.0 OR LATER.

@c This is a dir.info fragment to support semi-automated addition of
@c manuals to an info tree.
@dircategory Software development
@direntry
* Gdb: (gdb).                     The GNU debugger.
* gdbserver: (gdb) Server.        The GNU debugging server.
@end direntry

@copying
@c man begin COPYRIGHT
Copyright @copyright{} 1988-2015 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software'' and ``Free Software Needs
Free Documentation'', with the Front-Cover Texts being ``A GNU Manual,''
and with the Back-Cover Texts as in (a) below.

(a) The FSF's Back-Cover Text is: ``You are free to copy and modify
this GNU Manual.  Buying copies from GNU Press supports the FSF in
developing GNU and promoting software freedom.''
@c man end
@end copying

@ifnottex
This file documents the @sc{gnu} debugger @value{GDBN}.

This is the @value{EDITION} Edition, of @cite{Debugging with
@value{GDBN}: the @sc{gnu} Source-Level Debugger} for @value{GDBN}
@ifset VERSION_PACKAGE
@value{VERSION_PACKAGE}
@end ifset
Version @value{GDBVN}.

@insertcopying
@end ifnottex

@titlepage
@title Debugging with @value{GDBN}
@subtitle The @sc{gnu} Source-Level Debugger
@sp 1
@subtitle @value{EDITION} Edition, for @value{GDBN} version @value{GDBVN}
@ifset VERSION_PACKAGE
@sp 1
@subtitle @value{VERSION_PACKAGE}
@end ifset
@author Richard Stallman, Roland Pesch, Stan Shebs, et al.
@page
@tex
{\parskip=0pt
\hfill (Send bugs and comments on @value{GDBN} to @value{BUGURL}.)\par
\hfill {\it Debugging with @value{GDBN}}\par
\hfill \TeX{}info \texinfoversion\par
}
@end tex

@vskip 0pt plus 1filll
Published by the Free Software Foundation @*
51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA@*
ISBN 978-0-9831592-3-0 @*

@insertcopying
@end titlepage
@page

@ifnottex
@node Top, Summary, (dir), (dir)

@top Debugging with @value{GDBN}

This file describes @value{GDBN}, the @sc{gnu} symbolic debugger.

This is the @value{EDITION} Edition, for @value{GDBN}
@ifset VERSION_PACKAGE
@value{VERSION_PACKAGE}
@end ifset
Version @value{GDBVN}.

Copyright (C) 1988-2015 Free Software Foundation, Inc.

This edition of the GDB manual is dedicated to the memory of Fred
Fish.  Fred was a long-standing contributor to GDB and to Free
software in general.  We will miss him.

@menu
* Summary::                     Summary of @value{GDBN}
* Sample Session::              A sample @value{GDBN} session

* Invocation::                  Getting in and out of @value{GDBN}
* Commands::                    @value{GDBN} commands
* Running::                     Running programs under @value{GDBN}
* Stopping::                    Stopping and continuing
* Reverse Execution::           Running programs backward
* Process Record and Replay::   Recording inferior's execution and replaying it
* Stack::                       Examining the stack
* Source::                      Examining source files
* Data::                        Examining data
* Optimized Code::              Debugging optimized code
* Macros::                      Preprocessor Macros
* Tracepoints::                 Debugging remote targets non-intrusively
* Overlays::                    Debugging programs that use overlays

* Languages::                   Using @value{GDBN} with different languages

* Symbols::                     Examining the symbol table
* Altering::                    Altering execution
* GDB Files::                   @value{GDBN} files
* Targets::                     Specifying a debugging target
* Remote Debugging::            Debugging remote programs
* Configurations::              Configuration-specific information
* Controlling GDB::             Controlling @value{GDBN}
* Extending GDB::               Extending @value{GDBN}
* Interpreters::		Command Interpreters
* TUI::                         @value{GDBN} Text User Interface
* Emacs::                       Using @value{GDBN} under @sc{gnu} Emacs
* GDB/MI::                      @value{GDBN}'s Machine Interface.
* Annotations::                 @value{GDBN}'s annotation interface.
* JIT Interface::               Using the JIT debugging interface.
* In-Process Agent::            In-Process Agent

* GDB Bugs::                    Reporting bugs in @value{GDBN}

@ifset SYSTEM_READLINE
* Command Line Editing: (rluserman).         Command Line Editing
* Using History Interactively: (history).    Using History Interactively
@end ifset
@ifclear SYSTEM_READLINE
* Command Line Editing::        Command Line Editing
* Using History Interactively:: Using History Interactively
@end ifclear
* In Memoriam::                 In Memoriam
* Formatting Documentation::    How to format and print @value{GDBN} documentation
* Installing GDB::              Installing GDB
* Maintenance Commands::        Maintenance Commands
* Remote Protocol::             GDB Remote Serial Protocol
* Agent Expressions::           The GDB Agent Expression Mechanism
* Target Descriptions::         How targets can describe themselves to
                                @value{GDBN}
* Operating System Information:: Getting additional information from
                                 the operating system
* Trace File Format::		GDB trace file format
* Index Section Format::        .gdb_index section format
* Man Pages::			Manual pages
* Copying::			GNU General Public License says
                                how you can copy and share GDB
* GNU Free Documentation License::  The license for this documentation
* Concept Index::               Index of @value{GDBN} concepts
* Command and Variable Index::  Index of @value{GDBN} commands, variables,
                                  functions, and Python data types
@end menu

@end ifnottex

@contents

@node Summary
@unnumbered Summary of @value{GDBN}

The purpose of a debugger such as @value{GDBN} 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.

@value{GDBN} can do four main kinds of things (plus other things in support of
these) to help you catch bugs in the act:

@itemize @bullet
@item
Start your program, specifying anything that might affect its behavior.

@item
Make your program stop on specified conditions.

@item
Examine what has happened, when your program has stopped.

@item
Change things in your program, so you can experiment with correcting the
effects of one bug and go on to learn about another.
@end itemize

You can use @value{GDBN} to debug programs written in C and C@t{++}.
For more information, see @ref{Supported Languages,,Supported Languages}.
For more information, see @ref{C,,C and C++}.

Support for D is partial.  For information on D, see
@ref{D,,D}.

@cindex Modula-2
Support for Modula-2 is partial.  For information on Modula-2, see
@ref{Modula-2,,Modula-2}.

Support for OpenCL C is partial.  For information on OpenCL C, see
@ref{OpenCL C,,OpenCL C}.

@cindex Pascal
Debugging Pascal programs which use sets, subranges, file variables, or
nested functions does not currently work.  @value{GDBN} does not support
entering expressions, printing values, or similar features using Pascal
syntax.

@cindex Fortran
@value{GDBN} can be used to debug programs written in Fortran, although
it may be necessary to refer to some variables with a trailing
underscore.

@value{GDBN} can be used to debug programs written in Objective-C,
using either the Apple/NeXT or the GNU Objective-C runtime.

@menu
* Free Software::               Freely redistributable software
* Free Documentation::          Free Software Needs Free Documentation
* Contributors::                Contributors to GDB
@end menu

@node Free Software
@unnumberedsec Free Software

@value{GDBN} is @dfn{free software}, protected by the @sc{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.

@node Free Documentation
@unnumberedsec Free Software Needs Free Documentation

The biggest deficiency in the free software community today is not in
the software---it is the lack of good free documentation that we can
include with the free software.  Many of our most important
programs do not come with free reference manuals and free introductory
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 modify 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 @emph{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 decision 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 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{licensing@@gnu.org}.

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
@url{http://www.fsf.org/doc/other-free-books.html}.

@node Contributors
@unnumberedsec Contributors to @value{GDBN}

Richard Stallman was the original author of @value{GDBN}, and of many
other @sc{gnu} programs.  Many others have contributed to its
development.  This section attempts to credit major contributors.  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 @file{ChangeLog} in the @value{GDBN} distribution approximates a
blow-by-blow account.

Changes much prior to version 2.0 are lost in the mists of time.

@quotation
@emph{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!
@end quotation

So that they may not regard their many labors as thankless, we
particularly thank those who shepherded @value{GDBN} 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 @sc{gnu} C@t{++} support
in @value{GDBN}, with significant additional contributions from Per
Bothner and Daniel Berlin.  James Clark wrote the @sc{gnu} C@t{++}
demangler.  Early work on C@t{++} was by Peter TerMaat (who also did
much general update work leading to release 3.0).

@value{GDBN} 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 Hikichi and Tomoyuki Hasei contributed Sony/News OS 3 support.
David Johnson contributed 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 debugging).
Jonathan Stone contributed Pyramid support.
Michael Tiemann contributed SPARC support.
Tim Tucker contributed support for the Gould NP1 and Gould Powernode.
Pace Willison contributed Intel 386 support.
Jay Vosburgh contributed Symmetry support.
Marko Mlinar contributed OpenRISC 1000 support.

Andreas Schwab contributed M68K @sc{gnu}/Linux support.

Rich Schaefer and Peter Schauer helped with support of SunOS shared
libraries.

Jay Fenlason and Roland McGrath ensured that @value{GDBN} 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 support, 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@t{++} 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
processors.

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 @value{GDBN}.

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@t{++}
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 @value{GDBN} to MS-DOS, for the DJGPP project.
Robert Hoehne made significant contributions to the DJGPP port.

Cygnus Solutions has sponsored @value{GDBN} maintenance and much of its
development since 1991.  Cygnus engineers who have worked on @value{GDBN}
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 Solutions, implemented the original @sc{gdb/mi} interface.

Jim Blandy added support for preprocessor macros, while working for Red
Hat.

Andrew Cagney designed @value{GDBN}'s architecture vector.  Many
people including Andrew Cagney, Stephane Carrez, Randolph Chung, Nick
Duffek, Richard Henderson, Mark Kettenis, 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 @value{GDBN}'s
unwinder framework, this consisting of a fresh new design featuring
frame IDs, independent frame sniffers, and the sentinel frame.  Mark
Kettenis implemented the @sc{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 @value{GDBN} 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.

@node Sample Session
@chapter A Sample @value{GDBN} Session

You can use this manual at your leisure to read all about @value{GDBN}.
However, a handful of commands are enough to get started using the
debugger.  This chapter illustrates those commands.

@iftex
In this sample session, we emphasize user input like this: @b{input},
to make it easier to pick out from the surrounding output.
@end iftex

@c FIXME: this example may not be appropriate for some configs, where
@c FIXME...primary interest is in remote use.

One of the preliminary versions of @sc{gnu} @code{m4} (a generic macro
processor) exhibits the following bug: sometimes, when we change its
quote strings from the default, the commands used to capture one macro
definition within another stop working.  In the following short @code{m4}
session, we define a macro @code{foo} which expands to @code{0000}; we
then use the @code{m4} built-in @code{defn} to define @code{bar} as the
same thing.  However, when we change the open quote string to
@code{<QUOTE>} and the close quote string to @code{<UNQUOTE>}, the same
procedure fails to define a new synonym @code{baz}:

@smallexample
$ @b{cd gnu/m4}
$ @b{./m4}
@b{define(foo,0000)}

@b{foo}
0000
@b{define(bar,defn(`foo'))}

@b{bar}
0000
@b{changequote(<QUOTE>,<UNQUOTE>)}

@b{define(baz,defn(<QUOTE>foo<UNQUOTE>))}
@b{baz}
@b{Ctrl-d}
m4: End of input: 0: fatal error: EOF in string
@end smallexample

@noindent
Let us use @value{GDBN} to try to see what is going on.

@smallexample
$ @b{@value{GDBP} m4}
@c FIXME: this falsifies the exact text played out, to permit smallbook
@c FIXME... format to come out better.
@value{GDBN} 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 @value{GDBN}; type "show warranty"
 for details.

@value{GDBN} @value{GDBVN}, Copyright 1999 Free Software Foundation, Inc...
(@value{GDBP})
@end smallexample

@noindent
@value{GDBN} reads only enough symbol data to know where to find the
rest when needed; as a result, the first prompt comes up very quickly.
We now tell @value{GDBN} to use a narrower display width than usual, so
that examples fit in this manual.

@smallexample
(@value{GDBP}) @b{set width 70}
@end smallexample

@noindent
We need to see how the @code{m4} built-in @code{changequote} works.
Having looked at the source, we know the relevant subroutine is
@code{m4_changequote}, so we set a breakpoint there with the @value{GDBN}
@code{break} command.

@smallexample
(@value{GDBP}) @b{break m4_changequote}
Breakpoint 1 at 0x62f4: file builtin.c, line 879.
@end smallexample

@noindent
Using the @code{run} command, we start @code{m4} running under @value{GDBN}
control; as long as control does not reach the @code{m4_changequote}
subroutine, the program runs as usual:

@smallexample
(@value{GDBP}) @b{run}
Starting program: /work/Editorial/gdb/gnu/m4/m4
@b{define(foo,0000)}

@b{foo}
0000
@end smallexample

@noindent
To trigger the breakpoint, we call @code{changequote}.  @value{GDBN}
suspends execution of @code{m4}, displaying information about the
context where it stops.

@smallexample
@b{changequote(<QUOTE>,<UNQUOTE>)}

Breakpoint 1, m4_changequote (argc=3, argv=0x33c70)
    at builtin.c:879
879         if (bad_argc(TOKEN_DATA_TEXT(argv[0]),argc,1,3))
@end smallexample

@noindent
Now we use the command @code{n} (@code{next}) to advance execution to
the next line of the current function.

@smallexample
(@value{GDBP}) @b{n}
882         set_quotes((argc >= 2) ? TOKEN_DATA_TEXT(argv[1])\
 : nil,
@end smallexample

@noindent
@code{set_quotes} looks like a promising subroutine.  We can go into it
by using the command @code{s} (@code{step}) instead of @code{next}.
@code{step} goes to the next line to be executed in @emph{any}
subroutine, so it steps into @code{set_quotes}.

@smallexample
(@value{GDBP}) @b{s}
set_quotes (lq=0x34c78 "<QUOTE>", rq=0x34c88 "<UNQUOTE>")
    at input.c:530
530         if (lquote != def_lquote)
@end smallexample

@noindent
The display that shows the subroutine where @code{m4} is now
suspended (and its arguments) is called a stack frame display.  It
shows a summary of the stack.  We can use the @code{backtrace}
command (which can also be spelled @code{bt}), to see where we are
in the stack as a whole: the @code{backtrace} command displays a
stack frame for each active subroutine.

@smallexample
(@value{GDBP}) @b{bt}
#0  set_quotes (lq=0x34c78 "<QUOTE>", rq=0x34c88 "<UNQUOTE>")
    at input.c:530
#1  0x6344 in m4_changequote (argc=3, argv=0x33c70)
    at builtin.c:882
#2  0x8174 in expand_macro (sym=0x33320) at macro.c:242
#3  0x7a88 in expand_token (obs=0x0, t=209696, td=0xf7fffa30)
    at macro.c:71
#4  0x79dc in expand_input () at macro.c:40
#5  0x2930 in main (argc=0, argv=0xf7fffb20) at m4.c:195
@end smallexample

@noindent
We step through a few more lines to see what happens.  The first two
times, we can use @samp{s}; the next two times we use @code{n} to avoid
falling into the @code{xstrdup} subroutine.

@smallexample
(@value{GDBP}) @b{s}
0x3b5c  532         if (rquote != def_rquote)
(@value{GDBP}) @b{s}
0x3b80  535         lquote = (lq == nil || *lq == '\0') ?  \
def_lquote : xstrdup(lq);
(@value{GDBP}) @b{n}
536         rquote = (rq == nil || *rq == '\0') ? def_rquote\
 : xstrdup(rq);
(@value{GDBP}) @b{n}
538         len_lquote = strlen(rquote);
@end smallexample

@noindent
The last line displayed looks a little odd; we can examine the variables
@code{lquote} and @code{rquote} to see if they are in fact the new left
and right quotes we specified.  We use the command @code{p}
(@code{print}) to see their values.

@smallexample
(@value{GDBP}) @b{p lquote}
$1 = 0x35d40 "<QUOTE>"
(@value{GDBP}) @b{p rquote}
$2 = 0x35d50 "<UNQUOTE>"
@end smallexample

@noindent
@code{lquote} and @code{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 @code{l} (@code{list}) command.

@smallexample
(@value{GDBP}) @b{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
@end smallexample

@noindent
Let us step past the two lines that set @code{len_lquote} and
@code{len_rquote}, and then examine the values of those variables.

@smallexample
(@value{GDBP}) @b{n}
539         len_rquote = strlen(lquote);
(@value{GDBP}) @b{n}
540     @}
(@value{GDBP}) @b{p len_lquote}
$3 = 9
(@value{GDBP}) @b{p len_rquote}
$4 = 7
@end smallexample

@noindent
That certainly looks wrong, assuming @code{len_lquote} and
@code{len_rquote} are meant to be the lengths of @code{lquote} and
@code{rquote} respectively.  We can set them to better values using
the @code{p} command, since it can print the value of
any expression---and that expression can include subroutine calls and
assignments.

@smallexample
(@value{GDBP}) @b{p len_lquote=strlen(lquote)}
$5 = 7
(@value{GDBP}) @b{p len_rquote=strlen(rquote)}
$6 = 9
@end smallexample

@noindent
Is that enough to fix the problem of using the new quotes with the
@code{m4} built-in @code{defn}?  We can allow @code{m4} to continue
executing with the @code{c} (@code{continue}) command, and then try the
example that caused trouble initially:

@smallexample
(@value{GDBP}) @b{c}
Continuing.

@b{define(baz,defn(<QUOTE>foo<UNQUOTE>))}

baz
0000
@end smallexample

@noindent
Success!  The new quotes now work just as well as the default ones.  The
problem seems to have been just the two typos defining the wrong
lengths.  We allow @code{m4} exit by giving it an EOF as input:

@smallexample
@b{Ctrl-d}
Program exited normally.
@end smallexample

@noindent
The message @samp{Program exited normally.} is from @value{GDBN}; it
indicates @code{m4} has finished executing.  We can end our @value{GDBN}
session with the @value{GDBN} @code{quit} command.

@smallexample
(@value{GDBP}) @b{quit}
@end smallexample

@node Invocation
@chapter Getting In and Out of @value{GDBN}

This chapter discusses how to start @value{GDBN}, and how to get out of it.
The essentials are:
@itemize @bullet
@item
type @samp{@value{GDBP}} to start @value{GDBN}.
@item
type @kbd{quit} or @kbd{Ctrl-d} to exit.
@end itemize

@menu
* Invoking GDB::                How to start @value{GDBN}
* Quitting GDB::                How to quit @value{GDBN}
* Shell Commands::              How to use shell commands inside @value{GDBN}
* Logging Output::              How to log @value{GDBN}'s output to a file
@end menu

@node Invoking GDB
@section Invoking @value{GDBN}

Invoke @value{GDBN} by running the program @code{@value{GDBP}}.  Once started,
@value{GDBN} reads commands from the terminal until you tell it to exit.

You can also run @code{@value{GDBP}} with a variety of arguments and options,
to specify more of your debugging environment at the outset.

The command-line options described here are designed
to cover a variety of situations; in some environments, some of these
options may effectively be unavailable.

The most usual way to start @value{GDBN} is with one argument,
specifying an executable program:

@smallexample
@value{GDBP} @var{program}
@end smallexample

@noindent
You can also start with both an executable program and a core file
specified:

@smallexample
@value{GDBP} @var{program} @var{core}
@end smallexample

You can, instead, specify a process ID as a second argument, if you want
to debug a running process:

@smallexample
@value{GDBP} @var{program} 1234
@end smallexample

@noindent
would attach @value{GDBN} to process @code{1234} (unless you also have a file
named @file{1234}; @value{GDBN} does check for a core file first).

Taking advantage of the second command-line argument requires a fairly
complete operating system; when you use @value{GDBN} as a remote
debugger attached to a bare board, there may not be any notion of
``process'', and there is often no way to get a core dump.  @value{GDBN}
will warn you if it is unable to attach or to read core dumps.

You can optionally have @code{@value{GDBP}} pass any arguments after the
executable file to the inferior using @code{--args}.  This option stops
option processing.
@smallexample
@value{GDBP} --args gcc -O2 -c foo.c
@end smallexample
This will cause @code{@value{GDBP}} to debug @code{gcc}, and to set
@code{gcc}'s command-line arguments (@pxref{Arguments}) to @samp{-O2 -c foo.c}.

You can run @code{@value{GDBP}} without printing the front material, which describes
@value{GDBN}'s non-warranty, by specifying @code{--silent}
(or @code{-q}/@code{--quiet}):

@smallexample
@value{GDBP} --silent
@end smallexample

@noindent
You can further control how @value{GDBN} starts up by using command-line
options.  @value{GDBN} itself can remind you of the options available.

@noindent
Type

@smallexample
@value{GDBP} -help
@end smallexample

@noindent
to display all available options and briefly describe their use
(@samp{@value{GDBP} -h} is a shorter equivalent).

All options and command line arguments you give are processed
in sequential order.  The order makes a difference when the
@samp{-x} option is used.


@menu
* File Options::                Choosing files
* Mode Options::                Choosing modes
* Startup::                     What @value{GDBN} does during startup
@end menu

@node File Options
@subsection Choosing Files

When @value{GDBN} starts, it reads any arguments other than options as
specifying an executable file and core file (or process ID).  This is
the same as if the arguments were specified by the @samp{-se} and
@samp{-c} (or @samp{-p}) options respectively.  (@value{GDBN} reads the
first argument that does not have an associated option flag as
equivalent to the @samp{-se} option followed by that argument; and the
second argument that does not have an associated option flag, if any, as
equivalent to the @samp{-c}/@samp{-p} option followed by that argument.)
If the second argument begins with a decimal digit, @value{GDBN} will
first attempt to attach to it as a process, and if that fails, attempt
to open it as a corefile.  If you have a corefile whose name begins with
a digit, you can prevent @value{GDBN} from treating it as a pid by
prefixing it with @file{./}, e.g.@: @file{./12345}.

If @value{GDBN} has not been configured to included core file support,
such as for most embedded targets, then it will complain about a second
argument and ignore it.

Many options have both long and short forms; both are shown in the
following list.  @value{GDBN} also recognizes the long forms if you truncate
them, so long as enough of the option is present to be unambiguous.
(If you prefer, you can flag option arguments with @samp{--} rather
than @samp{-}, though we illustrate the more usual convention.)

@c NOTE: the @cindex entries here use double dashes ON PURPOSE.  This
@c way, both those who look for -foo and --foo in the index, will find
@c it.

@table @code
@item -symbols @var{file}
@itemx -s @var{file}
@cindex @code{--symbols}
@cindex @code{-s}
Read symbol table from file @var{file}.

@item -exec @var{file}
@itemx -e @var{file}
@cindex @code{--exec}
@cindex @code{-e}
Use file @var{file} as the executable file to execute when appropriate,
and for examining pure data in conjunction with a core dump.

@item -se @var{file}
@cindex @code{--se}
Read symbol table from file @var{file} and use it as the executable
file.

@item -core @var{file}
@itemx -c @var{file}
@cindex @code{--core}
@cindex @code{-c}
Use file @var{file} as a core dump to examine.

@item -pid @var{number}
@itemx -p @var{number}
@cindex @code{--pid}
@cindex @code{-p}
Connect to process ID @var{number}, as with the @code{attach} command.

@item -command @var{file}
@itemx -x @var{file}
@cindex @code{--command}
@cindex @code{-x}
Execute commands from file @var{file}.  The contents of this file is
evaluated exactly as the @code{source} command would.
@xref{Command Files,, Command files}.

@item -eval-command @var{command}
@itemx -ex @var{command}
@cindex @code{--eval-command}
@cindex @code{-ex}
Execute a single @value{GDBN} command.

This option may be used multiple times to call multiple commands.  It may
also be interleaved with @samp{-command} as required.

@smallexample
@value{GDBP} -ex 'target sim' -ex 'load' \
   -x setbreakpoints -ex 'run' a.out
@end smallexample

@item -init-command @var{file}
@itemx -ix @var{file}
@cindex @code{--init-command}
@cindex @code{-ix}
Execute commands from file @var{file} before loading the inferior (but
after loading gdbinit files).
@xref{Startup}.

@item -init-eval-command @var{command}
@itemx -iex @var{command}
@cindex @code{--init-eval-command}
@cindex @code{-iex}
Execute a single @value{GDBN} command before loading the inferior (but
after loading gdbinit files).
@xref{Startup}.

@item -directory @var{directory}
@itemx -d @var{directory}
@cindex @code{--directory}
@cindex @code{-d}
Add @var{directory} to the path to search for source and script files.

@item -r
@itemx -readnow
@cindex @code{--readnow}
@cindex @code{-r}
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.

@end table

@node Mode Options
@subsection Choosing Modes

You can run @value{GDBN} in various alternative modes---for example, in
batch mode or quiet mode.

@table @code
@anchor{-nx}
@item -nx
@itemx -n
@cindex @code{--nx}
@cindex @code{-n}
Do not execute commands found in any initialization file.
There are three init files, loaded in the following order:

@table @code
@item @file{system.gdbinit}
This is the system-wide init file.
Its location is specified with the @code{--with-system-gdbinit}
configure option (@pxref{System-wide configuration}).
It is loaded first when @value{GDBN} starts, before command line options
have been processed.
@item @file{~/.gdbinit}
This is the init file in your home directory.
It is loaded next, after @file{system.gdbinit}, and before
command options have been processed.
@item @file{./.gdbinit}
This is the init file in the current directory.
It is loaded last, after command line options other than @code{-x} and
@code{-ex} have been processed.  Command line options @code{-x} and
@code{-ex} are processed last, after @file{./.gdbinit} has been loaded.
@end table

For further documentation on startup processing, @xref{Startup}.
For documentation on how to write command files,
@xref{Command Files,,Command Files}.

@anchor{-nh}
@item -nh
@cindex @code{--nh}
Do not execute commands found in @file{~/.gdbinit}, the init file
in your home directory.
@xref{Startup}.

@item -quiet
@itemx -silent
@itemx -q
@cindex @code{--quiet}
@cindex @code{--silent}
@cindex @code{-q}
``Quiet''.  Do not print the introductory and copyright messages.  These
messages are also suppressed in batch mode.

@item -batch
@cindex @code{--batch}
Run in batch mode.  Exit with status @code{0} after processing all the
command files specified with @samp{-x} (and all commands from
initialization files, if not inhibited with @samp{-n}).  Exit with
nonzero status if an error occurs in executing the @value{GDBN} commands
in the command files.  Batch mode also disables pagination, sets unlimited
terminal width and height @pxref{Screen Size}, and acts as if @kbd{set confirm
off} were in effect (@pxref{Messages/Warnings}).

Batch mode may be useful for running @value{GDBN} as a filter, for
example to download and run a program on another computer; in order to
make this more useful, the message

@smallexample
Program exited normally.
@end smallexample

@noindent
(which is ordinarily issued whenever a program running under
@value{GDBN} control terminates) is not issued when running in batch
mode.

@item -batch-silent
@cindex @code{--batch-silent}
Run in batch mode exactly like @samp{-batch}, but totally silently.  All
@value{GDBN} output to @code{stdout} is prevented (@code{stderr} is
unaffected).  This is much quieter than @samp{-silent} and would be useless
for an interactive session.

This is particularly useful when using targets that give @samp{Loading section}
messages, for example.

Note that targets that give their output via @value{GDBN}, as opposed to
writing directly to @code{stdout}, will also be made silent.

@item -return-child-result
@cindex @code{--return-child-result}
The return code from @value{GDBN} will be the return code from the child
process (the process being debugged), with the following exceptions:

@itemize @bullet
@item
@value{GDBN} 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 @samp{-return-child-result}.
@item
The user quits with an explicit value.  E.g., @samp{quit 1}.
@item
The child process never runs, or is not allowed to terminate, in which case
the exit code will be -1.
@end itemize

This option is useful in conjunction with @samp{-batch} or @samp{-batch-silent},
when @value{GDBN} is being used as a remote program loader or simulator
interface.

@item -nowindows
@itemx -nw
@cindex @code{--nowindows}
@cindex @code{-nw}
``No windows''.  If @value{GDBN} comes with a graphical user interface
(GUI) built in, then this option tells @value{GDBN} to only use the command-line
interface.  If no GUI is available, this option has no effect.

@item -windows
@itemx -w
@cindex @code{--windows}
@cindex @code{-w}
If @value{GDBN} includes a GUI, then this option requires it to be
used if possible.

@item -cd @var{directory}
@cindex @code{--cd}
Run @value{GDBN} using @var{directory} as its working directory,
instead of the current directory.

@item -data-directory @var{directory}
@itemx -D @var{directory}
@cindex @code{--data-directory}
@cindex @code{-D}
Run @value{GDBN} using @var{directory} as its data directory.
The data directory is where @value{GDBN} searches for its
auxiliary files.  @xref{Data Files}.

@item -fullname
@itemx -f
@cindex @code{--fullname}
@cindex @code{-f}
@sc{gnu} Emacs sets this option when it runs @value{GDBN} as a
subprocess.  It tells @value{GDBN} 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 stops).  This
recognizable format looks like two @samp{\032} characters, followed by
the file name, line number and character position separated by colons,
and a newline.  The Emacs-to-@value{GDBN} interface program uses the two
@samp{\032} characters as a signal to display the source code for the
frame.

@item -annotate @var{level}
@cindex @code{--annotate}
This option sets the @dfn{annotation level} inside @value{GDBN}.  Its
effect is identical to using @samp{set annotate @var{level}}
(@pxref{Annotations}).  The annotation @var{level} controls how much
information @value{GDBN} 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 @value{GDBN} is run as a subprocess of
@sc{gnu} Emacs, level 3 is the maximum annotation suitable for programs
that control @value{GDBN}, and level 2 has been deprecated.

The annotation mechanism has largely been superseded by @sc{gdb/mi}
(@pxref{GDB/MI}).

@item --args
@cindex @code{--args}
Change interpretation of command line so that arguments following the
executable file are passed as command line arguments to the inferior.
This option stops option processing.

@item -baud @var{bps}
@itemx -b @var{bps}
@cindex @code{--baud}
@cindex @code{-b}
Set the line speed (baud rate or bits per second) of any serial
interface used by @value{GDBN} for remote debugging.

@item -l @var{timeout}
@cindex @code{-l}
Set the timeout (in seconds) of any communication used by @value{GDBN}
for remote debugging.

@item -tty @var{device}
@itemx -t @var{device}
@cindex @code{--tty}
@cindex @code{-t}
Run using @var{device} for your program's standard input and output.
@c FIXME: kingdon thinks there is more to -tty.  Investigate.

@c resolve the situation of these eventually
@item -tui
@cindex @code{--tui}
Activate the @dfn{Text User Interface} when starting.  The Text User
Interface manages several text windows on the terminal, showing
source, assembly, registers and @value{GDBN} command outputs
(@pxref{TUI, ,@value{GDBN} Text User Interface}).  Do not use this
option if you run @value{GDBN} from Emacs (@pxref{Emacs, ,
Using @value{GDBN} under @sc{gnu} Emacs}).

@c @item -xdb
@c @cindex @code{--xdb}
@c Run in XDB compatibility mode, allowing the use of certain XDB commands.
@c For information, see the file @file{xdb_trans.html}, which is usually
@c installed in the directory @code{/opt/langtools/wdb/doc} on HP-UX
@c systems.

@item -interpreter @var{interp}
@cindex @code{--interpreter}
Use the interpreter @var{interp} for interface with the controlling
program or device.  This option is meant to be set by programs which
communicate with @value{GDBN} using it as a back end.
@xref{Interpreters, , Command Interpreters}.

@samp{--interpreter=mi} (or @samp{--interpreter=mi2}) causes
@value{GDBN} to use the @dfn{@sc{gdb/mi} interface} (@pxref{GDB/MI, ,
The @sc{gdb/mi} Interface}) included since @value{GDBN} version 6.0.  The
previous @sc{gdb/mi} interface, included in @value{GDBN} version 5.3 and
selected with @samp{--interpreter=mi1}, is deprecated.  Earlier
@sc{gdb/mi} interfaces are no longer supported.

@item -write
@cindex @code{--write}
Open the executable and core files for both reading and writing.  This
is equivalent to the @samp{set write on} command inside @value{GDBN}
(@pxref{Patching}).

@item -statistics
@cindex @code{--statistics}
This option causes @value{GDBN} to print statistics about time and
memory usage after it completes each command and returns to the prompt.

@item -version
@cindex @code{--version}
This option causes @value{GDBN} to print its version number and
no-warranty blurb, and exit.

@item -configuration
@cindex @code{--configuration}
This option causes @value{GDBN} to print details about its build-time
configuration parameters, and then exit.  These details can be
important when reporting @value{GDBN} bugs (@pxref{GDB Bugs}).

@end table

@node Startup
@subsection What @value{GDBN} Does During Startup
@cindex @value{GDBN} startup

Here's the description of what @value{GDBN} does during session startup:

@enumerate
@item
Sets up the command interpreter as specified by the command line
(@pxref{Mode Options, interpreter}).

@item
@cindex init file
Reads the system-wide @dfn{init file} (if @option{--with-system-gdbinit} was
used when building @value{GDBN}; @pxref{System-wide configuration,
 ,System-wide configuration and settings}) and executes all the commands in
that file.

@anchor{Home Directory Init File}
@item
Reads the init file (if any) in your home directory@footnote{On
DOS/Windows systems, the home directory is the one pointed to by the
@code{HOME} environment variable.} and executes all the commands in
that file.

@anchor{Option -init-eval-command}
@item
Executes commands and command files specified by the @samp{-iex} and
@samp{-ix} options in their specified order.  Usually you should use the
@samp{-ex} and @samp{-x} options instead, but this way you can apply
settings before @value{GDBN} init files get executed and before inferior
gets loaded.

@item
Processes command line options and operands.

@anchor{Init File in the Current Directory during Startup}
@item
Reads and executes the commands from init file (if any) in the current
working directory as long as @samp{set auto-load local-gdbinit} is set to
@samp{on} (@pxref{Init File in the Current Directory}).
This is only done if the current directory is
different from your home directory.  Thus, you can have more than one
init file, one generic in your home directory, and another, specific
to the program you are debugging, in the directory where you invoke
@value{GDBN}.

@item
If the command line specified a program to debug, or a process to
attach to, or a core file, @value{GDBN} loads any auto-loaded
scripts provided for the program or for its loaded shared libraries.
@xref{Auto-loading}.

If you wish to disable the auto-loading during startup,
you must do something like the following:

@smallexample
$ gdb -iex "set auto-load python-scripts off" myprogram
@end smallexample

Option @samp{-ex} does not work because the auto-loading is then turned
off too late.

@item
Executes commands and command files specified by the @samp{-ex} and
@samp{-x} options in their specified order.  @xref{Command Files}, for
more details about @value{GDBN} command files.

@item
Reads the command history recorded in the @dfn{history file}.
@xref{Command History}, for more details about the command history and the
files where @value{GDBN} records it.
@end enumerate

Init files use the same syntax as @dfn{command files} (@pxref{Command
Files}) and are processed by @value{GDBN} in the same way.  The init
file in your home directory can set options (such as @samp{set
complaints}) that affect subsequent processing of command line options
and operands.  Init files are not executed if you use the @samp{-nx}
option (@pxref{Mode Options, ,Choosing Modes}).

To display the list of init files loaded by gdb at startup, you
can use @kbd{gdb --help}.

@cindex init file name
@cindex @file{.gdbinit}
@cindex @file{gdb.ini}
The @value{GDBN} init files are normally called @file{.gdbinit}.
The DJGPP port of @value{GDBN} uses the name @file{gdb.ini}, due to
the limitations of file names imposed by DOS filesystems.  The Windows
port of @value{GDBN} uses the standard name, but if it finds a
@file{gdb.ini} file in your home directory, it warns you about that
and suggests to rename the file to the standard name.


@node Quitting GDB
@section Quitting @value{GDBN}
@cindex exiting @value{GDBN}
@cindex leaving @value{GDBN}

@table @code
@kindex quit @r{[}@var{expression}@r{]}
@kindex q @r{(@code{quit})}
@item quit @r{[}@var{expression}@r{]}
@itemx q
To exit @value{GDBN}, use the @code{quit} command (abbreviated
@code{q}), or type an end-of-file character (usually @kbd{Ctrl-d}).  If you
do not supply @var{expression}, @value{GDBN} will terminate normally;
otherwise it will terminate using the result of @var{expression} as the
error code.
@end table

@cindex interrupt
An interrupt (often @kbd{Ctrl-c}) does not exit from @value{GDBN}, but rather
terminates the action of any @value{GDBN} command that is in progress and
returns to @value{GDBN} command level.  It is safe to type the interrupt
character at any time because @value{GDBN} does not allow it to take effect
until a time when it is safe.

If you have been using @value{GDBN} to control an attached process or
device, you can release it with the @code{detach} command
(@pxref{Attach, ,Debugging an Already-running Process}).

@node Shell Commands
@section Shell Commands

If you need to execute occasional shell commands during your
debugging session, there is no need to leave or suspend @value{GDBN}; you can
just use the @code{shell} command.

@table @code
@kindex shell
@kindex !
@cindex shell escape
@item shell @var{command-string}
@itemx !@var{command-string}
Invoke a standard shell to execute @var{command-string}.
Note that no space is needed between @code{!} and @var{command-string}.
If it exists, the environment variable @code{SHELL} determines which
shell to run.  Otherwise @value{GDBN} uses the default shell
(@file{/bin/sh} on Unix systems, @file{COMMAND.COM} on MS-DOS, etc.).
@end table

The utility @code{make} is often needed in development environments.
You do not have to use the @code{shell} command for this purpose in
@value{GDBN}:

@table @code
@kindex make
@cindex calling make
@item make @var{make-args}
Execute the @code{make} program with the specified
arguments.  This is equivalent to @samp{shell make @var{make-args}}.
@end table

@node Logging Output
@section Logging Output
@cindex logging @value{GDBN} output
@cindex save @value{GDBN} output to a file

You may want to save the output of @value{GDBN} commands to a file.
There are several commands to control @value{GDBN}'s logging.

@table @code
@kindex set logging
@item set logging on
Enable logging.
@item set logging off
Disable logging.
@cindex logging file name
@item set logging file @var{file}
Change the name of the current logfile.  The default logfile is @file{gdb.txt}.
@item set logging overwrite [on|off]
By default, @value{GDBN} will append to the logfile.  Set @code{overwrite} if
you want @code{set logging on} to overwrite the logfile instead.
@item set logging redirect [on|off]
By default, @value{GDBN} output will go to both the terminal and the logfile.
Set @code{redirect} if you want output to go only to the log file.
@kindex show logging
@item show logging
Show the current values of the logging settings.
@end table

@node Commands
@chapter @value{GDBN} Commands

You can abbreviate a @value{GDBN} command to the first few letters of the command
name, if that abbreviation is unambiguous; and you can repeat certain
@value{GDBN} commands by typing just @key{RET}.  You can also use the @key{TAB}
key to get @value{GDBN} 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).

@menu
* Command Syntax::              How to give commands to @value{GDBN}
* Completion::                  Command completion
* Help::                        How to ask @value{GDBN} for help
@end menu

@node Command Syntax
@section Command Syntax

A @value{GDBN} command is a single line of input.  There is no limit on
how long it can be.  It starts with a command name, which is followed by
arguments whose meaning depends on the command name.  For example, the
command @code{step} accepts an argument which is the number of times to
step, as in @samp{step 5}.  You can also use the @code{step} command
with no arguments.  Some commands do not allow any arguments.

@cindex abbreviation
@value{GDBN} command names may always be truncated if that abbreviation is
unambiguous.  Other possible command abbreviations are listed in the
documentation for individual commands.  In some cases, even ambiguous
abbreviations are allowed; for example, @code{s} is specially defined as
equivalent to @code{step} even though there are other commands whose
names start with @code{s}.  You can test abbreviations by using them as
arguments to the @code{help} command.

@cindex repeating commands
@kindex RET @r{(repeat last command)}
A blank line as input to @value{GDBN} (typing just @key{RET}) means to
repeat the previous command.  Certain commands (for example, @code{run})
will not repeat this way; these are commands whose unintentional
repetition might cause trouble and which you are unlikely to want to
repeat.  User-defined commands can disable this feature; see
@ref{Define, dont-repeat}.

The @code{list} and @code{x} commands, when you repeat them with
@key{RET}, construct new arguments rather than repeating
exactly as typed.  This permits easy scanning of source or memory.

@value{GDBN} can also use @key{RET} in another way: to partition lengthy
output, in a way similar to the common utility @code{more}
(@pxref{Screen Size,,Screen Size}).  Since it is easy to press one
@key{RET} too many in this situation, @value{GDBN} disables command
repetition after any command that generates this sort of display.

@kindex # @r{(a comment)}
@cindex comment
Any text from a @kbd{#} to the end of the line is a comment; it does
nothing.  This is useful mainly in command files (@pxref{Command
Files,,Command Files}).

@cindex repeating command sequences
@kindex Ctrl-o @r{(operate-and-get-next)}
The @kbd{Ctrl-o} binding is useful for repeating a complex sequence of
commands.  This command accepts the current line, like @key{RET}, and
then fetches the next line relative to the current line from the history
for editing.

@node Completion
@section Command Completion

@cindex completion
@cindex word completion
@value{GDBN} can fill in the rest of a word in a command for you, if there is
only one possibility; it can also show you what the valid possibilities
are for the next word in a command, at any time.  This works for @value{GDBN}
commands, @value{GDBN} subcommands, and the names of symbols in your program.

Press the @key{TAB} key whenever you want @value{GDBN} to fill out the rest
of a word.  If there is only one possibility, @value{GDBN} fills in the
word, and waits for you to finish the command (or press @key{RET} to
enter it).  For example, if you type

@c FIXME "@key" does not distinguish its argument sufficiently to permit
@c complete accuracy in these examples; space introduced for clarity.
@c If texinfo enhancements make it unnecessary, it would be nice to
@c replace " @key" by "@key" in the following...
@smallexample
(@value{GDBP}) info bre @key{TAB}
@end smallexample

@noindent
@value{GDBN} fills in the rest of the word @samp{breakpoints}, since that is
the only @code{info} subcommand beginning with @samp{bre}:

@smallexample
(@value{GDBP}) info breakpoints
@end smallexample

@noindent
You can either press @key{RET} at this point, to run the @code{info
breakpoints} command, or backspace and enter something else, if
@samp{breakpoints} does not look like the command you expected.  (If you
were sure you wanted @code{info breakpoints} in the first place, you
might as well just type @key{RET} immediately after @samp{info bre},
to exploit command abbreviations rather than command completion).

If there is more than one possibility for the next word when you press
@key{TAB}, @value{GDBN} sounds a bell.  You can either supply more
characters and try again, or just press @key{TAB} a second time;
@value{GDBN} displays all the possible completions for that word.  For
example, you might want to set a breakpoint on a subroutine whose name
begins with @samp{make_}, but when you type @kbd{b make_@key{TAB}} @value{GDBN}
just sounds the bell.  Typing @key{TAB} again displays all the
function names in your program that begin with those characters, for
example:

@smallexample
(@value{GDBP}) b make_ @key{TAB}
@exdent @value{GDBN} sounds bell; press @key{TAB} again, to see:
make_a_section_from_file     make_environ
make_abs_section             make_function_type
make_blockvector             make_pointer_type
make_cleanup                 make_reference_type
make_command                 make_symbol_completion_list
(@value{GDBP}) b make_
@end smallexample

@noindent
After displaying the available possibilities, @value{GDBN} copies your
partial input (@samp{b make_} in the example) so you can finish the
command.

If you just want to see the list of alternatives in the first place, you
can press @kbd{M-?} rather than pressing @key{TAB} twice.  @kbd{M-?}
means @kbd{@key{META} ?}.  You can type this either by holding down a
key designated as the @key{META} shift on your keyboard (if there is
one) while typing @kbd{?}, or as @key{ESC} followed by @kbd{?}.

If the number of possible completions is large, @value{GDBN} will
print as much of the list as it has collected, as well as a message
indicating that the list may be truncated.

@smallexample
(@value{GDBP}) b m@key{TAB}@key{TAB}
main
<... the rest of the possible completions ...>
*** List may be truncated, max-completions reached. ***
(@value{GDBP}) b m
@end smallexample

@noindent
This behavior can be controlled with the following commands:

@table @code
@kindex set max-completions
@item set max-completions @var{limit}
@itemx set max-completions unlimited
Set the maximum number of completion candidates.  @value{GDBN} will
stop looking for more completions once it collects this many candidates.
This is useful when completing on things like function names as collecting
all the possible candidates can be time consuming.
The default value is 200.  A value of zero disables tab-completion.
Note that setting either no limit or a very large limit can make
completion slow.
@kindex show max-completions
@item show max-completions
Show the maximum number of candidates that @value{GDBN} will collect and show
during completion.
@end table

@cindex quotes in commands
@cindex completion of quoted strings
Sometimes the string you need, while logically a ``word'', may contain
parentheses or other characters that @value{GDBN} normally excludes from
its notion of a word.  To permit word completion to work in this
situation, you may enclose words in @code{'} (single quote marks) in
@value{GDBN} commands.

The most likely situation where you might need this is in typing the
name of a C@t{++} function.  This is because C@t{++} 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 @code{name}
that takes an @code{int} parameter, @code{name(int)}, or the version
that takes a @code{float} parameter, @code{name(float)}.  To use the
word-completion facilities in this situation, type a single quote
@code{'} at the beginning of the function name.  This alerts
@value{GDBN} that it may need to consider more information than usual
when you press @key{TAB} or @kbd{M-?} to request word completion:

@smallexample
(@value{GDBP}) b 'bubble( @kbd{M-?}
bubble(double,double)    bubble(int,int)
(@value{GDBP}) b 'bubble(
@end smallexample

In some cases, @value{GDBN} can tell that completing a name requires using
quotes.  When this happens, @value{GDBN} inserts the quote for you (while
completing as much as it can) if you do not type the quote in the first
place:

@smallexample
(@value{GDBP}) b bub @key{TAB}
@exdent @value{GDBN} alters your input line to the following, and rings a bell:
(@value{GDBP}) b 'bubble(
@end smallexample

@noindent
In general, @value{GDBN} 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 @ref{C Plus Plus
Expressions, ,C@t{++} Expressions}.  You can use the command @code{set
overload-resolution off} to disable overload resolution;
see @ref{Debugging C Plus Plus, ,@value{GDBN} Features for C@t{++}}.

@cindex completion of structure field names
@cindex structure field name completion
@cindex completion of union field names
@cindex union field name completion
When completing in an expression which looks up a field in a
structure, @value{GDBN} also tries@footnote{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.} to
limit completions to the field names available in the type of the
left-hand-side:

@smallexample
(@value{GDBP}) p gdb_stdout.@kbd{M-?}
magic                to_fputs             to_rewind
to_data              to_isatty            to_write
to_delete            to_put               to_write_async_safe
to_flush             to_read
@end smallexample

@noindent
This is because the @code{gdb_stdout} is a variable of the type
@code{struct ui_file} that is defined in @value{GDBN} sources as
follows:

@smallexample
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;
@}
@end smallexample


@node Help
@section Getting Help
@cindex online documentation
@kindex help

You can always ask @value{GDBN} itself for information on its commands,
using the command @code{help}.

@table @code
@kindex h @r{(@code{help})}
@item help
@itemx h
You can use @code{help} (abbreviated @code{h}) with no arguments to
display a short list of named classes of commands:

@smallexample
(@value{GDBP}) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without
               stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of
commands in that class.
Type "help" followed by command name for full
documentation.
Command name abbreviations are allowed if unambiguous.
(@value{GDBP})
@end smallexample
@c the above line break eliminates huge line overfull...

@item help @var{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 @code{status}:

@smallexample
(@value{GDBP}) help status
Status inquiries.

List of commands:

@c Line break in "show" line falsifies real output, but needed
@c to fit in smallbook page size.
info -- Generic command for showing things
        about the program being debugged
show -- Generic command for showing things
        about the debugger

Type "help" followed by command name for full
documentation.
Command name abbreviations are allowed if unambiguous.
(@value{GDBP})
@end smallexample

@item help @var{command}
With a command name as @code{help} argument, @value{GDBN} displays a
short paragraph on how to use that command.

@kindex apropos
@item apropos @var{args}
The @code{apropos} command searches through all of the @value{GDBN}
commands, and their documentation, for the regular expression specified in
@var{args}.  It prints out all matches found.  For example:

@smallexample
apropos alias
@end smallexample

@noindent
results in:

@smallexample
@c @group
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
@c @end group
@end smallexample

@kindex complete
@item complete @var{args}
The @code{complete @var{args}} command lists all the possible completions
for the beginning of a command.  Use @var{args} to specify the beginning of the
command you want completed.  For example:

@smallexample
complete i
@end smallexample

@noindent results in:

@smallexample
@group
if
ignore
info
inspect
@end group
@end smallexample

@noindent This is intended for use by @sc{gnu} Emacs.
@end table

In addition to @code{help}, you can use the @value{GDBN} commands @code{info}
and @code{show} to inquire about the state of your program, or the state
of @value{GDBN} itself.  Each command supports many topics of inquiry; this
manual introduces each of them in the appropriate context.  The listings
under @code{info} and under @code{show} in the Command, Variable, and
Function Index point to all the sub-commands.  @xref{Command and Variable
Index}.

@c @group
@table @code
@kindex info
@kindex i @r{(@code{info})}
@item info
This command (abbreviated @code{i}) is for describing the state of your
program.  For example, you can show the arguments passed to a function
with @code{info args}, list the registers currently in use with @code{info
registers}, or list the breakpoints you have set with @code{info breakpoints}.
You can get a complete list of the @code{info} sub-commands with
@w{@code{help info}}.

@kindex set
@item set
You can assign the result of an expression to an environment variable with
@code{set}.  For example, you can set the @value{GDBN} prompt to a $-sign with
@code{set prompt $}.

@kindex show
@item show
In contrast to @code{info}, @code{show} is for describing the state of
@value{GDBN} itself.
You can change most of the things you can @code{show}, by using the
related command @code{set}; for example, you can control what number
system is used for displays with @code{set radix}, or simply inquire
which is currently in use with @code{show radix}.

@kindex info set
To display all the settable parameters and their current
values, you can use @code{show} with no arguments; you may also use
@code{info set}.  Both commands produce the same display.
@c FIXME: "info set" violates the rule that "info" is for state of
@c FIXME...program.  Ck w/ GNU: "info set" to be called something else,
@c FIXME...or change desc of rule---eg "state of prog and debugging session"?
@end table
@c @end group

Here are several miscellaneous @code{show} subcommands, all of which are
exceptional in lacking corresponding @code{set} commands:

@table @code
@kindex show version
@cindex @value{GDBN} version number
@item show version
Show what version of @value{GDBN} is running.  You should include this
information in @value{GDBN} bug-reports.  If multiple versions of
@value{GDBN} are in use at your site, you may need to determine which
version of @value{GDBN} you are running; as @value{GDBN} evolves, new
commands are introduced, and old ones may wither away.  Also, many
system vendors ship variant versions of @value{GDBN}, and there are
variant versions of @value{GDBN} in @sc{gnu}/Linux distributions as well.
The version number is the same as the one announced when you start
@value{GDBN}.

@kindex show copying
@kindex info copying
@cindex display @value{GDBN} copyright
@item show copying
@itemx info copying
Display information about permission for copying @value{GDBN}.

@kindex show warranty
@kindex info warranty
@item show warranty
@itemx info warranty
Display the @sc{gnu} ``NO WARRANTY'' statement, or a warranty,
if your version of @value{GDBN} comes with one.

@kindex show configuration
@item show configuration
Display detailed information about the way @value{GDBN} was configured
when it was built.  This displays the optional arguments passed to the
@file{configure} script and also configuration parameters detected
automatically by @command{configure}.  When reporting a @value{GDBN}
bug (@pxref{GDB Bugs}), it is important to include this information in
your report.

@end table

@node Running
@chapter Running Programs Under @value{GDBN}

When you run a program under @value{GDBN}, you must first generate
debugging information when you compile it.

You may start @value{GDBN} 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.

@menu
* Compilation::                 Compiling for debugging
* Starting::                    Starting your program
* Arguments::                   Your program's arguments
* Environment::                 Your program's environment

* Working Directory::           Your program's working directory
* Input/Output::                Your program's input and output
* Attach::                      Debugging an already-running process
* Kill Process::                Killing the child process

* Inferiors and Programs::      Debugging multiple inferiors and programs
* Threads::                     Debugging programs with multiple threads
* Forks::                       Debugging forks
* Checkpoint/Restart::          Setting a @emph{bookmark} to return to later
@end menu

@node Compilation
@section Compiling for Debugging

In order to debug a program effectively, you need to generate
debugging information when you compile it.  This debugging information
is stored in the object file; it describes the data type of each
variable or function and the correspondence between source line numbers
and addresses in the executable code.

To request debugging information, specify the @samp{-g} option when you run
the compiler.

Programs that are to be shipped to your customers are compiled with
optimizations, using the @samp{-O} compiler option.  However, some
compilers are unable to handle the @samp{-g} and @samp{-O} options
together.  Using those compilers, you cannot generate optimized
executables containing debugging information.

@value{NGCC}, the @sc{gnu} C/C@t{++} compiler, supports @samp{-g} with or
without @samp{-O}, making it possible to debug optimized code.  We
recommend that you @emph{always} use @samp{-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 @ref{Optimized Code}.

Older versions of the @sc{gnu} C compiler permitted a variant option
@w{@samp{-gg}} for debugging information.  @value{GDBN} no longer supports this
format; if your @sc{gnu} C compiler has this option, do not use it.

@value{GDBN} knows about preprocessor macros and can show you their
expansion (@pxref{Macros}).  Most compilers do not include information
about preprocessor macros in the debugging information if you specify
the @option{-g} flag alone.  Version 3.1 and later of @value{NGCC},
the @sc{gnu} C compiler, provides macro information if you are using
the DWARF debugging format, and specify the option @option{-g3}.

@xref{Debugging Options,,Options for Debugging Your Program or GCC,
gcc.info, Using the @sc{gnu} Compiler Collection (GCC)}, for more
information on @value{NGCC} 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 @value{GDBN}.

@need 2000
@node Starting
@section Starting your Program
@cindex starting
@cindex running

@table @code
@kindex run
@kindex r @r{(@code{run})}
@item run
@itemx r
Use the @code{run} command to start your program under @value{GDBN}.
You must first specify the program name with an argument to
@value{GDBN} (@pxref{Invocation, ,Getting In and Out of
@value{GDBN}}), or by using the @code{file} or @code{exec-file}
command (@pxref{Files, ,Commands to Specify Files}).

@end table

If you are running your program in an execution environment that
supports processes, @code{run} creates an inferior process and makes
that process run your program.  In some environments without processes,
@code{run} jumps to the start of your program.  Other targets,
like @samp{remote}, are always running.  If you get an error
message like this one:

@smallexample
The "remote" target does not support "run".
Try "help target" or "continue".
@end smallexample

@noindent
then use @code{continue} to run your program.  You may need @code{load}
first (@pxref{load}).

The execution of a program is affected by certain information it
receives from its superior.  @value{GDBN} provides ways to specify this
information, which you must do @emph{before} starting your program.  (You
can change it after starting your program, but such changes only affect
your program the next time you start it.)  This information may be
divided into four categories:

@table @asis
@item The @emph{arguments.}
Specify the arguments to give your program as the arguments of the
@code{run} command.  If a shell is available on your target, the shell
is used to pass the arguments, so that you may use normal conventions
(such as wildcard expansion or variable substitution) in describing
the arguments.
In Unix systems, you can control which shell is used with the
@code{SHELL} environment variable.  If you do not define @code{SHELL},
@value{GDBN} uses the default shell (@file{/bin/sh}).  You can disable
use of any shell with the @code{set startup-with-shell} command (see
below for details).

@item The @emph{environment.}
Your program normally inherits its environment from @value{GDBN}, but you can
use the @value{GDBN} commands @code{set environment} and @code{unset
environment} to change parts of the environment that affect
your program.  @xref{Environment, ,Your Program's Environment}.

@item The @emph{working directory.}
Your program inherits its working directory from @value{GDBN}.  You can set
the @value{GDBN} working directory with the @code{cd} command in @value{GDBN}.
@xref{Working Directory, ,Your Program's Working Directory}.

@item The @emph{standard input and output.}
Your program normally uses the same device for standard input and
standard output as @value{GDBN} is using.  You can redirect input and output
in the @code{run} command line, or you can use the @code{tty} command to
set a different device for your program.
@xref{Input/Output, ,Your Program's Input and Output}.

@cindex pipes
@emph{Warning:} While input and output redirection work, you cannot use
pipes to pass the output of the program you are debugging to another
program; if you attempt this, @value{GDBN} is likely to wind up debugging the
wrong program.
@end table

When you issue the @code{run} command, your program begins to execute
immediately.  @xref{Stopping, ,Stopping and Continuing}, 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 @code{print}
or @code{call} commands.  @xref{Data, ,Examining Data}.

If the modification time of your symbol file has changed since the last
time @value{GDBN} read its symbols, @value{GDBN} discards its symbol
table, and reads it again.  When it does this, @value{GDBN} tries to retain
your current breakpoints.

@table @code
@kindex start
@item start
@cindex run to main procedure
The name of the main procedure can vary from language to language.
With C or C@t{++}, the main procedure name is always @code{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 @samp{start} command does the equivalent of setting a temporary
breakpoint at the beginning of the main procedure and then invoking
the @samp{run} command.

@cindex elaboration phase
Some programs contain an @dfn{elaboration} phase where some startup code is
executed before the main procedure is called.  This depends on the
languages used to write your program.  In C@t{++}, for instance,
constructors for static and global objects are executed before
@code{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
@samp{start} command.  These arguments will be given verbatim to the
underlying @samp{run} command.  Note that the same arguments will be
reused if no argument is provided during subsequent calls to
@samp{start} or @samp{run}.

It is sometimes necessary to debug the program during elaboration.  In
these cases, using the @code{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.

@anchor{set exec-wrapper}
@kindex set exec-wrapper
@item set exec-wrapper @var{wrapper}
@itemx show exec-wrapper
@itemx unset exec-wrapper
When @samp{exec-wrapper} is set, the specified wrapper is used to
launch programs for debugging.  @value{GDBN} starts your program
with a shell command of the form @kbd{exec @var{wrapper}
@var{program}}.  Quoting is added to @var{program} and its
arguments, but not to @var{wrapper}, so you should add quotes if
appropriate for your shell.  The wrapper runs until it executes
your program, and then @value{GDBN} takes control.

You can use any program that eventually calls @code{execve} with
its arguments as a wrapper.  Several standard Unix utilities do
this, e.g.@: @code{env} and @code{nohup}.  Any Unix shell script ending
with @code{exec "$@@"} will also work.

For example, you can use @code{env} to pass an environment variable to
the debugged program, without setting the variable in your shell's
environment:

@smallexample
(@value{GDBP}) set exec-wrapper env 'LD_PRELOAD=libtest.so'
(@value{GDBP}) run
@end smallexample

This command is available when debugging locally on most targets, excluding
@sc{djgpp}, Cygwin, MS Windows, and QNX Neutrino.

@kindex set startup-with-shell
@item set startup-with-shell
@itemx set startup-with-shell on
@itemx set startup-with-shell off
@itemx show set startup-with-shell
On Unix systems, by default, if a shell is available on your target,
@value{GDBN}) uses it to start your program.  Arguments of the
@code{run} command are passed to the shell, which does variable
substitution, expands wildcard characters and performs redirection of
I/O.  In some circumstances, it may be useful to disable such use of a
shell, for example, when debugging the shell itself or diagnosing
startup failures such as:

@smallexample
(@value{GDBP}) run
Starting program: ./a.out
During startup program terminated with signal SIGSEGV, Segmentation fault.
@end smallexample

@noindent
which indicates the shell or the wrapper specified with
@samp{exec-wrapper} crashed, not your program.  Most often, this is
caused by something odd in your shell's non-interactive mode
initialization file---such as @file{.cshrc} for C-shell,
$@file{.zshenv} for the Z shell, or the file specified in the
@samp{BASH_ENV} environment variable for BASH.

@anchor{set auto-connect-native-target}
@kindex set auto-connect-native-target
@item set auto-connect-native-target
@itemx set auto-connect-native-target on
@itemx set auto-connect-native-target off
@itemx show auto-connect-native-target

By default, if not connected to any target yet (e.g., with
@code{target remote}), the @code{run} command starts your program as a
native process under @value{GDBN}, on your local machine.  If you're
sure you don't want to debug programs on your local machine, you can
tell @value{GDBN} to not connect to the native target automatically
with the @code{set auto-connect-native-target off} command.

If @code{on}, which is the default, and if @value{GDBN} is not
connected to a target already, the @code{run} command automaticaly
connects to the native target, if one is available.

If @code{off}, and if @value{GDBN} is not connected to a target
already, the @code{run} command fails with an error:

@smallexample
(@value{GDBP}) run
Don't know how to run.  Try "help target".
@end smallexample

If @value{GDBN} is already connected to a target, @value{GDBN} always
uses it with the @code{run} command.

In any case, you can explicitly connect to the native target with the
@code{target native} command.  For example,

@smallexample
(@value{GDBP}) set auto-connect-native-target off
(@value{GDBP}) run
Don't know how to run.  Try "help target".
(@value{GDBP}) target native
(@value{GDBP}) run
Starting program: ./a.out
[Inferior 1 (process 10421) exited normally]
@end smallexample

In case you connected explicitly to the @code{native} target,
@value{GDBN} remains connected even if all inferiors exit, ready for
the next @code{run} command.  Use the @code{disconnect} command to
disconnect.

Examples of other commands that likewise respect the
@code{auto-connect-native-target} setting: @code{attach}, @code{info
proc}, @code{info os}.

@kindex set disable-randomization
@item set disable-randomization
@itemx set disable-randomization on
This option (enabled by default in @value{GDBN}) will turn off the native
randomization 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 @sc{gnu}/Linux.
On @sc{gnu}/Linux you can get the same behavior using

@smallexample
(@value{GDBP}) set exec-wrapper setarch `uname -m` -R
@end smallexample

@item set disable-randomization off
Leave the behavior of the started executable unchanged.  Some bugs rear their
ugly heads only when the program is loaded at certain addresses.  If your bug
disappears when you run the program under @value{GDBN}, that might be because
@value{GDBN} by default disables the address randomization on platforms, such
as @sc{gnu}/Linux, which do that for stand-alone programs.  Use @kbd{set
disable-randomization off} to try to reproduce such elusive bugs.

On targets where it is available, virtual address space randomization
protects the programs against certain kinds of security attacks.  In these
cases the attacker needs to know the exact location of a concrete executable
code.  Randomizing its location makes it impossible to inject jumps misusing
a code at its expected addresses.

Prelinking shared libraries provides a startup performance advantage but it
makes addresses in these libraries predictable for privileged processes by
having just unprivileged access at the target system.  Reading the shared
library binary gives enough information for assembling the malicious code
misusing it.  Still even a prelinked shared library can get loaded at a new
random address just requiring the regular relocation process during the
startup.  Shared libraries not already prelinked are always loaded at
a randomly chosen address.

Position independent executables (PIE) contain position independent code
similar to the shared libraries and therefore such executables get loaded at
a randomly chosen address upon startup.  PIE executables always load even
already prelinked shared libraries at a random address.  You can build such
executable using @command{gcc -fPIE -pie}.

Heap (malloc storage), stack and custom mmap areas are always placed randomly
(as long as the randomization is enabled).

@item show disable-randomization
Show the current setting of the explicit disable of the native randomization of
the virtual address space of the started program.

@end table

@node Arguments
@section Your Program's Arguments

@cindex arguments (to your program)
The arguments to your program can be specified by the arguments of the
@code{run} command.
They are passed to a shell, which expands wildcard characters and
performs redirection of I/O, and thence to your program.  Your
@code{SHELL} environment variable (if it exists) specifies what shell
@value{GDBN} uses.  If you do not define @code{SHELL}, @value{GDBN} uses
the default shell (@file{/bin/sh} on Unix).

On non-Unix systems, the program is usually invoked directly by
@value{GDBN}, which emulates I/O redirection via the appropriate system
calls, and the wildcard characters are expanded by the startup code of
the program, not by the shell.

@code{run} with no arguments uses the same arguments used by the previous
@code{run}, or those set by the @code{set args} command.

@table @code
@kindex set args
@item set args
Specify the arguments to be used the next time your program is run.  If
@code{set args} has no arguments, @code{run} executes your program
with no arguments.  Once you have run your program with arguments,
using @code{set args} before the next @code{run} is the only way to run
it again without arguments.

@kindex show args
@item show args
Show the arguments to give your program when it is started.
@end table

@node Environment
@section Your Program's Environment

@cindex environment (of your program)
The @dfn{environment} consists of a set of environment variables and
their values.  Environment variables conventionally record such things as
your user name, your home directory, your terminal type, and your search
path for programs to run.  Usually you set up environment variables with
the shell and they are inherited by all the other programs you run.  When
debugging, it can be useful to try running your program with a modified
environment without having to start @value{GDBN} over again.

@table @code
@kindex path
@item path @var{directory}
Add @var{directory} to the front of the @code{PATH} environment variable
(the search path for executables) that will be passed to your program.
The value of @code{PATH} used by @value{GDBN} does not change.
You may specify several directory names, separated by whitespace or by a
system-dependent separator character (@samp{:} on Unix, @samp{;} on
MS-DOS and MS-Windows).  If @var{directory} is already in the path, it
is moved to the front, so it is searched sooner.

You can use the string @samp{$cwd} to refer to whatever is the current
working directory at the time @value{GDBN} searches the path.  If you
use @samp{.} instead, it refers to the directory where you executed the
@code{path} command.  @value{GDBN} replaces @samp{.} in the
@var{directory} argument (with the current path) before adding
@var{directory} to the search path.
@c 'path' is explicitly nonrepeatable, but RMS points out it is silly to
@c document that, since repeating it would be a no-op.

@kindex show paths
@item show paths
Display the list of search paths for executables (the @code{PATH}
environment variable).

@kindex show environment
@item show environment @r{[}@var{varname}@r{]}
Print the value of environment variable @var{varname} to be given to
your program when it starts.  If you do not supply @var{varname},
print the names and values of all environment variables to be given to
your program.  You can abbreviate @code{environment} as @code{env}.

@kindex set environment
@item set environment @var{varname} @r{[}=@var{value}@r{]}
Set environment variable @var{varname} to @var{value}.  The value
changes for your program (and the shell @value{GDBN} uses to launch
it), not for @value{GDBN} itself.  The @var{value} may be any string; the
values of environment variables are just strings, and any
interpretation is supplied by your program itself.  The @var{value}
parameter is optional; if it is eliminated, the variable is set to a
null value.
@c "any string" here does not include leading, trailing
@c blanks. Gnu asks: does anyone care?

For example, this command:

@smallexample
set env USER = foo
@end smallexample

@noindent
tells the debugged program, when subsequently run, that its user is named
@samp{foo}.  (The spaces around @samp{=} are used for clarity here; they
are not actually required.)

Note that on Unix systems, @value{GDBN} runs your program via a shell,
which also inherits the environment set with @code{set environment}.
If necessary, you can avoid that by using the @samp{env} program as a
wrapper instead of using @code{set environment}.  @xref{set
exec-wrapper}, for an example doing just that.

@kindex unset environment
@item unset environment @var{varname}
Remove variable @var{varname} from the environment to be passed to your
program.  This is different from @samp{set env @var{varname} =};
@code{unset environment} removes the variable from the environment,
rather than assigning it an empty value.
@end table

@emph{Warning:} On Unix systems, @value{GDBN} runs your program using
the shell indicated by your @code{SHELL} environment variable if it
exists (or @code{/bin/sh} if not).  If your @code{SHELL} variable
names a shell that runs an initialization file when started
non-interactively---such as @file{.cshrc} for C-shell, $@file{.zshenv}
for the Z shell, or the file specified in the @samp{BASH_ENV}
environment variable for BASH---any variables you set in that file
affect your program.  You may wish to move setting of environment
variables to files that are only run when you sign on, such as
@file{.login} or @file{.profile}.

@node Working Directory
@section Your Program's Working Directory

@cindex working directory (of your program)
Each time you start your program with @code{run}, it inherits its
working directory from the current working directory of @value{GDBN}.
The @value{GDBN} working directory is initially whatever it inherited
from its parent process (typically the shell), but you can specify a new
working directory in @value{GDBN} with the @code{cd} command.

The @value{GDBN} working directory also serves as a default for the commands
that specify files for @value{GDBN} to operate on.  @xref{Files, ,Commands to
Specify Files}.

@table @code
@kindex cd
@cindex change working directory
@item cd @r{[}@var{directory}@r{]}
Set the @value{GDBN} working directory to @var{directory}.  If not
given, @var{directory} uses @file{'~'}.

@kindex pwd
@item pwd
Print the @value{GDBN} working directory.
@end table

It is generally impossible to find the current working directory of
the process being debugged (since a program can change its directory
during its run).  If you work on a system where @value{GDBN} is
configured with the @file{/proc} support, you can use the @code{info
proc} command (@pxref{SVR4 Process Information}) to find out the
current working directory of the debuggee.

@node Input/Output
@section Your Program's Input and Output

@cindex redirection
@cindex i/o
@cindex terminal
By default, the program you run under @value{GDBN} does input and output to
the same terminal that @value{GDBN} uses.  @value{GDBN} switches the terminal
to its own terminal modes to interact with you, but it records the terminal
modes your program was using and switches back to them when you continue
running your program.

@table @code
@kindex info terminal
@item info terminal
Displays information recorded by @value{GDBN} about the terminal modes your
program is using.
@end table

You can redirect your program's input and/or output using shell
redirection with the @code{run} command.  For example,

@smallexample
run > outfile
@end smallexample

@noindent
starts your program, diverting its output to the file @file{outfile}.

@kindex tty
@cindex controlling terminal
Another way to specify where your program should do input and output is
with the @code{tty} command.  This command accepts a file name as
argument, and causes this file to be the default for future @code{run}
commands.  It also resets the controlling terminal for the child
process, for future @code{run} commands.  For example,

@smallexample
tty /dev/ttyb
@end smallexample

@noindent
directs that processes started with subsequent @code{run} commands
default to do input and output on the terminal @file{/dev/ttyb} and have
that as their controlling terminal.

An explicit redirection in @code{run} overrides the @code{tty} command's
effect on the input/output device, but not its effect on the controlling
terminal.

When you use the @code{tty} command or redirect input in the @code{run}
command, only the input @emph{for your program} is affected.  The input
for @value{GDBN} still comes from your terminal.  @code{tty} is an alias
for @code{set inferior-tty}.

@cindex inferior tty
@cindex set inferior controlling terminal
You can use the @code{show inferior-tty} command to tell @value{GDBN} to
display the name of the terminal that will be used for future runs of your
program.

@table @code
@item set inferior-tty /dev/ttyb
@kindex set inferior-tty
Set the tty for the program being debugged to /dev/ttyb.

@item show inferior-tty
@kindex show inferior-tty
Show the current tty for the program being debugged.
@end table

@node Attach
@section Debugging an Already-running Process
@kindex attach
@cindex attach

@table @code
@item attach @var{process-id}
This command attaches to a running process---one that was started
outside @value{GDBN}.  (@code{info files} shows your active
targets.)  The command takes as argument a process ID.  The usual way to
find out the @var{process-id} of a Unix process is with the @code{ps} utility,
or with the @samp{jobs -l} shell command.

@code{attach} does not repeat if you press @key{RET} a second time after
executing the command.
@end table

To use @code{attach}, your program must be running in an environment
which supports processes; for example, @code{attach} does not work for
programs on bare-board targets that lack an operating system.  You must
also have permission to send the process a signal.

When you use @code{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
(@pxref{Source Path, ,Specifying Source Directories}).  You can also use
the @code{file} command to load the program.  @xref{Files, ,Commands to
Specify Files}.

The first thing @value{GDBN} does after arranging to debug the specified
process is to stop it.  You can examine and modify an attached process
with all the @value{GDBN} commands that are ordinarily available when
you start processes with @code{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 @code{continue} command after
attaching @value{GDBN} to the process.

@table @code
@kindex detach
@item detach
When you have finished debugging the attached process, you can use the
@code{detach} command to release it from @value{GDBN} control.  Detaching
the process continues its execution.  After the @code{detach} command,
that process and @value{GDBN} become completely independent once more, and you
are ready to @code{attach} another process or start one with @code{run}.
@code{detach} does not repeat if you press @key{RET} again after
executing the command.
@end table

If you exit @value{GDBN} while you have an attached process, you detach
that process.  If you use the @code{run} command, you kill that process.
By default, @value{GDBN} 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
@code{set confirm} command (@pxref{Messages/Warnings, ,Optional Warnings and
Messages}).

@node Kill Process
@section Killing the Child Process

@table @code
@kindex kill
@item kill
Kill the child process in which your program is running under @value{GDBN}.
@end table

This command is useful if you wish to debug a core dump instead of a
running process.  @value{GDBN} ignores any core dump file while your program
is running.

On some operating systems, a program cannot be executed outside @value{GDBN}
while you have breakpoints set on it inside @value{GDBN}.  You can use the
@code{kill} command in this situation to permit running your program
outside the debugger.

The @code{kill} command is also useful if you wish to recompile and
relink your program, since on many systems it is impossible to modify an
executable file while it is running in a process.  In this case, when you
next type @code{run}, @value{GDBN} notices that the file has changed, and
reads the symbol table again (while trying to preserve your current
breakpoint settings).

@node Inferiors and Programs
@section Debugging Multiple Inferiors and Programs

@value{GDBN} lets you run and debug multiple programs in a single
session.  In addition, @value{GDBN} on some systems may let you run
several programs simultaneously (otherwise you have to exit from one
before starting another).  In the most general case, you can have
multiple threads of execution in each of multiple processes, launched
from multiple executables.

@cindex inferior
@value{GDBN} represents the state of each program execution with an
object called an @dfn{inferior}.  An inferior typically corresponds to
a process, but is more general and applies also to targets that do not
have processes.  Inferiors may be created before a process runs, and
may be retained after a process exits.  Inferiors have unique
identifiers that are different from process ids.  Usually each
inferior will also have its own distinct address space, although 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 @w{@code{info
inferiors}}:

@table @code
@kindex info inferiors
@item info inferiors
Print a list of all inferiors currently being managed by @value{GDBN}.

@value{GDBN} displays for each inferior (in this order):

@enumerate
@item
the inferior number assigned by @value{GDBN}

@item
the target system's inferior identifier

@item
the name of the executable the inferior is running.

@end enumerate

@noindent
An asterisk @samp{*} preceding the @value{GDBN} inferior number
indicates the current inferior.

For example,
@end table
@c end table here to get a little more width for example

@smallexample
(@value{GDBP}) info inferiors
  Num  Description       Executable
  2    process 2307      hello
* 1    process 3401      goodbye
@end smallexample

To switch focus between inferiors, use the @code{inferior} command:

@table @code
@kindex inferior @var{infno}
@item inferior @var{infno}
Make inferior number @var{infno} the current inferior.  The argument
@var{infno} is the inferior number assigned by @value{GDBN}, as shown
in the first field of the @samp{info inferiors} display.
@end table


You can get multiple executables into a debugging session via the
@code{add-inferior} and @w{@code{clone-inferior}} commands.  On some
systems @value{GDBN} can add inferiors to the debug session
automatically by following calls to @code{fork} and @code{exec}.  To
remove inferiors from the debugging session use the
@w{@code{remove-inferiors}} command.

@table @code
@kindex add-inferior
@item add-inferior [ -copies @var{n} ] [ -exec @var{executable} ]
Adds @var{n} inferiors to be run using @var{executable} as the
executable; @var{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
@code{file} command with the executable name as its argument.

@kindex clone-inferior
@item clone-inferior [ -copies @var{n} ] [ @var{infno} ]
Adds @var{n} inferiors ready to execute the same program as inferior
@var{infno}; @var{n} defaults to 1, and @var{infno} defaults to the
number of the current inferior.  This is a convenient command when you
want to run another instance of the inferior you are debugging.

@smallexample
(@value{GDBP}) info inferiors
  Num  Description       Executable
* 1    process 29964     helloworld
(@value{GDBP}) clone-inferior
Added inferior 2.
1 inferiors added.
(@value{GDBP}) info inferiors
  Num  Description       Executable
  2    <null>            helloworld
* 1    process 29964     helloworld
@end smallexample

You can now simply switch focus to inferior 2 and run it.

@kindex remove-inferiors
@item remove-inferiors @var{infno}@dots{}
Removes the inferior or inferiors @var{infno}@dots{}.  It is not
possible to remove an inferior that is running with this command.  For
those, use the @code{kill} or @code{detach} command first.

@end table

To quit debugging one of the running inferiors that is not the current
inferior, you can either detach from it by using the @w{@code{detach
inferior}} command (allowing it to run independently), or kill it
using the @w{@code{kill inferiors}} command:

@table @code
@kindex detach inferiors @var{infno}@dots{}
@item detach inferior @var{infno}@dots{}
Detach from the inferior or inferiors identified by @value{GDBN}
inferior number(s) @var{infno}@dots{}.  Note that the inferior's entry
still stays on the list of inferiors shown by @code{info inferiors},
but its Description will show @samp{<null>}.

@kindex kill inferiors @var{infno}@dots{}
@item kill inferiors @var{infno}@dots{}
Kill the inferior or inferiors identified by @value{GDBN} inferior
number(s) @var{infno}@dots{}.  Note that the inferior's entry still
stays on the list of inferiors shown by @code{info inferiors}, but its
Description will show @samp{<null>}.
@end table

After the successful completion of a command such as @code{detach},
@code{detach inferiors}, @code{kill} or @code{kill inferiors}, or after
a normal process exit, the inferior is still valid and listed with
@code{info inferiors}, ready to be restarted.


To be notified when inferiors are started or exit under @value{GDBN}'s
control use @w{@code{set print inferior-events}}:

@table @code
@kindex set print inferior-events
@cindex print messages on inferior start and exit
@item set print inferior-events
@itemx set print inferior-events on
@itemx set print inferior-events off
The @code{set print inferior-events} command allows you to enable or
disable printing of messages when @value{GDBN} notices that new
inferiors have started or that inferiors have exited or have been
detached.  By default, these messages will not be printed.

@kindex show print inferior-events
@item show print inferior-events
Show whether messages will be printed when @value{GDBN} detects that
inferiors have started, exited or have been detached.
@end table

Many commands will work the same with multiple programs as with a
single program: e.g., @code{print myglobal} will simply display the
value of @code{myglobal} in the current inferior.


Occasionaly, when debugging @value{GDBN} 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 @w{@code{maint
info program-spaces}} command.

@table @code
@kindex maint info program-spaces
@item maint info program-spaces
Print a list of all program spaces currently being managed by
@value{GDBN}.

@value{GDBN} displays for each program space (in this order):

@enumerate
@item
the program space number assigned by @value{GDBN}

@item
the name of the executable loaded into the program space, with e.g.,
the @code{file} command.

@end enumerate

@noindent
An asterisk @samp{*} preceding the @value{GDBN} program space number
indicates the current program space.

In addition, below each program space line, @value{GDBN} prints extra
information that isn't suitable to display in tabular form.  For
example, the list of inferiors bound to the program space.

@smallexample
(@value{GDBP}) maint info program-spaces
  Id   Executable
  2    goodbye
        Bound inferiors: ID 1 (process 21561)
* 1    hello
@end smallexample

Here we can see that no inferior is running the program @code{hello},
while @code{process 21561} is running the program @code{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 @code{vfork} call.  For example,

@smallexample
(@value{GDBP}) maint info program-spaces
  Id   Executable
* 1    vfork-test
        Bound inferiors: ID 2 (process 18050), ID 1 (process 18045)
@end smallexample

Here, both inferior 2 and inferior 1 are running in the same program
space as a result of inferior 1 having executed a @code{vfork} call.
@end table

@node Threads
@section Debugging Programs with Multiple Threads

@cindex threads of execution
@cindex multiple threads
@cindex switching threads
In some operating systems, such as HP-UX and Solaris, a single program
may have more than one @dfn{thread} of execution.  The precise semantics
of threads differ from one operating system to another, but in general
the threads of a single program are akin to multiple processes---except
that they share one address space (that is, they can all examine and
modify the same variables).  On the other hand, each thread has its own
registers and execution stack, and perhaps private memory.

@value{GDBN} provides these facilities for debugging multi-thread
programs:

@itemize @bullet
@item automatic notification of new threads
@item @samp{thread @var{threadno}}, a command to switch among threads
@item @samp{info threads}, a command to inquire about existing threads
@item @samp{thread apply [@var{threadno}] [@var{all}] @var{args}},
a command to apply a command to a list of threads
@item thread-specific breakpoints
@item @samp{set print thread-events}, which controls printing of 
messages on thread start and exit.
@item @samp{set libthread-db-search-path @var{path}}, which lets
the user specify which @code{libthread_db} to use if the default choice
isn't compatible with the program.
@end itemize

@quotation
@emph{Warning:} These facilities are not yet available on every
@value{GDBN} configuration where the operating system supports threads.
If your @value{GDBN} does not support threads, these commands have no
effect.  For example, a system without thread support shows no output
from @samp{info threads}, and always rejects the @code{thread} command,
like this:

@smallexample
(@value{GDBP}) info threads
(@value{GDBP}) thread 1
Thread ID 1 not known.  Use the "info threads" command to
see the IDs of currently known threads.
@end smallexample
@c FIXME to implementors: how hard would it be to say "sorry, this GDB
@c                        doesn't support threads"?
@end quotation

@cindex focus of debugging
@cindex current thread
The @value{GDBN} thread debugging facility allows you to observe all
threads while your program runs---but whenever @value{GDBN} takes
control, one thread in particular is always the focus of debugging.
This thread is called the @dfn{current thread}.  Debugging commands show
program information from the perspective of the current thread.

@cindex @code{New} @var{systag} message
@cindex thread identifier (system)
@c FIXME-implementors!! It would be more helpful if the [New...] message
@c included GDB's numeric thread handle, so you could just go to that
@c thread without first checking `info threads'.
Whenever @value{GDBN} detects a new thread in your program, it displays
the target system's identification for the thread with a message in the
form @samp{[New @var{systag}]}, where @var{systag} is a thread identifier
whose form varies depending on the particular system.  For example, on
@sc{gnu}/Linux, you might see

@smallexample
[New Thread 0x41e02940 (LWP 25582)]
@end smallexample

@noindent
when @value{GDBN} notices a new thread.  In contrast, on an SGI system,
the @var{systag} is simply something like @samp{process 368}, with no
further qualifier.

@c FIXME!! (1) Does the [New...] message appear even for the very first
@c         thread of a program, or does it only appear for the
@c         second---i.e.@: when it becomes obvious we have a multithread
@c         program?
@c         (2) *Is* there necessarily a first thread always?  Or do some
@c         multithread systems permit starting a program with multiple
@c         threads ab initio?

@cindex thread number
@cindex thread identifier (GDB)
For debugging purposes, @value{GDBN} associates its own thread
number---always a single integer---with each thread in your program.

@table @code
@kindex info threads
@item info threads @r{[}@var{id}@dots{}@r{]}
Display a summary of all threads currently in your program.  Optional 
argument @var{id}@dots{} is one or more thread ids separated by spaces, and
means to print information only about the specified thread or threads.
@value{GDBN} displays for each thread (in this order):

@enumerate
@item
the thread number assigned by @value{GDBN}

@item
the target system's thread identifier (@var{systag})

@item
the thread's name, if one is known.  A thread can either be named by
the user (see @code{thread name}, below), or, in some cases, by the
program itself.

@item
the current stack frame summary for that thread
@end enumerate

@noindent
An asterisk @samp{*} to the left of the @value{GDBN} thread number
indicates the current thread.

For example,
@end table
@c end table here to get a little more width for example

@smallexample
(@value{GDBP}) info threads
  Id   Target Id         Frame
  3    process 35 thread 27  0x34e5 in sigpause ()
  2    process 35 thread 23  0x34e5 in sigpause ()
* 1    process 35 thread 13  main (argc=1, argv=0x7ffffff8)
    at threadtest.c:68
@end smallexample

On Solaris, you can display more information about user threads with a
Solaris-specific command:

@table @code
@item maint info sol-threads
@kindex maint info sol-threads
@cindex thread info (Solaris)
Display info on Solaris user threads.
@end table

@table @code
@kindex thread @var{threadno}
@item thread @var{threadno}
Make thread number @var{threadno} the current thread.  The command
argument @var{threadno} is the internal @value{GDBN} thread number, as
shown in the first field of the @samp{info threads} display.
@value{GDBN} responds by displaying the system identifier of the thread
you selected, and its current stack frame summary:

@smallexample
(@value{GDBP}) thread 2
[Switching to thread 2 (Thread 0xb7fdab70 (LWP 12747))]
#0  some_function (ignore=0x0) at example.c:8
8	    printf ("hello\n");
@end smallexample

@noindent
As with the @samp{[New @dots{}]} message, the form of the text after
@samp{Switching to} depends on your system's conventions for identifying
threads.

@vindex $_thread@r{, convenience variable}
The debugger convenience variable @samp{$_thread} contains the number
of the current thread.  You may find this useful in writing breakpoint
conditional expressions, command scripts, and so forth.  See
@xref{Convenience Vars,, Convenience Variables}, for general
information on convenience variables.

@kindex thread apply
@cindex apply command to several threads
@item thread apply [@var{threadno} | all [-ascending]] @var{command}
The @code{thread apply} command allows you to apply the named
@var{command} to one or more threads.  Specify the numbers of the
threads that you want affected with the command argument
@var{threadno}.  It can be a single thread number, one of the numbers
shown in the first field of the @samp{info threads} display; or it
could be a range of thread numbers, as in @code{2-4}.  To apply
a command to all threads in descending order, type @kbd{thread apply all
@var{command}}.  To apply a command to all threads in ascending order,
type @kbd{thread apply all -ascending @var{command}}.


@kindex thread name
@cindex name a thread
@item thread name [@var{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 @samp{info threads} display.

On some systems, such as @sc{gnu}/Linux, @value{GDBN} is able to
determine the name of the thread as given by the OS.  On these
systems, a name specified with @samp{thread name} will override the
system-give name, and removing the user-specified name will cause
@value{GDBN} to once again display the system-specified name.

@kindex thread find
@cindex search for a thread
@item thread find [@var{regexp}]
Search for and display thread ids whose name or @var{systag}
matches the supplied regular expression.

As well as being the complement to the @samp{thread name} command, 
this command also allows you to identify a thread by its target 
@var{systag}.  For instance, on @sc{gnu}/Linux, the target @var{systag}
is the LWP id.

@smallexample
(@value{GDBN}) thread find 26688
Thread 4 has target id 'Thread 0x41e02940 (LWP 26688)'
(@value{GDBN}) info thread 4
  Id   Target Id         Frame 
  4    Thread 0x41e02940 (LWP 26688) 0x00000031ca6cd372 in select ()
@end smallexample

@kindex set print thread-events
@cindex print messages on thread start and exit
@item set print thread-events
@itemx set print thread-events on
@itemx set print thread-events off
The @code{set print thread-events} command allows you to enable or
disable printing of messages when @value{GDBN} notices that new threads have
started or that threads have exited.  By default, these messages will
be printed if detection of these events is supported by the target.
Note that these messages cannot be disabled on all targets.

@kindex show print thread-events
@item show print thread-events
Show whether messages will be printed when @value{GDBN} detects that threads
have started and exited.
@end table

@xref{Thread Stops,,Stopping and Starting Multi-thread Programs}, for
more information about how @value{GDBN} behaves when you stop and start
programs with multiple threads.

@xref{Set Watchpoints,,Setting Watchpoints}, for information about
watchpoints in programs with multiple threads.

@anchor{set libthread-db-search-path}
@table @code
@kindex set libthread-db-search-path
@cindex search path for @code{libthread_db}
@item set libthread-db-search-path @r{[}@var{path}@r{]}
If this variable is set, @var{path} is a colon-separated list of
directories @value{GDBN} will use to search for @code{libthread_db}.
If you omit @var{path}, @samp{libthread-db-search-path} will be reset to
its default value (@code{$sdir:$pdir} on @sc{gnu}/Linux and Solaris systems).
Internally, the default value comes from the @code{LIBTHREAD_DB_SEARCH_PATH}
macro.

On @sc{gnu}/Linux and Solaris systems, @value{GDBN} uses a ``helper''
@code{libthread_db} library to obtain information about threads in the
inferior process.  @value{GDBN} will use @samp{libthread-db-search-path}
to find @code{libthread_db}.  @value{GDBN} also consults first if inferior
specific thread debugging library loading is enabled
by @samp{set auto-load libthread-db} (@pxref{libthread_db.so.1 file}).

A special entry @samp{$sdir} for @samp{libthread-db-search-path}
refers to the default system directories that are
normally searched for loading shared libraries.  The @samp{$sdir} entry
is the only kind not needing to be enabled by @samp{set auto-load libthread-db}
(@pxref{libthread_db.so.1 file}).

A special entry @samp{$pdir} for @samp{libthread-db-search-path}
refers to the directory from which @code{libpthread}
was loaded in the inferior process.

For any @code{libthread_db} library @value{GDBN} finds in above directories,
@value{GDBN} attempts to initialize it with the current inferior process.
If this initialization fails (which could happen because of a version
mismatch between @code{libthread_db} and @code{libpthread}), @value{GDBN}
will unload @code{libthread_db}, and continue with the next directory.
If none of @code{libthread_db} libraries initialize successfully,
@value{GDBN} will issue a warning and thread debugging will be disabled.

Setting @code{libthread-db-search-path} is currently implemented
only on some platforms.

@kindex show libthread-db-search-path 
@item show libthread-db-search-path 
Display current libthread_db search path.

@kindex set debug libthread-db
@kindex show debug libthread-db
@cindex debugging @code{libthread_db}
@item set debug libthread-db
@itemx show debug libthread-db
Turns on or off display of @code{libthread_db}-related events.
Use @code{1} to enable, @code{0} to disable.
@end table

@node Forks
@section Debugging Forks

@cindex fork, debugging programs which call
@cindex multiple processes
@cindex processes, multiple
On most systems, @value{GDBN} has no special support for debugging
programs which create additional processes using the @code{fork}
function.  When a program forks, @value{GDBN} will continue to debug the
parent process and the child process will run unimpeded.  If you have
set a breakpoint in any code which the child then executes, the child
will get a @code{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 @code{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 @value{GDBN}
on the child.  While the child is sleeping, use the @code{ps} program to
get its process ID.  Then tell @value{GDBN} (a new invocation of
@value{GDBN} if you are also debugging the parent process) to attach to
the child process (@pxref{Attach}).  From that point on you can debug
the child process just like any other process which you attached to.

On some systems, @value{GDBN} provides support for debugging programs that
create additional processes using the @code{fork} or @code{vfork} functions.
Currently, the only platforms with this feature are HP-UX (11.x and later
only?) and @sc{gnu}/Linux (kernel version 2.5.60 and later).

By default, when a program forks, @value{GDBN} 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 @w{@code{set follow-fork-mode}}.

@table @code
@kindex set follow-fork-mode
@item set follow-fork-mode @var{mode}
Set the debugger response to a program call of @code{fork} or
@code{vfork}.  A call to @code{fork} or @code{vfork} creates a new
process.  The @var{mode} argument can be:

@table @code
@item parent
The original process is debugged after a fork.  The child process runs
unimpeded.  This is the default.

@item child
The new process is debugged after a fork.  The parent process runs
unimpeded.

@end table

@kindex show follow-fork-mode
@item show follow-fork-mode
Display the current debugger response to a @code{fork} or @code{vfork} call.
@end table

@cindex debugging multiple processes
On Linux, if you want to debug both the parent and child processes, use the
command @w{@code{set detach-on-fork}}.

@table @code
@kindex set detach-on-fork
@item set detach-on-fork @var{mode}
Tells gdb whether to detach one of the processes after a fork, or
retain debugger control over them both.

@table @code
@item on
The child process (or parent process, depending on the value of
@code{follow-fork-mode}) will be detached and allowed to run 
independently.  This is the default.

@item off
Both processes will be held under the control of @value{GDBN}.
One process (child or parent, depending on the value of 
@code{follow-fork-mode}) is debugged as usual, while the other
is held suspended.  

@end table

@kindex show detach-on-fork
@item show detach-on-fork
Show whether detach-on-fork mode is on/off.
@end table

If you choose to set @samp{detach-on-fork} mode off, then @value{GDBN}
will retain control of all forked processes (including nested forks).
You can list the forked processes under the control of @value{GDBN} by
using the @w{@code{info inferiors}} command, and switch from one fork
to another by using the @code{inferior} command (@pxref{Inferiors and
Programs, ,Debugging Multiple Inferiors and Programs}).

To quit debugging one of the forked processes, you can either detach
from it by using the @w{@code{detach inferiors}} command (allowing it
to run independently), or kill it using the @w{@code{kill inferiors}}
command.  @xref{Inferiors and Programs, ,Debugging Multiple Inferiors
and Programs}.

If you ask to debug a child process and a @code{vfork} is followed by an
@code{exec}, @value{GDBN} executes the new target up to the first
breakpoint in the new target.  If you have a breakpoint set on
@code{main} in your original program, the breakpoint will also be set on
the child process's @code{main}.

On some systems, when a child process is spawned by @code{vfork}, you
cannot debug the child or parent until an @code{exec} call completes.

If you issue a @code{run} command to @value{GDBN} after an @code{exec}
call executes, the new target restarts.  To restart the parent
process, use the @code{file} command with the parent executable name
as its argument.  By default, after an @code{exec} call executes,
@value{GDBN} discards the symbols of the previous executable image.
You can change this behaviour with the @w{@code{set follow-exec-mode}}
command.

@table @code
@kindex set follow-exec-mode
@item set follow-exec-mode @var{mode}

Set debugger response to a program call of @code{exec}.  An
@code{exec} call replaces the program image of a process.

@code{follow-exec-mode} can be:

@table @code
@item new
@value{GDBN} creates a new inferior and rebinds the process to this
new inferior.  The program the process was running before the
@code{exec} call can be restarted afterwards by restarting the
original inferior.

For example:

@smallexample
(@value{GDBP}) info inferiors
(gdb) info inferior
  Id   Description   Executable
* 1    <null>        prog1
(@value{GDBP}) run
process 12020 is executing new program: prog2
Program exited normally.
(@value{GDBP}) info inferiors
  Id   Description   Executable
* 2    <null>        prog2
  1    <null>        prog1
@end smallexample

@item same
@value{GDBN} keeps the process bound to the same inferior.  The new
executable image replaces the previous executable loaded in the
inferior.  Restarting the inferior after the @code{exec} call, with
e.g., the @code{run} command, restarts the executable the process was
running after the @code{exec} call.  This is the default mode.

For example:

@smallexample
(@value{GDBP}) info inferiors
  Id   Description   Executable
* 1    <null>        prog1
(@value{GDBP}) run
process 12020 is executing new program: prog2
Program exited normally.
(@value{GDBP}) info inferiors
  Id   Description   Executable
* 1    <null>        prog2
@end smallexample

@end table
@end table

You can use the @code{catch} command to make @value{GDBN} stop whenever
a @code{fork}, @code{vfork}, or @code{exec} call is made.  @xref{Set
Catchpoints, ,Setting Catchpoints}.

@node Checkpoint/Restart
@section Setting a @emph{Bookmark} to Return to Later

@cindex checkpoint
@cindex restart
@cindex bookmark
@cindex snapshot of a process
@cindex rewind program state

On certain operating systems@footnote{Currently, only
@sc{gnu}/Linux.}, @value{GDBN} is able to save a @dfn{snapshot} of a
program's state, called a @dfn{checkpoint}, and come back to it
later.

Returning to a checkpoint effectively undoes everything that has
happened in the program since the @code{checkpoint} was saved.  This
includes changes in memory, registers, and even (within some limits)
system state.  Effectively, it is like going back in time to the
moment when the checkpoint was saved.

Thus, if you're stepping thru a program and you think you're 
getting close to the point where things go wrong, you can save
a checkpoint.  Then, if you accidentally go too far and miss
the critical statement, instead of having to restart your program
from the beginning, you can just go back to the checkpoint and
start again from there.

This can be especially useful if it takes a lot of time or 
steps to reach the point where you think the bug occurs.  

To use the @code{checkpoint}/@code{restart} method of debugging:

@table @code
@kindex checkpoint
@item checkpoint
Save a snapshot of the debugged program's current execution state.
The @code{checkpoint} command takes no arguments, but each checkpoint
is assigned a small integer id, similar to a breakpoint id.

@kindex info checkpoints
@item info checkpoints
List the checkpoints that have been saved in the current debugging
session.  For each checkpoint, the following information will be
listed:

@table @code
@item Checkpoint ID
@item Process ID
@item Code Address
@item Source line, or label
@end table

@kindex restart @var{checkpoint-id}
@item restart @var{checkpoint-id}
Restore the program state that was saved as checkpoint number
@var{checkpoint-id}.  All program variables, registers, stack frames
etc.@:  will be returned to the values that they had when the checkpoint
was saved.  In essence, gdb will ``wind back the clock'' to the point
in time when the checkpoint was saved.

Note that breakpoints, @value{GDBN} variables, command history etc.
are not affected by restoring a checkpoint.  In general, a checkpoint
only restores things that reside in the program being debugged, not in
the debugger.

@kindex delete checkpoint @var{checkpoint-id}
@item delete checkpoint @var{checkpoint-id}
Delete the previously-saved checkpoint identified by @var{checkpoint-id}.

@end table

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 previously 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.

@cindex checkpoints and process id
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 @var{pid}), 
and each will be different from the program's original @var{pid}.
If your program has saved a local copy of its process id, this could
potentially pose a problem.

@subsection A Non-obvious Benefit of Using Checkpoints

On some systems such as @sc{gnu}/Linux, address space randomization
is performed on new processes for security reasons.  This makes it 
difficult or impossible to set a breakpoint, or watchpoint, on an
absolute address if you have to restart the program, since the 
absolute location of a symbol will change from one execution to the
next.

A checkpoint, however, is an @emph{identical} copy of a process. 
Therefore if you create a checkpoint at (eg.@:) the start of main, 
and simply return to that checkpoint instead of restarting the 
process, you can avoid the effects of address randomization and
your symbols will all stay in the same place.

@node Stopping
@chapter Stopping and Continuing

The principal purposes of using a debugger are so that you can stop your
program before it terminates; or so that, if your program runs into
trouble, you can investigate and find out why.

Inside @value{GDBN}, your program may stop for any of several reasons,
such as a signal, a breakpoint, or reaching a new line after a
@value{GDBN} command such as @code{step}.  You may then examine and
change variables, set new breakpoints or remove old ones, and then
continue execution.  Usually, the messages shown by @value{GDBN} provide
ample explanation of the status of your program---but you can also
explicitly request this information at any time.

@table @code
@kindex info program
@item info program
Display information about the status of your program: whether it is
running or not, what process it is, and why it stopped.
@end table

@menu
* Breakpoints::                 Breakpoints, watchpoints, and catchpoints
* Continuing and Stepping::     Resuming execution
* Skipping Over Functions and Files::
                                Skipping over functions and files
* Signals::                     Signals
* Thread Stops::                Stopping and starting multi-thread programs
@end menu

@node Breakpoints
@section Breakpoints, Watchpoints, and Catchpoints

@cindex breakpoints
A @dfn{breakpoint} makes your program stop whenever a certain point in
the program is reached.  For each breakpoint, you can add conditions to
control in finer detail whether your program stops.  You can set
breakpoints with the @code{break} command and its variants (@pxref{Set
Breaks, ,Setting Breakpoints}), to specify the place where your program
should stop by line number, function name or exact address in the
program.

On some systems, you can set breakpoints in shared libraries before
the executable is run.  There is a minor limitation on HP-UX systems:
you must wait until the executable is run in order to set breakpoints
in shared library routines that are not called directly by the program
(for example, routines that are arguments in a @code{pthread_create}
call).

@cindex watchpoints
@cindex data breakpoints
@cindex memory tracing
@cindex breakpoint on memory address
@cindex breakpoint on variable modification
A @dfn{watchpoint} is a special breakpoint that stops your program
when the value of an expression changes.  The expression may be a value
of a variable, or it could involve values of one or more variables
combined by operators, such as @samp{a + b}.  This is sometimes called
@dfn{data breakpoints}.  You must use a different command to set
watchpoints (@pxref{Set Watchpoints, ,Setting Watchpoints}), but aside
from that, you can manage a watchpoint like any other breakpoint: you
enable, disable, and delete both breakpoints and watchpoints using the
same commands.

You can arrange to have values from your program displayed automatically
whenever @value{GDBN} stops at a breakpoint.  @xref{Auto Display,,
Automatic Display}.

@cindex catchpoints
@cindex breakpoint on events
A @dfn{catchpoint} is another special breakpoint that stops your program
when a certain kind of event occurs, such as the throwing of a C@t{++}
exception or the loading of a library.  As with watchpoints, you use a
different command to set a catchpoint (@pxref{Set Catchpoints, ,Setting
Catchpoints}), but aside from that, you can manage a catchpoint like any
other breakpoint.  (To stop when your program receives a signal, use the
@code{handle} command; see @ref{Signals, ,Signals}.)

@cindex breakpoint numbers
@cindex numbers for breakpoints
@value{GDBN} assigns a number to each breakpoint, watchpoint, or
catchpoint when you create it; these numbers are successive integers
starting with one.  In many of the commands for controlling various
features of breakpoints you use the breakpoint number to say which
breakpoint you want to change.  Each breakpoint may be @dfn{enabled} or
@dfn{disabled}; if disabled, it has no effect on your program until you
enable it again.

@cindex breakpoint ranges
@cindex ranges of breakpoints
Some @value{GDBN} commands accept a range of breakpoints on which to
operate.  A breakpoint range is either a single breakpoint number, like
@samp{5}, or two such numbers, in increasing order, separated by a
hyphen, like @samp{5-7}.  When a breakpoint range is given to a command,
all breakpoints in that range are operated on.

@menu
* Set Breaks::                  Setting breakpoints
* Set Watchpoints::             Setting watchpoints
* Set Catchpoints::             Setting catchpoints
* Delete Breaks::               Deleting breakpoints
* Disabling::                   Disabling breakpoints
* Conditions::                  Break conditions
* Break Commands::              Breakpoint command lists
* Dynamic Printf::              Dynamic printf
* Save Breakpoints::            How to save breakpoints in a file
* Static Probe Points::         Listing static probe points
* Error in Breakpoints::        ``Cannot insert breakpoints''
* Breakpoint-related Warnings:: ``Breakpoint address adjusted...''
@end menu

@node Set Breaks
@subsection Setting Breakpoints

@c FIXME LMB what does GDB do if no code on line of breakpt?
@c       consider in particular declaration with/without initialization.
@c
@c FIXME 2 is there stuff on this already? break at fun start, already init?

@kindex break
@kindex b @r{(@code{break})}
@vindex $bpnum@r{, convenience variable}
@cindex latest breakpoint
Breakpoints are set with the @code{break} command (abbreviated
@code{b}).  The debugger convenience variable @samp{$bpnum} records the
number of the breakpoint you've set most recently; see @ref{Convenience
Vars,, Convenience Variables}, for a discussion of what you can do with
convenience variables.

@table @code
@item break @var{location}
Set a breakpoint at the given @var{location}, which can specify a
function name, a line number, or an address of an instruction.
(@xref{Specify Location}, for a list of all the possible ways to
specify a @var{location}.)  The breakpoint will stop your program just
before it executes any of the code in the specified @var{location}.

When using source languages that permit overloading of symbols, such as
C@t{++}, a function name may refer to more than one possible place to break.
@xref{Ambiguous Expressions,,Ambiguous Expressions}, for a discussion of
that situation.

It is also possible to insert a breakpoint that will stop the program
only if a specific thread (@pxref{Thread-Specific Breakpoints})
or a specific task (@pxref{Ada Tasks}) hits that breakpoint.

@item break
When called without any arguments, @code{break} sets a breakpoint at
the next instruction to be executed in the selected stack frame
(@pxref{Stack, ,Examining the Stack}).  In any selected frame but the
innermost, this makes your program stop as soon as control
returns to that frame.  This is similar to the effect of a
@code{finish} command in the frame inside the selected frame---except
that @code{finish} does not leave an active breakpoint.  If you use
@code{break} without an argument in the innermost frame, @value{GDBN} stops
the next time it reaches the current location; this may be useful
inside loops.

@value{GDBN} normally ignores breakpoints when it resumes execution, until at
least one instruction has been executed.  If it did not do this, you
would be unable to proceed past a breakpoint without first disabling the
breakpoint.  This rule applies whether or not the breakpoint already
existed when your program stopped.

@item break @dots{} if @var{cond}
Set a breakpoint with condition @var{cond}; evaluate the expression
@var{cond} each time the breakpoint is reached, and stop only if the
value is nonzero---that is, if @var{cond} evaluates as true.
@samp{@dots{}} stands for one of the possible arguments described
above (or no argument) specifying where to break.  @xref{Conditions,
,Break Conditions}, for more information on breakpoint conditions.

@kindex tbreak
@item tbreak @var{args}
Set a breakpoint enabled only for one stop.  The @var{args} are the
same as for the @code{break} command, and the breakpoint is set in the same
way, but the breakpoint is automatically deleted after the first time your
program stops there.  @xref{Disabling, ,Disabling Breakpoints}.

@kindex hbreak
@cindex hardware breakpoints
@item hbreak @var{args}
Set a hardware-assisted breakpoint.  The @var{args} are the same as for the
@code{break} command and the breakpoint is set in the same way, but the
breakpoint requires 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
@value{GDBN} will reject this command if more than two are used.  Delete
or disable unused hardware breakpoints before setting new ones
(@pxref{Disabling, ,Disabling Breakpoints}).
@xref{Conditions, ,Break Conditions}.
For remote targets, you can restrict the number of hardware
breakpoints @value{GDBN} will use, see @ref{set remote
hardware-breakpoint-limit}.

@kindex thbreak
@item thbreak @var{args}
Set a hardware-assisted breakpoint enabled only for one stop.  The @var{args}
are the same as for the @code{hbreak} command and the breakpoint is set in
the same way.  However, like the @code{tbreak} command,
the breakpoint is automatically deleted after the
first time your program stops there.  Also, like the @code{hbreak}
command, the breakpoint requires hardware support and some target hardware
may not have this support.  @xref{Disabling, ,Disabling Breakpoints}.
See also @ref{Conditions, ,Break Conditions}.

@kindex rbreak
@cindex regular expression
@cindex breakpoints at functions matching a regexp
@cindex set breakpoints in many functions
@item rbreak @var{regex}
Set breakpoints on all functions matching the regular expression
@var{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 @code{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 @file{grep}.  Note that this is different from the syntax used by
shells, so for instance @code{foo*} matches all functions that include
an @code{fo} followed by zero or more @code{o}s.  There is an implicit
@code{.*} leading and trailing the regular expression you supply, so to
match only functions that begin with @code{foo}, use @code{^foo}.

@cindex non-member C@t{++} functions, set breakpoint in
When debugging C@t{++} programs, @code{rbreak} is useful for setting
breakpoints on overloaded functions that are not members of any special
classes.

@cindex set breakpoints on all functions
The @code{rbreak} command can be used to set breakpoints in
@strong{all} the functions in a program, like this:

@smallexample
(@value{GDBP}) rbreak .
@end smallexample

@item rbreak @var{file}:@var{regex}
If @code{rbreak} is called with a filename qualification, it limits
the search for functions matching the given regular expression to the
specified @var{file}.  This can be used, for example, to set breakpoints on
every function in a given file:

@smallexample
(@value{GDBP}) rbreak file.c:.
@end smallexample

The colon separating the filename qualifier from the regex may
optionally be surrounded by spaces.

@kindex info breakpoints
@cindex @code{$_} and @code{info breakpoints}
@item info breakpoints @r{[}@var{n}@dots{}@r{]}
@itemx info break @r{[}@var{n}@dots{}@r{]}
Print a table of all breakpoints, watchpoints, and catchpoints set and
not deleted.  Optional argument @var{n} means print information only
about the specified breakpoint(s) (or watchpoint(s) or catchpoint(s)).
For each breakpoint, following columns are printed:

@table @emph
@item Breakpoint Numbers
@item Type
Breakpoint, watchpoint, or catchpoint.
@item Disposition
Whether the breakpoint is marked to be disabled or deleted when hit.
@item Enabled or Disabled
Enabled breakpoints are marked with @samp{y}.  @samp{n} marks breakpoints
that are not enabled.
@item 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 @samp{<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 @samp{<MULTIPLE>} in this field---see below for details.
@item 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.
@end table

@noindent
If a breakpoint is conditional, there are two evaluation modes: ``host'' and
``target''.  If mode is ``host'', breakpoint condition evaluation is done by
@value{GDBN} on the host's side.  If it is ``target'', then the condition
is evaluated by the target.  The @code{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.

@noindent
@code{info break} with a breakpoint
number @var{n} as argument lists only that breakpoint.  The
convenience variable @code{$_} and the default examining-address for
the @code{x} command are set to the address of the last breakpoint
listed (@pxref{Memory, ,Examining Memory}).

@noindent
@code{info break} displays a count of the number of times the breakpoint
has been hit.  This is especially useful in conjunction with the
@code{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.

@noindent
For a breakpoints with an enable count (xref) greater than 1,
@code{info break} also displays that count.

@end table

@value{GDBN} 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
(@pxref{Conditions, ,Break Conditions}).

@cindex multiple locations, breakpoints
@cindex breakpoints, multiple locations
It is possible that a breakpoint corresponds to several locations
in your program.  Examples of this situation are:

@itemize @bullet
@item
Multiple functions in the program may have the same name.

@item
For a C@t{++} constructor, the @value{NGCC} compiler generates several
instances of the function body, used in different cases.

@item
For a C@t{++} template function, a given line in the function can
correspond to any number of instantiations.

@item
For an inlined function, a given source line can correspond to
several places where that function is inlined.
@end itemize

In all those cases, @value{GDBN} 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 @samp{<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
@var{breakpoint-number}.@var{location-number}.

For example:

@smallexample
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
@end smallexample

Each location can be individually enabled or disabled by passing
@var{breakpoint-number}.@var{location-number} as argument to the
@code{enable} and @code{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 @kbd{delete @var{num}} command, where @var{num} is the number of
the parent breakpoint, 1 in the above example).  Disabling or enabling
the parent breakpoint (@pxref{Disabling}) affects all of the locations
that belong to that breakpoint.

@cindex pending breakpoints
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, @value{GDBN} 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 from the library are not available.  When you try to set
breakpoint, @value{GDBN} will ask you if you want to set
a so called @dfn{pending breakpoint}---breakpoint whose address
is not yet resolved.

After the program is run, whenever a new shared library is loaded,
@value{GDBN} 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@t{++} template function, and
a newly loaded shared library has an instantiation 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.

@value{GDBN} provides some additional commands for controlling what
happens when the @samp{break} command cannot resolve breakpoint
address specification to an address:

@kindex set breakpoint pending
@kindex show breakpoint pending
@table @code
@item set breakpoint pending auto
This is the default behavior.  When @value{GDBN} cannot find the breakpoint
location, it queries you whether a pending breakpoint should be created.

@item set breakpoint pending on
This indicates that an unrecognized breakpoint location should automatically
result in a pending breakpoint being created.

@item set breakpoint pending off
This indicates that pending breakpoints are not to be created.  Any
unrecognized breakpoint location results in an error.  This setting does
not affect any pending breakpoints previously created.

@item show breakpoint pending
Show the current behavior setting for creating pending breakpoints.
@end table

The settings above only affect the @code{break} command and its
variants.  Once breakpoint is set, it will be automatically updated
as shared libraries are loaded and unloaded.

@cindex automatic hardware breakpoints
For some targets, @value{GDBN} 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 @code{break} command as well as to internal
breakpoints set by commands like @code{next} and @code{finish}.  For
breakpoints set with @code{hbreak}, @value{GDBN} will always use hardware
breakpoints.

You can control this automatic behaviour with the following commands::

@kindex set breakpoint auto-hw
@kindex show breakpoint auto-hw
@table @code
@item set breakpoint auto-hw on
This is the default behavior.  When @value{GDBN} sets a breakpoint, it
will try to use the target memory map to decide if software or hardware
breakpoint must be used.

@item set breakpoint auto-hw off
This indicates @value{GDBN} should not automatically select breakpoint
type.  If the target provides a memory map, @value{GDBN} will warn when
trying to set software breakpoint at a read-only address.
@end table

@value{GDBN} 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, @value{GDBN} 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::

@kindex set breakpoint always-inserted
@kindex show breakpoint always-inserted
@table @code
@item 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.

@item 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.
@end table

@value{GDBN} 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, @value{GDBN} may
download the breakpoint, together with its conditions, to it.

This feature can be controlled via the following commands:

@kindex set breakpoint condition-evaluation
@kindex show breakpoint condition-evaluation
@table @code
@item set breakpoint condition-evaluation host
This option commands @value{GDBN} 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.

@item set breakpoint condition-evaluation target
This option commands @value{GDBN} to download breakpoint conditions
to the target at the moment of their insertion.  The target
is responsible for evaluating the conditional expression and reporting
breakpoint stop events back to @value{GDBN} whenever the condition
is true.  Due to limitations of target-side evaluation, some conditions
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 expression 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 @value{GDBN}.

@item set breakpoint condition-evaluation auto
This is the default mode.  If the target supports evaluating breakpoint
conditions on its end, @value{GDBN} will download breakpoint conditions to
the target (limitations mentioned previously apply).  If the target does
not support breakpoint condition evaluation, then @value{GDBN} will fallback
to evaluating all these conditions on the host's side.
@end table


@cindex negative breakpoint numbers
@cindex internal @value{GDBN} breakpoints
@value{GDBN} itself sometimes sets breakpoints in your program for
special purposes, such as proper handling of @code{longjmp} (in C
programs).  These internal breakpoints are assigned negative numbers,
starting with @code{-1}; @samp{info breakpoints} does not display them.
You can see these breakpoints with the @value{GDBN} maintenance command
@samp{maint info breakpoints} (@pxref{maint info breakpoints}).


@node Set Watchpoints
@subsection Setting Watchpoints

@cindex setting watchpoints
You can use a watchpoint to stop execution whenever the value of an
expression changes, without having to predict a particular place where
this may happen.  (This is sometimes called a @dfn{data breakpoint}.)
The expression may be as simple as the value of a single variable, or
as complex as many variables combined by operators.  Examples include:

@itemize @bullet
@item
A reference to the value of a single variable.

@item
An address cast to an appropriate data type.  For example,
@samp{*(int *)0x12345678} will watch a 4-byte region at the specified
address (assuming an @code{int} occupies 4 bytes).

@item
An arbitrarily complex expression, such as @samp{a*b + c/d}.  The
expression can use any operators valid in the program's native
language (@pxref{Languages}).
@end itemize

You can set a watchpoint on an expression even if the expression can
not be evaluated yet.  For instance, you can set a watchpoint on
@samp{*global_ptr} before @samp{global_ptr} is initialized.
@value{GDBN} will stop when your program sets @samp{global_ptr} and
the expression produces a valid value.  If the expression becomes
valid in some other way than changing a variable (e.g.@: if the memory
pointed to by @samp{*global_ptr} becomes readable as the result of a
@code{malloc} call), @value{GDBN} may not stop until the next time
the expression changes.

@cindex software watchpoints
@cindex hardware watchpoints
Depending on your system, watchpoints may be implemented in software or
hardware.  @value{GDBN} does software watchpointing by single-stepping your
program and testing the variable's value each time, which is hundreds of
times slower than normal execution.  (But this may still be worth it, to
catch errors where you have no clue what part of your program is the
culprit.)

On some systems, such as HP-UX, PowerPC, @sc{gnu}/Linux and most other
x86-based targets, @value{GDBN} includes support for hardware
watchpoints, which do not slow down the running of your program.

@table @code
@kindex watch
@item watch @r{[}-l@r{|}-location@r{]} @var{expr} @r{[}thread @var{threadnum}@r{]} @r{[}mask @var{maskvalue}@r{]}
Set a watchpoint for an expression.  @value{GDBN} will break when the
expression @var{expr} is written into by the program and its value
changes.  The simplest (and the most popular) use of this command is
to watch the value of a single variable:

@smallexample
(@value{GDBP}) watch foo
@end smallexample

If the command includes a @code{@r{[}thread @var{threadnum}@r{]}}
argument, @value{GDBN} breaks only when the thread identified by
@var{threadnum} changes the value of @var{expr}.  If any other threads
change the value of @var{expr}, @value{GDBN} will not break.  Note
that watchpoints restricted to a single thread in this way only work
with Hardware Watchpoints.

Ordinarily a watchpoint respects the scope of variables in @var{expr}
(see below).  The @code{-location} argument tells @value{GDBN} to
instead watch the memory referred to by @var{expr}.  In this case,
@value{GDBN} will evaluate @var{expr}, take the address of the result,
and watch the memory at that address.  The type of the result is used
to determine the size of the watched memory.  If the expression's
result does not have an address, then @value{GDBN} will print an
error.

The @code{@r{[}mask @var{maskvalue}@r{]}} argument allows creation
of masked watchpoints, if the current architecture supports this
feature (e.g., PowerPC Embedded architecture, see @ref{PowerPC
Embedded}.)  A @dfn{masked watchpoint} specifies a mask in addition
to an address to watch.  The mask specifies that some bits of an address
(the bits which are reset in the mask) should be ignored when matching
the address accessed by the inferior against the watchpoint address.
Thus, a masked watchpoint watches many addresses simultaneously---those
addresses whose unmasked bits are identical to the unmasked bits in the
watchpoint address.  The @code{mask} argument implies @code{-location}.
Examples:

@smallexample
(@value{GDBP}) watch foo mask 0xffff00ff
(@value{GDBP}) watch *0xdeadbeef mask 0xffffff00
@end smallexample

@kindex rwatch
@item rwatch @r{[}-l@r{|}-location@r{]} @var{expr} @r{[}thread @var{threadnum}@r{]} @r{[}mask @var{maskvalue}@r{]}
Set a watchpoint that will break when the value of @var{expr} is read
by the program.

@kindex awatch
@item awatch @r{[}-l@r{|}-location@r{]} @var{expr} @r{[}thread @var{threadnum}@r{]} @r{[}mask @var{maskvalue}@r{]}
Set a watchpoint that will break when @var{expr} is either read from
or written into by the program.

@kindex info watchpoints @r{[}@var{n}@dots{}@r{]}
@item info watchpoints @r{[}@var{n}@dots{}@r{]}
This command prints a list of watchpoints, using the same format as
@code{info break} (@pxref{Set Breaks}).
@end table

If you watch for a change in a numerically entered address you need to
dereference it, as the address itself is just a constant number which will
never change.  @value{GDBN} refuses to create a watchpoint that watches
a never-changing value:

@smallexample
(@value{GDBP}) watch 0x600850
Cannot watch constant value 0x600850.
(@value{GDBP}) watch *(int *) 0x600850
Watchpoint 1: *(int *) 6293584
@end smallexample

@value{GDBN} sets a @dfn{hardware watchpoint} if possible.  Hardware
watchpoints execute very quickly, and the debugger reports a change in
value at the exact instruction where the change occurs.  If @value{GDBN}
cannot set a hardware watchpoint, it sets a software watchpoint, which
executes more slowly and reports the change in value at the next
@emph{statement}, not the instruction, after the change occurs.

@cindex use only software watchpoints
You can force @value{GDBN} to use only software watchpoints with the
@kbd{set can-use-hw-watchpoints 0} command.  With this variable set to
zero, @value{GDBN} will never try to use hardware watchpoints, even if
the underlying system supports them.  (Note that hardware-assisted
watchpoints that were set @emph{before} setting
@code{can-use-hw-watchpoints} to zero will still use the hardware
mechanism of watching expression values.)

@table @code
@item set can-use-hw-watchpoints
@kindex set can-use-hw-watchpoints
Set whether or not to use hardware watchpoints.

@item show can-use-hw-watchpoints
@kindex show can-use-hw-watchpoints
Show the current mode of using hardware watchpoints.
@end table

For remote targets, you can restrict the number of hardware
watchpoints @value{GDBN} will use, see @ref{set remote
hardware-breakpoint-limit}.

When you issue the @code{watch} command, @value{GDBN} reports

@smallexample
Hardware watchpoint @var{num}: @var{expr}
@end smallexample

@noindent
if it was able to set a hardware watchpoint.

Currently, the @code{awatch} and @code{rwatch} commands can only set
hardware watchpoints, because accesses to data that don't change the
value of the watched expression cannot be detected without examining
every instruction as it is being executed, and @value{GDBN} does not do
that currently.  If @value{GDBN} finds that it is unable to set a
hardware breakpoint with the @code{awatch} or @code{rwatch} command, it
will print a message like this:

@smallexample
Expression cannot be implemented with read/access watchpoint.
@end smallexample

Sometimes, @value{GDBN} cannot set a hardware watchpoint because the
data type of the watched expression is wider than what a hardware
watchpoint on the target machine can handle.  For example, some systems
can only watch regions that are up to 4 bytes wide; on such systems you
cannot set hardware watchpoints for an expression that yields a
double-precision floating-point number (which is typically 8 bytes
wide).  As a work-around, it might be possible to break the large region
into a series of smaller ones and watch them with separate watchpoints.

If you set too many hardware watchpoints, @value{GDBN} might be unable
to insert all of them when you resume the execution of your program.
Since the precise number of active watchpoints is unknown until such
time as the program is about to be resumed, @value{GDBN} might not be
able to warn you about this when you set the watchpoints, and the
warning will be printed only when the program is resumed:

@smallexample
Hardware watchpoint @var{num}: Could not insert watchpoint
@end smallexample

@noindent
If this happens, delete or disable some of the watchpoints.

Watching complex expressions that reference many variables can also
exhaust the resources available for hardware-assisted watchpoints.
That's because @value{GDBN} needs to watch every variable in the
expression with separately allocated resources.

If you call a function interactively using @code{print} or @code{call},
any watchpoints you have set will be inactive until @value{GDBN} reaches another
kind of breakpoint or the call completes.

@value{GDBN} automatically deletes watchpoints that watch local
(automatic) variables, or expressions that involve such variables, when
they go out of scope, that is, when the execution leaves the block in
which these variables were defined.  In particular, when the program
being debugged terminates, @emph{all} local variables go out of scope,
and so only watchpoints that watch global variables remain set.  If you
rerun the program, you will need to set all such watchpoints again.  One
way of doing that would be to set a code breakpoint at the entry to the
@code{main} function and when it breaks, set all the watchpoints.

@cindex watchpoints and threads
@cindex threads and watchpoints
In multi-threaded programs, watchpoints will detect changes to the
watched expression from every thread.

@quotation
@emph{Warning:} In multi-threaded programs, software watchpoints
have only limited usefulness.  If @value{GDBN} creates a software
watchpoint, it can only watch the value of an expression @emph{in a
single thread}.  If you are confident that the expression can only
change due to the current thread's activity (and if you are also
confident that no other thread can become current), then you can use
software watchpoints as usual.  However, @value{GDBN} may not notice
when a non-current thread's activity changes the expression.  (Hardware
watchpoints, in contrast, watch an expression in all threads.)
@end quotation

@xref{set remote hardware-watchpoint-limit}.

@node Set Catchpoints
@subsection Setting Catchpoints
@cindex catchpoints, setting
@cindex exception handlers
@cindex event handling

You can use @dfn{catchpoints} to cause the debugger to stop for certain
kinds of program events, such as C@t{++} exceptions or the loading of a
shared library.  Use the @code{catch} command to set a catchpoint.

@table @code
@kindex catch
@item catch @var{event}
Stop when @var{event} occurs.  The @var{event} can be any of the following:

@table @code
@item throw @r{[}@var{regexp}@r{]}
@itemx rethrow @r{[}@var{regexp}@r{]}
@itemx catch @r{[}@var{regexp}@r{]}
@kindex catch throw
@kindex catch rethrow
@kindex catch catch
@cindex stop on C@t{++} exceptions
The throwing, re-throwing, or catching of a C@t{++} exception.

If @var{regexp} is given, then only exceptions whose type matches the
regular expression will be caught.

@vindex $_exception@r{, convenience variable}
The convenience variable @code{$_exception} is available at an
exception-related catchpoint, on some systems.  This holds the
exception being thrown.

There are currently some limitations to C@t{++} exception handling in
@value{GDBN}:

@itemize @bullet
@item
The support for these commands is system-dependent.  Currently, only
systems using the @samp{gnu-v3} C@t{++} ABI (@pxref{ABI}) are
supported.

@item
The regular expression feature and the @code{$_exception} convenience
variable rely on the presence of some SDT probes in @code{libstdc++}.
If these probes are not present, then these features cannot be used.
These probes were first available in the GCC 4.8 release, but whether
or not they are available in your GCC also depends on how it was
built.

@item
The @code{$_exception} convenience variable is only valid at the
instruction at which an exception-related catchpoint is set.

@item
When an exception-related catchpoint is hit, @value{GDBN} stops at a
location in the system library which implements runtime exception
support for C@t{++}, usually @code{libstdc++}.  You can use @code{up}
(@pxref{Selection}) to get to your code.

@item
If you call a function interactively, @value{GDBN} normally returns
control to you when the function has finished executing.  If the call
raises an exception, however, the call may bypass the mechanism that
returns control to you and cause your program either to abort or to
simply continue running until it hits a breakpoint, catches a signal
that @value{GDBN} is listening for, or exits.  This is the case even if
you set a catchpoint for the exception; catchpoints on exceptions are
disabled within interactive calls.  @xref{Calling}, for information on
controlling this with @code{set unwind-on-terminating-exception}.

@item
You cannot raise an exception interactively.

@item
You cannot install an exception handler interactively.
@end itemize

@item exception
@kindex catch exception
@cindex Ada exception catching
@cindex catch Ada exceptions
An Ada exception being raised.  If an exception name is specified
at the end of the command (eg @code{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 language, the
fully qualified name must be used as the exception name.  Otherwise,
@value{GDBN} will assume that it should stop on the pre-defined exception
rather than the user-defined one.  For instance, assuming an exception
called @code{Constraint_Error} is defined in package @code{Pck}, then
the command to use to catch such exceptions is @kbd{catch exception
Pck.Constraint_Error}.

@item exception unhandled
@kindex catch exception unhandled
An exception that was raised but is not handled by the program.

@item assert
@kindex catch assert
A failed Ada assertion.

@item exec
@kindex catch exec
@cindex break on fork/exec
A call to @code{exec}.  This is currently only available for HP-UX
and @sc{gnu}/Linux.

@item syscall
@itemx syscall @r{[}@var{name} @r{|} @var{number}@r{]} @dots{} 
@kindex catch syscall
@cindex break on a system call.
A call to or return from a system call, a.k.a.@: @dfn{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.
@value{GDBN} 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.

@var{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 @file{/usr/include/asm/unistd.h}.

@c For MS-Windows, the syscall names and the corresponding numbers
@c can be found, e.g., on this URL:
@c http://www.metasploit.com/users/opcode/syscalls.html
@c but we don't support Windows syscalls yet.

Normally, @value{GDBN} knows in advance which syscalls are valid for
each OS, so you can use the @value{GDBN} command-line completion
facilities (@pxref{Completion,, command completion}) to list the
available choices.

You may also specify the system call numerically.  A syscall's
number is the value passed to the OS's syscall dispatcher to
identify the requested service.  When you specify the syscall by its
name, @value{GDBN} uses its database of syscalls to convert the name
into the corresponding numeric code, but using the number directly
may be useful if @value{GDBN}'s database does not have the complete
list of syscalls on your system (e.g., because @value{GDBN} lags
behind the OS upgrades).

The example below illustrates how this command works if you don't provide
arguments to it:

@smallexample
(@value{GDBP}) catch syscall
Catchpoint 1 (syscall)
(@value{GDBP}) r
Starting program: /tmp/catch-syscall

Catchpoint 1 (call to syscall 'close'), \
	   0xffffe424 in __kernel_vsyscall ()
(@value{GDBP}) c
Continuing.

Catchpoint 1 (returned from syscall 'close'), \
	0xffffe424 in __kernel_vsyscall ()
(@value{GDBP})
@end smallexample

Here is an example of catching a system call by name:

@smallexample
(@value{GDBP}) catch syscall chroot
Catchpoint 1 (syscall 'chroot' [61])
(@value{GDBP}) r
Starting program: /tmp/catch-syscall

Catchpoint 1 (call to syscall 'chroot'), \
		   0xffffe424 in __kernel_vsyscall ()
(@value{GDBP}) c
Continuing.

Catchpoint 1 (returned from syscall 'chroot'), \
	0xffffe424 in __kernel_vsyscall ()
(@value{GDBP})
@end smallexample

An example of specifying a system call numerically.  In the case
below, the syscall number has a corresponding entry in the XML
file, so @value{GDBN} finds its name and prints it:

@smallexample
(@value{GDBP}) catch syscall 252
Catchpoint 1 (syscall(s) 'exit_group')
(@value{GDBP}) r
Starting program: /tmp/catch-syscall

Catchpoint 1 (call to syscall 'exit_group'), \
		   0xffffe424 in __kernel_vsyscall ()
(@value{GDBP}) c
Continuing.

Program exited normally.
(@value{GDBP})
@end smallexample

However, there can be situations when there is no corresponding name
in XML file for that syscall number.  In this case, @value{GDBN} prints
a warning message saying that it was not able to find the syscall name,
but the catchpoint will be set anyway.  See the example below:

@smallexample
(@value{GDBP}) catch syscall 764
warning: The number '764' does not represent a known syscall.
Catchpoint 2 (syscall 764)
(@value{GDBP})
@end smallexample

If you configure @value{GDBN} using the @samp{--without-expat} option,
it will not be able to display syscall names.  Also, if your
architecture does not have an XML file describing its system calls,
you will not be able to see the syscall names.  It is important to
notice that these two features are used for accessing the syscall
name database.  In either case, you will see a warning like this:

@smallexample
(@value{GDBP}) catch syscall
warning: Could not open "syscalls/i386-linux.xml"
warning: Could not load the syscall XML file 'syscalls/i386-linux.xml'.
GDB will not be able to display syscall names.
Catchpoint 1 (syscall)
(@value{GDBP})
@end smallexample

Of course, the file name will change depending on your architecture and system.

Still using the example above, you can also try to catch a syscall by its
number.  In this case, you would see something like:

@smallexample
(@value{GDBP}) catch syscall 252
Catchpoint 1 (syscall(s) 252)
@end smallexample

Again, in this case @value{GDBN} would not be able to display syscall's names.

@item fork
@kindex catch fork
A call to @code{fork}.  This is currently only available for HP-UX
and @sc{gnu}/Linux.

@item vfork
@kindex catch vfork
A call to @code{vfork}.  This is currently only available for HP-UX
and @sc{gnu}/Linux.

@item load @r{[}regexp@r{]}
@itemx unload @r{[}regexp@r{]}
@kindex catch load
@kindex catch unload
The loading or unloading of a shared library.  If @var{regexp} is
given, then the catchpoint will stop only if the regular expression
matches one of the affected libraries.

@item signal @r{[}@var{signal}@dots{} @r{|} @samp{all}@r{]}
@kindex catch signal
The delivery of a signal.

With no arguments, this catchpoint will catch any signal that is not
used internally by @value{GDBN}, specifically, all signals except
@samp{SIGTRAP} and @samp{SIGINT}.

With the argument @samp{all}, all signals, including those used by
@value{GDBN}, will be caught.  This argument cannot be used with other
signal names.

Otherwise, the arguments are a list of signal names as given to
@code{handle} (@pxref{Signals}).  Only signals specified in this list
will be caught.

One reason that @code{catch signal} can be more useful than
@code{handle} is that you can attach commands and conditions to the
catchpoint.

When a signal is caught by a catchpoint, the signal's @code{stop} and
@code{print} settings, as specified by @code{handle}, are ignored.
However, whether the signal is still delivered to the inferior depends
on the @code{pass} setting; this can be changed in the catchpoint's
commands.

@end table

@item tcatch @var{event}
@kindex tcatch
Set a catchpoint that is enabled only for one stop.  The catchpoint is
automatically deleted after the first time the event is caught.

@end table

Use the @code{info break} command to list the current catchpoints.


@node Delete Breaks
@subsection Deleting Breakpoints

@cindex clearing breakpoints, watchpoints, catchpoints
@cindex deleting breakpoints, watchpoints, catchpoints
It is often necessary to eliminate a breakpoint, watchpoint, or
catchpoint once it has done its job and you no longer want your program
to stop there.  This is called @dfn{deleting} the breakpoint.  A
breakpoint that has been deleted no longer exists; it is forgotten.

With the @code{clear} command you can delete breakpoints according to
where they are in your program.  With the @code{delete} command you can
delete individual breakpoints, watchpoints, or catchpoints by specifying
their breakpoint numbers.

It is not necessary to delete a breakpoint to proceed past it.  @value{GDBN}
automatically ignores breakpoints on the first instruction to be executed
when you continue execution without changing the execution address.

@table @code
@kindex clear
@item clear
Delete any breakpoints at the next instruction to be executed in the
selected stack frame (@pxref{Selection, ,Selecting a Frame}).  When
the innermost frame is selected, this is a good way to delete a
breakpoint where your program just stopped.

@item clear @var{location}
Delete any breakpoints set at the specified @var{location}.
@xref{Specify Location}, for the various forms of @var{location}; the
most useful ones are listed below:

@table @code
@item clear @var{function}
@itemx clear @var{filename}:@var{function}
Delete any breakpoints set at entry to the named @var{function}.

@item clear @var{linenum}
@itemx clear @var{filename}:@var{linenum}
Delete any breakpoints set at or within the code of the specified
@var{linenum} of the specified @var{filename}.
@end table

@cindex delete breakpoints
@kindex delete
@kindex d @r{(@code{delete})}
@item delete @r{[}breakpoints@r{]} @r{[}@var{range}@dots{}@r{]}
Delete the breakpoints, watchpoints, or catchpoints of the breakpoint
ranges specified as arguments.  If no argument is specified, delete all
breakpoints (@value{GDBN} asks confirmation, unless you have @code{set
confirm off}).  You can abbreviate this command as @code{d}.
@end table

@node Disabling
@subsection Disabling Breakpoints

@cindex enable/disable a breakpoint
Rather than deleting a breakpoint, watchpoint, or catchpoint, you might
prefer to @dfn{disable} it.  This makes the breakpoint inoperative as if
it had been deleted, but remembers the information on the breakpoint so
that you can @dfn{enable} it again later.

You disable and enable breakpoints, watchpoints, and catchpoints with
the @code{enable} and @code{disable} commands, optionally specifying
one or more breakpoint numbers as arguments.  Use @code{info break} to
print a list of all breakpoints, watchpoints, and catchpoints if you
do not know which numbers to use.

Disabling and enabling a breakpoint that has multiple locations
affects all of its locations.

A breakpoint, watchpoint, or catchpoint can have any of several
different states of enablement:

@itemize @bullet
@item
Enabled.  The breakpoint stops your program.  A breakpoint set
with the @code{break} command starts out in this state.
@item
Disabled.  The breakpoint has no effect on your program.
@item
Enabled once.  The breakpoint stops your program, but then becomes
disabled.
@item
Enabled for a count.  The breakpoint stops your program for the next
N times, then becomes disabled.
@item
Enabled for deletion.  The breakpoint stops your program, but
immediately after it does so it is deleted permanently.  A breakpoint
set with the @code{tbreak} command starts out in this state.
@end itemize

You can use the following commands to enable or disable breakpoints,
watchpoints, and catchpoints:

@table @code
@kindex disable
@kindex dis @r{(@code{disable})}
@item disable @r{[}breakpoints@r{]} @r{[}@var{range}@dots{}@r{]}
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
@code{disable} as @code{dis}.

@kindex enable
@item enable @r{[}breakpoints@r{]} @r{[}@var{range}@dots{}@r{]}
Enable the specified breakpoints (or all defined breakpoints).  They
become effective once again in stopping your program.

@item enable @r{[}breakpoints@r{]} once @var{range}@dots{}
Enable the specified breakpoints temporarily.  @value{GDBN} disables any
of these breakpoints immediately after stopping your program.

@item enable @r{[}breakpoints@r{]} count @var{count} @var{range}@dots{}
Enable the specified breakpoints temporarily.  @value{GDBN} records
@var{count} with each of the specified breakpoints, and decrements a
breakpoint's count when it is hit.  When any count reaches 0,
@value{GDBN} disables that breakpoint.  If a breakpoint has an ignore
count (@pxref{Conditions, ,Break Conditions}), that will be
decremented to 0 before @var{count} is affected.

@item enable @r{[}breakpoints@r{]} delete @var{range}@dots{}
Enable the specified breakpoints to work once, then die.  @value{GDBN}
deletes any of these breakpoints as soon as your program stops there.
Breakpoints set by the @code{tbreak} command start out in this state.
@end table

@c FIXME: I think the following ``Except for [...] @code{tbreak}'' is
@c confusing: tbreak is also initially enabled.
Except for a breakpoint set with @code{tbreak} (@pxref{Set Breaks,
,Setting Breakpoints}), breakpoints that you set are initially enabled;
subsequently, they become disabled or enabled only when you use one of
the commands above.  (The command @code{until} can set and delete a
breakpoint of its own, but it does not change the state of your other
breakpoints; see @ref{Continuing and Stepping, ,Continuing and
Stepping}.)

@node Conditions
@subsection Break Conditions
@cindex conditional breakpoints
@cindex breakpoint conditions

@c FIXME what is scope of break condition expr?  Context where wanted?
@c      in particular for a watchpoint?
The simplest sort of breakpoint breaks every time your program reaches a
specified place.  You can also specify a @dfn{condition} for a
breakpoint.  A condition is just a Boolean expression in your
programming language (@pxref{Expressions, ,Expressions}).  A breakpoint with
a condition evaluates the expression each time your program reaches it,
and your program stops only if the condition is @emph{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 @var{assert}, you should set the condition
@samp{! @var{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, @value{GDBN} 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
(@pxref{Break Commands, ,Breakpoint Command Lists}).

Breakpoint conditions can also be evaluated on the target's side if
the target supports it.  Instead of evaluating the conditions locally,
@value{GDBN} encodes the expression into an agent expression
(@pxref{Agent Expressions}) suitable for execution on the target,
independently of @value{GDBN}.  Global variables become raw memory
locations, locals become stack accesses, and so forth.

In this case, @value{GDBN} 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 @value{GDBN} informed about
every breakpoint trigger, even those with false conditions.

Break conditions can be specified when a breakpoint is set, by using
@samp{if} in the arguments to the @code{break} command.  @xref{Set
Breaks, ,Setting Breakpoints}.  They can also be changed at any time
with the @code{condition} command.

You can also use the @code{if} keyword with the @code{watch} command.
The @code{catch} command does not recognize the @code{if} keyword;
@code{condition} is the only way to impose a further condition on a
catchpoint.

@table @code
@kindex condition
@item condition @var{bnum} @var{expression}
Specify @var{expression} as the break condition for breakpoint,
watchpoint, or catchpoint number @var{bnum}.  After you set a condition,
breakpoint @var{bnum} stops your program only if the value of
@var{expression} is true (nonzero, in C).  When you use
@code{condition}, @value{GDBN} checks @var{expression} immediately for
syntactic correctness, and to determine whether symbols in it have
referents in the context of your breakpoint.  If @var{expression} uses
symbols not referenced in the context of the breakpoint, @value{GDBN}
prints an error message:

@smallexample
No symbol "foo" in current context.
@end smallexample

@noindent
@value{GDBN} does
not actually evaluate @var{expression} at the time the @code{condition}
command (or a command that sets a breakpoint with a condition, like
@code{break if @dots{}}) is given, however.  @xref{Expressions, ,Expressions}.

@item condition @var{bnum}
Remove the condition from breakpoint number @var{bnum}.  It becomes
an ordinary unconditional breakpoint.
@end table

@cindex ignore count (of 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 @dfn{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 @var{n}, the breakpoint does not stop the next @var{n} times
your program reaches it.

@table @code
@kindex ignore
@item ignore @var{bnum} @var{count}
Set the ignore count of breakpoint number @var{bnum} to @var{count}.
The next @var{count} times the breakpoint is reached, your program's
execution does not stop; other than to decrement the ignore count, @value{GDBN}
takes no action.

To make the breakpoint stop the next time it is reached, specify
a count of zero.

When you use @code{continue} to resume execution of your program from a
breakpoint, you can specify an ignore count directly as an argument to
@code{continue}, rather than using @code{ignore}.  @xref{Continuing and
Stepping,,Continuing and Stepping}.

If a breakpoint has a positive ignore count and a condition, the
condition is not checked.  Once the ignore count reaches zero,
@value{GDBN} resumes checking the condition.

You could achieve the effect of the ignore count with a condition such
as @w{@samp{$foo-- <= 0}} using a debugger convenience variable that
is decremented each time.  @xref{Convenience Vars, ,Convenience
Variables}.
@end table

Ignore counts apply to breakpoints, watchpoints, and catchpoints.


@node Break Commands
@subsection Breakpoint Command Lists

@cindex breakpoint commands
You can give any breakpoint (or watchpoint or catchpoint) a series of
commands to execute when your program stops due to that breakpoint.  For
example, you might want to print the values of certain expressions, or
enable other breakpoints.

@table @code
@kindex commands
@kindex end@r{ (breakpoint commands)}
@item commands @r{[}@var{range}@dots{}@r{]}
@itemx @dots{} @var{command-list} @dots{}
@itemx end
Specify a list of commands for the given breakpoints.  The commands
themselves appear on the following lines.  Type a line containing just
@code{end} to terminate the commands.

To remove all commands from a breakpoint, type @code{commands} and
follow it immediately with @code{end}; that is, give no commands.

With no argument, @code{commands} refers to the last breakpoint,
watchpoint, or catchpoint set (not to the breakpoint most recently
encountered).  If the most recent breakpoints were set with a single
command, then the @code{commands} will apply to all the breakpoints
set by that command.  This applies to breakpoints set by
@code{rbreak}, and also applies when a single @code{break} command
creates multiple breakpoints (@pxref{Ambiguous Expressions,,Ambiguous
Expressions}).
@end table

Pressing @key{RET} as a means of repeating the last @value{GDBN} command is
disabled within a @var{command-list}.

You can use breakpoint commands to start your program up again.  Simply
use the @code{continue} command, or @code{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 @code{next} or @code{step}), you may encounter
another breakpoint---which could have its own command list, leading to
ambiguities about which list to execute.

@kindex silent
If the first command you specify in a command list is @code{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.  @code{silent} is
meaningful only at the beginning of a breakpoint command list.

The commands @code{echo}, @code{output}, and @code{printf} allow you to
print precisely controlled output, and are often useful in silent
breakpoints.  @xref{Output, ,Commands for Controlled Output}.

For example, here is how you could use breakpoint commands to print the
value of @code{x} at entry to @code{foo} whenever @code{x} is positive.

@smallexample
break foo if x>0
commands
silent
printf "x is %d\n",x
cont
end
@end smallexample

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 @code{continue} command
so that your program does not stop, and start with the @code{silent}
command so that no output is produced.  Here is an example:

@smallexample
break 403
commands
silent
set x = y + 4
cont
end
@end smallexample

@node Dynamic Printf
@subsection Dynamic Printf

@cindex dynamic printf
@cindex dprintf
The dynamic printf command @code{dprintf} combines a breakpoint with
formatted printing of your program's data to give you the effect of
inserting @code{printf} calls into your program on-the-fly, without
having to recompile it.

In its most basic form, the output goes to the GDB console.  However,
you can set the variable @code{dprintf-style} for alternate handling.
For instance, you can ask to format the output by calling your
program's @code{printf} function.  This has the advantage that the
characters go to the program's output device, so they can recorded in
redirects to files and so forth.

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 @value{GDBN}.

@table @code
@kindex dprintf
@item dprintf @var{location},@var{template},@var{expression}[,@var{expression}@dots{}]
Whenever execution reaches @var{location}, print the values of one or
more @var{expressions} under the control of the string @var{template}.
To print several values, separate them with commas.

@item set dprintf-style @var{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.)

@item gdb
@kindex dprintf-style gdb
Handle the output using the @value{GDBN} @code{printf} command.

@item call
@kindex dprintf-style call
Handle the output by calling a function in your program (normally
@code{printf}).

@item agent
@kindex dprintf-style agent
Have the remote debugging agent (such as @code{gdbserver}) handle
the output itself.  This style is only available for agents that
support running commands on the target.

@item set dprintf-function @var{function}
Set the function to call if the dprintf style is @code{call}.  By
default its value is @code{printf}.  You may set it to any expression.
that @value{GDBN} can evaluate to a function, as per the @code{call}
command.

@item set dprintf-channel @var{channel}
Set a ``channel'' for dprintf.  If set to a non-empty value,
@value{GDBN} will evaluate it as an expression and pass the result as
a first argument to the @code{dprintf-function}, in the manner of
@code{fprintf} and similar functions.  Otherwise, the dprintf format
string will be the first argument, in the manner of @code{printf}.

As an example, if you wanted @code{dprintf} output to go to a logfile
that is a standard I/O stream assigned to the variable @code{mylog},
you could do the following:

@example
(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)
@end example

Note that the @code{info break} displays the dynamic printf commands
as normal breakpoint commands; you can thus easily see the effect of
the variable settings.

@item set disconnected-dprintf on
@itemx set disconnected-dprintf off
@kindex set disconnected-dprintf
Choose whether @code{dprintf} commands should continue to run if
@value{GDBN} has disconnected from the target.  This only applies
if the @code{dprintf-style} is @code{agent}.

@item show disconnected-dprintf off
@kindex show disconnected-dprintf
Show the current choice for disconnected @code{dprintf}.

@end table

@value{GDBN} 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, @value{GDBN} will report an error.

@node Save Breakpoints
@subsection How to save breakpoints to a file

To save breakpoint definitions to a file use the @w{@code{save
breakpoints}} command.

@table @code
@kindex save breakpoints
@cindex save breakpoints to a file for future sessions
@item save breakpoints [@var{filename}]
This command saves all current breakpoint definitions together with
their commands and ignore counts, into a file @file{@var{filename}}
suitable for use in a later debugging session.  This includes all
types of breakpoints (breakpoints, watchpoints, catchpoints,
tracepoints).  To read the saved breakpoint definitions, use the
@code{source} command (@pxref{Command Files}).  Note that watchpoints
with expressions involving local variables may fail to be recreated
because it may not be possible to access the context where the
watchpoint is valid anymore.  Because the saved breakpoint definitions
are simply a sequence of @value{GDBN} commands that recreate the
breakpoints, you can edit the file in your favorite editing program,
and remove the breakpoint definitions you're not interested in, or
that can no longer be recreated.
@end table

@node Static Probe Points
@subsection Static Probe Points

@cindex static probe point, SystemTap
@value{GDBN} supports @dfn{SDT} probes in the code.  @acronym{SDT} stands
for Statically Defined Tracing, and the probes are designed to have a tiny
runtime code and data footprint, and no dynamic relocations.  They are
usable from assembly, C and C@t{++} languages.  See
@uref{http://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation}
for a good reference on how the @acronym{SDT} probes are implemented.

Currently, @code{SystemTap} (@uref{http://sourceware.org/systemtap/})
@acronym{SDT} probes are supported on ELF-compatible systems.  See
@uref{http://sourceware.org/systemtap/wiki/AddingUserSpaceProbingToApps}
for more information on how to add @code{SystemTap} @acronym{SDT} probes
in your applications.

@cindex semaphores on static probe points
Some probes have an associated semaphore variable; for instance, this
happens automatically if you defined your probe using a DTrace-style
@file{.d} file.  If your probe has a semaphore, @value{GDBN} will
automatically enable it when you specify a breakpoint using the
@samp{-probe-stap} notation.  But, if you put a breakpoint at a probe's
location by some other method (e.g., @code{break file:line}), then
@value{GDBN} will not automatically set the semaphore.

You can examine the available static static probes using @code{info
probes}, with optional arguments:

@table @code
@kindex info probes
@item info probes stap @r{[}@var{provider} @r{[}@var{name} @r{[}@var{objfile}@r{]}@r{]}@r{]}
If given, @var{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, @var{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, @var{objfile} is a regular expression used to select which
object files (executable or shared libraries) to examine.  If not
given, all object files are considered.

@item info probes all
List the available static probes, from all types.
@end table

@vindex $_probe_arg@r{, convenience variable}
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 arguments are available using the
convenience variables (@pxref{Convenience Vars})
@code{$_probe_arg0}@dots{}@code{$_probe_arg11}.  Each probe argument is
an integer of the appropriate size; types are not preserved.  The
convenience variable @code{$_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 @value{GDBN} to give
an error message.


@c  @ifclear BARETARGET
@node Error in Breakpoints
@subsection ``Cannot insert breakpoints''

If you request too many active hardware-assisted breakpoints and
watchpoints, you will see this error message:

@c FIXME: the precise wording of this message may change; the relevant
@c source change is not committed yet (Sep 3, 1999).
@smallexample
Stopped; cannot insert breakpoints.
You may have requested too many hardware breakpoints and watchpoints.
@end smallexample

@noindent
This message is printed when you attempt to resume the program, since
only then @value{GDBN} 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.

@node Breakpoint-related Warnings
@subsection ``Breakpoint address adjusted...''
@cindex breakpoint address adjusted

Some processor architectures place constraints on the addresses at
which breakpoints may be placed.  For architectures thus constrained,
@value{GDBN} will attempt to adjust the breakpoint's address to comply
with the constraints dictated by the architecture.

One example of such an architecture is the Fujitsu FR-V.  The FR-V is
a VLIW architecture in which a number of RISC-like instructions may be
bundled together for parallel execution.  The FR-V architecture
constrains the location of a breakpoint instruction within such a
bundle to the instruction with the lowest address.  @value{GDBN}
honors this constraint by adjusting a breakpoint's address to the
first in the bundle.

It is not uncommon for optimized code to have bundles which contain
instructions from different source statements, thus it may happen that
a breakpoint's address will be adjusted from one source statement to
another.  Since this adjustment may significantly alter @value{GDBN}'s
breakpoint related behavior from what the user expects, a warning is
printed when the breakpoint is first set and also when the breakpoint
is hit.

A warning like the one below is printed when setting a breakpoint
that's been subject to address adjustment:

@smallexample
warning: Breakpoint address adjusted from 0x00010414 to 0x00010410.
@end smallexample

Such warnings are printed both for user settable and @value{GDBN}'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.

@value{GDBN} will also issue a warning when stopping at one of these
adjusted breakpoints:

@smallexample
warning: Breakpoint 1 address previously adjusted from 0x00010414
to 0x00010410.
@end smallexample

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.

@node Continuing and Stepping
@section Continuing and Stepping

@cindex stepping
@cindex continuing
@cindex resuming execution
@dfn{Continuing} means resuming program execution until your program
completes normally.  In contrast, @dfn{stepping} means executing just
one more ``step'' of your program, where ``step'' may mean either one
line of source code, or one machine instruction (depending on what
particular command you use).  Either when continuing or when stepping,
your program may stop even sooner, due to a breakpoint or a signal.  (If
it stops due to a signal, you may want to use @code{handle}, or use
@samp{signal 0} to resume execution (@pxref{Signals, ,Signals}),
or you may step into the signal's handler (@pxref{stepping and signal
handlers}).)

@table @code
@kindex continue
@kindex c @r{(@code{continue})}
@kindex fg @r{(resume foreground execution)}
@item continue @r{[}@var{ignore-count}@r{]}
@itemx c @r{[}@var{ignore-count}@r{]}
@itemx fg @r{[}@var{ignore-count}@r{]}
Resume program execution, at the address where your program last stopped;
any breakpoints set at that address are bypassed.  The optional argument
@var{ignore-count} allows you to specify a further number of times to
ignore a breakpoint at this location; its effect is like that of
@code{ignore} (@pxref{Conditions, ,Break Conditions}).

The argument @var{ignore-count} is meaningful only when your program
stopped due to a breakpoint.  At other times, the argument to
@code{continue} is ignored.

The synonyms @code{c} and @code{fg} (for @dfn{foreground}, as the
debugged program is deemed to be the foreground program) are provided
purely for convenience, and have exactly the same behavior as
@code{continue}.
@end table

To resume execution at a different place, you can use @code{return}
(@pxref{Returning, ,Returning from a Function}) to go back to the
calling function; or @code{jump} (@pxref{Jumping, ,Continuing at a
Different Address}) to go to an arbitrary location in your program.

A typical technique for using stepping is to set a breakpoint
(@pxref{Breakpoints, ,Breakpoints; Watchpoints; and Catchpoints}) 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.

@table @code
@kindex step
@kindex s @r{(@code{step})}
@item step
Continue running your program until control reaches a different source
line, then stop it and return control to @value{GDBN}.  This command is
abbreviated @code{s}.

@quotation
@c "without debugging information" is imprecise; actually "without line
@c numbers in the debugging information".  (gcc -g1 has debugging info but
@c not line numbers).  But it seems complex to try to make that
@c distinction here.
@emph{Warning:} If you use the @code{step} command while control is
within a function that was compiled without debugging information,
execution 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 @code{stepi} command, described
below.
@end quotation

The @code{step} command only stops at the first instruction of a source
line.  This prevents the multiple stops that could otherwise occur in
@code{switch} statements, @code{for} loops, etc.  @code{step} continues
to stop if a function that has debugging information is called within
the line.  In other words, @code{step} @emph{steps inside} any functions
called within the line.

Also, the @code{step} command only enters a function if there is line
number information for the function.  Otherwise it acts like the
@code{next} command.  This avoids problems when using @code{cc -gl}
on @acronym{MIPS} machines.  Previously, @code{step} entered subroutines if there
was any debugging information about the routine.

@item step @var{count}
Continue running as in @code{step}, but do so @var{count} times.  If a
breakpoint is reached, or a signal not related to stepping occurs before
@var{count} steps, stepping stops right away.

@kindex next
@kindex n @r{(@code{next})}
@item next @r{[}@var{count}@r{]}
Continue to the next source line in the current (innermost) stack frame.
This is similar to @code{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 @code{next} command.  This command
is abbreviated @code{n}.

An argument @var{count} is a repeat count, as for @code{step}.


@c  FIX ME!!  Do we delete this, or is there a way it fits in with
@c  the following paragraph?   ---  Vctoria
@c
@c  @code{next} within a function that lacks debugging information acts like
@c  @code{step}, but any function calls appearing within the code of the
@c  function are executed without stopping.

The @code{next} command only stops at the first instruction of a
source line.  This prevents multiple stops that could otherwise occur in
@code{switch} statements, @code{for} loops, etc.

@kindex set step-mode
@item set step-mode
@cindex functions without line info, and stepping
@cindex stepping into functions with no line info
@itemx set step-mode on
The @code{set step-mode on} command causes the @code{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 @value{GDBN} to automatically skip over this function.

@item set step-mode off
Causes the @code{step} command to step over any functions which contains no
debug information.  This is the default.

@item show step-mode
Show whether @value{GDBN} will stop in or step over functions without
source line debug information.

@kindex finish
@kindex fin @r{(@code{finish})}
@item 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 @code{fin}.

Contrast this with the @code{return} command (@pxref{Returning,
,Returning from a Function}).

@kindex until
@kindex u @r{(@code{until})}
@cindex run until specified location
@item until
@itemx 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 @code{next}
command, except that when @code{until} encounters a jump, it
automatically continues execution until the program counter is greater
than the address of the jump.

This means that when you reach the end of a loop after single stepping
though it, @code{until} makes your program continue execution until it
exits the loop.  In contrast, a @code{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.

@code{until} always stops your program if it attempts to exit the current
stack frame.

@code{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 @code{f}
(@code{frame}) command shows that execution is stopped at line
@code{206}; yet when we use @code{until}, we get to line @code{195}:

@smallexample
(@value{GDBP}) f
#0  main (argc=4, argv=0xf7fffae8) at m4.c:206
206                 expand_input();
(@value{GDBP}) until
195             for ( ; argc > 0; NEXTARG) @{
@end smallexample

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 @code{for}-loop is
written before the body of the loop.  The @code{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.

@code{until} with no argument works by means of single
instruction stepping, and hence is slower than @code{until} with an
argument.

@item until @var{location}
@itemx u @var{location}
Continue running your program until either the specified @var{location} is
reached, or the current stack frame returns.  The location is any of
the forms described in @ref{Specify Location}.
This form of the command uses temporary breakpoints, and
hence is quicker than @code{until} without an argument.  The specified
location is actually reached only if it is in the current frame.  This
implies that @code{until} can be used to skip over recursive function
invocations.  For instance in the code below, if the current location is
line @code{96}, issuing @code{until 99} will execute the program up to
line @code{99} in the same invocation of factorial, i.e., after the inner
invocations have returned.

@smallexample
94	int factorial (int value)
95	@{
96	    if (value > 1) @{
97            value *= factorial (value - 1);
98	    @}
99	    return (value);
100     @}
@end smallexample


@kindex advance @var{location}
@item advance @var{location}
Continue running the program up to the given @var{location}.  An argument is
required, which should be of one of the forms described in
@ref{Specify Location}.
Execution will also stop upon exit from the current stack
frame.  This command is similar to @code{until}, but @code{advance} will
not skip over recursive function calls, and the target location doesn't
have to be in the same frame as the current one.


@kindex stepi
@kindex si @r{(@code{stepi})}
@item stepi
@itemx stepi @var{arg}
@itemx si
Execute one machine instruction, then stop and return to the debugger.

It is often useful to do @samp{display/i $pc} when stepping by machine
instructions.  This makes @value{GDBN} automatically display the next
instruction to be executed, each time your program stops.  @xref{Auto
Display,, Automatic Display}.

An argument is a repeat count, as in @code{step}.

@need 750
@kindex nexti
@kindex ni @r{(@code{nexti})}
@item nexti
@itemx nexti @var{arg}
@itemx 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 @code{next}.

@end table

@anchor{range stepping}
@cindex range stepping
@cindex target-assisted range stepping
By default, and if available, @value{GDBN} makes use of
target-assisted @dfn{range stepping}.  In other words, whenever you
use a stepping command (e.g., @code{step}, @code{next}), @value{GDBN}
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 @value{GDBN} 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:

@table @code
@kindex set range-stepping
@kindex show range-stepping
@item set range-stepping
@itemx show range-stepping
Control whether range stepping is enabled.

If @code{on}, and the target supports it, @value{GDBN} tells the
target to step a range of addresses itself, instead of issuing
multiple single-steps.  If @code{off}, @value{GDBN} always issues
single-steps, even if range stepping is supported by the target.  The
default is @code{on}.

@end table

@node Skipping Over Functions and Files
@section Skipping Over Functions and Files
@cindex skipping over functions and files

The program you are debugging may contain some functions which are
uninteresting to debug.  The @code{skip} comand lets you tell @value{GDBN} to
skip a function or all functions in a file when stepping.

For example, consider the following C function:

@smallexample
101     int func()
102     @{
103         foo(boring());
104         bar(boring());
105     @}
@end smallexample

@noindent
Suppose you wish to step into the functions @code{foo} and @code{bar}, but you
are not interested in stepping through @code{boring}.  If you run @code{step}
at line 103, you'll enter @code{boring()}, but if you run @code{next}, you'll
step over both @code{foo} and @code{boring}!

One solution is to @code{step} into @code{boring} and use the @code{finish}
command to immediately exit it.  But this can become tedious if @code{boring}
is called from many places.

A more flexible solution is to execute @kbd{skip boring}.  This instructs
@value{GDBN} never to step into @code{boring}.  Now when you execute
@code{step} at line 103, you'll step over @code{boring} and directly into
@code{foo}.

You can also instruct @value{GDBN} to skip all functions in a file, with, for
example, @code{skip file boring.c}.

@table @code
@kindex skip function
@item skip @r{[}@var{linespec}@r{]}
@itemx skip function @r{[}@var{linespec}@r{]}
After running this command, the function named by @var{linespec} or the
function containing the line named by @var{linespec} will be skipped over when
stepping.  @xref{Specify Location}.

If you do not specify @var{linespec}, the function you're currently debugging
will be skipped.

(If you have a function called @code{file} that you want to skip, use
@kbd{skip function file}.)

@kindex skip file
@item skip file @r{[}@var{filename}@r{]}
After running this command, any function whose source lives in @var{filename}
will be skipped over when stepping.

If you do not specify @var{filename}, functions whose source lives in the file
you're currently debugging will be skipped.
@end table

Skips can be listed, deleted, disabled, and enabled, much like breakpoints.
These are the commands for managing your list of skips:

@table @code
@kindex info skip
@item info skip @r{[}@var{range}@r{]}
Print details about the specified skip(s).  If @var{range} is not specified,
print a table with details about all functions and files marked for skipping.
@code{info skip} prints the following information about each skip:

@table @emph
@item Identifier
A number identifying this skip.
@item Type
The type of this skip, either @samp{function} or @samp{file}.
@item Enabled or Disabled
Enabled skips are marked with @samp{y}.  Disabled skips are marked with @samp{n}.
@item 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 @samp{<PENDING>}.  Once a shared library
which has the function is loaded, @code{info skip} will show the function's
address here.
@item 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.
@end table

@kindex skip delete
@item skip delete @r{[}@var{range}@r{]}
Delete the specified skip(s).  If @var{range} is not specified, delete all
skips.

@kindex skip enable
@item skip enable @r{[}@var{range}@r{]}
Enable the specified skip(s).  If @var{range} is not specified, enable all
skips.

@kindex skip disable
@item skip disable @r{[}@var{range}@r{]}
Disable the specified skip(s).  If @var{range} is not specified, disable all
skips.

@end table

@node Signals
@section Signals
@cindex 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 @code{SIGINT} is the
signal a program gets when you type an interrupt character (often @kbd{Ctrl-c});
@code{SIGSEGV} is the signal a program gets from referencing a place in
memory far away from all the areas in use; @code{SIGALRM} occurs when
the alarm clock timer goes off (which happens only if your program has
requested an alarm).

@cindex fatal signals
Some signals, including @code{SIGALRM}, are a normal part of the
functioning of your program.  Others, such as @code{SIGSEGV}, indicate
errors; these signals are @dfn{fatal} (they kill your program immediately) if the
program has not specified in advance some other way to handle the signal.
@code{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.

@value{GDBN} has the ability to detect any occurrence of a signal in your
program.  You can tell @value{GDBN} in advance what to do for each kind of
signal.

@cindex handling signals
Normally, @value{GDBN} is set up to let the non-erroneous signals like
@code{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 @code{handle} command.

@table @code
@kindex info signals
@kindex info handle
@item info signals
@itemx info handle
Print a table of all the kinds of signals and how @value{GDBN} has been told to
handle each one.  You can use this to see the signal numbers of all
the defined types of signals.

@item info signals @var{sig}
Similar, but print information only about the specified signal number.

@code{info handle} is an alias for @code{info signals}.

@item catch signal @r{[}@var{signal}@dots{} @r{|} @samp{all}@r{]}
Set a catchpoint for the indicated signals.  @xref{Set Catchpoints},
for details about this command.

@kindex handle
@item handle @var{signal} @r{[}@var{keywords}@dots{}@r{]}
Change the way @value{GDBN} handles signal @var{signal}.  The @var{signal}
can be the number of a signal or its name (with or without the
@samp{SIG} at the beginning); a list of signal numbers of the form
@samp{@var{low}-@var{high}}; or the word @samp{all}, meaning all the
known signals.  Optional arguments @var{keywords}, described below,
say what change to make.
@end table

@c @group
The keywords allowed by the @code{handle} command can be abbreviated.
Their full names are:

@table @code
@item nostop
@value{GDBN} should not stop your program when this signal happens.  It may
still print a message telling you that the signal has come in.

@item stop
@value{GDBN} should stop your program when this signal happens.  This implies
the @code{print} keyword as well.

@item print
@value{GDBN} should print a message when this signal happens.

@item noprint
@value{GDBN} should not mention the occurrence of the signal at all.  This
implies the @code{nostop} keyword as well.

@item pass
@itemx noignore
@value{GDBN} 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.  @code{pass} and @code{noignore} are synonyms.

@item nopass
@itemx ignore
@value{GDBN} should not allow your program to see this signal.
@code{nopass} and @code{ignore} are synonyms.
@end table
@c @end group

When a signal stops your program, the signal is not visible to the
program until you
continue.  Your program sees the signal then, if @code{pass} is in
effect for the signal in question @emph{at that time}.  In other words,
after @value{GDBN} reports a signal, you can use the @code{handle}
command with @code{pass} or @code{nopass} to control whether your
program sees that signal when you continue.

The default is set to @code{nostop}, @code{noprint}, @code{pass} for
non-erroneous signals such as @code{SIGALRM}, @code{SIGWINCH} and
@code{SIGCHLD}, and to @code{stop}, @code{print}, @code{pass} for the
erroneous signals.

You can also use the @code{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 @samp{signal 0}.  @xref{Signaling, ,Giving your
Program a Signal}.

@cindex stepping and signal handlers
@anchor{stepping and signal handlers}

@value{GDBN} optimizes for stepping the mainline code.  If a signal
that has @code{handle nostop} and @code{handle pass} set arrives while
a stepping command (e.g., @code{stepi}, @code{step}, @code{next}) is
in progress, @value{GDBN} lets the signal handler run and then resumes
stepping the mainline code once the signal handler returns.  In other
words, @value{GDBN} steps over the signal handler.  This prevents
signals that you've specified as not interesting (with @code{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 @code{handle stop} in effect, or for any other event
that normally results in stopping the stepping command sooner.  Also
note that @value{GDBN} still informs you that the program received a
signal if @code{handle print} is set.

@anchor{stepping into signal handlers}

If you set @code{handle pass} for a signal, and your program sets up a
handler for it, then issuing a stepping command, such as @code{step}
or @code{stepi}, when your program is stopped due to the signal will
step @emph{into} the signal handler (if the target supports that).

Likewise, if you use the @code{queue-signal} command to queue a signal
to be delivered to the current thread when execution of the thread
resumes (@pxref{Signaling, ,Giving your Program a Signal}), then a
stepping command will step into the signal handler.

Here's an example, using @code{stepi} to step to the first instruction
of @code{SIGUSR1}'s handler:

@smallexample
(@value{GDBP}) handle SIGUSR1
Signal        Stop      Print   Pass to program Description
SIGUSR1       Yes       Yes     Yes             User defined signal 1
(@value{GDBP}) c
Continuing.

Program received signal SIGUSR1, User defined signal 1.
main () sigusr1.c:28
28        p = 0;
(@value{GDBP}) si
sigusr1_handler () at sigusr1.c:9
9       @{
@end smallexample

The same, but using @code{queue-signal} instead of waiting for the
program to receive the signal first:

@smallexample
(@value{GDBP}) n
28        p = 0;
(@value{GDBP}) queue-signal SIGUSR1
(@value{GDBP}) si
sigusr1_handler () at sigusr1.c:9
9       @{
(@value{GDBP})
@end smallexample

@cindex extra signal information
@anchor{extra signal information}

On some targets, @value{GDBN} can inspect extra signal information
associated with the intercepted signal, before it is actually
delivered to the program being debugged.  This information is exported
by the convenience variable @code{$_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 @code{ptype
$_siginfo} command.  On Unix systems, it typically corresponds to the
standard @code{siginfo_t} type, as defined in the @file{signal.h}
system header.

Here's an example, on a @sc{gnu}/Linux system, printing the stray
referenced address that raised a segmentation fault.

@smallexample
@group
(@value{GDBP}) continue
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400766 in main ()
69        *(int *)p = 0;
(@value{GDBP}) 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;
@}
(@value{GDBP}) ptype $_siginfo._sifields._sigfault
type = struct @{
    void *si_addr;
@}
(@value{GDBP}) p $_siginfo._sifields._sigfault.si_addr
$1 = (void *) 0x7ffff7ff7000
@end group
@end smallexample

Depending on target support, @code{$_siginfo} may also be writable.

@node Thread Stops
@section Stopping and Starting Multi-thread Programs

@cindex stopped threads
@cindex threads, stopped

@cindex continuing threads
@cindex threads, continuing

@value{GDBN} supports debugging programs with multiple threads
(@pxref{Threads,, Debugging Programs with Multiple Threads}).  There
are two modes of controlling execution of your program within the
debugger.  In the default mode, referred to as @dfn{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 
@value{GDBN}.  On some targets, @value{GDBN} also supports 
@dfn{non-stop mode}, in which other threads can continue to run freely while
you examine the stopped thread in the debugger.

@menu
* All-Stop Mode::		All threads stop when GDB takes control
* Non-Stop Mode::		Other threads continue to execute
* Background Execution::	Running your program asynchronously
* Thread-Specific Breakpoints::	Controlling breakpoints
* Interrupted System Calls::	GDB may interfere with system calls
* Observer Mode::               GDB does not alter program behavior
@end menu

@node All-Stop Mode
@subsection All-Stop Mode

@cindex all-stop mode

In all-stop mode, whenever your program stops under @value{GDBN} for any reason,
@emph{all} threads of execution stop, not just the current thread.  This
allows you to examine the overall state of the program, including
switching between threads, without worrying that things may change
underfoot.

Conversely, whenever you restart the program, @emph{all} threads start
executing.  @emph{This is true even when single-stepping} with commands
like @code{step} or @code{next}.

In particular, @value{GDBN} cannot single-step all threads in lockstep.
Since thread scheduling is up to your debugging target's operating
system (not controlled by @value{GDBN}), other threads may
execute more than one statement while the current thread completes a
single step.  Moreover, in general other threads stop in the middle of a
statement, rather than at a clean statement boundary, when the program
stops.

You might even find your program stopped in another thread after
continuing or even single-stepping.  This happens whenever some other
thread runs into a breakpoint, a signal, or an exception before the
first thread completes whatever you requested.

@cindex automatic thread selection
@cindex switching threads automatically
@cindex threads, automatic switching
Whenever @value{GDBN} stops your program, due to a breakpoint or a
signal, it automatically selects the thread where that breakpoint or
signal happened.  @value{GDBN} alerts you to the context switch with a
message such as @samp{[Switching to Thread @var{n}]} to identify the
thread.  

On some OSes, you can modify @value{GDBN}'s default behavior by
locking the OS scheduler to allow only a single thread to run.

@table @code
@item set scheduler-locking @var{mode}
@cindex scheduler locking mode
@cindex lock scheduler
Set the scheduler locking mode.  If it is @code{off}, then there is no
locking and any thread may run at any time.  If @code{on}, then only the
current thread may run when the inferior is resumed.  The @code{step}
mode optimizes for single-stepping; it prevents other threads 
from preempting the current thread while you are stepping, so that 
the focus of debugging does not change unexpectedly.
Other threads only rarely (or never) get a chance to run
when you step.  They are more likely to run when you @samp{next} over a
function call, and they are completely free to run when you use commands
like @samp{continue}, @samp{until}, or @samp{finish}.  However, unless another
thread hits a breakpoint during its timeslice, @value{GDBN} does not change
the current thread away from the thread that you are debugging.

@item show scheduler-locking
Display the current scheduler locking mode.
@end table

@cindex resume threads of multiple processes simultaneously
By default, when you issue one of the execution commands such as
@code{continue}, @code{next} or @code{step}, @value{GDBN} allows only
threads of the current inferior to run.  For example, if @value{GDBN}
is attached to two inferiors, each with two threads, the
@code{continue} command resumes only the two threads of the current
inferior.  This is useful, for example, when you debug a program that
forks and you want to hold the parent stopped (so that, for instance,
it doesn't run to exit), while you debug the child.  In other
situations, you may not be interested in inspecting the current state
of any of the processes @value{GDBN} is attached to, and you may want
to resume them all until some breakpoint is hit.  In the latter case,
you can instruct @value{GDBN} to allow all threads of all the
inferiors to run with the @w{@code{set schedule-multiple}} command.

@table @code
@kindex set schedule-multiple
@item set schedule-multiple
Set the mode for allowing threads of multiple processes to be resumed
when an execution command is issued.  When @code{on}, all threads of
all processes are allowed to run.  When @code{off}, only the threads
of the current process are resumed.  The default is @code{off}.  The
@code{scheduler-locking} mode takes precedence when set to @code{on},
or while you are stepping and set to @code{step}.

@item show schedule-multiple
Display the current mode for resuming the execution of threads of
multiple processes.
@end table

@node Non-Stop Mode
@subsection Non-Stop Mode

@cindex non-stop mode

@c This section is really only a place-holder, and needs to be expanded
@c with more details.

For some multi-threaded targets, @value{GDBN} supports an optional
mode of operation in which you can examine stopped program threads in
the debugger while other threads continue to execute freely.  This
minimizes intrusion when debugging live systems, such as programs
where some threads have real-time constraints or must continue to
respond to external events.  This is referred to as @dfn{non-stop} mode.

In non-stop mode, when a thread stops to report a debugging event,
@emph{only} that thread is stopped; @value{GDBN} does not stop other
threads as well, in contrast to the all-stop mode behavior.  Additionally,
execution commands such as @code{continue} and @code{step} apply by default
only to the current thread in non-stop mode, rather than all threads as
in all-stop mode.  This allows you to control threads explicitly in
ways that are not possible in all-stop mode --- for example, stepping
one thread while allowing others to run freely, stepping
one thread while holding all others stopped, or stepping several threads
independently and simultaneously.

To enter non-stop mode, use this sequence of commands before you run
or attach to your program:

@smallexample
# If using the CLI, pagination breaks non-stop.
set pagination off

# Finally, turn it on!
set non-stop on
@end smallexample

You can use these commands to manipulate the non-stop mode setting:

@table @code
@kindex set non-stop
@item set non-stop on
Enable selection of non-stop mode.
@item set non-stop off
Disable selection of non-stop mode.
@kindex show non-stop
@item show non-stop
Show the current non-stop enablement setting.
@end table

Note these commands only reflect whether non-stop mode is enabled,
not whether the currently-executing program is being run in non-stop mode.
In particular, the @code{set non-stop} preference is only consulted when
@value{GDBN} starts or connects to the target program, and 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, @value{GDBN} 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, @code{continue} only continues one thread.
To continue all threads, issue @code{continue -a} or @code{c -a}.

You can use @value{GDBN}'s background execution commands
(@pxref{Background Execution}) to run some threads in the background
while you continue to examine or step others from @value{GDBN}.
The MI execution commands (@pxref{GDB/MI Program Execution}) are
always executed asynchronously in non-stop mode.

Suspending execution is done with the @code{interrupt} command when
running in the background, or @kbd{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 @code{interrupt -a}.

Other execution commands do not currently support the @code{-a} option.

In non-stop mode, when a thread stops, @value{GDBN} 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 @value{GDBN}'s
command interpreter, and it would be confusing if @value{GDBN} unexpectedly
changed to a different thread just as you entered a command to operate on the
previously current thread.

@node Background Execution
@subsection Background Execution

@cindex foreground execution
@cindex background execution
@cindex asynchronous execution
@cindex execution, foreground, background and asynchronous

@value{GDBN}'s execution commands have two variants:  the normal
foreground (synchronous) behavior, and a background
(asynchronous) behavior.  In foreground execution, @value{GDBN} waits for
the program to report that some thread has stopped before prompting for
another command.  In background execution, @value{GDBN} immediately gives
a command prompt so that you can issue other commands while your program runs.

If the target doesn't support async mode, @value{GDBN} issues an error
message if you attempt to use the background execution commands.

To specify background execution, add a @code{&} to the command.  For example,
the background form of the @code{continue} command is @code{continue&}, or
just @code{c&}.  The execution commands that accept background execution
are:

@table @code
@kindex run&
@item run
@xref{Starting, , Starting your Program}.

@item attach
@kindex attach&
@xref{Attach, , Debugging an Already-running Process}.

@item step
@kindex step&
@xref{Continuing and Stepping, step}.

@item stepi
@kindex stepi&
@xref{Continuing and Stepping, stepi}.

@item next
@kindex next&
@xref{Continuing and Stepping, next}.

@item nexti
@kindex nexti&
@xref{Continuing and Stepping, nexti}.

@item continue
@kindex continue&
@xref{Continuing and Stepping, continue}.

@item finish
@kindex finish&
@xref{Continuing and Stepping, finish}.

@item until
@kindex until&
@xref{Continuing and Stepping, until}.

@end table

Background execution is especially useful in conjunction with non-stop
mode for debugging programs with multiple threads; see @ref{Non-Stop Mode}.
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 commands that are valid in all-stop
mode while the program is running include @code{help} and @code{info break}.

You can interrupt your program while it is running in the background by
using the @code{interrupt} command.

@table @code
@kindex interrupt
@item interrupt
@itemx interrupt -a

Suspend execution of the running program.  In all-stop mode,
@code{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 @code{interrupt -a}.
@end table

@node Thread-Specific Breakpoints
@subsection Thread-Specific Breakpoints

When your program has multiple threads (@pxref{Threads,, Debugging
Programs with Multiple Threads}), you can choose whether to set
breakpoints on all threads, or on a particular thread.

@table @code
@cindex breakpoints and threads
@cindex thread breakpoints
@kindex break @dots{} thread @var{threadno}
@item break @var{linespec} thread @var{threadno}
@itemx break @var{linespec} thread @var{threadno} if @dots{}
@var{linespec} specifies source lines; there are several ways of
writing them (@pxref{Specify Location}), but the effect is always to
specify some source line.

Use the qualifier @samp{thread @var{threadno}} with a breakpoint command
to specify that you only want @value{GDBN} to stop the program when a
particular thread reaches this breakpoint.  The @var{threadno} specifier
is one of the numeric thread identifiers assigned by @value{GDBN}, shown
in the first column of the @samp{info threads} display.

If you do not specify @samp{thread @var{threadno}} when you set a
breakpoint, the breakpoint applies to @emph{all} threads of your
program.

You can use the @code{thread} qualifier on conditional breakpoints as
well; in this case, place @samp{thread @var{threadno}} before or
after the breakpoint condition, like this:

@smallexample
(@value{GDBP}) break frik.c:13 thread 28 if bartab > lim
@end smallexample

@end table

Thread-specific breakpoints are automatically deleted when
@value{GDBN} detects the corresponding thread is no longer in the
thread list.  For example:

@smallexample
(@value{GDBP}) c
Thread-specific breakpoint 3 deleted - thread 28 no longer in the thread list.
@end smallexample

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
@code{detach} command (@pxref{Attach, ,Debugging an Already-running
Process}), or if @value{GDBN} loses the remote connection
(@pxref{Remote Debugging}), etc.  Note that with some targets,
@value{GDBN} is only able to detect a thread has exited when the user
explictly asks for the thread list with the @code{info threads}
command.

@node Interrupted System Calls
@subsection Interrupted System Calls 

@cindex thread breakpoints and system calls
@cindex system calls and thread breakpoints
@cindex premature return from system calls
There is an unfortunate side effect when using @value{GDBN} to debug
multi-threaded programs.  If one thread stops for a
breakpoint, or for some other reason, and another thread is blocked in a
system call, then the system call may return prematurely.  This is a
consequence of the interaction between multiple threads and the signals
that @value{GDBN} uses to implement breakpoints and other events that
stop execution.

To handle this problem, your program should check the return value of
each system call and react appropriately.  This is good programming
style anyways.

For example, do not write code like this:

@smallexample
  sleep (10);
@end smallexample

The call to @code{sleep} will return early if a different thread stops
at a breakpoint or for some other reason.

Instead, write this:

@smallexample
  int unslept = 10;
  while (unslept > 0)
    unslept = sleep (unslept);
@end smallexample

A system call is allowed to return early, so the system is still
conforming to its specification.  But @value{GDBN} does cause your
multi-threaded program to behave differently than it would without
@value{GDBN}.

Also, @value{GDBN} 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.

@node Observer Mode
@subsection Observer Mode

If you want to build on non-stop mode and observe program behavior
without any chance of disruption by @value{GDBN}, you can set
variables to disable all of the debugger's attempts to modify state,
whether by writing memory, inserting breakpoints, etc.  These operate
at a low level, intercepting operations from all commands.

When all of these are set to @code{off}, then @value{GDBN} is said to
be @dfn{observer mode}.  As a convenience, the variable
@code{observer} can be set to disable these, plus enable non-stop
mode.

Note that @value{GDBN} will not prevent you from making nonsensical
combinations of these settings. For instance, if you have enabled
@code{may-insert-breakpoints} but disabled @code{may-write-memory},
then breakpoints that work by writing trap instructions into the code
stream will still not be able to be placed.

@table @code

@kindex observer
@item set observer on
@itemx set observer off
When set to @code{on}, this disables all the permission variables
below (except for @code{insert-fast-tracepoints}), plus enables
non-stop debugging.  Setting this to @code{off} switches back to
normal debugging, though remaining in non-stop mode.

@item show observer
Show whether observer mode is on or off.

@kindex may-write-registers
@item set may-write-registers on
@itemx set may-write-registers off
This controls whether @value{GDBN} will attempt to alter the values of
registers, such as with assignment expressions in @code{print}, or the
@code{jump} command.  It defaults to @code{on}.

@item show may-write-registers
Show the current permission to write registers.

@kindex may-write-memory
@item set may-write-memory on
@itemx set may-write-memory off
This controls whether @value{GDBN} will attempt to alter the contents
of memory, such as with assignment expressions in @code{print}.  It
defaults to @code{on}.

@item show may-write-memory
Show the current permission to write memory.

@kindex may-insert-breakpoints
@item set may-insert-breakpoints on
@itemx set may-insert-breakpoints off
This controls whether @value{GDBN} will attempt to insert breakpoints.
This affects all breakpoints, including internal breakpoints defined
by @value{GDBN}.  It defaults to @code{on}.

@item show may-insert-breakpoints
Show the current permission to insert breakpoints.

@kindex may-insert-tracepoints
@item set may-insert-tracepoints on
@itemx set may-insert-tracepoints off
This controls whether @value{GDBN} will attempt to insert (regular)
tracepoints at the beginning of a tracing experiment.  It affects only
non-fast tracepoints, fast tracepoints being under the control of
@code{may-insert-fast-tracepoints}.  It defaults to @code{on}.

@item show may-insert-tracepoints
Show the current permission to insert tracepoints.

@kindex may-insert-fast-tracepoints
@item set may-insert-fast-tracepoints on
@itemx set may-insert-fast-tracepoints off
This controls whether @value{GDBN} will attempt to insert fast
tracepoints at the beginning of a tracing experiment.  It affects only
fast tracepoints, regular (non-fast) tracepoints being under the
control of @code{may-insert-tracepoints}.  It defaults to @code{on}.

@item show may-insert-fast-tracepoints
Show the current permission to insert fast tracepoints.

@kindex may-interrupt
@item set may-interrupt on
@itemx set may-interrupt off
This controls whether @value{GDBN} will attempt to interrupt or stop
program execution.  When this variable is @code{off}, the
@code{interrupt} command will have no effect, nor will
@kbd{Ctrl-c}. It defaults to @code{on}.

@item show may-interrupt
Show the current permission to interrupt or stop the program.

@end table

@node Reverse Execution
@chapter Running programs backward
@cindex reverse execution
@cindex running programs backward

When you are debugging a program, it is not unusual to realize that
you have gone too far, and some event of interest has already happened.
If the target environment supports it, @value{GDBN} can allow you to
``rewind'' the program by running it backward.

A target environment that supports reverse execution should be able
to ``undo'' the changes in machine state that have taken place as the
program was executing normally.  Variables, registers etc.@: should
revert to their previous values.  Obviously this requires a great
deal of sophistication on the part of the target environment; not
all target environments can support reverse execution.

When a program is executed in reverse, the instructions that
have most recently been executed are ``un-executed'', in reverse
order.  The program counter runs backward, following the previous
thread of execution in reverse.  As each instruction is ``un-executed'',
the values of memory and/or registers that were changed by that
instruction are reverted to their previous states.  After executing
a piece of source code in reverse, all side effects of that code
should be ``undone'', and all variables should be returned to their
prior values@footnote{
Note that some side effects are easier to undo than others.  For instance,
memory and registers are relatively easy, but device I/O is hard.  Some
targets may be able undo things like device I/O, and some may not.

The contract between @value{GDBN} and the reverse executing target
requires only that the target do something reasonable when
@value{GDBN} tells it to execute backwards, and then report the 
results back to @value{GDBN}.  Whatever the target reports back to
@value{GDBN}, @value{GDBN} will report back to the user.  @value{GDBN}
assumes that the memory and registers that the target reports are in a
consistant state, but @value{GDBN} accepts whatever it is given.
}.

If you are debugging in a target environment that supports
reverse execution, @value{GDBN} provides the following commands.

@table @code
@kindex reverse-continue
@kindex rc @r{(@code{reverse-continue})}
@item reverse-continue @r{[}@var{ignore-count}@r{]}
@itemx rc @r{[}@var{ignore-count}@r{]}
Beginning at the point where your program last stopped, start executing
in reverse.  Reverse execution will stop for breakpoints and synchronous
exceptions (signals), just like normal execution.  Behavior of
asynchronous signals depends on the target environment.

@kindex reverse-step
@kindex rs @r{(@code{step})}
@item reverse-step @r{[}@var{count}@r{]}
Run the program backward until control reaches the start of a
different source line; then stop it, and return control to @value{GDBN}.

Like the @code{step} command, @code{reverse-step} will only stop
at the beginning of a source line.  It ``un-executes'' the previously
executed source line.  If the previous source line included calls to
debuggable functions, @code{reverse-step} will step (backward) into
the called function, stopping at the beginning of the @emph{last}
statement in the called function (typically a return statement).

Also, as with the @code{step} command, if non-debuggable functions are
called, @code{reverse-step} will run thru them backward without stopping.

@kindex reverse-stepi
@kindex rsi @r{(@code{reverse-stepi})}
@item reverse-stepi @r{[}@var{count}@r{]}
Reverse-execute one machine instruction.  Note that the instruction
to be reverse-executed is @emph{not} the one pointed to by the program
counter, but the instruction executed prior to that one.  For instance,
if the last instruction was a jump, @code{reverse-stepi} will take you
back from the destination of the jump to the jump instruction itself.

@kindex reverse-next
@kindex rn @r{(@code{reverse-next})}
@item reverse-next @r{[}@var{count}@r{]}
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, @code{reverse-next} will take you back
to the caller of that function, @emph{before} the function was called,
just as the normal @code{next} command would take you from the last 
line of a function back to its return to its caller
@footnote{Unless the code is too heavily optimized.}.

@kindex reverse-nexti
@kindex rni @r{(@code{reverse-nexti})}
@item reverse-nexti @r{[}@var{count}@r{]}
Like @code{nexti}, @code{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, @code{reverse-nexti} will continue to execute
in reverse until the call to that function (from the current stack
frame) is reached.

@kindex reverse-finish
@item reverse-finish
Just as the @code{finish} command takes you to the point where the
current function returns, @code{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.

@kindex set exec-direction
@item set exec-direction
Set the direction of target execution.
@item set exec-direction reverse
@cindex execute forward or backward in time
@value{GDBN} will perform all execution commands in reverse, until the
exec-direction mode is changed to ``forward''.  Affected commands include
@code{step, stepi, next, nexti, continue, and finish}.  The @code{return}
command cannot be used in reverse mode.
@item set exec-direction forward
@value{GDBN} will perform all execution commands in the normal fashion.
This is the default.
@end table


@node Process Record and Replay
@chapter Recording Inferior's Execution and Replaying It
@cindex process record and replay
@cindex recording inferior's execution and replaying it

On some platforms, @value{GDBN} provides a special @dfn{process record
and replay} target that can record a log of the process execution, and
replay it later with both forward and reverse execution commands.

@cindex replay mode
When this target is in use, if the execution log includes the record
for the next instruction, @value{GDBN} will debug in @dfn{replay
mode}.  In the replay mode, the inferior does not really execute code
instructions.  Instead, all the events that normally happen during
code execution are taken from the execution log.  While code is not
really executed in replay mode, the values of registers (including the
program counter register) and the memory of the inferior are still
changed as they normally would.  Their contents are taken from the
execution log.

@cindex record mode
If the record for the next instruction is not in the execution log,
@value{GDBN} will debug in @dfn{record mode}.  In this mode, the
inferior executes normally, and @value{GDBN} records the execution log
for future replay.

The process record and replay target supports reverse execution
(@pxref{Reverse Execution}), even if the platform on which the
inferior runs does not.  However, the reverse execution is limited in
this case by the range of the instructions recorded in the execution
log.  In other words, reverse execution on platforms that don't
support it directly can only be done in the replay mode.

When debugging in the reverse direction, @value{GDBN} will work in
replay mode as long as the execution log includes the record for the
previous instruction; otherwise, it will work in record mode, if the
platform supports reverse execution, or stop if not.

For architecture environments that support process record and replay,
@value{GDBN} provides the following commands:

@table @code
@kindex target record
@kindex target record-full
@kindex target record-btrace
@kindex record
@kindex record full
@kindex record btrace
@kindex rec
@kindex rec full
@kindex rec btrace
@item record @var{method}
This command starts the process record and replay target.  The
recording method can be specified as parameter.  Without a parameter
the command uses the @code{full} recording method.  The following
recording methods are available:

@table @code
@item full
Full record/replay recording using @value{GDBN}'s software record and
replay implementation.  This method allows replaying and reverse
execution.

@item btrace
Hardware-supported instruction recording.  This method does not record
data.  Further, the data is collected in a ring buffer so old data will
be overwritten when the buffer is full.  It allows limited replay and
reverse execution.

This recording method may not be available on all processors.
@end table

The process record and replay target can only debug a process that is
already running.  Therefore, you need first to start the process with
the @kbd{run} or @kbd{start} commands, and then start the recording
with the @kbd{record @var{method}} command.

Both @code{record @var{method}} and @code{rec @var{method}} are
aliases of @code{target record-@var{method}}.

@cindex displaced stepping, and process record and replay
Displaced stepping (@pxref{Maintenance Commands,, displaced stepping})
will be automatically disabled when process record and replay target
is started.  That's because the process record and replay target
doesn't support displaced stepping.

@cindex non-stop mode, and process record and replay
@cindex asynchronous execution, and process record and replay
If the inferior is in the non-stop mode (@pxref{Non-Stop Mode}) or in
the asynchronous execution mode (@pxref{Background Execution}), not
all recording methods are available.  The @code{full} recording method
does not support these two modes.

@kindex record stop
@kindex rec s
@item record stop
Stop the process record and replay target.  When process record and
replay target stops, the entire execution log will be deleted and the
inferior will either be terminated, or will remain in its final state.

When you stop the process record and replay target in record mode (at
the end of the execution log), the inferior will be stopped at the
next instruction that would have been recorded.  In other words, if
you record for a while and then stop recording, the inferior process
will be left in the same state as if the recording never happened.

On the other hand, if the process record and replay target is stopped
while in replay mode (that is, not at the end of the execution log,
but at some earlier point), the inferior process will become ``live''
at that earlier state, and it will then be possible to continue the
usual ``live'' debugging of the process from that state.

When the inferior process exits, or @value{GDBN} detaches from it,
process record and replay target will automatically stop itself.

@kindex record goto
@item record goto
Go to a specific location in the execution log.  There are several
ways to specify the location to go to:

@table @code
@item record goto begin
@itemx record goto start
Go to the beginning of the execution log.

@item record goto end
Go to the end of the execution log.

@item record goto @var{n}
Go to instruction number @var{n} in the execution log.
@end table

@kindex record save
@item record save @var{filename}
Save the execution log to a file @file{@var{filename}}.
Default filename is @file{gdb_record.@var{process_id}}, where
@var{process_id} is the process ID of the inferior.

This command may not be available for all recording methods.

@kindex record restore
@item record restore @var{filename}
Restore the execution log from a file @file{@var{filename}}.
File must have been created with @code{record save}.

@kindex set record full
@item set record full insn-number-max @var{limit}
@itemx set record full insn-number-max unlimited
Set the limit of instructions to be recorded for the @code{full}
recording method.  Default value is 200000.

If @var{limit} is a positive number, then @value{GDBN} will start
deleting instructions from the log once the number of the record
instructions becomes greater than @var{limit}.  For every new recorded
instruction, @value{GDBN} will delete the earliest recorded
instruction to keep the number of recorded instructions at the limit.
(Since deleting recorded instructions loses information, @value{GDBN}
lets you control what happens when the limit is reached, by means of
the @code{stop-at-limit} option, described below.)

If @var{limit} is @code{unlimited} or zero, @value{GDBN} will never
delete recorded instructions from the execution log.  The number of
recorded instructions is limited only by the available memory.

@kindex show record full
@item show record full insn-number-max
Show the limit of instructions to be recorded with the @code{full}
recording method.

@item set record full stop-at-limit
Control the behavior of the  @code{full} recording method when the
number of recorded instructions reaches the limit.  If ON (the
default), @value{GDBN} will stop when the limit is reached for the
first time and ask you whether you want to stop the inferior or
continue running it and recording the execution log.  If you decide
to continue recording, each new recorded instruction will cause the
oldest one to be deleted.

If this option is OFF, @value{GDBN} will automatically delete the
oldest record to make room for each new one, without asking.

@item show record full stop-at-limit
Show the current setting of @code{stop-at-limit}.

@item set record full memory-query
Control the behavior when @value{GDBN} is unable to record memory
changes caused by an instruction for the @code{full} recording method.
If ON, @value{GDBN} will query whether to stop the inferior in that
case.

If this option is OFF (the default), @value{GDBN} will automatically
ignore the effect of such instructions on memory.  Later, when
@value{GDBN} replays this execution log, it will mark the log of this
instruction as not accessible, and it will not affect the replay
results.

@item show record full memory-query
Show the current setting of @code{memory-query}.

@kindex set record btrace
The @code{btrace} record target does not trace data.  As a
convenience, when replaying, @value{GDBN} reads read-only memory off
the live program directly, assuming that the addresses of the
read-only areas don't change.  This for example makes it possible to
disassemble code while replaying, but not to print variables.
In some cases, being able to inspect variables might be useful.
You can use the following command for that:

@item set record btrace replay-memory-access
Control the behavior of the @code{btrace} recording method when
accessing memory during replay.  If @code{read-only} (the default),
@value{GDBN} will only allow accesses to read-only memory.
If @code{read-write}, @value{GDBN} 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.

@kindex show record btrace
@item show record btrace replay-memory-access
Show the current setting of @code{replay-memory-access}.

@kindex info record
@item info record
Show various statistics about the recording depending on the recording
method:

@table @code
@item full
For the @code{full} recording method, it shows the state of process
record and its in-memory execution log buffer, including:

@itemize @bullet
@item
Whether in record mode or replay mode.
@item
Lowest recorded instruction number (counting from when the current execution log started recording instructions).
@item
Highest recorded instruction number.
@item
Current instruction about to be replayed (if in replay mode).
@item
Number of instructions contained in the execution log.
@item
Maximum number of instructions that may be contained in the execution log.
@end itemize

@item btrace
For the @code{btrace} recording method, it shows the number of
instructions that have been recorded and the number of blocks of
sequential control-flow that is formed by the recorded instructions.
@end table

@kindex record delete
@kindex rec del
@item record delete
When record target runs in replay mode (``in the past''), delete the
subsequent execution log and begin to record a new execution log starting
from the current address.  This means you will abandon the previously
recorded ``future'' and begin recording a new ``future''.

@kindex record instruction-history
@kindex rec instruction-history
@item record instruction-history
Disassembles instructions from the recorded execution log.  By
default, ten instructions are disassembled.  This can be changed using
the @code{set record instruction-history-size} command.  Instructions
are printed in execution order.  There are several ways to specify
what part of the execution log to disassemble:

@table @code
@item record instruction-history @var{insn}
Disassembles ten instructions starting from instruction number
@var{insn}.

@item record instruction-history @var{insn}, +/-@var{n}
Disassembles @var{n} instructions around instruction number
@var{insn}.  If @var{n} is preceded with @code{+}, disassembles
@var{n} instructions after instruction number @var{insn}.  If
@var{n} is preceded with @code{-}, disassembles @var{n}
instructions before instruction number @var{insn}.

@item record instruction-history
Disassembles ten more instructions after the last disassembly.

@item record instruction-history -
Disassembles ten more instructions before the last disassembly.

@item record instruction-history @var{begin} @var{end}
Disassembles instructions beginning with instruction number
@var{begin} until instruction number @var{end}.  The instruction
number @var{end} is included.
@end table

This command may not be available for all recording methods.

@kindex set record
@item set record instruction-history-size @var{size}
@itemx set record instruction-history-size unlimited
Define how many instructions to disassemble in the @code{record
instruction-history} command.  The default value is 10.
A @var{size} of @code{unlimited} means unlimited instructions.

@kindex show record
@item show record instruction-history-size
Show how many instructions to disassemble in the @code{record
instruction-history} command.

@kindex record function-call-history
@kindex rec function-call-history
@item record function-call-history
Prints the execution history at function granularity. It prints one
line for each sequence of instructions that belong to the same
function giving the name of that function, the source lines
for this instruction sequence (if the @code{/l} modifier is
specified), and the instructions numbers that form the sequence (if
the @code{/i} modifier is specified).  The function names are indented
to reflect the call stack depth if the @code{/c} modifier is
specified.  The @code{/l}, @code{/i}, and @code{/c} modifiers can be
given together.

@smallexample
(@value{GDBP}) @b{list 1, 10}
1   void foo (void)
2   @{
3   @}
4
5   void bar (void)
6   @{
7     ...
8     foo ();
9     ...
10  @}
(@value{GDBP}) @b{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
@end smallexample

By default, ten lines are printed.  This can be changed using the
@code{set record function-call-history-size} command.  Functions are
printed in execution order.  There are several ways to specify what
to print:

@table @code
@item record function-call-history @var{func}
Prints ten functions starting from function number @var{func}.

@item record function-call-history @var{func}, +/-@var{n}
Prints @var{n} functions around function number @var{func}.  If
@var{n} is preceded with @code{+}, prints @var{n} functions after
function number @var{func}.  If @var{n} is preceded with @code{-},
prints @var{n} functions before function number @var{func}.

@item record function-call-history
Prints ten more functions after the last ten-line print.

@item record function-call-history -
Prints ten more functions before the last ten-line print.

@item record function-call-history @var{begin} @var{end}
Prints functions beginning with function number @var{begin} until
function number @var{end}.  The function number @var{end} is included.
@end table

This command may not be available for all recording methods.

@item set record function-call-history-size @var{size}
@itemx set record function-call-history-size unlimited
Define how many lines to print in the
@code{record function-call-history} command.  The default value is 10.
A size of @code{unlimited} means unlimited lines.

@item show record function-call-history-size
Show how many lines to print in the
@code{record function-call-history} command.
@end table


@node Stack
@chapter Examining the Stack

When your program has stopped, the first thing you need to know is where it
stopped and how it got there.

@cindex call stack
Each time your program performs a function call, information about the call
is generated.
That information includes the location of the call in your program,
the arguments of the call,
and the local variables of the function being called.
The information is saved in a block of data called a @dfn{stack frame}.
The stack frames are allocated in a region of memory called the @dfn{call
stack}.

When your program stops, the @value{GDBN} commands for examining the
stack allow you to see all of this information.

@cindex selected frame
One of the stack frames is @dfn{selected} by @value{GDBN} and many
@value{GDBN} commands refer implicitly to the selected frame.  In
particular, whenever you ask @value{GDBN} for the value of a variable in
your program, the value is found in the selected frame.  There are
special @value{GDBN} commands to select whichever frame you are
interested in.  @xref{Selection, ,Selecting a Frame}.

When your program stops, @value{GDBN} automatically selects the
currently executing frame and describes it briefly, similar to the
@code{frame} command (@pxref{Frame Info, ,Information about a Frame}).

@menu
* Frames::                      Stack frames
* Backtrace::                   Backtraces
* Frame Filter Management::     Managing frame filters
* Selection::                   Selecting a frame
* Frame Info::                  Information on a frame

@end menu

@node Frames
@section Stack Frames

@cindex frame, definition
@cindex stack frame
The call stack is divided up into contiguous pieces called @dfn{stack
frames}, or @dfn{frames} for short; each frame is the data associated
with one call to one function.  The frame contains the arguments given
to the function, the function's local variables, and the address at
which the function is executing.

@cindex initial frame
@cindex outermost frame
@cindex innermost frame
When your program is started, the stack has only one frame, that of the
function @code{main}.  This is called the @dfn{initial} frame or the
@dfn{outermost} frame.  Each time a function is called, a new frame is
made.  Each time a function returns, the frame for that function invocation
is eliminated.  If a function is recursive, there can be many frames for
the same function.  The frame for the function in which execution is
actually occurring is called the @dfn{innermost} frame.  This is the most
recently created of all the stack frames that still exist.

@cindex frame pointer
Inside your program, stack frames are identified by their addresses.  A
stack frame consists of many bytes, each of which has its own address; each
kind of computer has a convention for choosing one byte whose
address serves as the address of the frame.  Usually this address is kept
in a register called the @dfn{frame pointer register}
(@pxref{Registers, $fp}) while execution is going on in that frame.

@cindex frame number
@value{GDBN} assigns numbers to all existing stack frames, starting with
zero for the innermost frame, one for the frame that called it,
and so on upward.  These numbers do not really exist in your program;
they are assigned by @value{GDBN} to give you a way of designating stack
frames in @value{GDBN} commands.

@c The -fomit-frame-pointer below perennially causes hbox overflow
@c underflow problems.
@cindex frameless execution
Some compilers provide a way to compile functions so that they operate
without stack frames.  (For example, the @value{NGCC} option
@smallexample
@samp{-fomit-frame-pointer}
@end smallexample
generates functions without a frame.)
This is occasionally done with heavily used library functions to save
the frame setup time.  @value{GDBN} has limited facilities for dealing
with these function invocations.  If the innermost function invocation
has no stack frame, @value{GDBN} 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, @value{GDBN} has
no provision for frameless functions elsewhere in the stack.

@table @code
@kindex frame@r{, command}
@cindex current stack frame
@item frame @r{[}@var{framespec}@r{]}
The @code{frame} command allows you to move from one stack frame to another,
and to print the stack frame you select.  The @var{framespec} may be either the
address of the frame or the stack frame number.  Without an argument,
@code{frame} prints the current stack frame.

@kindex select-frame
@cindex selecting frame silently
@item select-frame
The @code{select-frame} command allows you to move from one stack frame
to another without printing the frame.  This is the silent version of
@code{frame}.
@end table

@node Backtrace
@section Backtraces

@cindex traceback
@cindex call stack traces
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.

@anchor{backtrace-command}
@table @code
@kindex backtrace
@kindex bt @r{(@code{backtrace})}
@item backtrace
@itemx 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
character, normally @kbd{Ctrl-c}.

@item backtrace @var{n}
@itemx bt @var{n}
Similar, but print only the innermost @var{n} frames.

@item backtrace -@var{n}
@itemx bt -@var{n}
Similar, but print only the outermost @var{n} frames.

@item backtrace full
@itemx bt full
@itemx bt full @var{n}
@itemx bt full -@var{n}
Print the values of the local variables also.  As described above,
@var{n} specifies the number of frames to print.

@item backtrace no-filters
@itemx bt no-filters
@itemx bt no-filters @var{n}
@itemx bt no-filters -@var{n}
@itemx bt no-filters full
@itemx bt no-filters full @var{n}
@itemx bt no-filters full -@var{n}
Do not run Python frame filters on this backtrace.  @xref{Frame
Filter API}, for more information.  Additionally use @ref{disable
frame-filter all} to turn off all frame filters.  This is only
relevant when @value{GDBN} has been configured with @code{Python}
support.
@end table

@kindex where
@kindex info stack
The names @code{where} and @code{info stack} (abbreviated @code{info s})
are additional aliases for @code{backtrace}.

@cindex multiple threads, backtrace
In a multi-threaded program, @value{GDBN} by default shows the
backtrace only for the current thread.  To display the backtrace for
several or all of the threads, use the command @code{thread apply}
(@pxref{Threads, thread apply}).  For example, if you type @kbd{thread
apply all backtrace}, @value{GDBN} 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 @code{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
@samp{bt 3}, so it shows the innermost three frames.

@smallexample
@group
#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...)
@end group
@end smallexample

@noindent
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 @code{993} of @code{builtin.c}.

@noindent
The value of parameter @code{data} in frame 1 has been replaced by
@code{@dots{}}.  By default, @value{GDBN} prints the value of a parameter
only if it is a scalar (integer, pointer, enumeration, etc).  See command
@kbd{set print frame-arguments} in @ref{Print Settings} for more details
on how to configure the way function parameter values are printed.

@cindex optimized out, in backtrace
@cindex function call arguments, optimized out
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 optimizations generate code that
passes arguments through registers, but doesn't store those arguments
in the stack frame.  @value{GDBN} has no way of displaying such
arguments in stack frames other than the innermost one.  Here's what
such a backtrace might look like:

@smallexample
@group
#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...)
@end group
@end smallexample

@noindent
The values of arguments that were not saved in their stack frames are
shown as @samp{<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.

@cindex backtrace beyond @code{main} function
@cindex program entry point
@cindex startup code, and backtrace
Most programs have a standard user entry point---a place where system
libraries and startup code transition into user code.  For C this is
@code{main}@footnote{
Note that embedded programs (the so-called ``free-standing''
environment) are not required to have a @code{main} function as the
entry point.  They could even have multiple entry points.}.
When @value{GDBN} finds the entry function in a backtrace
it will terminate the backtrace, to avoid tracing into highly
system-specific (and generally uninteresting) code.

If you need to examine the startup code, or limit the number of levels
in a backtrace, you can change this behavior:

@table @code
@item set backtrace past-main
@itemx set backtrace past-main on
@kindex set backtrace
Backtraces will continue past the user entry point.

@item set backtrace past-main off
Backtraces will stop when they encounter the user entry point.  This is the
default.

@item show backtrace past-main
@kindex show backtrace
Display the current user entry point backtrace policy.

@item set backtrace past-entry
@itemx set backtrace past-entry on
Backtraces will continue past the internal entry point of an application.
This entry point is encoded by the linker when the application is built,
and is likely before the user entry point @code{main} (or equivalent) is called.

@item set backtrace past-entry off
Backtraces will stop when they encounter the internal entry point of an
application.  This is the default.

@item show backtrace past-entry
Display the current internal entry point backtrace policy.

@item set backtrace limit @var{n}
@itemx set backtrace limit 0
@itemx set backtrace limit unlimited
@cindex backtrace limit
Limit the backtrace to @var{n} levels.  A value of @code{unlimited}
or zero means unlimited levels.

@item show backtrace limit
Display the current limit on backtrace levels.
@end table

You can control how file names are displayed.

@table @code
@item set filename-display
@itemx set filename-display relative
@cindex filename-display
Display file names relative to the compilation directory.  This is the default.

@item set filename-display basename
Display only basename of a filename.

@item set filename-display absolute
Display an absolute filename.

@item show filename-display
Show the current way to display filenames.
@end table

@node Frame Filter Management
@section Management of Frame Filters.
@cindex managing frame filters

Frame filters are Python based utilities to manage and decorate the
output of frames.  @xref{Frame Filter API}, for further information.

Managing frame filters is performed by several commands available
within @value{GDBN}, detailed here.

@table @code
@kindex info frame-filter
@item info frame-filter
Print a list of installed frame filters from all dictionaries, showing
their name, priority and enabled status.

@kindex disable frame-filter
@anchor{disable frame-filter all}
@item disable frame-filter @var{filter-dictionary} @var{filter-name}
Disable a frame filter in the dictionary matching
@var{filter-dictionary} and @var{filter-name}.  The
@var{filter-dictionary} may be @code{all}, @code{global},
@code{progspace}, or the name of the object file where the frame filter
dictionary resides.  When @code{all} is specified, all frame filters
across all dictionaries are disabled.  The @var{filter-name} is the name
of the frame filter and is used when @code{all} is not the option for
@var{filter-dictionary}.  A disabled frame-filter is not deleted, it
may be enabled again later.

@kindex enable frame-filter
@item enable frame-filter @var{filter-dictionary} @var{filter-name}
Enable a frame filter in the dictionary matching
@var{filter-dictionary} and @var{filter-name}.  The
@var{filter-dictionary} may be @code{all}, @code{global},
@code{progspace} or the name of the object file where the frame filter
dictionary resides.  When @code{all} is specified, all frame filters across
all dictionaries are enabled.  The @var{filter-name} is the name of the frame
filter and is used when @code{all} is not the option for
@var{filter-dictionary}.

Example:

@smallexample
(gdb) info frame-filter

global frame-filters:
  Priority  Enabled  Name
  1000      No       PrimaryFunctionFilter
  100       Yes      Reverse

progspace /build/test frame-filters:
  Priority  Enabled  Name
  100       Yes      ProgspaceFilter

objfile /build/test frame-filters:
  Priority  Enabled  Name
  999       Yes      BuildProgra Filter

(gdb) disable frame-filter /build/test BuildProgramFilter
(gdb) info frame-filter

global frame-filters:
  Priority  Enabled  Name
  1000      No       PrimaryFunctionFilter
  100       Yes      Reverse

progspace /build/test frame-filters:
  Priority  Enabled  Name
  100       Yes      ProgspaceFilter

objfile /build/test frame-filters:
  Priority  Enabled  Name
  999       No       BuildProgramFilter

(gdb) enable frame-filter global PrimaryFunctionFilter
(gdb) info frame-filter

global frame-filters:
  Priority  Enabled  Name
  1000      Yes      PrimaryFunctionFilter
  100       Yes      Reverse

progspace /build/test frame-filters:
  Priority  Enabled  Name
  100       Yes      ProgspaceFilter

objfile /build/test frame-filters:
  Priority  Enabled  Name
  999       No       BuildProgramFilter
@end smallexample

@kindex set frame-filter priority
@item set frame-filter priority @var{filter-dictionary} @var{filter-name} @var{priority}
Set the @var{priority} of a frame filter in the dictionary matching
@var{filter-dictionary}, and the frame filter name matching
@var{filter-name}.  The @var{filter-dictionary} may be @code{global},
@code{progspace} or the name of the object file where the frame filter
dictionary resides.  The @var{priority} is an integer.

@kindex show frame-filter priority
@item show frame-filter priority @var{filter-dictionary} @var{filter-name}
Show the @var{priority} of a frame filter in the dictionary matching
@var{filter-dictionary}, and the frame filter name matching
@var{filter-name}.  The @var{filter-dictionary} may be @code{global},
@code{progspace} or the name of the object file where the frame filter
dictionary resides.

Example:

@smallexample
(gdb) info frame-filter

global frame-filters:
  Priority  Enabled  Name
  1000      Yes      PrimaryFunctionFilter
  100       Yes      Reverse

progspace /build/test frame-filters:
  Priority  Enabled  Name
  100       Yes      ProgspaceFilter

objfile /build/test frame-filters:
  Priority  Enabled  Name
  999       No       BuildProgramFilter

(gdb) set frame-filter priority global Reverse 50
(gdb) info frame-filter

global frame-filters:
  Priority  Enabled  Name
  1000      Yes      PrimaryFunctionFilter
  50        Yes      Reverse

progspace /build/test frame-filters:
  Priority  Enabled  Name
  100       Yes      ProgspaceFilter

objfile /build/test frame-filters:
  Priority  Enabled  Name
  999       No       BuildProgramFilter
@end smallexample
@end table

@node Selection
@section Selecting a Frame

Most commands for examining the stack and other data in your program work on
whichever stack frame is selected at the moment.  Here are the commands for
selecting a stack frame; all of them finish by printing a brief description
of the stack frame just selected.

@table @code
@kindex frame@r{, selecting}
@kindex f @r{(@code{frame})}
@item frame @var{n}
@itemx f @var{n}
Select frame number @var{n}.  Recall that frame zero is the innermost
(currently executing) frame, frame one is the frame that called the
innermost one, and so on.  The highest-numbered frame is the one for
@code{main}.

@item frame @var{addr}
@itemx f @var{addr}
Select the frame at address @var{addr}.  This is useful mainly if the
chaining of stack frames has been damaged by a bug, making it
impossible for @value{GDBN} to assign numbers properly to all frames.  In
addition, this can be useful when your program has multiple stacks and
switches between them.

On the SPARC architecture, @code{frame} needs two addresses to
select an arbitrary frame: a frame pointer and a stack pointer.

On the @acronym{MIPS} and Alpha architecture, it needs two addresses: a stack
pointer and a program counter.

On the 29k architecture, it needs three addresses: a register stack
pointer, a program counter, and a memory stack pointer.

@kindex up
@item up @var{n}
Move @var{n} frames up the stack; @var{n} defaults to 1.  For positive
numbers @var{n}, this advances toward the outermost frame, to higher
frame numbers, to frames that have existed longer.

@kindex down
@kindex do @r{(@code{down})}
@item down @var{n}
Move @var{n} frames down the stack; @var{n} defaults to 1.  For
positive numbers @var{n}, this advances toward the innermost frame, to
lower frame numbers, to frames that were created more recently.
You may abbreviate @code{down} as @code{do}.
@end table

All of these commands end by printing two lines of output describing the
frame.  The first line shows the frame number, the function name, the
arguments, and the source file and line number of execution in that
frame.  The second line shows the text of that source line.

@need 1000
For example:

@smallexample
@group
(@value{GDBP}) up
#1  0x22f0 in main (argc=1, argv=0xf7fffbf4, env=0xf7fffbfc)
    at env.c:10
10              read_input_file (argv[i]);
@end group
@end smallexample

After such a printout, the @code{list} command with no arguments
prints ten lines centered on the point of execution in the frame.
You can also edit the program at the point of execution with your favorite
editing program by typing @code{edit}.
@xref{List, ,Printing Source Lines},
for details.

@table @code
@kindex down-silently
@kindex up-silently
@item up-silently @var{n}
@itemx down-silently @var{n}
These two commands are variants of @code{up} and @code{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 @value{GDBN} command scripts, where the output might be unnecessary and
distracting.
@end table

@node Frame Info
@section Information About a Frame

There are several other commands to print information about the selected
stack frame.

@table @code
@item frame
@itemx f
When used without any argument, this command does not change which
frame is selected, but prints a brief description of the currently
selected stack frame.  It can be abbreviated @code{f}.  With an
argument, this command is used to select a stack frame.
@xref{Selection, ,Selecting a Frame}.

@kindex info frame
@kindex info f @r{(@code{info frame})}
@item info frame
@itemx info f
This command prints a verbose description of the selected stack frame,
including:

@itemize @bullet
@item
the address of the frame
@item
the address of the next frame down (called by this frame)
@item
the address of the next frame up (caller of this frame)
@item
the language in which the source code corresponding to this frame is written
@item
the address of the frame's arguments
@item
the address of the frame's local variables
@item
the program counter saved in it (the address of execution in the caller frame)
@item
which registers were saved in the frame
@end itemize

@noindent The verbose description is useful when
something has gone wrong that has made the stack format fail to fit
the usual conventions.

@item info frame @var{addr}
@itemx info f @var{addr}
Print a verbose description of the frame at address @var{addr}, without
selecting that frame.  The selected frame remains unchanged by this
command.  This requires the same kind of address (more than one for some
architectures) that you specify in the @code{frame} command.
@xref{Selection, ,Selecting a Frame}.

@kindex info args
@item info args
Print the arguments of the selected frame, each on a separate line.

@item info locals
@kindex info locals
Print the local variables of the selected frame, each on a separate
line.  These are all variables (declared either static or automatic)
accessible at the point of execution of the selected frame.

@end table


@node Source
@chapter Examining Source Files

@value{GDBN} can print parts of your program's source, since the debugging
information recorded in the program tells @value{GDBN} what source files were
used to build it.  When your program stops, @value{GDBN} spontaneously prints
the line where it stopped.  Likewise, when you select a stack frame
(@pxref{Selection, ,Selecting a Frame}), @value{GDBN} prints the line where
execution in that frame has stopped.  You can print other portions of
source files by explicit command.

If you use @value{GDBN} through its @sc{gnu} Emacs interface, you may
prefer to use Emacs facilities to view source; see @ref{Emacs, ,Using
@value{GDBN} under @sc{gnu} Emacs}.

@menu
* List::                        Printing source lines
* Specify Location::            How to specify code locations
* Edit::                        Editing source files
* Search::                      Searching source files
* Source Path::                 Specifying source directories
* Machine Code::                Source and machine code
@end menu

@node List
@section Printing Source Lines

@kindex list
@kindex l @r{(@code{list})}
To print lines from a source file, use the @code{list} command
(abbreviated @code{l}).  By default, ten lines are printed.
There are several ways to specify what part of the file you want to
print; see @ref{Specify Location}, for the full list.

Here are the forms of the @code{list} command most commonly used:

@table @code
@item list @var{linenum}
Print lines centered around line number @var{linenum} in the
current source file.

@item list @var{function}
Print lines centered around the beginning of function
@var{function}.

@item list
Print more lines.  If the last lines printed were printed with a
@code{list} command, this prints lines following the last lines
printed; however, if the last line printed was a solitary line printed
as part of displaying a stack frame (@pxref{Stack, ,Examining the
Stack}), this prints lines centered around that line.

@item list -
Print lines just before the lines last printed.
@end table

@cindex @code{list}, how many lines to display
By default, @value{GDBN} prints ten source lines with any of these forms of
the @code{list} command.  You can change this using @code{set listsize}:

@table @code
@kindex set listsize
@item set listsize @var{count}
@itemx set listsize unlimited
Make the @code{list} command display @var{count} source lines (unless
the @code{list} argument explicitly specifies some other number).
Setting @var{count} to @code{unlimited} or 0 means there's no limit.

@kindex show listsize
@item show listsize
Display the number of lines that @code{list} prints.
@end table

Repeating a @code{list} command with @key{RET} discards the argument,
so it is equivalent to typing just @code{list}.  This is more useful
than listing the same lines again.  An exception is made for an
argument of @samp{-}; that argument is preserved in repetition so that
each repetition moves up in the source file.

In general, the @code{list} command expects you to supply zero, one or two
@dfn{linespecs}.  Linespecs specify source lines; there are several ways
of writing them (@pxref{Specify Location}), but the effect is always
to specify some source line.

Here is a complete description of the possible arguments for @code{list}:

@table @code
@item list @var{linespec}
Print lines centered around the line specified by @var{linespec}.

@item list @var{first},@var{last}
Print lines from @var{first} to @var{last}.  Both arguments are
linespecs.  When a @code{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.

@item list ,@var{last}
Print lines ending with @var{last}.

@item list @var{first},
Print lines starting with @var{first}.

@item list +
Print lines just after the lines last printed.

@item list -
Print lines just before the lines last printed.

@item list
As described in the preceding table.
@end table

@node Specify Location
@section Specifying a Location
@cindex specifying location
@cindex linespec

Several @value{GDBN} commands accept arguments that specify a location
of your program's code.  Since @value{GDBN} is a source-level
debugger, a location usually specifies some line in the source code;
for that reason, locations are also known as @dfn{linespecs}.

Here are all the different ways of specifying a code location that
@value{GDBN} understands:

@table @code
@item @var{linenum}
Specifies the line number @var{linenum} of the current source file.

@item -@var{offset}
@itemx +@var{offset}
Specifies the line @var{offset} lines before or after the @dfn{current
line}.  For the @code{list} command, the current line is the last one
printed; for the breakpoint commands, this is the line at which
execution stopped in the currently selected @dfn{stack frame}
(@pxref{Frames, ,Frames}, for a description of stack frames.)  When
used as the second of the two linespecs in a @code{list} command,
this specifies the line @var{offset} lines up or down from the first
linespec.

@item @var{filename}:@var{linenum}
Specifies the line @var{linenum} in the source file @var{filename}.
If @var{filename} is a relative file name, then it will match any
source file name with the same trailing components.  For example, if
@var{filename} is @samp{gcc/expr.c}, then it will match source file
name of @file{/build/trunk/gcc/expr.c}, but not
@file{/build/trunk/libcpp/expr.c} or @file{/build/trunk/gcc/x-expr.c}.

@item @var{function}
Specifies the line that begins the body of the function @var{function}.
For example, in C, this is the line with the open brace.

@item @var{function}:@var{label}
Specifies the line where @var{label} appears in @var{function}.

@item @var{filename}:@var{function}
Specifies the line that begins the body of the function @var{function}
in the file @var{filename}.  You only need the file name with a
function name to avoid ambiguity when there are identically named
functions in different source files.

@item @var{label}
Specifies the line at which the label named @var{label} appears.
@value{GDBN} 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
@value{GDBN} will not search for a label.

@item *@var{address}
Specifies the program address @var{address}.  For line-oriented
commands, such as @code{list} and @code{edit}, this specifies a source
line that contains @var{address}.  For @code{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 @var{address} may be any expression valid in the current working
language (@pxref{Languages, working language}) that specifies a code
address.  In addition, as a convenience, @value{GDBN} extends the
semantics of expressions used in locations to cover the situations
that frequently happen during debugging.  Here are the various forms
of @var{address}:

@table @code
@item @var{expression}
Any expression valid in the current working language.

@item @var{funcaddr}
An address of a function or procedure derived from its name.  In C,
C@t{++}, Java, Objective-C, Fortran, minimal, and assembly, this is
simply the function's name @var{function} (and actually a special case
of a valid expression).  In Pascal and Modula-2, this is
@code{&@var{function}}.  In Ada, this is @code{@var{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.

@item '@var{filename}'::@var{funcaddr}
Like @var{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.
@end table

@cindex breakpoint at static probe point
@item -pstap|-probe-stap @r{[}@var{objfile}:@r{[}@var{provider}:@r{]}@r{]}@var{name}
The @sc{gnu}/Linux tool @code{SystemTap} provides a way for
applications to embed static probes.  @xref{Static Probe Points}, for more
information on finding and using static probes.  This form of linespec
specifies the location of such a static probe.

If @var{objfile} is given, only probes coming from that shared library
or executable matching @var{objfile} as a regular expression are considered.
If @var{provider} is given, then only probes from that provider are considered.
If several probes match the spec, @value{GDBN} will insert a breakpoint at
each one of those probes.

@end table


@node Edit
@section Editing Source Files
@cindex editing source files

@kindex edit
@kindex e @r{(@code{edit})}
To edit the lines in a source file, use the @code{edit} command.
The editing program of your choice
is invoked with the current line set to
the active line in the program.
Alternatively, there are several ways to specify what part of the file you
want to print if you want to see other parts of the program:

@table @code
@item edit @var{location}
Edit the source file specified by @code{location}.  Editing starts at
that @var{location}, e.g., at the specified source line of the
specified file.  @xref{Specify Location}, for all the possible forms
of the @var{location} argument; here are the forms of the @code{edit}
command most commonly used:

@table @code
@item edit @var{number}
Edit the current source file with @var{number} as the active line number.

@item edit @var{function}
Edit the file containing @var{function} at the beginning of its definition.
@end table

@end table

@subsection Choosing your Editor
You can customize @value{GDBN} to use any editor you want
@footnote{
The only restriction is that your editor (say @code{ex}), recognizes the
following command-line syntax:
@smallexample
ex +@var{number} file
@end smallexample
The optional numeric value +@var{number} specifies the number of the line in
the file where to start editing.}.
By default, it is @file{@value{EDITOR}}, but you can change this
by setting the environment variable @code{EDITOR} before using
@value{GDBN}.  For example, to configure @value{GDBN} to use the
@code{vi} editor, you could use these commands with the @code{sh} shell:
@smallexample
EDITOR=/usr/bin/vi
export EDITOR
gdb @dots{}
@end smallexample
or in the @code{csh} shell,
@smallexample
setenv EDITOR /usr/bin/vi
gdb @dots{}
@end smallexample

@node Search
@section Searching Source Files
@cindex searching source files

There are two commands for searching through the current source file for a
regular expression.

@table @code
@kindex search
@kindex forward-search
@kindex fo @r{(@code{forward-search})}
@item forward-search @var{regexp}
@itemx search @var{regexp}
The command @samp{forward-search @var{regexp}} checks each line,
starting with the one following the last line listed, for a match for
@var{regexp}.  It lists the line that is found.  You can use the
synonym @samp{search @var{regexp}} or abbreviate the command name as
@code{fo}.

@kindex reverse-search
@item reverse-search @var{regexp}
The command @samp{reverse-search @var{regexp}} checks each line, starting
with the one before the last line listed and going backward, for a match
for @var{regexp}.  It lists the line that is found.  You can abbreviate
this command as @code{rev}.
@end table

@node Source Path
@section Specifying Source Directories

@cindex source path
@cindex directories for source files
Executable programs sometimes do not record the directories of the source
files from which they were compiled, just the names.  Even when they do,
the directories could be moved between the compilation and your debugging
session.  @value{GDBN} has a list of directories to search for source files;
this is called the @dfn{source path}.  Each time @value{GDBN} wants a source file,
it tries all 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
@file{/usr/src/foo-1.0/lib/foo.c}, and our source path is
@file{/mnt/cross}.  The file is first looked up literally; if this
fails, @file{/mnt/cross/usr/src/foo-1.0/lib/foo.c} is tried; if this
fails, @file{/mnt/cross/foo.c} is opened; if this fails, an error
message is printed.  @value{GDBN} does not look up the parts of the
source file name, such as @file{/mnt/cross/src/foo-1.0/lib/foo.c}.
Likewise, the subdirectories of the source path are not searched: if
the source path is @file{/mnt/cross}, and the binary refers to
@file{foo.c}, @value{GDBN} would not find it under
@file{/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 @file{/mnt/cross}, and the source file
is recorded as @file{../lib/foo.c}, @value{GDBN} would first try
@file{../lib/foo.c}, then @file{/mnt/cross/../lib/foo.c}, and after
that---@file{/mnt/cross/foo.c}.

Note that the executable search path is @emph{not} used to locate the
source files.

Whenever you reset or rearrange the source path, @value{GDBN} clears out
any information it has cached about where source files are found and where
each line is in the file.

@kindex directory
@kindex dir
When you start @value{GDBN}, its source path includes only @samp{cdir}
and @samp{cwd}, in that order.
To add other directories, use the @code{directory} command.

The search path is used to find both program source files and @value{GDBN}
script files (read using the @samp{-command} option and @samp{source} command).

In addition to the source path, @value{GDBN} provides a set of commands
that manage a list of source path substitution rules.  A @dfn{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 @ref{set substitute-path}, we name these two parts @var{from} and
@var{to} respectively.  @value{GDBN} does a simple string replacement
of @var{from} with @var{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 @file{foo-1.0} tree has been
moved from @file{/usr/src} to @file{/mnt/cross}, then you can tell
@value{GDBN} to replace @file{/usr/src} in all source path names with
@file{/mnt/cross}.  The first lookup will then be
@file{/mnt/cross/foo-1.0/lib/foo.c} in place of the original location
of @file{/usr/src/foo-1.0/lib/foo.c}.  To define a source path
substitution rule, use the @code{set substitute-path} command
(@pxref{set substitute-path}).

To avoid unexpected substitution results, a rule is applied only if the
@var{from} part of the directory name ends at a directory separator.
For instance, a rule substituting  @file{/usr/source} into
@file{/mnt/cross} will be applied to @file{/usr/source/foo-1.0} but
not to @file{/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 @file{/root/usr/source/baz.c} either.

In many cases, you can achieve the same result using the @code{directory}
command.  However, @code{set substitute-path} can be more efficient in
the case where the sources are organized in a complex tree with multiple
subdirectories.  With the @code{directory} command, you need to add each
subdirectory of your project.  If you moved the entire tree while
preserving its internal organization, then @code{set substitute-path}
allows you to direct the debugger to all the sources with one single
command.

@code{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, @code{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 @value{GDBN} at the new location.

@cindex @samp{--with-relocated-sources}
@cindex default source path substitution
You can configure a default source path substitution rule by
configuring @value{GDBN} with the
@samp{--with-relocated-sources=@var{dir}} option.  The @var{dir}
should be the name of a directory under @value{GDBN}'s configured
prefix (set with @samp{--prefix} or @samp{--exec-prefix}), and
directory names in debug information under @var{dir} will be adjusted
automatically if the installed @value{GDBN} is moved to a new
location.  This is useful if @value{GDBN}, libraries or executables
with debug information and corresponding source code are being moved
together.

@table @code
@item directory @var{dirname} @dots{}
@item dir @var{dirname} @dots{}
Add directory @var{dirname} to the front of the source path.  Several
directory names may be given to this command, separated by @samp{:}
(@samp{;} on MS-DOS and MS-Windows, where @samp{:} usually appears as
part of absolute file names) or
whitespace.  You may specify a directory that is already in the source
path; this moves it forward, so @value{GDBN} searches it sooner.

@kindex cdir
@kindex cwd
@vindex $cdir@r{, convenience variable}
@vindex $cwd@r{, convenience variable}
@cindex compilation directory
@cindex current directory
@cindex working directory
@cindex directory, current
@cindex directory, compilation
You can use the string @samp{$cdir} to refer to the compilation
directory (if one is recorded), and @samp{$cwd} to refer to the current
working directory.  @samp{$cwd} is not the same as @samp{.}---the former
tracks the current working directory as it changes during your @value{GDBN}
session, while the latter is immediately expanded to the current
directory at the time you add an entry to the source path.

@item directory
Reset the source path to its default value (@samp{$cdir:$cwd} on Unix systems).  This requires confirmation.

@c RET-repeat for @code{directory} is explicitly disabled, but since
@c repeating it would be a no-op we do not say that.  (thanks to RMS)

@item set directories @var{path-list}
@kindex set directories
Set the source path to @var{path-list}.
@samp{$cdir:$cwd} are added if missing.

@item show directories
@kindex show directories
Print the source path: show which directories it contains.

@anchor{set substitute-path}
@item set substitute-path @var{from} @var{to}
@kindex set substitute-path
Define a source path substitution rule, and add it at the end of the
current list of existing substitution rules.  If a rule with the same
@var{from} was already defined, then the old rule is also deleted.

For example, if the file @file{/foo/bar/baz.c} was moved to
@file{/mnt/cross/baz.c}, then the command

@smallexample
(@value{GDBP}) set substitute-path /usr/src /mnt/cross
@end smallexample

@noindent
will tell @value{GDBN} to replace @samp{/usr/src} with
@samp{/mnt/cross}, which will allow @value{GDBN} to find the file
@file{baz.c} even though it was moved.

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:

@smallexample
(@value{GDBP}) set substitute-path /usr/src/include /mnt/include
(@value{GDBP}) set substitute-path /usr/src /mnt/src
@end smallexample

@noindent
@value{GDBN} would then rewrite @file{/usr/src/include/defs.h} into
@file{/mnt/include/defs.h} by using the first rule.  However, it would
use the second rule to rewrite @file{/usr/src/lib/foo.c} into
@file{/mnt/src/lib/foo.c}.


@item unset substitute-path [path]
@kindex unset substitute-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.

@item show substitute-path [path]
@kindex show substitute-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.

@end table

If your source path is cluttered with directories that are no longer of
interest, @value{GDBN} may sometimes cause confusion by finding the wrong
versions of source.  You can correct the situation as follows:

@enumerate
@item
Use @code{directory} with no argument to reset the source path to its default value.

@item
Use @code{directory} with suitable arguments to reinstall the
directories you want in the source path.  You can add all the
directories in one command.
@end enumerate

@node Machine Code
@section Source and Machine Code
@cindex source line and its code address

You can use the command @code{info line} to map source lines to program
addresses (and vice versa), and the command @code{disassemble} to display
a range of addresses as machine instructions.  You can use the command
@code{set disassemble-next-line} to set whether to disassemble next
source line when execution stops.  When run under @sc{gnu} Emacs
mode, the @code{info line} command causes the arrow to point to the
line specified.  Also, @code{info line} prints addresses in symbolic form as
well as hex.

@table @code
@kindex info line
@item info line @var{linespec}
Print the starting and ending addresses of the compiled code for
source line @var{linespec}.  You can specify source lines in any of
the ways documented in @ref{Specify Location}.
@end table

For example, we can use @code{info line} to discover the location of
the object code for the first line of function
@code{m4_changequote}:

@c FIXME: I think this example should also show the addresses in
@c symbolic form, as they usually would be displayed.
@smallexample
(@value{GDBP}) info line m4_changequote
Line 895 of "builtin.c" starts at pc 0x634c and ends at 0x6350.
@end smallexample

@noindent
@cindex code address and its source line
We can also inquire (using @code{*@var{addr}} as the form for
@var{linespec}) what source line covers a particular address:
@smallexample
(@value{GDBP}) info line *0x63ff
Line 926 of "builtin.c" starts at pc 0x63e4 and ends at 0x6404.
@end smallexample

@cindex @code{$_} and @code{info line}
@cindex @code{x} command, default address
@kindex x@r{(examine), and} info line
After @code{info line}, the default address for the @code{x} command
is changed to the starting address of the line, so that @samp{x/i} is
sufficient to begin examining the machine code (@pxref{Memory,
,Examining Memory}).  Also, this address is saved as the value of the
convenience variable @code{$_} (@pxref{Convenience Vars, ,Convenience
Variables}).

@table @code
@kindex disassemble
@cindex assembly instructions
@cindex instructions, assembly
@cindex machine instructions
@cindex listing machine instructions
@item disassemble
@itemx disassemble /m
@itemx disassemble /r
This specialized command dumps a range of memory as machine
instructions.  It can also print mixed source+disassembly by specifying
the @code{/m} modifier and print the raw instructions in hex as well as
in symbolic form by specifying the @code{/r}.
The default memory range is the function surrounding the
program counter of the selected frame.  A single argument to this
command is a program counter value; @value{GDBN} dumps the function
surrounding this value.  When two arguments are given, they should
be separated by a comma, possibly surrounded by whitespace.  The
arguments specify a range of addresses to dump, in one of two forms:

@table @code
@item @var{start},@var{end}
the addresses from @var{start} (inclusive) to @var{end} (exclusive)
@item @var{start},+@var{length}
the addresses from @var{start} (inclusive) to
@code{@var{start}+@var{length}} (exclusive).
@end table

@noindent
When 2 arguments are specified, the name of the function is also
printed (since there could be several functions in the given range).

The argument(s) can be any expression yielding a numeric value, such as
@samp{0x32c4}, @samp{&main+10} or @samp{$pc - 8}.

If the range of memory being disassembled contains current program counter,
the instruction at that location is shown with a @code{=>} marker.
@end table

The following example shows the disassembly of a range of addresses of
HP PA-RISC 2.0 code:

@smallexample
(@value{GDBP}) disas 0x32c4, 0x32e4
Dump of assembler code from 0x32c4 to 0x32e4:
   0x32c4 <main+204>:      addil 0,dp
   0x32c8 <main+208>:      ldw 0x22c(sr0,r1),r26
   0x32cc <main+212>:      ldil 0x3000,r31
   0x32d0 <main+216>:      ble 0x3f8(sr4,r31)
   0x32d4 <main+220>:      ldo 0(r31),rp
   0x32d8 <main+224>:      addil -0x800,dp
   0x32dc <main+228>:      ldo 0x588(r1),r26
   0x32e0 <main+232>:      ldil 0x3000,r31
End of assembler dump.
@end smallexample

Here is an example showing mixed source+assembly for Intel x86, when the
program is stopped just after function prologue:

@smallexample
(@value{GDBP}) disas /m main
Dump of assembler code for function main:
5       @{
   0x08048330 <+0>:    push   %ebp
   0x08048331 <+1>:    mov    %esp,%ebp
   0x08048333 <+3>:    sub    $0x8,%esp
   0x08048336 <+6>:    and    $0xfffffff0,%esp
   0x08048339 <+9>:    sub    $0x10,%esp

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

End of assembler dump.
@end smallexample

Here is another example showing raw instructions in hex for AMD x86-64,

@smallexample
(gdb) disas /r 0x400281,+10
Dump of assembler code from 0x400281 to 0x40028b:
   0x0000000000400281:  38 36  cmp    %dh,(%rsi)
   0x0000000000400283:  2d 36 34 2e 73 sub    $0x732e3436,%eax
   0x0000000000400288:  6f     outsl  %ds:(%rsi),(%dx)
   0x0000000000400289:  2e 32 00       xor    %cs:(%rax),%al
End of assembler dump.
@end smallexample

Addresses cannot be specified as a linespec (@pxref{Specify Location}).
So, for example, if you want to disassemble function @code{bar}
in file @file{foo.c}, you must type @samp{disassemble 'foo.c'::bar}
and not @samp{disassemble foo.c:bar}.

Some architectures have more than one commonly-used set of instruction
mnemonics or other syntax.

For programs that were dynamically linked and use shared libraries,
instructions that call functions or branch to locations in the shared
libraries might show a seemingly bogus location---it's actually a
location of the relocation table.  On some architectures, @value{GDBN}
might be able to resolve these to actual function names.

@table @code
@kindex set disassembly-flavor
@cindex Intel disassembly flavor
@cindex AT&T disassembly flavor
@item set disassembly-flavor @var{instruction-set}
Select the instruction set to use when disassembling the
program via the @code{disassemble} or @code{x/i} commands.

Currently this command is only defined for the Intel x86 family.  You
can set @var{instruction-set} to either @code{intel} or @code{att}.
The default is @code{att}, the AT&T flavor used by default by Unix
assemblers for x86-based targets.

@kindex show disassembly-flavor
@item show disassembly-flavor
Show the current setting of the disassembly flavor.
@end table

@table @code
@kindex set disassemble-next-line
@kindex show disassemble-next-line
@item set disassemble-next-line
@itemx show disassemble-next-line
Control whether or not @value{GDBN} will disassemble the next source
line or instruction when execution stops.  If ON, @value{GDBN} will
display disassembly of the next source line when execution of the
program being debugged stops.  This is @emph{in addition} to
displaying the source line itself, which @value{GDBN} always does if
possible.  If the next source line cannot be displayed for some reason
(e.g., if @value{GDBN} cannot find the source file, or there's no line
info in the debug info), @value{GDBN} will display disassembly of the
next @emph{instruction} instead of showing the next source line.  If
AUTO, @value{GDBN} will display disassembly of next instruction only
if the source line cannot be displayed.  This setting causes
@value{GDBN} 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.
@end table


@node Data
@chapter Examining Data

@cindex printing data
@cindex examining data
@kindex print
@kindex inspect
The usual way to examine data in your program is with the @code{print}
command (abbreviated @code{p}), or its synonym @code{inspect}.  It
evaluates and prints the value of an expression of the language your
program is written in (@pxref{Languages, ,Using @value{GDBN} with
Different Languages}).  It may also print the expression using a
Python-based pretty-printer (@pxref{Pretty Printing}).

@table @code
@item print @var{expr}
@itemx print /@var{f} @var{expr}
@var{expr} is an expression (in the source language).  By default the
value of @var{expr} is printed in a format appropriate to its data type;
you can choose a different format by specifying @samp{/@var{f}}, where
@var{f} is a letter specifying the format; see @ref{Output Formats,,Output
Formats}.

@item print
@itemx print /@var{f}
@cindex reprint the last value
If you omit @var{expr}, @value{GDBN} displays the last value again (from the
@dfn{value history}; @pxref{Value History, ,Value History}).  This allows you to
conveniently inspect the same value in an alternative format.
@end table

A more low-level way of examining data is with the @code{x} command.
It examines data in memory at a specified address and prints it in a
specified format.  @xref{Memory, ,Examining Memory}.

If you are interested in information about types, or about how the
fields of a struct or a class are declared, use the @code{ptype @var{exp}}
command rather than @code{print}.  @xref{Symbols, ,Examining the Symbol
Table}.

@cindex exploring hierarchical data structures
@kindex explore
Another way of examining values of expressions and type information is
through the Python extension command @code{explore} (available only if
the @value{GDBN} build is configured with @code{--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.

@table @code
@item explore @var{arg}
@var{arg} is either an expression (in the source language), or a type
visible in the current context of the program being debugged.
@end table

The working of the @code{explore} command can be illustrated with an
example.  If a data type @code{struct ComplexStruct} is defined in your
C program as

@smallexample
struct SimpleStruct
@{
  int i;
  double d;
@};

struct ComplexStruct
@{
  struct SimpleStruct *ss_p;
  int arr[10];
@};
@end smallexample

@noindent
followed by variable declarations as

@smallexample
struct SimpleStruct ss = @{ 10, 1.11 @};
struct ComplexStruct cs = @{ &ss, @{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 @} @};
@end smallexample

@noindent
then, the value of the variable @code{cs} can be explored using the
@code{explore} command as follows.

@smallexample
(gdb) explore cs
The value of `cs' is a struct/class of type `struct ComplexStruct' with
the following fields:

  ss_p = <Enter 0 to explore this field of type `struct SimpleStruct *'>
   arr = <Enter 1 to explore this field of type `int [10]'>

Enter the field number of choice:
@end smallexample

@noindent
Since the fields of @code{cs} are not scalar values, you are being
prompted to chose the field you want to explore.  Let's say you choose
the field @code{ss_p} by entering @code{0}.  Then, since this field is a
pointer, you will be asked if it is pointing to a single value.  From
the declaration of @code{cs} above, it is indeed pointing to a single
value, hence you enter @code{y}.  If you enter @code{n}, then you will
be asked if it were pointing to an array of values, in which case this
field will be explored as if it were an array.

@smallexample
`cs.ss_p' is a pointer to a value of type `struct SimpleStruct'
Continue exploring it as a pointer to a single value [y/n]: y
The value of `*(cs.ss_p)' is a struct/class of type `struct
SimpleStruct' with the following fields:

  i = 10 .. (Value of type `int')
  d = 1.1100000000000001 .. (Value of type `double')

Press enter to return to parent value:
@end smallexample

@noindent
If the field @code{arr} of @code{cs} was chosen for exploration by
entering @code{1} earlier, then since it is as array, you will be
prompted to enter the index of the element in the array that you want
to explore.

@smallexample
`cs.arr' is an array of `int'.
Enter the index of the element you want to explore in `cs.arr': 5

`(cs.arr)[5]' is a scalar value of type `int'.

(cs.arr)[5] = 4

Press enter to return to parent value: 
@end smallexample

In general, at any stage of exploration, you can go deeper towards the
leaf values by responding to the prompts appropriately, or hit the
return key to return to the enclosing data structure (the @i{higher}
level data structure).

Similar to exploring values, you can use the @code{explore} command to
explore types.  Instead of specifying a value (which is typically a
variable name or an expression valid in the current context of the
program being debugged), you specify a type name.  If you consider the
same example as above, your can explore the type
@code{struct ComplexStruct} by passing the argument
@code{struct ComplexStruct} to the @code{explore} command.

@smallexample
(gdb) explore struct ComplexStruct
@end smallexample

@noindent
By responding to the prompts appropriately in the subsequent interactive
session, you can explore the type @code{struct ComplexStruct} in a
manner similar to how the value @code{cs} was explored in the above
example.

The @code{explore} command also has two sub-commands,
@code{explore value} and @code{explore type}. The former sub-command is
a way to explicitly specify that value exploration of the argument is
being invoked, while the latter is a way to explicitly specify that type
exploration of the argument is being invoked.

@table @code
@item explore value @var{expr}
@cindex explore value
This sub-command of @code{explore} explores the value of the
expression @var{expr} (if @var{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 @code{explore}
command being passed the argument @var{expr}.

@item explore type @var{arg}
@cindex explore type
This sub-command of @code{explore} explores the type of @var{arg} (if
@var{arg} is a type visible in the current context of program being
debugged), or the type of the value/expression @var{arg} (if @var{arg}
is an expression valid in the current context of the program being
debugged).  If @var{arg} is a type, then the behavior of this command is
identical to that of the @code{explore} command being passed the
argument @var{arg}.  If @var{arg} is an expression, then the behavior of
this command will be identical to that of the @code{explore} command
being passed the type of @var{arg} as the argument.
@end table

@menu
* Expressions::                 Expressions
* Ambiguous Expressions::       Ambiguous Expressions
* Variables::                   Program variables
* Arrays::                      Artificial arrays
* Output Formats::              Output formats
* Memory::                      Examining memory
* Auto Display::                Automatic display
* Print Settings::              Print settings
* Pretty Printing::             Python pretty printing
* Value History::               Value history
* Convenience Vars::            Convenience variables
* Convenience Funs::            Convenience functions
* Registers::                   Registers
* Floating Point Hardware::     Floating point hardware
* Vector Unit::                 Vector Unit
* OS Information::              Auxiliary data provided by operating system
* Memory Region Attributes::    Memory region attributes
* Dump/Restore Files::          Copy between memory and a file
* Core File Generation::        Cause a program dump its core
* Character Sets::              Debugging programs that use a different
                                character set than GDB does
* Caching Target Data::         Data caching for targets
* Searching Memory::            Searching memory for a sequence of bytes
@end menu

@node Expressions
@section Expressions

@cindex expressions
@code{print} and many other @value{GDBN} 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
@value{GDBN}.  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
@ref{Compilation}.

@cindex arrays in expressions
@value{GDBN} supports array constants in expressions input by
the user.  The syntax is @{@var{element}, @var{element}@dots{}@}.  For example,
you can use the command @code{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, @value{GDBN} copies the array to memory that
is @code{malloc}ed in the target program.

Because C is so widespread, most of the expressions shown in examples in
this manual are in C.  @xref{Languages, , Using @value{GDBN} with Different
Languages}, for information on how to use expressions in other
languages.

In this section, we discuss operators that you can use in @value{GDBN}
expressions regardless of your programming language.

@cindex casts, in expressions
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.
@c FIXME: casts supported---Mod2 true?

@value{GDBN} supports these operators, in addition to those common
to programming languages:

@table @code
@item @@
@samp{@@} is a binary operator for treating parts of memory as arrays.
@xref{Arrays, ,Artificial Arrays}, for more information.

@item ::
@samp{::} allows you to specify a variable in terms of the file or
function where it is defined.  @xref{Variables, ,Program Variables}.

@cindex @{@var{type}@}
@cindex type casting memory
@cindex memory, viewing as typed object
@cindex casts, to view memory
@item @{@var{type}@} @var{addr}
Refers to an object of type @var{type} stored at address @var{addr} in
memory.  The address @var{addr} may be any expression whose value is
an integer or pointer (but parentheses 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 @var{addr}.
@end table

@node Ambiguous Expressions
@section Ambiguous Expressions
@cindex ambiguous expressions

Expressions can sometimes contain some ambiguous elements.  For instance,
some programming languages (notably Ada, C@t{++} and Objective-C) permit
a single function name to be defined several times, for application in
different contexts.  This is called @dfn{overloading}.  Another example
involving Ada is generics.  A @dfn{generic package} is similar to C@t{++}
templates and is typically instantiated several times, resulting in
the same function name being defined in different contexts.

In some cases and depending on the language, it is possible to adjust
the expression to remove the ambiguity.  For instance in C@t{++}, you
can specify the signature of the function you want to break on, as in
@kbd{break @var{function}(@var{types})}.  In Ada, using the fully
qualified name of your function often makes the expression unambiguous
as well.

When an ambiguity that needs to be resolved is detected, the debugger
has the capability to display a menu of numbered choices for each
possibility, and then waits for the selection with the prompt @samp{>}.
The first option is always @samp{[0] cancel}, and typing @kbd{0 @key{RET}}
aborts the current command.  If the command in which the expression was
used allows more than one choice to be selected, the next option in the
menu is @samp{[1] all}, and typing @kbd{1 @key{RET}} selects all possible
choices.

For example, the following session excerpt shows an attempt to set a
breakpoint at the overloaded symbol @code{String::after}.
We choose three particular definitions of that function name:

@c FIXME! This is likely to change to show arg type lists, at least
@smallexample
@group
(@value{GDBP}) b String::after
[0] cancel
[1] all
[2] file:String.cc; line number:867
[3] file:String.cc; line number:860
[4] file:String.cc; line number:875
[5] file:String.cc; line number:853
[6] file:String.cc; line number:846
[7] file:String.cc; line number:735
> 2 4 6
Breakpoint 1 at 0xb26c: file String.cc, line 867.
Breakpoint 2 at 0xb344: file String.cc, line 875.
Breakpoint 3 at 0xafcc: file String.cc, line 846.
Multiple breakpoints were set.
Use the "delete" command to delete unwanted
 breakpoints.
(@value{GDBP})
@end group
@end smallexample

@table @code
@kindex set multiple-symbols
@item set multiple-symbols @var{mode}
@cindex multiple-symbols menu

This option allows you to adjust the debugger behavior when an expression
is ambiguous.

By default, @var{mode} is set to @code{all}.  If the command with which
the expression is used allows more than one choice, then @value{GDBN}
automatically selects all possible choices.  For instance, inserting
a breakpoint on a function using an ambiguous name results in a breakpoint
inserted on each possible match.  However, if a unique choice must be made,
then @value{GDBN} uses the menu to help you disambiguate the expression.
For instance, printing the address of an overloaded function will result
in the use of the menu.

When @var{mode} is set to @code{ask}, the debugger always uses the menu
when an ambiguity is detected.

Finally, when @var{mode} is set to @code{cancel}, the debugger reports
an error due to the ambiguity and the command is aborted.

@kindex show multiple-symbols
@item show multiple-symbols
Show the current value of the @code{multiple-symbols} setting.
@end table

@node Variables
@section Program Variables

The most common kind of expression to use is the name of a variable
in your program.

Variables in expressions are understood in the selected stack frame
(@pxref{Selection, ,Selecting a Frame}); they must be either:

@itemize @bullet
@item
global (or file-static)
@end itemize

@noindent or

@itemize @bullet
@item
visible according to the scope rules of the
programming language from the point of execution in that frame
@end itemize

@noindent This means that in the function

@smallexample
foo (a)
     int a;
@{
  bar (a);
  @{
    int b = test ();
    bar (b);
  @}
@}
@end smallexample

@noindent
you can examine and use the variable @code{a} whenever your program is
executing within the function @code{foo}, but you can only use or
examine the variable @code{b} while your program is executing inside
the block where @code{b} is declared.

@cindex variable name conflict
There is an exception: you can refer to a variable or function whose
scope is a single source file even if the current execution point is not
in this file.  But it is possible to have more than one such variable or
function with the same name (in different source files).  If that
happens, referring to that name has unpredictable effects.  If you wish,
you can specify a static variable in a particular function or file by
using the colon-colon (@code{::}) notation:

@cindex colon-colon, context for variables/functions
@ifnotinfo
@c info cannot cope with a :: index entry, but why deprive hard copy readers?
@cindex @code{::}, context for variables/functions
@end ifnotinfo
@smallexample
@var{file}::@var{variable}
@var{function}::@var{variable}
@end smallexample

@noindent
Here @var{file} or @var{function} is the name of the context for the
static @var{variable}.  In the case of file names, you can use quotes to
make sure @value{GDBN} parses the file name as a single word---for example,
to print a global value of @code{x} defined in @file{f2.c}:

@smallexample
(@value{GDBP}) p 'f2.c'::x
@end smallexample

The @code{::} notation is normally used for referring to
static variables, since you typically disambiguate uses of local variables
in functions by selecting the appropriate frame and using the
simple name of the variable.  However, you may also use this notation
to refer to local variables in frames enclosing the selected frame:

@smallexample
void
foo (int a)
@{
  if (a < 10)
    bar (a);
  else
    process (a);    /* Stop here */
@}

int
bar (int a)
@{
  foo (a + 5);
@}
@end smallexample

@noindent
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 @code{bar(0)}:

@smallexample
(@value{GDBP}) p a
$1 = 10
(@value{GDBP}) p bar::a
$2 = 5
(@value{GDBP}) up 2
#2  0x080483d0 in foo (a=5) at foobar.c:12
(@value{GDBP}) p a
$3 = 5
(@value{GDBP}) p bar::a
$4 = 0
@end smallexample

@cindex C@t{++} scope resolution
These uses of @samp{::} are very rarely in conflict with the very
similar use of the same notation in C@t{++}.  When they are in
conflict, the C@t{++} 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 @code{includefile}, and there is also an
include file named @file{includefile} that defines a variable,
@code{some_global}.

@smallexample
(@value{GDBP}) p includefile
$1 = 23
(@value{GDBP}) p includefile::some_global
A syntax error in expression, near `'.
(@value{GDBP}) p 'includefile'::some_global
$2 = 27
@end smallexample

@cindex wrong values
@cindex variable values, wrong
@cindex function entry/exit, wrong values of variables
@cindex optimized code, wrong values of variables
@quotation
@emph{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.
@end quotation
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.

@cindex ``No symbol "foo" in current context''
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 on the support for such cases
offered by the debug info format used by the compiler, @value{GDBN}
might not be able to display values for such local variables.  If that
happens, @value{GDBN} will print a message like this:

@smallexample
No symbol "foo" in current context.
@end smallexample

To solve such problems, either recompile without optimizations, or use a
different debug info format, if the compiler supports several such
formats.  @xref{Compilation}, for more information on choosing compiler
options.  @xref{C, ,C and C@t{++}}, for more information about debug
info formats that are best suited to C@t{++} programs.

If you ask to print an object whose contents are unknown to
@value{GDBN}, e.g., because its data type is not completely specified
by the debug information, @value{GDBN} will say @samp{<incomplete
type>}.  @xref{Symbols, incomplete type}, for more about this.

If you append @kbd{@@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 @ref{set print entry-values}.

@smallexample
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
@end smallexample

Strings are identified as arrays of @code{char} values without specified
signedness.  Arrays of either @code{signed char} or @code{unsigned char} get
printed as arrays of 1 byte sized integers.  @code{-fsigned-char} or
@code{-funsigned-char} @value{NGCC} options have no effect as @value{GDBN}
defines literal string type @code{"char"} as @code{char} without a sign.
For program code

@smallexample
char var0[] = "A";
signed char var1[] = "A";
@end smallexample

You get during debugging
@smallexample
(gdb) print var0
$1 = "A"
(gdb) print var1
$2 = @{65 'A', 0 '\0'@}
@end smallexample

@node Arrays
@section Artificial Arrays

@cindex artificial array
@cindex arrays
@kindex @@@r{, referencing memory as an array}
It is often useful to print out several successive objects of the
same type in memory; a section of an array, or an array of
dynamically determined size for which only a pointer exists in the
program.

You can do this by referring to a contiguous span of memory as an
@dfn{artificial array}, using the binary operator @samp{@@}.  The left
operand of @samp{@@} should be the first element of the desired array
and be an individual object.  The right operand should be the desired length
of the array.  The result is an array value whose elements are all of
the type of the left argument.  The first element is actually the left
argument; the second element comes from bytes of memory immediately
following those that hold the first element, and so on.  Here is an
example.  If a program says

@smallexample
int *array = (int *) malloc (len * sizeof (int));
@end smallexample

@noindent
you can print the contents of @code{array} with

@smallexample
p *array@@len
@end smallexample

The left operand of @samp{@@} must reside in memory.  Array values made
with @samp{@@} in this way behave just like other arrays in terms of
subscripting, and are coerced to pointers when used in expressions.
Artificial arrays most often appear in expressions via the value history
(@pxref{Value History, ,Value History}), after printing one out.

Another way to create an artificial array is to use a cast.
This re-interprets a value as if it were an array.
The value need not be in memory:
@smallexample
(@value{GDBP}) p/x (short[2])0x12345678
$1 = @{0x1234, 0x5678@}
@end smallexample

As a convenience, if you leave the array length out (as in
@samp{(@var{type}[])@var{value}}) @value{GDBN} calculates the size to fill
the value (as @samp{sizeof(@var{value})/sizeof(@var{type})}:
@smallexample
(@value{GDBP}) p/x (short[])0x12345678
$2 = @{0x1234, 0x5678@}
@end smallexample

Sometimes the artificial array mechanism is not quite enough; in
moderately complex data structures, the elements of interest may not
actually be adjacent---for example, if you are interested in the values
of pointers in an array.  One useful work-around in this situation is
to use a convenience variable (@pxref{Convenience Vars, ,Convenience
Variables}) as a counter in an expression that prints the first
interesting value, and then repeat that expression via @key{RET}.  For
instance, suppose you have an array @code{dtab} of pointers to
structures, and you are interested in the values of a field @code{fv}
in each structure.  Here is an example of what you might type:

@smallexample
set $i = 0
p dtab[$i++]->fv
@key{RET}
@key{RET}
@dots{}
@end smallexample

@node Output Formats
@section Output Formats

@cindex formatted output
@cindex output formats
By default, @value{GDBN} prints a value according to its data type.  Sometimes
this is not what you want.  For example, you might want to print a number
in hex, or a pointer in decimal.  Or you might want to view data in memory
at a certain address as a character string or as an instruction.  To do
these things, specify an @dfn{output format} when you print a value.

The simplest use of output formats is to say how to print a value
already computed.  This is done by starting the arguments of the
@code{print} command with a slash and a format letter.  The format
letters supported are:

@table @code
@item x
Regard the bits of the value as an integer, and print the integer in
hexadecimal.

@item d
Print as integer in signed decimal.

@item u
Print as integer in unsigned decimal.

@item o
Print as integer in octal.

@item t
Print as integer in binary.  The letter @samp{t} stands for ``two''.
@footnote{@samp{b} cannot be used because these format letters are also
used with the @code{x} command, where @samp{b} stands for ``byte'';
see @ref{Memory,,Examining Memory}.}

@item a
@cindex unknown address, locating
@cindex locate address
Print as an address, both absolute in hexadecimal and as an offset from
the nearest preceding symbol.  You can use this format used to discover
where (in what function) an unknown address is located:

@smallexample
(@value{GDBP}) p/a 0x54320
$3 = 0x54320 <_initialize_vx+396>
@end smallexample

@noindent
The command @code{info symbol 0x54320} yields similar results.
@xref{Symbols, info symbol}.

@item c
Regard as an integer and print it as a character constant.  This
prints both the numerical value and its character representation.  The
character representation is replaced with the octal escape @samp{\nnn}
for characters outside the 7-bit @sc{ascii} range.

Without this format, @value{GDBN} displays @code{char},
@w{@code{unsigned char}}, and @w{@code{signed char}} data as character
constants.  Single-byte members of vectors are displayed as integer
data.

@item f
Regard the bits of the value as a floating point number and print
using typical floating point syntax.

@item s
@cindex printing strings
@cindex printing byte arrays
Regard as a string, if possible.  With this format, pointers to single-byte
data are displayed as null-terminated strings and arrays of single-byte data
are displayed as fixed-length strings.  Other values are displayed in their
natural types.

Without this format, @value{GDBN} displays pointers to and arrays of
@code{char}, @w{@code{unsigned char}}, and @w{@code{signed char}} as
strings.  Single-byte members of a vector are displayed as an integer
array.

@item z
Like @samp{x} formatting, the value is treated as an integer and
printed as hexadecimal, but leading zeros are printed to pad the value
to the size of the integer type.

@item r
@cindex raw printing
Print using the @samp{raw} formatting.  By default, @value{GDBN} will
use a Python-based pretty-printer, if one is available (@pxref{Pretty
Printing}).  This typically results in a higher-level display of the
value's contents.  The @samp{r} format bypasses any Python
pretty-printer which might exist.
@end table

For example, to print the program counter in hex (@pxref{Registers}), type

@smallexample
p/x $pc
@end smallexample

@noindent
Note that no space is required before the slash; this is because command
names in @value{GDBN} cannot contain a slash.

To reprint the last value in the value history with a different format,
you can use the @code{print} command with just a format and no
expression.  For example, @samp{p/x} reprints the last value in hex.

@node Memory
@section Examining Memory

You can use the command @code{x} (for ``examine'') to examine memory in
any of several formats, independently of your program's data types.

@cindex examining memory
@table @code
@kindex x @r{(examine memory)}
@item x/@var{nfu} @var{addr}
@itemx x @var{addr}
@itemx x
Use the @code{x} command to examine memory.
@end table

@var{n}, @var{f}, and @var{u} are all optional parameters that specify how
much memory to display and how to format it; @var{addr} is an
expression giving the address where you want to start displaying memory.
If you use defaults for @var{nfu}, you need not type the slash @samp{/}.
Several commands set convenient defaults for @var{addr}.

@table @r
@item @var{n}, the repeat count
The repeat count is a decimal integer; the default is 1.  It specifies
how much memory (counting by units @var{u}) to display.
@c This really is **decimal**; unaffected by 'set radix' as of GDB
@c 4.1.2.

@item @var{f}, the display format
The display format is one of the formats used by @code{print}
(@samp{x}, @samp{d}, @samp{u}, @samp{o}, @samp{t}, @samp{a}, @samp{c},
@samp{f}, @samp{s}), and in addition @samp{i} (for machine instructions).
The default is @samp{x} (hexadecimal) initially.  The default changes
each time you use either @code{x} or @code{print}.

@item @var{u}, the unit size
The unit size is any of

@table @code
@item b
Bytes.
@item h
Halfwords (two bytes).
@item w
Words (four bytes).  This is the initial default.
@item g
Giant words (eight bytes).
@end table

Each time you specify a unit size with @code{x}, that size becomes the
default unit the next time you use @code{x}.  For the @samp{i} format,
the unit size is ignored and is normally not written.  For the @samp{s} format,
the unit size defaults to @samp{b}, unless it is explicitly given.
Use @kbd{x /hs} to display 16-bit char strings and @kbd{x /ws} to display
32-bit strings.  The next use of @kbd{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 @samp{s}
modifier will use the UTF-16 encoding while @samp{w} will use
UTF-32.  The encoding is set by the programming language and cannot
be altered.

@item @var{addr}, starting display address
@var{addr} is the address where you want @value{GDBN} to begin displaying
memory.  The expression need not have a pointer value (though it may);
it is always interpreted as an integer address of a byte of memory.
@xref{Expressions, ,Expressions}, for more information on expressions.  The default for
@var{addr} is usually just after the last address examined---but several
other commands also set the default address: @code{info breakpoints} (to
the address of the last breakpoint listed), @code{info line} (to the
starting address of a line), and @code{print} (if you use it to display
a value from memory).
@end table

For example, @samp{x/3uh 0x54320} is a request to display three halfwords
(@code{h}) of memory, formatted as unsigned decimal integers (@samp{u}),
starting at address @code{0x54320}.  @samp{x/4xw $sp} prints the four
words (@samp{w}) of memory above the stack pointer (here, @samp{$sp};
@pxref{Registers, ,Registers}) in hexadecimal (@samp{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 @samp{4xw} and @samp{4wx} mean exactly the same thing.
(However, the count @var{n} must come first; @samp{wx4} does not work.)

Even though the unit size @var{u} is ignored for the formats @samp{s}
and @samp{i}, you might still want to use a count @var{n}; for example,
@samp{3i} specifies that you want to see three machine instructions,
including any operands.  For convenience, especially when used with
the @code{display} command, the @samp{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
@code{disassemble} gives an alternative way of inspecting machine
instructions; see @ref{Machine Code,,Source and Machine Code}.

All the defaults for the arguments to @code{x} are designed to make it
easy to continue scanning memory with minimal specifications each time
you use @code{x}.  For example, after you have inspected three machine
instructions with @samp{x/3i @var{addr}}, you can inspect the next seven
with just @samp{x/7}.  If you use @key{RET} to repeat the @code{x} command,
the repeat count @var{n} is used again; the other arguments default as
for successive uses of @code{x}.

When examining machine instructions, the instruction at current program
counter is shown with a @code{=>} marker. For example:

@smallexample
(@value{GDBP}) 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>
@end smallexample

@cindex @code{$_}, @code{$__}, and value history
The addresses and contents printed by the @code{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, @value{GDBN} makes these values available for
subsequent use in expressions as values of the convenience variables
@code{$_} and @code{$__}.  After an @code{x} command, the last address
examined is available for use in expressions in the convenience variable
@code{$_}.  The contents of that address, as examined, are available in
the convenience variable @code{$__}.

If the @code{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.

@cindex remote memory comparison
@cindex target memory comparison
@cindex verify remote memory image
@cindex verify target memory image
When you are debugging a program running on a remote target machine
(@pxref{Remote Debugging}), 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
@code{compare-sections} command is provided for such situations.

@table @code
@kindex compare-sections
@item compare-sections @r{[}@var{section-name}@r{|}@code{-r}@r{]}
Compare the data of a loadable section @var{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
@code{-r}, compares all loadable read-only sections.

Note: for remote targets, this command can be accelerated if the
target supports computing the CRC checksum of a block of memory
(@pxref{qCRC packet}).
@end table

@node Auto Display
@section Automatic Display
@cindex automatic display
@cindex display of expressions

If you find that you want to print the value of an expression frequently
(to see how it changes), you might want to add it to the @dfn{automatic
display list} so that @value{GDBN} prints its value each time your program stops.
Each expression added to the list is given a number to identify it;
to remove an expression from the list, you specify that number.
The automatic display looks like this:

@smallexample
2: foo = 38
3: bar[5] = (struct hack *) 0x3804
@end smallexample

@noindent
This display shows item numbers, expressions and their current values.  As with
displays you request manually using @code{x} or @code{print}, you can
specify the output format you prefer; in fact, @code{display} decides
whether to use @code{print} or @code{x} depending your format
specification---it uses @code{x} if you specify either the @samp{i}
or @samp{s} format, or a unit size; otherwise it uses @code{print}.

@table @code
@kindex display
@item display @var{expr}
Add the expression @var{expr} to the list of expressions to display
each time your program stops.  @xref{Expressions, ,Expressions}.

@code{display} does not repeat if you press @key{RET} again after using it.

@item display/@var{fmt} @var{expr}
For @var{fmt} specifying only a display format and not a size or
count, add the expression @var{expr} to the auto-display list but
arrange to display it each time in the specified format @var{fmt}.
@xref{Output Formats,,Output Formats}.

@item display/@var{fmt} @var{addr}
For @var{fmt} @samp{i} or @samp{s}, or including a unit-size or a
number of units, add the expression @var{addr} as a memory address to
be examined each time your program stops.  Examining means in effect
doing @samp{x/@var{fmt} @var{addr}}.  @xref{Memory, ,Examining Memory}.
@end table

For example, @samp{display/i $pc} can be helpful, to see the machine
instruction about to be executed each time execution stops (@samp{$pc}
is a common name for the program counter; @pxref{Registers, ,Registers}).

@table @code
@kindex delete display
@kindex undisplay
@item undisplay @var{dnums}@dots{}
@itemx delete display @var{dnums}@dots{}
Remove items from the list of expressions to display.  Specify the
numbers of the displays that you want affected with the command
argument @var{dnums}.  It can be a single display number, one of the
numbers shown in the first field of the @samp{info display} display;
or it could be a range of display numbers, as in @code{2-4}.

@code{undisplay} does not repeat if you press @key{RET} after using it.
(Otherwise you would just get the error @samp{No display number @dots{}}.)

@kindex disable display
@item disable display @var{dnums}@dots{}
Disable the display of item numbers @var{dnums}.  A disabled display
item is not printed automatically, but is not forgotten.  It may be
enabled again later.  Specify the numbers of the displays that you
want affected with the command argument @var{dnums}.  It can be a
single display number, one of the numbers shown in the first field of
the @samp{info display} display; or it could be a range of display
numbers, as in @code{2-4}.

@kindex enable display
@item enable display @var{dnums}@dots{}
Enable display of item numbers @var{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 @var{dnums}.  It can be a single display number, one
of the numbers shown in the first field of the @samp{info display}
display; or it could be a range of display numbers, as in @code{2-4}.

@item display
Display the current values of the expressions on the list, just as is
done when your program stops.

@kindex info display
@item 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 disabled 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.
@end table

@cindex display disabled out of scope
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
@code{display last_char} while inside a function with an argument
@code{last_char}, @value{GDBN} displays this argument while your program
continues to stop inside that function.  When it stops elsewhere---where
there is no variable @code{last_char}---the display is disabled
automatically.  The next time your program stops where @code{last_char}
is meaningful, you can enable the display expression once again.

@node Print Settings
@section Print Settings

@cindex format options
@cindex print settings
@value{GDBN} provides the following ways to control how arrays, structures,
and symbols are printed.

@noindent
These settings are useful for debugging programs in any language:

@table @code
@kindex set print
@item set print address
@itemx set print address on
@cindex print/don't print memory addresses
@value{GDBN} prints memory addresses showing the location of stack
traces, structure values, pointer values, breakpoints, and so forth,
even when it also displays the contents of those addresses.  The default
is @code{on}.  For example, this is what a stack frame display looks like with
@code{set print address on}:

@smallexample
@group
(@value{GDBP}) f
#0  set_quotes (lq=0x34c78 "<<", rq=0x34c88 ">>")
    at input.c:530
530         if (lquote != def_lquote)
@end group
@end smallexample

@item set print address off
Do not print addresses when displaying their contents.  For example,
this is the same stack frame displayed with @code{set print address off}:

@smallexample
@group
(@value{GDBP}) set print addr off
(@value{GDBP}) f
#0  set_quotes (lq="<<", rq=">>") at input.c:530
530         if (lquote != def_lquote)
@end group
@end smallexample

You can use @samp{set print address off} to eliminate all machine
dependent displays from the @value{GDBN} interface.  For example, with
@code{print address off}, you should get the same text for backtraces on
all machines---whether or not they involve pointer arguments.

@kindex show print
@item show print address
Show whether or not addresses are to be printed.
@end table

When @value{GDBN} prints a symbolic address, it normally prints the
closest earlier symbol plus an offset.  If that symbol does not uniquely
identify the address (for example, it is a name whose scope is a single
source file), you may need to clarify.  One way to do this is with
@code{info line}, for example @samp{info line *0x4537}.  Alternately,
you can set @value{GDBN} to print the source file and line number when
it prints a symbolic address:

@table @code
@item set print symbol-filename on
@cindex source file and line of a symbol
@cindex symbol, source file and line
Tell @value{GDBN} to print the source file name and line number of a
symbol in the symbolic form of an address.

@item set print symbol-filename off
Do not print source file name and line number of a symbol.  This is the
default.

@item show print symbol-filename
Show whether or not @value{GDBN} will print the source file name and
line number of a symbol in the symbolic form of an address.
@end table

Another situation where it is helpful to show symbol filenames and line
numbers is when disassembling code; @value{GDBN} shows you the line
number and source file that corresponds to each instruction.

Also, you may wish to see the symbolic form only if the address being
printed is reasonably close to the closest earlier symbol:

@table @code
@item set print max-symbolic-offset @var{max-offset}
@itemx set print max-symbolic-offset unlimited
@cindex maximum value for offset of closest symbol
Tell @value{GDBN} to only display the symbolic form of an address if the
offset between the closest earlier symbol and the address is less than
@var{max-offset}.  The default is @code{unlimited}, which tells @value{GDBN}
to always print the symbolic form of an address if any symbol precedes
it.  Zero is equivalent to @code{unlimited}.

@item show print max-symbolic-offset
Ask how large the maximum offset is that @value{GDBN} prints in a
symbolic address.
@end table

@cindex wild pointer, interpreting
@cindex pointer, finding referent
If you have a pointer and you are not sure where it points, try
@samp{set print symbol-filename on}.  Then you can determine the name
and source file location of the variable where it points, using
@samp{p/a @var{pointer}}.  This interprets the address in symbolic form.
For example, here @value{GDBN} shows that a variable @code{ptt} points
at another variable @code{t}, defined in @file{hi2.c}:

@smallexample
(@value{GDBP}) set print symbol-filename on
(@value{GDBP}) p/a ptt
$4 = 0xe008 <t in hi2.c>
@end smallexample

@quotation
@emph{Warning:} For pointers that point to a local variable, @samp{p/a}
does not show the symbol name and filename of the referent, even with
the appropriate @code{set print} options turned on.
@end quotation

You can also enable @samp{/a}-like formatting all the time using
@samp{set print symbol on}:

@table @code
@item set print symbol on
Tell @value{GDBN} to print the symbol corresponding to an address, if
one exists.

@item set print symbol off
Tell @value{GDBN} not to print the symbol corresponding to an
address.  In this mode, @value{GDBN} will still print the symbol
corresponding to pointers to functions.  This is the default.

@item show print symbol
Show whether @value{GDBN} will display the symbol corresponding to an
address.
@end table

Other settings control how different kinds of objects are printed:

@table @code
@item set print array
@itemx set print array on
@cindex pretty print arrays
Pretty print arrays.  This format is more convenient to read,
but uses more space.  The default is off.

@item set print array off
Return to compressed format for arrays.

@item show print array
Show whether compressed or pretty format is selected for displaying
arrays.

@cindex print array indexes
@item set print array-indexes
@itemx set print array-indexes on
Print the index of each element when displaying arrays.  May be more
convenient to locate a given element in the array or quickly find the
index of a given element in that printed array.  The default is off.

@item set print array-indexes off
Stop printing element indexes when displaying arrays.

@item show print array-indexes
Show whether the index of each element is printed when displaying
arrays.

@item set print elements @var{number-of-elements}
@itemx set print elements unlimited
@cindex number of array elements to print
@cindex limit on number of printed array elements
Set a limit on how many elements of an array @value{GDBN} will print.
If @value{GDBN} is printing a large array, it stops printing after it has
printed the number of elements set by the @code{set print elements} command.
This limit also applies to the display of strings.
When @value{GDBN} starts, this limit is set to 200.
Setting @var{number-of-elements} to @code{unlimited} or zero means
that the number of elements to print is unlimited.

@item show print elements
Display the number of elements of a large array that @value{GDBN} will print.
If the number is 0, then the printing is unlimited.

@item set print frame-arguments @var{value}
@kindex set print frame-arguments
@cindex printing frame argument values
@cindex print all frame argument values
@cindex print frame argument values for scalars only
@cindex do not print frame argument values
This command allows to control how the values of arguments are printed
when the debugger prints a frame (@pxref{Frames}).  The possible
values are:

@table @code
@item all
The values of all arguments are printed.

@item scalars
Print the value of an argument only if it is a scalar.  The value of more
complex arguments such as arrays, structures, unions, etc, is replaced
by @code{@dots{}}.  This is the default.  Here is an example where
only scalar arguments are shown:

@smallexample
#1  0x08048361 in call_me (i=3, s=@dots{}, ss=0xbf8d508c, u=@dots{}, e=green)
  at frame-args.c:23
@end smallexample

@item none
None of the argument values are printed.  Instead, the value of each argument
is replaced by @code{@dots{}}.  In this case, the example above now becomes:

@smallexample
#1  0x08048361 in call_me (i=@dots{}, s=@dots{}, ss=@dots{}, u=@dots{}, e=@dots{})
  at frame-args.c:23
@end smallexample
@end table

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 @code{print frame-arguments}
to @code{scalars} (the default) or @code{none} avoids this computation,
thus speeding up the display of each Ada frame.

@item show print frame-arguments
Show how the value of arguments should be displayed when printing a frame.

@item set print raw frame-arguments on
Print frame arguments in raw, non pretty-printed, form.

@item set print raw frame-arguments off
Print frame arguments in pretty-printed form, if there is a pretty-printer
for the value (@pxref{Pretty Printing}),
otherwise print the value in raw form.
This is the default.

@item show print raw frame-arguments
Show whether to print frame arguments in raw form.

@anchor{set print entry-values}
@item set print entry-values @var{value}
@kindex set print entry-values
Set printing of frame argument values at function entry.  In some cases
@value{GDBN} 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 @code{default} (see below for its description).  Older
@value{GDBN} behaved as with the setting @code{no}.  Compilers not supporting
this feature will behave in the @code{default} setting the same way as with the
@code{no} setting.

This functionality is currently supported only by DWARF 2 debugging format and
the compiler has to produce @samp{DW_TAG_GNU_call_site} tags.  With
@value{NGCC}, you need to specify @option{-O -g} during compilation, to get
this information.

The @var{value} parameter can be one of the following:

@table @code
@item no
Print only actual parameter values, never print values from function entry
point.
@smallexample
#0  equal (val=5)
#0  different (val=6)
#0  lost (val=<optimized out>)
#0  born (val=10)
#0  invalid (val=<optimized out>)
@end smallexample

@item only
Print only parameter values from function entry point.  The actual parameter
values are never printed.
@smallexample
#0  equal (val@@entry=5)
#0  different (val@@entry=5)
#0  lost (val@@entry=5)
#0  born (val@@entry=<optimized out>)
#0  invalid (val@@entry=<optimized out>)
@end smallexample

@item preferred
Print only parameter values from function entry point.  If value from function
entry point is not known while the actual value is known, print the actual
value for such parameter.
@smallexample
#0  equal (val@@entry=5)
#0  different (val@@entry=5)
#0  lost (val@@entry=5)
#0  born (val=10)
#0  invalid (val@@entry=<optimized out>)
@end smallexample

@item if-needed
Print actual parameter values.  If actual parameter value is not known while
value from function entry point is known, print the entry point value for such
parameter.
@smallexample
#0  equal (val=5)
#0  different (val=6)
#0  lost (val@@entry=5)
#0  born (val=10)
#0  invalid (val=<optimized out>)
@end smallexample

@item both
Always print both the actual parameter value and its value from function entry
point, even if values of one or both are not available due to compiler
optimizations.
@smallexample
#0  equal (val=5, val@@entry=5)
#0  different (val=6, val@@entry=5)
#0  lost (val=<optimized out>, val@@entry=5)
#0  born (val=10, val@@entry=<optimized out>)
#0  invalid (val=<optimized out>, val@@entry=<optimized out>)
@end smallexample

@item compact
Print the actual parameter value if it is known and also its value from
function entry point if it is known.  If neither is known, print for the actual
value @code{<optimized out>}.  If not in MI mode (@pxref{GDB/MI}) and if both
values are known and identical, print the shortened
@code{param=param@@entry=VALUE} notation.
@smallexample
#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>)
@end smallexample

@item 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 (@pxref{GDB/MI}) and
if both values are known and identical, print the shortened
@code{param=param@@entry=VALUE} notation.
@smallexample
#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>)
@end smallexample
@end table

For analysis messages on possible failures of frame argument values at function
entry resolution see @ref{set debug entry-values}.

@item show print entry-values
Show the method being used for printing of frame argument values at function
entry.

@item set print repeats @var{number-of-repeats}
@itemx set print repeats unlimited
@cindex repeated array elements
Set the threshold for suppressing display of repeated array
elements.  When the number of consecutive identical elements of an
array exceeds the threshold, @value{GDBN} prints the string
@code{"<repeats @var{n} times>"}, where @var{n} is the number of
identical repetitions, instead of displaying the identical elements
themselves.  Setting the threshold to @code{unlimited} or zero will
cause all elements to be individually printed.  The default threshold
is 10.

@item show print repeats
Display the current threshold for printing repeated identical
elements.

@item set print null-stop
@cindex @sc{null} elements in arrays
Cause @value{GDBN} to stop printing the characters of an array when the first
@sc{null} is encountered.  This is useful when large arrays actually
contain only short strings.
The default is off.

@item show print null-stop
Show whether @value{GDBN} stops printing an array on the first
@sc{null} character.

@item set print pretty on
@cindex print structures in indented form
@cindex indentation in structure display
Cause @value{GDBN} to print structures in an indented format with one member
per line, like this:

@smallexample
@group
$1 = @{
  next = 0x0,
  flags = @{
    sweet = 1,
    sour = 1
  @},
  meat = 0x54 "Pork"
@}
@end group
@end smallexample

@item set print pretty off
Cause @value{GDBN} to print structures in a compact format, like this:

@smallexample
@group
$1 = @{next = 0x0, flags = @{sweet = 1, sour = 1@}, \
meat = 0x54 "Pork"@}
@end group
@end smallexample

@noindent
This is the default format.

@item show print pretty
Show which format @value{GDBN} is using to print structures.

@item set print sevenbit-strings on
@cindex eight-bit characters in strings
@cindex octal escapes in strings
Print using only seven-bit characters; if this option is set,
@value{GDBN} displays any eight-bit characters (in strings or
character values) using the notation @code{\}@var{nnn}.  This setting is
best if you are working in English (@sc{ascii}) and you use the
high-order bit of characters as a marker or ``meta'' bit.

@item set print sevenbit-strings off
Print full eight-bit characters.  This allows the use of more
international character sets, and is the default.

@item show print sevenbit-strings
Show whether or not @value{GDBN} is printing only seven-bit characters.

@item set print union on
@cindex unions in structures, printing
Tell @value{GDBN} to print unions which are contained in structures
and other unions.  This is the default setting.

@item set print union off
Tell @value{GDBN} not to print unions which are contained in
structures and other unions.  @value{GDBN} will print @code{"@{...@}"}
instead.

@item show print union
Ask @value{GDBN} whether or not it will print unions which are contained in
structures and other unions.

For example, given the declarations

@smallexample
typedef enum @{Tree, Bug@} Species;
typedef enum @{Big_tree, Acorn, Seedling@} Tree_forms;
typedef enum @{Caterpillar, Cocoon, Butterfly@}
              Bug_forms;

struct thing @{
  Species it;
  union @{
    Tree_forms tree;
    Bug_forms bug;
  @} form;
@};

struct thing foo = @{Tree, @{Acorn@}@};
@end smallexample

@noindent
with @code{set print union on} in effect @samp{p foo} would print

@smallexample
$1 = @{it = Tree, form = @{tree = Acorn, bug = Cocoon@}@}
@end smallexample

@noindent
and with @code{set print union off} in effect it would print

@smallexample
$1 = @{it = Tree, form = @{...@}@}
@end smallexample

@noindent
@code{set print union} affects programs written in C-like languages
and in Pascal.
@end table

@need 1000
@noindent
These settings are of interest when debugging C@t{++} programs:

@table @code
@cindex demangling C@t{++} names
@item set print demangle
@itemx set print demangle on
Print C@t{++} names in their source form rather than in the encoded
(``mangled'') form passed to the assembler and linker for type-safe
linkage.  The default is on.

@item show print demangle
Show whether C@t{++} names are printed in mangled or demangled form.

@item set print asm-demangle
@itemx set print asm-demangle on
Print C@t{++} names in their source form rather than their mangled form, even
in assembler code printouts such as instruction disassemblies.
The default is off.

@item show print asm-demangle
Show whether C@t{++} names in assembly listings are printed in mangled
or demangled form.

@cindex C@t{++} symbol decoding style
@cindex symbol decoding style, C@t{++}
@kindex set demangle-style
@item set demangle-style @var{style}
Choose among several encoding schemes used by different compilers to
represent C@t{++} names.  The choices for @var{style} are currently:

@table @code
@item auto
Allow @value{GDBN} to choose a decoding style by inspecting your program.
This is the default.

@item gnu
Decode based on the @sc{gnu} C@t{++} compiler (@code{g++}) encoding algorithm.

@item hp
Decode based on the HP ANSI C@t{++} (@code{aCC}) encoding algorithm.

@item lucid
Decode based on the Lucid C@t{++} compiler (@code{lcc}) encoding algorithm.

@item arm
Decode using the algorithm in the @cite{C@t{++} Annotated Reference Manual}.
@strong{Warning:} this setting alone is not sufficient to allow
debugging @code{cfront}-generated executables.  @value{GDBN} would
require further enhancement to permit that.

@end table
If you omit @var{style}, you will see a list of possible formats.

@item show demangle-style
Display the encoding style currently in use for decoding C@t{++} symbols.

@item set print object
@itemx set print object on
@cindex derived type of an object, printing
@cindex display derived types
When displaying a pointer to an object, identify the @emph{actual}
(derived) type of the object rather than the @emph{declared} type, using
the virtual function table.  Note that the virtual function table is
required---this feature can only work for objects that have run-time
type identification; a single virtual method in the object's declared
type is sufficient.  Note that this setting is also taken into account when
working with variable objects via MI (@pxref{GDB/MI}).

@item set print object off
Display only the declared type of objects, without reference to the
virtual function table.  This is the default setting.

@item show print object
Show whether actual, or declared, object types are displayed.

@item set print static-members
@itemx set print static-members on
@cindex static members of C@t{++} objects
Print static members when displaying a C@t{++} object.  The default is on.

@item set print static-members off
Do not print static members when displaying a C@t{++} object.

@item show print static-members
Show whether C@t{++} static members are printed or not.

@item set print pascal_static-members
@itemx set print pascal_static-members on
@cindex static members of Pascal objects
@cindex Pascal objects, static members display
Print static members when displaying a Pascal object.  The default is on.

@item set print pascal_static-members off
Do not print static members when displaying a Pascal object.

@item show print pascal_static-members
Show whether Pascal static members are printed or not.

@c These don't work with HP ANSI C++ yet.
@item set print vtbl
@itemx set print vtbl on
@cindex pretty print C@t{++} virtual function tables
@cindex virtual functions (C@t{++}) display
@cindex VTBL display
Pretty print C@t{++} virtual function tables.  The default is off.
(The @code{vtbl} commands do not work on programs compiled with the HP
ANSI C@t{++} compiler (@code{aCC}).)

@item set print vtbl off
Do not pretty print C@t{++} virtual function tables.

@item show print vtbl
Show whether C@t{++} virtual function tables are pretty printed, or not.
@end table

@node Pretty Printing
@section Pretty Printing

@value{GDBN} provides a mechanism to allow pretty-printing of values using
Python code.  It greatly simplifies the display of complex objects.  This
mechanism works for both MI and the CLI.

@menu
* Pretty-Printer Introduction::  Introduction to pretty-printers
* Pretty-Printer Example::       An example pretty-printer
* Pretty-Printer Commands::      Pretty-printer commands
@end menu

@node Pretty-Printer Introduction
@subsection Pretty-Printer Introduction

When @value{GDBN} prints a value, it first sees if there is a pretty-printer
registered for the value.  If there is then @value{GDBN} invokes the
pretty-printer to print the value.  Otherwise the value is printed normally.

Pretty-printers are normally named.  This makes them easy to manage.
The @samp{info pretty-printer} command will list all the installed
pretty-printers with their names.
If a pretty-printer can handle multiple data types, then its
@dfn{subprinters} are the printers for the individual data types.
Each such subprinter has its own name.
The format of the name is @var{printer-name};@var{subprinter-name}.

Pretty-printers are installed by @dfn{registering} them with @value{GDBN}.
Typically they are automatically loaded and registered when the corresponding
debug information is loaded, thus making them available without having to
do anything special.

There are three places where a pretty-printer can be registered.

@itemize @bullet
@item
Pretty-printers registered globally are available when debugging
all inferiors.

@item
Pretty-printers registered with a program space are available only
when debugging that program.
@xref{Progspaces In Python}, for more details on program spaces in Python.

@item
Pretty-printers registered with an objfile are loaded and unloaded
with the corresponding objfile (e.g., shared library).
@xref{Objfiles In Python}, for more details on objfiles in Python.
@end itemize

@xref{Selecting Pretty-Printers}, for further information on how 
pretty-printers are selected,

@xref{Writing a Pretty-Printer}, for implementing pretty printers
for new types.

@node Pretty-Printer Example
@subsection Pretty-Printer Example

Here is how a C@t{++} @code{std::string} looks without a pretty-printer:

@smallexample
(@value{GDBP}) print s
$1 = @{
  static npos = 4294967295, 
  _M_dataplus = @{
    <std::allocator<char>> = @{
      <__gnu_cxx::new_allocator<char>> = @{
        <No data fields>@}, <No data fields>
      @},
    members of std::basic_string<char, std::char_traits<char>,
      std::allocator<char> >::_Alloc_hider:
    _M_p = 0x804a014 "abcd"
  @}
@}
@end smallexample

With a pretty-printer for @code{std::string} only the contents are printed:

@smallexample
(@value{GDBP}) print s
$2 = "abcd"
@end smallexample

@node Pretty-Printer Commands
@subsection Pretty-Printer Commands
@cindex pretty-printer commands

@table @code
@kindex info pretty-printer
@item info pretty-printer [@var{object-regexp} [@var{name-regexp}]]
Print the list of installed pretty-printers.
This includes disabled pretty-printers, which are marked as such.

@var{object-regexp} is a regular expression matching the objects
whose pretty-printers to list.
Objects can be @code{global}, the program space's file
(@pxref{Progspaces In Python}),
and the object files within that program space (@pxref{Objfiles In Python}).
@xref{Selecting Pretty-Printers}, for details on how @value{GDBN}
looks up a printer from these three objects.

@var{name-regexp} is a regular expression matching the name of the printers
to list.

@kindex disable pretty-printer
@item disable pretty-printer [@var{object-regexp} [@var{name-regexp}]]
Disable pretty-printers matching @var{object-regexp} and @var{name-regexp}.
A disabled pretty-printer is not forgotten, it may be enabled again later.

@kindex enable pretty-printer
@item enable pretty-printer [@var{object-regexp} [@var{name-regexp}]]
Enable pretty-printers matching @var{object-regexp} and @var{name-regexp}.
@end table

Example:

Suppose we have three pretty-printers installed: one from library1.so
named @code{foo} that prints objects of type @code{foo}, and
another from library2.so named @code{bar} that prints two types of objects,
@code{bar1} and @code{bar2}.

@smallexample
(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
@end smallexample

Note that for @code{bar} the entire printer can be disabled,
as can each individual subprinter.

@node Value History
@section Value History

@cindex value history
@cindex history of values printed by @value{GDBN}
Values printed by the @code{print} command are saved in the @value{GDBN}
@dfn{value history}.  This allows you to refer to them in other expressions.
Values are kept until the symbol table is re-read or discarded
(for example with the @code{file} or @code{symbol-file} commands).
When the symbol table changes, the value history is discarded,
since the values may contain pointers back to the types defined in the
symbol table.

@cindex @code{$}
@cindex @code{$$}
@cindex history number
The values printed are given @dfn{history numbers} by which you can
refer to them.  These are successive integers starting with one.
@code{print} shows you the history number assigned to a value by
printing @samp{$@var{num} = } before the value; here @var{num} is the
history number.

To refer to any previous value, use @samp{$} followed by the value's
history number.  The way @code{print} labels its output is designed to
remind you of this.  Just @code{$} refers to the most recent value in
the history, and @code{$$} refers to the value before that.
@code{$$@var{n}} refers to the @var{n}th value from the end; @code{$$2}
is the value just prior to @code{$$}, @code{$$1} is equivalent to
@code{$$}, and @code{$$0} is equivalent to @code{$}.

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

@smallexample
p *$
@end smallexample

If you have a chain of structures where the component @code{next} points
to the next one, you can print the contents of the next one with this:

@smallexample
p *$.next
@end smallexample

@noindent
You can print successive links in the chain by repeating this
command---which you can do by just typing @key{RET}.

Note that the history records values, not expressions.  If the value of
@code{x} is 4 and you type these commands:

@smallexample
print x
set x=5
@end smallexample

@noindent
then the value recorded in the value history by the @code{print} command
remains 4 even though the value of @code{x} has changed.

@table @code
@kindex show values
@item show values
Print the last ten values in the value history, with their item numbers.
This is like @samp{p@ $$9} repeated ten times, except that @code{show
values} does not change the history.

@item show values @var{n}
Print ten history values centered on history item number @var{n}.

@item show values +
Print ten history values just after the values last printed.  If no more
values are available, @code{show values +} produces no display.
@end table

Pressing @key{RET} to repeat @code{show values @var{n}} has exactly the
same effect as @samp{show values +}.

@node Convenience Vars
@section Convenience Variables

@cindex convenience variables
@cindex user-defined variables
@value{GDBN} provides @dfn{convenience variables} that you can use within
@value{GDBN} to hold on to a value and refer to it later.  These variables
exist entirely within @value{GDBN}; they are not part of your program, and
setting a convenience variable has no direct effect on further execution
of your program.  That is why you can use them freely.

Convenience variables are prefixed with @samp{$}.  Any name preceded by
@samp{$} can be used for a convenience variable, unless it is one of
the predefined machine-specific register names (@pxref{Registers, ,Registers}).
(Value history references, in contrast, are @emph{numbers} preceded
by @samp{$}.  @xref{Value History, ,Value History}.)

You can save a value in a convenience variable with an assignment
expression, just as you would set a variable in your program.
For example:

@smallexample
set $foo = *object_ptr
@end smallexample

@noindent
would save in @code{$foo} the value contained in the object pointed to by
@code{object_ptr}.

Using a convenience variable for the first time creates it, but its
value is @code{void} until you assign a new value.  You can alter the
value with another assignment at any time.

Convenience variables have no fixed types.  You can assign a convenience
variable any type of value, including structures and arrays, even if
that variable already has a value of a different type.  The convenience
variable, when used as an expression, has the type of its current value.

@table @code
@kindex show convenience
@cindex show all user variables and functions
@item show convenience
Print a list of convenience variables used so far, and their values,
as well as a list of the convenience functions.
Abbreviated @code{show conv}.

@kindex init-if-undefined
@cindex convenience variables, initializing
@item init-if-undefined $@var{variable} = @var{expression}
Set a convenience variable if it has not already been set.  This is useful
for user-defined commands that keep some state.  It is similar, in concept,
to using local static variables with initializers in C (except that
convenience variables are global).  It can also be used to allow users to
override default values used in a command script.

If the variable is already defined then the expression is not evaluated so
any side-effects do not occur.
@end table

One of the ways to use a convenience variable is as a counter to be
incremented or a pointer to be advanced.  For example, to print
a field from successive elements of an array of structures:

@smallexample
set $i = 0
print bar[$i++]->contents
@end smallexample

@noindent
Repeat that command by typing @key{RET}.

Some convenience variables are created automatically by @value{GDBN} and given
values likely to be useful.

@table @code
@vindex $_@r{, convenience variable}
@item $_
The variable @code{$_} is automatically set by the @code{x} command to
the last address examined (@pxref{Memory, ,Examining Memory}).  Other
commands which provide a default address for @code{x} to examine also
set @code{$_} to that address; these commands include @code{info line}
and @code{info breakpoint}.  The type of @code{$_} is @code{void *}
except when set by the @code{x} command, in which case it is a pointer
to the type of @code{$__}.

@vindex $__@r{, convenience variable}
@item $__
The variable @code{$__} is automatically set by the @code{x} command
to the value found in the last address examined.  Its type is chosen
to match the format in which the data was printed.

@item $_exitcode
@vindex $_exitcode@r{, convenience variable}
When the program being debugged terminates normally, @value{GDBN}
automatically sets this variable to the exit code of the program, and
resets @code{$_exitsignal} to @code{void}.

@item $_exitsignal
@vindex $_exitsignal@r{, convenience variable}
When the program being debugged dies due to an uncaught signal,
@value{GDBN} automatically sets this variable to that signal's number,
and resets @code{$_exitcode} to @code{void}.

To distinguish between whether the program being debugged has exited
(i.e., @code{$_exitcode} is not @code{void}) or signalled (i.e.,
@code{$_exitsignal} is not @code{void}), the convenience function
@code{$_isvoid} can be used (@pxref{Convenience Funs,, Convenience
Functions}).  For example, considering the following source code:

@smallexample
#include <signal.h>

int
main (int argc, char *argv[])
@{
  raise (SIGALRM);
  return 0;
@}
@end smallexample

A valid way of telling whether the program being debugged has exited
or signalled would be:

@smallexample
(@value{GDBP}) 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
(@value{GDBP}) run
Starting program:

Program terminated with signal SIGALRM, Alarm clock.
The program no longer exists.
(@value{GDBP}) has_exited_or_signalled
The program has signalled
@end smallexample

As can be seen, @value{GDBN} correctly informs that the program being
debugged has signalled, since it calls @code{raise} and raises a
@code{SIGALRM} signal.  If the program being debugged had not called
@code{raise}, then @value{GDBN} would report a normal exit:

@smallexample
(@value{GDBP}) has_exited_or_signalled
The program has exited
@end smallexample

@item $_exception
The variable @code{$_exception} is set to the exception object being
thrown at an exception-related catchpoint.  @xref{Set Catchpoints}.

@item $_probe_argc
@itemx $_probe_arg0@dots{}$_probe_arg11
Arguments to a static probe.  @xref{Static Probe Points}.

@item $_sdata
@vindex $_sdata@r{, inspect, convenience variable}
The variable @code{$_sdata} contains extra collected static tracepoint
data.  @xref{Tracepoint Actions,,Tracepoint Action Lists}.  Note that
@code{$_sdata} could be empty, if not inspecting a trace buffer, or
if extra static tracepoint data has not been collected.

@item $_siginfo
@vindex $_siginfo@r{, convenience variable}
The variable @code{$_siginfo} contains extra signal information
(@pxref{extra signal information}).  Note that @code{$_siginfo}
could be empty, if the application has not yet received any signals.
For example, it will be empty before you execute the @code{run} command.

@item $_tlb
@vindex $_tlb@r{, convenience variable}
The variable @code{$_tlb} is automatically set when debugging
applications running on MS-Windows in native mode or connected to
gdbserver that supports the @code{qGetTIBAddr} request. 
@xref{General Query Packets}.
This variable contains the address of the thread information block.

@end table

On HP-UX systems, if you refer to a function or variable name that
begins with a dollar sign, @value{GDBN} searches for a user or system
name first, before it searches for a convenience variable.

@node Convenience Funs
@section Convenience Functions

@cindex convenience functions
@value{GDBN} also supplies some @dfn{convenience functions}.  These
have a syntax similar to convenience variables.  A convenience
function can be used in an expression just like an ordinary function;
however, a convenience function is implemented internally to
@value{GDBN}.

These functions do not require @value{GDBN} to be configured with
@code{Python} support, which means that they are always available.

@table @code

@item $_isvoid (@var{expr})
@findex $_isvoid@r{, convenience function}
Return one if the expression @var{expr} is @code{void}.  Otherwise it
returns zero.

A @code{void} expression is an expression where the type of the result
is @code{void}.  For example, you can examine a convenience variable
(see @ref{Convenience Vars,, Convenience Variables}) to check whether
it is @code{void}:

@smallexample
(@value{GDBP}) print $_exitcode
$1 = void
(@value{GDBP}) print $_isvoid ($_exitcode)
$2 = 1
(@value{GDBP}) run
Starting program: ./a.out
[Inferior 1 (process 29572) exited normally]
(@value{GDBP}) print $_exitcode
$3 = 0
(@value{GDBP}) print $_isvoid ($_exitcode)
$4 = 0
@end smallexample

In the example above, we used @code{$_isvoid} to check whether
@code{$_exitcode} is @code{void} before and after the execution of the
program being debugged.  Before the execution there is no exit code to
be examined, therefore @code{$_exitcode} is @code{void}.  After the
execution the program being debugged returned zero, therefore
@code{$_exitcode} is zero, which means that it is not @code{void}
anymore.

The @code{void} expression can also be a call of a function from the
program being debugged.  For example, given the following function:

@smallexample
void
foo (void)
@{
@}
@end smallexample

The result of calling it inside @value{GDBN} is @code{void}:

@smallexample
(@value{GDBP}) print foo ()
$1 = void
(@value{GDBP}) print $_isvoid (foo ())
$2 = 1
(@value{GDBP}) set $v = foo ()
(@value{GDBP}) print $v
$3 = void
(@value{GDBP}) print $_isvoid ($v)
$4 = 1
@end smallexample

@end table

These functions require @value{GDBN} to be configured with
@code{Python} support.

@table @code

@item $_memeq(@var{buf1}, @var{buf2}, @var{length})
@findex $_memeq@r{, convenience function}
Returns one if the @var{length} bytes at the addresses given by
@var{buf1} and @var{buf2} are equal.
Otherwise it returns zero.

@item $_regex(@var{str}, @var{regex})
@findex $_regex@r{, convenience function}
Returns one if the string @var{str} matches the regular expression
@var{regex}.  Otherwise it returns zero.
The syntax of the regular expression is that specified by @code{Python}'s
regular expression support.

@item $_streq(@var{str1}, @var{str2})
@findex $_streq@r{, convenience function}
Returns one if the strings @var{str1} and @var{str2} are equal.
Otherwise it returns zero.

@item $_strlen(@var{str})
@findex $_strlen@r{, convenience function}
Returns the length of string @var{str}.

@item $_caller_is(@var{name}@r{[}, @var{number_of_frames}@r{]})
@findex $_caller_is@r{, convenience function}
Returns one if the calling function's name is equal to @var{name}.
Otherwise it returns zero.

If the optional argument @var{number_of_frames} is provided,
it is the number of frames up in the stack to look.
The default is 1.

Example:

@smallexample
(gdb) backtrace
#0  bottom_func ()
    at testsuite/gdb.python/py-caller-is.c:21
#1  0x00000000004005a0 in middle_func ()
    at testsuite/gdb.python/py-caller-is.c:27
#2  0x00000000004005ab in top_func ()
    at testsuite/gdb.python/py-caller-is.c:33
#3  0x00000000004005b6 in main ()
    at testsuite/gdb.python/py-caller-is.c:39
(gdb) print $_caller_is ("middle_func")
$1 = 1
(gdb) print $_caller_is ("top_func", 2)
$1 = 1
@end smallexample

@item $_caller_matches(@var{regexp}@r{[}, @var{number_of_frames}@r{]})
@findex $_caller_matches@r{, convenience function}
Returns one if the calling function's name matches the regular expression
@var{regexp}.  Otherwise it returns zero.

If the optional argument @var{number_of_frames} is provided,
it is the number of frames up in the stack to look.
The default is 1.

@item $_any_caller_is(@var{name}@r{[}, @var{number_of_frames}@r{]})
@findex $_any_caller_is@r{, convenience function}
Returns one if any calling function's name is equal to @var{name}.
Otherwise it returns zero.

If the optional argument @var{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 @code{$_caller_is} in that this function
checks all stack frames from the immediate caller to the frame specified
by @var{number_of_frames}, whereas @code{$_caller_is} only checks the
frame specified by @var{number_of_frames}.

@item $_any_caller_matches(@var{regexp}@r{[}, @var{number_of_frames}@r{]})
@findex $_any_caller_matches@r{, convenience function}
Returns one if any calling function's name matches the regular expression
@var{regexp}.  Otherwise it returns zero.

If the optional argument @var{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 @code{$_caller_matches} in that this function
checks all stack frames from the immediate caller to the frame specified
by @var{number_of_frames}, whereas @code{$_caller_matches} only checks the
frame specified by @var{number_of_frames}.

@end table

@value{GDBN} provides the ability to list and get help on
convenience functions.

@table @code
@item help function
@kindex help function
@cindex show all convenience functions
Print a list of all convenience functions.
@end table

@node Registers
@section Registers

@cindex registers
You can refer to machine register contents, in expressions, as variables
with names starting with @samp{$}.  The names of registers are different
for each machine; use @code{info registers} to see the names used on
your machine.

@table @code
@kindex info registers
@item info registers
Print the names and values of all registers except floating-point
and vector registers (in the selected stack frame).

@kindex info all-registers
@cindex floating point registers
@item info all-registers
Print the names and values of all registers, including floating-point
and vector registers (in the selected stack frame).

@item info registers @var{regname} @dots{}
Print the @dfn{relativized} value of each specified register @var{regname}.
As discussed in detail below, register values are normally relative to
the selected stack frame.  The @var{regname} may be any register name valid on
the machine you are using, with or without the initial @samp{$}.
@end table

@anchor{standard registers}
@cindex stack pointer register
@cindex program counter register
@cindex process status register
@cindex frame pointer register
@cindex standard registers
@value{GDBN} 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
@code{$pc} and @code{$sp} are used for the program counter register and
the stack pointer.  @code{$fp} is used for a register that contains a
pointer to the current stack frame, and @code{$ps} is used for a
register that contains the processor status.  For example,
you could print the program counter in hex with

@smallexample
p/x $pc
@end smallexample

@noindent
or print the instruction to be executed next with

@smallexample
x/i $pc
@end smallexample

@noindent
or add four to the stack pointer@footnote{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 @code{$sp} is not allowed when other
stack frames are selected.  To pop entire frames off the stack,
regardless of machine architecture, use @code{return};
see @ref{Returning, ,Returning from a Function}.} with

@smallexample
set $sp += 4
@end smallexample

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 @code{info registers} command
shows the canonical names.  For example, on the SPARC, @code{info
registers} displays the processor status register as @code{$psr} but you
can also refer to it as @code{$ps}; and on x86-based machines @code{$ps}
is an alias for the @sc{eflags} register.

@value{GDBN} 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 @emph{print} it as a floating point value with
@samp{print/f $@var{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, @value{GDBN} normally works with the virtual format only (the format
that makes sense for your program), but the @code{info registers} command
prints the data in both formats.

@cindex SSE registers (x86)
@cindex MMX registers (x86)
Some machines have special registers whose contents can be interpreted
in several different ways.  For example, modern x86-based machines
have SSE and MMX registers that can hold several values packed
together in several different formats.  @value{GDBN} refers to such
registers in @code{struct} notation:

@smallexample
(@value{GDBP}) 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
@}
@end smallexample

@noindent
To set values of such registers, you need to tell @value{GDBN} which
view of the register you wish to change, as if you were assigning
value to a @code{struct} member:

@smallexample
 (@value{GDBP}) set $xmm1.uint128 = 0x000000000000000000000000FFFFFFFF
@end smallexample

Normally, register values are relative to the selected stack frame
(@pxref{Selection, ,Selecting a Frame}).  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 @samp{frame 0}).

@cindex caller-saved registers
@cindex call-clobbered registers
@cindex volatile registers
@cindex <not saved> values
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 @value{GDBN} 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.
@value{GDBN} tries to deduce where 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 @value{GDBN} 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), @value{GDBN}
displays @w{@samp{<not saved>}} as the register's value.  With targets
that @value{GDBN} 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.

@node Floating Point Hardware
@section Floating Point Hardware
@cindex floating point

Depending on the configuration, @value{GDBN} may be able to give
you more information about the status of the floating point hardware.

@table @code
@kindex info float
@item info float
Display hardware-dependent information about the floating
point unit.  The exact contents and layout vary depending on the
floating point chip.  Currently, @samp{info float} is supported on
the ARM and x86 machines.
@end table

@node Vector Unit
@section Vector Unit
@cindex vector unit

Depending on the configuration, @value{GDBN} may be able to give you
more information about the status of the vector unit.

@table @code
@kindex info vector
@item info vector
Display information about the vector unit.  The exact contents and
layout vary depending on the hardware.
@end table

@node OS Information
@section Operating System Auxiliary Information
@cindex OS information

@value{GDBN} provides interfaces to useful OS facilities that can help
you debug your program.

@cindex auxiliary vector
@cindex vector, auxiliary
Some operating systems supply an @dfn{auxiliary vector} to programs at
startup.  This is akin to the arguments and environment that you
specify for a program, but contains a system-dependent variety of
binary values that tell system libraries important details about the
hardware, operating system, and process.  Each value's purpose is
identified by an integer tag; the meanings are well-known but system-specific.
Depending on the configuration and operating system facilities,
@value{GDBN} may be able to show you this information.  For remote
targets, this functionality may further depend on the remote stub's
support of the @samp{qXfer:auxv:read} packet, see
@ref{qXfer auxiliary vector read}.

@table @code
@kindex info auxv
@item info auxv
Display the auxiliary vector of the inferior, which can be either a
live process or a core dump file.  @value{GDBN} prints each tag value
numerically, and also shows names and text descriptions for recognized
tags.  Some values in the vector are numbers, some bit masks, and some
pointers to strings or other data.  @value{GDBN} displays each value in the
most appropriate form for a recognized tag, and in hexadecimal for
an unrecognized tag.
@end table

On some targets, @value{GDBN} 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
@ref{Operating System Information}.  For remote targets, this
functionality depends on the remote stub's support of the
@samp{qXfer:osdata:read} packet, see @ref{qXfer osdata read}.

@table @code
@kindex info os
@item info os @var{infotype}

Display OS information of the requested type.

On @sc{gnu}/Linux, the following values of @var{infotype} are valid:

@anchor{linux info os infotypes}
@table @code
@kindex info os processes
@item processes
Display the list of processes on the target.  For each process,
@value{GDBN} 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 @sc{gnu}/Linux documentation.)

@kindex info os procgroups
@item procgroups
Display the list of process groups on the target.  For each process,
@value{GDBN} 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.

@kindex info os threads
@item threads
Display the list of threads running on the target.  For each thread,
@value{GDBN} 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.

@kindex info os files
@item files
Display the list of open file descriptors on the target.  For each
file descriptor, @value{GDBN} 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.

@kindex info os sockets
@item sockets
Display the list of Internet-domain sockets on the target.  For each
socket, @value{GDBN} 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.

@kindex info os shm
@item shm
Display the list of all System V shared-memory regions on the target.
For each shared-memory region, @value{GDBN} prints the region key,
the shared-memory identifier, the access permissions, the size of 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.

@kindex info os semaphores
@item semaphores
Display the list of all System V semaphore sets on the target.  For each
semaphore set, @value{GDBN} 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.

@kindex info os msg
@item msg
Display the list of all System V message queues on the target.  For each
message queue, @value{GDBN} 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.

@kindex info os modules
@item modules
Display the list of all loaded kernel modules on the target.  For each
module, @value{GDBN} 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.
@end table

@item info os
If @var{infotype} is omitted, then list the possible values for
@var{infotype} and the kind of OS information available for each
@var{infotype}.  If the target does not return a list of possible
types, this command will report an error.
@end table

@node Memory Region Attributes
@section Memory Region Attributes
@cindex memory region attributes

@dfn{Memory region attributes} allow you to describe special handling
required by regions of your target's memory.  @value{GDBN} uses
attributes to determine whether to allow certain types of memory
accesses; whether to use specific width accesses; and whether to cache
target memory.  By default the description of memory regions is
fetched from the target (if the current target supports this), but the
user can override the fetched regions.

Defined memory regions can be individually enabled and disabled.  When a
memory region is disabled, @value{GDBN} uses the default attributes when
accessing memory in that region.  Similarly, if no memory regions have
been defined, @value{GDBN} uses the default attributes when accessing
all memory.

When a memory region is defined, it is given a number to identify it;
to enable, disable, or remove a memory region, you specify that number.

@table @code
@kindex mem
@item mem @var{lower} @var{upper} @var{attributes}@dots{}
Define a memory region bounded by @var{lower} and @var{upper} with
attributes @var{attributes}@dots{}, and add it to the list of regions
monitored by @value{GDBN}.  Note that @var{upper} == 0 is a special
case: it is treated as the target's maximum memory address.
(0xffff on 16 bit targets, 0xffffffff on 32 bit targets, etc.)

@item mem auto
Discard any user changes to the memory regions and use target-supplied
regions, if available, or no regions if the target does not support.

@kindex delete mem
@item delete mem @var{nums}@dots{}
Remove memory regions @var{nums}@dots{} from the list of regions
monitored by @value{GDBN}.

@kindex disable mem
@item disable mem @var{nums}@dots{}
Disable monitoring of memory regions @var{nums}@dots{}.
A disabled memory region is not forgotten.
It may be enabled again later.

@kindex enable mem
@item enable mem @var{nums}@dots{}
Enable monitoring of memory regions @var{nums}@dots{}.

@kindex info mem
@item info mem
Print a table of all defined memory regions, with the following columns
for each region:

@table @emph
@item Memory Region Number
@item Enabled or Disabled.
Enabled memory regions are marked with @samp{y}.
Disabled memory regions are marked with @samp{n}.

@item Lo Address
The address defining the inclusive lower bound of the memory region.

@item Hi Address
The address defining the exclusive upper bound of the memory region.

@item Attributes
The list of attributes set for this memory region.
@end table
@end table


@subsection Attributes

@subsubsection Memory Access Mode
The access mode attributes set whether @value{GDBN} may make read or
write accesses to a memory region.

While these attributes prevent @value{GDBN} from performing invalid
memory accesses, they do nothing to prevent the target system, I/O DMA,
etc.@: from accessing memory.

@table @code
@item ro
Memory is read only.
@item wo
Memory is write only.
@item rw
Memory is read/write.  This is the default.
@end table

@subsubsection Memory Access Size
The access size attribute tells @value{GDBN} to use specific sized
accesses in the memory region.  Often memory mapped device registers
require specific sized accesses.  If no access size attribute is
specified, @value{GDBN} may use accesses of any size.

@table @code
@item 8
Use 8 bit memory accesses.
@item 16
Use 16 bit memory accesses.
@item 32
Use 32 bit memory accesses.
@item 64
Use 64 bit memory accesses.
@end table

@c @subsubsection Hardware/Software Breakpoints
@c The hardware/software breakpoint attributes set whether @value{GDBN}
@c will use hardware or software breakpoints for the internal breakpoints
@c used by the step, next, finish, until, etc. commands.
@c
@c @table @code
@c @item hwbreak
@c Always use hardware breakpoints
@c @item swbreak (default)
@c @end table

@subsubsection Data Cache
The data cache attributes set whether @value{GDBN} will cache target
memory.  While this generally improves performance by reducing debug
protocol overhead, it can lead to incorrect results because @value{GDBN}
does not know about volatile variables or memory mapped device
registers.

@table @code
@item cache
Enable @value{GDBN} to cache target memory.
@item nocache
Disable @value{GDBN} from caching target memory.  This is the default.
@end table

@subsection Memory Access Checking
@value{GDBN} can be instructed to refuse accesses to memory that is
not explicitly described.  This can be useful if accessing such
regions has undesired effects for a specific target, or to provide
better error checking.  The following commands control this behaviour.

@table @code
@kindex set mem inaccessible-by-default
@item set mem inaccessible-by-default [on|off]
If @code{on} is specified, make  @value{GDBN} treat memory not
explicitly described by the memory ranges as non-existent and refuse accesses
to such memory.  The checks are only performed if there's at least one
memory range defined.  If @code{off} is specified, make @value{GDBN}
treat the memory not explicitly described by the memory ranges as RAM.
The default value is @code{on}.
@kindex show mem inaccessible-by-default
@item show mem inaccessible-by-default
Show the current handling of accesses to unknown memory.
@end table


@c @subsubsection Memory Write Verification
@c The memory write verification attributes set whether @value{GDBN}
@c will re-reads data after each write to verify the write was successful.
@c
@c @table @code
@c @item verify
@c @item noverify (default)
@c @end table

@node Dump/Restore Files
@section Copy Between Memory and a File
@cindex dump/restore files
@cindex append data to a file
@cindex dump data to a file
@cindex restore data from a file

You can use the commands @code{dump}, @code{append}, and
@code{restore} to copy data between target memory and a file.  The
@code{dump} and @code{append} commands write data to a file, and the
@code{restore} command reads data from a file back into the inferior's
memory.  Files may be in binary, Motorola S-record, Intel hex, or
Tektronix Hex format; however, @value{GDBN} can only append to binary
files.

@table @code

@kindex dump
@item dump @r{[}@var{format}@r{]} memory @var{filename} @var{start_addr} @var{end_addr}
@itemx dump @r{[}@var{format}@r{]} value @var{filename} @var{expr}
Dump the contents of memory from @var{start_addr} to @var{end_addr},
or the value of @var{expr}, to @var{filename} in the given format.

The @var{format} parameter may be any one of:
@table @code
@item binary
Raw binary form.
@item ihex
Intel hex format.
@item srec
Motorola S-record format.
@item tekhex
Tektronix Hex format.
@end table

@value{GDBN} uses the same definitions of these formats as the
@sc{gnu} binary utilities, like @samp{objdump} and @samp{objcopy}.  If
@var{format} is omitted, @value{GDBN} dumps the data in raw binary
form.

@kindex append
@item append @r{[}binary@r{]} memory @var{filename} @var{start_addr} @var{end_addr}
@itemx append @r{[}binary@r{]} value @var{filename} @var{expr}
Append the contents of memory from @var{start_addr} to @var{end_addr},
or the value of @var{expr}, to the file @var{filename}, in raw binary form.
(@value{GDBN} can only append data to files in raw binary form.)

@kindex restore
@item restore @var{filename} @r{[}binary@r{]} @var{bias} @var{start} @var{end}
Restore the contents of file @var{filename} into memory.  The
@code{restore} command can automatically recognize any known @sc{bfd}
file format, except for raw binary.  To restore a raw binary file you
must specify the optional keyword @code{binary} after the filename.

If @var{bias} is non-zero, its value will be added to the addresses
contained in the file.  Binary files always start at address zero, so
they will be restored at address @var{bias}.  Other bfd files have
a built-in location; they will be restored at offset @var{bias}
from that location.

If @var{start} and/or @var{end} are non-zero, then only data between
file offset @var{start} and file offset @var{end} will be restored.
These offsets are relative to the addresses in the file, before
the @var{bias} argument is applied.

@end table

@node Core File Generation
@section How to Produce a Core File from Your Program
@cindex dump core from inferior

A @dfn{core file} or @dfn{core dump} is a file that records the memory
image of a running process and its process status (register values
etc.).  Its primary use is post-mortem debugging of a program that
crashed while it ran outside a debugger.  A program that crashes
automatically produces a core file, unless this feature is disabled by
the user.  @xref{Files}, for information on invoking @value{GDBN} in
the post-mortem debugging mode.

Occasionally, you may wish to produce a core file of the program you
are debugging in order to preserve a snapshot of its state.
@value{GDBN} has a special command for that.

@table @code
@kindex gcore
@kindex generate-core-file
@item generate-core-file [@var{file}]
@itemx gcore [@var{file}]
Produce a core dump of the inferior process.  The optional argument
@var{file} specifies the file name where to put the core dump.  If not
specified, the file name defaults to @file{core.@var{pid}}, where
@var{pid} is the inferior process ID.

Note that this command is implemented only for some systems (as of
this writing, @sc{gnu}/Linux, FreeBSD, Solaris, and S390).
@end table

@node Character Sets
@section Character Sets
@cindex character sets
@cindex charset
@cindex translating between character sets
@cindex host character set
@cindex target character set

If the program you are debugging uses a different character set to
represent characters and strings than the one @value{GDBN} uses itself,
@value{GDBN} can automatically translate between the character sets for
you.  The character set @value{GDBN} uses we call the @dfn{host
character set}; the one the inferior program uses we call the
@dfn{target character set}.

For example, if you are running @value{GDBN} on a @sc{gnu}/Linux system, which
uses the ISO Latin 1 character set, but you are using @value{GDBN}'s
remote protocol (@pxref{Remote Debugging}) to debug a program
running on an IBM mainframe, which uses the @sc{ebcdic} character set,
then the host character set is Latin-1, and the target character set is
@sc{ebcdic}.  If you give @value{GDBN} the command @code{set
target-charset EBCDIC-US}, then @value{GDBN} translates between
@sc{ebcdic} and Latin 1 as you print character or string values, or use
character and string literals in expressions.

@value{GDBN} has no way to automatically recognize which character set
the inferior program uses; you must tell it, using the @code{set
target-charset} command, described below.

Here are the commands for controlling @value{GDBN}'s character set
support:

@table @code
@item set target-charset @var{charset}
@kindex set target-charset
Set the current target character set to @var{charset}.  To display the
list of supported target character sets, type
@kbd{@w{set target-charset @key{TAB}@key{TAB}}}.

@item set host-charset @var{charset}
@kindex set host-charset
Set the current host character set to @var{charset}.

By default, @value{GDBN} uses a host character set appropriate to the
system it is running on; you can override that default using the
@code{set host-charset} command.  On some systems, @value{GDBN} cannot
automatically determine the appropriate host character set.  In this
case, @value{GDBN} uses @samp{UTF-8}.

@value{GDBN} can only use certain character sets as its host character
set.  If you type @kbd{@w{set host-charset @key{TAB}@key{TAB}}},
@value{GDBN} will list the host character sets it supports.

@item set charset @var{charset}
@kindex set charset
Set the current host and target character sets to @var{charset}.  As
above, if you type @kbd{@w{set charset @key{TAB}@key{TAB}}},
@value{GDBN} will list the names of the character sets that can be used
for both host and target.

@item show charset
@kindex show charset
Show the names of the current host and target character sets.

@item show host-charset
@kindex show host-charset
Show the name of the current host character set.

@item show target-charset
@kindex show target-charset
Show the name of the current target character set.

@item set target-wide-charset @var{charset}
@kindex set target-wide-charset
Set the current target's wide character set to @var{charset}.  This is
the character set used by the target's @code{wchar_t} type.  To
display the list of supported wide character sets, type
@kbd{@w{set target-wide-charset @key{TAB}@key{TAB}}}.

@item show target-wide-charset
@kindex show target-wide-charset
Show the name of the current target's wide character set.
@end table

Here is an example of @value{GDBN}'s character set support in action.
Assume that the following source code has been placed in the file
@file{charset-test.c}:

@smallexample
#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@};

main ()
@{
  printf ("Hello, world!\n");
@}
@end smallexample

In this program, @code{ascii_hello} and @code{ibm1047_hello} are arrays
containing the string @samp{Hello, world!} followed by a newline,
encoded in the @sc{ascii} and @sc{ibm1047} character sets.

We compile the program, and invoke the debugger on it:

@smallexample
$ gcc -g charset-test.c -o charset-test
$ gdb -nw charset-test
GNU gdb 2001-12-19-cvs
Copyright 2001 Free Software Foundation, Inc.
@dots{}
(@value{GDBP})
@end smallexample

We can use the @code{show charset} command to see what character sets
@value{GDBN} is currently using to interpret and display characters and
strings:

@smallexample
(@value{GDBP}) show charset
The current host and target character set is `ISO-8859-1'.
(@value{GDBP})
@end smallexample

For the sake of printing this manual, let's use @sc{ascii} as our
initial character set:
@smallexample
(@value{GDBP}) set charset ASCII
(@value{GDBP}) show charset
The current host and target character set is `ASCII'.
(@value{GDBP})
@end smallexample

Let's assume that @sc{ascii} is indeed the correct character set for our
host system --- in other words, let's assume that if @value{GDBN} prints
characters using the @sc{ascii} character set, our terminal will display
them properly.  Since our current target character set is also
@sc{ascii}, the contents of @code{ascii_hello} print legibly:

@smallexample
(@value{GDBP}) print ascii_hello
$1 = 0x401698 "Hello, world!\n"
(@value{GDBP}) print ascii_hello[0]
$2 = 72 'H'
(@value{GDBP})
@end smallexample

@value{GDBN} uses the target character set for character and string
literals you use in expressions:

@smallexample
(@value{GDBP}) print '+'
$3 = 43 '+'
(@value{GDBP})
@end smallexample

The @sc{ascii} character set uses the number 43 to encode the @samp{+}
character.

@value{GDBN} relies on the user to tell it which character set the
target program uses.  If we print @code{ibm1047_hello} while our target
character set is still @sc{ascii}, we get jibberish:

@smallexample
(@value{GDBP}) print ibm1047_hello
$4 = 0x4016a8 "\310\205\223\223\226k@@\246\226\231\223\204Z%"
(@value{GDBP}) print ibm1047_hello[0]
$5 = 200 '\310'
(@value{GDBP})
@end smallexample

If we invoke the @code{set target-charset} followed by @key{TAB}@key{TAB},
@value{GDBN} tells us the character sets it supports:

@smallexample
(@value{GDBP}) set target-charset
ASCII       EBCDIC-US   IBM1047     ISO-8859-1
(@value{GDBP}) set target-charset
@end smallexample

We can select @sc{ibm1047} as our target character set, and examine the
program's strings again.  Now the @sc{ascii} string is wrong, but
@value{GDBN} translates the contents of @code{ibm1047_hello} from the
target character set, @sc{ibm1047}, to the host character set,
@sc{ascii}, and they display correctly:

@smallexample
(@value{GDBP}) set target-charset IBM1047
(@value{GDBP}) show charset
The current host character set is `ASCII'.
The current target character set is `IBM1047'.
(@value{GDBP}) print ascii_hello
$6 = 0x401698 "\110\145%%?\054\040\167?\162%\144\041\012"
(@value{GDBP}) print ascii_hello[0]
$7 = 72 '\110'
(@value{GDBP}) print ibm1047_hello
$8 = 0x4016a8 "Hello, world!\n"
(@value{GDBP}) print ibm1047_hello[0]
$9 = 200 'H'
(@value{GDBP})
@end smallexample

As above, @value{GDBN} uses the target character set for character and
string literals you use in expressions:

@smallexample
(@value{GDBP}) print '+'
$10 = 78 '+'
(@value{GDBP})
@end smallexample

The @sc{ibm1047} character set uses the number 78 to encode the @samp{+}
character.

@node Caching Target Data
@section Caching Data of Targets
@cindex caching data of targets

@value{GDBN} caches data exchanged between the debugger and a target.
Each cache is associated with the address space of the inferior.
@xref{Inferiors and Programs}, about inferior and address space.
Such caching generally improves performance in remote debugging
(@pxref{Remote Debugging}), because it reduces the overhead of the
remote protocol by bundling memory reads and writes into large chunks.
Unfortunately, simply caching everything would lead to incorrect results,
since @value{GDBN} does not necessarily know anything about volatile
values, memory-mapped I/O addresses, etc.  Furthermore, in non-stop mode
(@pxref{Non-Stop Mode}) memory can be changed @emph{while} a gdb command
is executing.
Therefore, by default, @value{GDBN} only caches data
known to be on the stack@footnote{In non-stop mode, it is moderately
rare for a running thread to modify the stack of a stopped thread
in a way that would interfere with a backtrace, and caching of
stack reads provides a significant speed up of remote backtraces.} or
in the code segment.
Other regions of memory can be explicitly marked as
cacheable; @pxref{Memory Region Attributes}.

@table @code
@kindex set remotecache
@item set remotecache on
@itemx set remotecache off
This option no longer does anything; it exists for compatibility
with old scripts.

@kindex show remotecache
@item show remotecache
Show the current state of the obsolete remotecache flag.

@kindex set stack-cache
@item set stack-cache on
@itemx set stack-cache off
Enable or disable caching of stack accesses.  When @code{on}, use
caching.  By default, this option is @code{on}.

@kindex show stack-cache
@item show stack-cache
Show the current state of data caching for memory accesses.

@kindex set code-cache
@item set code-cache on
@itemx set code-cache off
Enable or disable caching of code segment accesses.  When @code{on},
use caching.  By default, this option is @code{on}.  This improves
performance of disassembly in remote debugging.

@kindex show code-cache
@item show code-cache
Show the current state of target memory cache for code segment
accesses.

@kindex info dcache
@item info dcache @r{[}line@r{]}
Print the information about the performance of data cache of the
current inferior'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.

@item set dcache size @var{size}
@cindex dcache size
@kindex set dcache size
Set maximum number of entries in dcache (dcache depth above).

@item set dcache line-size @var{line-size}
@cindex dcache line-size
@kindex set dcache line-size
Set number of bytes each dcache entry caches (dcache width above).
Must be a power of 2.

@item show dcache size
@kindex show dcache size
Show maximum number of dcache entries.  @xref{Caching Target Data, info dcache}.

@item show dcache line-size
@kindex show dcache line-size
Show default size of dcache lines.

@end table

@node Searching Memory
@section Search Memory
@cindex searching memory

Memory can be searched for a particular sequence of bytes with the
@code{find} command.

@table @code
@kindex find
@item find @r{[}/@var{sn}@r{]} @var{start_addr}, +@var{len}, @var{val1} @r{[}, @var{val2}, @dots{}@r{]}
@itemx find @r{[}/@var{sn}@r{]} @var{start_addr}, @var{end_addr}, @var{val1} @r{[}, @var{val2}, @dots{}@r{]}
Search memory for the sequence of bytes specified by @var{val1}, @var{val2},
etc.  The search begins at address @var{start_addr} and continues for either
@var{len} bytes or through to @var{end_addr} inclusive.
@end table

@var{s} and @var{n} are optional parameters.
They may be specified in either order, apart or together.

@table @r
@item @var{s}, search query size
The size of each search query value.

@table @code
@item b
bytes
@item h
halfwords (two bytes)
@item w
words (four bytes)
@item g
giant words (eight bytes)
@end table

All values are interpreted in the current language.
This means, for example, that if the current source language is C/C@t{++}
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 @samp{(int) 0x42}
which is typically four bytes.

@item @var{n}, maximum number of finds
The maximum number of matches to print.  The default is to print all finds.
@end table

You can use strings as search values.  Quote them with double-quotes
 (@code{"}).
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
@samp{$_}.
A count of the number of matches is stored in @samp{$numfound}.

For example, if stopped at the @code{printf} in this function:

@smallexample
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);
@}
@end smallexample

@noindent
you get during debugging:

@smallexample
(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
@end smallexample

@node Optimized Code
@chapter Debugging Optimized Code
@cindex optimized code, debugging
@cindex debugging optimized code

Almost all compilers support optimization.  With optimization
disabled, the compiler generates assembly code that corresponds
directly to your source code, in a simplistic way.  As the compiler
applies more powerful optimizations, the generated assembly code
diverges from your original source code.  With help from debugging
information generated by the compiler, @value{GDBN} can map from
the running program back to constructs from your original source.

@value{GDBN} is more accurate with optimization disabled.  If you
can recompile without optimization, it is easier to follow the
progress of your program during debugging.  But, there are many cases
where you may need to debug an optimized version.

When you debug a program compiled with @samp{-g -O}, remember that the
optimizer has rearranged your code; the debugger shows you what is
really there.  Do not be too surprised when the execution path does not
exactly match your source file!  An extreme example: if you define a
variable, but never use it, @value{GDBN} never sees that
variable---because the compiler optimizes it out of existence.

Some things do not work as well with @samp{-g -O} as with just
@samp{-g}, particularly on machines with instruction scheduling.  If in
doubt, recompile with @samp{-g} alone, and if this fixes the problem,
please report it to us as a bug (including a test case!).
@xref{Variables}, for more information about debugging optimized code.

@menu
* Inline Functions::            How @value{GDBN} presents inlining
* Tail Call Frames::            @value{GDBN} analysis of jumps to functions
@end menu

@node Inline Functions
@section Inline Functions
@cindex inline functions, debugging

@dfn{Inlining} is an optimization that inserts a copy of the function
body directly at each call site, instead of jumping to a shared
routine.  @value{GDBN} displays inlined functions just like
non-inlined functions.  They appear in backtraces.  You can view their
arguments and local variables, step into them with @code{step}, skip
them with @code{next}, and escape from them with @code{finish}.
You can check whether a function was inlined by using the
@code{info frame} command.

For @value{GDBN} to support inlined functions, the compiler must
record information about inlining in the debug information ---
@value{NGCC} using the @sc{dwarf 2} format does this, and several
other compilers do also.  @value{GDBN} only supports inlined functions
when using @sc{dwarf 2}.  Versions of @value{NGCC} before 4.1
do not emit two required attributes (@samp{DW_AT_call_file} and
@samp{DW_AT_call_line}); @value{GDBN} does not display inlined
function calls with earlier versions of @value{NGCC}.  It instead
displays the arguments and local variables of inlined functions as
local variables in the caller.

The body of an inlined function is directly included at its call site;
unlike a non-inlined function, there are no instructions devoted to
the call.  @value{GDBN} still pretends that the call site and the
start of the inlined function are different instructions.  Stepping to
the call site shows the call site, and then stepping again shows
the first line of the inlined function, even though no additional
instructions are executed.

This makes source-level debugging much clearer; you can see both the
context of the call and then the effect of the call.  Only stepping by
a single instruction using @code{stepi} or @code{nexti} does not do
this; single instruction steps always show the inlined body.

There are some ways that @value{GDBN} does not pretend that inlined
function calls are the same as normal calls:

@itemize @bullet
@item
Setting breakpoints at the call site of an inlined function may not
work, because the call site does not contain any code.  @value{GDBN}
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 @value{GDBN}; until then, set a breakpoint on an earlier line
or inside the inlined function instead.

@item
@value{GDBN} cannot locate the return value of inlined calls after
using the @code{finish} command.  This is a limitation of compiler-generated
debugging information; after @code{finish}, you can step to the next line
and print a variable where your program stored the return value.

@end itemize

@node Tail Call Frames
@section Tail Call Frames
@cindex tail call frames, debugging

Function @code{B} can call function @code{C} in its very last statement.  In
unoptimized compilation the call of @code{C} is immediately followed by return
instruction at the end of @code{B} code.  Optimizing compiler may replace the
call and return in function @code{B} into one jump to function @code{C}
instead.  Such use of a jump instruction is called @dfn{tail call}.

During execution of function @code{C}, there will be no indication in the
function call stack frames that it was tail-called from @code{B}.  If function
@code{A} regularly calls function @code{B} which tail-calls function @code{C},
then @value{GDBN} will see @code{A} as the caller of @code{C}.  However, in
some cases @value{GDBN} can determine that @code{C} was tail-called from
@code{B}, and it will then create fictitious call frame for that, with the
return address set up as if @code{B} called @code{C} normally.

This functionality is currently supported only by DWARF 2 debugging format and
the compiler has to produce @samp{DW_TAG_GNU_call_site} tags.  With
@value{NGCC}, you need to specify @option{-O -g} during compilation, to get
this information.

@kbd{info frame} command (@pxref{Frame Info}) will indicate the tail call frame
kind by text @code{tail call frame} such as in this sample @value{GDBN} output:

@smallexample
(gdb) x/i $pc - 2
   0x40066b <b(int, double)+11>: jmp 0x400640 <c(int, double)>
(gdb) info frame
Stack level 1, frame at 0x7fffffffda30:
 rip = 0x40066d in b (amd64-entry-value.cc:59); saved rip 0x4004c5
 tail call frame, caller of frame at 0x7fffffffda30
 source language c++.
 Arglist at unknown address.
 Locals at unknown address, Previous frame's sp is 0x7fffffffda30
@end smallexample

The detection of all the possible code path executions can find them ambiguous.
There is no execution history stored (possible @ref{Reverse Execution} 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 @value{GDBN} still
tries to show at least all the unambiguous top tail callers and all the
unambiguous bottom tail calees, if any.

@table @code
@anchor{set debug entry-values}
@item set debug entry-values
@kindex set debug entry-values
When set to on, enables printing of analysis messages for both frame argument
values at function entry and tail calls.  It will show all the possible valid
tail calls code paths it has considered.  It will also print the intersection
of them with the final unambiguous (possibly partial or even empty) code path
result.

@item show debug entry-values
@kindex show debug entry-values
Show the current state of analysis messages printing for both frame argument
values at function entry and tail calls.
@end table

The analysis messages for tail calls can for example show why the virtual tail
call frame for function @code{c} has not been recognized (due to the indirect
reference by variable @code{x}):

@smallexample
static void __attribute__((noinline, noclone)) c (void);
void (*x) (void) = c;
static void __attribute__((noinline, noclone)) a (void) @{ x++; @}
static void __attribute__((noinline, noclone)) c (void) @{ a (); @}
int main (void) @{ x (); return 0; @}

Breakpoint 1, DW_OP_GNU_entry_value resolving cannot find
DW_TAG_GNU_call_site 0x40039a in main
a () at t.c:3
3	static void __attribute__((noinline, noclone)) a (void) @{ x++; @}
(gdb) bt
#0  a () at t.c:3
#1  0x000000000040039a in main () at t.c:5
@end smallexample

Another possibility is an ambiguous virtual tail call frames resolution:

@smallexample
int i;
static void __attribute__((noinline, noclone)) f (void) @{ i++; @}
static void __attribute__((noinline, noclone)) e (void) @{ f (); @}
static void __attribute__((noinline, noclone)) d (void) @{ f (); @}
static void __attribute__((noinline, noclone)) c (void) @{ d (); @}
static void __attribute__((noinline, noclone)) b (void)
@{ if (i) c (); else e (); @}
static void __attribute__((noinline, noclone)) a (void) @{ b (); @}
int main (void) @{ a (); return 0; @}

tailcall: initial: 0x4004d2(a) 0x4004ce(b) 0x4004b2(c) 0x4004a2(d)
tailcall: compare: 0x4004d2(a) 0x4004cc(b) 0x400492(e)
tailcall: reduced: 0x4004d2(a) |
(gdb) bt
#0  f () at t.c:2
#1  0x00000000004004d2 in a () at t.c:8
#2  0x0000000000400395 in main () at t.c:9
@end smallexample

@set CALLSEQ1A @code{main@value{ARROW}a@value{ARROW}b@value{ARROW}c@value{ARROW}d@value{ARROW}f}
@set CALLSEQ2A @code{main@value{ARROW}a@value{ARROW}b@value{ARROW}e@value{ARROW}f}

@c Convert CALLSEQ#A to CALLSEQ#B depending on HAVE_MAKEINFO_CLICK.
@ifset HAVE_MAKEINFO_CLICK
@set ARROW @click{}
@set CALLSEQ1B @clicksequence{@value{CALLSEQ1A}}
@set CALLSEQ2B @clicksequence{@value{CALLSEQ2A}}
@end ifset
@ifclear HAVE_MAKEINFO_CLICK
@set ARROW ->
@set CALLSEQ1B @value{CALLSEQ1A}
@set CALLSEQ2B @value{CALLSEQ2A}
@end ifclear

Frames #0 and #2 are real, #1 is a virtual tail call frame.
The code can have possible execution paths @value{CALLSEQ1B} or
@value{CALLSEQ2B}, @value{GDBN} cannot find which one from the inferior state.

@code{initial:} state shows some random possible calling sequence @value{GDBN}
has found.  It then finds another possible calling sequcen - that one is
prefixed by @code{compare:}.  The non-ambiguous intersection of these two is
printed as the @code{reduced:} calling sequence.  That one could have many
futher @code{compare:} and @code{reduced:} statements as long as there remain
any non-ambiguous sequence entries.

For the frame of function @code{b} in both cases there are different possible
@code{$pc} values (@code{0x4004cc} or @code{0x4004ce}), therefore this frame is
also ambigous.  The only non-ambiguous frame is the one for function @code{a},
therefore this one is displayed to the user while the ambiguous frames are
omitted.

There can be also reasons why printing of frame argument values at function
entry may fail:

@smallexample
int v;
static void __attribute__((noinline, noclone)) c (int i) @{ v++; @}
static void __attribute__((noinline, noclone)) a (int i);
static void __attribute__((noinline, noclone)) b (int i) @{ a (i); @}
static void __attribute__((noinline, noclone)) a (int i)
@{ if (i) b (i - 1); else c (0); @}
int main (void) @{ a (5); return 0; @}

(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
@end smallexample

@value{GDBN} cannot find out from the inferior state if and how many times did
function @code{a} call itself (via function @code{b}) as these calls would be
tail calls.  Such tail calls would modify thue @code{i} variable, therefore
@value{GDBN} cannot be sure the value it knows would be right - @value{GDBN}
prints @code{<optimized out>} instead.

@node Macros
@chapter C Preprocessor Macros

Some languages, such as C and C@t{++}, provide a way to define and invoke
``preprocessor macros'' which expand into strings of tokens.
@value{GDBN} 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 @value{GDBN}
with information about preprocessor macros.  Most compilers do not
include macros in their debugging information, even when you compile
with the @option{-g} flag.  @xref{Compilation}.

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, @value{GDBN}
uses the macros in scope at that frame's source code line.  Otherwise,
@value{GDBN} uses the macros in scope at the current listing location;
see @ref{List}.

Whenever @value{GDBN} evaluates an expression, it always expands any
macro invocations present in the expression.  @value{GDBN} also provides
the following commands for working with macros explicitly.

@table @code

@kindex macro expand
@cindex macro expansion, showing the results of preprocessor
@cindex preprocessor macro expansion, showing the results of
@cindex expanding preprocessor macros
@item macro expand @var{expression}
@itemx macro exp @var{expression}
Show the results of expanding all preprocessor macro invocations in
@var{expression}.  Since @value{GDBN} simply expands macros, but does
not parse the result, @var{expression} need not be a valid expression;
it can be any string of tokens.

@kindex macro exp1
@item macro expand-once @var{expression}
@itemx macro exp1 @var{expression}
@cindex expand macro once
@i{(This command is not yet implemented.)}  Show the results of
expanding those preprocessor macro invocations that appear explicitly in
@var{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 @value{GDBN} simply expands macros, but does not
parse the result, @var{expression} need not be a valid expression; it
can be any string of tokens.

@kindex info macro
@cindex macro definition, showing
@cindex definition of a macro, showing
@cindex macros, from debug info
@item info macro [-a|-all] [--] @var{macro}
Show the current definition or all definitions of the named @var{macro},
and describe the source location or compiler command-line where that
definition was established.  The optional double dash is to signify the end of
argument processing and the beginning of @var{macro} for non C-like macros where
the macro may begin with a hyphen.

@kindex info macros
@item info macros @var{linespec}
Show all macro definitions that are in effect at the location specified
by @var{linespec},  and describe the source location or compiler
command-line where those definitions were established.

@kindex macro define
@cindex user-defined macros
@cindex defining macros interactively
@cindex macros, user-defined
@item macro define @var{macro} @var{replacement-list}
@itemx macro define @var{macro}(@var{arglist}) @var{replacement-list}
Introduce a definition for a preprocessor macro named @var{macro},
invocations of which are replaced by the tokens given in
@var{replacement-list}.  The first form of this command defines an
``object-like'' macro, which takes no arguments; the second form
defines a ``function-like'' macro, which takes the arguments given in
@var{arglist}.

A definition introduced by this command is in scope in every
expression evaluated in @value{GDBN}, until it is removed with the
@code{macro undef} command, described below.  The definition overrides
all definitions for @var{macro} present in the program being debugged,
as well as any previous user-supplied definition.

@kindex macro undef
@item macro undef @var{macro}
Remove any user-supplied definition for the macro named @var{macro}.
This command only affects definitions provided with the @code{macro
define} command, described above; it cannot remove definitions present
in the program being debugged.

@kindex macro list
@item macro list
List all the macros defined using the @code{macro define} command.
@end table

@cindex macros, example of debugging with
Here is a transcript showing the above commands in action.  First, we
show our source files:

@smallexample
$ cat sample.c
#include <stdio.h>
#include "sample.h"

#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 <
$
@end smallexample

Now, we compile the program using the @sc{gnu} C compiler,
@value{NGCC}.  We pass the @option{-gdwarf-2}@footnote{This is the
minimum.  Recent versions of @value{NGCC} support @option{-gdwarf-3}
and @option{-gdwarf-4}; we recommend always choosing the most recent
version of DWARF.} @emph{and} @option{-g3} flags to ensure the compiler
includes information about preprocessor macros in the debugging
information.

@smallexample
$ gcc -gdwarf-2 -g3 sample.c -o sample
$
@end smallexample

Now, we start @value{GDBN} on our sample program:

@smallexample
$ gdb -nw sample
GNU gdb 2002-05-06-cvs
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, @dots{}
(@value{GDBP})
@end smallexample

We can expand macros and examine their definitions, even when the
program is not running.  @value{GDBN} uses the current listing position
to decide which macro definitions are in scope:

@smallexample
(@value{GDBP}) 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");
(@value{GDBP}) info macro ADD
Defined at /home/jimb/gdb/macros/play/sample.c:5
#define ADD(x) (M + x)
(@value{GDBP}) 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 <
(@value{GDBP}) macro expand ADD(1)
expands to: (42 + 1)
(@value{GDBP}) macro expand-once ADD(1)
expands to: once (M + 1)
(@value{GDBP})
@end smallexample

In the example above, note that @code{macro expand-once} expands only
the macro invocation explicit in the original text --- the invocation of
@code{ADD} --- but does not expand the invocation of the macro @code{M},
which was introduced by @code{ADD}.

Once the program is running, @value{GDBN} uses the macro definitions in
force at the source line of the current stack frame:

@smallexample
(@value{GDBP}) break main
Breakpoint 1 at 0x8048370: file sample.c, line 10.
(@value{GDBP}) run
Starting program: /home/jimb/gdb/macros/play/sample

Breakpoint 1, main () at sample.c:10
10        printf ("Hello, world!\n");
(@value{GDBP})
@end smallexample

At line 10, the definition of the macro @code{N} at line 9 is in force:

@smallexample
(@value{GDBP}) info macro N
Defined at /home/jimb/gdb/macros/play/sample.c:9
#define N 28
(@value{GDBP}) macro expand N Q M
expands to: 28 < 42
(@value{GDBP}) print N Q M
$1 = 1
(@value{GDBP})
@end smallexample

As we step over directives that remove @code{N}'s definition, and then
give it a new definition, @value{GDBN} finds the definition (or lack
thereof) in force at each point:

@smallexample
(@value{GDBP}) next
Hello, world!
12        printf ("We're so creative.\n");
(@value{GDBP}) info macro N
The symbol `N' has no definition as a C/C++ preprocessor macro
at /home/jimb/gdb/macros/play/sample.c:12
(@value{GDBP}) next
We're so creative.
14        printf ("Goodbye, world!\n");
(@value{GDBP}) info macro N
Defined at /home/jimb/gdb/macros/play/sample.c:13
#define N 1729
(@value{GDBP}) macro expand N Q M
expands to: 1729 < 42
(@value{GDBP}) print N Q M
$2 = 0
(@value{GDBP})
@end smallexample

In addition to source files, macros can be defined on the compilation command
line using the @option{-D@var{name}=@var{value}} syntax.  For macros defined in
such a way, @value{GDBN} displays the location of their definition as line zero
of the source file submitted to the compiler.

@smallexample
(@value{GDBP}) info macro __STDC__
Defined at /home/jimb/gdb/macros/play/sample.c:0
-D__STDC__=1
(@value{GDBP})
@end smallexample


@node Tracepoints
@chapter Tracepoints
@c This chapter is based on the documentation written by Michael
@c Snyder, David Taylor, Jim Blandy, and Elena Zannoni.

@cindex 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 @value{GDBN}'s @code{trace} and @code{collect} commands, you can
specify locations in the program, called @dfn{tracepoints}, and
arbitrary expressions to evaluate when those tracepoints are reached.
Later, using the @code{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 @value{GDBN} should record; while visiting
a particular tracepoint, you may inspect those objects as if they were
in memory at that moment.  However, because @value{GDBN} 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.  @xref{Targets}.  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 @value{GDBN}
support tracepoints as of this writing.  The format of the remote
packets used to implement tracepoints are described in @ref{Tracepoint
Packets}.

It is also possible to get trace data from a file, in a manner reminiscent
of corefiles; you specify the filename, and use @code{tfind} to search
through the file.  @xref{Trace Files}, for more details.

This chapter describes the tracepoint commands and features.

@menu
* Set Tracepoints::
* Analyze Collected Data::
* Tracepoint Variables::
* Trace Files::
@end menu

@node Set Tracepoints
@section Commands to Set Tracepoints

Before running such a @dfn{trace experiment}, an arbitrary number of
tracepoints can be set.  A tracepoint is actually a special type of
breakpoint (@pxref{Set Breaks}), so you can manipulate it using
standard breakpoint commands.  For instance, as with breakpoints,
tracepoint numbers are successive integers starting from one, and many
of the commands associated with tracepoints take the tracepoint number
as their argument, to identify which tracepoint to work on.

For each tracepoint, you can specify, in advance, some arbitrary set
of data that you want the target to collect in the trace buffer when
it hits that tracepoint.  The collected data can include registers,
local variables, or global data.  Later, you can use @value{GDBN}
commands to examine the values these data had at the time the
tracepoint was hit.

Tracepoints do not support every breakpoint feature.  Ignore counts on
tracepoints have no effect, and tracepoints cannot run @value{GDBN}
commands when they are hit.  Tracepoints may not be thread-specific
either.

@cindex fast tracepoints
Some targets may support @dfn{fast tracepoints}, which are inserted in
a different way (such as with a jump instead of a trap), that is
faster but possibly restricted in where they may be installed.

@cindex static tracepoints
@cindex markers, static tracepoints
@cindex probing markers, static tracepoints
Regular and fast tracepoints are dynamic tracing facilities, meaning
that they can be used to insert tracepoints at (almost) any location
in the target.  Some targets may also support controlling @dfn{static
tracepoints} from @value{GDBN}.  With static tracing, a set of
instrumentation points, also known as @dfn{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.  @value{GDBN}'s
support for static tracing includes being able to list instrumentation
points, and attach them with @value{GDBN} defined high level
tracepoints that expose the whole range of convenience of
@value{GDBN}'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 @value{GDBN} static tracepoint on an
instrumentation point, or marker, is referred to as @dfn{probing} a
static tracepoint marker.

@code{gdbserver} supports tracepoints on some target systems.
@xref{Server,,Tracepoints support in @code{gdbserver}}.

This section describes commands to set tracepoints and associated
conditions and actions.

@menu
* Create and Delete Tracepoints::
* Enable and Disable Tracepoints::
* Tracepoint Passcounts::
* Tracepoint Conditions::
* Trace State Variables::
* Tracepoint Actions::
* Listing Tracepoints::
* Listing Static Tracepoint Markers::
* Starting and Stopping Trace Experiments::
* Tracepoint Restrictions::
@end menu

@node Create and Delete Tracepoints
@subsection Create and Delete Tracepoints

@table @code
@cindex set tracepoint
@kindex trace
@item trace @var{location}
The @code{trace} command is very similar to the @code{break} command.
Its argument @var{location} can be a source line, a function name, or
an address in the target program.  @xref{Specify Location}.  The
@code{trace} command defines a tracepoint, which is a point in the
target program where the debugger will briefly stop, collect some
data, and then allow the program to continue.  Setting a tracepoint or
changing its actions takes effect immediately if the remote stub
supports the @samp{InstallInTrace} feature (@pxref{install tracepoint
in tracing}).
If remote stub doesn't support the @samp{InstallInTrace} feature, all
these changes don't take effect until the next @code{tstart}
command, and once a trace experiment is running, further changes will
not have any effect until the next trace experiment starts.  In addition,
@value{GDBN} supports @dfn{pending tracepoints}---tracepoints whose
address is not yet resolved.  (This is similar to pending breakpoints.)
Pending tracepoints are not downloaded to the target and not installed
until they are resolved.  The resolution of pending tracepoints requires
@value{GDBN} support---when debugging with the remote target, and
@value{GDBN} disconnects from the remote stub (@pxref{disconnected
tracing}), pending tracepoints can not be resolved (and downloaded to
the remote stub) while @value{GDBN} is disconnected.

Here are some examples of using the @code{trace} command:

@smallexample
(@value{GDBP}) @b{trace foo.c:121}    // a source file and line number

(@value{GDBP}) @b{trace +2}           // 2 lines forward

(@value{GDBP}) @b{trace my_function}  // first source line of function

(@value{GDBP}) @b{trace *my_function} // EXACT start address of function

(@value{GDBP}) @b{trace *0x2117c4}    // an address
@end smallexample

@noindent
You can abbreviate @code{trace} as @code{tr}.

@item trace @var{location} if @var{cond}
Set a tracepoint with condition @var{cond}; evaluate the expression
@var{cond} each time the tracepoint is reached, and collect data only
if the value is nonzero---that is, if @var{cond} evaluates as true.
@xref{Tracepoint Conditions, ,Tracepoint Conditions}, for more
information on tracepoint conditions.

@item ftrace @var{location} [ if @var{cond} ]
@cindex set fast tracepoint
@cindex fast tracepoints, setting
@kindex ftrace
The @code{ftrace} command sets a fast tracepoint.  For targets that
support them, fast tracepoints will use a more efficient but possibly
less general technique to trigger data collection, such as a jump
instruction instead of a trap, or some sort of hardware support.  It
may not be possible to create a fast tracepoint at the desired
location, in which case the command will exit with an explanatory
message.

@value{GDBN} handles arguments to @code{ftrace} exactly as for
@code{trace}.

On 32-bit x86-architecture systems, fast tracepoints normally need to
be placed at an instruction that is 5 bytes or longer, but can be
placed at 4-byte instructions if the low 64K of memory of the target
program is available to install trampolines.  Some Unix-type systems,
such as @sc{gnu}/Linux, exclude low addresses from the program's
address space; but for instance with the Linux kernel it is possible
to let @value{GDBN} use this area by doing a @command{sysctl} command
to set the @code{mmap_min_addr} kernel parameter, as in

@example
sudo sysctl -w vm.mmap_min_addr=32768
@end example

@noindent
which sets the low address to 32K, which leaves plenty of room for
trampolines.  The minimum address should be set to a page boundary.

@item strace @var{location} [ if @var{cond} ]
@cindex set static tracepoint
@cindex static tracepoints, setting
@cindex probe static tracepoint marker
@kindex strace
The @code{strace} command sets a static tracepoint.  For targets that
support it, setting a static tracepoint probes a static
instrumentation point, or marker, found at @var{location}.  It may not
be possible to set a static tracepoint at the desired location, in
which case the command will exit with an explanatory message.

@value{GDBN} handles arguments to @code{strace} exactly as for
@code{trace}, with the addition that the user can also specify
@code{-m @var{marker}} as @var{location}.  This probes the marker
identified by the @var{marker} string identifier.  This identifier
depends on the static tracepoint backend library your program is
using.  You can find all the marker identifiers in the @samp{ID} field
of the @code{info static-tracepoint-markers} command output.
@xref{Listing Static Tracepoint Markers,,Listing Static Tracepoint
Markers}.  For example, in the following small program using the UST
tracing engine:

@smallexample
main ()
@{
  trace_mark(ust, bar33, "str %s", "FOOBAZ");
@}
@end smallexample

@noindent
the marker id is composed of joining the first two arguments to the
@code{trace_mark} call with a slash, which translates to:

@smallexample
(@value{GDBP}) info static-tracepoint-markers
Cnt Enb ID         Address            What
1   n   ust/bar33  0x0000000000400ddc in main at stexample.c:22
         Data: "str %s"
[etc...]
@end smallexample

@noindent
so you may probe the marker above with:

@smallexample
(@value{GDBP}) strace -m ust/bar33
@end smallexample

Static tracepoints accept an extra collect action --- @code{collect
$_sdata}.  This collects arbitrary user data passed in the probe point
call to the tracing library.  In the UST example above, you'll see
that the third argument to @code{trace_mark} is a printf-like format
string.  The user data is then the result of running that formating
string against the following arguments.  Note that @code{info
static-tracepoint-markers} command output lists that format string in
the @samp{Data:} field.

You can inspect this data when analyzing the trace buffer, by printing
the $_sdata variable like any other variable available to
@value{GDBN}.  @xref{Tracepoint Actions,,Tracepoint Action Lists}.

@vindex $tpnum
@cindex last tracepoint number
@cindex recent tracepoint number
@cindex tracepoint number
The convenience variable @code{$tpnum} records the tracepoint number
of the most recently set tracepoint.

@kindex delete tracepoint
@cindex tracepoint deletion
@item delete tracepoint @r{[}@var{num}@r{]}
Permanently delete one or more tracepoints.  With no argument, the
default is to delete all tracepoints.  Note that the regular
@code{delete} command can remove tracepoints also.

Examples:

@smallexample
(@value{GDBP}) @b{delete trace 1 2 3} // remove three tracepoints

(@value{GDBP}) @b{delete trace}       // remove all tracepoints
@end smallexample

@noindent
You can abbreviate this command as @code{del tr}.
@end table

@node Enable and Disable Tracepoints
@subsection Enable and Disable Tracepoints

These commands are deprecated; they are equivalent to plain @code{disable} and @code{enable}.

@table @code
@kindex disable tracepoint
@item disable tracepoint @r{[}@var{num}@r{]}
Disable tracepoint @var{num}, or all tracepoints if no argument
@var{num} is given.  A disabled tracepoint will have no effect during
a trace experiment, but it is not forgotten.  You can re-enable
a disabled tracepoint using the @code{enable tracepoint} command.
If the command is issued during a trace experiment and the debug target
has support for disabling tracepoints during a trace experiment, then the
change will be effective immediately.  Otherwise, it will be applied to the
next trace experiment.

@kindex enable tracepoint
@item enable tracepoint @r{[}@var{num}@r{]}
Enable tracepoint @var{num}, or all tracepoints.  If this command is
issued during a trace experiment and the debug target supports enabling
tracepoints during a trace experiment, then the enabled tracepoints will
become effective immediately.  Otherwise, they will become effective the
next time a trace experiment is run.
@end table

@node Tracepoint Passcounts
@subsection Tracepoint Passcounts

@table @code
@kindex passcount
@cindex tracepoint pass count
@item passcount @r{[}@var{n} @r{[}@var{num}@r{]]}
Set the @dfn{passcount} of a tracepoint.  The passcount is a way to
automatically stop a trace experiment.  If a tracepoint's passcount is
@var{n}, then the trace experiment will be automatically stopped on
the @var{n}'th time that tracepoint is hit.  If the tracepoint number
@var{num} is not specified, the @code{passcount} command sets the
passcount of the most recently defined tracepoint.  If no passcount is
given, the trace experiment will run until stopped explicitly by the
user.

Examples:

@smallexample
(@value{GDBP}) @b{passcount 5 2} // Stop on the 5th execution of
@exdent @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @code{// tracepoint 2}

(@value{GDBP}) @b{passcount 12}  // Stop on the 12th execution of the
@exdent @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @code{// most recently defined tracepoint.}
(@value{GDBP}) @b{trace foo}
(@value{GDBP}) @b{pass 3}
(@value{GDBP}) @b{trace bar}
(@value{GDBP}) @b{pass 2}
(@value{GDBP}) @b{trace baz}
(@value{GDBP}) @b{pass 1}        // Stop tracing when foo has been
@exdent @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @code{// executed 3 times OR when bar has}
@exdent @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @code{// been executed 2 times}
@exdent @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @code{// OR when baz has been executed 1 time.}
@end smallexample
@end table

@node Tracepoint Conditions
@subsection Tracepoint Conditions
@cindex conditional tracepoints
@cindex tracepoint conditions

The simplest sort of tracepoint collects data every time your program
reaches a specified place.  You can also specify a @dfn{condition} for
a tracepoint.  A condition is just a Boolean expression in your
programming language (@pxref{Expressions, ,Expressions}).  A
tracepoint with a condition evaluates the expression each time your
program reaches it, and data collection happens only if the condition
is true.

Tracepoint conditions can be specified when a tracepoint is set, by
using @samp{if} in the arguments to the @code{trace} command.
@xref{Create and Delete Tracepoints, ,Setting Tracepoints}.  They can
also be set or changed at any time with the @code{condition} command,
just as with breakpoints.

Unlike breakpoint conditions, @value{GDBN} does not actually evaluate
the conditional expression itself.  Instead, @value{GDBN} encodes the
expression into an agent expression (@pxref{Agent Expressions})
suitable for execution on the target, independently of @value{GDBN}.
Global variables become raw memory locations, locals become stack
accesses, and so forth.

For instance, suppose you have a function that is usually called
frequently, but should not be called after an error has occurred.  You
could use the following tracepoint command to collect data about calls
of that function that happen while the error code is propagating
through the program; an unconditional tracepoint could end up
collecting thousands of useless trace frames that you would have to
search through.

@smallexample
(@value{GDBP}) @kbd{trace normal_operation if errcode > 0}
@end smallexample

@node Trace State Variables
@subsection Trace State Variables
@cindex trace state variables

A @dfn{trace state variable} is a special type of variable that is
created and managed by target-side code.  The syntax is the same as
that for GDB's convenience variables (a string prefixed with ``$''),
but they are stored on the target.  They must be created explicitly,
using a @code{tvariable} command.  They are always 64-bit signed
integers.

Trace state variables are remembered by @value{GDBN}, 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.

@cindex convenience variables, and trace state variables
Although trace state variables are managed by the target, you can use
them in print commands and expressions as if they were convenience
variables; @value{GDBN} 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 variables with names like @code{$23} or
@code{$pc}, nor can you have a trace state variable and a convenience
variable with the same name.

@table @code

@item tvariable $@var{name} [ = @var{expression} ]
@kindex tvariable
The @code{tvariable} command creates a new trace state variable named
@code{$@var{name}}, and optionally gives it an initial value of
@var{expression}.  The @var{expression} is evaluated when this command is
entered; the result will be converted to an integer if possible,
otherwise @value{GDBN} will report an error. A subsequent
@code{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.

@item info tvariables
@kindex 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.

@item delete tvariable @r{[} $@var{name} @dots{} @r{]}
@kindex delete tvariable
Delete the given trace state variables, or all of them if no arguments
are specified.

@end table

@node Tracepoint Actions
@subsection Tracepoint Action Lists

@table @code
@kindex actions
@cindex tracepoint actions
@item actions @r{[}@var{num}@r{]}
This command will prompt for a list of actions to be taken when the
tracepoint is hit.  If the tracepoint number @var{num} is not
specified, this command sets the actions for the one that was most
recently defined (so that you can define a tracepoint and then say
@code{actions} without bothering about its number).  You specify the
actions themselves on the following lines, one action at a time, and
terminate the actions list with a line containing just @code{end}.  So
far, the only defined actions are @code{collect}, @code{teval}, and
@code{while-stepping}.

@code{actions} is actually equivalent to @code{commands} (@pxref{Break
Commands, ,Breakpoint Command Lists}), except that only the defined
actions are allowed; any other @value{GDBN} command is rejected.

@cindex remove actions from a tracepoint
To remove all actions from a tracepoint, type @samp{actions @var{num}}
and follow it immediately with @samp{end}.

@smallexample
(@value{GDBP}) @b{collect @var{data}} // collect some data

(@value{GDBP}) @b{while-stepping 5} // single-step 5 times, collect data

(@value{GDBP}) @b{end}              // signals the end of actions.
@end smallexample

In the following example, the action list begins with @code{collect}
commands indicating the things to be collected when the tracepoint is
hit.  Then, in order to single-step and collect additional data
following the tracepoint, a @code{while-stepping} command is used,
followed by the list of things to be collected after each step in a
sequence of single steps.  The @code{while-stepping} command is
terminated by its own separate @code{end} command.  Lastly, the action
list is terminated by an @code{end} command.

@smallexample
(@value{GDBP}) @b{trace foo}
(@value{GDBP}) @b{actions}
Enter actions for tracepoint 1, one per line:
> collect bar,baz
> collect $regs
> while-stepping 12
  > collect $pc, arr[i]
  > end
end
@end smallexample

@kindex collect @r{(tracepoints)}
@item collect@r{[}/@var{mods}@r{]} @var{expr1}, @var{expr2}, @dots{}
Collect values of the given expressions when the tracepoint is hit.
This command accepts a comma-separated list of any valid expressions.
In addition to global, static, or local variables, the following
special arguments are supported:

@table @code
@item $regs
Collect all registers.

@item $args
Collect all function arguments.

@item $locals
Collect all local variables.

@item $_ret
Collect the return address.  This is helpful if you want to see more
of a backtrace.

@item $_probe_argc
Collects the number of arguments from the static probe at which the
tracepoint is located.
@xref{Static Probe Points}.

@item $_probe_arg@var{n}
@var{n} is an integer between 0 and 11.  Collects the @var{n}th argument
from the static probe at which the tracepoint is located.
@xref{Static Probe Points}.

@item $_sdata
@vindex $_sdata@r{, collect}
Collect static tracepoint marker specific data.  Only available for
static tracepoints.  @xref{Tracepoint Actions,,Tracepoint Action
Lists}.  On the UST static tracepoints library backend, an
instrumentation point resembles a @code{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
instrumented the program.  Other backends have similar mechanisms.
Here's an example of a UST marker call:

@smallexample
 const char master_name[] = "$your_name";
 trace_mark(channel1, marker1, "hello %s", master_name)
@end smallexample

In this case, collecting @code{$_sdata} collects the string
@samp{hello $yourname}.  When analyzing the trace buffer, you can
inspect @samp{$_sdata} like any other variable available to
@value{GDBN}.
@end table

You can give several consecutive @code{collect} commands, each one
with a single argument, or one @code{collect} command with several
arguments separated by commas; the effect is the same.

The optional @var{mods} changes the usual handling of the arguments.
@code{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
@code{print elements} variable; if @code{s} is followed by a decimal
number, that is the upper bound instead.  So for instance
@samp{collect/s25 mystr} collects as many as 25 characters at
@samp{mystr}.

The command @code{info scope} (@pxref{Symbols, info scope}) is
particularly useful for figuring out what data to collect.

@kindex teval @r{(tracepoints)}
@item teval @var{expr1}, @var{expr2}, @dots{}
Evaluate the given expressions when the tracepoint is hit.  This
command accepts a comma-separated list of expressions.  The results
are discarded, so this is mainly useful for assigning values to trace
state variables (@pxref{Trace State Variables}) without adding those
values to the trace buffer, as would be the case if the @code{collect}
action were used.

@kindex while-stepping @r{(tracepoints)}
@item while-stepping @var{n}
Perform @var{n} single-step instruction traces after the tracepoint,
collecting new data after each step.  The @code{while-stepping}
command is followed by the list of what to collect while stepping
(followed by its own @code{end} command):

@smallexample
> while-stepping 12
  > collect $regs, myglobal
  > end
>
@end smallexample

@noindent
Note that @code{$pc} is not automatically collected by
@code{while-stepping}; you need to explicitly collect that register if
you need it.  You may abbreviate @code{while-stepping} as @code{ws} or
@code{stepping}.

@item set default-collect @var{expr1}, @var{expr2}, @dots{}
@kindex set default-collect
@cindex default collection action
This variable is a list of expressions to collect at each tracepoint
hit.  It is effectively an additional @code{collect} action prepended
to every tracepoint action list.  The expressions are parsed
individually for each tracepoint, so for instance a variable named
@code{xyz} may be interpreted as a global for one tracepoint, and a
local for another, as appropriate to the tracepoint's location.

@item show default-collect
@kindex show default-collect
Show the list of expressions that are collected by default at each
tracepoint hit.

@end table

@node Listing Tracepoints
@subsection Listing Tracepoints

@table @code
@kindex info tracepoints @r{[}@var{n}@dots{}@r{]}
@kindex info tp @r{[}@var{n}@dots{}@r{]}
@cindex information about tracepoints
@item info tracepoints @r{[}@var{num}@dots{}@r{]}
Display information about the tracepoint @var{num}.  If you don't
specify a tracepoint number, displays information about all the
tracepoints defined so far.  The format is similar to that used for
@code{info breakpoints}; in fact, @code{info tracepoints} is the same
command, simply restricting itself to tracepoints.

A tracepoint's listing may include additional information specific to
tracing:

@itemize @bullet
@item
its passcount as given by the @code{passcount @var{n}} command

@item
the state about installed on target of each location
@end itemize

@smallexample
(@value{GDBP}) @b{info trace}
Num     Type           Disp Enb Address    What
1       tracepoint     keep y   0x0804ab57 in foo() at main.cxx:7
        while-stepping 20
          collect globfoo, $regs
        end
        collect globfoo2
        end
        pass count 1200 
2       tracepoint     keep y   <MULTIPLE>
        collect $eip
2.1                         y     0x0804859c in func4 at change-loc.h:35
        installed on target
2.2                         y     0xb7ffc480 in func4 at change-loc.h:35
        installed on target
2.3                         y     <PENDING>  set_tracepoint
3       tracepoint     keep y   0x080485b1 in foo at change-loc.c:29
        not installed on target
(@value{GDBP})
@end smallexample

@noindent
This command can be abbreviated @code{info tp}.
@end table

@node Listing Static Tracepoint Markers
@subsection Listing Static Tracepoint Markers

@table @code
@kindex info static-tracepoint-markers
@cindex information about static tracepoint markers
@item info static-tracepoint-markers
Display information about all static tracepoint markers defined in the
program.

For each marker, the following columns are printed:

@table @emph
@item Count
An incrementing counter, output to help readability.  This is not a
stable identifier.
@item ID
The marker ID, as reported by the target.
@item Enabled or Disabled
Probed markers are tagged with @samp{y}.  @samp{n} identifies marks
that are not enabled.
@item Address
Where the marker is in your program, as a memory address.
@item What
Where the marker is in the source for your program, as a file and line
number.  If the debug information included in the program does not
allow @value{GDBN} to locate the source of the marker, this column
will be left blank.
@end table

@noindent
In addition, the following information may be printed for each marker:

@table @emph
@item Data
User data passed to the tracing library by the marker call.  In the
UST backend, this is the format string passed as argument to the
marker call.
@item Static tracepoints probing the marker
The list of static tracepoints attached to the marker.
@end table

@smallexample
(@value{GDBP}) info static-tracepoint-markers
Cnt ID         Enb Address            What
1   ust/bar2   y   0x0000000000400e1a in main at stexample.c:25
     Data: number1 %d number2 %d
     Probed by static tracepoints: #2
2   ust/bar33  n   0x0000000000400c87 in main at stexample.c:24
     Data: str %s
(@value{GDBP})
@end smallexample
@end table

@node Starting and Stopping Trace Experiments
@subsection Starting and Stopping Trace Experiments

@table @code
@kindex tstart [ @var{notes} ]
@cindex start a new trace experiment
@cindex collected data discarded
@item tstart
This command starts the trace experiment, and begins collecting data.
It has the side effect of discarding all the data collected in the
trace buffer during the previous trace experiment.  If any arguments
are supplied, they are taken as a note and stored with the trace
experiment's state.  The notes may be arbitrary text, and are
especially useful with disconnected tracing in a multi-user context;
the notes can explain what the trace is doing, supply user contact
information, and so forth.

@kindex tstop [ @var{notes} ]
@cindex stop a running trace experiment
@item tstop
This command stops the trace experiment.  If any arguments are
supplied, they are recorded with the experiment as a note.  This is
useful if you are stopping a trace started by someone else, for
instance if the trace is interfering with the system's behavior and
needs to be stopped quickly.

@strong{Note}: a trace experiment and data collection may stop
automatically if any tracepoint's passcount is reached
(@pxref{Tracepoint Passcounts}), or if the trace buffer becomes full.

@kindex tstatus
@cindex status of trace data collection
@cindex trace experiment, status of
@item tstatus
This command displays the status of the current trace data
collection.
@end table

Here is an example of the commands we described so far:

@smallexample
(@value{GDBP}) @b{trace gdb_c_test}
(@value{GDBP}) @b{actions}
Enter actions for tracepoint #1, one per line.
> collect $regs,$locals,$args
> while-stepping 11
  > collect $regs
  > end
> end
(@value{GDBP}) @b{tstart}
	[time passes @dots{}]
(@value{GDBP}) @b{tstop}
@end smallexample

@anchor{disconnected tracing}
@cindex disconnected tracing
You can choose to continue running the trace experiment even if
@value{GDBN} disconnects from the target, voluntarily or
involuntarily.  For commands such as @code{detach}, the debugger will
ask what you want to do with the trace.  But for unexpected
terminations (@value{GDBN} crash, network outage), it would be
unfortunate to lose hard-won trace data, so the variable
@code{disconnected-tracing} lets you decide whether the trace should
continue running without @value{GDBN}.

@table @code
@item set disconnected-tracing on
@itemx set disconnected-tracing off
@kindex set disconnected-tracing
Choose whether a tracing run should continue to run if @value{GDBN}
has disconnected from the target.  Note that @code{detach} or
@code{quit} will ask you directly what to do about a running trace no
matter what this variable's setting, so the variable is mainly useful
for handling unexpected situations, such as loss of the network.

@item show disconnected-tracing
@kindex show disconnected-tracing
Show the current choice for disconnected tracing.

@end table

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.  @value{GDBN} 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 @value{GDBN}, 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.

@cindex circular trace buffer
If your target agent supports a @dfn{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 terminated prematurely because the
buffer is full.  To ask for a circular trace buffer, simply set
@samp{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 effect until
the next run.

@table @code
@item set circular-trace-buffer on
@itemx set circular-trace-buffer off
@kindex set circular-trace-buffer
Choose whether a tracing run should use a linear or circular buffer
for trace data.  A linear buffer will not lose any trace data, but may
fill up prematurely, while a circular buffer will discard old trace
data, but it will have always room for the latest tracepoint hits.

@item show circular-trace-buffer
@kindex show circular-trace-buffer
Show the current choice for the trace buffer.  Note that this may not
match the agent's current buffer handling, nor is it guaranteed to
match the setting that might have been in effect during a past run,
for instance if you are looking at frames from a trace file.

@end table

@table @code
@item set trace-buffer-size @var{n}
@itemx set trace-buffer-size unlimited
@kindex set trace-buffer-size
Request that the target use a trace buffer of @var{n} bytes.  Not all
targets will honor the request; they may have a compiled-in size for
the trace buffer, or some other limitation.  Set to a value of
@code{unlimited} or @code{-1} to let the target use whatever size it
likes.  This is also the default.

@item show trace-buffer-size
@kindex show trace-buffer-size
Show the current requested size for the trace buffer.  Note that this
will only match the actual size if the target supports size-setting,
and was able to handle the requested size.  For instance, if the
target can only change buffer size between runs, this variable will
not reflect the change until the next run starts.  Use @code{tstatus}
to get a report of the actual buffer size.
@end table

@table @code
@item set trace-user @var{text}
@kindex set trace-user

@item show trace-user
@kindex show trace-user

@item set trace-notes @var{text}
@kindex set trace-notes
Set the trace run's notes.

@item show trace-notes
@kindex show trace-notes
Show the trace run's notes.

@item set trace-stop-notes @var{text}
@kindex set trace-stop-notes
Set the trace run's stop notes.  The handling of the note is as for
@code{tstop} arguments; the set command is convenient way to fix a
stop note that is mistaken or incomplete.

@item show trace-stop-notes
@kindex show trace-stop-notes
Show the trace run's stop notes.

@end table

@node Tracepoint Restrictions
@subsection Tracepoint Restrictions

@cindex tracepoint restrictions
There are a number of restrictions on the use of tracepoints.  As
described above, tracepoint data gathering occurs on the target
without interaction from @value{GDBN}.  Thus the full capabilities of
the debugger are not available during data gathering, and then at data
examination time, you will be limited by only having what was
collected.  The following items describe some common problems, but it
is not exhaustive, and you may run into additional difficulties not
mentioned here.

@itemize @bullet

@item
Tracepoint expressions are intended to gather objects (lvalues).  Thus
the full flexibility of GDB's expression evaluator is not available.
You cannot call functions, cast objects to aggregate types, access
convenience variables or modify values (except by assignment to trace
state variables).  Some language features may implicitly call
functions (for instance Objective-C fields with accessors), and therefore
cannot be collected either.

@item
Collection of local variables, either individually or in bulk with
@code{$locals} or @code{$args}, during @code{while-stepping} may
behave erratically.  The stepping action may enter a new scope (for
instance by stepping into a function), or the location of the variable
may change (for instance it is loaded into a register).  The
tracepoint data recorded uses the location information for the
variables that is correct for the tracepoint location.  When the
tracepoint is created, it is not possible, in general, to determine
where the steps of a @code{while-stepping} sequence will advance the
program---particularly if a conditional branch is stepped.

@item
Collection of an incompletely-initialized or partially-destroyed object
may result in something that @value{GDBN} cannot display, or displays
in a misleading way.

@item
When @value{GDBN} displays a pointer to character it automatically
dereferences the pointer to also display characters of the string
being pointed to.  However, collecting the pointer during tracing does
not automatically collect the string.  You need to explicitly
dereference the pointer and provide size information if you want to
collect not only the pointer, but the memory pointed to.  For example,
@code{*ptr@@50} can be used to collect the 50 element array pointed to
by @code{ptr}.

@item
It is not possible to collect a complete stack backtrace at a
tracepoint.  Instead, you may collect the registers and a few hundred
bytes from the stack pointer with something like @code{*(unsigned char *)$esp@@300}
(adjust to use the name of the actual stack pointer register on your
target architecture, and the amount of stack you wish to capture).
Then the @code{backtrace} command will show a partial backtrace when
using a trace frame.  The number of stack frames that can be examined
depends on the sizes of the frames in the collected stack.  Note that
if you ask for a block so large that it goes past the bottom of the
stack, the target agent may report an error trying to read from an
invalid address.

@item
If you do not collect registers at a tracepoint, @value{GDBN} can
infer that the value of @code{$pc} must be the same as the address of
the tracepoint and use that when you are looking at a trace frame
for that tracepoint.  However, this cannot work if the tracepoint has
multiple locations (for instance if it was set in a function that was
inlined), or if it has a @code{while-stepping} loop.  In those cases
@value{GDBN} will warn you that it can't infer @code{$pc}, and default
it to zero.

@end itemize

@node Analyze Collected Data
@section Using the Collected Data

After the tracepoint experiment ends, you use @value{GDBN} commands
for examining the trace data.  The basic idea is that each tracepoint
collects a trace @dfn{snapshot} every time it is hit and another
snapshot every time it single-steps.  All these snapshots are
consecutively numbered from zero and go into a buffer, and you can
examine them later.  The way you examine them is to @dfn{focus} on a
specific trace snapshot.  When the remote stub is focused on a trace
snapshot, it will respond to all @value{GDBN} requests for memory and
registers by reading from the buffer which belongs to that snapshot,
rather than from @emph{real} memory or registers of the program being
debugged.  This means that @strong{all} @value{GDBN} commands
(@code{print}, @code{info registers}, @code{backtrace}, etc.) will
behave as if we were currently debugging the program state as it was
when the tracepoint occurred.  Any requests for data that are not in
the buffer will fail.

@menu
* tfind::                       How to select a trace snapshot
* tdump::                       How to display all data for a snapshot
* save tracepoints::            How to save tracepoints for a future run
@end menu

@node tfind
@subsection @code{tfind @var{n}}

@kindex tfind
@cindex select trace snapshot
@cindex find trace snapshot
The basic command for selecting a trace snapshot from the buffer is
@code{tfind @var{n}}, which finds trace snapshot number @var{n},
counting from zero.  If no argument @var{n} is given, the next
snapshot is selected.

Here are the various forms of using the @code{tfind} command.

@table @code
@item tfind start
Find the first snapshot in the buffer.  This is a synonym for
@code{tfind 0} (since 0 is the number of the first snapshot).

@item tfind none
Stop debugging trace snapshots, resume @emph{live} debugging.

@item tfind end
Same as @samp{tfind none}.

@item tfind
No argument means find the next trace snapshot.

@item tfind -
Find the previous trace snapshot before the current one.  This permits
retracing earlier steps.

@item tfind tracepoint @var{num}
Find the next snapshot associated with tracepoint @var{num}.  Search
proceeds forward from the last examined trace snapshot.  If no
argument @var{num} is given, it means find the next snapshot collected
for the same tracepoint as the current snapshot.

@item tfind pc @var{addr}
Find the next snapshot associated with the value @var{addr} of the
program counter.  Search proceeds forward from the last examined trace
snapshot.  If no argument @var{addr} is given, it means find the next
snapshot with the same value of PC as the current snapshot.

@item tfind outside @var{addr1}, @var{addr2}
Find the next snapshot whose PC is outside the given range of
addresses (exclusive).

@item tfind range @var{addr1}, @var{addr2}
Find the next snapshot whose PC is between @var{addr1} and
@var{addr2} (inclusive).

@item tfind line @r{[}@var{file}:@r{]}@var{n}
Find the next snapshot associated with the source line @var{n}.  If
the optional argument @var{file} is given, refer to line @var{n} in
that source file.  Search proceeds forward from the last examined
trace snapshot.  If no argument @var{n} is given, it means find the
next line other than the one currently being examined; thus saying
@code{tfind line} repeatedly can appear to have the same effect as
stepping from line to line in a @emph{live} debugging session.
@end table

The default arguments for the @code{tfind} commands are specifically
designed to make it easy to scan through the trace buffer.  For
instance, @code{tfind} with no argument selects the next trace
snapshot, and @code{tfind -} with no argument selects the previous
trace snapshot.  So, by giving one @code{tfind} command, and then
simply hitting @key{RET} repeatedly you can examine all the trace
snapshots in order.  Or, by saying @code{tfind -} and then hitting
@key{RET} repeatedly you can examine the snapshots in reverse order.
The @code{tfind line} command with no argument selects the snapshot
for the next source line executed.  The @code{tfind pc} command with
no argument selects the next snapshot with the same program counter
(PC) as the current frame.  The @code{tfind tracepoint} command with
no argument selects the next trace snapshot collected by the same
tracepoint as the current one.

In addition to letting you scan through the trace buffer manually,
these commands make it easy to construct @value{GDBN} scripts that
scan through the trace buffer and print out whatever collected data
you are interested in.  Thus, if we want to examine the PC, FP, and SP
registers from each trace frame in the buffer, we can say this:

@smallexample
(@value{GDBP}) @b{tfind start}
(@value{GDBP}) @b{while ($trace_frame != -1)}
> printf "Frame %d, PC = %08X, SP = %08X, FP = %08X\n", \
          $trace_frame, $pc, $sp, $fp
> tfind
> end

Frame 0, PC = 0020DC64, SP = 0030BF3C, FP = 0030BF44
Frame 1, PC = 0020DC6C, SP = 0030BF38, FP = 0030BF44
Frame 2, PC = 0020DC70, SP = 0030BF34, FP = 0030BF44
Frame 3, PC = 0020DC74, SP = 0030BF30, FP = 0030BF44
Frame 4, PC = 0020DC78, SP = 0030BF2C, FP = 0030BF44
Frame 5, PC = 0020DC7C, SP = 0030BF28, FP = 0030BF44
Frame 6, PC = 0020DC80, SP = 0030BF24, FP = 0030BF44
Frame 7, PC = 0020DC84, SP = 0030BF20, FP = 0030BF44
Frame 8, PC = 0020DC88, SP = 0030BF1C, FP = 0030BF44
Frame 9, PC = 0020DC8E, SP = 0030BF18, FP = 0030BF44
Frame 10, PC = 00203F6C, SP = 0030BE3C, FP = 0030BF14
@end smallexample

Or, if we want to examine the variable @code{X} at each source line in
the buffer:

@smallexample
(@value{GDBP}) @b{tfind start}
(@value{GDBP}) @b{while ($trace_frame != -1)}
> printf "Frame %d, X == %d\n", $trace_frame, X
> tfind line
> end

Frame 0, X = 1
Frame 7, X = 2
Frame 13, X = 255
@end smallexample

@node tdump
@subsection @code{tdump}
@kindex tdump
@cindex dump all data collected at tracepoint
@cindex tracepoint data, display

This command takes no arguments.  It prints all the data collected at
the current trace snapshot.

@smallexample
(@value{GDBP}) @b{trace 444}
(@value{GDBP}) @b{actions}
Enter actions for tracepoint #2, one per line:
> collect $regs, $locals, $args, gdb_long_test
> end

(@value{GDBP}) @b{tstart}

(@value{GDBP}) @b{tfind line 444}
#0  gdb_test (p1=0x11, p2=0x22, p3=0x33, p4=0x44, p5=0x55, p6=0x66)
at gdb_test.c:444
444        printp( "%s: arguments = 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X\n", )

(@value{GDBP}) @b{tdump}
Data collected at tracepoint 2, trace frame 1:
d0             0xc4aa0085       -995491707
d1             0x18     24
d2             0x80     128
d3             0x33     51
d4             0x71aea3d        119204413
d5             0x22     34
d6             0xe0     224
d7             0x380035 3670069
a0             0x19e24a 1696330
a1             0x3000668        50333288
a2             0x100    256
a3             0x322000 3284992
a4             0x3000698        50333336
a5             0x1ad3cc 1758156
fp             0x30bf3c 0x30bf3c
sp             0x30bf34 0x30bf34
ps             0x0      0
pc             0x20b2c8 0x20b2c8
fpcontrol      0x0      0
fpstatus       0x0      0
fpiaddr        0x0      0
p = 0x20e5b4 "gdb-test"
p1 = (void *) 0x11
p2 = (void *) 0x22
p3 = (void *) 0x33
p4 = (void *) 0x44
p5 = (void *) 0x55
p6 = (void *) 0x66
gdb_long_test = 17 '\021'

(@value{GDBP})
@end smallexample

@code{tdump} works by scanning the tracepoint's current collection
actions and printing the value of each expression listed.  So
@code{tdump} can fail, if after a run, you change the tracepoint's
actions to mention variables that were not collected during the run.

Also, for tracepoints with @code{while-stepping} loops, @code{tdump}
uses the collected value of @code{$pc} to distinguish between trace
frames that were collected at the tracepoint hit, and frames that were
collected while stepping.  This allows it to correctly choose whether
to display the basic list of collections, or the collections from the
body of the while-stepping loop.  However, if @code{$pc} was not collected,
then @code{tdump} will always attempt to dump using the basic collection
list, and may fail if a while-stepping frame does not include all the
same data that is collected at the tracepoint hit.
@c This is getting pretty arcane, example would be good.

@node save tracepoints
@subsection @code{save tracepoints @var{filename}}
@kindex save tracepoints
@kindex save-tracepoints
@cindex save tracepoints for future sessions

This command saves all current tracepoint definitions together with
their actions and passcounts, into a file @file{@var{filename}}
suitable for use in a later debugging session.  To read the saved
tracepoint definitions, use the @code{source} command (@pxref{Command
Files}).  The @w{@code{save-tracepoints}} command is a deprecated
alias for @w{@code{save tracepoints}}

@node Tracepoint Variables
@section Convenience Variables for Tracepoints
@cindex tracepoint variables
@cindex convenience variables for tracepoints

@table @code
@vindex $trace_frame
@item (int) $trace_frame
The current trace snapshot (a.k.a.@: @dfn{frame}) number, or -1 if no
snapshot is selected.

@vindex $tracepoint
@item (int) $tracepoint
The tracepoint for the current trace snapshot.

@vindex $trace_line
@item (int) $trace_line
The line number for the current trace snapshot.

@vindex $trace_file
@item (char []) $trace_file
The source file for the current trace snapshot.

@vindex $trace_func
@item (char []) $trace_func
The name of the function containing @code{$tracepoint}.
@end table

Note: @code{$trace_file} is not suitable for use in @code{printf},
use @code{output} instead.

Here's a simple example of using these convenience variables for
stepping through all the trace snapshots and printing some of their
data.  Note that these are not the same as trace state variables,
which are managed by the target.

@smallexample
(@value{GDBP}) @b{tfind start}

(@value{GDBP}) @b{while $trace_frame != -1}
> output $trace_file
> printf ", line %d (tracepoint #%d)\n", $trace_line, $tracepoint
> tfind
> end
@end smallexample

@node Trace Files
@section Using Trace Files
@cindex trace files

In some situations, the target running a trace experiment may no
longer be available; perhaps it crashed, or the hardware was needed
for a different activity.  To handle these cases, you can arrange to
dump the trace data into a file, and later use that file as a source
of trace data, via the @code{target tfile} command.

@table @code

@kindex tsave
@item tsave [ -r ] @var{filename}
@itemx tsave [-ctf] @var{dirname}
Save the trace data to @var{filename}.  By default, this command
assumes that @var{filename} refers to the host filesystem, so if
necessary @value{GDBN} will copy raw trace data up from the target and
then save it.  If the target supports it, you can also supply the
optional argument @code{-r} (``remote'') to direct the target to save
the data directly into @var{filename} in its own filesystem, which may be
more efficient if the trace buffer is very large.  (Note, however, that
@code{target tfile} can only read from files accessible to the host.)
By default, this command will save trace frame in tfile format.
You can supply the optional argument @code{-ctf} to save date in CTF
format.  The @dfn{Common Trace Format} (CTF) is proposed as a trace format
that can be shared by multiple debugging and tracing tools.  Please go to
@indicateurl{http://www.efficios.com/ctf} to get more information.

@kindex target tfile
@kindex tfile
@kindex target ctf
@kindex ctf
@item target tfile @var{filename}
@itemx target ctf @var{dirname}
Use the file named @var{filename} or directory named @var{dirname} as
a source of trace data.  Commands that examine data work as they do with
a live target, but it is not possible to run any new trace experiments.
@code{tstatus} will report the state of the trace run at the moment
the data was saved, as well as the current trace frame you are examining.
Both @var{filename} and @var{dirname} must be on a filesystem accessible to
the host.

@smallexample
(@value{GDBP}) target ctf ctf.ctf
(@value{GDBP}) tfind
Found trace frame 0, tracepoint 2
39            ++a;  /* set tracepoint 1 here */
(@value{GDBP}) tdump
Data collected at tracepoint 2, trace frame 0:
i = 0
a = 0
b = 1 '\001'
c = @{"123", "456", "789", "123", "456", "789"@}
d = @{@{@{a = 1, b = 2@}, @{a = 3, b = 4@}@}, @{@{a = 5, b = 6@}, @{a = 7, b = 8@}@}@}
(@value{GDBP}) p b
$1 = 1
@end smallexample

@end table

@node Overlays
@chapter Debugging Programs That Use Overlays
@cindex overlays

If your program is too large to fit completely in your target system's
memory, you can sometimes use @dfn{overlays} to work around this
problem.  @value{GDBN} provides some support for debugging programs that
use overlays.

@menu
* How Overlays Work::              A general explanation of overlays.
* Overlay Commands::               Managing overlays in @value{GDBN}.
* Automatic Overlay Debugging::    @value{GDBN} can find out which overlays are
                                   mapped by asking the inferior.
* Overlay Sample Program::         A sample program using overlays.
@end menu

@node How Overlays Work
@section How Overlays Work
@cindex mapped overlays
@cindex unmapped overlays
@cindex load address, overlay's
@cindex mapped address
@cindex overlay area

Suppose you have a computer whose instruction address space is only 64
kilobytes long, but which has much more memory which can be accessed by
other means: special instructions, segment registers, or memory
management hardware, for example.  Suppose further that you want to
adapt a program which is larger than 64 kilobytes to run on this system.

One solution is to identify modules of your program which are relatively
independent, and need not call each other directly; call these modules
@dfn{overlays}.  Separate the overlays from the main program, and place
their machine code in the larger memory.  Place your main program in
instruction memory, but leave at least enough space there to hold the
largest overlay as well.

Now, to call a function located in an overlay, you must first copy that
overlay's machine code from the large memory into the space set aside
for it in the instruction memory, and then jump to its entry point
there.

@c NB:  In the below the mapped area's size is greater or equal to the
@c size of all overlays.  This is intentional to remind the developer
@c that overlays don't necessarily need to be the same size.

@smallexample
@group
    Data             Instruction            Larger
Address Space       Address Space        Address Space
+-----------+       +-----------+        +-----------+
|           |       |           |        |           |
+-----------+       +-----------+        +-----------+<-- overlay 1
| program   |       |   main    |   .----| overlay 1 | load address
| variables |       |  program  |   |    +-----------+
| and heap  |       |           |   |    |           |
+-----------+       |           |   |    +-----------+<-- overlay 2
|           |       +-----------+   |    |           | load address
+-----------+       |           |   |  .-| overlay 2 |
                    |           |   |  | |           |
         mapped --->+-----------+   |  | +-----------+
         address    |           |   |  | |           |
                    |  overlay  | <-'  | |           |
                    |   area    |  <---' +-----------+<-- overlay 3
                    |           | <---.  |           | load address
                    +-----------+     `--| overlay 3 |
                    |           |        |           |
                    +-----------+        |           |
                                         +-----------+
                                         |           |
                                         +-----------+

                    @anchor{A code overlay}A code overlay
@end group
@end smallexample

The diagram (@pxref{A code overlay}) shows a system with separate data
and instruction address spaces.  To map an overlay, the program copies
its code from the larger address space to the instruction address space.
Since the overlays shown here all use the same mapped address, only one
may be mapped at a time.  For a system with a single address space for
data and instructions, the diagram would be similar, except that the
program variables and heap would share an address space with the main
program and the overlay area.

An overlay loaded into instruction memory and ready for use is called a
@dfn{mapped} overlay; its @dfn{mapped address} is its address in the
instruction memory.  An overlay not present (or only partially present)
in instruction memory is called @dfn{unmapped}; its @dfn{load address}
is its address in the larger memory.  The mapped address is also called
the @dfn{virtual memory address}, or @dfn{VMA}; the load address is also
called the @dfn{load memory address}, or @dfn{LMA}.

Unfortunately, overlays are not a completely transparent way to adapt a
program to limited instruction memory.  They introduce a new set of
global constraints you must keep in mind as you design your program:

@itemize @bullet

@item
Before calling or returning to a function in an overlay, your program
must make sure that overlay is actually mapped.  Otherwise, the call or
return will transfer control to the right address, but in the wrong
overlay, and your program will probably crash.

@item
If the process of mapping an overlay is expensive on your system, you
will need to choose your overlays carefully to minimize their effect on
your program's performance.

@item
The executable file you load onto your system must contain each
overlay's instructions, appearing at the overlay's load address, not its
mapped address.  However, each overlay's instructions must be relocated
and its symbols defined as if the overlay were at its mapped address.
You can use GNU linker scripts to specify different load and relocation
addresses for pieces of your program; see @ref{Overlay Description,,,
ld.info, Using ld: the GNU linker}.

@item
The procedure for loading executable files onto your system must be able
to load their contents into the larger address space as well as the
instruction and data spaces.

@end itemize

The overlay system described above is rather simple, and could be
improved in many ways:

@itemize @bullet

@item
If your system has suitable bank switch registers or memory management
hardware, you could use those facilities to make an overlay's load area
contents simply appear at their mapped address in instruction space.
This would probably be faster than copying the overlay to its mapped
area in the usual way.

@item
If your overlays are small enough, you could set aside more than one
overlay area, and have more than one overlay mapped at a time.

@item
You can use overlays to manage data, as well as instructions.  In
general, data overlays are even less transparent to your design than
code overlays: whereas code overlays only require care when you call or
return to functions, data overlays require care every time you access
the data.  Also, if you change the contents of a data overlay, you
must copy its contents back out to its load address before you can copy a
different data overlay into the same mapped area.

@end itemize


@node Overlay Commands
@section Overlay Commands

To use @value{GDBN}'s overlay support, each overlay in your program must
correspond to a separate section of the executable file.  The section's
virtual memory address and load memory address must be the overlay's
mapped and load addresses.  Identifying overlays with sections allows
@value{GDBN} to determine the appropriate address of a function or
variable, depending on whether the overlay is mapped or not.

@value{GDBN}'s overlay commands all start with the word @code{overlay};
you can abbreviate this as @code{ov} or @code{ovly}.  The commands are:

@table @code
@item overlay off
@kindex overlay
Disable @value{GDBN}'s overlay support.  When overlay support is
disabled, @value{GDBN} assumes that all functions and variables are
always present at their mapped addresses.  By default, @value{GDBN}'s
overlay support is disabled.

@item overlay manual
@cindex manual overlay debugging
Enable @dfn{manual} overlay debugging.  In this mode, @value{GDBN}
relies on you to tell it which overlays are mapped, and which are not,
using the @code{overlay map-overlay} and @code{overlay unmap-overlay}
commands described below.

@item overlay map-overlay @var{overlay}
@itemx overlay map @var{overlay}
@cindex map an overlay
Tell @value{GDBN} that @var{overlay} is now mapped; @var{overlay} must
be the name of the object file section containing the overlay.  When an
overlay is mapped, @value{GDBN} assumes it can find the overlay's
functions and variables at their mapped addresses.  @value{GDBN} assumes
that any other overlays whose mapped ranges overlap that of
@var{overlay} are now unmapped.

@item overlay unmap-overlay @var{overlay}
@itemx overlay unmap @var{overlay}
@cindex unmap an overlay
Tell @value{GDBN} that @var{overlay} is no longer mapped; @var{overlay}
must be the name of the object file section containing the overlay.
When an overlay is unmapped, @value{GDBN} assumes it can find the
overlay's functions and variables at their load addresses.

@item overlay auto
Enable @dfn{automatic} overlay debugging.  In this mode, @value{GDBN}
consults a data structure the overlay manager maintains in the inferior
to see which overlays are mapped.  For details, see @ref{Automatic
Overlay Debugging}.

@item overlay load-target
@itemx overlay load
@cindex reloading the overlay table
Re-read the overlay table from the inferior.  Normally, @value{GDBN}
re-reads the table @value{GDBN} automatically each time the inferior
stops, so this command should only be necessary if you have changed the
overlay mapping yourself using @value{GDBN}.  This command is only
useful when using automatic overlay debugging.

@item overlay list-overlays
@itemx overlay list
@cindex listing mapped overlays
Display a list of the overlays currently mapped, along with their mapped
addresses, load addresses, and sizes.

@end table

Normally, when @value{GDBN} prints a code address, it includes the name
of the function the address falls in:

@smallexample
(@value{GDBP}) print main
$3 = @{int ()@} 0x11a0 <main>
@end smallexample
@noindent
When overlay debugging is enabled, @value{GDBN} recognizes code in
unmapped overlays, and prints the names of unmapped functions with
asterisks around them.  For example, if @code{foo} is a function in an
unmapped overlay, @value{GDBN} prints it this way:

@smallexample
(@value{GDBP}) overlay list
No sections are mapped.
(@value{GDBP}) print foo
$5 = @{int (int)@} 0x100000 <*foo*>
@end smallexample
@noindent
When @code{foo}'s overlay is mapped, @value{GDBN} prints the function's
name normally:

@smallexample
(@value{GDBP}) overlay list
Section .ov.foo.text, loaded at 0x100000 - 0x100034,
        mapped at 0x1016 - 0x104a
(@value{GDBP}) print foo
$6 = @{int (int)@} 0x1016 <foo>
@end smallexample

When overlay debugging is enabled, @value{GDBN} can find the correct
address for functions and variables in an overlay, whether or not the
overlay is mapped.  This allows most @value{GDBN} commands, like
@code{break} and @code{disassemble}, to work normally, even on unmapped
code.  However, @value{GDBN}'s breakpoint support has some limitations:

@itemize @bullet
@item
@cindex breakpoints in overlays
@cindex overlays, setting breakpoints in
You can set breakpoints in functions in unmapped overlays, as long as
@value{GDBN} can write to the overlay at its load address.
@item
@value{GDBN} can not set hardware or simulator-based breakpoints in
unmapped overlays.  However, if you set a breakpoint at the end of your
overlay manager (and tell @value{GDBN} which overlays are now mapped, if
you are using manual overlay management), @value{GDBN} will re-set its
breakpoints properly.
@end itemize


@node Automatic Overlay Debugging
@section Automatic Overlay Debugging
@cindex automatic overlay debugging

@value{GDBN} can automatically track which overlays are mapped and which
are not, given some simple co-operation from the overlay manager in the
inferior.  If you enable automatic overlay debugging with the
@code{overlay auto} command (@pxref{Overlay Commands}), @value{GDBN}
looks in the inferior's memory for certain variables describing the
current state of the overlays.

Here are the variables your overlay manager must define to support
@value{GDBN}'s automatic overlay debugging:

@table @asis

@item @code{_ovly_table}:
This variable must be an array of the following structures:

@smallexample
struct
@{
  /* The overlay's mapped address.  */
  unsigned long vma;

  /* The size of the overlay, in bytes.  */
  unsigned long size;

  /* The overlay's load address.  */
  unsigned long lma;

  /* Non-zero if the overlay is currently mapped;
     zero otherwise.  */
  unsigned long mapped;
@}
@end smallexample

@item @code{_novlys}:
This variable must be a four-byte signed integer, holding the total
number of elements in @code{_ovly_table}.

@end table

To decide whether a particular overlay is mapped or not, @value{GDBN}
looks for an entry in @w{@code{_ovly_table}} whose @code{vma} and
@code{lma} members equal the VMA and LMA of the overlay's section in the
executable file.  When @value{GDBN} finds a matching entry, it consults
the entry's @code{mapped} member to determine whether the overlay is
currently mapped.

In addition, your overlay manager may define a function called
@code{_ovly_debug_event}.  If this function is defined, @value{GDBN}
will silently set a breakpoint there.  If the overlay manager then
calls this function whenever it has changed the overlay table, this
will enable @value{GDBN} to accurately keep track of which overlays
are in program memory, and update any breakpoints that may be set
in overlays.  This will allow breakpoints to work even if the
overlays are kept in ROM or other non-writable memory while they
are not being executed.

@node Overlay Sample Program
@section Overlay Sample Program
@cindex overlay example program

When linking a program which uses overlays, you must place the overlays
at their load addresses, while relocating them to run at their mapped
addresses.  To do this, you must write a linker script (@pxref{Overlay
Description,,, ld.info, Using ld: the GNU linker}).  Unfortunately,
since linker scripts are specific to a particular host system, target
architecture, and target memory layout, this manual cannot provide
portable sample code demonstrating @value{GDBN}'s overlay support.

However, the @value{GDBN} source distribution does contain an overlaid
program, with linker scripts for a few systems, as part of its test
suite.  The program consists of the following files from
@file{gdb/testsuite/gdb.base}:

@table @file
@item overlays.c
The main program file.
@item ovlymgr.c
A simple overlay manager, used by @file{overlays.c}.
@item foo.c
@itemx bar.c
@itemx baz.c
@itemx grbx.c
Overlay modules, loaded and used by @file{overlays.c}.
@item d10v.ld
@itemx m32r.ld
Linker scripts for linking the test program on the @code{d10v-elf}
and @code{m32r-elf} targets.
@end table

You can build the test program using the @code{d10v-elf} GCC
cross-compiler like this:

@smallexample
$ d10v-elf-gcc -g -c overlays.c
$ d10v-elf-gcc -g -c ovlymgr.c
$ d10v-elf-gcc -g -c foo.c
$ d10v-elf-gcc -g -c bar.c
$ d10v-elf-gcc -g -c baz.c
$ d10v-elf-gcc -g -c grbx.c
$ d10v-elf-gcc -g overlays.o ovlymgr.o foo.o bar.o \
                  baz.o grbx.o -Wl,-Td10v.ld -o overlays
@end smallexample

The build process is identical for any other architecture, except that
you must substitute the appropriate compiler and linker script for the
target system for @code{d10v-elf-gcc} and @code{d10v.ld}.


@node Languages
@chapter Using @value{GDBN} with Different Languages
@cindex languages

Although programming languages generally have common aspects, they are
rarely expressed in the same manner.  For instance, in ANSI C,
dereferencing a pointer @code{p} is accomplished by @code{*p}, but in
Modula-2, it is accomplished by @code{p^}.  Values can also be
represented (and displayed) differently.  Hex numbers in C appear as
@samp{0x1ae}, while in Modula-2 they appear as @samp{1AEH}.

@cindex working language
Language-specific information is built into @value{GDBN} for some languages,
allowing you to express operations like the above in your program's
native language, and allowing @value{GDBN} to output values in a manner
consistent with the syntax of your program's native language.  The
language you use to build expressions is called the @dfn{working
language}.

@menu
* Setting::                     Switching between source languages
* Show::                        Displaying the language
* Checks::                      Type and range checks
* Supported Languages::         Supported languages
* Unsupported Languages::       Unsupported languages
@end menu

@node Setting
@section Switching Between Source Languages

There are two ways to control the working language---either have @value{GDBN}
set it automatically, or select it manually yourself.  You can use the
@code{set language} command for either purpose.  On startup, @value{GDBN}
defaults to setting the language automatically.  The working language is
used to determine how expressions you type are interpreted, how values
are printed, etc.

In addition to the working language, every source file that
@value{GDBN} knows about has its own working language.  For some object
file formats, the compiler might indicate which language a particular
source file is in.  However, most of the time @value{GDBN} infers the
language from the name of the file.  The language of a source file
controls whether C@t{++} names are demangled---this way @code{backtrace} can
show each frame appropriately for its own language.  There is no way to
set the language of a source file from within @value{GDBN}, but you can
set the language associated with a filename extension.  @xref{Show, ,
Displaying the Language}.

This is most commonly a problem when you use a program, such
as @code{cfront} or @code{f2c}, that generates C but is written in
another language.  In that case, make the
program use @code{#line} directives in its C output; that way
@value{GDBN} will know the correct language of the source code of the original
program, and will display that source code, not the generated C code.

@menu
* Filenames::                   Filename extensions and languages.
* Manually::                    Setting the working language manually
* Automatically::               Having @value{GDBN} infer the source language
@end menu

@node Filenames
@subsection List of Filename Extensions and Languages

If a source file name ends in one of the following extensions, then
@value{GDBN} infers that its language is the one indicated.

@table @file
@item .ada
@itemx .ads
@itemx .adb
@itemx .a
Ada source file.

@item .c
C source file

@item .C
@itemx .cc
@itemx .cp
@itemx .cpp
@itemx .cxx
@itemx .c++
C@t{++} source file

@item .d
D source file

@item .m
Objective-C source file

@item .f
@itemx .F
Fortran source file

@item .mod
Modula-2 source file

@item .s
@itemx .S
Assembler source file.  This actually behaves almost like C, but
@value{GDBN} does not skip over function prologues when stepping.
@end table

In addition, you may set the language associated with a filename
extension.  @xref{Show, , Displaying the Language}.

@node Manually
@subsection Setting the Working Language

If you allow @value{GDBN} to set the language automatically,
expressions are interpreted the same way in your debugging session and
your program.

@kindex set language
If you wish, you may set the language manually.  To do this, issue the
command @samp{set language @var{lang}}, where @var{lang} is the name of
a language, such as
@code{c} or @code{modula-2}.
For a list of the supported languages, type @samp{set language}.

Setting the language manually prevents @value{GDBN} from updating the working
language automatically.  This can lead to confusion if you try
to debug a program when the working language is not the same as the
source language, when an expression is acceptable to both
languages---but means different things.  For instance, if the current
source file were written in C, and @value{GDBN} was parsing Modula-2, a
command such as:

@smallexample
print a = b + c
@end smallexample

@noindent
might not have the effect you intended.  In C, this means to add
@code{b} and @code{c} and place the result in @code{a}.  The result
printed would be the value of @code{a}.  In Modula-2, this means to compare
@code{a} to the result of @code{b+c}, yielding a @code{BOOLEAN} value.

@node Automatically
@subsection Having @value{GDBN} Infer the Source Language

To have @value{GDBN} set the working language automatically, use
@samp{set language local} or @samp{set language auto}.  @value{GDBN}
then infers the working language.  That is, when your program stops in a
frame (usually by encountering a breakpoint), @value{GDBN} sets the
working language to the language recorded for the function in that
frame.  If the language for a frame is unknown (that is, if the function
or block corresponding to the frame was defined in a source file that
does not have a recognized extension), the current working language is
not changed, and @value{GDBN} issues a warning.

This may not seem necessary for most programs, which are written
entirely in one source language.  However, program modules and libraries
written in one source language can be used by a main program written in
a different source language.  Using @samp{set language auto} in this
case frees you from having to set the working language manually.

@node Show
@section Displaying the Language

The following commands help you find out which language is the
working language, and also what language source files were written in.

@table @code
@item show language
@anchor{show language}
@kindex show language
Display the current working language.  This is the
language you can use with commands such as @code{print} to
build and compute expressions that may involve variables in your program.

@item info frame
@kindex info frame@r{, show the source language}
Display the source language for this frame.  This language becomes the
working language if you use an identifier from this frame.
@xref{Frame Info, ,Information about a Frame}, to identify the other
information listed here.

@item info source
@kindex info source@r{, show the source language}
Display the source language of this source file.
@xref{Symbols, ,Examining the Symbol Table}, to identify the other
information listed here.
@end table

In unusual circumstances, you may have source files with extensions
not in the standard list.  You can then set the extension associated
with a language explicitly:

@table @code
@item set extension-language @var{ext} @var{language}
@kindex set extension-language
Tell @value{GDBN} that source files with extension @var{ext} are to be
assumed as written in the source language @var{language}.

@item info extensions
@kindex info extensions
List all the filename extensions and the associated languages.
@end table

@node Checks
@section Type and Range Checking

Some languages are designed to guard you against making seemingly common
errors through a series of compile- and run-time checks.  These include
checking the type of arguments to functions and operators and making
sure mathematical overflows are caught at run time.  Checks such as
these help to ensure a program's correctness once it has been compiled
by eliminating type mismatches and providing active checks for range
errors when your program is running.

By default @value{GDBN} checks for these errors according to the
rules of the current source language.  Although @value{GDBN} does not check
the statements in your program, it can check expressions entered directly
into @value{GDBN} for evaluation via the @code{print} command, for example.

@menu
* Type Checking::               An overview of type checking
* Range Checking::              An overview of range checking
@end menu

@cindex type checking
@cindex checks, type
@node Type Checking
@subsection An Overview of Type Checking

Some languages, such as C and C@t{++}, are strongly typed, meaning that the
arguments to operators and functions have to be of the correct type,
otherwise an error occurs.  These checks prevent type mismatch
errors from ever causing any run-time problems.  For example,

@smallexample
int klass::my_method(char *b) @{ return  b ? 1 : 2; @}

(@value{GDBP}) print obj.my_method (0)
$1 = 2
@exdent but
(@value{GDBP}) print obj.my_method (0x1234)
Cannot resolve method klass::my_method to any overloaded instance
@end smallexample

The second example fails because in C@t{++} the integer constant
@samp{0x1234} is not type-compatible with the pointer parameter type.

For the expressions you use in @value{GDBN} commands, you can tell
@value{GDBN} to not enforce strict type checking or
to treat any mismatches as errors and abandon the expression;
When type checking is disabled, @value{GDBN} successfully evaluates
expressions like the second example above.

Even if type checking is off, there may be other reasons
related to type that prevent @value{GDBN} from evaluating an expression.
For instance, @value{GDBN} does not know how to add an @code{int} and
a @code{struct foo}.  These particular type errors have nothing to do
with the language in use and usually arise from expressions which make
little sense to evaluate anyway.

@value{GDBN} provides some additional commands for controlling type checking:

@kindex set check type
@kindex show check type
@table @code
@item set check type on
@itemx set check type off
Set strict type checking on or off.  If any type mismatches occur in
evaluating an expression while type checking is on, @value{GDBN} prints a
message and aborts evaluation of the expression.

@item show check type
Show the current setting of type checking and whether @value{GDBN}
is enforcing strict type checking rules.
@end table

@cindex range checking
@cindex checks, range
@node Range Checking
@subsection An Overview of Range Checking

In some languages (such as Modula-2), it is an error to exceed the
bounds of a type; this is enforced with run-time checks.  Such range
checking is meant to ensure program correctness by making sure
computations do not overflow, or indices on an array element access do
not exceed the bounds of the array.

For expressions you use in @value{GDBN} commands, you can tell
@value{GDBN} to treat range errors in one of three ways: ignore them,
always treat them as errors and abandon the expression, or issue
warnings but evaluate the expression anyway.

A range error can result from numerical overflow, from exceeding an
array index bound, or when you type a constant that is not a member
of any type.  Some languages, however, do not treat overflows as an
error.  In many implementations of C, mathematical overflow causes the
result to ``wrap around'' to lower values---for example, if @var{m} is
the largest integer value, and @var{s} is the smallest, then

@smallexample
@var{m} + 1 @result{} @var{s}
@end smallexample

This, too, is specific to individual languages, and in some cases
specific to individual compilers or machines.  @xref{Supported Languages, ,
Supported Languages}, for further details on specific languages.

@value{GDBN} provides some additional commands for controlling the range checker:

@kindex set check range
@kindex show check range
@table @code
@item set check range auto
Set range checking on or off based on the current working language.
@xref{Supported Languages, ,Supported Languages}, for the default settings for
each language.

@item set check range on
@itemx set check range off
Set range checking on or off, overriding the default setting for the
current working language.  A warning is issued if the setting does not
match the language default.  If a range error occurs and range checking is on,
then a message is printed and evaluation of the expression is aborted.

@item set check range warn
Output messages when the @value{GDBN} range checker detects a range error,
but attempt to evaluate the expression anyway.  Evaluating the
expression may still be impossible for other reasons, such as accessing
memory that the process does not own (a typical example from many Unix
systems).

@item show range
Show the current setting of the range checker, and whether or not it is
being set automatically by @value{GDBN}.
@end table

@node Supported Languages
@section Supported Languages

@value{GDBN} supports C, C@t{++}, D, Go, Objective-C, Fortran, Java,
OpenCL C, Pascal, assembly, Modula-2, and Ada.
@c This is false ...
Some @value{GDBN} features may be used in expressions regardless of the
language you use: the @value{GDBN} @code{@@} and @code{::} operators,
and the @samp{@{type@}addr} construct (@pxref{Expressions,
,Expressions}) can be used with the constructs of any supported
language.

The following sections detail to what degree each source language is
supported by @value{GDBN}.  These sections are not meant to be language
tutorials or references, but serve only as a reference guide to what the
@value{GDBN} expression parser accepts, and what input and output
formats should look like for different languages.  There are many good
books written on each of these languages; please look to these for a
language reference or tutorial.

@menu
* C::                           C and C@t{++}
* D::                           D
* Go::                          Go
* Objective-C::                 Objective-C
* OpenCL C::                    OpenCL C
* Fortran::                     Fortran
* Pascal::                      Pascal
* Modula-2::                    Modula-2
* Ada::                         Ada
@end menu

@node C
@subsection C and C@t{++}

@cindex C and C@t{++}
@cindex expressions in C or C@t{++}

Since C and C@t{++} are so closely related, many features of @value{GDBN} apply
to both languages.  Whenever this is the case, we discuss those languages
together.

@cindex C@t{++}
@cindex @code{g++}, @sc{gnu} C@t{++} compiler
@cindex @sc{gnu} C@t{++}
The C@t{++} debugging facilities are jointly implemented by the C@t{++}
compiler and @value{GDBN}.  Therefore, to debug your C@t{++} code
effectively, you must compile your C@t{++} programs with a supported
C@t{++} compiler, such as @sc{gnu} @code{g++}, or the HP ANSI C@t{++}
compiler (@code{aCC}).

@menu
* C Operators::                 C and C@t{++} operators
* C Constants::                 C and C@t{++} constants
* C Plus Plus Expressions::     C@t{++} expressions
* C Defaults::                  Default settings for C and C@t{++}
* C Checks::                    C and C@t{++} type and range checks
* Debugging C::                 @value{GDBN} and C
* Debugging C Plus Plus::       @value{GDBN} features for C@t{++}
* Decimal Floating Point::      Numbers in Decimal Floating Point format
@end menu

@node C Operators
@subsubsection C and C@t{++} Operators

@cindex C and C@t{++} operators

Operators must be defined on values of specific types.  For instance,
@code{+} is defined on numbers, but not on structures.  Operators are
often defined on groups of types.

For the purposes of C and C@t{++}, the following definitions hold:

@itemize @bullet

@item
@emph{Integral types} include @code{int} with any of its storage-class
specifiers; @code{char}; @code{enum}; and, for C@t{++}, @code{bool}.

@item
@emph{Floating-point types} include @code{float}, @code{double}, and
@code{long double} (if supported by the target platform).

@item
@emph{Pointer types} include all types defined as @code{(@var{type} *)}.

@item
@emph{Scalar types} include all of the above.

@end itemize

@noindent
The following operators are supported.  They are listed here
in order of increasing precedence:

@table @code
@item ,
The comma or sequencing operator.  Expressions in a comma-separated list
are evaluated from left to right, with the result of the entire
expression being the last expression evaluated.

@item =
Assignment.  The value of an assignment expression is the value
assigned.  Defined on scalar types.

@item @var{op}=
Used in an expression of the form @w{@code{@var{a} @var{op}= @var{b}}},
and translated to @w{@code{@var{a} = @var{a op b}}}.
@w{@code{@var{op}=}} and @code{=} have the same precedence.  The operator
@var{op} is any one of the operators @code{|}, @code{^}, @code{&},
@code{<<}, @code{>>}, @code{+}, @code{-}, @code{*}, @code{/}, @code{%}.

@item ?:
The ternary operator.  @code{@var{a} ? @var{b} : @var{c}} can be thought
of as:  if @var{a} then @var{b} else @var{c}.  The argument @var{a}
should be of an integral type.

@item ||
Logical @sc{or}.  Defined on integral types.

@item &&
Logical @sc{and}.  Defined on integral types.

@item |
Bitwise @sc{or}.  Defined on integral types.

@item ^
Bitwise exclusive-@sc{or}.  Defined on integral types.

@item &
Bitwise @sc{and}.  Defined on integral types.

@item ==@r{, }!=
Equality and inequality.  Defined on scalar types.  The value of these
expressions is 0 for false and non-zero for true.

@item <@r{, }>@r{, }<=@r{, }>=
Less than, greater than, less than or equal, greater than or equal.
Defined on scalar types.  The value of these expressions is 0 for false
and non-zero for true.

@item <<@r{, }>>
left shift, and right shift.  Defined on integral types.

@item @@
The @value{GDBN} ``artificial array'' operator (@pxref{Expressions, ,Expressions}).

@item +@r{, }-
Addition and subtraction.  Defined on integral types, floating-point types and
pointer types.

@item *@r{, }/@r{, }%
Multiplication, division, and modulus.  Multiplication and division are
defined on integral and floating-point types.  Modulus is defined on
integral types.

@item ++@r{, }--
Increment and decrement.  When appearing before a variable, the
operation is performed before the variable is used in an expression;
when appearing after it, the variable's value is used before the
operation takes place.

@item *
Pointer dereferencing.  Defined on pointer types.  Same precedence as
@code{++}.

@item &
Address operator.  Defined on variables.  Same precedence as @code{++}.

For debugging C@t{++}, @value{GDBN} implements a use of @samp{&} beyond what is
allowed in the C@t{++} language itself: you can use @samp{&(&@var{ref})}
to examine the address
where a C@t{++} reference variable (declared with @samp{&@var{ref}}) is
stored.

@item -
Negative.  Defined on integral and floating-point types.  Same
precedence as @code{++}.

@item !
Logical negation.  Defined on integral types.  Same precedence as
@code{++}.

@item ~
Bitwise complement operator.  Defined on integral types.  Same precedence as
@code{++}.


@item .@r{, }->
Structure member, and pointer-to-structure member.  For convenience,
@value{GDBN} regards the two as equivalent, choosing whether to dereference a
pointer based on the stored type information.
Defined on @code{struct} and @code{union} data.

@item .*@r{, }->*
Dereferences of pointers to members.

@item []
Array indexing.  @code{@var{a}[@var{i}]} is defined as
@code{*(@var{a}+@var{i})}.  Same precedence as @code{->}.

@item ()
Function parameter list.  Same precedence as @code{->}.

@item ::
C@t{++} scope resolution operator.  Defined on @code{struct}, @code{union},
and @code{class} types.

@item ::
Doubled colons also represent the @value{GDBN} scope operator
(@pxref{Expressions, ,Expressions}).  Same precedence as @code{::},
above.
@end table

If an operator is redefined in the user code, @value{GDBN} usually
attempts to invoke the redefined version instead of using the operator's
predefined meaning.

@node C Constants
@subsubsection C and C@t{++} Constants

@cindex C and C@t{++} constants

@value{GDBN} allows you to express the constants of C and C@t{++} in the
following ways:

@itemize @bullet
@item
Integer constants are a sequence of digits.  Octal constants are
specified by a leading @samp{0} (i.e.@: zero), and hexadecimal constants
by a leading @samp{0x} or @samp{0X}.  Constants may also end with a letter
@samp{l}, specifying that the constant should be treated as a
@code{long} value.

@item
Floating point constants are a sequence of digits, followed by a decimal
point, followed by a sequence of digits, and optionally followed by an
exponent.  An exponent is of the form:
@samp{@w{e@r{[[}+@r{]|}-@r{]}@var{nnn}}}, where @var{nnn} is another
sequence of digits.  The @samp{+} is optional for positive exponents.
A floating-point constant may also end with a letter @samp{f} or
@samp{F}, specifying that the constant should be treated as being of
the @code{float} (as opposed to the default @code{double}) type; or with
a letter @samp{l} or @samp{L}, which specifies a @code{long double}
constant.

@item
Enumerated constants consist of enumerated identifiers, or their
integral equivalents.

@item
Character constants are a single character surrounded by single quotes
(@code{'}), or a number---the ordinal value of the corresponding character
(usually its @sc{ascii} value).  Within quotes, the single character may
be represented by a letter or by @dfn{escape sequences}, which are of
the form @samp{\@var{nnn}}, where @var{nnn} is the octal representation
of the character's ordinal value; or of the form @samp{\@var{x}}, where
@samp{@var{x}} is a predefined special character---for example,
@samp{\n} for newline.

Wide character constants can be written by prefixing a character
constant with @samp{L}, as in C.  For example, @samp{L'x'} is the wide
form of @samp{x}.  The target wide character set is used when
computing the value of this constant (@pxref{Character Sets}).

@item
String constants are a sequence of character constants surrounded by
double quotes (@code{"}).  Any valid character constant (as described
above) may appear.  Double quotes within the string must be preceded by
a backslash, so for instance @samp{"a\"b'c"} is a string of five
characters.

Wide string constants can be written by prefixing a string constant
with @samp{L}, as in C.  The target wide character set is used when
computing the value of this constant (@pxref{Character Sets}).

@item
Pointer constants are an integral value.  You can also write pointers
to constants using the C operator @samp{&}.

@item
Array constants are comma-separated lists surrounded by braces @samp{@{}
and @samp{@}}; for example, @samp{@{1,2,3@}} is a three-element array of
integers, @samp{@{@{1,2@}, @{3,4@}, @{5,6@}@}} is a three-by-two array,
and @samp{@{&"hi", &"there", &"fred"@}} is a three-element array of pointers.
@end itemize

@node C Plus Plus Expressions
@subsubsection C@t{++} Expressions

@cindex expressions in C@t{++}
@value{GDBN} expression handling can interpret most C@t{++} expressions.

@cindex debugging C@t{++} programs
@cindex C@t{++} compilers
@cindex debug formats and C@t{++}
@cindex @value{NGCC} and C@t{++}
@quotation
@emph{Warning:} @value{GDBN} can only debug C@t{++} code if you use
the proper compiler and the proper debug format.  Currently,
@value{GDBN} works best when debugging C@t{++} code that is compiled
with the most recent version of @value{NGCC} possible.  The DWARF
debugging format is preferred; @value{NGCC} defaults to this on most
popular platforms.  Other compilers and/or debug formats are likely to
work badly or not at all when using @value{GDBN} to debug C@t{++}
code.  @xref{Compilation}.
@end quotation

@enumerate

@cindex member functions
@item
Member function calls are allowed; you can use expressions like

@smallexample
count = aml->GetOriginal(x, y)
@end smallexample

@vindex this@r{, inside C@t{++} member functions}
@cindex namespace in C@t{++}
@item
While a member function is active (in the selected stack frame), your
expressions have the same namespace available as the member function;
that is, @value{GDBN} allows implicit references to the class instance
pointer @code{this} following the same rules as C@t{++}.  @code{using}
declarations in the current scope are also respected by @value{GDBN}.

@cindex call overloaded functions
@cindex overloaded functions, calling
@cindex type conversions in C@t{++}
@item
You can call overloaded functions; @value{GDBN} resolves the function
call to the right definition, with some restrictions.  @value{GDBN} does not
perform overload resolution involving user-defined type conversions,
calls to constructors, or instantiations of templates that do not exist
in the program.  It also cannot handle ellipsis argument lists or
default arguments.

It does perform integral conversions and promotions, floating-point
promotions, arithmetic conversions, pointer conversions, conversions of
class objects to base classes, and standard conversions such as those of
functions or arrays to pointers; it requires an exact match on the
number of function arguments.

Overload resolution is always performed, unless you have specified
@code{set overload-resolution off}.  @xref{Debugging C Plus Plus,
,@value{GDBN} Features for C@t{++}}.

You must specify @code{set overload-resolution off} in order to use an
explicit function signature to call an overloaded function, as in
@smallexample
p 'foo(char,int)'('x', 13)
@end smallexample

The @value{GDBN} command-completion facility can simplify this;
see @ref{Completion, ,Command Completion}.

@cindex reference declarations
@item
@value{GDBN} understands variables declared as C@t{++} references; you can use
them in expressions just as you do in C@t{++} source---they are automatically
dereferenced.

In the parameter list shown when @value{GDBN} displays a frame, the values of
reference variables are not displayed (unlike other variables); this
avoids clutter, since references are often used for large structures.
The @emph{address} of a reference variable is always shown, unless
you have specified @samp{set print address off}.

@item
@value{GDBN} supports the C@t{++} name resolution operator @code{::}---your
expressions can use it just as expressions in your program do.  Since
one scope may be defined in another, you can use @code{::} repeatedly if
necessary, for example in an expression like
@samp{@var{scope1}::@var{scope2}::@var{name}}.  @value{GDBN} also allows
resolving name scope by reference to source files, in both C and C@t{++}
debugging (@pxref{Variables, ,Program Variables}).

@item
@value{GDBN} performs argument-dependent lookup, following the C@t{++}
specification.
@end enumerate

@node C Defaults
@subsubsection C and C@t{++} Defaults

@cindex C and C@t{++} defaults

If you allow @value{GDBN} to set range checking automatically, it
defaults to @code{off} whenever the working language changes to
C or C@t{++}.  This happens regardless of whether you or @value{GDBN}
selects the working language.

If you allow @value{GDBN} to set the language automatically, it
recognizes source files whose names end with @file{.c}, @file{.C}, or
@file{.cc}, etc, and when @value{GDBN} enters code compiled from one of
these files, it sets the working language to C or C@t{++}.
@xref{Automatically, ,Having @value{GDBN} Infer the Source Language},
for further details.

@node C Checks
@subsubsection C and C@t{++} Type and Range Checks

@cindex C and C@t{++} checks

By default, when @value{GDBN} parses C or C@t{++} expressions, strict type
checking is used.  However, if you turn type checking off, @value{GDBN}
will allow certain non-standard conversions, such as promoting integer
constants to pointers.

Range checking, if turned on, is done on mathematical operations.  Array
indices are not checked, since they are often used to index a pointer
that is not itself an array.

@node Debugging C
@subsubsection @value{GDBN} and C

The @code{set print union} and @code{show print union} commands apply to
the @code{union} type.  When set to @samp{on}, any @code{union} that is
inside a @code{struct} or @code{class} is also printed.  Otherwise, it
appears as @samp{@{...@}}.

The @code{@@} operator aids in the debugging of dynamic arrays, formed
with pointers and a memory allocation function.  @xref{Expressions,
,Expressions}.

@node Debugging C Plus Plus
@subsubsection @value{GDBN} Features for C@t{++}

@cindex commands for C@t{++}

Some @value{GDBN} commands are particularly useful with C@t{++}, and some are
designed specifically for use with C@t{++}.  Here is a summary:

@table @code
@cindex break in overloaded functions
@item @r{breakpoint menus}
When you want a breakpoint in a function whose name is overloaded,
@value{GDBN} has the capability to display a menu of possible breakpoint
locations to help you specify which function definition you want.
@xref{Ambiguous Expressions,,Ambiguous Expressions}.

@cindex overloading in C@t{++}
@item rbreak @var{regex}
Setting breakpoints using regular expressions is helpful for setting
breakpoints on overloaded functions that are not members of any special
classes.
@xref{Set Breaks, ,Setting Breakpoints}.

@cindex C@t{++} exception handling
@item catch throw
@itemx catch rethrow
@itemx catch catch
Debug C@t{++} exception handling using these commands.  @xref{Set
Catchpoints, , Setting Catchpoints}.

@cindex inheritance
@item ptype @var{typename}
Print inheritance relationships as well as other information for type
@var{typename}.
@xref{Symbols, ,Examining the Symbol Table}.

@item info vtbl @var{expression}.
The @code{info vtbl} command can be used to display the virtual
method tables of the object computed by @var{expression}.  This shows
one entry per virtual table; there may be multiple virtual tables when
multiple inheritance is in use.

@cindex C@t{++} demangling
@item demangle @var{name}
Demangle @var{name}.
@xref{Symbols}, for a more complete description of the @code{demangle} command.

@cindex C@t{++} symbol display
@item set print demangle
@itemx show print demangle
@itemx set print asm-demangle
@itemx show print asm-demangle
Control whether C@t{++} symbols display in their source form, both when
displaying code as C@t{++} source and when displaying disassemblies.
@xref{Print Settings, ,Print Settings}.

@item set print object
@itemx show print object
Choose whether to print derived (actual) or declared types of objects.
@xref{Print Settings, ,Print Settings}.

@item set print vtbl
@itemx show print vtbl
Control the format for printing virtual function tables.
@xref{Print Settings, ,Print Settings}.
(The @code{vtbl} commands do not work on programs compiled with the HP
ANSI C@t{++} compiler (@code{aCC}).)

@kindex set overload-resolution
@cindex overloaded functions, overload resolution
@item set overload-resolution on
Enable overload resolution for C@t{++} expression evaluation.  The default
is on.  For overloaded functions, @value{GDBN} evaluates the arguments
and searches for a function whose signature matches the argument types,
using the standard C@t{++} conversion rules (see @ref{C Plus Plus
Expressions, ,C@t{++} Expressions}, for details).
If it cannot find a match, it emits a message.

@item set overload-resolution off
Disable overload resolution for C@t{++} expression evaluation.  For
overloaded functions that are not class member functions, @value{GDBN}
chooses the first function of the specified name that it finds in the
symbol table, whether or not its arguments are of the correct type.  For
overloaded functions that are class member functions, @value{GDBN}
searches for a function whose signature @emph{exactly} matches the
argument types.

@kindex show overload-resolution
@item show overload-resolution
Show the current setting of overload resolution.

@item @r{Overloaded symbol names}
You can specify a particular definition of an overloaded symbol, using
the same notation that is used to declare such symbols in C@t{++}: type
@code{@var{symbol}(@var{types})} rather than just @var{symbol}.  You can
also use the @value{GDBN} command-line word completion facilities to list the
available choices, or to finish the type list for you.
@xref{Completion,, Command Completion}, for details on how to do this.
@end table

@node Decimal Floating Point
@subsubsection Decimal Floating Point format
@cindex decimal floating point format

@value{GDBN} can examine, set and perform computations with numbers in
decimal floating point format, which in the C language correspond to the
@code{_Decimal32}, @code{_Decimal64} and @code{_Decimal128} types as
specified by the extension to support decimal floating-point arithmetic.

There are two encodings in use, depending on the architecture: BID (Binary
Integer Decimal) for x86 and x86-64, and DPD (Densely Packed Decimal) for
PowerPC and S/390.  @value{GDBN} will use the appropriate encoding for the
configured target.

Because of a limitation in @file{libdecnumber}, the library used by @value{GDBN}
to manipulate decimal floating point numbers, it is not possible to convert
(using a cast, for example) integers wider than 32-bit to decimal float.

In addition, in order to imitate @value{GDBN}'s behaviour with binary floating
point computations, error checking in decimal float operations ignores
underflow, overflow and divide by zero exceptions.

In the PowerPC architecture, @value{GDBN} provides a set of pseudo-registers
to inspect @code{_Decimal128} values stored in floating point registers.
See @ref{PowerPC,,PowerPC} for more details.

@node D
@subsection D

@cindex D
@value{GDBN} can be used to debug programs written in D and compiled with
GDC, LDC or DMD compilers. Currently @value{GDBN} supports only one D
specific feature --- dynamic arrays.

@node Go
@subsection Go

@cindex Go (programming language)
@value{GDBN} can be used to debug programs written in Go and compiled with
@file{gccgo} or @file{6g} compilers.

Here is a summary of the Go-specific features and restrictions:

@table @code
@cindex current Go package
@item The current Go package
The name of the current package does not need to be specified when
specifying global variables and functions.

For example, given the program:

@example
package main
var myglob = "Shall we?"
func main () @{
  // ...
@}
@end example

When stopped inside @code{main} either of these work:

@example
(gdb) p myglob
(gdb) p main.myglob
@end example

@cindex builtin Go types
@item Builtin Go types
The @code{string} type is recognized by @value{GDBN} and is printed
as a string.

@cindex builtin Go functions
@item Builtin Go functions
The @value{GDBN} expression parser recognizes the @code{unsafe.Sizeof}
function and handles it internally.

@cindex restrictions on Go expressions
@item Restrictions on Go expressions
All Go operators are supported except @code{&^}.
The Go @code{_} ``blank identifier'' is not supported.
Automatic dereferencing of pointers is not supported.
@end table

@node Objective-C
@subsection Objective-C

@cindex Objective-C
This section provides information about some commands and command
options that are useful for debugging Objective-C code.  See also
@ref{Symbols, info classes}, and @ref{Symbols, info selectors}, for a
few more commands specific to Objective-C support.

@menu
* Method Names in Commands::
* The Print Command with Objective-C::
@end menu

@node Method Names in Commands
@subsubsection Method Names in Commands

The following commands have been extended to accept Objective-C method
names as line specifications:

@kindex clear@r{, and Objective-C}
@kindex break@r{, and Objective-C}
@kindex info line@r{, and Objective-C}
@kindex jump@r{, and Objective-C}
@kindex list@r{, and Objective-C}
@itemize
@item @code{clear}
@item @code{break}
@item @code{info line}
@item @code{jump}
@item @code{list}
@end itemize

A fully qualified Objective-C method name is specified as

@smallexample
-[@var{Class} @var{methodName}]
@end smallexample

where the minus sign is used to indicate an instance method and a
plus sign (not shown) is used to indicate a class method.  The class
name @var{Class} and method name @var{methodName} are enclosed in
brackets, similar to the way messages are specified in Objective-C
source code.  For example, to set a breakpoint at the @code{create}
instance method of class @code{Fruit} in the program currently being
debugged, enter:

@smallexample
break -[Fruit create]
@end smallexample

To list ten program lines around the @code{initialize} class method,
enter:

@smallexample
list +[NSText initialize]
@end smallexample

In the current version of @value{GDBN}, the plus or minus sign is
required.  In future versions of @value{GDBN}, the plus or minus
sign will be optional, but you can use it to narrow the search.  It
is also possible to specify just a method name:

@smallexample
break create
@end smallexample

You must specify the complete method name, including any colons.  If
your program's source files contain more than one @code{create} method,
you'll be presented with a numbered list of classes that implement that
method.  Indicate your choice by number, or type @samp{0} to exit if
none apply.

As another example, to clear a breakpoint established at the
@code{makeKeyAndOrderFront:} method of the @code{NSWindow} class, enter:

@smallexample
clear -[NSWindow makeKeyAndOrderFront:]
@end smallexample

@node The Print Command with Objective-C
@subsubsection The Print Command With Objective-C
@cindex Objective-C, print objects
@kindex print-object
@kindex po @r{(@code{print-object})}

The print command has also been extended to accept methods.  For example:

@smallexample
print -[@var{object} hash]
@end smallexample

@cindex print an Objective-C object description
@cindex @code{_NSPrintForDebugger}, and printing Objective-C objects
@noindent
will tell @value{GDBN} to send the @code{hash} message to @var{object}
and print the result.  Also, an additional command has been added,
@code{print-object} or @code{po} for short, which is meant to print
the description of an object.  However, this command may only work
with certain Objective-C libraries that have a particular hook
function, @code{_NSPrintForDebugger}, defined.

@node OpenCL C
@subsection OpenCL C

@cindex OpenCL C
This section provides information about @value{GDBN}s OpenCL C support.

@menu
* OpenCL C Datatypes::
* OpenCL C Expressions::
* OpenCL C Operators::
@end menu

@node OpenCL C Datatypes
@subsubsection OpenCL C Datatypes

@cindex OpenCL C Datatypes
@value{GDBN} supports the builtin scalar and vector datatypes specified
by OpenCL 1.1.  In addition the half- and double-precision floating point
data types of the @code{cl_khr_fp16} and @code{cl_khr_fp64} OpenCL
extensions are also known to @value{GDBN}.

@node OpenCL C Expressions
@subsubsection OpenCL C Expressions

@cindex OpenCL C Expressions
@value{GDBN} supports accesses to vector components including the access as
lvalue where possible.  Since OpenCL C is based on C99 most C expressions
supported by @value{GDBN} can be used as well.

@node OpenCL C Operators
@subsubsection OpenCL C Operators

@cindex OpenCL C Operators
@value{GDBN} supports the operators specified by OpenCL 1.1 for scalar and
vector data types.

@node Fortran
@subsection Fortran
@cindex Fortran-specific support in @value{GDBN}

@value{GDBN} can be used to debug programs written in Fortran, but it
currently supports only the features of Fortran 77 language.

@cindex trailing underscore, in Fortran symbols
Some Fortran compilers (@sc{gnu} Fortran 77 and Fortran 95 compilers
among them) append an underscore to the names of variables and
functions.  When you debug programs compiled by those compilers, you
will need to refer to variables and functions with a trailing
underscore.

@menu
* Fortran Operators::           Fortran operators and expressions
* Fortran Defaults::            Default settings for Fortran
* Special Fortran Commands::    Special @value{GDBN} commands for Fortran
@end menu

@node Fortran Operators
@subsubsection Fortran Operators and Expressions

@cindex Fortran operators and expressions

Operators must be defined on values of specific types.  For instance,
@code{+} is defined on numbers, but not on characters or other non-
arithmetic types.  Operators are often defined on groups of types.

@table @code
@item **
The exponentiation operator.  It raises the first operand to the power
of the second one.

@item :
The range operator.  Normally used in the form of array(low:high) to
represent a section of array.

@item %
The access component operator.  Normally used to access elements in derived
types.  Also suitable for unions.  As unions aren't part of regular Fortran,
this can only happen when accessing a register that uses a gdbarch-defined
union type.
@end table

@node Fortran Defaults
@subsubsection Fortran Defaults

@cindex Fortran Defaults

Fortran symbols are usually case-insensitive, so @value{GDBN} by
default uses case-insensitive matches for Fortran symbols.  You can
change that with the @samp{set case-insensitive} command, see
@ref{Symbols}, for the details.

@node Special Fortran Commands
@subsubsection Special Fortran Commands

@cindex Special Fortran commands

@value{GDBN} has some commands to support Fortran-specific features,
such as displaying common blocks.

@table @code
@cindex @code{COMMON} blocks, Fortran
@kindex info common
@item info common @r{[}@var{common-name}@r{]}
This command prints the values contained in the Fortran @code{COMMON}
block whose name is @var{common-name}.  With no argument, the names of
all @code{COMMON} blocks visible at the current program location are
printed.
@end table

@node Pascal
@subsection Pascal

@cindex Pascal support in @value{GDBN}, limitations
Debugging Pascal programs which use sets, subranges, file variables, or
nested functions does not currently work.  @value{GDBN} does not support
entering expressions, printing values, or similar features using Pascal
syntax.

The Pascal-specific command @code{set print pascal_static-members}
controls whether static members of Pascal objects are displayed.
@xref{Print Settings, pascal_static-members}.

@node Modula-2
@subsection Modula-2

@cindex Modula-2, @value{GDBN} support

The extensions made to @value{GDBN} to support Modula-2 only support
output from the @sc{gnu} Modula-2 compiler (which is currently being
developed).  Other Modula-2 compilers are not currently supported, and
attempting to debug executables produced by them is most likely
to give an error as @value{GDBN} reads in the executable's symbol
table.

@cindex expressions in Modula-2
@menu
* M2 Operators::                Built-in operators
* Built-In Func/Proc::          Built-in functions and procedures
* M2 Constants::                Modula-2 constants
* M2 Types::                    Modula-2 types
* M2 Defaults::                 Default settings for Modula-2
* Deviations::                  Deviations from standard Modula-2
* M2 Checks::                   Modula-2 type and range checks
* M2 Scope::                    The scope operators @code{::} and @code{.}
* GDB/M2::                      @value{GDBN} and Modula-2
@end menu

@node M2 Operators
@subsubsection Operators
@cindex Modula-2 operators

Operators must be defined on values of specific types.  For instance,
@code{+} is defined on numbers, but not on structures.  Operators are
often defined on groups of types.  For the purposes of Modula-2, the
following definitions hold:

@itemize @bullet

@item
@emph{Integral types} consist of @code{INTEGER}, @code{CARDINAL}, and
their subranges.

@item
@emph{Character types} consist of @code{CHAR} and its subranges.

@item
@emph{Floating-point types} consist of @code{REAL}.

@item
@emph{Pointer types} consist of anything declared as @code{POINTER TO
@var{type}}.

@item
@emph{Scalar types} consist of all of the above.

@item
@emph{Set types} consist of @code{SET} and @code{BITSET} types.

@item
@emph{Boolean types} consist of @code{BOOLEAN}.
@end itemize

@noindent
The following operators are supported, and appear in order of
increasing precedence:

@table @code
@item ,
Function argument or array index separator.

@item :=
Assignment.  The value of @var{var} @code{:=} @var{value} is
@var{value}.

@item <@r{, }>
Less than, greater than on integral, floating-point, or enumerated
types.

@item <=@r{, }>=
Less than or equal to, greater than or equal to
on integral, floating-point and enumerated types, or set inclusion on
set types.  Same precedence as @code{<}.

@item =@r{, }<>@r{, }#
Equality and two ways of expressing inequality, valid on scalar types.
Same precedence as @code{<}.  In @value{GDBN} scripts, only @code{<>} is
available for inequality, since @code{#} conflicts with the script
comment character.

@item IN
Set membership.  Defined on set types and the types of their members.
Same precedence as @code{<}.

@item OR
Boolean disjunction.  Defined on boolean types.

@item AND@r{, }&
Boolean conjunction.  Defined on boolean types.

@item @@
The @value{GDBN} ``artificial array'' operator (@pxref{Expressions, ,Expressions}).

@item +@r{, }-
Addition and subtraction on integral and floating-point types, or union
and difference on set types.

@item *
Multiplication on integral and floating-point types, or set intersection
on set types.

@item /
Division on floating-point types, or symmetric set difference on set
types.  Same precedence as @code{*}.

@item DIV@r{, }MOD
Integer division and remainder.  Defined on integral types.  Same
precedence as @code{*}.

@item -
Negative.  Defined on @code{INTEGER} and @code{REAL} data.

@item ^
Pointer dereferencing.  Defined on pointer types.

@item NOT
Boolean negation.  Defined on boolean types.  Same precedence as
@code{^}.

@item .
@code{RECORD} field selector.  Defined on @code{RECORD} data.  Same
precedence as @code{^}.

@item []
Array indexing.  Defined on @code{ARRAY} data.  Same precedence as @code{^}.

@item ()
Procedure argument list.  Defined on @code{PROCEDURE} objects.  Same precedence
as @code{^}.

@item ::@r{, }.
@value{GDBN} and Modula-2 scope operators.
@end table

@quotation
@emph{Warning:} Set expressions and their operations are not yet supported, so @value{GDBN}
treats the use of the operator @code{IN}, or the use of operators
@code{+}, @code{-}, @code{*}, @code{/}, @code{=}, , @code{<>}, @code{#},
@code{<=}, and @code{>=} on sets as an error.
@end quotation


@node Built-In Func/Proc
@subsubsection Built-in Functions and Procedures
@cindex Modula-2 built-ins

Modula-2 also makes available several built-in procedures and functions.
In describing these, the following metavariables are used:

@table @var

@item a
represents an @code{ARRAY} variable.

@item c
represents a @code{CHAR} constant or variable.

@item i
represents a variable or constant of integral type.

@item m
represents an identifier that belongs to a set.  Generally used in the
same function with the metavariable @var{s}.  The type of @var{s} should
be @code{SET OF @var{mtype}} (where @var{mtype} is the type of @var{m}).

@item n
represents a variable or constant of integral or floating-point type.

@item r
represents a variable or constant of floating-point type.

@item t
represents a type.

@item v
represents a variable.

@item x
represents a variable or constant of one of many types.  See the
explanation of the function for details.
@end table

All Modula-2 built-in procedures also return a result, described below.

@table @code
@item ABS(@var{n})
Returns the absolute value of @var{n}.

@item CAP(@var{c})
If @var{c} is a lower case letter, it returns its upper case
equivalent, otherwise it returns its argument.

@item CHR(@var{i})
Returns the character whose ordinal value is @var{i}.

@item DEC(@var{v})
Decrements the value in the variable @var{v} by one.  Returns the new value.

@item DEC(@var{v},@var{i})
Decrements the value in the variable @var{v} by @var{i}.  Returns the
new value.

@item EXCL(@var{m},@var{s})
Removes the element @var{m} from the set @var{s}.  Returns the new
set.

@item FLOAT(@var{i})
Returns the floating point equivalent of the integer @var{i}.

@item HIGH(@var{a})
Returns the index of the last member of @var{a}.

@item INC(@var{v})
Increments the value in the variable @var{v} by one.  Returns the new value.

@item INC(@var{v},@var{i})
Increments the value in the variable @var{v} by @var{i}.  Returns the
new value.

@item INCL(@var{m},@var{s})
Adds the element @var{m} to the set @var{s} if it is not already
there.  Returns the new set.

@item MAX(@var{t})
Returns the maximum value of the type @var{t}.

@item MIN(@var{t})
Returns the minimum value of the type @var{t}.

@item ODD(@var{i})
Returns boolean TRUE if @var{i} is an odd number.

@item ORD(@var{x})
Returns the ordinal value of its argument.  For example, the ordinal
value of a character is its @sc{ascii} value (on machines supporting
the @sc{ascii} character set).  The argument @var{x} must be of an
ordered type, which include integral, character and enumerated types.

@item SIZE(@var{x})
Returns the size of its argument.  The argument @var{x} can be a
variable or a type.

@item TRUNC(@var{r})
Returns the integral part of @var{r}.

@item TSIZE(@var{x})
Returns the size of its argument.  The argument @var{x} can be a
variable or a type.

@item VAL(@var{t},@var{i})
Returns the member of the type @var{t} whose ordinal value is @var{i}.
@end table

@quotation
@emph{Warning:}  Sets and their operations are not yet supported, so
@value{GDBN} treats the use of procedures @code{INCL} and @code{EXCL} as
an error.
@end quotation

@cindex Modula-2 constants
@node M2 Constants
@subsubsection Constants

@value{GDBN} allows you to express the constants of Modula-2 in the following
ways:

@itemize @bullet

@item
Integer constants are simply a sequence of digits.  When used in an
expression, a constant is interpreted to be type-compatible with the
rest of the expression.  Hexadecimal integers are specified by a
trailing @samp{H}, and octal integers by a trailing @samp{B}.

@item
Floating point constants appear as a sequence of digits, followed by a
decimal point and another sequence of digits.  An optional exponent can
then be specified, in the form @samp{E@r{[}+@r{|}-@r{]}@var{nnn}}, where
@samp{@r{[}+@r{|}-@r{]}@var{nnn}} is the desired exponent.  All of the
digits of the floating point constant must be valid decimal (base 10)
digits.

@item
Character constants consist of a single character enclosed by a pair of
like quotes, either single (@code{'}) or double (@code{"}).  They may
also be expressed by their ordinal value (their @sc{ascii} value, usually)
followed by a @samp{C}.

@item
String constants consist of a sequence of characters enclosed by a
pair of like quotes, either single (@code{'}) or double (@code{"}).
Escape sequences in the style of C are also allowed.  @xref{C
Constants, ,C and C@t{++} Constants}, for a brief explanation of escape
sequences.

@item
Enumerated constants consist of an enumerated identifier.

@item
Boolean constants consist of the identifiers @code{TRUE} and
@code{FALSE}.

@item
Pointer constants consist of integral values only.

@item
Set constants are not yet supported.
@end itemize

@node M2 Types
@subsubsection Modula-2 Types
@cindex Modula-2 types

Currently @value{GDBN} can print the following data types in Modula-2
syntax: array types, record types, set types, pointer types, procedure
types, enumerated types, subrange types and base types.  You can also
print the contents of variables declared using these type.
This section gives a number of simple source code examples together with
sample @value{GDBN} sessions.

The first example contains the following section of code:

@smallexample
VAR
   s: SET OF CHAR ;
   r: [20..40] ;
@end smallexample

@noindent
and you can request @value{GDBN} to interrogate the type and value of
@code{r} and @code{s}.

@smallexample
(@value{GDBP}) print s
@{'A'..'C', 'Z'@}
(@value{GDBP}) ptype s
SET OF CHAR
(@value{GDBP}) print r
21
(@value{GDBP}) ptype r
[20..40]
@end smallexample

@noindent
Likewise if your source code declares @code{s} as:

@smallexample
VAR
   s: SET ['A'..'Z'] ;
@end smallexample

@noindent
then you may query the type of @code{s} by:

@smallexample
(@value{GDBP}) ptype s
type = SET ['A'..'Z']
@end smallexample

@noindent
Note that at present you cannot interactively manipulate set
expressions using the debugger.

The following example shows how you might declare an array in Modula-2
and how you can interact with @value{GDBN} to print its type and contents:

@smallexample
VAR
   s: ARRAY [-10..10] OF CHAR ;
@end smallexample

@smallexample
(@value{GDBP}) ptype s
ARRAY [-10..10] OF CHAR
@end smallexample

Note that the array handling is not yet complete and although the type
is printed correctly, expression handling still assumes that all
arrays have a lower bound of zero and not @code{-10} as in the example
above.

Here are some more type related Modula-2 examples:

@smallexample
TYPE
   colour = (blue, red, yellow, green) ;
   t = [blue..yellow] ;
VAR
   s: t ;
BEGIN
   s := blue ;
@end smallexample

@noindent
The @value{GDBN} interaction shows how you can query the data type
and value of a variable.

@smallexample
(@value{GDBP}) print s
$1 = blue
(@value{GDBP}) ptype t
type = [blue..yellow]
@end smallexample

@noindent
In this example a Modula-2 array is declared and its contents
displayed.  Observe that the contents are written in the same way as
their @code{C} counterparts.

@smallexample
VAR
   s: ARRAY [1..5] OF CARDINAL ;
BEGIN
   s[1] := 1 ;
@end smallexample

@smallexample
(@value{GDBP}) print s
$1 = @{1, 0, 0, 0, 0@}
(@value{GDBP}) ptype s
type = ARRAY [1..5] OF CARDINAL
@end smallexample

The Modula-2 language interface to @value{GDBN} also understands
pointer types as shown in this example:

@smallexample
VAR
   s: POINTER TO ARRAY [1..5] OF CARDINAL ;
BEGIN
   NEW(s) ;
   s^[1] := 1 ;
@end smallexample

@noindent
and you can request that @value{GDBN} describes the type of @code{s}.

@smallexample
(@value{GDBP}) ptype s
type = POINTER TO ARRAY [1..5] OF CARDINAL
@end smallexample

@value{GDBN} handles compound types as we can see in this example.
Here we combine array types, record types, pointer types and subrange
types:

@smallexample
TYPE
   foo = RECORD
            f1: CARDINAL ;
            f2: CHAR ;
            f3: myarray ;
         END ;

   myarray = ARRAY myrange OF CARDINAL ;
   myrange = [-2..2] ;
VAR
   s: POINTER TO ARRAY myrange OF foo ;
@end smallexample

@noindent
and you can ask @value{GDBN} to describe the type of @code{s} as shown
below.

@smallexample
(@value{GDBP}) ptype s
type = POINTER TO ARRAY [-2..2] OF foo = RECORD
    f1 : CARDINAL;
    f2 : CHAR;
    f3 : ARRAY [-2..2] OF CARDINAL;
END 
@end smallexample

@node M2 Defaults
@subsubsection Modula-2 Defaults
@cindex Modula-2 defaults

If type and range checking are set automatically by @value{GDBN}, they
both default to @code{on} whenever the working language changes to
Modula-2.  This happens regardless of whether you or @value{GDBN}
selected the working language.

If you allow @value{GDBN} to set the language automatically, then entering
code compiled from a file whose name ends with @file{.mod} sets the
working language to Modula-2.  @xref{Automatically, ,Having @value{GDBN}
Infer the Source Language}, for further details.

@node Deviations
@subsubsection Deviations from Standard Modula-2
@cindex Modula-2, deviations from

A few changes have been made to make Modula-2 programs easier to debug.
This is done primarily via loosening its type strictness:

@itemize @bullet
@item
Unlike in standard Modula-2, pointer constants can be formed by
integers.  This allows you to modify pointer variables during
debugging.  (In standard Modula-2, the actual address contained in a
pointer variable is hidden from you; it can only be modified
through direct assignment to another pointer variable or expression that
returned a pointer.)

@item
C escape sequences can be used in strings and characters to represent
non-printable characters.  @value{GDBN} prints out strings with these
escape sequences embedded.  Single non-printable characters are
printed using the @samp{CHR(@var{nnn})} format.

@item
The assignment operator (@code{:=}) returns the value of its right-hand
argument.

@item
All built-in procedures both modify @emph{and} return their argument.
@end itemize

@node M2 Checks
@subsubsection Modula-2 Type and Range Checks
@cindex Modula-2 checks

@quotation
@emph{Warning:} in this release, @value{GDBN} does not yet perform type or
range checking.
@end quotation
@c FIXME remove warning when type/range checks added

@value{GDBN} considers two Modula-2 variables type equivalent if:

@itemize @bullet
@item
They are of types that have been declared equivalent via a @code{TYPE
@var{t1} = @var{t2}} statement

@item
They have been declared on the same line.  (Note:  This is true of the
@sc{gnu} Modula-2 compiler, but it may not be true of other compilers.)
@end itemize

As long as type checking is enabled, any attempt to combine variables
whose types are not equivalent is an error.

Range checking is done on all mathematical operations, assignment, array
index bounds, and all built-in functions and procedures.

@node M2 Scope
@subsubsection The Scope Operators @code{::} and @code{.}
@cindex scope
@cindex @code{.}, Modula-2 scope operator
@cindex colon, doubled as scope operator
@ifinfo
@vindex colon-colon@r{, in Modula-2}
@c Info cannot handle :: but TeX can.
@end ifinfo
@ifnotinfo
@vindex ::@r{, in Modula-2}
@end ifnotinfo

There are a few subtle differences between the Modula-2 scope operator
(@code{.}) and the @value{GDBN} scope operator (@code{::}).  The two have
similar syntax:

@smallexample

@var{module} . @var{id}
@var{scope} :: @var{id}
@end smallexample

@noindent
where @var{scope} is the name of a module or a procedure,
@var{module} the name of a module, and @var{id} is any declared
identifier within your program, except another module.

Using the @code{::} operator makes @value{GDBN} search the scope
specified by @var{scope} for the identifier @var{id}.  If it is not
found in the specified scope, then @value{GDBN} searches all scopes
enclosing the one specified by @var{scope}.

Using the @code{.} operator makes @value{GDBN} search the current scope for
the identifier specified by @var{id} that was imported from the
definition module specified by @var{module}.  With this operator, it is
an error if the identifier @var{id} was not imported from definition
module @var{module}, or if @var{id} is not an identifier in
@var{module}.

@node GDB/M2
@subsubsection @value{GDBN} and Modula-2

Some @value{GDBN} commands have little use when debugging Modula-2 programs.
Five subcommands of @code{set print} and @code{show print} apply
specifically to C and C@t{++}: @samp{vtbl}, @samp{demangle},
@samp{asm-demangle}, @samp{object}, and @samp{union}.  The first four
apply to C@t{++}, and the last to the C @code{union} type, which has no direct
analogue in Modula-2.

The @code{@@} operator (@pxref{Expressions, ,Expressions}), while available
with any language, is not useful with Modula-2.  Its
intent is to aid the debugging of @dfn{dynamic arrays}, which cannot be
created in Modula-2 as they can in C or C@t{++}.  However, because an
address can be specified by an integral constant, the construct
@samp{@{@var{type}@}@var{adrexp}} is still useful.

@cindex @code{#} in Modula-2
In @value{GDBN} scripts, the Modula-2 inequality operator @code{#} is
interpreted as the beginning of a comment.  Use @code{<>} instead.

@node Ada
@subsection Ada
@cindex Ada

The extensions made to @value{GDBN} for Ada only support
output from the @sc{gnu} Ada (GNAT) compiler.
Other Ada compilers are not currently supported, and
attempting to debug executables produced by them is most likely
to be difficult.


@cindex expressions in Ada
@menu
* Ada Mode Intro::              General remarks on the Ada syntax 
                                   and semantics supported by Ada mode 
                                   in @value{GDBN}.
* Omissions from Ada::          Restrictions on the Ada expression syntax.
* Additions to Ada::            Extensions of the Ada expression syntax.
* Stopping Before Main Program:: Debugging the program during elaboration.
* Ada Exceptions::              Ada Exceptions
* Ada Tasks::                   Listing and setting breakpoints in tasks.
* Ada Tasks and Core Files::    Tasking Support when Debugging Core Files
* Ravenscar Profile::           Tasking Support when using the Ravenscar
                                   Profile
* Ada Glitches::                Known peculiarities of Ada mode.
@end menu

@node Ada Mode Intro
@subsubsection Introduction
@cindex Ada mode, general

The Ada mode of @value{GDBN} supports a fairly large subset of Ada expression 
syntax, with some extensions.
The philosophy behind the design of this subset is 

@itemize @bullet
@item
That @value{GDBN} should provide basic literals and access to operations for 
arithmetic, dereferencing, field selection, indexing, and subprogram calls, 
leaving more sophisticated computations to subprograms written into the
program (which therefore may be called from @value{GDBN}).

@item 
That type safety and strict adherence to Ada language restrictions
are not particularly important to the @value{GDBN} user.

@item 
That brevity is important to the @value{GDBN} user.
@end itemize

Thus, for brevity, the debugger acts as if all names declared in
user-written packages are directly visible, even if they are not visible
according to Ada rules, thus making it unnecessary to fully qualify most
names with their packages, regardless of context.  Where this causes
ambiguity, @value{GDBN} asks the user's intent.

The debugger will start in Ada mode if it detects an Ada main program. 
As for other languages, it will enter Ada mode when stopped in a program that
was translated from an Ada source file.

While in Ada mode, you may use `@t{--}' for comments.  This is useful 
mostly for documenting command files.  The standard @value{GDBN} comment 
(@samp{#}) still works at the beginning of a line in Ada mode, but not in the 
middle (to allow based literals).

The debugger supports limited overloading.  Given a subprogram call in which
the function symbol has multiple definitions, it will use the number of 
actual parameters and some information about their types to attempt to narrow
the set of definitions.  It also makes very limited use of context, preferring
procedures to functions in the context of the @code{call} command, and
functions to procedures elsewhere. 

@node Omissions from Ada
@subsubsection Omissions from Ada
@cindex Ada, omissions from

Here are the notable omissions from the subset:

@itemize @bullet
@item
Only a subset of the attributes are supported:

@itemize @minus
@item
@t{'First}, @t{'Last}, and @t{'Length}
 on array objects (not on types and subtypes).

@item
@t{'Min} and @t{'Max}.  

@item 
@t{'Pos} and @t{'Val}. 

@item
@t{'Tag}.

@item
@t{'Range} on array objects (not subtypes), but only as the right
operand of the membership (@code{in}) operator.

@item 
@t{'Access}, @t{'Unchecked_Access}, and 
@t{'Unrestricted_Access} (a GNAT extension).

@item
@t{'Address}.
@end itemize

@item
The names in
@code{Characters.Latin_1} are not available and
concatenation is not implemented.  Thus, escape characters in strings are 
not currently available.

@item
Equality tests (@samp{=} and @samp{/=}) on arrays test for bitwise
equality of representations.  They will generally work correctly
for strings and arrays whose elements have integer or enumeration types.
They may not work correctly for arrays whose element
types have user-defined equality, for arrays of real values 
(in particular, IEEE-conformant floating point, because of negative
zeroes and NaNs), and for arrays whose elements contain unused bits with
indeterminate values.  

@item
The other component-by-component array operations (@code{and}, @code{or}, 
@code{xor}, @code{not}, and relational tests other than equality)
are not implemented. 

@item 
@cindex array aggregates (Ada)
@cindex record aggregates (Ada)
@cindex aggregates (Ada) 
There is limited support for array and record aggregates.  They are
permitted only on the right sides of assignments, as in these examples:

@smallexample
(@value{GDBP}) set An_Array := (1, 2, 3, 4, 5, 6)
(@value{GDBP}) set An_Array := (1, others => 0)
(@value{GDBP}) set An_Array := (0|4 => 1, 1..3 => 2, 5 => 6)
(@value{GDBP}) set A_2D_Array := ((1, 2, 3), (4, 5, 6), (7, 8, 9))
(@value{GDBP}) set A_Record := (1, "Peter", True);
(@value{GDBP}) set A_Record := (Name => "Peter", Id => 1, Alive => True)
@end smallexample

Changing a
discriminant's value by assigning an aggregate has an
undefined effect if that discriminant is used within the record.
However, you can first modify discriminants by directly assigning to
them (which normally would not be allowed in Ada), and then performing an
aggregate assignment.  For example, given a variable @code{A_Rec} 
declared to have a type such as:

@smallexample
type Rec (Len : Small_Integer := 0) is record
    Id : Integer;
    Vals : IntArray (1 .. Len);
end record;
@end smallexample

you can assign a value with a different size of @code{Vals} with two
assignments:

@smallexample
(@value{GDBP}) set A_Rec.Len := 4
(@value{GDBP}) set A_Rec := (Id => 42, Vals => (1, 2, 3, 4))
@end smallexample

As this example also illustrates, @value{GDBN} is very loose about the usual
rules concerning aggregates.  You may leave out some of the
components of an array or record aggregate (such as the @code{Len} 
component in the assignment to @code{A_Rec} above); they will retain their
original values upon assignment.  You may freely use dynamic values as
indices in component associations.  You may even use overlapping or
redundant component associations, although which component values are
assigned in such cases is not defined.

@item
Calls to dispatching subprograms are not implemented.

@item
The overloading algorithm is much more limited (i.e., less selective)
than that of real Ada.  It makes only limited use of the context in
which a subexpression appears to resolve its meaning, and it is much
looser in its rules for allowing type matches.  As a result, some
function calls will be ambiguous, and the user will be asked to choose
the proper resolution.

@item
The @code{new} operator is not implemented.

@item
Entry calls are not implemented.

@item 
Aside from printing, arithmetic operations on the native VAX floating-point 
formats are not supported.

@item
It is not possible to slice a packed array.

@item
The names @code{True} and @code{False}, when not part of a qualified name, 
are interpreted as if implicitly prefixed by @code{Standard}, regardless of 
context.
Should your program
redefine these names in a package or procedure (at best a dubious practice),
you will have to use fully qualified names to access their new definitions.
@end itemize

@node Additions to Ada
@subsubsection Additions to Ada
@cindex Ada, deviations from 

As it does for other languages, @value{GDBN} makes certain generic
extensions to Ada (@pxref{Expressions}):

@itemize @bullet
@item
If the expression @var{E} is a variable residing in memory (typically
a local variable or array element) and @var{N} is a positive integer,
then @code{@var{E}@@@var{N}} displays the values of @var{E} and the
@var{N}-1 adjacent variables following it in memory as an array.  In
Ada, this operator is generally not necessary, since its prime use is
in displaying parts of an array, and slicing will usually do this in
Ada.  However, there are occasional uses when debugging programs in
which certain debugging information has been optimized away.

@item
@code{@var{B}::@var{var}} means ``the variable named @var{var} that
appears in function or file @var{B}.''  When @var{B} is a file name,
you must typically surround it in single quotes.

@item 
The expression @code{@{@var{type}@} @var{addr}} means ``the variable of type
@var{type} that appears at address @var{addr}.''

@item
A name starting with @samp{$} is a convenience variable 
(@pxref{Convenience Vars}) or a machine register (@pxref{Registers}).
@end itemize

In addition, @value{GDBN} provides a few other shortcuts and outright
additions specific to Ada:

@itemize @bullet
@item 
The assignment statement is allowed as an expression, returning
its right-hand operand as its value.  Thus, you may enter

@smallexample
(@value{GDBP}) set x := y + 3
(@value{GDBP}) print A(tmp := y + 1)
@end smallexample

@item 
The semicolon is allowed as an ``operator,''  returning as its value 
the value of its right-hand operand.
This allows, for example,
complex conditional breaks:

@smallexample
(@value{GDBP}) break f
(@value{GDBP}) condition 1 (report(i); k += 1; A(k) > 100)
@end smallexample

@item 
Rather than use catenation and symbolic character names to introduce special 
characters into strings, one may instead use a special bracket notation, 
which is also used to print strings.  A sequence of characters of the form 
@samp{["@var{XX}"]} within a string or character literal denotes the 
(single) character whose numeric encoding is @var{XX} in hexadecimal.  The
sequence of characters @samp{["""]} also denotes a single quotation mark 
in strings.   For example,
@smallexample
   "One line.["0a"]Next line.["0a"]"
@end smallexample
@noindent
contains an ASCII newline character (@code{Ada.Characters.Latin_1.LF})
after each period.

@item
The subtype used as a prefix for the attributes @t{'Pos}, @t{'Min}, and
@t{'Max} is optional (and is ignored in any case).  For example, it is valid
to write

@smallexample
(@value{GDBP}) print 'max(x, y)
@end smallexample

@item
When printing arrays, @value{GDBN} uses positional notation when the 
array has a lower bound of 1, and uses a modified named notation otherwise.
For example, a one-dimensional array of three integers with a lower bound
of 3 might print as

@smallexample
(3 => 10, 17, 1)
@end smallexample

@noindent
That is, in contrast to valid Ada, only the first component has a @code{=>} 
clause.

@item
You may abbreviate attributes in expressions with any unique,
multi-character subsequence of 
their names (an exact match gets preference).
For example, you may use @t{a'len}, @t{a'gth}, or @t{a'lh}
in place of  @t{a'length}.

@item
@cindex quoting Ada internal identifiers
Since Ada is case-insensitive, the debugger normally maps identifiers you type 
to lower case.  The GNAT compiler uses upper-case characters for 
some of its internal identifiers, which are normally of no interest to users.
For the rare occasions when you actually have to look at them,
enclose them in angle brackets to avoid the lower-case mapping. 
For example,
@smallexample
(@value{GDBP}) print <JMPBUF_SAVE>[0]
@end smallexample

@item
Printing an object of class-wide type or dereferencing an 
access-to-class-wide value will display all the components of the object's
specific type (as indicated by its run-time tag).  Likewise, component
selection on such a value will operate on the specific type of the
object.

@end itemize

@node Stopping Before Main Program
@subsubsection Stopping at the Very Beginning

@cindex breakpointing Ada elaboration code
It is sometimes necessary to debug the program during elaboration, and
before reaching the main procedure.
As defined in the Ada Reference
Manual, the elaboration code is invoked from a procedure called
@code{adainit}.  To run your program up to the beginning of
elaboration, simply use the following two commands:
@code{tbreak adainit} and @code{run}.

@node Ada Exceptions
@subsubsection Ada Exceptions

A command is provided to list all Ada exceptions:

@table @code
@kindex info exceptions
@item info exceptions
@itemx info exceptions @var{regexp}
The @code{info exceptions} command allows you to list all Ada exceptions
defined within the program being debugged, as well as their addresses.
With a regular expression, @var{regexp}, as argument, only those exceptions
whose names match @var{regexp} are listed.
@end table

Below is a small example, showing how the command can be used, first
without argument, and next with a regular expression passed as an
argument.

@smallexample
(@value{GDBP}) info exceptions
All defined Ada exceptions:
constraint_error: 0x613da0
program_error: 0x613d20
storage_error: 0x613ce0
tasking_error: 0x613ca0
const.aint_global_e: 0x613b00
(@value{GDBP}) info exceptions const.aint
All Ada exceptions matching regular expression "const.aint":
constraint_error: 0x613da0
const.aint_global_e: 0x613b00
@end smallexample

It is also possible to ask @value{GDBN} to stop your program's execution
when an exception is raised.  For more details, see @ref{Set Catchpoints}.

@node Ada Tasks
@subsubsection Extensions for Ada Tasks
@cindex Ada, tasking

Support for Ada tasks is analogous to that for threads (@pxref{Threads}).
@value{GDBN} provides the following task-related commands:

@table @code
@kindex info tasks
@item info tasks
This command shows a list of current Ada tasks, as in the following example:


@smallexample
@iftex
@leftskip=0.5cm
@end iftex
(@value{GDBP}) info tasks
  ID       TID P-ID Pri State                 Name
   1   8088000   0   15 Child Activation Wait main_task
   2   80a4000   1   15 Accept Statement      b
   3   809a800   1   15 Child Activation Wait a
*  4   80ae800   3   15 Runnable              c

@end smallexample

@noindent
In this listing, the asterisk before the last task indicates it to be the
task currently being inspected.

@table @asis
@item ID
Represents @value{GDBN}'s internal task number.

@item TID
The Ada task ID.

@item P-ID
The parent's task ID (@value{GDBN}'s internal task number).

@item Pri
The base priority of the task.

@item State
Current state of the task.

@table @code
@item Unactivated
The task has been created but has not been activated.  It cannot be
executing.

@item Runnable
The task is not blocked for any reason known to Ada.  (It may be waiting
for a mutex, though.) It is conceptually "executing" in normal mode.

@item Terminated
The task is terminated, in the sense of ARM 9.3 (5).  Any dependents
that were waiting on terminate alternatives have been awakened and have
terminated themselves.

@item Child Activation Wait
The task is waiting for created tasks to complete activation.

@item Accept Statement
The task is waiting on an accept or selective wait statement.

@item Waiting on entry call
The task is waiting on an entry call.

@item Async Select Wait
The task is waiting to start the abortable part of an asynchronous
select statement.

@item Delay Sleep
The task is waiting on a select statement with only a delay
alternative open.

@item Child Termination Wait
The task is sleeping having completed a master within itself, and is
waiting for the tasks dependent on that master to become terminated or
waiting on a terminate Phase.

@item Wait Child in Term Alt
The task is sleeping waiting for tasks on terminate alternatives to
finish terminating.

@item Accepting RV with @var{taskno}
The task is accepting a rendez-vous with the task @var{taskno}.
@end table

@item Name
Name of the task in the program.

@end table

@kindex info task @var{taskno}
@item info task @var{taskno}
This command shows detailled informations on the specified task, as in
the following example:
@smallexample
@iftex
@leftskip=0.5cm
@end iftex
(@value{GDBP}) info tasks
  ID       TID P-ID Pri State                  Name
   1   8077880    0  15 Child Activation Wait  main_task
*  2   807c468    1  15 Runnable               task_1
(@value{GDBP}) info task 2
Ada Task: 0x807c468
Name: task_1
Thread: 0x807f378
Parent: 1 (main_task)
Base Priority: 15
State: Runnable
@end smallexample

@item task
@kindex task@r{ (Ada)}
@cindex current Ada task ID
This command prints the ID of the current task.

@smallexample
@iftex
@leftskip=0.5cm
@end iftex
(@value{GDBP}) info tasks
  ID       TID P-ID Pri State                  Name
   1   8077870    0  15 Child Activation Wait  main_task
*  2   807c458    1  15 Runnable               t
(@value{GDBP}) task
[Current task is 2]
@end smallexample

@item task @var{taskno}
@cindex Ada task switching
This command is like the @code{thread @var{threadno}}
command (@pxref{Threads}).  It switches the context of debugging
from the current task to the given task.

@smallexample
@iftex
@leftskip=0.5cm
@end iftex
(@value{GDBP}) info tasks
  ID       TID P-ID Pri State                  Name
   1   8077870    0  15 Child Activation Wait  main_task
*  2   807c458    1  15 Runnable               t
(@value{GDBP}) task 1
[Switching to task 1]
#0  0x8067726 in pthread_cond_wait ()
(@value{GDBP}) bt
#0  0x8067726 in pthread_cond_wait ()
#1  0x8056714 in system.os_interface.pthread_cond_wait ()
#2  0x805cb63 in system.task_primitives.operations.sleep ()
#3  0x806153e in system.tasking.stages.activate_tasks ()
#4  0x804aacc in un () at un.adb:5
@end smallexample

@item break @var{linespec} task @var{taskno}
@itemx break @var{linespec} task @var{taskno} if @dots{}
@cindex breakpoints and tasks, in Ada
@cindex task breakpoints, in Ada
@kindex break @dots{} task @var{taskno}@r{ (Ada)}
These commands are like the @code{break @dots{} thread @dots{}}
command (@pxref{Thread Stops}).  The
@var{linespec} argument specifies source lines, as described
in @ref{Specify Location}.

Use the qualifier @samp{task @var{taskno}} with a breakpoint command
to specify that you only want @value{GDBN} to stop the program when a
particular Ada task reaches this breakpoint.  The @var{taskno} is one of the
numeric task identifiers assigned by @value{GDBN}, shown in the first
column of the @samp{info tasks} display.

If you do not specify @samp{task @var{taskno}} when you set a
breakpoint, the breakpoint applies to @emph{all} tasks of your
program.

You can use the @code{task} qualifier on conditional breakpoints as
well; in this case, place @samp{task @var{taskno}} before the
breakpoint condition (before the @code{if}).

For example,

@smallexample
@iftex
@leftskip=0.5cm
@end iftex
(@value{GDBP}) info tasks
  ID       TID P-ID Pri State                 Name
   1 140022020   0   15 Child Activation Wait main_task
   2 140045060   1   15 Accept/Select Wait    t2
   3 140044840   1   15 Runnable              t1
*  4 140056040   1   15 Runnable              t3
(@value{GDBP}) b 15 task 2
Breakpoint 5 at 0x120044cb0: file test_task_debug.adb, line 15.
(@value{GDBP}) cont
Continuing.
task # 1 running
task # 2 running

Breakpoint 5, test_task_debug () at test_task_debug.adb:15
15               flush;
(@value{GDBP}) info tasks
  ID       TID P-ID Pri State                 Name
   1 140022020   0   15 Child Activation Wait main_task
*  2 140045060   1   15 Runnable              t2
   3 140044840   1   15 Runnable              t1
   4 140056040   1   15 Delay Sleep           t3
@end smallexample
@end table

@node Ada Tasks and Core Files
@subsubsection Tasking Support when Debugging Core Files
@cindex Ada tasking and core file debugging

When inspecting a core file, as opposed to debugging a live program,
tasking support may be limited or even unavailable, depending on
the platform being used.
For instance, on x86-linux, the list of tasks is available, but task
switching is not supported.

On certain platforms, the debugger needs to perform some
memory writes in order to provide Ada tasking support.  When inspecting
a core file, this means that the core file must be opened with read-write
privileges, using the command @samp{"set write on"} (@pxref{Patching}).
Under these circumstances, you should make a backup copy of the core
file before inspecting it with @value{GDBN}.

@node Ravenscar Profile
@subsubsection Tasking Support when using the Ravenscar Profile
@cindex Ravenscar Profile

The @dfn{Ravenscar Profile} is a subset of the Ada tasking features,
specifically designed for systems with safety-critical real-time
requirements.

@table @code
@kindex set ravenscar task-switching on
@cindex task switching with program using Ravenscar Profile
@item set ravenscar task-switching on
Allows task switching when debugging a program that uses the Ravenscar
Profile.  This is the default.

@kindex set ravenscar task-switching off
@item set ravenscar task-switching off
Turn off task switching when debugging a program that uses the Ravenscar
Profile.  This is mostly intended to disable the code that adds support
for the Ravenscar Profile, in case a bug in either @value{GDBN} or in
the Ravenscar runtime is preventing @value{GDBN} from working properly.
To be effective, this command should be run before the program is started.

@kindex show ravenscar task-switching
@item show ravenscar task-switching
Show whether it is possible to switch from task to task in a program
using the Ravenscar Profile.

@end table

@node Ada Glitches
@subsubsection Known Peculiarities of Ada Mode
@cindex Ada, problems

Besides the omissions listed previously (@pxref{Omissions from Ada}),
we know of several problems with and limitations of Ada mode in
@value{GDBN},
some of which will be fixed with planned future releases of the debugger 
and the GNU Ada compiler.

@itemize @bullet
@item 
Static constants that the compiler chooses not to materialize as objects in 
storage are invisible to the debugger.

@item
Named parameter associations in function argument lists are ignored (the
argument lists are treated as positional).

@item
Many useful library packages are currently invisible to the debugger.

@item
Fixed-point arithmetic, conversions, input, and output is carried out using 
floating-point arithmetic, and may give results that only approximate those on 
the host machine.

@item
The GNAT compiler never generates the prefix @code{Standard} for any of 
the standard symbols defined by the Ada language.  @value{GDBN} knows about 
this: it will strip the prefix from names when you use it, and will never
look for a name you have so qualified among local symbols, nor match against
symbols in other packages or subprograms.  If you have 
defined entities anywhere in your program other than parameters and 
local variables whose simple names match names in @code{Standard}, 
GNAT's lack of qualification here can cause confusion.  When this happens,
you can usually resolve the confusion 
by qualifying the problematic names with package
@code{Standard} explicitly.  
@end itemize

Older versions of the compiler sometimes generate erroneous debugging
information, resulting in the debugger incorrectly printing the value
of affected entities.  In some cases, the debugger is able to work
around an issue automatically. In other cases, the debugger is able
to work around the issue, but the work-around has to be specifically
enabled.

@kindex set ada trust-PAD-over-XVS
@kindex show ada trust-PAD-over-XVS
@table @code

@item set ada trust-PAD-over-XVS on
Configure GDB to strictly follow the GNAT encoding when computing the
value of Ada entities, particularly when @code{PAD} and @code{PAD___XVS}
types are involved (see @code{ada/exp_dbug.ads} in the GCC sources for
a complete description of the encoding used by the GNAT compiler).
This is the default.

@item set ada trust-PAD-over-XVS off
This is related to the encoding using by the GNAT compiler.  If @value{GDBN}
sometimes prints the wrong value for certain entities, changing @code{ada
trust-PAD-over-XVS} to @code{off} activates a work-around which may fix
the issue.  It is always safe to set @code{ada trust-PAD-over-XVS} to
@code{off}, but this incurs a slight performance penalty, so it is
recommended to leave this setting to @code{on} unless necessary.

@end table

@cindex GNAT descriptive types
@cindex GNAT encoding
Internally, the debugger also relies on the compiler following a number
of conventions known as the @samp{GNAT Encoding}, all documented in
@file{gcc/ada/exp_dbug.ads} in the GCC sources. This encoding describes
how the debugging information should be generated for certain types.
In particular, this convention makes use of @dfn{descriptive types},
which are artificial types generated purely to help the debugger.

These encodings were defined at a time when the debugging information
format used was not powerful enough to describe some of the more complex
types available in Ada.  Since DWARF allows us to express nearly all
Ada features, the long-term goal is to slowly replace these descriptive
types by their pure DWARF equivalent.  To facilitate that transition,
a new maintenance option is available to force the debugger to ignore
those descriptive types.  It allows the user to quickly evaluate how
well @value{GDBN} works without them.

@table @code

@kindex maint ada set ignore-descriptive-types
@item maintenance ada set ignore-descriptive-types [on|off]
Control whether the debugger should ignore descriptive types.
The default is not to ignore descriptives types (@code{off}).

@kindex maint ada show ignore-descriptive-types
@item maintenance ada show ignore-descriptive-types
Show if descriptive types are ignored by @value{GDBN}.

@end table

@node Unsupported Languages
@section Unsupported Languages

@cindex unsupported languages
@cindex minimal language
In addition to the other fully-supported programming languages,
@value{GDBN} also provides a pseudo-language, called @code{minimal}.
It does not represent a real programming language, but provides a set
of capabilities close to what the C or assembly languages provide.
This should allow most simple operations to be performed while debugging
an application that uses a language currently not supported by @value{GDBN}.

If the language is set to @code{auto}, @value{GDBN} will automatically
select this language if the current frame corresponds to an unsupported
language.

@node Symbols
@chapter Examining the Symbol Table

The commands described in this chapter allow you to inquire about the
symbols (names of variables, functions and types) defined in your
program.  This information is inherent in the text of your program and
does not change as your program executes.  @value{GDBN} finds it in your
program's symbol table, in the file indicated when you started @value{GDBN}
(@pxref{File Options, ,Choosing Files}), or by one of the
file-management commands (@pxref{Files, ,Commands to Specify Files}).

@cindex symbol names
@cindex names of symbols
@cindex quoting names
Occasionally, you may need to refer to symbols that contain unusual
characters, which @value{GDBN} ordinarily treats as word delimiters.  The
most frequent case is in referring to static variables in other
source files (@pxref{Variables,,Program Variables}).  File names
are recorded in object files as debugging symbols, but @value{GDBN} would
ordinarily parse a typical file name, like @file{foo.c}, as the three words
@samp{foo} @samp{.} @samp{c}.  To allow @value{GDBN} to recognize
@samp{foo.c} as a single symbol, enclose it in single quotes; for example,

@smallexample
p 'foo.c'::x
@end smallexample

@noindent
looks up the value of @code{x} in the scope of the file @file{foo.c}.

@table @code
@cindex case-insensitive symbol names
@cindex case sensitivity in symbol names
@kindex set case-sensitive
@item set case-sensitive on
@itemx set case-sensitive off
@itemx set case-sensitive auto
Normally, when @value{GDBN} looks up symbols, it matches their names
with case sensitivity determined by the current source language.
Occasionally, you may wish to control that.  The command @code{set
case-sensitive} lets you do that by specifying @code{on} for
case-sensitive matches or @code{off} for case-insensitive ones.  If
you specify @code{auto}, case sensitivity is reset to the default
suitable for the source language.  The default is case-sensitive
matches for all languages except for Fortran, for which the default is
case-insensitive matches.

@kindex show case-sensitive
@item show case-sensitive
This command shows the current setting of case sensitivity for symbols
lookups.

@kindex set print type methods
@item set print type methods
@itemx set print type methods on
@itemx set print type methods off
Normally, when @value{GDBN} prints a class, it displays any methods
declared in that class.  You can control this behavior either by
passing the appropriate flag to @code{ptype}, or using @command{set
print type methods}.  Specifying @code{on} will cause @value{GDBN} to
display the methods; this is the default.  Specifying @code{off} will
cause @value{GDBN} to omit the methods.

@kindex show print type methods
@item show print type methods
This command shows the current setting of method display when printing
classes.

@kindex set print type typedefs
@item set print type typedefs
@itemx set print type typedefs on
@itemx set print type typedefs off

Normally, when @value{GDBN} prints a class, it displays any typedefs
defined in that class.  You can control this behavior either by
passing the appropriate flag to @code{ptype}, or using @command{set
print type typedefs}.  Specifying @code{on} will cause @value{GDBN} to
display the typedef definitions; this is the default.  Specifying
@code{off} will cause @value{GDBN} to omit the typedef definitions.
Note that this controls whether the typedef definition itself is
printed, not whether typedef names are substituted when printing other
types.

@kindex show print type typedefs
@item show print type typedefs
This command shows the current setting of typedef display when
printing classes.

@kindex info address
@cindex address of a symbol
@item info address @var{symbol}
Describe where the data for @var{symbol} is stored.  For a register
variable, this says which register it is kept in.  For a non-register
local variable, this prints the stack-frame offset at which the variable
is always stored.

Note the contrast with @samp{print &@var{symbol}}, which does not work
at all for a register variable, and for a stack local variable prints
the exact address of the current instantiation of the variable.

@kindex info symbol
@cindex symbol from address
@cindex closest symbol and offset for an address
@item info symbol @var{addr}
Print the name of a symbol which is stored at the address @var{addr}.
If no symbol is stored exactly at @var{addr}, @value{GDBN} prints the
nearest symbol and an offset from it:

@smallexample
(@value{GDBP}) info symbol 0x54320
_initialize_vx + 396 in section .text
@end smallexample

@noindent
This is the opposite of the @code{info address} command.  You can use
it to find out the name of a variable or a function given its address.

For dynamically linked executables, the name of executable or shared
library containing the symbol is also printed:

@smallexample
(@value{GDBP}) info symbol 0x400225
_start + 5 in section .text of /tmp/a.out
(@value{GDBP}) info symbol 0x2aaaac2811cf
__read_nocancel + 6 in section .text of /usr/lib64/libc.so.6
@end smallexample

@kindex demangle
@cindex demangle
@item demangle @r{[}-l @var{language}@r{]} @r{[}@var{--}@r{]} @var{name}
Demangle @var{name}.
If @var{language} is provided it is the name of the language to demangle
@var{name} in.  Otherwise @var{name} is demangled in the current language.

The @samp{--} option specifies the end of options,
and is useful when @var{name} begins with a dash.

The parameter @code{demangle-style} specifies how to interpret the kind
of mangling used. @xref{Print Settings}.

@kindex whatis
@item whatis[/@var{flags}] [@var{arg}]
Print the data type of @var{arg}, which can be either an expression
or a name of a data type.  With no argument, print the data type of
@code{$}, the last value in the value history.

If @var{arg} is an expression (@pxref{Expressions, ,Expressions}), it
is not actually evaluated, and any side-effecting operations (such as
assignments or function calls) inside it do not take place.

If @var{arg} is a variable or an expression, @code{whatis} prints its
literal type as it is used in the source code.  If the type was
defined using a @code{typedef}, @code{whatis} will @emph{not} print
the data type underlying the @code{typedef}.  If the type of the
variable or the expression is a compound data type, such as
@code{struct} or  @code{class}, @code{whatis} never prints their
fields or methods.  It just prints the @code{struct}/@code{class}
name (a.k.a.@: its @dfn{tag}).  If you want to see the members of
such a compound data type, use @code{ptype}.

If @var{arg} is a type name that was defined using @code{typedef},
@code{whatis} @dfn{unrolls} only one level of that @code{typedef}.
Unrolling means that @code{whatis} will show the underlying type used
in the @code{typedef} declaration of @var{arg}.  However, if that
underlying type is also a @code{typedef}, @code{whatis} will not
unroll it.

For C code, the type names may also have the form @samp{class
@var{class-name}}, @samp{struct @var{struct-tag}}, @samp{union
@var{union-tag}} or @samp{enum @var{enum-tag}}.

@var{flags} can be used to modify how the type is displayed.
Available flags are:

@table @code
@item r
Display in ``raw'' form.  Normally, @value{GDBN} substitutes template
parameters and typedefs defined in a class when printing the class'
members.  The @code{/r} flag disables this.

@item m
Do not print methods defined in the class.

@item M
Print methods defined in the class.  This is the default, but the flag
exists in case you change the default with @command{set print type methods}.

@item t
Do not print typedefs defined in the class.  Note that this controls
whether the typedef definition itself is printed, not whether typedef
names are substituted when printing other types.

@item T
Print typedefs defined in the class.  This is the default, but the flag
exists in case you change the default with @command{set print type typedefs}.
@end table

@kindex ptype
@item ptype[/@var{flags}] [@var{arg}]
@code{ptype} accepts the same arguments as @code{whatis}, but prints a
detailed description of the type, instead of just the name of the type.
@xref{Expressions, ,Expressions}.

Contrary to @code{whatis}, @code{ptype} always unrolls any
@code{typedef}s in its argument declaration, whether the argument is
a variable, expression, or a data type.  This means that @code{ptype}
of a variable or an expression will not print literally its type as
present in the source code---use @code{whatis} for that.  @code{typedef}s at
the pointer or reference targets are also unrolled.  Only @code{typedef}s of
fields, methods and inner @code{class typedef}s of @code{struct}s,
@code{class}es and @code{union}s are not unrolled even with @code{ptype}.

For example, for this variable declaration:

@smallexample
typedef double real_t;
struct complex @{ real_t real; double imag; @};
typedef struct complex complex_t;
complex_t var;
real_t *real_pointer_var;
@end smallexample

@noindent
the two commands give this output:

@smallexample
@group
(@value{GDBP}) whatis var
type = complex_t
(@value{GDBP}) ptype var
type = struct complex @{
    real_t real;
    double imag;
@}
(@value{GDBP}) whatis complex_t
type = struct complex
(@value{GDBP}) whatis struct complex
type = struct complex
(@value{GDBP}) ptype struct complex
type = struct complex @{
    real_t real;
    double imag;
@}
(@value{GDBP}) whatis real_pointer_var
type = real_t *
(@value{GDBP}) ptype real_pointer_var
type = double *
@end group
@end smallexample

@noindent
As with @code{whatis}, using @code{ptype} without an argument refers to
the type of @code{$}, the last value in the value history.

@cindex incomplete type
Sometimes, programs use opaque data types or incomplete specifications
of complex data structure.  If the debug information included in the
program does not allow @value{GDBN} to display a full declaration of
the data type, it will say @samp{<incomplete type>}.  For example,
given these declarations:

@smallexample
    struct foo;
    struct foo *fooptr;
@end smallexample

@noindent
but no definition for @code{struct foo} itself, @value{GDBN} will say:

@smallexample
  (@value{GDBP}) ptype foo
  $1 = <incomplete type>
@end smallexample

@noindent
``Incomplete type'' is C terminology for data types that are not
completely specified.

@kindex info types
@item info types @var{regexp}
@itemx info types
Print a brief description of all types whose names match the regular
expression @var{regexp} (or all types in your program, if you supply
no argument).  Each complete typename is matched as though it were a
complete line; thus, @samp{i type value} gives information on all
types in your program whose names include the string @code{value}, but
@samp{i type ^value$} gives information only on types whose complete
name is @code{value}.

This command differs from @code{ptype} in two ways: first, like
@code{whatis}, it does not print a detailed description; second, it
lists all source files where a type is defined.

@kindex info type-printers
@item info type-printers
Versions of @value{GDBN} that ship with Python scripting enabled may
have ``type printers'' available.  When using @command{ptype} or
@command{whatis}, these printers are consulted when the name of a type
is needed.  @xref{Type Printing API}, for more information on writing
type printers.

@code{info type-printers} displays all the available type printers.

@kindex enable type-printer
@kindex disable type-printer
@item enable type-printer @var{name}@dots{}
@item disable type-printer @var{name}@dots{}
These commands can be used to enable or disable type printers.

@kindex info scope
@cindex local variables
@item info scope @var{location}
List all the variables local to a particular scope.  This command
accepts a @var{location} argument---a function name, a source line, or
an address preceded by a @samp{*}, and prints all the variables local
to the scope defined by that location.  (@xref{Specify Location}, for
details about supported forms of @var{location}.)  For example:

@smallexample
(@value{GDBP}) @b{info scope command_line_handler}
Scope for command_line_handler:
Symbol rl is an argument at stack/frame offset 8, length 4.
Symbol linebuffer is in static storage at address 0x150a18, length 4.
Symbol linelength is in static storage at address 0x150a1c, length 4.
Symbol p is a local variable in register $esi, length 4.
Symbol p1 is a local variable in register $ebx, length 4.
Symbol nline is a local variable in register $edx, length 4.
Symbol repeat is a local variable at frame offset -8, length 4.
@end smallexample

@noindent
This command is especially useful for determining what data to collect
during a @dfn{trace experiment}, see @ref{Tracepoint Actions,
collect}.

@kindex info source
@item info source
Show information about the current source file---that is, the source file for
the function containing the current point of execution:
@itemize @bullet
@item
the name of the source file, and the directory containing it,
@item
the directory it was compiled in,
@item
its length, in lines,
@item
which programming language it is written in,
@item
if the debug information provides it, the program that compiled the file
(which may include, e.g., the compiler version and command line arguments),
@item
whether the executable includes debugging information for that file, and
if so, what format the information is in (e.g., STABS, Dwarf 2, etc.), and
@item
whether the debugging information includes information about
preprocessor macros.
@end itemize


@kindex info sources
@item info sources
Print the names of all source files in your program for which there is
debugging information, organized into two lists: files whose symbols
have already been read, and files whose symbols will be read when needed.

@kindex info functions
@item info functions
Print the names and data types of all defined functions.

@item info functions @var{regexp}
Print the names and data types of all defined functions
whose names contain a match for regular expression @var{regexp}.
Thus, @samp{info fun step} finds all functions whose names
include @code{step}; @samp{info fun ^step} finds those whose names
start with @code{step}.  If a function name contains characters
that conflict with the regular expression language (e.g.@:
@samp{operator*()}), they may be quoted with a backslash.

@kindex info variables
@item info variables
Print the names and data types of all variables that are defined
outside of functions (i.e.@: excluding local variables).

@item info variables @var{regexp}
Print the names and data types of all variables (except for local
variables) whose names contain a match for regular expression
@var{regexp}.

@kindex info classes
@cindex Objective-C, classes and selectors
@item info classes
@itemx info classes @var{regexp}
Display all Objective-C classes in your program, or
(with the @var{regexp} argument) all those matching a particular regular
expression.

@kindex info selectors
@item info selectors
@itemx info selectors @var{regexp}
Display all Objective-C selectors in your program, or
(with the @var{regexp} argument) all those matching a particular regular
expression.

@ignore
This was never implemented.
@kindex info methods
@item info methods
@itemx info methods @var{regexp}
The @code{info methods} command permits the user to examine all defined
methods within C@t{++} program, or (with the @var{regexp} argument) a
specific set of methods found in the various C@t{++} classes.  Many
C@t{++} classes provide a large number of methods.  Thus, the output
from the @code{ptype} command can be overwhelming and hard to use.  The
@code{info-methods} command filters the methods, printing only those
which match the regular-expression @var{regexp}.
@end ignore

@cindex opaque data types
@kindex set opaque-type-resolution
@item set opaque-type-resolution on
Tell @value{GDBN} to resolve opaque types.  An opaque type is a type
declared as a pointer to a @code{struct}, @code{class}, or
@code{union}---for example, @code{struct MyType *}---that is used in one
source file although the full declaration of @code{struct MyType} is in
another source file.  The default is on.

A change in the setting of this subcommand will not take effect until
the next time symbols for a file are loaded.

@item set opaque-type-resolution off
Tell @value{GDBN} not to resolve opaque types.  In this case, the type
is printed as follows:
@smallexample
@{<no data fields>@}
@end smallexample

@kindex show opaque-type-resolution
@item show opaque-type-resolution
Show whether opaque types are resolved or not.

@kindex set print symbol-loading
@cindex print messages when symbols are loaded
@item set print symbol-loading
@itemx set print symbol-loading full
@itemx set print symbol-loading brief
@itemx set print symbol-loading off
The @code{set print symbol-loading} command allows you to control the
printing of messages when @value{GDBN} loads symbol information.
By default a message is printed for the executable and one for each
shared library, and normally this is what you want.  However, when
debugging apps with large numbers of shared libraries these messages
can be annoying.
When set to @code{brief} a message is printed for each executable,
and when @value{GDBN} loads a collection of shared libraries at once
it will only print one message regardless of the number of shared
libraries.  When set to @code{off} no messages are printed.

@kindex show print symbol-loading
@item show print symbol-loading
Show whether messages will be printed when a @value{GDBN} command
entered from the keyboard causes symbol information to be loaded.

@kindex maint print symbols
@cindex symbol dump
@kindex maint print psymbols
@cindex partial symbol dump
@kindex maint print msymbols
@cindex minimal symbol dump
@item maint print symbols @var{filename}
@itemx maint print psymbols @var{filename}
@itemx maint print msymbols @var{filename}
Write a dump of debugging symbol data into the file @var{filename}.
These commands are used to debug the @value{GDBN} symbol-reading code.  Only
symbols with debugging data are included.  If you use @samp{maint print
symbols}, @value{GDBN} includes all the symbols for which it has already
collected full details: that is, @var{filename} reflects symbols for
only those files whose symbols @value{GDBN} has read.  You can use the
command @code{info sources} to find out which files these are.  If you
use @samp{maint print psymbols} instead, the dump shows information about
symbols that @value{GDBN} only knows partially---that is, symbols defined in
files that @value{GDBN} has skimmed, but not yet read completely.  Finally,
@samp{maint print msymbols} dumps just the minimal symbol information
required for each object file from which @value{GDBN} has read some symbols.
@xref{Files, ,Commands to Specify Files}, for a discussion of how
@value{GDBN} reads symbols (in the description of @code{symbol-file}).

@kindex maint info symtabs
@kindex maint info psymtabs
@cindex listing @value{GDBN}'s internal symbol tables
@cindex symbol tables, listing @value{GDBN}'s internal
@cindex full symbol tables, listing @value{GDBN}'s internal
@cindex partial symbol tables, listing @value{GDBN}'s internal
@item maint info symtabs @r{[} @var{regexp} @r{]}
@itemx maint info psymtabs @r{[} @var{regexp} @r{]}

List the @code{struct symtab} or @code{struct partial_symtab}
structures whose names match @var{regexp}.  If @var{regexp} is not
given, list them all.  The output includes expressions which you can
copy into a @value{GDBN} debugging this one to examine a particular
structure in more detail.  For example:

@smallexample
(@value{GDBP}) maint info psymtabs dwarf2read
@{ objfile /home/gnu/build/gdb/gdb
  ((struct objfile *) 0x82e69d0)
  @{ psymtab /home/gnu/src/gdb/dwarf2read.c
    ((struct partial_symtab *) 0x8474b10)
    readin no
    fullname (null)
    text addresses 0x814d3c8 -- 0x8158074
    globals (* (struct partial_symbol **) 0x8507a08 @@ 9)
    statics (* (struct partial_symbol **) 0x40e95b78 @@ 2882)
    dependencies (none)
  @}
@}
(@value{GDBP}) maint info symtabs
(@value{GDBP})
@end smallexample
@noindent
We see that there is one partial symbol table whose filename contains
the string @samp{dwarf2read}, belonging to the @samp{gdb} executable;
and we see that @value{GDBN} has not read in any symtabs yet at all.
If we set a breakpoint on a function, that will cause @value{GDBN} to
read the symtab for the compilation unit containing that function:

@smallexample
(@value{GDBP}) break dwarf2_psymtab_to_symtab
Breakpoint 1 at 0x814e5da: file /home/gnu/src/gdb/dwarf2read.c,
line 1574.
(@value{GDBP}) maint info symtabs
@{ objfile /home/gnu/build/gdb/gdb
  ((struct objfile *) 0x82e69d0)
  @{ symtab /home/gnu/src/gdb/dwarf2read.c
    ((struct symtab *) 0x86c1f38)
    dirname (null)
    fullname (null)
    blockvector ((struct blockvector *) 0x86c1bd0) (primary)
    linetable ((struct linetable *) 0x8370fa0)
    debugformat DWARF 2
  @}
@}
(@value{GDBP})
@end smallexample

@kindex maint set symbol-cache-size
@cindex symbol cache size
@item maint set symbol-cache-size @var{size}
Set the size of the symbol cache to @var{size}.
The default size is intended to be good enough for debugging
most applications.  This option exists to allow for experimenting
with different sizes.

@kindex maint show symbol-cache-size
@item maint show symbol-cache-size
Show the size of the symbol cache.

@kindex maint print symbol-cache
@cindex symbol cache, printing its contents
@item maint print symbol-cache
Print the contents of the symbol cache.
This is useful when debugging symbol cache issues.

@kindex maint print symbol-cache-statistics
@cindex symbol cache, printing usage statistics
@item maint print symbol-cache-statistics
Print symbol cache usage statistics.
This helps determine how well the cache is being utilized.

@kindex maint flush-symbol-cache
@cindex symbol cache, flushing
@item maint flush-symbol-cache
Flush the contents of the symbol cache, all entries are removed.
This command is useful when debugging the symbol cache.
It is also useful when collecting performance data.

@end table

@node Altering
@chapter Altering Execution

Once you think you have found an error in your program, you might want to
find out for certain whether correcting the apparent error would lead to
correct results in the rest of the run.  You can find the answer by
experiment, using the @value{GDBN} features for altering execution of the
program.

For example, you can store new values into variables or memory
locations, give your program a signal, restart it at a different
address, or even return prematurely from a function.

@menu
* Assignment::                  Assignment to variables
* Jumping::                     Continuing at a different address
* Signaling::                   Giving your program a signal
* Returning::                   Returning from a function
* Calling::                     Calling your program's functions
* Patching::                    Patching your program
* Compiling and Injecting Code:: Compiling and injecting code in @value{GDBN}
@end menu

@node Assignment
@section Assignment to Variables

@cindex assignment
@cindex setting variables
To alter the value of a variable, evaluate an assignment expression.
@xref{Expressions, ,Expressions}.  For example,

@smallexample
print x=4
@end smallexample

@noindent
stores the value 4 into the variable @code{x}, and then prints the
value of the assignment expression (which is 4).
@xref{Languages, ,Using @value{GDBN} with Different Languages}, for more
information on operators in supported languages.

@kindex set variable
@cindex variables, setting
If you are not interested in seeing the value of the assignment, use the
@code{set} command instead of the @code{print} command.  @code{set} is
really the same as @code{print} except that the expression's value is
not printed and is not put in the value history (@pxref{Value History,
,Value History}).  The expression is evaluated only for its effects.

If the beginning of the argument string of the @code{set} command
appears identical to a @code{set} subcommand, use the @code{set
variable} command instead of just @code{set}.  This command is identical
to @code{set} except for its lack of subcommands.  For example, if your
program has a variable @code{width}, you get an error if you try to set
a new value with just @samp{set width=13}, because @value{GDBN} has the
command @code{set width}:

@smallexample
(@value{GDBP}) whatis width
type = double
(@value{GDBP}) p width
$4 = 13
(@value{GDBP}) set width=47
Invalid syntax in expression.
@end smallexample

@noindent
The invalid expression, of course, is @samp{=47}.  In
order to actually set the program's variable @code{width}, use

@smallexample
(@value{GDBP}) set var width=47
@end smallexample

Because the @code{set} command has many subcommands that can conflict
with the names of program variables, it is a good idea to use the
@code{set variable} command instead of just @code{set}.  For example, if
your program has a variable @code{g}, you run into problems if you try
to set a new value with just @samp{set g=4}, because @value{GDBN} has
the command @code{set gnutarget}, abbreviated @code{set g}:

@smallexample
@group
(@value{GDBP}) whatis g
type = double
(@value{GDBP}) p g
$1 = 1
(@value{GDBP}) set g=4
(@value{GDBP}) p g
$2 = 1
(@value{GDBP}) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/smith/cc_progs/a.out
"/home/smith/cc_progs/a.out": can't open to read symbols:
                                 Invalid bfd target.
(@value{GDBP}) show g
The current BFD target is "=4".
@end group
@end smallexample

@noindent
The program variable @code{g} did not change, and you silently set the
@code{gnutarget} to an invalid value.  In order to set the variable
@code{g}, use

@smallexample
(@value{GDBP}) set var g=4
@end smallexample

@value{GDBN} allows more implicit conversions in assignments than C; you can
freely store an integer value into a pointer variable or vice versa,
and you can convert any structure to any other structure that is the
same length or shorter.
@comment FIXME: how do structs align/pad in these conversions?
@comment        /doc@cygnus.com 18dec1990

To store values into arbitrary places in memory, use the @samp{@{@dots{}@}}
construct to generate a value of specified type at a specified address
(@pxref{Expressions, ,Expressions}).  For example, @code{@{int@}0x83040} refers
to memory location @code{0x83040} as an integer (which implies a certain size
and representation in memory), and

@smallexample
set @{int@}0x83040 = 4
@end smallexample

@noindent
stores the value 4 into that memory location.

@node Jumping
@section Continuing at a Different Address

Ordinarily, when you continue your program, you do so at the place where
it stopped, with the @code{continue} command.  You can instead continue at
an address of your own choosing, with the following commands:

@table @code
@kindex jump
@kindex j @r{(@code{jump})}
@item jump @var{linespec}
@itemx j @var{linespec}
@itemx jump @var{location}
@itemx j @var{location}
Resume execution at line @var{linespec} or at address given by
@var{location}.  Execution stops again immediately if there is a
breakpoint there.  @xref{Specify Location}, for a description of the
different forms of @var{linespec} and @var{location}.  It is common
practice to use the @code{tbreak} command in conjunction with
@code{jump}.  @xref{Set Breaks, ,Setting Breakpoints}.

The @code{jump} command does not change the current stack frame, or
the stack pointer, or the contents of any memory location or any
register other than the program counter.  If line @var{linespec} is in
a different function from the one currently executing, the results may
be bizarre if the two functions expect different patterns of arguments or
of local variables.  For this reason, the @code{jump} command requests
confirmation if the specified line is not in the function currently
executing.  However, even bizarre results are predictable if you are
well acquainted with the machine-language code of your program.
@end table

@c Doesn't work on HP-UX; have to set $pcoqh and $pcoqt.
On many systems, you can get much the same effect as the @code{jump}
command by storing a new value into the register @code{$pc}.  The
difference is that this does not start your program running; it only
changes the address of where it @emph{will} run when you continue.  For
example,

@smallexample
set $pc = 0x485
@end smallexample

@noindent
makes the next @code{continue} command or stepping command execute at
address @code{0x485}, rather than at the address where your program stopped.
@xref{Continuing and Stepping, ,Continuing and Stepping}.

The most common occasion to use the @code{jump} command is to back
up---perhaps with more breakpoints set---over a portion of a program
that has already executed, in order to examine its execution in more
detail.

@c @group
@node Signaling
@section Giving your Program a Signal
@cindex deliver a signal to a program

@table @code
@kindex signal
@item signal @var{signal}
Resume execution where your program is stopped, but immediately give it the
signal @var{signal}.  The @var{signal} can be the name or the number of a
signal.  For example, on many systems @code{signal 2} and @code{signal
SIGINT} are both ways of sending an interrupt signal.

Alternatively, if @var{signal} is zero, continue execution without
giving a signal.  This is useful when your program stopped on account of
a signal and would ordinarily see the signal when resumed with the
@code{continue} command; @samp{signal 0} causes it to resume without a
signal.

@emph{Note:} When resuming a multi-threaded program, @var{signal} is
delivered to the currently selected thread, not the thread that last
reported a stop.  This includes the situation where a thread was
stopped due to a signal.  So if you want to continue execution
suppressing the signal that stopped a thread, you should select that
same thread before issuing the @samp{signal 0} command.  If you issue
the @samp{signal 0} command with another thread as the selected one,
@value{GDBN} detects that and asks for confirmation.

Invoking the @code{signal} command is not the same as invoking the
@code{kill} utility from the shell.  Sending a signal with @code{kill}
causes @value{GDBN} to decide what to do with the signal depending on
the signal handling tables (@pxref{Signals}).  The @code{signal} command
passes the signal directly to your program.

@code{signal} does not repeat when you press @key{RET} a second time
after executing the command.

@kindex queue-signal
@item queue-signal @var{signal}
Queue @var{signal} to be delivered immediately to the current thread
when execution of the thread resumes.  The @var{signal} can be the name or
the number of a signal.  For example, on many systems @code{signal 2} and
@code{signal SIGINT} are both ways of sending an interrupt signal.
The handling of the signal must be set to pass the signal to the program,
otherwise @value{GDBN} will report an error.
You can control the handling of signals from @value{GDBN} with the
@code{handle} command (@pxref{Signals}).

Alternatively, if @var{signal} is zero, any currently queued signal
for the current thread is discarded and when execution resumes no signal
will be delivered.  This is useful when your program stopped on account
of a signal and would ordinarily see the signal when resumed with the
@code{continue} command.

This command differs from the @code{signal} command in that the signal
is just queued, execution is not resumed.  And @code{queue-signal} cannot
be used to pass a signal whose handling state has been set to @code{nopass}
(@pxref{Signals}).
@end table
@c @end group

@xref{stepping into signal handlers}, for information on how stepping
commands behave when the thread has a signal queued.

@node Returning
@section Returning from a Function

@table @code
@cindex returning from a function
@kindex return
@item return
@itemx return @var{expression}
You can cancel execution of a function call with the @code{return}
command.  If you give an
@var{expression} argument, its value is used as the function's return
value.
@end table

When you use @code{return}, @value{GDBN} discards the selected stack frame
(and all frames within it).  You can think of this as making the
discarded frame return prematurely.  If you wish to specify a value to
be returned, give that value as the argument to @code{return}.

This pops the selected stack frame (@pxref{Selection, ,Selecting a
Frame}), and any other frames inside of it, leaving its caller as the
innermost remaining frame.  That frame becomes selected.  The
specified value is stored in the registers used for returning values
of functions.

The @code{return} command does not resume execution; it leaves the
program stopped in the state that would exist if the function had just
returned.  In contrast, the @code{finish} command (@pxref{Continuing
and Stepping, ,Continuing and Stepping}) resumes execution until the
selected stack frame returns naturally.

@value{GDBN} needs to know how the @var{expression} argument should be set for
the inferior.  The concrete registers assignment depends on the OS ABI and the
type being returned by the selected stack frame.  For example it is common for
OS ABI to return floating point values in FPU registers while integer values in
CPU registers.  Still some ABIs return even floating point values in CPU
registers.  Larger integer widths (such as @code{long long int}) also have
specific placement rules.  @value{GDBN} already knows the OS ABI from its
current target so it needs to find out also the type being returned to make the
assignment into the right register(s).

Normally, the selected stack frame has debug info.  @value{GDBN} will always
use the debug info instead of the implicit type of @var{expression} when the
debug info is available.  For example, if you type @kbd{return -1}, and the
function in the current stack frame is declared to return a @code{long long
int}, @value{GDBN} transparently converts the implicit @code{int} value of -1
into a @code{long long int}:

@smallexample
Breakpoint 1, func () at gdb.base/return-nodebug.c:29
29        return 31;
(@value{GDBP}) return -1
Make func return now? (y or n) y
#0  0x004004f6 in main () at gdb.base/return-nodebug.c:43
43        printf ("result=%lld\n", func ());
(@value{GDBP})
@end smallexample

However, if the selected stack frame does not have a debug info, e.g., if the
function was compiled without debug info, @value{GDBN} has to find out the type
to return from user.  Specifying a different type by mistake may set the value
in different inferior registers than the caller code expects.  For example,
typing @kbd{return -1} with its implicit type @code{int} would set only a part
of a @code{long long int} result for a debug info less function (on 32-bit
architectures).  Therefore the user is required to specify the return type by
an appropriate cast explicitly:

@smallexample
Breakpoint 2, 0x0040050b in func ()
(@value{GDBP}) return -1
Return value type not available for selected stack frame.
Please use an explicit cast of the value to return.
(@value{GDBP}) return (long long int) -1
Make selected stack frame return now? (y or n) y
#0  0x00400526 in main ()
(@value{GDBP})
@end smallexample

@node Calling
@section Calling Program Functions

@table @code
@cindex calling functions
@cindex inferior functions, calling
@item print @var{expr}
Evaluate the expression @var{expr} and display the resulting value.
The expression may include calls to functions in the program being
debugged.

@kindex call
@item call @var{expr}
Evaluate the expression @var{expr} without displaying @code{void}
returned values.

You can use this variant of the @code{print} command if you want to
execute a function from your program that does not return anything
(a.k.a.@: @dfn{a void function}), but without cluttering the output
with @code{void} returned values that @value{GDBN} will otherwise
print.  If the result is not void, it is printed and saved in the
value history.
@end table

It is possible for the function you call via the @code{print} or
@code{call} command to generate a signal (e.g., if there's a bug in
the function, or if you passed it incorrect arguments).  What happens
in that case is controlled by the @code{set unwindonsignal} command.

Similarly, with a C@t{++} program it is possible for the function you
call via the @code{print} or @code{call} command to generate an
exception that is not handled due to the constraints of the dummy
frame.  In this case, any exception that is raised in the frame, but has
an out-of-frame exception handler will not be found.  GDB builds a
dummy-frame for the inferior function call, and the unwinder cannot
seek for exception handlers outside of this dummy-frame.  What happens
in that case is controlled by the
@code{set unwind-on-terminating-exception} command.

@table @code
@item set unwindonsignal
@kindex set unwindonsignal
@cindex unwind stack in called functions
@cindex call dummy stack unwinding
Set unwinding of the stack if a signal is received while in a function
that @value{GDBN} called in the program being debugged.  If set to on,
@value{GDBN} unwinds the stack it created for the call and restores
the context to what it was before the call.  If set to off (the
default), @value{GDBN} stops in the frame where the signal was
received.

@item show unwindonsignal
@kindex show unwindonsignal
Show the current setting of stack unwinding in the functions called by
@value{GDBN}.

@item set unwind-on-terminating-exception
@kindex set unwind-on-terminating-exception
@cindex unwind stack in called functions with unhandled exceptions
@cindex call dummy stack unwinding on unhandled exception.
Set unwinding of the stack if a C@t{++} exception is raised, but left
unhandled while in a function that @value{GDBN} called in the program being
debugged.  If set to on (the default), @value{GDBN} unwinds the stack
it created for the call and restores the context to what it was before
the call.  If set to off, @value{GDBN} the exception is delivered to
the default C@t{++} exception handler and the inferior terminated.

@item show unwind-on-terminating-exception
@kindex show unwind-on-terminating-exception
Show the current setting of stack unwinding in the functions called by
@value{GDBN}.

@end table

@cindex weak alias functions
Sometimes, a function you wish to call is actually a @dfn{weak alias}
for another function.  In such case, @value{GDBN} might not pick up
the type information, including the types of the function arguments,
which causes @value{GDBN} to call the inferior function incorrectly.
As a result, the called function will function erroneously and may
even crash.  A solution to that is to use the name of the aliased
function instead.

@node Patching
@section Patching Programs

@cindex patching binaries
@cindex writing into executables
@cindex writing into corefiles

By default, @value{GDBN} opens the file containing your program's
executable code (or the corefile) read-only.  This prevents accidental
alterations to machine code; but it also prevents you from intentionally
patching your program's binary.

If you'd like to be able to patch the binary, you can specify that
explicitly with the @code{set write} command.  For example, you might
want to turn on internal debugging flags, or even to make emergency
repairs.

@table @code
@kindex set write
@item set write on
@itemx set write off
If you specify @samp{set write on}, @value{GDBN} opens executable and
core files for both reading and writing; if you specify @kbd{set write
off} (the default), @value{GDBN} opens them read-only.

If you have already loaded a file, you must load it again (using the
@code{exec-file} or @code{core-file} command) after changing @code{set
write}, for your new setting to take effect.

@item show write
@kindex show write
Display whether executable files and core files are opened for writing
as well as reading.
@end table

@node Compiling and Injecting Code
@section Compiling and injecting code in @value{GDBN}
@cindex injecting code
@cindex writing into executables
@cindex compiling code

@value{GDBN} supports on-demand compilation and code injection into
programs running under @value{GDBN}.  GCC 5.0 or higher built with
@file{libcc1.so} must be installed for this functionality to be enabled.
This functionality is implemented with the following commands.

@table @code
@kindex compile code
@item compile code @var{source-code}
@itemx compile code -raw @var{--} @var{source-code}
Compile @var{source-code} with the compiler language found as the current
language in @value{GDBN} (@pxref{Languages}).  If compilation and
injection is not supported with the current language specified in
@value{GDBN}, or the compiler does not support this feature, an error
message will be printed.  If @var{source-code} compiles and links
successfully, @value{GDBN} will load the object-code emitted,
and execute it within the context of the currently selected inferior.
It is important to note that the compiled code is executed immediately.
After execution, the compiled code is removed from @value{GDBN} and any
new types or variables you have defined will be deleted.

The command allows you to specify @var{source-code} in two ways.
The simplest method is to provide a single line of code to the command.
E.g.:

@smallexample
compile code printf ("hello world\n");
@end smallexample

If you specify options on the command line as well as source code, they
may conflict.  The @samp{--} delimiter can be used to separate options
from actual source code.  E.g.:

@smallexample
compile code -r -- printf ("hello world\n");
@end smallexample

Alternatively you can enter source code as multiple lines of text.  To
enter this mode, invoke the @samp{compile code} command without any text
following the command.  This will start the multiple-line editor and
allow you to type as many lines of source code as required.  When you
have completed typing, enter @samp{end} on its own line to exit the
editor.

@smallexample
compile code
>printf ("hello\n");
>printf ("world\n");
>end
@end smallexample

Specifying @samp{-raw}, prohibits @value{GDBN} from wrapping the
provided @var{source-code} in a callable scope.  In this case, you must
specify the entry point of the code by defining a function named
@code{_gdb_expr_}.  The @samp{-raw} code cannot access variables of the
inferior.  Using @samp{-raw} option may be needed for example when
@var{source-code} requires @samp{#include} lines which may conflict with
inferior symbols otherwise.

@kindex compile file
@item compile file @var{filename}
@itemx compile file -raw @var{filename}
Like @code{compile code}, but take the source code from @var{filename}.

@smallexample
compile file /home/user/example.c
@end smallexample
@end table

@subsection Caveats when using the @code{compile} command

There are a few caveats to keep in mind when using the @code{compile}
command.  As the caveats are different per language, the table below
highlights specific issues on a per language basis.

@table @asis
@item C code examples and caveats
When the language in @value{GDBN} is set to @samp{C}, the compiler will
attempt to compile the source code with a @samp{C} compiler.  The source
code provided to the @code{compile} command will have much the same
access to variables and types as it normally would if it were part of
the program currently being debugged in @value{GDBN}.

Below is a sample program that forms the basis of the examples that
follow.  This program has been compiled and loaded into @value{GDBN},
much like any other normal debugging session.

@smallexample
void function1 (void)
@{
   int i = 42;
   printf ("function 1\n");
@}

void function2 (void)
@{
   int j = 12;
   function1 ();
@}

int main(void)
@{
   int k = 6;
   int *p;
   function2 ();
   return 0;
@}
@end smallexample

For the purposes of the examples in this section, the program above has
been compiled, loaded into @value{GDBN}, stopped at the function
@code{main}, and @value{GDBN} is awaiting input from the user.

To access variables and types for any program in @value{GDBN}, the
program must be compiled and packaged with debug information.  The
@code{compile} command is not an exception to this rule.  Without debug
information, you can still use the @code{compile} command, but you will
be very limited in what variables and types you can access.

So with that in mind, the example above has been compiled with debug
information enabled.  The @code{compile} command will have access to
all variables and types (except those that may have been optimized
out).  Currently, as @value{GDBN} has stopped the program in the
@code{main} function, the @code{compile} command would have access to
the variable @code{k}.  You could invoke the @code{compile} command
and type some source code to set the value of @code{k}.  You can also
read it, or do anything with that variable you would normally do in
@code{C}.  Be aware that changes to inferior variables in the
@code{compile} command are persistent.  In the following example:

@smallexample
compile code k = 3;
@end smallexample

@noindent
the variable @code{k} is now 3.  It will retain that value until
something else in the example program changes it, or another
@code{compile} command changes it.

Normal scope and access rules apply to source code compiled and
injected by the @code{compile} command.  In the example, the variables
@code{j} and @code{k} are not accessible yet, because the program is
currently stopped in the @code{main} function, where these variables
are not in scope.  Therefore, the following command

@smallexample
compile code j = 3;
@end smallexample

@noindent
will result in a compilation error message.

Once the program is continued, execution will bring these variables in
scope, and they will become accessible; then the code you specify via
the @code{compile} command will be able to access them.

You can create variables and types with the @code{compile} command as
part of your source code.  Variables and types that are created as part
of the @code{compile} command are not visible to the rest of the program for
the duration of its run.  This example is valid:

@smallexample
compile code int ff = 5; printf ("ff is %d\n", ff);
@end smallexample

However, if you were to type the following into @value{GDBN} after that
command has completed:

@smallexample
compile code printf ("ff is %d\n'', ff);
@end smallexample

@noindent
a compiler error would be raised as the variable @code{ff} no longer
exists.  Object code generated and injected by the @code{compile}
command is removed when its execution ends.  Caution is advised
when assigning to program variables values of variables created by the
code submitted to the @code{compile} command.  This example is valid:

@smallexample
compile code int ff = 5; k = ff;
@end smallexample

The value of the variable @code{ff} is assigned to @code{k}.  The variable
@code{k} does not require the existence of @code{ff} to maintain the value
it has been assigned.  However, pointers require particular care in
assignment.  If the source code compiled with the @code{compile} command
changed the address of a pointer in the example program, perhaps to a
variable created in the @code{compile} command, that pointer would point
to an invalid location when the command exits.  The following example
would likely cause issues with your debugged program:

@smallexample
compile code int ff = 5; p = &ff;
@end smallexample

In this example, @code{p} would point to @code{ff} when the
@code{compile} command is executing the source code provided to it.
However, as variables in the (example) program persist with their
assigned values, the variable @code{p} would point to an invalid
location when the command exists.  A general rule should be followed
in that you should either assign @code{NULL} to any assigned pointers,
or restore a valid location to the pointer before the command exits.

Similar caution must be exercised with any structs, unions, and typedefs
defined in @code{compile} command.  Types defined in the @code{compile}
command will no longer be available in the next @code{compile} command.
Therefore, if you cast a variable to a type defined in the
@code{compile} command, care must be taken to ensure that any future
need to resolve the type can be achieved.

@smallexample
(gdb) compile code static struct a @{ int a; @} v = @{ 42 @}; argv = &v;
(gdb) compile code printf ("%d\n", ((struct a *) argv)->a);
gdb command line:1:36: error: dereferencing pointer to incomplete type ‘struct a’
Compilation failed.
(gdb) compile code struct a @{ int a; @}; printf ("%d\n", ((struct a *) argv)->a);
42
@end smallexample

Variables that have been optimized away by the compiler are not
accessible to the code submitted to the @code{compile} command.
Access to those variables will generate a compiler error which @value{GDBN}
will print to the console.
@end table

@node GDB Files
@chapter @value{GDBN} Files

@value{GDBN} needs to know the file name of the program to be debugged,
both in order to read its symbol table and in order to start your
program.  To debug a core dump of a previous run, you must also tell
@value{GDBN} the name of the core dump file.

@menu
* Files::                       Commands to specify files
* Separate Debug Files::        Debugging information in separate files
* MiniDebugInfo::               Debugging information in a special section
* Index Files::                 Index files speed up GDB
* Symbol Errors::               Errors reading symbol files
* Data Files::                  GDB data files
@end menu

@node Files
@section Commands to Specify Files

@cindex symbol table
@cindex core dump file

You may want to specify executable and core dump file names.  The usual
way to do this is at start-up time, using the arguments to
@value{GDBN}'s start-up commands (@pxref{Invocation, , Getting In and
Out of @value{GDBN}}).

Occasionally it is necessary to change to a different file during a
@value{GDBN} session.  Or you may run @value{GDBN} and forget to
specify a file you want to use.  Or you are debugging a remote target
via @code{gdbserver} (@pxref{Server, file, Using the @code{gdbserver}
Program}).  In these situations the @value{GDBN} commands to specify
new files are useful.

@table @code
@cindex executable file
@kindex file
@item file @var{filename}
Use @var{filename} as the program to be debugged.  It is read for its
symbols and for the contents of pure memory.  It is also the program
executed when you use the @code{run} command.  If you do not specify a
directory and the file is not found in the @value{GDBN} working directory,
@value{GDBN} uses the environment variable @code{PATH} as a list of
directories to search, just as the shell does when looking for a program
to run.  You can change the value of this variable, for both @value{GDBN}
and your program, using the @code{path} command.

@cindex unlinked object files
@cindex patching object files
You can load unlinked object @file{.o} files into @value{GDBN} using
the @code{file} command.  You will not be able to ``run'' an object
file, but you can disassemble functions and inspect variables.  Also,
if the underlying BFD functionality supports it, you could use
@kbd{gdb -write} to patch object files using this technique.  Note
that @value{GDBN} can neither interpret nor modify relocations in this
case, so branches and some initialized variables will appear to go to
the wrong place.  But this feature is still handy from time to time.

@item file
@code{file} with no argument makes @value{GDBN} discard any information it
has on both executable file and the symbol table.

@kindex exec-file
@item exec-file @r{[} @var{filename} @r{]}
Specify that the program to be run (but not the symbol table) is found
in @var{filename}.  @value{GDBN} searches the environment variable @code{PATH}
if necessary to locate your program.  Omitting @var{filename} means to
discard information on the executable file.

@kindex symbol-file
@item symbol-file @r{[} @var{filename} @r{]}
Read symbol table information from file @var{filename}.  @code{PATH} is
searched when necessary.  Use the @code{file} command to get both symbol
table and program to run from the same file.

@code{symbol-file} with no argument clears out @value{GDBN} information on your
program's symbol table.

The @code{symbol-file} command causes @value{GDBN} to forget the contents of
some breakpoints and auto-display expressions.  This is because they may
contain pointers to the internal data recording symbols and data types,
which are part of the old symbol table data being discarded inside
@value{GDBN}.

@code{symbol-file} does not repeat if you press @key{RET} again after
executing it once.

When @value{GDBN} is configured for a particular environment, it
understands debugging information in whatever format is the standard
generated for that environment; you may use either a @sc{gnu} compiler, or
other compilers that adhere to the local conventions.
Best results are usually obtained from @sc{gnu} compilers; for example,
using @code{@value{NGCC}} you can generate debugging information for
optimized code.

For most kinds of object files, with the exception of old SVR3 systems
using COFF, the @code{symbol-file} command does not normally read the
symbol table in full right away.  Instead, it scans the symbol table
quickly to find which source files and which symbols are present.  The
details are read later, one source file at a time, as they are needed.

The purpose of this two-stage reading strategy is to make @value{GDBN}
start up faster.  For the most part, it is invisible except for
occasional pauses while the symbol table details for a particular source
file are being read.  (The @code{set verbose} command can turn these
pauses into messages if desired.  @xref{Messages/Warnings, ,Optional
Warnings and Messages}.)

We have not implemented the two-stage strategy for COFF yet.  When the
symbol table is stored in COFF format, @code{symbol-file} reads the
symbol table data in full right away.  Note that ``stabs-in-COFF''
still does the two-stage strategy, since the debug info is actually
in stabs format.

@kindex readnow
@cindex reading symbols immediately
@cindex symbols, reading immediately
@item symbol-file @r{[} -readnow @r{]} @var{filename}
@itemx file @r{[} -readnow @r{]} @var{filename}
You can override the @value{GDBN} two-stage strategy for reading symbol
tables by using the @samp{-readnow} option with any of the commands that
load symbol table information, if you want to be sure @value{GDBN} has the
entire symbol table available.

@c FIXME: for now no mention of directories, since this seems to be in
@c flux.  13mar1992 status is that in theory GDB would look either in
@c current dir or in same dir as myprog; but issues like competing
@c GDB's, or clutter in system dirs, mean that in practice right now
@c only current dir is used.  FFish says maybe a special GDB hierarchy
@c (eg rooted in val of env var GDBSYMS) could exist for mappable symbol
@c files.

@kindex core-file
@item core-file @r{[}@var{filename}@r{]}
@itemx core
Specify the whereabouts of a core dump file to be used as the ``contents
of memory''.  Traditionally, core files contain only some parts of the
address space of the process that generated them; @value{GDBN} can access the
executable file itself for other parts.

@code{core-file} with no argument specifies that no core file is
to be used.

Note that the core file is ignored when your program is actually running
under @value{GDBN}.  So, if you have been running your program and you
wish to debug a core file instead, you must kill the subprocess in which
the program is running.  To do this, use the @code{kill} command
(@pxref{Kill Process, ,Killing the Child Process}).

@kindex add-symbol-file
@cindex dynamic linking
@item add-symbol-file @var{filename} @var{address}
@itemx add-symbol-file @var{filename} @var{address} @r{[} -readnow @r{]}
@itemx add-symbol-file @var{filename} @var{address} -s @var{section} @var{address} @dots{}
The @code{add-symbol-file} command reads additional symbol table
information from the file @var{filename}.  You would use this command
when @var{filename} has been dynamically loaded (by some other means)
into the program that is running.  The @var{address} should give the memory
address at which the file has been loaded; @value{GDBN} cannot figure
this out for itself.  You can additionally specify an arbitrary number
of @samp{-s @var{section} @var{address}} pairs, to give an explicit
section name and base address for that section.  You can specify any
@var{address} as an expression.

The symbol table of the file @var{filename} is added to the symbol table
originally read with the @code{symbol-file} command.  You can use the
@code{add-symbol-file} command any number of times; the new symbol data
thus read is kept in addition to the old.

Changes can be reverted using the command @code{remove-symbol-file}.

@cindex relocatable object files, reading symbols from
@cindex object files, relocatable, reading symbols from
@cindex reading symbols from relocatable object files
@cindex symbols, reading from relocatable object files
@cindex @file{.o} files, reading symbols from
Although @var{filename} is typically a shared library file, an
executable file, or some other object file which has been fully
relocated for loading into a process, you can also load symbolic
information from relocatable @file{.o} files, as long as:

@itemize @bullet
@item
the file's symbolic information refers only to linker symbols defined in
that file, not to symbols defined by other object files,
@item
every section the file's symbolic information refers to has actually
been loaded into the inferior, as it appears in the file, and
@item
you can determine the address at which every section was loaded, and
provide these to the @code{add-symbol-file} command.
@end itemize

@noindent
Some embedded operating systems, like Sun Chorus and VxWorks, can load
relocatable files into an already running program; such systems
typically make the requirements above easy to meet.  However, it's
important to recognize that many native systems use complex link
procedures (@code{.linkonce} section factoring and C@t{++} constructor table
assembly, for example) that make the requirements difficult to meet.  In
general, one cannot assume that using @code{add-symbol-file} to read a
relocatable object file's symbolic information will have the same effect
as linking the relocatable object file into the program in the normal
way.

@code{add-symbol-file} does not repeat if you press @key{RET} after using it.

@kindex remove-symbol-file
@item remove-symbol-file @var{filename}
@item remove-symbol-file -a @var{address}
Remove a symbol file added via the @code{add-symbol-file} command.  The
file to remove can be identified by its @var{filename} or by an @var{address}
that lies within the boundaries of this symbol file in memory.  Example:

@smallexample
(gdb) add-symbol-file /home/user/gdb/mylib.so 0x7ffff7ff9480
add symbol table from file "/home/user/gdb/mylib.so" at
    .text_addr = 0x7ffff7ff9480
(y or n) y
Reading symbols from /home/user/gdb/mylib.so...done.
(gdb) remove-symbol-file -a 0x7ffff7ff9480
Remove symbol table from file "/home/user/gdb/mylib.so"? (y or n) y
(gdb)
@end smallexample


@code{remove-symbol-file} does not repeat if you press @key{RET} after using it.

@kindex add-symbol-file-from-memory
@cindex @code{syscall DSO}
@cindex load symbols from memory
@item add-symbol-file-from-memory @var{address}
Load symbols from the given @var{address} in a dynamically loaded
object file whose image is mapped directly into the inferior's memory.
For example, the Linux kernel maps a @code{syscall DSO} into each
process's address space; this DSO provides kernel-specific code for
some system calls.  The argument can be any expression whose
evaluation yields the address of the file's shared object file header.
For this command to work, you must have used @code{symbol-file} or
@code{exec-file} commands in advance.

@kindex section
@item section @var{section} @var{addr}
The @code{section} command changes the base address of the named
@var{section} of the exec file to @var{addr}.  This can be used if the
exec file does not contain section addresses, (such as in the
@code{a.out} format), or when the addresses specified in the file
itself are wrong.  Each section must be changed separately.  The
@code{info files} command, described below, lists all the sections and
their addresses.

@kindex info files
@kindex info target
@item info files
@itemx info target
@code{info files} and @code{info target} are synonymous; both print the
current target (@pxref{Targets, ,Specifying a Debugging Target}),
including the names of the executable and core dump files currently in
use by @value{GDBN}, and the files from which symbols were loaded.  The
command @code{help target} lists all possible targets rather than
current ones.

@kindex maint info sections
@item maint info sections
Another command that can give you extra information about program sections
is @code{maint info sections}.  In addition to the section information
displayed by @code{info files}, this command displays the flags and file
offset of each section in the executable and core dump files.  In addition,
@code{maint info sections} provides the following command options (which
may be arbitrarily combined):

@table @code
@item ALLOBJ
Display sections for all loaded object files, including shared libraries.
@item @var{sections}
Display info only for named @var{sections}.
@item @var{section-flags}
Display info only for sections for which @var{section-flags} are true.
The section flags that @value{GDBN} currently knows about are:
@table @code
@item ALLOC
Section will have space allocated in the process when loaded.
Set for all sections except those containing debug information.
@item LOAD
Section will be loaded from the file into the child process memory.
Set for pre-initialized code and data, clear for @code{.bss} sections.
@item RELOC
Section needs to be relocated before loading.
@item READONLY
Section cannot be modified by the child process.
@item CODE
Section contains executable code only.
@item DATA
Section contains data only (no executable code).
@item ROM
Section will reside in ROM.
@item CONSTRUCTOR
Section contains data for constructor/destructor lists.
@item HAS_CONTENTS
Section is not empty.
@item NEVER_LOAD
An instruction to the linker to not output the section.
@item COFF_SHARED_LIBRARY
A notification to the linker that the section contains
COFF shared library information.
@item IS_COMMON
Section contains common symbols.
@end table
@end table
@kindex set trust-readonly-sections
@cindex read-only sections
@item set trust-readonly-sections on
Tell @value{GDBN} that readonly sections in your object file
really are read-only (i.e.@: that their contents will not change).
In that case, @value{GDBN} can fetch values from these sections
out of the object file, rather than from the target program.
For some targets (notably embedded ones), this can be a significant
enhancement to debugging performance.

The default is off.

@item set trust-readonly-sections off
Tell @value{GDBN} not to trust readonly sections.  This means that
the contents of the section might change while the program is running,
and must therefore be fetched from the target when needed.

@item show trust-readonly-sections
Show the current setting of trusting readonly sections.
@end table

All file-specifying commands allow both absolute and relative file names
as arguments.  @value{GDBN} always converts the file name to an absolute file
name and remembers it that way.

@cindex shared libraries
@anchor{Shared Libraries}
@value{GDBN} supports @sc{gnu}/Linux, MS-Windows, HP-UX, SunOS, SVr4, Irix,
and IBM RS/6000 AIX shared libraries.

On MS-Windows @value{GDBN} must be linked with the Expat library to support
shared libraries.  @xref{Expat}.

@value{GDBN} automatically loads symbol definitions from shared libraries
when you use the @code{run} command, or when you examine a core file.
(Before you issue the @code{run} command, @value{GDBN} does not understand
references to a function in a shared library, however---unless you are
debugging a core file).

On HP-UX, if the program loads a library explicitly, @value{GDBN}
automatically loads the symbols at the time of the @code{shl_load} call.

@c FIXME: some @value{GDBN} release may permit some refs to undef
@c FIXME...symbols---eg in a break cmd---assuming they are from a shared
@c FIXME...lib; check this from time to time when updating manual

There are times, however, when you may wish to not automatically load
symbol definitions from shared libraries, such as when they are
particularly large or there are many of them.

To control the automatic loading of shared library symbols, use the
commands:

@table @code
@kindex set auto-solib-add
@item set auto-solib-add @var{mode}
If @var{mode} is @code{on}, symbols from all shared object libraries
will be loaded automatically when the inferior begins execution, you
attach to an independently started inferior, or when the dynamic linker
informs @value{GDBN} that a new library has been loaded.  If @var{mode}
is @code{off}, symbols must be loaded manually, using the
@code{sharedlibrary} command.  The default value is @code{on}.

@cindex memory used for symbol tables
If your program uses lots of shared libraries with debug info that
takes large amounts of memory, you can decrease the @value{GDBN}
memory footprint by preventing it from automatically loading the
symbols from shared libraries.  To that end, type @kbd{set
auto-solib-add off} before running the inferior, then load each
library whose debug symbols you do need with @kbd{sharedlibrary
@var{regexp}}, where @var{regexp} is a regular expression that matches
the libraries whose symbols you want to be loaded.

@kindex show auto-solib-add
@item show auto-solib-add
Display the current autoloading mode.
@end table

@cindex load shared library
To explicitly load shared library symbols, use the @code{sharedlibrary}
command:

@table @code
@kindex info sharedlibrary
@kindex info share
@item info share @var{regex}
@itemx info sharedlibrary @var{regex}
Print the names of the shared libraries which are currently loaded
that match @var{regex}.  If @var{regex} is omitted then print
all shared libraries that are loaded.

@kindex sharedlibrary
@kindex share
@item sharedlibrary @var{regex}
@itemx share @var{regex}
Load shared object library symbols for files matching a
Unix regular expression.
As with files loaded automatically, it only loads shared libraries
required by your program for a core file or after typing @code{run}.  If
@var{regex} is omitted all shared libraries required by your program are
loaded.

@item nosharedlibrary
@kindex nosharedlibrary
@cindex unload symbols from shared libraries
Unload all shared object library symbols.  This discards all symbols
that have been loaded from all shared libraries.  Symbols from shared
libraries that were loaded by explicit user requests are not
discarded.
@end table

Sometimes you may wish that @value{GDBN} stops and gives you control
when any of shared library events happen.  The best way to do this is
to use @code{catch load} and @code{catch unload} (@pxref{Set
Catchpoints}).

@value{GDBN} also supports the the @code{set stop-on-solib-events}
command for this.  This command exists for historical reasons.  It is
less useful than setting a catchpoint, because it does not allow for
conditions or commands as a catchpoint does.

@table @code
@item set stop-on-solib-events
@kindex set stop-on-solib-events
This command controls whether @value{GDBN} should give you control
when the dynamic linker notifies it about some shared library event.
The most common event of interest is loading or unloading of a new
shared library.

@item show stop-on-solib-events
@kindex show stop-on-solib-events
Show whether @value{GDBN} stops and gives you control when shared
library events happen.
@end table

Shared libraries are also supported in many cross or remote debugging
configurations.  @value{GDBN} needs to have access to the target's libraries;
this can be accomplished either by providing copies of the libraries
on the host system, or by asking @value{GDBN} to automatically retrieve the
libraries from the target.  If copies of the target libraries are
provided, they need to be the same as the target libraries, although the
copies on the target can be stripped as long as the copies on the host are
not.

@cindex where to look for shared libraries
For remote debugging, you need to tell @value{GDBN} where the target
libraries are, so that it can load the correct copies---otherwise, it
may try to load the host's libraries.  @value{GDBN} has two variables
to specify the search directories for target libraries.

@table @code
@cindex prefix for shared library file names
@cindex system root, alternate
@kindex set solib-absolute-prefix
@kindex set sysroot
@item set sysroot @var{path}
Use @var{path} as the system root for the program being debugged.  Any
absolute shared library paths will be prefixed with @var{path}; many
runtime loaders store the absolute paths to the shared library in the
target program's memory.  If you use @code{set sysroot} to find shared
libraries, they need to be laid out in the same way that they are on
the target, with e.g.@: a @file{/lib} and @file{/usr/lib} hierarchy
under @var{path}.

If @var{path} starts with the sequence @file{remote:}, @value{GDBN} will 
retrieve the target libraries from the remote system.  This is only
supported when using a remote target that supports the @code{remote get}
command (@pxref{File Transfer,,Sending files to a remote system}).
The part of @var{path} following the initial @file{remote:}
(if present) is used as system root prefix on the remote file system.
@footnote{If you want to specify a local system root using a directory
that happens to be named @file{remote:}, you need to use some equivalent
variant of the name like @file{./remote:}.}

For targets with an MS-DOS based filesystem, such as MS-Windows and
SymbianOS, @value{GDBN} tries prefixing a few variants of the target
absolute file name with @var{path}.  But first, on Unix hosts,
@value{GDBN} converts all backslash directory separators into forward
slashes, because the backslash is not a directory separator on Unix:

@smallexample
  c:\foo\bar.dll @result{} c:/foo/bar.dll
@end smallexample

Then, @value{GDBN} attempts prefixing the target file name with
@var{path}, and looks for the resulting file name in the host file
system:

@smallexample
  c:/foo/bar.dll @result{} /path/to/sysroot/c:/foo/bar.dll
@end smallexample

If that does not find the shared library, @value{GDBN} tries removing
the @samp{:} character from the drive spec, both for convenience, and,
for the case of the host file system not supporting file names with
colons:

@smallexample
  c:/foo/bar.dll @result{} /path/to/sysroot/c/foo/bar.dll
@end smallexample

This makes it possible to have a system root that mirrors a target
with more than one drive.  E.g., you may want to setup your local
copies of the target system shared libraries like so (note @samp{c} vs
@samp{z}):

@smallexample
 @file{/path/to/sysroot/c/sys/bin/foo.dll}
 @file{/path/to/sysroot/c/sys/bin/bar.dll}
 @file{/path/to/sysroot/z/sys/bin/bar.dll}
@end smallexample

@noindent
and point the system root at @file{/path/to/sysroot}, so that
@value{GDBN} can find the correct copies of both
@file{c:\sys\bin\foo.dll}, and @file{z:\sys\bin\bar.dll}.

If that still does not find the shared library, @value{GDBN} tries
removing the whole drive spec from the target file name:

@smallexample
  c:/foo/bar.dll @result{} /path/to/sysroot/foo/bar.dll
@end smallexample

This last lookup makes it possible to not care about the drive name,
if you don't want or need to.

The @code{set solib-absolute-prefix} command is an alias for @code{set
sysroot}.

@cindex default system root
@cindex @samp{--with-sysroot}
You can set the default system root by using the configure-time
@samp{--with-sysroot} option.  If the system root is inside
@value{GDBN}'s configured binary prefix (set with @samp{--prefix} or
@samp{--exec-prefix}), then the default system root will be updated
automatically if the installed @value{GDBN} is moved to a new
location.

@kindex show sysroot
@item show sysroot
Display the current shared library prefix.

@kindex set solib-search-path
@item set solib-search-path @var{path}
If this variable is set, @var{path} is a colon-separated list of
directories to search for shared libraries.  @samp{solib-search-path}
is used after @samp{sysroot} fails to locate the library, or if the
path to the library is relative instead of absolute.  If you want to
use @samp{solib-search-path} instead of @samp{sysroot}, be sure to set
@samp{sysroot} to a nonexistent directory to prevent @value{GDBN} from
finding your host's libraries.  @samp{sysroot} is preferred; setting
it to a nonexistent directory may interfere with automatic loading
of shared library symbols.

@kindex show solib-search-path
@item show solib-search-path
Display the current shared library search path.

@cindex DOS file-name semantics of file names.
@kindex set target-file-system-kind (unix|dos-based|auto)
@kindex show target-file-system-kind
@item set target-file-system-kind @var{kind}
Set assumed file system kind for target reported file names.

Shared library file names as reported by the target system may not
make sense as is on the system @value{GDBN} is running on.  For
example, when remote debugging a target that has MS-DOS based file
system semantics, from a Unix host, the target may be reporting to
@value{GDBN} a list of loaded shared libraries with file names such as
@file{c:\Windows\kernel32.dll}.  On Unix hosts, there's no concept of
drive letters, so the @samp{c:\} prefix is not normally understood as
indicating an absolute file name, and neither is the backslash
normally considered a directory separator character.  In that case,
the native file system would interpret this whole absolute file name
as a relative file name with no directory components.  This would make
it impossible to point @value{GDBN} at a copy of the remote target's
shared libraries on the host using @code{set sysroot}, and impractical
with @code{set solib-search-path}.  Setting
@code{target-file-system-kind} to @code{dos-based} tells @value{GDBN}
to interpret such file names similarly to how the target would, and to
map them to file names valid on @value{GDBN}'s native file system
semantics.  The value of @var{kind} can be @code{"auto"}, in addition
to one of the supported file system kinds.  In that case, @value{GDBN}
tries to determine the appropriate file system variant based on the
current target's operating system (@pxref{ABI, ,Configuring the
Current ABI}).  The supported file system settings are:

@table @code
@item unix
Instruct @value{GDBN} to assume the target file system is of Unix
kind.  Only file names starting the forward slash (@samp{/}) character
are considered absolute, and the directory separator character is also
the forward slash.

@item dos-based
Instruct @value{GDBN} to assume the target file system is DOS based.
File names starting with either a forward slash, or a drive letter
followed by a colon (e.g., @samp{c:}), are considered absolute, and
both the slash (@samp{/}) and the backslash (@samp{\\}) characters are
considered directory separators.

@item auto
Instruct @value{GDBN} to use the file system kind associated with the
target operating system (@pxref{ABI, ,Configuring the Current ABI}).
This is the default.
@end table
@end table

@cindex file name canonicalization
@cindex base name differences
When processing file names provided by the user, @value{GDBN}
frequently needs to compare them to the file names recorded in the
program's debug info.  Normally, @value{GDBN} compares just the
@dfn{base names} of the files as strings, which is reasonably fast
even for very large programs.  (The base name of a file is the last
portion of its name, after stripping all the leading directories.)
This shortcut in comparison is based upon the assumption that files
cannot have more than one base name.  This is usually true, but
references to files that use symlinks or similar filesystem
facilities violate that assumption.  If your program records files
using such facilities, or if you provide file names to @value{GDBN}
using symlinks etc., you can set @code{basenames-may-differ} to
@code{true} to instruct @value{GDBN} to completely canonicalize each
pair of file names it needs to compare.  This will make file-name
comparisons accurate, but at a price of a significant slowdown.

@table @code
@item set basenames-may-differ
@kindex set basenames-may-differ
Set whether a source file may have multiple base names.

@item show basenames-may-differ
@kindex show basenames-may-differ
Show whether a source file may have multiple base names.
@end table

@node Separate Debug Files
@section Debugging Information in Separate Files
@cindex separate debugging information files
@cindex debugging information in separate files
@cindex @file{.debug} subdirectories
@cindex debugging information directory, global
@cindex global debugging information directories
@cindex build ID, and separate debugging files
@cindex @file{.build-id} directory

@value{GDBN} allows you to put a program's debugging information in a
file separate from the executable itself, in a way that allows
@value{GDBN} to find and load the debugging information automatically.
Since debugging information can be very large---sometimes larger
than the executable code itself---some systems distribute debugging
information for their executables in separate files, which users can
install only when they need to debug a problem.

@value{GDBN} supports two ways of specifying the separate debug info
file:

@itemize @bullet
@item
The executable contains a @dfn{debug link} that specifies the name of
the separate debug info file.  The separate debug file's name is
usually @file{@var{executable}.debug}, where @var{executable} is the
name of the corresponding executable file without leading directories
(e.g., @file{ls.debug} for @file{/usr/bin/ls}).  In addition, the
debug link specifies a 32-bit @dfn{Cyclic Redundancy Check} (CRC)
checksum for the debug file, which @value{GDBN} uses to validate that
the executable and the debug file came from the same build.

@item
The executable contains a @dfn{build ID}, a unique bit string that is
also present in the corresponding debug info file.  (This is supported
only on some operating systems, notably those which use the ELF format
for binary files and the @sc{gnu} Binutils.)  For more details about
this feature, see the description of the @option{--build-id}
command-line option in @ref{Options, , Command Line Options, ld.info,
The GNU Linker}.  The debug info file's name is not specified
explicitly by the build ID, but can be computed from the build ID, see
below.
@end itemize

Depending on the way the debug info file is specified, @value{GDBN}
uses two different methods of looking for the debug file:

@itemize @bullet
@item
For the ``debug link'' method, @value{GDBN} looks up the named file in
the directory of the executable file, then in a subdirectory of that
directory named @file{.debug}, and finally under each one of the global debug
directories, in a subdirectory whose name is identical to the leading
directories of the executable's absolute file name.

@item
For the ``build ID'' method, @value{GDBN} looks in the
@file{.build-id} subdirectory of each one of the global debug directories for
a file named @file{@var{nn}/@var{nnnnnnnn}.debug}, where @var{nn} are the
first 2 hex characters of the build ID bit string, and @var{nnnnnnnn}
are the rest of the bit string.  (Real build ID strings are 32 or more
hex characters, not 10.)
@end itemize

So, for example, suppose you ask @value{GDBN} to debug
@file{/usr/bin/ls}, which has a debug link that specifies the
file @file{ls.debug}, and a build ID whose value in hex is
@code{abcdef1234}.  If the list of the global debug directories includes
@file{/usr/lib/debug}, then @value{GDBN} will look for the following
debug information files, in the indicated order:

@itemize @minus
@item
@file{/usr/lib/debug/.build-id/ab/cdef1234.debug}
@item
@file{/usr/bin/ls.debug}
@item
@file{/usr/bin/.debug/ls.debug}
@item
@file{/usr/lib/debug/usr/bin/ls.debug}.
@end itemize

@anchor{debug-file-directory}
Global debugging info directories default to what is set by @value{GDBN}
configure option @option{--with-separate-debug-dir}.  During @value{GDBN} run
you can also set the global debugging info directories, and view the list
@value{GDBN} is currently using.

@table @code

@kindex set debug-file-directory
@item set debug-file-directory @var{directories}
Set the directories which @value{GDBN} searches for separate debugging
information files to @var{directory}.  Multiple path components can be set
concatenating them by a path separator.

@kindex show debug-file-directory
@item show debug-file-directory
Show the directories @value{GDBN} searches for separate debugging
information files.

@end table

@cindex @code{.gnu_debuglink} sections
@cindex debug link sections
A debug link is a special section of the executable file named
@code{.gnu_debuglink}.  The section must contain:

@itemize
@item
A filename, with any leading directory components removed, followed by
a zero byte,
@item
zero to three bytes of padding, as needed to reach the next four-byte
boundary within the section, and
@item
a four-byte CRC checksum, stored in the same endianness used for the
executable file itself.  The checksum is computed on the debugging
information file's full contents by the function given below, passing
zero as the @var{crc} argument.
@end itemize

Any executable file format can carry a debug link, as long as it can
contain a section named @code{.gnu_debuglink} with the contents
described above.

@cindex @code{.note.gnu.build-id} sections
@cindex build ID sections
The build ID is a special section in the executable file (and in other
ELF binary files that @value{GDBN} may consider).  This section is
often named @code{.note.gnu.build-id}, but that name is not mandatory.
It contains unique identification for the built files---the ID remains
the same across multiple builds of the same build tree.  The default
algorithm SHA1 produces 160 bits (40 hexadecimal characters) of the
content for the build ID string.  The same section with an identical
value is present in the original built binary with symbols, in its
stripped variant, and in the separate debugging information file.

The debugging information file itself should be an ordinary
executable, containing a full set of linker symbols, sections, and
debugging information.  The sections of the debugging information file
should have the same names, addresses, and sizes as the original file,
but they need not contain any data---much like a @code{.bss} section
in an ordinary executable.

The @sc{gnu} binary utilities (Binutils) package includes the
@samp{objcopy} utility that can produce
the separated executable / debugging information file pairs using the
following commands:

@smallexample
@kbd{objcopy --only-keep-debug foo foo.debug}
@kbd{strip -g foo}
@end smallexample

@noindent
These commands remove the debugging
information from the executable file @file{foo} and place it in the file
@file{foo.debug}.  You can use the first, second or both methods to link the
two files:

@itemize @bullet
@item
The debug link method needs the following additional command to also leave
behind a debug link in @file{foo}:

@smallexample
@kbd{objcopy --add-gnu-debuglink=foo.debug foo}
@end smallexample

Ulrich Drepper's @file{elfutils} package, starting with version 0.53, contains
a version of the @code{strip} command such that the command @kbd{strip foo -f
foo.debug} has the same functionality as the two @code{objcopy} commands and
the @code{ln -s} command above, together.

@item
Build ID gets embedded into the main executable using @code{ld --build-id} or
the @value{NGCC} counterpart @code{gcc -Wl,--build-id}.  Build ID support plus
compatibility fixes for debug files separation are present in @sc{gnu} binary
utilities (Binutils) package since version 2.18.
@end itemize

@noindent

@cindex CRC algorithm definition
The CRC used in @code{.gnu_debuglink} is the CRC-32 defined in
IEEE 802.3 using the polynomial:

@c TexInfo requires naked braces for multi-digit exponents for Tex
@c output, but this causes HTML output to barf. HTML has to be set using
@c raw commands. So we end up having to specify this equation in 2
@c different ways!
@ifhtml
@display
@html
 <em>x</em><sup>32</sup> + <em>x</em><sup>26</sup> + <em>x</em><sup>23</sup> + <em>x</em><sup>22</sup> + <em>x</em><sup>16</sup> + <em>x</em><sup>12</sup> + <em>x</em><sup>11</sup>
 + <em>x</em><sup>10</sup> + <em>x</em><sup>8</sup> + <em>x</em><sup>7</sup> + <em>x</em><sup>5</sup> + <em>x</em><sup>4</sup> + <em>x</em><sup>2</sup> + <em>x</em> + 1
@end html
@end display
@end ifhtml
@ifnothtml
@display
 @math{x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11}}
 @math{+ x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1}
@end display
@end ifnothtml

The function is computed byte at a time, taking the least
significant bit of each byte first.  The initial pattern
@code{0xffffffff} is used, to ensure leading zeros affect the CRC and
the final result is inverted to ensure trailing zeros also affect the
CRC.

@emph{Note:} This is the same CRC polynomial as used in handling the
@dfn{Remote Serial Protocol} @code{qCRC} packet (@pxref{qCRC packet}).
However in the case of the Remote Serial Protocol, the CRC is computed
@emph{most} significant bit first, and the result is not inverted, so
trailing zeros have no effect on the CRC value.

To complete the description, we show below the code of the function
which produces the CRC used in @code{.gnu_debuglink}.  Inverting the
initially supplied @code{crc} argument means that an initial call to
this function passing in zero will start computing the CRC using
@code{0xffffffff}.

@kindex gnu_debuglink_crc32
@smallexample
unsigned long
gnu_debuglink_crc32 (unsigned long crc,
                     unsigned char *buf, size_t len)
@{
  static const unsigned long crc32_table[256] =
    @{
      0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
      0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
      0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
      0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
      0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
      0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
      0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
      0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
      0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
      0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
      0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
      0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
      0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
      0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
      0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
      0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
      0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
      0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
      0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
      0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
      0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
      0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
      0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
      0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
      0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
      0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
      0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
      0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
      0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
      0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
      0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
      0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
      0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
      0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
      0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
      0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
      0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
      0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
      0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
      0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
      0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
      0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
      0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
      0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
      0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
      0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
      0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
      0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
      0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
      0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
      0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
      0x2d02ef8d
    @};
  unsigned char *end;

  crc = ~crc & 0xffffffff;
  for (end = buf + len; buf < end; ++buf)
    crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
  return ~crc & 0xffffffff;
@}
@end smallexample

@noindent
This computation does not apply to the ``build ID'' method.

@node MiniDebugInfo
@section Debugging information in a special section
@cindex separate debug sections
@cindex @samp{.gnu_debugdata} section

Some systems ship pre-built executables and libraries that have a
special @samp{.gnu_debugdata} section.  This feature is called
@dfn{MiniDebugInfo}.  This section holds an LZMA-compressed object and
is used to supply extra symbols for backtraces.

The intent of this section is to provide extra minimal debugging
information for use in simple backtraces.  It is not intended to be a
replacement for full separate debugging information (@pxref{Separate
Debug Files}).  The example below shows the intended use; however,
@value{GDBN} does not currently put restrictions on what sort of
debugging information might be included in the section.

@value{GDBN} has support for this extension.  If the section exists,
then it is used provided that no other source of debugging information
can be found, and that @value{GDBN} was configured with LZMA support.

This section can be easily created using @command{objcopy} and other
standard utilities:

@smallexample
# Extract the dynamic symbols from the main binary, there is no need
# to also have these in the normal symbol table.
nm -D @var{binary} --format=posix --defined-only \
  | awk '@{ print $1 @}' | sort > dynsyms

# Extract all the text (i.e. function) symbols from the debuginfo.
# (Note that we actually also accept "D" symbols, for the benefit
# of platforms like PowerPC64 that use function descriptors.)
nm @var{binary} --format=posix --defined-only \
  | awk '@{ if ($2 == "T" || $2 == "t" || $2 == "D") print $1 @}' \
  | sort > funcsyms

# Keep all the function symbols not already in the dynamic symbol
# table.
comm -13 dynsyms funcsyms > keep_symbols

# Separate full debug info into debug binary.
objcopy --only-keep-debug @var{binary} debug

# Copy the full debuginfo, keeping only a minimal set of symbols and
# removing some unnecessary sections.
objcopy -S --remove-section .gdb_index --remove-section .comment \
  --keep-symbols=keep_symbols debug mini_debuginfo

# Drop the full debug info from the original binary.
strip --strip-all -R .comment @var{binary}

# Inject the compressed data into the .gnu_debugdata section of the
# original binary.
xz mini_debuginfo
objcopy --add-section .gnu_debugdata=mini_debuginfo.xz @var{binary}
@end smallexample

@node Index Files
@section Index Files Speed Up @value{GDBN}
@cindex index files
@cindex @samp{.gdb_index} section

When @value{GDBN} finds a symbol file, it scans the symbols in the
file in order to construct an internal symbol table.  This lets most
@value{GDBN} operations work quickly---at the cost of a delay early
on.  For large programs, this delay can be quite lengthy, so
@value{GDBN} provides a way to build an index, which speeds up
startup.

The index is stored as a section in the symbol file.  @value{GDBN} can
write the index to a file, then you can put it into the symbol file
using @command{objcopy}.

To create an index file, use the @code{save gdb-index} command:

@table @code
@item save gdb-index @var{directory}
@kindex save gdb-index
Create an index file for each symbol file currently known by
@value{GDBN}.  Each file is named after its corresponding symbol file,
with @samp{.gdb-index} appended, and is written into the given
@var{directory}.
@end table

Once you have created an index file you can merge it into your symbol
file, here named @file{symfile}, using @command{objcopy}:

@smallexample
$ objcopy --add-section .gdb_index=symfile.gdb-index \
    --set-section-flags .gdb_index=readonly symfile symfile
@end smallexample

@value{GDBN} will normally ignore older versions of @file{.gdb_index}
sections that have been deprecated.  Usually they are deprecated because
they are missing a new feature or have performance issues.
To tell @value{GDBN} to use a deprecated index section anyway
specify @code{set use-deprecated-index-sections on}.
The default is @code{off}.
This can speed up startup, but may result in some functionality being lost.
@xref{Index Section Format}.

@emph{Warning:} Setting @code{use-deprecated-index-sections} to @code{on}
must be done before gdb reads the file.  The following will not work:

@smallexample
$ gdb -ex "set use-deprecated-index-sections on" <program>
@end smallexample

Instead you must do, for example,

@smallexample
$ gdb -iex "set use-deprecated-index-sections on" <program>
@end smallexample

There are currently some limitation on indices.  They only work when
for DWARF debugging information, not stabs.  And, they do not
currently work for programs using Ada.

@node Symbol Errors
@section Errors Reading Symbol Files

While reading a symbol file, @value{GDBN} occasionally encounters problems,
such as symbol types it does not recognize, or known bugs in compiler
output.  By default, @value{GDBN} does not notify you of such problems, since
they are relatively common and primarily of interest to people
debugging compilers.  If you are interested in seeing information
about ill-constructed symbol tables, you can either ask @value{GDBN} to print
only one message about each such type of problem, no matter how many
times the problem occurs; or you can ask @value{GDBN} to print more messages,
to see how many times the problems occur, with the @code{set
complaints} command (@pxref{Messages/Warnings, ,Optional Warnings and
Messages}).

The messages currently printed, and their meanings, include:

@table @code
@item inner block not inside outer block in @var{symbol}

The symbol information shows where symbol scopes begin and end
(such as at the start of a function or a block of statements).  This
error indicates that an inner scope block is not fully contained
in its outer scope blocks.

@value{GDBN} circumvents the problem by treating the inner block as if it had
the same scope as the outer block.  In the error message, @var{symbol}
may be shown as ``@code{(don't know)}'' if the outer block is not a
function.

@item block at @var{address} out of order

The symbol information for symbol scope blocks should occur in
order of increasing addresses.  This error indicates that it does not
do so.

@value{GDBN} does not circumvent this problem, and has trouble
locating symbols in the source file whose symbols it is reading.  (You
can often determine what source file is affected by specifying
@code{set verbose on}.  @xref{Messages/Warnings, ,Optional Warnings and
Messages}.)

@item bad block start address patched

The symbol information for a symbol scope block has a start address
smaller than the address of the preceding source line.  This is known
to occur in the SunOS 4.1.1 (and earlier) C compiler.

@value{GDBN} circumvents the problem by treating the symbol scope block as
starting on the previous source line.

@item bad string table offset in symbol @var{n}

@cindex foo
Symbol number @var{n} contains a pointer into the string table which is
larger than the size of the string table.

@value{GDBN} circumvents the problem by considering the symbol to have the
name @code{foo}, which may cause other problems if many symbols end up
with this name.

@item unknown symbol type @code{0x@var{nn}}

The symbol information contains new data types that @value{GDBN} does
not yet know how to read.  @code{0x@var{nn}} is the symbol type of the
uncomprehended information, in hexadecimal.

@value{GDBN} circumvents the error by ignoring this symbol information.
This usually allows you to debug your program, though certain symbols
are not accessible.  If you encounter such a problem and feel like
debugging it, you can debug @code{@value{GDBP}} with itself, breakpoint
on @code{complain}, then go up to the function @code{read_dbx_symtab}
and examine @code{*bufp} to see the symbol.

@item stub type has NULL name

@value{GDBN} could not find the full definition for a struct or class.

@item const/volatile indicator missing (ok if using g++ v1.x), got@dots{}
The symbol information for a C@t{++} member function is missing some
information that recent versions of the compiler should have output for
it.

@item info mismatch between compiler and debugger

@value{GDBN} could not parse a type specification output by the compiler.

@end table

@node Data Files
@section GDB Data Files

@cindex prefix for data files
@value{GDBN} will sometimes read an auxiliary data file.  These files
are kept in a directory known as the @dfn{data directory}.

You can set the data directory's name, and view the name @value{GDBN}
is currently using.

@table @code
@kindex set data-directory
@item set data-directory @var{directory}
Set the directory which @value{GDBN} searches for auxiliary data files
to @var{directory}.

@kindex show data-directory
@item show data-directory
Show the directory @value{GDBN} searches for auxiliary data files.
@end table

@cindex default data directory
@cindex @samp{--with-gdb-datadir}
You can set the default data directory by using the configure-time
@samp{--with-gdb-datadir} option.  If the data directory is inside
@value{GDBN}'s configured binary prefix (set with @samp{--prefix} or
@samp{--exec-prefix}), then the default data directory will be updated
automatically if the installed @value{GDBN} is moved to a new
location.

The data directory may also be specified with the
@code{--data-directory} command line option.
@xref{Mode Options}.

@node Targets
@chapter Specifying a Debugging Target

@cindex debugging target
A @dfn{target} is the execution environment occupied by your program.

Often, @value{GDBN} runs in the same host environment as your program;
in that case, the debugging target is specified as a side effect when
you use the @code{file} or @code{core} commands.  When you need more
flexibility---for example, running @value{GDBN} on a physically separate
host, or controlling a standalone system over a serial port or a
realtime system over a TCP/IP connection---you can use the @code{target}
command to specify one of the target types configured for @value{GDBN}
(@pxref{Target Commands, ,Commands for Managing Targets}).

@cindex target architecture
It is possible to build @value{GDBN} for several different @dfn{target
architectures}.  When @value{GDBN} is built like that, you can choose
one of the available architectures with the @kbd{set architecture}
command.

@table @code
@kindex set architecture
@kindex show architecture
@item set architecture @var{arch}
This command sets the current target architecture to @var{arch}.  The
value of @var{arch} can be @code{"auto"}, in addition to one of the
supported architectures.

@item show architecture
Show the current target architecture.

@item set processor
@itemx processor
@kindex set processor
@kindex show processor
These are alias commands for, respectively, @code{set architecture}
and @code{show architecture}.
@end table

@menu
* Active Targets::              Active targets
* Target Commands::             Commands for managing targets
* Byte Order::                  Choosing target byte order
@end menu

@node Active Targets
@section Active Targets

@cindex stacking targets
@cindex active targets
@cindex multiple targets

There are multiple classes of targets such as: processes, executable files or
recording sessions.  Core files belong to the process class, making core file
and process mutually exclusive.  Otherwise, @value{GDBN} can work concurrently
on multiple active targets, one in each class.  This allows you to (for
example) start a process and inspect its activity, while still having access to
the executable file after the process finishes.  Or if you start process
recording (@pxref{Reverse Execution}) and @code{reverse-step} there, you are
presented a virtual layer of the recording target, while the process target
remains stopped at the chronologically last point of the process execution.

Use the @code{core-file} and @code{exec-file} commands to select a new core
file or executable target (@pxref{Files, ,Commands to Specify Files}).  To
specify as a target a process that is already running, use the @code{attach}
command (@pxref{Attach, ,Debugging an Already-running Process}).

@node Target Commands
@section Commands for Managing Targets

@table @code
@item target @var{type} @var{parameters}
Connects the @value{GDBN} host environment to a target machine or
process.  A target is typically a protocol for talking to debugging
facilities.  You use the argument @var{type} to specify the type or
protocol of the target machine.

Further @var{parameters} are interpreted by the target protocol, but
typically include things like device names or host names to connect
with, process numbers, and baud rates.

The @code{target} command does not repeat if you press @key{RET} again
after executing the command.

@kindex help target
@item help target
Displays the names of all targets available.  To display targets
currently selected, use either @code{info target} or @code{info files}
(@pxref{Files, ,Commands to Specify Files}).

@item help target @var{name}
Describe a particular target, including any parameters necessary to
select it.

@kindex set gnutarget
@item set gnutarget @var{args}
@value{GDBN} uses its own library BFD to read your files.  @value{GDBN}
knows whether it is reading an @dfn{executable},
a @dfn{core}, or a @dfn{.o} file; however, you can specify the file format
with the @code{set gnutarget} command.  Unlike most @code{target} commands,
with @code{gnutarget} the @code{target} refers to a program, not a machine.

@quotation
@emph{Warning:} To specify a file format with @code{set gnutarget},
you must know the actual BFD name.
@end quotation

@noindent
@xref{Files, , Commands to Specify Files}.

@kindex show gnutarget
@item show gnutarget
Use the @code{show gnutarget} command to display what file format
@code{gnutarget} is set to read.  If you have not set @code{gnutarget},
@value{GDBN} will determine the file format for each file automatically,
and @code{show gnutarget} displays @samp{The current BFD target is "auto"}.
@end table

@cindex common targets
Here are some common targets (available, or not, depending on the GDB
configuration):

@table @code
@kindex target
@item target exec @var{program}
@cindex executable file target
An executable file.  @samp{target exec @var{program}} is the same as
@samp{exec-file @var{program}}.

@item target core @var{filename}
@cindex core dump file target
A core dump file.  @samp{target core @var{filename}} is the same as
@samp{core-file @var{filename}}.

@item target remote @var{medium}
@cindex remote target
A remote system connected to @value{GDBN} via a serial line or network
connection.  This command tells @value{GDBN} to use its own remote
protocol over @var{medium} for debugging.  @xref{Remote Debugging}.

For example, if you have a board connected to @file{/dev/ttya} on the
machine running @value{GDBN}, you could say:

@smallexample
target remote /dev/ttya
@end smallexample

@code{target remote} supports the @code{load} command.  This is only
useful if you have some other way of getting the stub to the target
system, and you can put it somewhere in memory where it won't get
clobbered by the download.

@item target sim @r{[}@var{simargs}@r{]} @dots{}
@cindex built-in simulator target
Builtin CPU simulator.  @value{GDBN} includes simulators for most architectures.
In general,
@smallexample
        target sim
        load
        run
@end smallexample
@noindent
works; however, you cannot assume that a specific memory map, device
drivers, or even basic I/O is available, although some simulators do
provide these.  For info about any processor-specific simulator details,
see the appropriate section in @ref{Embedded Processors, ,Embedded
Processors}.

@item target native
@cindex native target
Setup for local/native process debugging.  Useful to make the
@code{run} command spawn native processes (likewise @code{attach},
etc.@:) even when @code{set auto-connect-native-target} is @code{off}
(@pxref{set auto-connect-native-target}).

@end table

Different targets are available on different configurations of @value{GDBN};
your configuration may have more or fewer targets.

Many remote targets require you to download the executable's code once
you've successfully established a connection.  You may wish to control
various aspects of this process.

@table @code

@item set hash
@kindex set hash@r{, for remote monitors}
@cindex hash mark while downloading
This command controls whether a hash mark @samp{#} is displayed while
downloading a file to the remote monitor.  If on, a hash mark is
displayed after each S-record is successfully downloaded to the
monitor.

@item show hash
@kindex show hash@r{, for remote monitors}
Show the current status of displaying the hash mark.

@item set debug monitor
@kindex set debug monitor
@cindex display remote monitor communications
Enable or disable display of communications messages between
@value{GDBN} and the remote monitor.

@item show debug monitor
@kindex show debug monitor
Show the current status of displaying communications between
@value{GDBN} and the remote monitor.
@end table

@table @code

@kindex load @var{filename}
@item load @var{filename}
@anchor{load}
Depending on what remote debugging facilities are configured into
@value{GDBN}, the @code{load} command may be available.  Where it exists, it
is meant to make @var{filename} (an executable) available for debugging
on the remote system---by downloading, or dynamic linking, for example.
@code{load} also records the @var{filename} symbol table in @value{GDBN}, like
the @code{add-symbol-file} command.

If your @value{GDBN} does not have a @code{load} command, attempting to
execute it gets the error message ``@code{You can't do that when your
target is @dots{}}''

The file is loaded at whatever address is specified in the executable.
For some object file formats, you can specify the load address when you
link the program; for other formats, like a.out, the object file format
specifies a fixed address.
@c FIXME! This would be a good place for an xref to the GNU linker doc.

Depending on the remote side capabilities, @value{GDBN} may be able to
load programs into flash memory.

@code{load} does not repeat if you press @key{RET} again after using it.
@end table

@node Byte Order
@section Choosing Target Byte Order

@cindex choosing target byte order
@cindex target byte order

Some types of processors, such as the @acronym{MIPS}, PowerPC, and Renesas SH,
offer the ability to run either big-endian or little-endian byte
orders.  Usually the executable or symbol will include a bit to
designate the endian-ness, and you will not need to worry about
which to use.  However, you may still find it useful to adjust
@value{GDBN}'s idea of processor endian-ness manually.

@table @code
@kindex set endian
@item set endian big
Instruct @value{GDBN} to assume the target is big-endian.

@item set endian little
Instruct @value{GDBN} to assume the target is little-endian.

@item set endian auto
Instruct @value{GDBN} to use the byte order associated with the
executable.

@item show endian
Display @value{GDBN}'s current idea of the target byte order.

@end table

Note that these commands merely adjust interpretation of symbolic
data on the host, and that they have absolutely no effect on the
target system.


@node Remote Debugging
@chapter Debugging Remote Programs
@cindex remote debugging

If you are trying to debug a program running on a machine that cannot run
@value{GDBN} in the usual way, it is often useful to use remote debugging.
For example, you might use remote debugging on an operating system kernel,
or on a small system which does not have a general purpose operating system
powerful enough to run a full-featured debugger.

Some configurations of @value{GDBN} have special serial or TCP/IP interfaces
to make this work with particular debugging targets.  In addition,
@value{GDBN} comes with a generic serial protocol (specific to @value{GDBN},
but not specific to any particular target system) which you can use if you
write the remote stubs---the code that runs on the remote system to
communicate with @value{GDBN}.

Other remote targets may be available in your
configuration of @value{GDBN}; use @code{help target} to list them.

@menu
* Connecting::                  Connecting to a remote target
* File Transfer::               Sending files to a remote system
* Server::	                Using the gdbserver program
* Remote Configuration::        Remote configuration
* Remote Stub::                 Implementing a remote stub
@end menu

@node Connecting
@section Connecting to a Remote Target

On the @value{GDBN} host machine, you will need an unstripped copy of
your program, since @value{GDBN} needs symbol and debugging information.
Start up @value{GDBN} as usual, using the name of the local copy of your
program as the first argument.

@cindex @code{target remote}
@value{GDBN} can communicate with the target over a serial line, or
over an @acronym{IP} network using @acronym{TCP} or @acronym{UDP}.  In
each case, @value{GDBN} uses the same protocol for debugging your
program; only the medium carrying the debugging packets varies.  The
@code{target remote} command establishes a connection to the target.
Its arguments indicate which medium to use:

@table @code

@item target remote @var{serial-device}
@cindex serial line, @code{target remote}
Use @var{serial-device} to communicate with the target.  For example,
to use a serial line connected to the device named @file{/dev/ttyb}:

@smallexample
target remote /dev/ttyb
@end smallexample

If you're using a serial line, you may want to give @value{GDBN} the
@samp{--baud} option, or use the @code{set serial baud} command
(@pxref{Remote Configuration, set serial baud}) before the
@code{target} command.

@item target remote @code{@var{host}:@var{port}}
@itemx target remote @code{tcp:@var{host}:@var{port}}
@cindex @acronym{TCP} port, @code{target remote}
Debug using a @acronym{TCP} connection to @var{port} on @var{host}.
The @var{host} may be either a host name or a numeric @acronym{IP}
address; @var{port} must be a decimal number.  The @var{host} could be
the target machine itself, if it is directly connected to the net, or
it might be a terminal server which in turn has a serial line to the
target.

For example, to connect to port 2828 on a terminal server named
@code{manyfarms}:

@smallexample
target remote manyfarms:2828
@end smallexample

If your remote target is actually running on the same machine as your
debugger session (e.g.@: a simulator for your target running on the
same host), you can omit the hostname.  For example, to connect to
port 1234 on your local machine:

@smallexample
target remote :1234
@end smallexample
@noindent

Note that the colon is still required here.

@item target remote @code{udp:@var{host}:@var{port}}
@cindex @acronym{UDP} port, @code{target remote}
Debug using @acronym{UDP} packets to @var{port} on @var{host}.  For example, to
connect to @acronym{UDP} port 2828 on a terminal server named @code{manyfarms}:

@smallexample
target remote udp:manyfarms:2828
@end smallexample

When using a @acronym{UDP} connection for remote debugging, you should
keep in mind that the `U' stands for ``Unreliable''.  @acronym{UDP}
can silently drop packets on busy or unreliable networks, which will
cause havoc with your debugging session.

@item target remote | @var{command}
@cindex pipe, @code{target remote} to
Run @var{command} in the background and communicate with it using a
pipe.  The @var{command} is a shell command, to be parsed and expanded
by the system's command shell, @code{/bin/sh}; it should expect remote
protocol packets on its standard input, and send replies on its
standard output.  You could use this to run a stand-alone simulator
that speaks the remote debugging protocol, to make net connections
using programs like @code{ssh}, or for other similar tricks.

If @var{command} closes its standard output (perhaps by exiting),
@value{GDBN} will try to send it a @code{SIGTERM} signal.  (If the
program has already exited, this will have no effect.)

@end table

Once the connection has been established, you can use all the usual
commands to examine and change data.  The remote program is already
running; you can use @kbd{step} and @kbd{continue}, and you do not
need to use @kbd{run}.

@cindex interrupting remote programs
@cindex remote programs, interrupting
Whenever @value{GDBN} is waiting for the remote program, if you type the
interrupt character (often @kbd{Ctrl-c}), @value{GDBN} attempts to stop the
program.  This may or may not succeed, depending in part on the hardware
and the serial drivers the remote system uses.  If you type the
interrupt character once again, @value{GDBN} displays this prompt:

@smallexample
Interrupted while waiting for the program.
Give up (and stop debugging it)?  (y or n)
@end smallexample

If you type @kbd{y}, @value{GDBN} abandons the remote debugging session.
(If you decide you want to try again later, you can use @samp{target
remote} again to connect once more.)  If you type @kbd{n}, @value{GDBN}
goes back to waiting.

@table @code
@kindex detach (remote)
@item detach
When you have finished debugging the remote program, you can use the
@code{detach} command to release it from @value{GDBN} control.
Detaching from the target normally resumes its execution, but the results
will depend on your particular remote stub.  After the @code{detach}
command, @value{GDBN} is free to connect to another target.

@kindex disconnect
@item disconnect
The @code{disconnect} command behaves like @code{detach}, except that
the target is generally not resumed.  It will wait for @value{GDBN}
(this instance or another one) to connect and continue debugging.  After
the @code{disconnect} command, @value{GDBN} is again free to connect to
another target.

@cindex send command to remote monitor
@cindex extend @value{GDBN} for remote targets
@cindex add new commands for external monitor
@kindex monitor
@item monitor @var{cmd}
This command allows you to send arbitrary commands directly to the
remote monitor.  Since @value{GDBN} doesn't care about the commands it
sends like this, this command is the way to extend @value{GDBN}---you
can add new commands that only the external monitor will understand
and implement.
@end table

@node File Transfer
@section Sending files to a remote system
@cindex remote target, file transfer
@cindex file transfer
@cindex sending files to remote systems

Some remote targets offer the ability to transfer files over the same
connection used to communicate with @value{GDBN}.  This is convenient
for targets accessible through other means, e.g.@: @sc{gnu}/Linux systems
running @code{gdbserver} over a network interface.  For other targets,
e.g.@: embedded devices with only a single serial port, this may be
the only way to upload or download files.

Not all remote targets support these commands.

@table @code
@kindex remote put
@item remote put @var{hostfile} @var{targetfile}
Copy file @var{hostfile} from the host system (the machine running
@value{GDBN}) to @var{targetfile} on the target system.

@kindex remote get
@item remote get @var{targetfile} @var{hostfile}
Copy file @var{targetfile} from the target system to @var{hostfile}
on the host system.

@kindex remote delete
@item remote delete @var{targetfile}
Delete @var{targetfile} from the target system.

@end table

@node Server
@section Using the @code{gdbserver} Program

@kindex gdbserver
@cindex remote connection without stubs
@code{gdbserver} is a control program for Unix-like systems, which
allows you to connect your program with a remote @value{GDBN} via
@code{target remote}---but without linking in the usual debugging stub.

@code{gdbserver} is not a complete replacement for the debugging stubs,
because it requires essentially the same operating-system facilities
that @value{GDBN} itself does.  In fact, a system that can run
@code{gdbserver} to connect to a remote @value{GDBN} could also run
@value{GDBN} locally!  @code{gdbserver} is sometimes useful nevertheless,
because it is a much smaller program than @value{GDBN} itself.  It is
also easier to port than all of @value{GDBN}, so you may be able to get
started more quickly on a new system by using @code{gdbserver}.
Finally, if you develop code for real-time systems, you may find that
the tradeoffs involved in real-time operation make it more convenient to
do as much development work as possible on another system, for example
by cross-compiling.  You can use @code{gdbserver} to make a similar
choice for debugging.

@value{GDBN} and @code{gdbserver} communicate via either a serial line
or a TCP connection, using the standard @value{GDBN} remote serial
protocol.

@quotation
@emph{Warning:} @code{gdbserver} does not have any built-in security.
Do not run @code{gdbserver} connected to any public network; a
@value{GDBN} connection to @code{gdbserver} provides access to the
target system with the same privileges as the user running
@code{gdbserver}.
@end quotation

@subsection Running @code{gdbserver}
@cindex arguments, to @code{gdbserver}
@cindex @code{gdbserver}, command-line arguments

Run @code{gdbserver} on the target system.  You need a copy of the
program you want to debug, including any libraries it requires.
@code{gdbserver} does not need your program's symbol table, so you can
strip the program if necessary to save space.  @value{GDBN} on the host
system does all the symbol handling.

To use the server, you must tell it how to communicate with @value{GDBN};
the name of your program; and the arguments for your program.  The usual
syntax is:

@smallexample
target> gdbserver @var{comm} @var{program} [ @var{args} @dots{} ]
@end smallexample

@var{comm} is either a device name (to use a serial line), or a TCP
hostname and portnumber, or @code{-} or @code{stdio} to use
stdin/stdout of @code{gdbserver}.
For example, to debug Emacs with the argument
@samp{foo.txt} and communicate with @value{GDBN} over the serial port
@file{/dev/com1}:

@smallexample
target> gdbserver /dev/com1 emacs foo.txt
@end smallexample

@code{gdbserver} waits passively for the host @value{GDBN} to communicate
with it.

To use a TCP connection instead of a serial line:

@smallexample
target> gdbserver host:2345 emacs foo.txt
@end smallexample

The only difference from the previous example is the first argument,
specifying that you are communicating with the host @value{GDBN} via
TCP.  The @samp{host:2345} argument means that @code{gdbserver} is to
expect a TCP connection from machine @samp{host} to local TCP port 2345.
(Currently, the @samp{host} part is ignored.)  You can choose any number
you want for the port number as long as it does not conflict with any
TCP ports already in use on the target system (for example, @code{23} is
reserved for @code{telnet}).@footnote{If you choose a port number that
conflicts with another service, @code{gdbserver} prints an error message
and exits.}  You must use the same port number with the host @value{GDBN}
@code{target remote} command.

The @code{stdio} connection is useful when starting @code{gdbserver}
with ssh:

@smallexample
(gdb) target remote | ssh -T hostname gdbserver - hello
@end smallexample

The @samp{-T} option to ssh is provided because we don't need a remote pty,
and we don't want escape-character handling.  Ssh does this by default when
a command is provided, the flag is provided to make it explicit.
You could elide it if you want to.

Programs started with stdio-connected gdbserver have @file{/dev/null} for
@code{stdin}, and @code{stdout},@code{stderr} are sent back to gdb for
display through a pipe connected to gdbserver.
Both @code{stdout} and @code{stderr} use the same pipe.

@subsubsection Attaching to a Running Program
@cindex attach to a program, @code{gdbserver}
@cindex @option{--attach}, @code{gdbserver} option

On some targets, @code{gdbserver} can also attach to running programs.
This is accomplished via the @code{--attach} argument.  The syntax is:

@smallexample
target> gdbserver --attach @var{comm} @var{pid}
@end smallexample

@var{pid} is the process ID of a currently running process.  It isn't necessary
to point @code{gdbserver} at a binary for the running process.

@pindex pidof
You can debug processes by name instead of process ID if your target has the
@code{pidof} utility:

@smallexample
target> gdbserver --attach @var{comm} `pidof @var{program}`
@end smallexample

In case more than one copy of @var{program} is running, or @var{program}
has multiple threads, most versions of @code{pidof} support the
@code{-s} option to only return the first process ID.

@subsubsection Multi-Process Mode for @code{gdbserver}
@cindex @code{gdbserver}, multiple processes
@cindex multiple processes with @code{gdbserver}

When you connect to @code{gdbserver} using @code{target remote},
@code{gdbserver} debugs the specified program only once.  When the
program exits, or you detach from it, @value{GDBN} closes the connection
and @code{gdbserver} exits.

If you connect using @kbd{target extended-remote}, @code{gdbserver}
enters multi-process mode.  When the debugged program exits, or you
detach from it, @value{GDBN} stays connected to @code{gdbserver} even
though no program is running.  The @code{run} and @code{attach}
commands instruct @code{gdbserver} to run or attach to a new program.
The @code{run} command uses @code{set remote exec-file} (@pxref{set
remote exec-file}) to select the program to run.  Command line
arguments are supported, except for wildcard expansion and I/O
redirection (@pxref{Arguments}).

@cindex @option{--multi}, @code{gdbserver} option
To start @code{gdbserver} without supplying an initial command to run
or process ID to attach, use the @option{--multi} command line option.
Then you can connect using @kbd{target extended-remote} and start
the program you want to debug.

In multi-process mode @code{gdbserver} does not automatically exit unless you
use the option @option{--once}.  You can terminate it by using
@code{monitor exit} (@pxref{Monitor Commands for gdbserver}).  Note that the
conditions under which @code{gdbserver} terminates depend on how @value{GDBN}
connects to it (@kbd{target remote} or @kbd{target extended-remote}).  The
@option{--multi} option to @code{gdbserver} has no influence on that.

@subsubsection TCP port allocation lifecycle of @code{gdbserver}

This section applies only when @code{gdbserver} is run to listen on a TCP port.

@code{gdbserver} normally terminates after all of its debugged processes have
terminated in @kbd{target remote} mode.  On the other hand, for @kbd{target
extended-remote}, @code{gdbserver} stays running even with no processes left.
@value{GDBN} normally terminates the spawned debugged process on its exit,
which normally also terminates @code{gdbserver} in the @kbd{target remote}
mode.  Therefore, when the connection drops unexpectedly, and @value{GDBN}
cannot ask @code{gdbserver} to kill its debugged processes, @code{gdbserver}
stays running even in the @kbd{target remote} mode.

When @code{gdbserver} stays running, @value{GDBN} can connect to it again later.
Such reconnecting is useful for features like @ref{disconnected tracing}.  For
completeness, at most one @value{GDBN} can be connected at a time.

@cindex @option{--once}, @code{gdbserver} option
By default, @code{gdbserver} keeps the listening TCP port open, so that
subsequent connections are possible.  However, if you start @code{gdbserver}
with the @option{--once} option, it will stop listening for any further
connection attempts after connecting to the first @value{GDBN} session.  This
means no further connections to @code{gdbserver} will be possible after the
first one.  It also means @code{gdbserver} will terminate after the first
connection with remote @value{GDBN} has closed, even for unexpectedly closed
connections and even in the @kbd{target extended-remote} mode.  The
@option{--once} option allows reusing the same port number for connecting to
multiple instances of @code{gdbserver} running on the same host, since each
instance closes its port after the first connection.

@anchor{Other Command-Line Arguments for gdbserver}
@subsubsection Other Command-Line Arguments for @code{gdbserver}

@cindex @option{--debug}, @code{gdbserver} option
The @option{--debug} option tells @code{gdbserver} to display extra
status information about the debugging process.
@cindex @option{--remote-debug}, @code{gdbserver} option
The @option{--remote-debug} option tells @code{gdbserver} to display
remote protocol debug output.  These options are intended for
@code{gdbserver} development and for bug reports to the developers.

@cindex @option{--debug-format}, @code{gdbserver} option
The @option{--debug-format=option1[,option2,...]} option tells
@code{gdbserver} to include additional information in each output.
Possible options are:

@table @code
@item none
Turn off all extra information in debugging output.
@item all
Turn on all extra information in debugging output.
@item timestamps
Include a timestamp in each line of debugging output.
@end table

Options are processed in order.  Thus, for example, if @option{none}
appears last then no additional information is added to debugging output.

@cindex @option{--wrapper}, @code{gdbserver} option
The @option{--wrapper} option specifies a wrapper to launch programs
for debugging.  The option should be followed by the name of the
wrapper, then any command-line arguments to pass to the wrapper, then
@kbd{--} indicating the end of the wrapper arguments.

@code{gdbserver} runs the specified wrapper program with a combined
command line including the wrapper arguments, then the name of the
program to debug, then any arguments to the program.  The wrapper
runs until it executes your program, and then @value{GDBN} gains control.

You can use any program that eventually calls @code{execve} with
its arguments as a wrapper.  Several standard Unix utilities do
this, e.g.@: @code{env} and @code{nohup}.  Any Unix shell script ending
with @code{exec "$@@"} will also work.

For example, you can use @code{env} to pass an environment variable to
the debugged program, without setting the variable in @code{gdbserver}'s
environment:

@smallexample
$ gdbserver --wrapper env LD_PRELOAD=libtest.so -- :2222 ./testprog
@end smallexample

@subsection Connecting to @code{gdbserver}

Run @value{GDBN} on the host system.

First make sure you have the necessary symbol files.  Load symbols for
your application using the @code{file} command before you connect.  Use
@code{set sysroot} to locate target libraries (unless your @value{GDBN}
was compiled with the correct sysroot using @code{--with-sysroot}).

The symbol file and target libraries must exactly match the executable
and libraries on the target, with one exception: the files on the host
system should not be stripped, even if the files on the target system
are.  Mismatched or missing files will lead to confusing results
during debugging.  On @sc{gnu}/Linux targets, mismatched or missing
files may also prevent @code{gdbserver} from debugging multi-threaded
programs.

Connect to your target (@pxref{Connecting,,Connecting to a Remote Target}).
For TCP connections, you must start up @code{gdbserver} prior to using
the @code{target remote} command.  Otherwise you may get an error whose
text depends on the host system, but which usually looks something like
@samp{Connection refused}.  Don't use the @code{load}
command in @value{GDBN} when using @code{gdbserver}, since the program is
already on the target.

@subsection Monitor Commands for @code{gdbserver}
@cindex monitor commands, for @code{gdbserver}
@anchor{Monitor Commands for gdbserver}

During a @value{GDBN} session using @code{gdbserver}, you can use the
@code{monitor} command to send special requests to @code{gdbserver}.
Here are the available commands.

@table @code
@item monitor help
List the available monitor commands.

@item monitor set debug 0
@itemx monitor set debug 1
Disable or enable general debugging messages.

@item monitor set remote-debug 0
@itemx monitor set remote-debug 1
Disable or enable specific debugging messages associated with the remote
protocol (@pxref{Remote Protocol}).

@item monitor set debug-format option1@r{[},option2,...@r{]}
Specify additional text to add to debugging messages.
Possible options are:

@table @code
@item none
Turn off all extra information in debugging output.
@item all
Turn on all extra information in debugging output.
@item timestamps
Include a timestamp in each line of debugging output.
@end table

Options are processed in order.  Thus, for example, if @option{none}
appears last then no additional information is added to debugging output.

@item monitor set libthread-db-search-path [PATH]
@cindex gdbserver, search path for @code{libthread_db}
When this command is issued, @var{path} is a colon-separated list of
directories to search for @code{libthread_db} (@pxref{Threads,,set
libthread-db-search-path}).  If you omit @var{path},
@samp{libthread-db-search-path} will be reset to its default value.

The special entry @samp{$pdir} for @samp{libthread-db-search-path} is
not supported in @code{gdbserver}.

@item monitor exit
Tell gdbserver to exit immediately.  This command should be followed by
@code{disconnect} to close the debugging session.  @code{gdbserver} will
detach from any attached processes and kill any processes it created.
Use @code{monitor exit} to terminate @code{gdbserver} at the end
of a multi-process mode debug session.

@end table

@subsection Tracepoints support in @code{gdbserver}
@cindex tracepoints support in @code{gdbserver}

On some targets, @code{gdbserver} supports tracepoints, fast
tracepoints and static tracepoints.

For fast or static tracepoints to work, a special library called the
@dfn{in-process agent} (IPA), must be loaded in the inferior process.
This library is built and distributed as an integral part of
@code{gdbserver}.  In addition, support for static tracepoints
requires building the in-process agent library with static tracepoints
support.  At present, the UST (LTTng Userspace Tracer,
@url{http://lttng.org/ust}) tracing engine is supported.  This support
is automatically available if UST development headers are found in the
standard include path when @code{gdbserver} is built, or if
@code{gdbserver} was explicitly configured using @option{--with-ust}
to point at such headers.  You can explicitly disable the support
using @option{--with-ust=no}.

There are several ways to load the in-process agent in your program:

@table @code
@item Specifying it as dependency at link time

You can link your program dynamically with the in-process agent
library.  On most systems, this is accomplished by adding
@code{-linproctrace} to the link command.

@item Using the system's preloading mechanisms

You can force loading the in-process agent at startup time by using
your system's support for preloading shared libraries.  Many Unixes
support the concept of preloading user defined libraries.  In most
cases, you do that by specifying @code{LD_PRELOAD=libinproctrace.so}
in the environment.  See also the description of @code{gdbserver}'s
@option{--wrapper} command line option.

@item Using @value{GDBN} to force loading the agent at run time

On some systems, you can force the inferior to load a shared library,
by calling a dynamic loader function in the inferior that takes care
of dynamically looking up and loading a shared library.  On most Unix
systems, the function is @code{dlopen}.  You'll use the @code{call}
command for that.  For example:

@smallexample
(@value{GDBP}) call dlopen ("libinproctrace.so", ...)
@end smallexample

Note that on most Unix systems, for the @code{dlopen} function to be
available, the program needs to be linked with @code{-ldl}.
@end table

On systems that have a userspace dynamic loader, like most Unix
systems, when you connect to @code{gdbserver} using @code{target
remote}, you'll find that the program is stopped at the dynamic
loader's entry point, and no shared library has been loaded in the
program's address space yet, including the in-process agent.  In that
case, before being able to use any of the fast or static tracepoints
features, you need to let the loader run and load the shared
libraries.  The simplest way to do that is to run the program to the
main procedure.  E.g., if debugging a C or C@t{++} program, start
@code{gdbserver} like so:

@smallexample
$ gdbserver :9999 myprogram
@end smallexample

Start GDB and connect to @code{gdbserver} like so, and run to main:

@smallexample
$ gdb myprogram
(@value{GDBP}) target remote myhost:9999
0x00007f215893ba60 in ?? () from /lib64/ld-linux-x86-64.so.2
(@value{GDBP}) b main
(@value{GDBP}) continue
@end smallexample

The in-process tracing agent library should now be loaded into the
process; you can confirm it with the @code{info sharedlibrary}
command, which will list @file{libinproctrace.so} as loaded in the
process.  You are now ready to install fast tracepoints, list static
tracepoint markers, probe static tracepoints markers, and start
tracing.

@node Remote Configuration
@section Remote Configuration

@kindex set remote
@kindex show remote
This section documents the configuration options available when
debugging remote programs.  For the options related to the File I/O
extensions of the remote protocol, see @ref{system,
system-call-allowed}.

@table @code
@item set remoteaddresssize @var{bits}
@cindex address size for remote targets
@cindex bits in remote address
Set the maximum size of address in a memory packet to the specified
number of bits.  @value{GDBN} will mask off the address bits above
that number, when it passes addresses to the remote target.  The
default value is the number of bits in the target's address.

@item show remoteaddresssize
Show the current value of remote address size in bits.

@item set serial baud @var{n}
@cindex baud rate for remote targets
Set the baud rate for the remote serial I/O to @var{n} baud.  The
value is used to set the speed of the serial port used for debugging
remote targets.

@item show serial baud
Show the current speed of the remote connection.

@item set remotebreak
@cindex interrupt remote programs
@cindex BREAK signal instead of Ctrl-C
@anchor{set remotebreak}
If set to on, @value{GDBN} sends a @code{BREAK} signal to the remote
when you type @kbd{Ctrl-c} to interrupt the program running
on the remote.  If set to off, @value{GDBN} sends the @samp{Ctrl-C}
character instead.  The default is off, since most remote systems
expect to see @samp{Ctrl-C} as the interrupt signal.

@item show remotebreak
Show whether @value{GDBN} sends @code{BREAK} or @samp{Ctrl-C} to
interrupt the remote program.

@item set remoteflow on
@itemx set remoteflow off
@kindex set remoteflow
Enable or disable hardware flow control (@code{RTS}/@code{CTS})
on the serial port used to communicate to the remote target.

@item show remoteflow
@kindex show remoteflow
Show the current setting of hardware flow control.

@item set remotelogbase @var{base}
Set the base (a.k.a.@: radix) of logging serial protocol
communications to @var{base}.  Supported values of @var{base} are:
@code{ascii}, @code{octal}, and @code{hex}.  The default is
@code{ascii}.

@item show remotelogbase
Show the current setting of the radix for logging remote serial
protocol.

@item set remotelogfile @var{file}
@cindex record serial communications on file
Record remote serial communications on the named @var{file}.  The
default is not to record at all.

@item show remotelogfile.
Show the current setting  of the file name on which to record the
serial communications.

@item set remotetimeout @var{num}
@cindex timeout for serial communications
@cindex remote timeout
Set the timeout limit to wait for the remote target to respond to
@var{num} seconds.  The default is 2 seconds.

@item show remotetimeout
Show the current number of seconds to wait for the remote target
responses.

@cindex limit hardware breakpoints and watchpoints
@cindex remote target, limit break- and watchpoints
@anchor{set remote hardware-watchpoint-limit}
@anchor{set remote hardware-breakpoint-limit}
@item set remote hardware-watchpoint-limit @var{limit}
@itemx set remote hardware-breakpoint-limit @var{limit}
Restrict @value{GDBN} to using @var{limit} remote hardware breakpoint or
watchpoints.  A limit of -1, the default, is treated as unlimited.

@cindex limit hardware watchpoints length
@cindex remote target, limit watchpoints length
@anchor{set remote hardware-watchpoint-length-limit}
@item set remote hardware-watchpoint-length-limit @var{limit}
Restrict @value{GDBN} to using @var{limit} bytes for the maximum length of
a remote hardware watchpoint.  A limit of -1, the default, is treated
as unlimited.

@item show remote hardware-watchpoint-length-limit
Show the current limit (in bytes) of the maximum length of
a remote hardware watchpoint.

@item set remote exec-file @var{filename}
@itemx show remote exec-file
@anchor{set remote exec-file}
@cindex executable file, for remote target
Select the file used for @code{run} with @code{target
extended-remote}.  This should be set to a filename valid on the
target system.  If it is not set, the target will use a default
filename (e.g.@: the last program run).

@item set remote interrupt-sequence
@cindex interrupt remote programs
@cindex select Ctrl-C, BREAK or BREAK-g
Allow the user to select one of @samp{Ctrl-C}, a @code{BREAK} or
@samp{BREAK-g} as the
sequence to the remote target in order to interrupt the execution.
@samp{Ctrl-C} is a default.  Some system prefers @code{BREAK} which
is high level of serial line for some certain time.
Linux kernel prefers @samp{BREAK-g}, a.k.a Magic SysRq g.
It is @code{BREAK} signal followed by character @code{g}.

@item show interrupt-sequence
Show which of @samp{Ctrl-C}, @code{BREAK} or @code{BREAK-g}
is sent by @value{GDBN} to interrupt the remote program.
@code{BREAK-g} is BREAK signal followed by @code{g} and
also known as Magic SysRq g.

@item set remote interrupt-on-connect
@cindex send interrupt-sequence on start
Specify whether interrupt-sequence is sent to remote target when
@value{GDBN} connects to it.  This is mostly needed when you debug
Linux kernel.  Linux kernel expects @code{BREAK} followed by @code{g}
which is known as Magic SysRq g in order to connect @value{GDBN}.

@item show interrupt-on-connect
Show whether interrupt-sequence is sent
to remote target when @value{GDBN} connects to it.

@kindex set tcp
@kindex show tcp
@item set tcp auto-retry on
@cindex auto-retry, for remote TCP target
Enable auto-retry for remote TCP connections.  This is useful if the remote
debugging agent is launched in parallel with @value{GDBN}; there is a race
condition because the agent may not become ready to accept the connection
before @value{GDBN} attempts to connect.  When auto-retry is
enabled, if the initial attempt to connect fails, @value{GDBN} reattempts
to establish the connection using the timeout specified by 
@code{set tcp connect-timeout}.

@item set tcp auto-retry off
Do not auto-retry failed TCP connections.

@item show tcp auto-retry
Show the current auto-retry setting.

@item set tcp connect-timeout @var{seconds}
@itemx set tcp connect-timeout unlimited
@cindex connection timeout, for remote TCP target
@cindex timeout, for remote target connection
Set the timeout for establishing a TCP connection to the remote target to
@var{seconds}.  The timeout affects both polling to retry failed connections 
(enabled by @code{set tcp auto-retry on}) and waiting for connections
that are merely slow to complete, and represents an approximate cumulative
value.  If @var{seconds} is @code{unlimited}, there is no timeout and
@value{GDBN} will keep attempting to establish a connection forever,
unless interrupted with @kbd{Ctrl-c}.  The default is 15 seconds.

@item show tcp connect-timeout
Show the current connection timeout setting.
@end table

@cindex remote packets, enabling and disabling
The @value{GDBN} remote protocol autodetects the packets supported by
your debugging stub.  If you need to override the autodetection, you
can use these commands to enable or disable individual packets.  Each
packet can be set to @samp{on} (the remote target supports this
packet), @samp{off} (the remote target does not support this packet),
or @samp{auto} (detect remote target support for this packet).  They
all default to @samp{auto}.  For more information about each packet,
see @ref{Remote Protocol}.

During normal use, you should not have to use any of these commands.
If you do, that may be a bug in your remote debugging stub, or a bug
in @value{GDBN}.  You may want to report the problem to the
@value{GDBN} developers.

For each packet @var{name}, the command to enable or disable the
packet is @code{set remote @var{name}-packet}.  The available settings
are:

@multitable @columnfractions 0.28 0.32 0.25
@item Command Name
@tab Remote Packet
@tab Related Features

@item @code{fetch-register}
@tab @code{p}
@tab @code{info registers}

@item @code{set-register}
@tab @code{P}
@tab @code{set}

@item @code{binary-download}
@tab @code{X}
@tab @code{load}, @code{set}

@item @code{read-aux-vector}
@tab @code{qXfer:auxv:read}
@tab @code{info auxv}

@item @code{symbol-lookup}
@tab @code{qSymbol}
@tab Detecting multiple threads

@item @code{attach}
@tab @code{vAttach}
@tab @code{attach}

@item @code{verbose-resume}
@tab @code{vCont}
@tab Stepping or resuming multiple threads

@item @code{run}
@tab @code{vRun}
@tab @code{run}

@item @code{software-breakpoint}
@tab @code{Z0}
@tab @code{break}

@item @code{hardware-breakpoint}
@tab @code{Z1}
@tab @code{hbreak}

@item @code{write-watchpoint}
@tab @code{Z2}
@tab @code{watch}

@item @code{read-watchpoint}
@tab @code{Z3}
@tab @code{rwatch}

@item @code{access-watchpoint}
@tab @code{Z4}
@tab @code{awatch}

@item @code{target-features}
@tab @code{qXfer:features:read}
@tab @code{set architecture}

@item @code{library-info}
@tab @code{qXfer:libraries:read}
@tab @code{info sharedlibrary}

@item @code{memory-map}
@tab @code{qXfer:memory-map:read}
@tab @code{info mem}

@item @code{read-sdata-object}
@tab @code{qXfer:sdata:read}
@tab @code{print $_sdata}

@item @code{read-spu-object}
@tab @code{qXfer:spu:read}
@tab @code{info spu}

@item @code{write-spu-object}
@tab @code{qXfer:spu:write}
@tab @code{info spu}

@item @code{read-siginfo-object}
@tab @code{qXfer:siginfo:read}
@tab @code{print $_siginfo}

@item @code{write-siginfo-object}
@tab @code{qXfer:siginfo:write}
@tab @code{set $_siginfo}

@item @code{threads}
@tab @code{qXfer:threads:read}
@tab @code{info threads}

@item @code{get-thread-local-@*storage-address}
@tab @code{qGetTLSAddr}
@tab Displaying @code{__thread} variables

@item @code{get-thread-information-block-address}
@tab @code{qGetTIBAddr}
@tab Display MS-Windows Thread Information Block.

@item @code{search-memory}
@tab @code{qSearch:memory}
@tab @code{find}

@item @code{supported-packets}
@tab @code{qSupported}
@tab Remote communications parameters

@item @code{pass-signals}
@tab @code{QPassSignals}
@tab @code{handle @var{signal}}

@item @code{program-signals}
@tab @code{QProgramSignals}
@tab @code{handle @var{signal}}

@item @code{hostio-close-packet}
@tab @code{vFile:close}
@tab @code{remote get}, @code{remote put}

@item @code{hostio-open-packet}
@tab @code{vFile:open}
@tab @code{remote get}, @code{remote put}

@item @code{hostio-pread-packet}
@tab @code{vFile:pread}
@tab @code{remote get}, @code{remote put}

@item @code{hostio-pwrite-packet}
@tab @code{vFile:pwrite}
@tab @code{remote get}, @code{remote put}

@item @code{hostio-unlink-packet}
@tab @code{vFile:unlink}
@tab @code{remote delete}

@item @code{hostio-readlink-packet}
@tab @code{vFile:readlink}
@tab Host I/O

@item @code{noack-packet}
@tab @code{QStartNoAckMode}
@tab Packet acknowledgment

@item @code{osdata}
@tab @code{qXfer:osdata:read}
@tab @code{info os}

@item @code{query-attached}
@tab @code{qAttached}
@tab Querying remote process attach state.

@item @code{trace-buffer-size}
@tab @code{QTBuffer:size}
@tab @code{set trace-buffer-size}

@item @code{trace-status}
@tab @code{qTStatus}
@tab @code{tstatus}

@item @code{traceframe-info}
@tab @code{qXfer:traceframe-info:read}
@tab Traceframe info

@item @code{install-in-trace}
@tab @code{InstallInTrace}
@tab Install tracepoint in tracing

@item @code{disable-randomization}
@tab @code{QDisableRandomization}
@tab @code{set disable-randomization}

@item @code{conditional-breakpoints-packet}
@tab @code{Z0 and Z1}
@tab @code{Support for target-side breakpoint condition evaluation}
@end multitable

@node Remote Stub
@section Implementing a Remote Stub

@cindex debugging stub, example
@cindex remote stub, example
@cindex stub example, remote debugging
The stub files provided with @value{GDBN} implement the target side of the
communication protocol, and the @value{GDBN} side is implemented in the
@value{GDBN} source file @file{remote.c}.  Normally, you can simply allow
these subroutines to communicate, and ignore the details.  (If you're
implementing your own stub file, you can still ignore the details: start
with one of the existing stub files.  @file{sparc-stub.c} is the best
organized, and therefore the easiest to read.)

@cindex remote serial debugging, overview
To debug a program running on another machine (the debugging
@dfn{target} machine), you must first arrange for all the usual
prerequisites for the program to run by itself.  For example, for a C
program, you need:

@enumerate
@item
A startup routine to set up the C runtime environment; these usually
have a name like @file{crt0}.  The startup routine may be supplied by
your hardware supplier, or you may have to write your own.

@item
A C subroutine library to support your program's
subroutine calls, notably managing input and output.

@item
A way of getting your program to the other machine---for example, a
download program.  These are often supplied by the hardware
manufacturer, but you may have to write your own from hardware
documentation.
@end enumerate

The next step is to arrange for your program to use a serial port to
communicate with the machine where @value{GDBN} is running (the @dfn{host}
machine).  In general terms, the scheme looks like this:

@table @emph
@item On the host,
@value{GDBN} already understands how to use this protocol; when everything
else is set up, you can simply use the @samp{target remote} command
(@pxref{Targets,,Specifying a Debugging Target}).

@item On the target,
you must link with your program a few special-purpose subroutines that
implement the @value{GDBN} remote serial protocol.  The file containing these
subroutines is called  a @dfn{debugging stub}.

On certain remote targets, you can use an auxiliary program
@code{gdbserver} instead of linking a stub into your program.
@xref{Server,,Using the @code{gdbserver} Program}, for details.
@end table

The debugging stub is specific to the architecture of the remote
machine; for example, use @file{sparc-stub.c} to debug programs on
@sc{sparc} boards.

@cindex remote serial stub list
These working remote stubs are distributed with @value{GDBN}:

@table @code

@item i386-stub.c
@cindex @file{i386-stub.c}
@cindex Intel
@cindex i386
For Intel 386 and compatible architectures.

@item m68k-stub.c
@cindex @file{m68k-stub.c}
@cindex Motorola 680x0
@cindex m680x0
For Motorola 680x0 architectures.

@item sh-stub.c
@cindex @file{sh-stub.c}
@cindex Renesas
@cindex SH
For Renesas SH architectures.

@item sparc-stub.c
@cindex @file{sparc-stub.c}
@cindex Sparc
For @sc{sparc} architectures.

@item sparcl-stub.c
@cindex @file{sparcl-stub.c}
@cindex Fujitsu
@cindex SparcLite
For Fujitsu @sc{sparclite} architectures.

@end table

The @file{README} file in the @value{GDBN} distribution may list other
recently added stubs.

@menu
* Stub Contents::       What the stub can do for you
* Bootstrapping::       What you must do for the stub
* Debug Session::       Putting it all together
@end menu

@node Stub Contents
@subsection What the Stub Can Do for You

@cindex remote serial stub
The debugging stub for your architecture supplies these three
subroutines:

@table @code
@item set_debug_traps
@findex set_debug_traps
@cindex remote serial stub, initialization
This routine arranges for @code{handle_exception} to run when your
program stops.  You must call this subroutine explicitly in your
program's startup code.

@item handle_exception
@findex handle_exception
@cindex remote serial stub, main routine
This is the central workhorse, but your program never calls it
explicitly---the setup code arranges for @code{handle_exception} to
run when a trap is triggered.

@code{handle_exception} takes control when your program stops during
execution (for example, on a breakpoint), and mediates communications
with @value{GDBN} on the host machine.  This is where the communications
protocol is implemented; @code{handle_exception} acts as the @value{GDBN}
representative on the target machine.  It begins by sending summary
information on the state of your program, then continues to execute,
retrieving and transmitting any information @value{GDBN} needs, until you
execute a @value{GDBN} command that makes your program resume; at that point,
@code{handle_exception} returns control to your own code on the target
machine.

@item breakpoint
@cindex @code{breakpoint} subroutine, remote
Use this auxiliary subroutine to make your program contain a
breakpoint.  Depending on the particular situation, this may be the only
way for @value{GDBN} to get control.  For instance, if your target
machine has some sort of interrupt button, you won't need to call this;
pressing the interrupt button transfers control to
@code{handle_exception}---in effect, to @value{GDBN}.  On some machines,
simply receiving characters on the serial port may also trigger a trap;
again, in that situation, you don't need to call @code{breakpoint} from
your own program---simply running @samp{target remote} from the host
@value{GDBN} session gets control.

Call @code{breakpoint} if none of these is true, or if you simply want
to make certain your program stops at a predetermined point for the
start of your debugging session.
@end table

@node Bootstrapping
@subsection What You Must Do for the Stub

@cindex remote stub, support routines
The debugging stubs that come with @value{GDBN} are set up for a particular
chip architecture, but they have no information about the rest of your
debugging target machine.

First of all you need to tell the stub how to communicate with the
serial port.

@table @code
@item int getDebugChar()
@findex getDebugChar
Write this subroutine to read a single character from the serial port.
It may be identical to @code{getchar} for your target system; a
different name is used to allow you to distinguish the two if you wish.

@item void putDebugChar(int)
@findex putDebugChar
Write this subroutine to write a single character to the serial port.
It may be identical to @code{putchar} for your target system; a
different name is used to allow you to distinguish the two if you wish.
@end table

@cindex control C, and remote debugging
@cindex interrupting remote targets
If you want @value{GDBN} to be able to stop your program while it is
running, you need to use an interrupt-driven serial driver, and arrange
for it to stop when it receives a @code{^C} (@samp{\003}, the control-C
character).  That is the character which @value{GDBN} uses to tell the
remote system to stop.

Getting the debugging target to return the proper status to @value{GDBN}
probably requires changes to the standard stub; one quick and dirty way
is to just execute a breakpoint instruction (the ``dirty'' part is that
@value{GDBN} reports a @code{SIGTRAP} instead of a @code{SIGINT}).

Other routines you need to supply are:

@table @code
@item void exceptionHandler (int @var{exception_number}, void *@var{exception_address})
@findex exceptionHandler
Write this function to install @var{exception_address} in the exception
handling tables.  You need to do this because the stub does not have any
way of knowing what the exception handling tables on your target system
are like (for example, the processor's table might be in @sc{rom},
containing entries which point to a table in @sc{ram}).
The @var{exception_number} specifies the exception which should be changed;
its meaning is architecture-dependent (for example, different numbers
might represent divide by zero, misaligned access, etc).  When this
exception occurs, control should be transferred directly to
@var{exception_address}, and the processor state (stack, registers,
and so on) should be just as it is when a processor exception occurs.  So if
you want to use a jump instruction to reach @var{exception_address}, it
should be a simple jump, not a jump to subroutine.

For the 386, @var{exception_address} should be installed as an interrupt
gate so that interrupts are masked while the handler runs.  The gate
should be at privilege level 0 (the most privileged level).  The
@sc{sparc} and 68k stubs are able to mask interrupts themselves without
help from @code{exceptionHandler}.

@item void flush_i_cache()
@findex flush_i_cache
On @sc{sparc} and @sc{sparclite} only, write this subroutine to flush the
instruction cache, if any, on your target machine.  If there is no
instruction cache, this subroutine may be a no-op.

On target machines that have instruction caches, @value{GDBN} requires this
function to make certain that the state of your program is stable.
@end table

@noindent
You must also make sure this library routine is available:

@table @code
@item void *memset(void *, int, int)
@findex memset
This is the standard library function @code{memset} that sets an area of
memory to a known value.  If you have one of the free versions of
@code{libc.a}, @code{memset} can be found there; otherwise, you must
either obtain it from your hardware manufacturer, or write your own.
@end table

If you do not use the GNU C compiler, you may need other standard
library subroutines as well; this varies from one stub to another,
but in general the stubs are likely to use any of the common library
subroutines which @code{@value{NGCC}} generates as inline code.


@node Debug Session
@subsection Putting it All Together

@cindex remote serial debugging summary
In summary, when your program is ready to debug, you must follow these
steps.

@enumerate
@item
Make sure you have defined the supporting low-level routines
(@pxref{Bootstrapping,,What You Must Do for the Stub}):
@display
@code{getDebugChar}, @code{putDebugChar},
@code{flush_i_cache}, @code{memset}, @code{exceptionHandler}.
@end display

@item
Insert these lines in your program's startup code, before the main
procedure is called:

@smallexample
set_debug_traps();
breakpoint();
@end smallexample

On some machines, when a breakpoint trap is raised, the hardware
automatically makes the PC point to the instruction after the
breakpoint.  If your machine doesn't do that, you may need to adjust
@code{handle_exception} to arrange for it to return to the instruction
after the breakpoint on this first invocation, so that your program
doesn't keep hitting the initial breakpoint instead of making
progress.

@item
For the 680x0 stub only, you need to provide a variable called
@code{exceptionHook}.  Normally you just use:

@smallexample
void (*exceptionHook)() = 0;
@end smallexample

@noindent
but if before calling @code{set_debug_traps}, you set it to point to a
function in your program, that function is called when
@code{@value{GDBN}} continues after stopping on a trap (for example, bus
error).  The function indicated by @code{exceptionHook} is called with
one parameter: an @code{int} which is the exception number.

@item
Compile and link together: your program, the @value{GDBN} debugging stub for
your target architecture, and the supporting subroutines.

@item
Make sure you have a serial connection between your target machine and
the @value{GDBN} host, and identify the serial port on the host.

@item
@c The "remote" target now provides a `load' command, so we should
@c document that.  FIXME.
Download your program to your target machine (or get it there by
whatever means the manufacturer provides), and start it.

@item
Start @value{GDBN} on the host, and connect to the target
(@pxref{Connecting,,Connecting to a Remote Target}).

@end enumerate

@node Configurations
@chapter Configuration-Specific Information

While nearly all @value{GDBN} commands are available for all native and
cross versions of the debugger, there are some exceptions.  This chapter
describes things that are only available in certain configurations.

There are three major categories of configurations: native
configurations, where the host and target are the same, embedded
operating system configurations, which are usually the same for several
different processor architectures, and bare embedded processors, which
are quite different from each other.

@menu
* Native::
* Embedded OS::
* Embedded Processors::
* Architectures::
@end menu

@node Native
@section Native

This section describes details specific to particular native
configurations.

@menu
* HP-UX::                       HP-UX
* BSD libkvm Interface::	Debugging BSD kernel memory images
* SVR4 Process Information::    SVR4 process information
* DJGPP Native::                Features specific to the DJGPP port
* Cygwin Native::		Features specific to the Cygwin port
* Hurd Native::                 Features specific to @sc{gnu} Hurd
* Darwin::			Features specific to Darwin
@end menu

@node HP-UX
@subsection HP-UX

On HP-UX systems, if you refer to a function or variable name that
begins with a dollar sign, @value{GDBN} searches for a user or system
name first, before it searches for a convenience variable.


@node BSD libkvm Interface
@subsection BSD libkvm Interface

@cindex libkvm
@cindex kernel memory image
@cindex kernel crash dump

BSD-derived systems (FreeBSD/NetBSD/OpenBSD) have a kernel memory
interface that provides a uniform interface for accessing kernel virtual
memory images, including live systems and crash dumps.  @value{GDBN}
uses this interface to allow you to debug live kernels and kernel crash
dumps on many native BSD configurations.  This is implemented as a
special @code{kvm} debugging target.  For debugging a live system, load
the currently running kernel into @value{GDBN} and connect to the
@code{kvm} target:

@smallexample
(@value{GDBP}) @b{target kvm}
@end smallexample

For debugging crash dumps, provide the file name of the crash dump as an
argument:

@smallexample
(@value{GDBP}) @b{target kvm /var/crash/bsd.0}
@end smallexample

Once connected to the @code{kvm} target, the following commands are
available:

@table @code
@kindex kvm
@item kvm pcb
Set current context from the @dfn{Process Control Block} (PCB) address.

@item kvm proc
Set current context from proc address.  This command isn't available on
modern FreeBSD systems.
@end table

@node SVR4 Process Information
@subsection SVR4 Process Information
@cindex /proc
@cindex examine process image
@cindex process info via @file{/proc}

Many versions of SVR4 and compatible systems provide a facility called
@samp{/proc} that can be used to examine the image of a running
process using file-system subroutines.

If @value{GDBN} is configured for an operating system with this
facility, the command @code{info proc} is available to report
information about the process running your program, or about any
process running on your system.  This includes, as of this writing,
@sc{gnu}/Linux and Solaris, but not HP-UX, for example.

This command may also work on core files that were created on a system
that has the @samp{/proc} facility.

@table @code
@kindex info proc
@cindex process ID
@item info proc
@itemx info proc @var{process-id}
Summarize available information about any running process.  If a
process ID is specified by @var{process-id}, display information about
that process; otherwise display information about the program being
debugged.  The summary includes the debugged process ID, the command
line used to invoke it, its current working directory, and its
executable file's absolute file name.

On some systems, @var{process-id} can be of the form
@samp{[@var{pid}]/@var{tid}} which specifies a certain thread ID
within a process.  If the optional @var{pid} part is missing, it means
a thread from the process being debugged (the leading @samp{/} still
needs to be present, or else @value{GDBN} will interpret the number as
a process ID rather than a thread ID).

@item info proc cmdline
@cindex info proc cmdline
Show the original command line of the process.  This command is
specific to @sc{gnu}/Linux.

@item info proc cwd
@cindex info proc cwd
Show the current working directory of the process.  This command is
specific to @sc{gnu}/Linux.

@item info proc exe
@cindex info proc exe
Show the name of executable of the process.  This command is specific
to @sc{gnu}/Linux.

@item info proc mappings
@cindex memory address space mappings
Report the memory address space ranges accessible in the program, with
information on whether the process has read, write, or execute access
rights to each range.  On @sc{gnu}/Linux systems, each memory range
includes the object file which is mapped to that range, instead of the
memory access rights to that range.

@item info proc stat
@itemx info proc status
@cindex process detailed status information
These subcommands are specific to @sc{gnu}/Linux systems.  They show
the process-related information, including the user ID and group ID;
how many threads are there in the process; its virtual memory usage;
the signals that are pending, blocked, and ignored; its TTY; its
consumption of system and user time; its stack size; its @samp{nice}
value; etc.  For more information, see the @samp{proc} man page
(type @kbd{man 5 proc} from your shell prompt).

@item info proc all
Show all the information about the process described under all of the
above @code{info proc} subcommands.

@ignore
@comment These sub-options of 'info proc' were not included when
@comment procfs.c was re-written.  Keep their descriptions around
@comment against the day when someone finds the time to put them back in.
@kindex info proc times
@item info proc times
Starting time, user CPU time, and system CPU time for your program and
its children.

@kindex info proc id
@item info proc id
Report on the process IDs related to your program: its own process ID,
the ID of its parent, the process group ID, and the session ID.
@end ignore

@item set procfs-trace
@kindex set procfs-trace
@cindex @code{procfs} API calls
This command enables and disables tracing of @code{procfs} API calls.

@item show procfs-trace
@kindex show procfs-trace
Show the current state of @code{procfs} API call tracing.

@item set procfs-file @var{file}
@kindex set procfs-file
Tell @value{GDBN} to write @code{procfs} API trace to the named
@var{file}.  @value{GDBN} appends the trace info to the previous
contents of the file.  The default is to display the trace on the
standard output.

@item show procfs-file
@kindex show procfs-file
Show the file to which @code{procfs} API trace is written.

@item proc-trace-entry
@itemx proc-trace-exit
@itemx proc-untrace-entry
@itemx proc-untrace-exit
@kindex proc-trace-entry
@kindex proc-trace-exit
@kindex proc-untrace-entry
@kindex proc-untrace-exit
These commands enable and disable tracing of entries into and exits
from the @code{syscall} interface.

@item info pidlist
@kindex info pidlist
@cindex process list, QNX Neutrino
For QNX Neutrino only, this command displays the list of all the
processes and all the threads within each process.

@item info meminfo
@kindex info meminfo
@cindex mapinfo list, QNX Neutrino
For QNX Neutrino only, this command displays the list of all mapinfos.
@end table

@node DJGPP Native
@subsection Features for Debugging @sc{djgpp} Programs
@cindex @sc{djgpp} debugging
@cindex native @sc{djgpp} debugging
@cindex MS-DOS-specific commands

@cindex DPMI
@sc{djgpp} is a port of the @sc{gnu} development tools to MS-DOS and
MS-Windows.  @sc{djgpp} programs are 32-bit protected-mode programs
that use the @dfn{DPMI} (DOS Protected-Mode Interface) API to run on
top of real-mode DOS systems and their emulations.

@value{GDBN} supports native debugging of @sc{djgpp} programs, and
defines a few commands specific to the @sc{djgpp} port.  This
subsection describes those commands.

@table @code
@kindex info dos
@item info dos
This is a prefix of @sc{djgpp}-specific commands which print
information about the target system and important OS structures.

@kindex sysinfo
@cindex MS-DOS system info
@cindex free memory information (MS-DOS)
@item info dos sysinfo
This command displays assorted information about the underlying
platform: the CPU type and features, the OS version and flavor, the
DPMI version, and the available conventional and DPMI memory.

@cindex GDT
@cindex LDT
@cindex IDT
@cindex segment descriptor tables
@cindex descriptor tables display
@item info dos gdt
@itemx info dos ldt
@itemx info dos idt
These 3 commands display entries from, respectively, Global, Local,
and Interrupt Descriptor Tables (GDT, LDT, and IDT).  The descriptor
tables are data structures which store a descriptor for each segment
that is currently in use.  The segment's selector is an index into a
descriptor table; the table entry for that index holds the
descriptor's base address and limit, and its attributes and access
rights.

A typical @sc{djgpp} program uses 3 segments: a code segment, a data
segment (used for both data and the stack), and a DOS segment (which
allows access to DOS/BIOS data structures and absolute addresses in
conventional memory).  However, the DPMI host will usually define
additional segments in order to support the DPMI environment.

@cindex garbled pointers
These commands allow to display entries from the descriptor tables.
Without an argument, all entries from the specified table are
displayed.  An argument, which should be an integer expression, means
display a single entry whose index is given by the argument.  For
example, here's a convenient way to display information about the
debugged program's data segment:

@smallexample
@exdent @code{(@value{GDBP}) info dos ldt $ds}
@exdent @code{0x13f: base=0x11970000 limit=0x0009ffff 32-Bit Data (Read/Write, Exp-up)}
@end smallexample

@noindent
This comes in handy when you want to see whether a pointer is outside
the data segment's limit (i.e.@: @dfn{garbled}).

@cindex page tables display (MS-DOS)
@item info dos pde
@itemx info dos pte
These two commands display entries from, respectively, the Page
Directory and the Page Tables.  Page Directories and Page Tables are
data structures which control how virtual memory addresses are mapped
into physical addresses.  A Page Table includes an entry for every
page of memory that is mapped into the program's address space; there
may be several Page Tables, each one holding up to 4096 entries.  A
Page Directory has up to 4096 entries, one each for every Page Table
that is currently in use.

Without an argument, @kbd{info dos pde} displays the entire Page
Directory, and @kbd{info dos pte} displays all the entries in all of
the Page Tables.  An argument, an integer expression, given to the
@kbd{info dos pde} command means display only that entry from the Page
Directory table.  An argument given to the @kbd{info dos pte} command
means display entries from a single Page Table, the one pointed to by
the specified entry in the Page Directory.

@cindex direct memory access (DMA) on MS-DOS
These commands are useful when your program uses @dfn{DMA} (Direct
Memory Access), which needs physical addresses to program the DMA
controller.

These commands are supported only with some DPMI servers.

@cindex physical address from linear address
@item info dos address-pte @var{addr}
This command displays the Page Table entry for a specified linear
address.  The argument @var{addr} is a linear address which should
already have the appropriate segment's base address added to it,
because this command accepts addresses which may belong to @emph{any}
segment.  For example, here's how to display the Page Table entry for
the page where a variable @code{i} is stored:

@smallexample
@exdent @code{(@value{GDBP}) info dos address-pte __djgpp_base_address + (char *)&i}
@exdent @code{Page Table entry for address 0x11a00d30:}
@exdent @code{Base=0x02698000 Dirty Acc. Not-Cached Write-Back Usr Read-Write +0xd30}
@end smallexample

@noindent
This says that @code{i} is stored at offset @code{0xd30} from the page
whose physical base address is @code{0x02698000}, and shows all the
attributes of that page.

Note that you must cast the addresses of variables to a @code{char *},
since otherwise the value of @code{__djgpp_base_address}, the base
address of all variables and functions in a @sc{djgpp} program, will
be added using the rules of C pointer arithmetics: if @code{i} is
declared an @code{int}, @value{GDBN} will add 4 times the value of
@code{__djgpp_base_address} to the address of @code{i}.

Here's another example, it displays the Page Table entry for the
transfer buffer:

@smallexample
@exdent @code{(@value{GDBP}) info dos address-pte *((unsigned *)&_go32_info_block + 3)}
@exdent @code{Page Table entry for address 0x29110:}
@exdent @code{Base=0x00029000 Dirty Acc. Not-Cached Write-Back Usr Read-Write +0x110}
@end smallexample

@noindent
(The @code{+ 3} offset is because the transfer buffer's address is the
3rd member of the @code{_go32_info_block} structure.)  The output
clearly shows that this DPMI server maps the addresses in conventional
memory 1:1, i.e.@: the physical (@code{0x00029000} + @code{0x110}) and
linear (@code{0x29110}) addresses are identical.

This command is supported only with some DPMI servers.
@end table

@cindex DOS serial data link, remote debugging
In addition to native debugging, the DJGPP port supports remote
debugging via a serial data link.  The following commands are specific
to remote serial debugging in the DJGPP port of @value{GDBN}.

@table @code
@kindex set com1base
@kindex set com1irq
@kindex set com2base
@kindex set com2irq
@kindex set com3base
@kindex set com3irq
@kindex set com4base
@kindex set com4irq
@item set com1base @var{addr}
This command sets the base I/O port address of the @file{COM1} serial
port.

@item set com1irq @var{irq}
This command sets the @dfn{Interrupt Request} (@code{IRQ}) line to use
for the @file{COM1} serial port.

There are similar commands @samp{set com2base}, @samp{set com3irq},
etc.@: for setting the port address and the @code{IRQ} lines for the
other 3 COM ports.

@kindex show com1base
@kindex show com1irq
@kindex show com2base
@kindex show com2irq
@kindex show com3base
@kindex show com3irq
@kindex show com4base
@kindex show com4irq
The related commands @samp{show com1base}, @samp{show com1irq} etc.@:
display the current settings of the base address and the @code{IRQ}
lines used by the COM ports.

@item info serial
@kindex info serial
@cindex DOS serial port status
This command prints the status of the 4 DOS serial ports.  For each
port, it prints whether it's active or not, its I/O base address and
IRQ number, whether it uses a 16550-style FIFO, its baudrate, and the
counts of various errors encountered so far.
@end table


@node Cygwin Native
@subsection Features for Debugging MS Windows PE Executables
@cindex MS Windows debugging
@cindex native Cygwin debugging
@cindex Cygwin-specific commands

@value{GDBN} supports native debugging of MS Windows programs, including
DLLs with and without symbolic debugging information.

@cindex Ctrl-BREAK, MS-Windows
@cindex interrupt debuggee on MS-Windows
MS-Windows programs that call @code{SetConsoleMode} to switch off the
special meaning of the @samp{Ctrl-C} keystroke cannot be interrupted
by typing @kbd{C-c}.  For this reason, @value{GDBN} on MS-Windows
supports @kbd{C-@key{BREAK}} as an alternative interrupt key
sequence, which can be used to interrupt the debuggee even if it
ignores @kbd{C-c}.

There are various additional Cygwin-specific commands, described in
this section.  Working with DLLs that have no debugging symbols is
described in @ref{Non-debug DLL Symbols}.

@table @code
@kindex info w32
@item info w32
This is a prefix of MS Windows-specific commands which print
information about the target system and important OS structures.

@item info w32 selector
This command displays information returned by
the Win32 API @code{GetThreadSelectorEntry} function.
It takes an optional argument that is evaluated to
a long value to give the information about this given selector.
Without argument, this command displays information
about the six segment registers.

@item info w32 thread-information-block
This command displays thread specific information stored in the
Thread Information Block (readable on the X86 CPU family using @code{$fs}
selector for 32-bit programs and @code{$gs} for 64-bit programs).

@kindex info dll
@item info dll
This is a Cygwin-specific alias of @code{info shared}.

@kindex set cygwin-exceptions
@cindex debugging the Cygwin DLL
@cindex Cygwin DLL, debugging
@item set cygwin-exceptions @var{mode}
If @var{mode} is @code{on}, @value{GDBN} will break on exceptions that
happen inside the Cygwin DLL.  If @var{mode} is @code{off},
@value{GDBN} will delay recognition of exceptions, and may ignore some
exceptions which seem to be caused by internal Cygwin DLL
``bookkeeping''.  This option is meant primarily for debugging the
Cygwin DLL itself; the default value is @code{off} to avoid annoying
@value{GDBN} users with false @code{SIGSEGV} signals.

@kindex show cygwin-exceptions
@item show cygwin-exceptions
Displays whether @value{GDBN} will break on exceptions that happen
inside the Cygwin DLL itself.

@kindex set new-console
@item set new-console @var{mode}
If @var{mode} is @code{on} the debuggee will
be started in a new console on next start.
If @var{mode} is @code{off}, the debuggee will
be started in the same console as the debugger.

@kindex show new-console
@item show new-console
Displays whether a new console is used
when the debuggee is started.

@kindex set new-group
@item set new-group @var{mode}
This boolean value controls whether the debuggee should
start a new group or stay in the same group as the debugger.
This affects the way the Windows OS handles
@samp{Ctrl-C}.

@kindex show new-group
@item show new-group
Displays current value of new-group boolean.

@kindex set debugevents
@item set debugevents
This boolean value adds debug output concerning kernel events related
to the debuggee seen by the debugger.  This includes events that
signal thread and process creation and exit, DLL loading and
unloading, console interrupts, and debugging messages produced by the
Windows @code{OutputDebugString} API call.

@kindex set debugexec
@item set debugexec
This boolean value adds debug output concerning execute events
(such as resume thread) seen by the debugger.

@kindex set debugexceptions
@item set debugexceptions
This boolean value adds debug output concerning exceptions in the
debuggee seen by the debugger.

@kindex set debugmemory
@item set debugmemory
This boolean value adds debug output concerning debuggee memory reads
and writes by the debugger.

@kindex set shell
@item set shell
This boolean values specifies whether the debuggee is called
via a shell or directly (default value is on).

@kindex show shell
@item show shell
Displays if the debuggee will be started with a shell.

@end table

@menu
* Non-debug DLL Symbols::  Support for DLLs without debugging symbols
@end menu

@node Non-debug DLL Symbols
@subsubsection Support for DLLs without Debugging Symbols
@cindex DLLs with no debugging symbols
@cindex Minimal symbols and DLLs

Very often on windows, some of the DLLs that your program relies on do
not include symbolic debugging information (for example,
@file{kernel32.dll}).  When @value{GDBN} doesn't recognize any debugging
symbols in a DLL, it relies on the minimal amount of symbolic
information contained in the DLL's export table.  This section
describes working with such symbols, known internally to @value{GDBN} as
``minimal symbols''.

Note that before the debugged program has started execution, no DLLs
will have been loaded.  The easiest way around this problem is simply to
start the program --- either by setting a breakpoint or letting the
program run once to completion.

@subsubsection DLL Name Prefixes

In keeping with the naming conventions used by the Microsoft debugging
tools, DLL export symbols are made available with a prefix based on the
DLL name, for instance @code{KERNEL32!CreateFileA}.  The plain name is
also entered into the symbol table, so @code{CreateFileA} is often
sufficient.  In some cases there will be name clashes within a program
(particularly if the executable itself includes full debugging symbols)
necessitating the use of the fully qualified name when referring to the
contents of the DLL.  Use single-quotes around the name to avoid the
exclamation mark (``!'')  being interpreted as a language operator.

Note that the internal name of the DLL may be all upper-case, even
though the file name of the DLL is lower-case, or vice-versa.  Since
symbols within @value{GDBN} are @emph{case-sensitive} this may cause
some confusion. If in doubt, try the @code{info functions} and
@code{info variables} commands or even @code{maint print msymbols}
(@pxref{Symbols}). Here's an example:

@smallexample
(@value{GDBP}) info function CreateFileA
All functions matching regular expression "CreateFileA":

Non-debugging symbols:
0x77e885f4  CreateFileA
0x77e885f4  KERNEL32!CreateFileA
@end smallexample

@smallexample
(@value{GDBP}) info function !
All functions matching regular expression "!":

Non-debugging symbols:
0x6100114c  cygwin1!__assert
0x61004034  cygwin1!_dll_crt0@@0
0x61004240  cygwin1!dll_crt0(per_process *)
[etc...]
@end smallexample

@subsubsection Working with Minimal Symbols

Symbols extracted from a DLL's export table do not contain very much
type information. All that @value{GDBN} can do is guess whether a symbol
refers to a function or variable depending on the linker section that
contains the symbol. Also note that the actual contents of the memory
contained in a DLL are not available unless the program is running. This
means that you cannot examine the contents of a variable or disassemble
a function within a DLL without a running program.

Variables are generally treated as pointers and dereferenced
automatically. For this reason, it is often necessary to prefix a
variable name with the address-of operator (``&'') and provide explicit
type information in the command. Here's an example of the type of
problem:

@smallexample
(@value{GDBP}) print 'cygwin1!__argv'
$1 = 268572168
@end smallexample

@smallexample
(@value{GDBP}) x 'cygwin1!__argv'
0x10021610:      "\230y\""
@end smallexample

And two possible solutions:

@smallexample
(@value{GDBP}) print ((char **)'cygwin1!__argv')[0]
$2 = 0x22fd98 "/cygdrive/c/mydirectory/myprogram"
@end smallexample

@smallexample
(@value{GDBP}) x/2x &'cygwin1!__argv'
0x610c0aa8 <cygwin1!__argv>:    0x10021608      0x00000000
(@value{GDBP}) x/x 0x10021608
0x10021608:     0x0022fd98
(@value{GDBP}) x/s 0x0022fd98
0x22fd98:        "/cygdrive/c/mydirectory/myprogram"
@end smallexample

Setting a break point within a DLL is possible even before the program
starts execution. However, under these circumstances, @value{GDBN} can't
examine the initial instructions of the function in order to skip the
function's frame set-up code. You can work around this by using ``*&''
to set the breakpoint at a raw memory address:

@smallexample
(@value{GDBP}) break *&'python22!PyOS_Readline'
Breakpoint 1 at 0x1e04eff0
@end smallexample

The author of these extensions is not entirely convinced that setting a
break point within a shared DLL like @file{kernel32.dll} is completely
safe.

@node Hurd Native
@subsection Commands Specific to @sc{gnu} Hurd Systems
@cindex @sc{gnu} Hurd debugging

This subsection describes @value{GDBN} commands specific to the
@sc{gnu} Hurd native debugging.

@table @code
@item set signals
@itemx set sigs
@kindex set signals@r{, Hurd command}
@kindex set sigs@r{, Hurd command}
This command toggles the state of inferior signal interception by
@value{GDBN}.  Mach exceptions, such as breakpoint traps, are not
affected by this command.  @code{sigs} is a shorthand alias for
@code{signals}.

@item show signals
@itemx show sigs
@kindex show signals@r{, Hurd command}
@kindex show sigs@r{, Hurd command}
Show the current state of intercepting inferior's signals.

@item set signal-thread
@itemx set sigthread
@kindex set signal-thread
@kindex set sigthread
This command tells @value{GDBN} which thread is the @code{libc} signal
thread.  That thread is run when a signal is delivered to a running
process.  @code{set sigthread} is the shorthand alias of @code{set
signal-thread}.

@item show signal-thread
@itemx show sigthread
@kindex show signal-thread
@kindex show sigthread
These two commands show which thread will run when the inferior is
delivered a signal.

@item set stopped
@kindex set stopped@r{, Hurd command}
This commands tells @value{GDBN} that the inferior process is stopped,
as with the @code{SIGSTOP} signal.  The stopped process can be
continued by delivering a signal to it.

@item show stopped
@kindex show stopped@r{, Hurd command}
This command shows whether @value{GDBN} thinks the debuggee is
stopped.

@item set exceptions
@kindex set exceptions@r{, Hurd command}
Use this command to turn off trapping of exceptions in the inferior.
When exception trapping is off, neither breakpoints nor
single-stepping will work.  To restore the default, set exception
trapping on.

@item show exceptions
@kindex show exceptions@r{, Hurd command}
Show the current state of trapping exceptions in the inferior.

@item set task pause
@kindex set task@r{, Hurd commands}
@cindex task attributes (@sc{gnu} Hurd)
@cindex pause current task (@sc{gnu} Hurd)
This command toggles task suspension when @value{GDBN} has control.
Setting it to on takes effect immediately, and the task is suspended
whenever @value{GDBN} gets control.  Setting it to off will take
effect the next time the inferior is continued.  If this option is set
to off, you can use @code{set thread default pause on} or @code{set
thread pause on} (see below) to pause individual threads.

@item show task pause
@kindex show task@r{, Hurd commands}
Show the current state of task suspension.

@item set task detach-suspend-count
@cindex task suspend count
@cindex detach from task, @sc{gnu} Hurd
This command sets the suspend count the task will be left with when
@value{GDBN} detaches from it.

@item show task detach-suspend-count
Show the suspend count the task will be left with when detaching.

@item set task exception-port
@itemx set task excp
@cindex task exception port, @sc{gnu} Hurd
This command sets the task exception port to which @value{GDBN} will
forward exceptions.  The argument should be the value of the @dfn{send
rights} of the task.  @code{set task excp} is a shorthand alias.

@item set noninvasive
@cindex noninvasive task options
This command switches @value{GDBN} to a mode that is the least
invasive as far as interfering with the inferior is concerned.  This
is the same as using @code{set task pause}, @code{set exceptions}, and
@code{set signals} to values opposite to the defaults.

@item info send-rights
@itemx info receive-rights
@itemx info port-rights
@itemx info port-sets
@itemx info dead-names
@itemx info ports
@itemx info psets
@cindex send rights, @sc{gnu} Hurd
@cindex receive rights, @sc{gnu} Hurd
@cindex port rights, @sc{gnu} Hurd
@cindex port sets, @sc{gnu} Hurd
@cindex dead names, @sc{gnu} Hurd
These commands display information about, respectively, send rights,
receive rights, port rights, port sets, and dead names of a task.
There are also shorthand aliases: @code{info ports} for @code{info
port-rights} and @code{info psets} for @code{info port-sets}.

@item set thread pause
@kindex set thread@r{, Hurd command}
@cindex thread properties, @sc{gnu} Hurd
@cindex pause current thread (@sc{gnu} Hurd)
This command toggles current thread suspension when @value{GDBN} has
control.  Setting it to on takes effect immediately, and the current
thread is suspended whenever @value{GDBN} gets control.  Setting it to
off will take effect the next time the inferior is continued.
Normally, this command has no effect, since when @value{GDBN} has
control, the whole task is suspended.  However, if you used @code{set
task pause off} (see above), this command comes in handy to suspend
only the current thread.

@item show thread pause
@kindex show thread@r{, Hurd command}
This command shows the state of current thread suspension.

@item set thread run
This command sets whether the current thread is allowed to run.

@item show thread run
Show whether the current thread is allowed to run.

@item set thread detach-suspend-count
@cindex thread suspend count, @sc{gnu} Hurd
@cindex detach from thread, @sc{gnu} Hurd
This command sets the suspend count @value{GDBN} will leave on a
thread when detaching.  This number is relative to the suspend count
found by @value{GDBN} when it notices the thread; use @code{set thread
takeover-suspend-count} to force it to an absolute value.

@item show thread detach-suspend-count
Show the suspend count @value{GDBN} will leave on the thread when
detaching.

@item set thread exception-port
@itemx set thread excp
Set the thread exception port to which to forward exceptions.  This
overrides the port set by @code{set task exception-port} (see above).
@code{set thread excp} is the shorthand alias.

@item set thread takeover-suspend-count
Normally, @value{GDBN}'s thread suspend counts are relative to the
value @value{GDBN} finds when it notices each thread.  This command
changes the suspend counts to be absolute instead.

@item set thread default
@itemx show thread default
@cindex thread default settings, @sc{gnu} Hurd
Each of the above @code{set thread} commands has a @code{set thread
default} counterpart (e.g., @code{set thread default pause}, @code{set
thread default exception-port}, etc.).  The @code{thread default}
variety of commands sets the default thread properties for all
threads; you can then change the properties of individual threads with
the non-default commands.
@end table

@node Darwin
@subsection Darwin
@cindex Darwin

@value{GDBN} provides the following commands specific to the Darwin target:

@table @code
@item set debug darwin @var{num}
@kindex set debug darwin
When set to a non zero value, enables debugging messages specific to
the Darwin support.  Higher values produce more verbose output.

@item show debug darwin
@kindex show debug darwin
Show the current state of Darwin messages.

@item set debug mach-o @var{num}
@kindex set debug mach-o
When set to a non zero value, enables debugging messages while
@value{GDBN} is reading Darwin object files.  (@dfn{Mach-O} is the
file format used on Darwin for object and executable files.)  Higher
values produce more verbose output.  This is a command to diagnose
problems internal to @value{GDBN} and should not be needed in normal
usage.

@item show debug mach-o
@kindex show debug mach-o
Show the current state of Mach-O file messages.

@item set mach-exceptions on
@itemx set mach-exceptions off
@kindex set mach-exceptions
On Darwin, faults are first reported as a Mach exception and are then
mapped to a Posix signal.  Use this command to turn on trapping of
Mach exceptions in the inferior.  This might be sometimes useful to
better understand the cause of a fault.  The default is off.

@item show mach-exceptions
@kindex show mach-exceptions
Show the current state of exceptions trapping.
@end table


@node Embedded OS
@section Embedded Operating Systems

This section describes configurations involving the debugging of
embedded operating systems that are available for several different
architectures.

@value{GDBN} includes the ability to debug programs running on
various real-time operating systems.

@node Embedded Processors
@section Embedded Processors

This section goes into details specific to particular embedded
configurations.

@cindex send command to simulator
Whenever a specific embedded processor has a simulator, @value{GDBN}
allows to send an arbitrary command to the simulator.

@table @code
@item sim @var{command}
@kindex sim@r{, a command}
Send an arbitrary @var{command} string to the simulator.  Consult the
documentation for the specific simulator in use for information about
acceptable commands.
@end table


@menu
* ARM::                         ARM RDI
* M32R/D::                      Renesas M32R/D
* M68K::                        Motorola M68K
* MicroBlaze::			Xilinx MicroBlaze
* MIPS Embedded::               MIPS Embedded
* PowerPC Embedded::            PowerPC Embedded
* PA::                          HP PA Embedded
* Sparclet::                    Tsqware Sparclet
* Sparclite::                   Fujitsu Sparclite
* Z8000::                       Zilog Z8000
* AVR::                         Atmel AVR
* CRIS::                        CRIS
* Super-H::                     Renesas Super-H
@end menu

@node ARM
@subsection ARM
@cindex ARM RDI

@table @code
@kindex target rdi
@item target rdi @var{dev}
ARM Angel monitor, via RDI library interface to ADP protocol.  You may
use this target to communicate with both boards running the Angel
monitor, or with the EmbeddedICE JTAG debug device.

@kindex target rdp
@item target rdp @var{dev}
ARM Demon monitor.

@end table

@value{GDBN} provides the following ARM-specific commands:

@table @code
@item set arm disassembler
@kindex set arm
This commands selects from a list of disassembly styles.  The
@code{"std"} style is the standard style.

@item show arm disassembler
@kindex show arm
Show the current disassembly style.

@item set arm apcs32
@cindex ARM 32-bit mode
This command toggles ARM operation mode between 32-bit and 26-bit.

@item show arm apcs32
Display the current usage of the ARM 32-bit mode.

@item set arm fpu @var{fputype}
This command sets the ARM floating-point unit (FPU) type.  The
argument @var{fputype} can be one of these:

@table @code
@item auto
Determine the FPU type by querying the OS ABI.
@item softfpa
Software FPU, with mixed-endian doubles on little-endian ARM
processors.
@item fpa
GCC-compiled FPA co-processor.
@item softvfp
Software FPU with pure-endian doubles.
@item vfp
VFP co-processor.
@end table

@item show arm fpu
Show the current type of the FPU.

@item set arm abi
This command forces @value{GDBN} to use the specified ABI.

@item show arm abi
Show the currently used ABI.

@item set arm fallback-mode (arm|thumb|auto)
@value{GDBN} uses the symbol table, when available, to determine
whether instructions are ARM or Thumb.  This command controls
@value{GDBN}'s default behavior when the symbol table is not
available.  The default is @samp{auto}, which causes @value{GDBN} to
use the current execution mode (from the @code{T} bit in the @code{CPSR}
register).

@item show arm fallback-mode
Show the current fallback instruction mode.

@item set arm force-mode (arm|thumb|auto)
This command overrides use of the symbol table to determine whether
instructions are ARM or Thumb.  The default is @samp{auto}, which
causes @value{GDBN} to use the symbol table and then the setting
of @samp{set arm fallback-mode}.

@item show arm force-mode
Show the current forced instruction mode.

@item set debug arm
Toggle whether to display ARM-specific debugging messages from the ARM
target support subsystem.

@item show debug arm
Show whether ARM-specific debugging messages are enabled.
@end table

The following commands are available when an ARM target is debugged
using the RDI interface:

@table @code
@item rdilogfile @r{[}@var{file}@r{]}
@kindex rdilogfile
@cindex ADP (Angel Debugger Protocol) logging
Set the filename for the ADP (Angel Debugger Protocol) packet log.
With an argument, sets the log file to the specified @var{file}.  With
no argument, show the current log file name.  The default log file is
@file{rdi.log}.

@item rdilogenable @r{[}@var{arg}@r{]}
@kindex rdilogenable
Control logging of ADP packets.  With an argument of 1 or @code{"yes"}
enables logging, with an argument 0 or @code{"no"} disables it.  With
no arguments displays the current setting.  When logging is enabled,
ADP packets exchanged between @value{GDBN} and the RDI target device
are logged to a file.

@item set rdiromatzero
@kindex set rdiromatzero
@cindex ROM at zero address, RDI
Tell @value{GDBN} whether the target has ROM at address 0.  If on,
vector catching is disabled, so that zero address can be used.  If off
(the default), vector catching is enabled.  For this command to take
effect, it needs to be invoked prior to the @code{target rdi} command.

@item show rdiromatzero
@kindex show rdiromatzero
Show the current setting of ROM at zero address.

@item set rdiheartbeat
@kindex set rdiheartbeat
@cindex RDI heartbeat
Enable or disable RDI heartbeat packets.  It is not recommended to
turn on this option, since it confuses ARM and EPI JTAG interface, as
well as the Angel monitor.

@item show rdiheartbeat
@kindex show rdiheartbeat
Show the setting of RDI heartbeat packets.
@end table

@table @code
@item target sim @r{[}@var{simargs}@r{]} @dots{} 
The @value{GDBN} ARM simulator accepts the following optional arguments.

@table @code
@item --swi-support=@var{type}
Tell the simulator which SWI interfaces to support.  The argument
@var{type} may be a comma separated list of the following values.
The default value is @code{all}.

@table @code
@item none
@item demon
@item angel
@item redboot
@item all
@end table
@end table
@end table

@node M32R/D
@subsection Renesas M32R/D and M32R/SDI

@table @code
@kindex target m32r
@item target m32r @var{dev}
Renesas M32R/D ROM monitor.

@kindex target m32rsdi
@item target m32rsdi @var{dev}
Renesas M32R SDI server, connected via parallel port to the board.
@end table

The following @value{GDBN} commands are specific to the M32R monitor:

@table @code
@item set download-path @var{path}
@kindex set download-path
@cindex find downloadable @sc{srec} files (M32R)
Set the default path for finding downloadable @sc{srec} files.

@item show download-path
@kindex show download-path
Show the default path for downloadable @sc{srec} files.

@item set board-address @var{addr}
@kindex set board-address
@cindex M32-EVA target board address
Set the IP address for the M32R-EVA target board.

@item show board-address
@kindex show board-address
Show the current IP address of the target board.

@item set server-address @var{addr}
@kindex set server-address
@cindex download server address (M32R)
Set the IP address for the download server, which is the @value{GDBN}'s
host machine.

@item show server-address
@kindex show server-address
Display the IP address of the download server.

@item upload @r{[}@var{file}@r{]}
@kindex upload@r{, M32R}
Upload the specified @sc{srec} @var{file} via the monitor's Ethernet
upload capability.  If no @var{file} argument is given, the current
executable file is uploaded.

@item tload @r{[}@var{file}@r{]}
@kindex tload@r{, M32R}
Test the @code{upload} command.
@end table

The following commands are available for M32R/SDI:

@table @code
@item sdireset
@kindex sdireset
@cindex reset SDI connection, M32R
This command resets the SDI connection.

@item sdistatus
@kindex sdistatus
This command shows the SDI connection status.

@item debug_chaos
@kindex debug_chaos
@cindex M32R/Chaos debugging
Instructs the remote that M32R/Chaos debugging is to be used.

@item use_debug_dma
@kindex use_debug_dma
Instructs the remote to use the DEBUG_DMA method of accessing memory.

@item use_mon_code
@kindex use_mon_code
Instructs the remote to use the MON_CODE method of accessing memory.

@item use_ib_break
@kindex use_ib_break
Instructs the remote to set breakpoints by IB break.

@item use_dbt_break
@kindex use_dbt_break
Instructs the remote to set breakpoints by DBT.
@end table

@node M68K
@subsection M68k

The Motorola m68k configuration includes ColdFire support, and a
target command for the following ROM monitor.

@table @code

@kindex target dbug
@item target dbug @var{dev}
dBUG ROM monitor for Motorola ColdFire.

@end table

@node MicroBlaze
@subsection MicroBlaze
@cindex Xilinx MicroBlaze
@cindex XMD, Xilinx Microprocessor Debugger

The MicroBlaze is a soft-core processor supported on various Xilinx
FPGAs, such as Spartan or Virtex series.  Boards with these processors
usually have JTAG ports which connect to a host system running the Xilinx
Embedded Development Kit (EDK) or Software Development Kit (SDK).
This host system is used to download the configuration bitstream to
the target FPGA.  The Xilinx Microprocessor Debugger (XMD) program
communicates with the target board using the JTAG interface and
presents a @code{gdbserver} interface to the board.  By default
@code{xmd} uses port @code{1234}.  (While it is possible to change 
this default port, it requires the use of undocumented @code{xmd} 
commands.  Contact Xilinx support if you need to do this.)

Use these GDB commands to connect to the MicroBlaze target processor.

@table @code
@item target remote :1234
Use this command to connect to the target if you are running @value{GDBN}
on the same system as @code{xmd}.

@item target remote @var{xmd-host}:1234
Use this command to connect to the target if it is connected to @code{xmd}
running on a different system named @var{xmd-host}.

@item load
Use this command to download a program to the MicroBlaze target.

@item set debug microblaze @var{n}
Enable MicroBlaze-specific debugging messages if non-zero.

@item show debug microblaze @var{n}
Show MicroBlaze-specific debugging level.
@end table

@node MIPS Embedded
@subsection @acronym{MIPS} Embedded

@cindex @acronym{MIPS} boards
@value{GDBN} can use the @acronym{MIPS} remote debugging protocol to talk to a
@acronym{MIPS} board attached to a serial line.  This is available when
you configure @value{GDBN} with @samp{--target=mips-elf}.

@need 1000
Use these @value{GDBN} commands to specify the connection to your target board:

@table @code
@item target mips @var{port}
@kindex target mips @var{port}
To run a program on the board, start up @code{@value{GDBP}} with the
name of your program as the argument.  To connect to the board, use the
command @samp{target mips @var{port}}, where @var{port} is the name of
the serial port connected to the board.  If the program has not already
been downloaded to the board, you may use the @code{load} command to
download it.  You can then use all the usual @value{GDBN} commands.

For example, this sequence connects to the target board through a serial
port, and loads and runs a program called @var{prog} through the
debugger:

@smallexample
host$ @value{GDBP} @var{prog}
@value{GDBN} is free software and @dots{}
(@value{GDBP}) target mips /dev/ttyb
(@value{GDBP}) load @var{prog}
(@value{GDBP}) run
@end smallexample

@item target mips @var{hostname}:@var{portnumber}
On some @value{GDBN} host configurations, you can specify a TCP
connection (for instance, to a serial line managed by a terminal
concentrator) instead of a serial port, using the syntax
@samp{@var{hostname}:@var{portnumber}}.

@item target pmon @var{port}
@kindex target pmon @var{port}
PMON ROM monitor.

@item target ddb @var{port}
@kindex target ddb @var{port}
NEC's DDB variant of PMON for Vr4300.

@item target lsi @var{port}
@kindex target lsi @var{port}
LSI variant of PMON.

@kindex target r3900
@item target r3900 @var{dev}
Densan DVE-R3900 ROM monitor for Toshiba R3900 Mips.

@kindex target array
@item target array @var{dev}
Array Tech LSI33K RAID controller board.

@end table


@noindent
@value{GDBN} also supports these special commands for @acronym{MIPS} targets:

@table @code
@item set mipsfpu double
@itemx set mipsfpu single
@itemx set mipsfpu none
@itemx set mipsfpu auto
@itemx show mipsfpu
@kindex set mipsfpu
@kindex show mipsfpu
@cindex @acronym{MIPS} remote floating point
@cindex floating point, @acronym{MIPS} remote
If your target board does not support the @acronym{MIPS} floating point
coprocessor, you should use the command @samp{set mipsfpu none} (if you
need this, you may wish to put the command in your @value{GDBN} init
file).  This tells @value{GDBN} how to find the return value of
functions which return floating point values.  It also allows
@value{GDBN} to avoid saving the floating point registers when calling
functions on the board.  If you are using a floating point coprocessor
with only single precision floating point support, as on the @sc{r4650}
processor, use the command @samp{set mipsfpu single}.  The default
double precision floating point coprocessor may be selected using
@samp{set mipsfpu double}.

In previous versions the only choices were double precision or no
floating point, so @samp{set mipsfpu on} will select double precision
and @samp{set mipsfpu off} will select no floating point.

As usual, you can inquire about the @code{mipsfpu} variable with
@samp{show mipsfpu}.

@item set timeout @var{seconds}
@itemx set retransmit-timeout @var{seconds}
@itemx show timeout
@itemx show retransmit-timeout
@cindex @code{timeout}, @acronym{MIPS} protocol
@cindex @code{retransmit-timeout}, @acronym{MIPS} protocol
@kindex set timeout
@kindex show timeout
@kindex set retransmit-timeout
@kindex show retransmit-timeout
You can control the timeout used while waiting for a packet, in the @acronym{MIPS}
remote protocol, with the @code{set timeout @var{seconds}} command.  The
default is 5 seconds.  Similarly, you can control the timeout used while
waiting for an acknowledgment of a packet with the @code{set
retransmit-timeout @var{seconds}} command.  The default is 3 seconds.
You can inspect both values with @code{show timeout} and @code{show
retransmit-timeout}.  (These commands are @emph{only} available when
@value{GDBN} is configured for @samp{--target=mips-elf}.)

The timeout set by @code{set timeout} does not apply when @value{GDBN}
is waiting for your program to stop.  In that case, @value{GDBN} waits
forever because it has no way of knowing how long the program is going
to run before stopping.

@item set syn-garbage-limit @var{num}
@kindex set syn-garbage-limit@r{, @acronym{MIPS} remote}
@cindex synchronize with remote @acronym{MIPS} target
Limit the maximum number of characters @value{GDBN} should ignore when
it tries to synchronize with the remote target.  The default is 10
characters.  Setting the limit to -1 means there's no limit.

@item show syn-garbage-limit
@kindex show syn-garbage-limit@r{, @acronym{MIPS} remote}
Show the current limit on the number of characters to ignore when
trying to synchronize with the remote system.

@item set monitor-prompt @var{prompt}
@kindex set monitor-prompt@r{, @acronym{MIPS} remote}
@cindex remote monitor prompt
Tell @value{GDBN} to expect the specified @var{prompt} string from the
remote monitor.  The default depends on the target:
@table @asis
@item pmon target
@samp{PMON}
@item ddb target
@samp{NEC010}
@item lsi target
@samp{PMON>}
@end table

@item show monitor-prompt
@kindex show monitor-prompt@r{, @acronym{MIPS} remote}
Show the current strings @value{GDBN} expects as the prompt from the
remote monitor.

@item set monitor-warnings
@kindex set monitor-warnings@r{, @acronym{MIPS} remote}
Enable or disable monitor warnings about hardware breakpoints.  This
has effect only for the @code{lsi} target.  When on, @value{GDBN} will
display warning messages whose codes are returned by the @code{lsi}
PMON monitor for breakpoint commands.

@item show monitor-warnings
@kindex show monitor-warnings@r{, @acronym{MIPS} remote}
Show the current setting of printing monitor warnings.

@item pmon @var{command}
@kindex pmon@r{, @acronym{MIPS} remote}
@cindex send PMON command
This command allows sending an arbitrary @var{command} string to the
monitor.  The monitor must be in debug mode for this to work.
@end table

@node PowerPC Embedded
@subsection PowerPC Embedded

@cindex DVC register
@value{GDBN} supports using the DVC (Data Value Compare) register to
implement in hardware simple hardware watchpoint conditions of the form:

@smallexample
(@value{GDBP}) watch @var{ADDRESS|VARIABLE} \
  if  @var{ADDRESS|VARIABLE} == @var{CONSTANT EXPRESSION}
@end smallexample

The DVC register will be automatically used when @value{GDBN} detects
such pattern in a condition expression, and the created watchpoint uses one
debug register (either the @code{exact-watchpoints} option is on and the
variable is scalar, or the variable has a length of one byte).  This feature
is available in native @value{GDBN} running on a Linux kernel version 2.6.34
or newer.

When running on PowerPC embedded processors, @value{GDBN} automatically uses
ranged hardware watchpoints, unless the @code{exact-watchpoints} option is on,
in which case watchpoints using only one debug register are created when
watching variables of scalar types.

You can create an artificial array to watch an arbitrary memory
region using one of the following commands (@pxref{Expressions}):

@smallexample
(@value{GDBP}) watch *((char *) @var{address})@@@var{length}
(@value{GDBP}) watch @{char[@var{length}]@} @var{address}
@end smallexample

PowerPC embedded processors support masked watchpoints.  See the discussion
about the @code{mask} argument in @ref{Set Watchpoints}.

@cindex ranged breakpoint
PowerPC embedded processors support hardware accelerated
@dfn{ranged breakpoints}.  A ranged breakpoint stops execution of
the inferior whenever it executes an instruction at any address within
the range it specifies.  To set a ranged breakpoint in @value{GDBN},
use the @code{break-range} command.

@value{GDBN} provides the following PowerPC-specific commands:

@table @code
@kindex break-range
@item break-range @var{start-location}, @var{end-location}
Set a breakpoint for an address range given by
@var{start-location} and @var{end-location}, which can specify a function name,
a line number, an offset of lines from the current line or from the start
location, or an address of an instruction (see @ref{Specify Location},
for a list of all the possible ways to specify a @var{location}.)
The breakpoint will stop execution of the inferior whenever it
executes an instruction at any address within the specified range,
(including @var{start-location} and @var{end-location}.)

@kindex set powerpc
@item set powerpc soft-float
@itemx show powerpc soft-float
Force @value{GDBN} to use (or not use) a software floating point calling
convention.  By default, @value{GDBN} selects the calling convention based
on the selected architecture and the provided executable file.

@item set powerpc vector-abi
@itemx show powerpc vector-abi
Force @value{GDBN} to use the specified calling convention for vector
arguments and return values.  The valid options are @samp{auto};
@samp{generic}, to avoid vector registers even if they are present;
@samp{altivec}, to use AltiVec registers; and @samp{spe} to use SPE
registers.  By default, @value{GDBN} selects the calling convention
based on the selected architecture and the provided executable file.

@item set powerpc exact-watchpoints
@itemx show powerpc exact-watchpoints
Allow @value{GDBN} to use only one debug register when watching a variable
of scalar type, thus assuming that the variable is accessed through the
address of its first byte.

@kindex target dink32
@item target dink32 @var{dev}
DINK32 ROM monitor.

@kindex target ppcbug
@item target ppcbug @var{dev}
@kindex target ppcbug1
@item target ppcbug1 @var{dev}
PPCBUG ROM monitor for PowerPC.

@kindex target sds
@item target sds @var{dev}
SDS monitor, running on a PowerPC board (such as Motorola's ADS).
@end table

@cindex SDS protocol
The following commands specific to the SDS protocol are supported
by @value{GDBN}:

@table @code
@item set sdstimeout @var{nsec}
@kindex set sdstimeout
Set the timeout for SDS protocol reads to be @var{nsec} seconds.  The
default is 2 seconds.

@item show sdstimeout
@kindex show sdstimeout
Show the current value of the SDS timeout.

@item sds @var{command}
@kindex sds@r{, a command}
Send the specified @var{command} string to the SDS monitor.
@end table


@node PA
@subsection HP PA Embedded

@table @code

@kindex target op50n
@item target op50n @var{dev}
OP50N monitor, running on an OKI HPPA board.

@kindex target w89k
@item target w89k @var{dev}
W89K monitor, running on a Winbond HPPA board.

@end table

@node Sparclet
@subsection Tsqware Sparclet

@cindex Sparclet

@value{GDBN} enables developers to debug tasks running on
Sparclet targets from a Unix host.
@value{GDBN} uses code that runs on
both the Unix host and on the Sparclet target.  The program
@code{@value{GDBP}} is installed and executed on the Unix host.

@table @code
@item remotetimeout @var{args}
@kindex remotetimeout
@value{GDBN} supports the option @code{remotetimeout}.
This option is set by the user, and @var{args} represents the number of
seconds @value{GDBN} waits for responses.
@end table

@cindex compiling, on Sparclet
When compiling for debugging, include the options @samp{-g} to get debug
information and @samp{-Ttext} to relocate the program to where you wish to
load it on the target.  You may also want to add the options @samp{-n} or
@samp{-N} in order to reduce the size of the sections.  Example:

@smallexample
sparclet-aout-gcc prog.c -Ttext 0x12010000 -g -o prog -N
@end smallexample

You can use @code{objdump} to verify that the addresses are what you intended:

@smallexample
sparclet-aout-objdump --headers --syms prog
@end smallexample

@cindex running, on Sparclet
Once you have set
your Unix execution search path to find @value{GDBN}, you are ready to
run @value{GDBN}.  From your Unix host, run @code{@value{GDBP}}
(or @code{sparclet-aout-gdb}, depending on your installation).

@value{GDBN} comes up showing the prompt:

@smallexample
(gdbslet)
@end smallexample

@menu
* Sparclet File::                Setting the file to debug
* Sparclet Connection::          Connecting to Sparclet
* Sparclet Download::            Sparclet download
* Sparclet Execution::           Running and debugging
@end menu

@node Sparclet File
@subsubsection Setting File to Debug

The @value{GDBN} command @code{file} lets you choose with program to debug.

@smallexample
(gdbslet) file prog
@end smallexample

@need 1000
@value{GDBN} then attempts to read the symbol table of @file{prog}.
@value{GDBN} locates
the file by searching the directories listed in the command search
path.
If the file was compiled with debug information (option @samp{-g}), source
files will be searched as well.
@value{GDBN} locates
the source files by searching the directories listed in the directory search
path (@pxref{Environment, ,Your Program's Environment}).
If it fails
to find a file, it displays a message such as:

@smallexample
prog: No such file or directory.
@end smallexample

When this happens, add the appropriate directories to the search paths with
the @value{GDBN} commands @code{path} and @code{dir}, and execute the
@code{target} command again.

@node Sparclet Connection
@subsubsection Connecting to Sparclet

The @value{GDBN} command @code{target} lets you connect to a Sparclet target.
To connect to a target on serial port ``@code{ttya}'', type:

@smallexample
(gdbslet) target sparclet /dev/ttya
Remote target sparclet connected to /dev/ttya
main () at ../prog.c:3
@end smallexample

@need 750
@value{GDBN} displays messages like these:

@smallexample
Connected to ttya.
@end smallexample

@node Sparclet Download
@subsubsection Sparclet Download

@cindex download to Sparclet
Once connected to the Sparclet target,
you can use the @value{GDBN}
@code{load} command to download the file from the host to the target.
The file name and load offset should be given as arguments to the @code{load}
command.
Since the file format is aout, the program must be loaded to the starting
address.  You can use @code{objdump} to find out what this value is.  The load
offset is an offset which is added to the VMA (virtual memory address)
of each of the file's sections.
For instance, if the program
@file{prog} was linked to text address 0x1201000, with data at 0x12010160
and bss at 0x12010170, in @value{GDBN}, type:

@smallexample
(gdbslet) load prog 0x12010000
Loading section .text, size 0xdb0 vma 0x12010000
@end smallexample

If the code is loaded at a different address then what the program was linked
to, you may need to use the @code{section} and @code{add-symbol-file} commands
to tell @value{GDBN} where to map the symbol table.

@node Sparclet Execution
@subsubsection Running and Debugging

@cindex running and debugging Sparclet programs
You can now begin debugging the task using @value{GDBN}'s execution control
commands, @code{b}, @code{step}, @code{run}, etc.  See the @value{GDBN}
manual for the list of commands.

@smallexample
(gdbslet) b main
Breakpoint 1 at 0x12010000: file prog.c, line 3.
(gdbslet) run
Starting program: prog
Breakpoint 1, main (argc=1, argv=0xeffff21c) at prog.c:3
3        char *symarg = 0;
(gdbslet) step
4        char *execarg = "hello!";
(gdbslet)
@end smallexample

@node Sparclite
@subsection Fujitsu Sparclite

@table @code

@kindex target sparclite
@item target sparclite @var{dev}
Fujitsu sparclite boards, used only for the purpose of loading.
You must use an additional command to debug the program.
For example: target remote @var{dev} using @value{GDBN} standard
remote protocol.

@end table

@node Z8000
@subsection Zilog Z8000

@cindex Z8000
@cindex simulator, Z8000
@cindex Zilog Z8000 simulator

When configured for debugging Zilog Z8000 targets, @value{GDBN} includes
a Z8000 simulator.

For the Z8000 family, @samp{target sim} simulates either the Z8002 (the
unsegmented variant of the Z8000 architecture) or the Z8001 (the
segmented variant).  The simulator recognizes which architecture is
appropriate by inspecting the object code.

@table @code
@item target sim @var{args}
@kindex sim
@kindex target sim@r{, with Z8000}
Debug programs on a simulated CPU.  If the simulator supports setup
options, specify them via @var{args}.
@end table

@noindent
After specifying this target, you can debug programs for the simulated
CPU in the same style as programs for your host computer; use the
@code{file} command to load a new program image, the @code{run} command
to run your program, and so on.

As well as making available all the usual machine registers
(@pxref{Registers, ,Registers}), the Z8000 simulator provides three
additional items of information as specially named registers:

@table @code

@item cycles
Counts clock-ticks in the simulator.

@item insts
Counts instructions run in the simulator.

@item time
Execution time in 60ths of a second.

@end table

You can refer to these values in @value{GDBN} expressions with the usual
conventions; for example, @w{@samp{b fputc if $cycles>5000}} sets a
conditional breakpoint that suspends only after at least 5000
simulated clock ticks.

@node AVR
@subsection Atmel AVR
@cindex AVR

When configured for debugging the Atmel AVR, @value{GDBN} supports the
following AVR-specific commands:

@table @code
@item info io_registers
@kindex info io_registers@r{, AVR}
@cindex I/O registers (Atmel AVR)
This command displays information about the AVR I/O registers.  For
each register, @value{GDBN} prints its number and value.
@end table

@node CRIS
@subsection CRIS
@cindex CRIS

When configured for debugging CRIS, @value{GDBN} provides the
following CRIS-specific commands:

@table @code
@item set cris-version @var{ver}
@cindex CRIS version
Set the current CRIS version to @var{ver}, either @samp{10} or @samp{32}.
The CRIS version affects register names and sizes.  This command is useful in
case autodetection of the CRIS version fails.

@item show cris-version
Show the current CRIS version.

@item set cris-dwarf2-cfi
@cindex DWARF-2 CFI and CRIS
Set the usage of DWARF-2 CFI for CRIS debugging.  The default is @samp{on}.
Change to @samp{off} when using @code{gcc-cris} whose version is below 
@code{R59}.

@item show cris-dwarf2-cfi
Show the current state of using DWARF-2 CFI.

@item set cris-mode @var{mode}
@cindex CRIS mode
Set the current CRIS mode to @var{mode}.  It should only be changed when
debugging in guru mode, in which case it should be set to 
@samp{guru} (the default is @samp{normal}).

@item show cris-mode
Show the current CRIS mode.
@end table

@node Super-H
@subsection Renesas Super-H
@cindex Super-H

For the Renesas Super-H processor, @value{GDBN} provides these
commands:

@table @code
@item set sh calling-convention @var{convention}
@kindex set sh calling-convention
Set the calling-convention used when calling functions from @value{GDBN}.
Allowed values are @samp{gcc}, which is the default setting, and @samp{renesas}.
With the @samp{gcc} setting, functions are called using the @value{NGCC} calling
convention.  If the DWARF-2 information of the called function specifies
that the function follows the Renesas calling convention, the function
is called using the Renesas calling convention.  If the calling convention
is set to @samp{renesas}, the Renesas calling convention is always used,
regardless of the DWARF-2 information.  This can be used to override the
default of @samp{gcc} if debug information is missing, or the compiler
does not emit the DWARF-2 calling convention entry for a function.

@item show sh calling-convention
@kindex show sh calling-convention
Show the current calling convention setting.

@end table


@node Architectures
@section Architectures

This section describes characteristics of architectures that affect
all uses of @value{GDBN} with the architecture, both native and cross.

@menu
* AArch64::
* i386::
* Alpha::
* MIPS::
* HPPA::               HP PA architecture
* SPU::                Cell Broadband Engine SPU architecture
* PowerPC::
* Nios II::
@end menu

@node AArch64
@subsection AArch64
@cindex AArch64 support

When @value{GDBN} is debugging the AArch64 architecture, it provides the
following special commands:

@table @code
@item set debug aarch64
@kindex set debug aarch64
This command determines whether AArch64 architecture-specific debugging
messages are to be displayed.

@item show debug aarch64
Show whether AArch64 debugging messages are displayed.

@end table

@node i386
@subsection x86 Architecture-specific Issues

@table @code
@item set struct-convention @var{mode}
@kindex set struct-convention
@cindex struct return convention
@cindex struct/union returned in registers
Set the convention used by the inferior to return @code{struct}s and
@code{union}s from functions to @var{mode}.  Possible values of
@var{mode} are @code{"pcc"}, @code{"reg"}, and @code{"default"} (the
default).  @code{"default"} or @code{"pcc"} means that @code{struct}s
are returned on the stack, while @code{"reg"} means that a
@code{struct} or a @code{union} whose size is 1, 2, 4, or 8 bytes will
be returned in a register.

@item show struct-convention
@kindex show struct-convention
Show the current setting of the convention to return @code{struct}s
from functions.
@end table

@subsubsection Intel(R) @dfn{Memory Protection Extensions} (MPX).
@cindex Intel(R) Memory Protection Extensions (MPX).

Memory Protection Extension (MPX) adds the bound registers @samp{BND0}
@footnote{The register named with capital letters represent the architecture
registers.} through @samp{BND3}.  Bound registers store a pair of 64-bit values
which are the lower bound and upper bound.  Bounds are effective addresses or
memory locations.  The upper bounds are architecturally represented in 1's
complement form.  A bound having lower bound = 0, and upper bound = 0
(1's complement of all bits set) will allow access to the entire address space.

@samp{BND0} through @samp{BND3} are represented in @value{GDBN} as @samp{bnd0raw}
through @samp{bnd3raw}.  Pseudo registers @samp{bnd0} through @samp{bnd3}
display the upper bound performing the complement of one operation on the
upper bound value, i.e.@ when upper bound in @samp{bnd0raw} is 0 in the
@value{GDBN} @samp{bnd0} it will be @code{0xfff@dots{}}.  In this sense it
can also be noted that the upper bounds are inclusive.

As an example, assume that the register BND0 holds bounds for a pointer having
access allowed for the range between 0x32 and 0x71.  The values present on
bnd0raw and bnd registers are presented as follows:

@smallexample
	bnd0raw = @{0x32, 0xffffffff8e@}
	bnd0 = @{lbound = 0x32, ubound = 0x71@} : size 64
@end smallexample

This way the raw value can be accessed via bnd0raw@dots{}bnd3raw.  Any
change on bnd0@dots{}bnd3 or bnd0raw@dots{}bnd3raw is reflect on its
counterpart.  When the bnd0@dots{}bnd3 registers are displayed via
Python, the display includes the memory size, in bits, accessible to
the pointer.

@node Alpha
@subsection Alpha

See the following section.

@node MIPS
@subsection @acronym{MIPS}

@cindex stack on Alpha
@cindex stack on @acronym{MIPS}
@cindex Alpha stack
@cindex @acronym{MIPS} stack
Alpha- and @acronym{MIPS}-based computers use an unusual stack frame, which
sometimes requires @value{GDBN} to search backward in the object code to
find the beginning of a function.

@cindex response time, @acronym{MIPS} debugging
To improve response time (especially for embedded applications, where
@value{GDBN} may be restricted to a slow serial line for this search)
you may want to limit the size of this search, using one of these
commands:

@table @code
@cindex @code{heuristic-fence-post} (Alpha, @acronym{MIPS})
@item set heuristic-fence-post @var{limit}
Restrict @value{GDBN} to examining at most @var{limit} bytes in its
search for the beginning of a function.  A value of @var{0} (the
default) means there is no limit.  However, except for @var{0}, the
larger the limit the more bytes @code{heuristic-fence-post} must search
and therefore the longer it takes to run.  You should only need to use
this command when debugging a stripped executable.

@item show heuristic-fence-post
Display the current limit.
@end table

@noindent
These commands are available @emph{only} when @value{GDBN} is configured
for debugging programs on Alpha or @acronym{MIPS} processors.

Several @acronym{MIPS}-specific commands are available when debugging @acronym{MIPS}
programs:

@table @code
@item set mips abi @var{arg}
@kindex set mips abi
@cindex set ABI for @acronym{MIPS}
Tell @value{GDBN} which @acronym{MIPS} ABI is used by the inferior.  Possible
values of @var{arg} are:

@table @samp
@item auto
The default ABI associated with the current binary (this is the
default).
@item o32
@item o64
@item n32
@item n64
@item eabi32
@item eabi64
@end table

@item show mips abi
@kindex show mips abi
Show the @acronym{MIPS} ABI used by @value{GDBN} to debug the inferior.

@item set mips compression @var{arg}
@kindex set mips compression
@cindex code compression, @acronym{MIPS}
Tell @value{GDBN} which @acronym{MIPS} compressed
@acronym{ISA, Instruction Set Architecture} encoding is used by the
inferior.  @value{GDBN} uses this for code disassembly and other
internal interpretation purposes.  This setting is only referred to
when no executable has been associated with the debugging session or
the executable does not provide information about the encoding it uses.
Otherwise this setting is automatically updated from information
provided by the executable.

Possible values of @var{arg} are @samp{mips16} and @samp{micromips}.
The default compressed @acronym{ISA} encoding is @samp{mips16}, as
executables containing @acronym{MIPS16} code frequently are not
identified as such.

This setting is ``sticky''; that is, it retains its value across
debugging sessions until reset either explicitly with this command or
implicitly from an executable.

The compiler and/or assembler typically add symbol table annotations to
identify functions compiled for the @acronym{MIPS16} or
@acronym{microMIPS} @acronym{ISA}s.  If these function-scope annotations
are present, @value{GDBN} uses them in preference to the global
compressed @acronym{ISA} encoding setting.

@item show mips compression
@kindex show mips compression
Show the @acronym{MIPS} compressed @acronym{ISA} encoding used by
@value{GDBN} to debug the inferior.

@item set mipsfpu
@itemx show mipsfpu
@xref{MIPS Embedded, set mipsfpu}.

@item set mips mask-address @var{arg}
@kindex set mips mask-address
@cindex @acronym{MIPS} addresses, masking
This command determines whether the most-significant 32 bits of 64-bit
@acronym{MIPS} addresses are masked off.  The argument @var{arg} can be
@samp{on}, @samp{off}, or @samp{auto}.  The latter is the default
setting, which lets @value{GDBN} determine the correct value.

@item show mips mask-address
@kindex show mips mask-address
Show whether the upper 32 bits of @acronym{MIPS} addresses are masked off or
not.

@item set remote-mips64-transfers-32bit-regs
@kindex set remote-mips64-transfers-32bit-regs
This command controls compatibility with 64-bit @acronym{MIPS} targets that
transfer data in 32-bit quantities.  If you have an old @acronym{MIPS} 64 target
that transfers 32 bits for some registers, like @sc{sr} and @sc{fsr},
and 64 bits for other registers, set this option to @samp{on}.

@item show remote-mips64-transfers-32bit-regs
@kindex show remote-mips64-transfers-32bit-regs
Show the current setting of compatibility with older @acronym{MIPS} 64 targets.

@item set debug mips
@kindex set debug mips
This command turns on and off debugging messages for the @acronym{MIPS}-specific
target code in @value{GDBN}.

@item show debug mips
@kindex show debug mips
Show the current setting of @acronym{MIPS} debugging messages.
@end table


@node HPPA
@subsection HPPA
@cindex HPPA support

When @value{GDBN} is debugging the HP PA architecture, it provides the
following special commands:

@table @code
@item set debug hppa
@kindex set debug hppa
This command determines whether HPPA architecture-specific debugging
messages are to be displayed.

@item show debug hppa
Show whether HPPA debugging messages are displayed.

@item maint print unwind @var{address}
@kindex maint print unwind@r{, HPPA}
This command displays the contents of the unwind table entry at the
given @var{address}.

@end table


@node SPU
@subsection Cell Broadband Engine SPU architecture
@cindex Cell Broadband Engine
@cindex SPU

When @value{GDBN} is debugging the Cell Broadband Engine SPU architecture,
it provides the following special commands:

@table @code
@item info spu event
@kindex info spu
Display SPU event facility status.  Shows current event mask
and pending event status.

@item info spu signal
Display SPU signal notification facility status.  Shows pending
signal-control word and signal notification mode of both signal
notification channels.

@item info spu mailbox
Display SPU mailbox facility status.  Shows all pending entries,
in order of processing, in each of the SPU Write Outbound,
SPU Write Outbound Interrupt, and SPU Read Inbound mailboxes.

@item info spu dma
Display MFC DMA status.  Shows all pending commands in the MFC
DMA queue.  For each entry, opcode, tag, class IDs, effective
and local store addresses and transfer size are shown.

@item info spu proxydma
Display MFC Proxy-DMA status.  Shows all pending commands in the MFC
Proxy-DMA queue.  For each entry, opcode, tag, class IDs, effective
and local store addresses and transfer size are shown.

@end table
 
When @value{GDBN} is debugging a combined PowerPC/SPU application
on the Cell Broadband Engine, it provides in addition the following
special commands:

@table @code
@item set spu stop-on-load @var{arg}
@kindex set spu
Set whether to stop for new SPE threads.  When set to @code{on}, @value{GDBN}
will give control to the user when a new SPE thread enters its @code{main}
function.  The default is @code{off}.

@item show spu stop-on-load
@kindex show spu
Show whether to stop for new SPE threads.

@item set spu auto-flush-cache @var{arg}
Set whether to automatically flush the software-managed cache.  When set to
@code{on}, @value{GDBN} will automatically cause the SPE software-managed
cache to be flushed whenever SPE execution stops.  This provides a consistent
view of PowerPC memory that is accessed via the cache.  If an application
does not use the software-managed cache, this option has no effect.

@item show spu auto-flush-cache
Show whether to automatically flush the software-managed cache.

@end table

@node PowerPC
@subsection PowerPC
@cindex PowerPC architecture

When @value{GDBN} is debugging the PowerPC architecture, it provides a set of 
pseudo-registers to enable inspection of 128-bit wide Decimal Floating Point
numbers stored in the floating point registers. These values must be stored
in two consecutive registers, always starting at an even register like
@code{f0} or @code{f2}.

The pseudo-registers go from @code{$dl0} through @code{$dl15}, and are formed
by joining the even/odd register pairs @code{f0} and @code{f1} for @code{$dl0},
@code{f2} and @code{f3} for @code{$dl1} and so on.

For POWER7 processors, @value{GDBN} provides a set of pseudo-registers, the 64-bit
wide Extended Floating Point Registers (@samp{f32} through @samp{f63}).

@node Nios II
@subsection Nios II
@cindex Nios II architecture

When @value{GDBN} is debugging the Nios II architecture,
it provides the following special commands:

@table @code

@item set debug nios2
@kindex set debug nios2
This command turns on and off debugging messages for the Nios II
target code in @value{GDBN}.

@item show debug nios2
@kindex show debug nios2
Show the current setting of Nios II debugging messages.
@end table

@node Controlling GDB
@chapter Controlling @value{GDBN}

You can alter the way @value{GDBN} interacts with you by using the
@code{set} command.  For commands controlling how @value{GDBN} displays
data, see @ref{Print Settings, ,Print Settings}.  Other settings are
described here.

@menu
* Prompt::                      Prompt
* Editing::                     Command editing
* Command History::             Command history
* Screen Size::                 Screen size
* Numbers::                     Numbers
* ABI::                         Configuring the current ABI
* Auto-loading::                Automatically loading associated files
* Messages/Warnings::           Optional warnings and messages
* Debugging Output::            Optional messages about internal happenings
* Other Misc Settings::         Other Miscellaneous Settings
@end menu

@node Prompt
@section Prompt

@cindex prompt

@value{GDBN} indicates its readiness to read a command by printing a string
called the @dfn{prompt}.  This string is normally @samp{(@value{GDBP})}.  You
can change the prompt string with the @code{set prompt} command.  For
instance, when debugging @value{GDBN} with @value{GDBN}, it is useful to change
the prompt in one of the @value{GDBN} sessions so that you can always tell
which one you are talking to.

@emph{Note:}  @code{set prompt} does not add a space for you after the
prompt you set.  This allows you to set a prompt which ends in a space
or a prompt that does not.

@table @code
@kindex set prompt
@item set prompt @var{newprompt}
Directs @value{GDBN} to use @var{newprompt} as its prompt string henceforth.

@kindex show prompt
@item show prompt
Prints a line of the form: @samp{Gdb's prompt is: @var{your-prompt}}
@end table

Versions of @value{GDBN} that ship with Python scripting enabled have
prompt extensions.  The commands for interacting with these extensions
are:

@table @code
@kindex set extended-prompt
@item set extended-prompt @var{prompt}
Set an extended prompt that allows for substitutions.
@xref{gdb.prompt}, for a list of escape sequences that can be used for
substitution.  Any escape sequences specified as part of the prompt
string are replaced with the corresponding strings each time the prompt
is displayed.

For example:

@smallexample
set extended-prompt Current working directory: \w (gdb)
@end smallexample

Note that when an extended-prompt is set, it takes control of the
@var{prompt_hook} hook.  @xref{prompt_hook}, for further information.

@kindex show extended-prompt
@item show extended-prompt
Prints the extended prompt.  Any escape sequences specified as part of
the prompt string with @code{set extended-prompt}, are replaced with the
corresponding strings each time the prompt is displayed.
@end table

@node Editing
@section Command Editing
@cindex readline
@cindex command line editing

@value{GDBN} reads its input commands via the @dfn{Readline} interface.  This
@sc{gnu} library provides consistent behavior for programs which provide a
command line interface to the user.  Advantages are @sc{gnu} Emacs-style
or @dfn{vi}-style inline editing of commands, @code{csh}-like history
substitution, and a storage and recall of command history across
debugging sessions.

You may control the behavior of command line editing in @value{GDBN} with the
command @code{set}.

@table @code
@kindex set editing
@cindex editing
@item set editing
@itemx set editing on
Enable command line editing (enabled by default).

@item set editing off
Disable command line editing.

@kindex show editing
@item show editing
Show whether command line editing is enabled.
@end table

@ifset SYSTEM_READLINE
@xref{Command Line Editing, , , rluserman, GNU Readline Library},
@end ifset
@ifclear SYSTEM_READLINE
@xref{Command Line Editing},
@end ifclear
for more details about the Readline
interface.  Users unfamiliar with @sc{gnu} Emacs or @code{vi} are
encouraged to read that chapter.

@node Command History
@section Command History
@cindex command history

@value{GDBN} can keep track of the commands you type during your
debugging sessions, so that you can be certain of precisely what
happened.  Use these commands to manage the @value{GDBN} command
history facility.

@value{GDBN} uses the @sc{gnu} History library, a part of the Readline
package, to provide the history facility.
@ifset SYSTEM_READLINE
@xref{Using History Interactively, , , history, GNU History Library},
@end ifset
@ifclear SYSTEM_READLINE
@xref{Using History Interactively},
@end ifclear
for the detailed description of the History library.

To issue a command to @value{GDBN} without affecting certain aspects of
the state which is seen by users, prefix it with @samp{server }
(@pxref{Server Prefix}).  This
means that this command will not affect the command history, nor will it
affect @value{GDBN}'s notion of which command to repeat if @key{RET} is
pressed on a line by itself.

@cindex @code{server}, command prefix
The server prefix does not affect the recording of values into the value
history; to print a value without recording it into the value history,
use the @code{output} command instead of the @code{print} command.

Here is the description of @value{GDBN} commands related to command
history.

@table @code
@cindex history substitution
@cindex history file
@kindex set history filename
@cindex @env{GDBHISTFILE}, environment variable
@item set history filename @var{fname}
Set the name of the @value{GDBN} command history file to @var{fname}.
This is the file where @value{GDBN} reads an initial command history
list, and where it writes the command history from this session when it
exits.  You can access this list through history expansion or through
the history command editing characters listed below.  This file defaults
to the value of the environment variable @code{GDBHISTFILE}, or to
@file{./.gdb_history} (@file{./_gdb_history} on MS-DOS) if this variable
is not set.

@cindex save command history
@kindex set history save
@item set history save
@itemx set history save on
Record command history in a file, whose name may be specified with the
@code{set history filename} command.  By default, this option is disabled.

@item set history save off
Stop recording command history in a file.

@cindex history size
@kindex set history size
@cindex @env{HISTSIZE}, environment variable
@item set history size @var{size}
@itemx set history size unlimited
Set the number of commands which @value{GDBN} keeps in its history list.
This defaults to the value of the environment variable
@code{HISTSIZE}, or to 256 if this variable is not set.  If @var{size}
is @code{unlimited}, the number of commands @value{GDBN} keeps in the
history list is unlimited.
@end table

History expansion assigns special meaning to the character @kbd{!}.
@ifset SYSTEM_READLINE
@xref{Event Designators, , , history, GNU History Library},
@end ifset
@ifclear SYSTEM_READLINE
@xref{Event Designators},
@end ifclear
for more details.

@cindex history expansion, turn on/off
Since @kbd{!} is also the logical not operator in C, history expansion
is off by default. If you decide to enable history expansion with the
@code{set history expansion on} command, you may sometimes need to
follow @kbd{!} (when it is used as logical not, in an expression) with
a space or a tab to prevent it from being expanded.  The readline
history facilities do not attempt substitution on the strings
@kbd{!=} and @kbd{!(}, even when history expansion is enabled.

The commands to control history expansion are:

@table @code
@item set history expansion on
@itemx set history expansion
@kindex set history expansion
Enable history expansion.  History expansion is off by default.

@item set history expansion off
Disable history expansion.

@c @group
@kindex show history
@item show history
@itemx show history filename
@itemx show history save
@itemx show history size
@itemx show history expansion
These commands display the state of the @value{GDBN} history parameters.
@code{show history} by itself displays all four states.
@c @end group
@end table

@table @code
@kindex show commands
@cindex show last commands
@cindex display command history
@item show commands
Display the last ten commands in the command history.

@item show commands @var{n}
Print ten commands centered on command number @var{n}.

@item show commands +
Print ten commands just after the commands last printed.
@end table

@node Screen Size
@section Screen Size
@cindex size of screen
@cindex screen size
@cindex pagination
@cindex page size
@cindex pauses in output

Certain commands to @value{GDBN} may produce large amounts of
information output to the screen.  To help you read all of it,
@value{GDBN} pauses and asks you for input at the end of each page of
output.  Type @key{RET} when you want to continue the output, or @kbd{q}
to discard the remaining output.  Also, the screen width setting
determines when to wrap lines of output.  Depending on what is being
printed, @value{GDBN} tries to break the line at a readable place,
rather than simply letting it overflow onto the following line.

Normally @value{GDBN} knows the size of the screen from the terminal
driver software.  For example, on Unix @value{GDBN} uses the termcap data base
together with the value of the @code{TERM} environment variable and the
@code{stty rows} and @code{stty cols} settings.  If this is not correct,
you can override it with the @code{set height} and @code{set
width} commands:

@table @code
@kindex set height
@kindex set width
@kindex show width
@kindex show height
@item set height @var{lpp}
@itemx set height unlimited
@itemx show height
@itemx set width @var{cpl}
@itemx set width unlimited
@itemx show width
These @code{set} commands specify a screen height of @var{lpp} lines and
a screen width of @var{cpl} characters.  The associated @code{show}
commands display the current settings.

If you specify a height of either @code{unlimited} or zero lines,
@value{GDBN} does not pause during output no matter how long the
output is.  This is useful if output is to a file or to an editor
buffer.

Likewise, you can specify @samp{set width unlimited} or @samp{set
width 0} to prevent @value{GDBN} from wrapping its output.

@item set pagination on
@itemx set pagination off
@kindex set pagination
Turn the output pagination on or off; the default is on.  Turning
pagination off is the alternative to @code{set height unlimited}.  Note that
running @value{GDBN} with the @option{--batch} option (@pxref{Mode
Options, -batch}) also automatically disables pagination.

@item show pagination
@kindex show pagination
Show the current pagination mode.
@end table

@node Numbers
@section Numbers
@cindex number representation
@cindex entering numbers

You can always enter numbers in octal, decimal, or hexadecimal in
@value{GDBN} by the usual conventions: octal numbers begin with
@samp{0}, decimal numbers end with @samp{.}, and hexadecimal numbers
begin with @samp{0x}.  Numbers that neither begin with @samp{0} or
@samp{0x}, nor end with a @samp{.} are, by default, entered in base
10; likewise, the default display for numbers---when no particular
format is specified---is base 10.  You can change the default base for
both input and output with the commands described below.

@table @code
@kindex set input-radix
@item set input-radix @var{base}
Set the default base for numeric input.  Supported choices
for @var{base} are decimal 8, 10, or 16.  The base must itself be
specified either unambiguously or using the current input radix; for
example, any of

@smallexample
set input-radix 012
set input-radix 10.
set input-radix 0xa
@end smallexample

@noindent
sets the input base to decimal.  On the other hand, @samp{set input-radix 10}
leaves the input radix unchanged, no matter what it was, since
@samp{10}, being without any leading or trailing signs of its base, is
interpreted in the current radix.  Thus, if the current radix is 16,
@samp{10} is interpreted in hex, i.e.@: as 16 decimal, which doesn't
change the radix.

@kindex set output-radix
@item set output-radix @var{base}
Set the default base for numeric display.  Supported choices
for @var{base} are decimal 8, 10, or 16.  The base must itself be
specified either unambiguously or using the current input radix.

@kindex show input-radix
@item show input-radix
Display the current default base for numeric input.

@kindex show output-radix
@item show output-radix
Display the current default base for numeric display.

@item set radix @r{[}@var{base}@r{]}
@itemx show radix
@kindex set radix
@kindex show radix
These commands set and show the default base for both input and output
of numbers.  @code{set radix} sets the radix of input and output to
the same base; without an argument, it resets the radix back to its
default value of 10.

@end table

@node ABI
@section Configuring the Current ABI

@value{GDBN} can determine the @dfn{ABI} (Application Binary Interface) of your
application automatically.  However, sometimes you need to override its
conclusions.  Use these commands to manage @value{GDBN}'s view of the
current ABI.

@cindex OS ABI
@kindex set osabi
@kindex show osabi
@cindex Newlib OS ABI and its influence on the longjmp handling

One @value{GDBN} configuration can debug binaries for multiple operating
system targets, either via remote debugging or native emulation.
@value{GDBN} will autodetect the @dfn{OS ABI} (Operating System ABI) in use,
but you can override its conclusion using the @code{set osabi} command.
One example where this is useful is in debugging of binaries which use
an alternate C library (e.g.@: @sc{uClibc} for @sc{gnu}/Linux) which does
not have the same identifying marks that the standard C library for your
platform provides.

When @value{GDBN} is debugging the AArch64 architecture, it provides a
``Newlib'' OS ABI.  This is useful for handling @code{setjmp} and
@code{longjmp} when debugging binaries that use the @sc{newlib} C library.
The ``Newlib'' OS ABI can be selected by @code{set osabi Newlib}.

@table @code
@item show osabi
Show the OS ABI currently in use.

@item set osabi
With no argument, show the list of registered available OS ABI's.

@item set osabi @var{abi}
Set the current OS ABI to @var{abi}.
@end table

@cindex float promotion

Generally, the way that an argument of type @code{float} is passed to a
function depends on whether the function is prototyped.  For a prototyped
(i.e.@: ANSI/ISO style) function, @code{float} arguments are passed unchanged,
according to the architecture's convention for @code{float}.  For unprototyped
(i.e.@: K&R style) functions, @code{float} arguments are first promoted to type
@code{double} and then passed.

Unfortunately, some forms of debug information do not reliably indicate whether
a function is prototyped.  If @value{GDBN} calls a function that is not marked
as prototyped, it consults @kbd{set coerce-float-to-double}.

@table @code
@kindex set coerce-float-to-double
@item set coerce-float-to-double
@itemx set coerce-float-to-double on
Arguments of type @code{float} will be promoted to @code{double} when passed
to an unprototyped function.  This is the default setting.

@item set coerce-float-to-double off
Arguments of type @code{float} will be passed directly to unprototyped
functions.

@kindex show coerce-float-to-double
@item show coerce-float-to-double
Show the current setting of promoting @code{float} to @code{double}.
@end table

@kindex set cp-abi
@kindex show cp-abi
@value{GDBN} needs to know the ABI used for your program's C@t{++}
objects.  The correct C@t{++} ABI depends on which C@t{++} compiler was
used to build your application.  @value{GDBN} only fully supports
programs with a single C@t{++} ABI; if your program contains code using
multiple C@t{++} ABI's or if @value{GDBN} can not identify your
program's ABI correctly, you can tell @value{GDBN} which ABI to use.
Currently supported ABI's include ``gnu-v2'', for @code{g++} versions
before 3.0, ``gnu-v3'', for @code{g++} versions 3.0 and later, and
``hpaCC'' for the HP ANSI C@t{++} compiler.  Other C@t{++} compilers may
use the ``gnu-v2'' or ``gnu-v3'' ABI's as well.  The default setting is
``auto''.

@table @code
@item show cp-abi
Show the C@t{++} ABI currently in use.

@item set cp-abi
With no argument, show the list of supported C@t{++} ABI's.

@item set cp-abi @var{abi}
@itemx set cp-abi auto
Set the current C@t{++} ABI to @var{abi}, or return to automatic detection.
@end table

@node Auto-loading
@section Automatically loading associated files
@cindex auto-loading

@value{GDBN} sometimes reads files with commands and settings automatically,
without being explicitly told so by the user.  We call this feature
@dfn{auto-loading}.  While auto-loading is useful for automatically adapting
@value{GDBN} to the needs of your project, it can sometimes produce unexpected
results or introduce security risks (e.g., if the file comes from untrusted
sources).

@menu
* Init File in the Current Directory:: @samp{set/show/info auto-load local-gdbinit}
* libthread_db.so.1 file::             @samp{set/show/info auto-load libthread-db}

* Auto-loading safe path::             @samp{set/show/info auto-load safe-path}
* Auto-loading verbose mode::          @samp{set/show debug auto-load}
@end menu

There are various kinds of files @value{GDBN} can automatically load.
In addition to these files, @value{GDBN} supports auto-loading code written
in various extension languages.  @xref{Auto-loading extensions}.

Note that loading of these associated files (including the local @file{.gdbinit}
file) requires accordingly configured @code{auto-load safe-path}
(@pxref{Auto-loading safe path}).

For these reasons, @value{GDBN} includes commands and options to let you
control when to auto-load files and which files should be auto-loaded.

@table @code
@anchor{set auto-load off}
@kindex set auto-load off
@item set auto-load off
Globally disable loading of all auto-loaded files.
You may want to use this command with the @samp{-iex} option
(@pxref{Option -init-eval-command}) such as:
@smallexample
$ @kbd{gdb -iex "set auto-load off" untrusted-executable corefile}
@end smallexample

Be aware that system init file (@pxref{System-wide configuration})
and init files from your home directory (@pxref{Home Directory Init File})
still get read (as they come from generally trusted directories).
To prevent @value{GDBN} from auto-loading even those init files, use the
@option{-nx} option (@pxref{Mode Options}), in addition to
@code{set auto-load no}.

@anchor{show auto-load}
@kindex show auto-load
@item show auto-load
Show whether auto-loading of each specific @samp{auto-load} file(s) is enabled
or disabled.

@smallexample
(gdb) show auto-load
gdb-scripts:  Auto-loading of canned sequences of commands scripts is on.
libthread-db:  Auto-loading of inferior specific libthread_db is on.
local-gdbinit:  Auto-loading of .gdbinit script from current directory
                is on.
python-scripts:  Auto-loading of Python scripts is on.
safe-path:  List of directories from which it is safe to auto-load files
            is $debugdir:$datadir/auto-load.
scripts-directory:  List of directories from which to load auto-loaded scripts
                    is $debugdir:$datadir/auto-load.
@end smallexample

@anchor{info auto-load}
@kindex info auto-load
@item info auto-load
Print whether each specific @samp{auto-load} file(s) have been auto-loaded or
not.

@smallexample
(gdb) info auto-load
gdb-scripts:
Loaded  Script
Yes     /home/user/gdb/gdb-gdb.gdb
libthread-db:  No auto-loaded libthread-db.
local-gdbinit:  Local .gdbinit file "/home/user/gdb/.gdbinit" has been
                loaded.
python-scripts:
Loaded  Script
Yes     /home/user/gdb/gdb-gdb.py
@end smallexample
@end table

These are @value{GDBN} control commands for the auto-loading:

@multitable @columnfractions .5 .5
@item @xref{set auto-load off}.
@tab Disable auto-loading globally.
@item @xref{show auto-load}.
@tab Show setting of all kinds of files.
@item @xref{info auto-load}.
@tab Show state of all kinds of files.
@item @xref{set auto-load gdb-scripts}.
@tab Control for @value{GDBN} command scripts.
@item @xref{show auto-load gdb-scripts}.
@tab Show setting of @value{GDBN} command scripts.
@item @xref{info auto-load gdb-scripts}.
@tab Show state of @value{GDBN} command scripts.
@item @xref{set auto-load python-scripts}.
@tab Control for @value{GDBN} Python scripts.
@item @xref{show auto-load python-scripts}.
@tab Show setting of @value{GDBN} Python scripts.
@item @xref{info auto-load python-scripts}.
@tab Show state of @value{GDBN} Python scripts.
@item @xref{set auto-load guile-scripts}.
@tab Control for @value{GDBN} Guile scripts.
@item @xref{show auto-load guile-scripts}.
@tab Show setting of @value{GDBN} Guile scripts.
@item @xref{info auto-load guile-scripts}.
@tab Show state of @value{GDBN} Guile scripts.
@item @xref{set auto-load scripts-directory}.
@tab Control for @value{GDBN} auto-loaded scripts location.
@item @xref{show auto-load scripts-directory}.
@tab Show @value{GDBN} auto-loaded scripts location.
@item @xref{add-auto-load-scripts-directory}.
@tab Add directory for auto-loaded scripts location list.
@item @xref{set auto-load local-gdbinit}.
@tab Control for init file in the current directory.
@item @xref{show auto-load local-gdbinit}.
@tab Show setting of init file in the current directory.
@item @xref{info auto-load local-gdbinit}.
@tab Show state of init file in the current directory.
@item @xref{set auto-load libthread-db}.
@tab Control for thread debugging library.
@item @xref{show auto-load libthread-db}.
@tab Show setting of thread debugging library.
@item @xref{info auto-load libthread-db}.
@tab Show state of thread debugging library.
@item @xref{set auto-load safe-path}.
@tab Control directories trusted for automatic loading.
@item @xref{show auto-load safe-path}.
@tab Show directories trusted for automatic loading.
@item @xref{add-auto-load-safe-path}.
@tab Add directory trusted for automatic loading.
@end multitable

@node Init File in the Current Directory
@subsection Automatically loading init file in the current directory
@cindex auto-loading init file in the current directory

By default, @value{GDBN} reads and executes the canned sequences of commands
from init file (if any) in the current working directory,
see @ref{Init File in the Current Directory during Startup}.

Note that loading of this local @file{.gdbinit} file also requires accordingly
configured @code{auto-load safe-path} (@pxref{Auto-loading safe path}).

@table @code
@anchor{set auto-load local-gdbinit}
@kindex set auto-load local-gdbinit
@item set auto-load local-gdbinit [on|off]
Enable or disable the auto-loading of canned sequences of commands
(@pxref{Sequences}) found in init file in the current directory.

@anchor{show auto-load local-gdbinit}
@kindex show auto-load local-gdbinit
@item show auto-load local-gdbinit
Show whether auto-loading of canned sequences of commands from init file in the
current directory is enabled or disabled.

@anchor{info auto-load local-gdbinit}
@kindex info auto-load local-gdbinit
@item info auto-load local-gdbinit
Print whether canned sequences of commands from init file in the
current directory have been auto-loaded.
@end table

@node libthread_db.so.1 file
@subsection Automatically loading thread debugging library
@cindex auto-loading libthread_db.so.1

This feature is currently present only on @sc{gnu}/Linux native hosts.

@value{GDBN} reads in some cases thread debugging library from places specific
to the inferior (@pxref{set libthread-db-search-path}).

The special @samp{libthread-db-search-path} entry @samp{$sdir} is processed
without checking this @samp{set auto-load libthread-db} switch as system
libraries have to be trusted in general.  In all other cases of
@samp{libthread-db-search-path} entries @value{GDBN} checks first if @samp{set
auto-load libthread-db} is enabled before trying to open such thread debugging
library.

Note that loading of this debugging library also requires accordingly configured
@code{auto-load safe-path} (@pxref{Auto-loading safe path}).

@table @code
@anchor{set auto-load libthread-db}
@kindex set auto-load libthread-db
@item set auto-load libthread-db [on|off]
Enable or disable the auto-loading of inferior specific thread debugging library.

@anchor{show auto-load libthread-db}
@kindex show auto-load libthread-db
@item show auto-load libthread-db
Show whether auto-loading of inferior specific thread debugging library is
enabled or disabled.

@anchor{info auto-load libthread-db}
@kindex info auto-load libthread-db
@item info auto-load libthread-db
Print the list of all loaded inferior specific thread debugging libraries and
for each such library print list of inferior @var{pid}s using it.
@end table

@node Auto-loading safe path
@subsection Security restriction for auto-loading
@cindex auto-loading safe-path

As the files of inferior can come from untrusted source (such as submitted by
an application user) @value{GDBN} does not always load any files automatically.
@value{GDBN} provides the @samp{set auto-load safe-path} setting to list
directories trusted for loading files not explicitly requested by user.
Each directory can also be a shell wildcard pattern.

If the path is not set properly you will see a warning and the file will not
get loaded:

@smallexample
$ ./gdb -q ./gdb
Reading symbols from /home/user/gdb/gdb...done.
warning: File "/home/user/gdb/gdb-gdb.gdb" auto-loading has been
         declined by your `auto-load safe-path' set
         to "$debugdir:$datadir/auto-load".
warning: File "/home/user/gdb/gdb-gdb.py" auto-loading has been
         declined by your `auto-load safe-path' set
         to "$debugdir:$datadir/auto-load".
@end smallexample

@noindent
To instruct @value{GDBN} to go ahead and use the init files anyway,
invoke @value{GDBN} like this:

@smallexample
$ gdb -q -iex "set auto-load safe-path /home/user/gdb" ./gdb
@end smallexample

The list of trusted directories is controlled by the following commands:

@table @code
@anchor{set auto-load safe-path}
@kindex set auto-load safe-path
@item set auto-load safe-path @r{[}@var{directories}@r{]}
Set the list of directories (and their subdirectories) trusted for automatic
loading and execution of scripts.  You can also enter a specific trusted file.
Each directory can also be a shell wildcard pattern; wildcards do not match
directory separator - see @code{FNM_PATHNAME} for system function @code{fnmatch}
(@pxref{Wildcard Matching, fnmatch, , libc, GNU C Library Reference Manual}).
If you omit @var{directories}, @samp{auto-load safe-path} will be reset to
its default value as specified during @value{GDBN} compilation.

The list of directories uses path separator (@samp{:} on GNU and Unix
systems, @samp{;} on MS-Windows and MS-DOS) to separate directories, similarly
to the @env{PATH} environment variable.

@anchor{show auto-load safe-path}
@kindex show auto-load safe-path
@item show auto-load safe-path
Show the list of directories trusted for automatic loading and execution of
scripts.

@anchor{add-auto-load-safe-path}
@kindex add-auto-load-safe-path
@item add-auto-load-safe-path
Add an entry (or list of entries) to the list of directories trusted for
automatic loading and execution of scripts.  Multiple entries may be delimited
by the host platform path separator in use.
@end table

This variable defaults to what @code{--with-auto-load-dir} has been configured
to (@pxref{with-auto-load-dir}).  @file{$debugdir} and @file{$datadir}
substitution applies the same as for @ref{set auto-load scripts-directory}.
The default @code{set auto-load safe-path} value can be also overriden by
@value{GDBN} configuration option @option{--with-auto-load-safe-path}.

Setting this variable to @file{/} disables this security protection,
corresponding @value{GDBN} configuration option is
@option{--without-auto-load-safe-path}.
This variable is supposed to be set to the system directories writable by the
system superuser only.  Users can add their source directories in init files in
their home directories (@pxref{Home Directory Init File}).  See also deprecated
init file in the current directory
(@pxref{Init File in the Current Directory during Startup}).

To force @value{GDBN} to load the files it declined to load in the previous
example, you could use one of the following ways:

@table @asis
@item @file{~/.gdbinit}: @samp{add-auto-load-safe-path ~/src/gdb}
Specify this trusted directory (or a file) as additional component of the list.
You have to specify also any existing directories displayed by
by @samp{show auto-load safe-path} (such as @samp{/usr:/bin} in this example).

@item @kbd{gdb -iex "set auto-load safe-path /usr:/bin:~/src/gdb" @dots{}}
Specify this directory as in the previous case but just for a single
@value{GDBN} session.

@item @kbd{gdb -iex "set auto-load safe-path /" @dots{}}
Disable auto-loading safety for a single @value{GDBN} session.
This assumes all the files you debug during this @value{GDBN} session will come
from trusted sources.

@item @kbd{./configure --without-auto-load-safe-path}
During compilation of @value{GDBN} you may disable any auto-loading safety.
This assumes all the files you will ever debug with this @value{GDBN} come from
trusted sources.
@end table

On the other hand you can also explicitly forbid automatic files loading which
also suppresses any such warning messages:

@table @asis
@item @kbd{gdb -iex "set auto-load no" @dots{}}
You can use @value{GDBN} command-line option for a single @value{GDBN} session.

@item @file{~/.gdbinit}: @samp{set auto-load no}
Disable auto-loading globally for the user
(@pxref{Home Directory Init File}).  While it is improbable, you could also
use system init file instead (@pxref{System-wide configuration}).
@end table

This setting applies to the file names as entered by user.  If no entry matches
@value{GDBN} tries as a last resort to also resolve all the file names into
their canonical form (typically resolving symbolic links) and compare the
entries again.  @value{GDBN} already canonicalizes most of the filenames on its
own before starting the comparison so a canonical form of directories is
recommended to be entered.

@node Auto-loading verbose mode
@subsection Displaying files tried for auto-load
@cindex auto-loading verbose mode

For better visibility of all the file locations where you can place scripts to
be auto-loaded with inferior --- or to protect yourself against accidental
execution of untrusted scripts --- @value{GDBN} provides a feature for printing
all the files attempted to be loaded.  Both existing and non-existing files may
be printed.

For example the list of directories from which it is safe to auto-load files
(@pxref{Auto-loading safe path}) applies also to canonicalized filenames which
may not be too obvious while setting it up.

@smallexample
(gdb) set debug auto-load on
(gdb) file ~/src/t/true
auto-load: Loading canned sequences of commands script "/tmp/true-gdb.gdb"
           for objfile "/tmp/true".
auto-load: Updating directories of "/usr:/opt".
auto-load: Using directory "/usr".
auto-load: Using directory "/opt".
warning: File "/tmp/true-gdb.gdb" auto-loading has been declined
         by your `auto-load safe-path' set to "/usr:/opt".
@end smallexample

@table @code
@anchor{set debug auto-load}
@kindex set debug auto-load
@item set debug auto-load [on|off]
Set whether to print the filenames attempted to be auto-loaded.

@anchor{show debug auto-load}
@kindex show debug auto-load
@item show debug auto-load
Show whether printing of the filenames attempted to be auto-loaded is turned
on or off.
@end table

@node Messages/Warnings
@section Optional Warnings and Messages

@cindex verbose operation
@cindex optional warnings
By default, @value{GDBN} is silent about its inner workings.  If you are
running on a slow machine, you may want to use the @code{set verbose}
command.  This makes @value{GDBN} tell you when it does a lengthy
internal operation, so you will not think it has crashed.

Currently, the messages controlled by @code{set verbose} are those
which announce that the symbol table for a source file is being read;
see @code{symbol-file} in @ref{Files, ,Commands to Specify Files}.

@table @code
@kindex set verbose
@item set verbose on
Enables @value{GDBN} output of certain informational messages.

@item set verbose off
Disables @value{GDBN} output of certain informational messages.

@kindex show verbose
@item show verbose
Displays whether @code{set verbose} is on or off.
@end table

By default, if @value{GDBN} encounters bugs in the symbol table of an
object file, it is silent; but if you are debugging a compiler, you may
find this information useful (@pxref{Symbol Errors, ,Errors Reading
Symbol Files}).

@table @code

@kindex set complaints
@item set complaints @var{limit}
Permits @value{GDBN} to output @var{limit} complaints about each type of
unusual symbols before becoming silent about the problem.  Set
@var{limit} to zero to suppress all complaints; set it to a large number
to prevent complaints from being suppressed.

@kindex show complaints
@item show complaints
Displays how many symbol complaints @value{GDBN} is permitted to produce.

@end table

@anchor{confirmation requests}
By default, @value{GDBN} is cautious, and asks what sometimes seems to be a
lot of stupid questions to confirm certain commands.  For example, if
you try to run a program which is already running:

@smallexample
(@value{GDBP}) run
The program being debugged has been started already.
Start it from the beginning? (y or n)
@end smallexample

If you are willing to unflinchingly face the consequences of your own
commands, you can disable this ``feature'':

@table @code

@kindex set confirm
@cindex flinching
@cindex confirmation
@cindex stupid questions
@item set confirm off
Disables confirmation requests.  Note that running @value{GDBN} with
the @option{--batch} option (@pxref{Mode Options, -batch}) also
automatically disables confirmation requests.

@item set confirm on
Enables confirmation requests (the default).

@kindex show confirm
@item show confirm
Displays state of confirmation requests.

@end table

@cindex command tracing
If you need to debug user-defined commands or sourced files you may find it
useful to enable @dfn{command tracing}.  In this mode each command will be
printed as it is executed, prefixed with one or more @samp{+} symbols, the
quantity denoting the call depth of each command.

@table @code
@kindex set trace-commands
@cindex command scripts, debugging
@item set trace-commands on
Enable command tracing.
@item set trace-commands off
Disable command tracing.
@item show trace-commands
Display the current state of command tracing.
@end table

@node Debugging Output
@section Optional Messages about Internal Happenings
@cindex optional debugging messages

@value{GDBN} has commands that enable optional debugging messages from
various @value{GDBN} subsystems; normally these commands are of
interest to @value{GDBN} maintainers, or when reporting a bug.  This
section documents those commands.

@table @code
@kindex set exec-done-display
@item set exec-done-display
Turns on or off the notification of asynchronous commands'
completion.  When on, @value{GDBN} will print a message when an
asynchronous command finishes its execution.  The default is off.
@kindex show exec-done-display
@item show exec-done-display
Displays the current setting of asynchronous command completion
notification.
@kindex set debug
@cindex ARM AArch64
@item set debug aarch64
Turns on or off display of debugging messages related to ARM AArch64.
The default is off.
@kindex show debug
@item show debug aarch64
Displays the current state of displaying debugging messages related to
ARM AArch64.
@cindex gdbarch debugging info
@cindex architecture debugging info
@item set debug arch
Turns on or off display of gdbarch debugging info.  The default is off
@item show debug arch
Displays the current state of displaying gdbarch debugging info.
@item set debug aix-solib
@cindex AIX shared library debugging
Control display of debugging messages from the AIX shared library
support module.  The default is off.
@item show debug aix-thread
Show the current state of displaying AIX shared library debugging messages.
@item set debug aix-thread
@cindex AIX threads
Display debugging messages about inner workings of the AIX thread
module.
@item show debug aix-thread
Show the current state of AIX thread debugging info display.
@item set debug check-physname
@cindex physname
Check the results of the ``physname'' computation.  When reading DWARF
debugging information for C@t{++}, @value{GDBN} attempts to compute
each entity's name.  @value{GDBN} can do this computation in two
different ways, depending on exactly what information is present.
When enabled, this setting causes @value{GDBN} to compute the names
both ways and display any discrepancies.
@item show debug check-physname
Show the current state of ``physname'' checking.
@item set debug coff-pe-read
@cindex COFF/PE exported symbols
Control display of debugging messages related to reading of COFF/PE
exported symbols.  The default is off.
@item show debug coff-pe-read
Displays the current state of displaying debugging messages related to
reading of COFF/PE exported symbols.
@item set debug dwarf2-die
@cindex DWARF2 DIEs
Dump DWARF2 DIEs after they are read in.
The value is the number of nesting levels to print.
A value of zero turns off the display.
@item show debug dwarf2-die
Show the current state of DWARF2 DIE debugging.
@item set debug dwarf2-read
@cindex DWARF2 Reading
Turns on or off display of debugging messages related to reading
DWARF debug info.  The default is 0 (off).
A value of 1 provides basic information.
A value greater than 1 provides more verbose information.
@item show debug dwarf2-read
Show the current state of DWARF2 reader debugging.
@item set debug displaced
@cindex displaced stepping debugging info
Turns on or off display of @value{GDBN} debugging info for the
displaced stepping support.  The default is off.
@item show debug displaced
Displays the current state of displaying @value{GDBN} debugging info
related to displaced stepping.
@item set debug event
@cindex event debugging info
Turns on or off display of @value{GDBN} event debugging info.  The
default is off.
@item show debug event
Displays the current state of displaying @value{GDBN} event debugging
info.
@item set debug expression
@cindex expression debugging info
Turns on or off display of debugging info about @value{GDBN}
expression parsing.  The default is off.
@item show debug expression
Displays the current state of displaying debugging info about
@value{GDBN} expression parsing.
@item set debug frame
@cindex frame debugging info
Turns on or off display of @value{GDBN} frame debugging info.  The
default is off.
@item show debug frame
Displays the current state of displaying @value{GDBN} frame debugging
info.
@item set debug gnu-nat
@cindex @sc{gnu}/Hurd debug messages
Turns on or off debugging messages from the @sc{gnu}/Hurd debug support.
@item show debug gnu-nat
Show the current state of @sc{gnu}/Hurd debugging messages.
@item set debug infrun
@cindex inferior debugging info
Turns on or off display of @value{GDBN} debugging info for running the inferior.
The default is off.  @file{infrun.c} contains GDB's runtime state machine used 
for implementing operations such as single-stepping the inferior.
@item show debug infrun
Displays the current state of @value{GDBN} inferior debugging.
@item set debug jit
@cindex just-in-time compilation, debugging messages
Turns on or off debugging messages from JIT debug support.
@item show debug jit
Displays the current state of @value{GDBN} JIT debugging.
@item set debug lin-lwp
@cindex @sc{gnu}/Linux LWP debug messages
@cindex Linux lightweight processes
Turns on or off debugging messages from the Linux LWP debug support.
@item show debug lin-lwp
Show the current state of Linux LWP debugging messages.
@item set debug mach-o
@cindex Mach-O symbols processing
Control display of debugging messages related to Mach-O symbols
processing.  The default is off.
@item show debug mach-o
Displays the current state of displaying debugging messages related to
reading of COFF/PE exported symbols.
@item set debug notification
@cindex remote async notification debugging info
Turns on or off debugging messages about remote async notification.
The default is off.
@item show debug notification
Displays the current state of remote async notification debugging messages.
@item set debug observer
@cindex observer debugging info
Turns on or off display of @value{GDBN} observer debugging.  This
includes info such as the notification of observable events.
@item show debug observer
Displays the current state of observer debugging.
@item set debug overload
@cindex C@t{++} overload debugging info
Turns on or off display of @value{GDBN} C@t{++} overload debugging
info. This includes info such as ranking of functions, etc.  The default
is off.
@item show debug overload
Displays the current state of displaying @value{GDBN} C@t{++} overload
debugging info.
@cindex expression parser, debugging info
@cindex debug expression parser
@item set debug parser
Turns on or off the display of expression parser debugging output.
Internally, this sets the @code{yydebug} variable in the expression
parser.  @xref{Tracing, , Tracing Your Parser, bison, Bison}, for
details.  The default is off.
@item show debug parser
Show the current state of expression parser debugging.
@cindex packets, reporting on stdout
@cindex serial connections, debugging
@cindex debug remote protocol
@cindex remote protocol debugging
@cindex display remote packets
@item set debug remote
Turns on or off display of reports on all packets sent back and forth across
the serial line to the remote machine.  The info is printed on the
@value{GDBN} standard output stream. The default is off.
@item show debug remote
Displays the state of display of remote packets.
@item set debug serial
Turns on or off display of @value{GDBN} serial debugging info. The
default is off.
@item show debug serial
Displays the current state of displaying @value{GDBN} serial debugging
info.
@item set debug solib-frv
@cindex FR-V shared-library debugging
Turns on or off debugging messages for FR-V shared-library code.
@item show debug solib-frv
Display the current state of FR-V shared-library code debugging
messages.
@item set debug symbol-lookup
@cindex symbol lookup
Turns on or off display of debugging messages related to symbol lookup.
The default is 0 (off).
A value of 1 provides basic information.
A value greater than 1 provides more verbose information.
@item show debug symbol-lookup
Show the current state of symbol lookup debugging messages.
@item set debug symfile
@cindex symbol file functions
Turns on or off display of debugging messages related to symbol file functions.
The default is off.  @xref{Files}.
@item show debug symfile
Show the current state of symbol file debugging messages.
@item set debug symtab-create
@cindex symbol table creation
Turns on or off display of debugging messages related to symbol table creation.
The default is 0 (off).
A value of 1 provides basic information.
A value greater than 1 provides more verbose information.
@item show debug symtab-create
Show the current state of symbol table creation debugging.
@item set debug target
@cindex target debugging info
Turns on or off display of @value{GDBN} target debugging info. This info
includes what is going on at the target level of GDB, as it happens. The
default is 0.  Set it to 1 to track events, and to 2 to also track the
value of large memory transfers.
@item show debug target
Displays the current state of displaying @value{GDBN} target debugging
info.
@item set debug timestamp
@cindex timestampping debugging info
Turns on or off display of timestamps with @value{GDBN} debugging info.
When enabled, seconds and microseconds are displayed before each debugging
message.
@item show debug timestamp
Displays the current state of displaying timestamps with @value{GDBN}
debugging info.
@item set debug varobj
@cindex variable object debugging info
Turns on or off display of @value{GDBN} variable object debugging
info. The default is off.
@item show debug varobj
Displays the current state of displaying @value{GDBN} variable object
debugging info.
@item set debug xml
@cindex XML parser debugging
Turns on or off debugging messages for built-in XML parsers.
@item show debug xml
Displays the current state of XML debugging messages.
@end table

@node Other Misc Settings
@section Other Miscellaneous Settings
@cindex miscellaneous settings

@table @code
@kindex set interactive-mode
@item set interactive-mode
If @code{on}, forces @value{GDBN} to assume that GDB was started
in a terminal.  In practice, this means that @value{GDBN} should wait
for the user to answer queries generated by commands entered at
the command prompt.  If @code{off}, forces @value{GDBN} to operate
in the opposite mode, and it uses the default answers to all queries.
If @code{auto} (the default), @value{GDBN} tries to determine whether
its standard input is a terminal, and works in interactive-mode if it
is, non-interactively otherwise.

In the vast majority of cases, the debugger should be able to guess
correctly which mode should be used.  But this setting can be useful
in certain specific cases, such as running a MinGW @value{GDBN}
inside a cygwin window.

@kindex show interactive-mode
@item show interactive-mode
Displays whether the debugger is operating in interactive mode or not.
@end table

@node Extending GDB
@chapter Extending @value{GDBN}
@cindex extending GDB

@value{GDBN} provides several mechanisms for extension.
@value{GDBN} also provides the ability to automatically load
extensions when it reads a file for debugging.  This allows the
user to automatically customize @value{GDBN} for the program
being debugged.

@menu
* Sequences::                Canned Sequences of @value{GDBN} Commands
* Python::                   Extending @value{GDBN} using Python
* Guile::                    Extending @value{GDBN} using Guile
* Auto-loading extensions::  Automatically loading extensions
* Multiple Extension Languages:: Working with multiple extension languages
* Aliases::                  Creating new spellings of existing commands
@end menu

To facilitate the use of extension languages, @value{GDBN} is capable
of evaluating the contents of a file.  When doing so, @value{GDBN}
can recognize which extension language is being used by looking at
the filename extension.  Files with an unrecognized filename extension
are always treated as a @value{GDBN} Command Files.
@xref{Command Files,, Command files}.

You can control how @value{GDBN} evaluates these files with the following
setting:

@table @code
@kindex set script-extension
@kindex show script-extension
@item set script-extension off
All scripts are always evaluated as @value{GDBN} Command Files.

@item set script-extension soft
The debugger determines the scripting language based on filename
extension.  If this scripting language is supported, @value{GDBN}
evaluates the script using that language.  Otherwise, it evaluates
the file as a @value{GDBN} Command File.

@item set script-extension strict
The debugger determines the scripting language based on filename
extension, and evaluates the script using that language.  If the
language is not supported, then the evaluation fails.

@item show script-extension
Display the current value of the @code{script-extension} option.

@end table

@node Sequences
@section Canned Sequences of Commands

Aside from breakpoint commands (@pxref{Break Commands, ,Breakpoint
Command Lists}), @value{GDBN} provides two ways to store sequences of
commands for execution as a unit: user-defined commands and command
files.

@menu
* Define::             How to define your own commands
* Hooks::              Hooks for user-defined commands
* Command Files::      How to write scripts of commands to be stored in a file
* Output::             Commands for controlled output
* Auto-loading sequences::  Controlling auto-loaded command files
@end menu

@node Define
@subsection User-defined Commands

@cindex user-defined command
@cindex arguments, to user-defined commands
A @dfn{user-defined command} is a sequence of @value{GDBN} commands to
which you assign a new name as a command.  This is done with the
@code{define} command.  User commands may accept up to 10 arguments
separated by whitespace.  Arguments are accessed within the user command
via @code{$arg0@dots{}$arg9}.  A trivial example:

@smallexample
define adder
  print $arg0 + $arg1 + $arg2
end
@end smallexample

@noindent
To execute the command use:

@smallexample
adder 1 2 3
@end smallexample

@noindent
This defines the command @code{adder}, which prints the sum of
its three arguments.  Note the arguments are text substitutions, so they may
reference variables, use complex expressions, or even perform inferior
functions calls.

@cindex argument count in user-defined commands
@cindex how many arguments (user-defined commands)
In addition, @code{$argc} may be used to find out how many arguments have
been passed.  This expands to a number in the range 0@dots{}10.

@smallexample
define adder
  if $argc == 2
    print $arg0 + $arg1
  end
  if $argc == 3
    print $arg0 + $arg1 + $arg2
  end
end
@end smallexample

@table @code

@kindex define
@item define @var{commandname}
Define a command named @var{commandname}.  If there is already a command
by that name, you are asked to confirm that you want to redefine it.
The argument @var{commandname} may be a bare command name consisting of letters,
numbers, dashes, and underscores.  It may also start with any predefined
prefix command.  For example, @samp{define target my-target} creates
a user-defined @samp{target my-target} command.

The definition of the command is made up of other @value{GDBN} command lines,
which are given following the @code{define} command.  The end of these
commands is marked by a line containing @code{end}.

@kindex document
@kindex end@r{ (user-defined commands)}
@item document @var{commandname}
Document the user-defined command @var{commandname}, so that it can be
accessed by @code{help}.  The command @var{commandname} must already be
defined.  This command reads lines of documentation just as @code{define}
reads the lines of the command definition, ending with @code{end}.
After the @code{document} command is finished, @code{help} on command
@var{commandname} displays the documentation you have written.

You may use the @code{document} command again to change the
documentation of a command.  Redefining the command with @code{define}
does not change the documentation.

@kindex dont-repeat
@cindex don't repeat command
@item dont-repeat
Used inside a user-defined command, this tells @value{GDBN} that this
command should not be repeated when the user hits @key{RET}
(@pxref{Command Syntax, repeat last command}).

@kindex help user-defined
@item help user-defined
List all user-defined commands and all python commands defined in class
COMAND_USER.  The first line of the documentation or docstring is
included (if any).

@kindex show user
@item show user
@itemx show user @var{commandname}
Display the @value{GDBN} commands used to define @var{commandname} (but
not its documentation).  If no @var{commandname} is given, display the
definitions for all user-defined commands.
This does not work for user-defined python commands.

@cindex infinite recursion in user-defined commands
@kindex show max-user-call-depth
@kindex set max-user-call-depth
@item show max-user-call-depth
@itemx set max-user-call-depth
The value of @code{max-user-call-depth} controls how many recursion
levels are allowed in user-defined commands before @value{GDBN} suspects an
infinite recursion and aborts the command.
This does not apply to user-defined python commands.
@end table

In addition to the above commands, user-defined commands frequently
use control flow commands, described in @ref{Command Files}.

When user-defined commands are executed, the
commands of the definition are not printed.  An error in any command
stops execution of the user-defined command.

If used interactively, commands that would ask for confirmation proceed
without asking when used inside a user-defined command.  Many @value{GDBN}
commands that normally print messages to say what they are doing omit the
messages when used in a user-defined command.

@node Hooks
@subsection User-defined Command Hooks
@cindex command hooks
@cindex hooks, for commands
@cindex hooks, pre-command

@kindex hook
You may define @dfn{hooks}, which are a special kind of user-defined
command.  Whenever you run the command @samp{foo}, if the user-defined
command @samp{hook-foo} exists, it is executed (with no arguments)
before that command.

@cindex hooks, post-command
@kindex hookpost
A hook may also be defined which is run after the command you executed.
Whenever you run the command @samp{foo}, if the user-defined command
@samp{hookpost-foo} exists, it is executed (with no arguments) after
that command.  Post-execution hooks may exist simultaneously with
pre-execution hooks, for the same command.

It is valid for a hook to call the command which it hooks.  If this
occurs, the hook is not re-executed, thereby avoiding infinite recursion.

@c It would be nice if hookpost could be passed a parameter indicating
@c if the command it hooks executed properly or not.  FIXME!

@kindex stop@r{, a pseudo-command}
In addition, a pseudo-command, @samp{stop} exists.  Defining
(@samp{hook-stop}) makes the associated commands execute every time
execution stops in your program: before breakpoint commands are run,
displays are printed, or the stack frame is printed.

For example, to ignore @code{SIGALRM} signals while
single-stepping, but treat them normally during normal execution,
you could define:

@smallexample
define hook-stop
handle SIGALRM nopass
end

define hook-run
handle SIGALRM pass
end

define hook-continue
handle SIGALRM pass
end
@end smallexample

As a further example, to hook at the beginning and end of the @code{echo}
command, and to add extra text to the beginning and end of the message,
you could define:

@smallexample
define hook-echo
echo <<<---
end

define hookpost-echo
echo --->>>\n
end

(@value{GDBP}) echo Hello World
<<<---Hello World--->>>
(@value{GDBP})

@end smallexample

You can define a hook for any single-word command in @value{GDBN}, but
not for command aliases; you should define a hook for the basic command
name, e.g.@:  @code{backtrace} rather than @code{bt}.
@c FIXME!  So how does Joe User discover whether a command is an alias
@c or not?
You can hook a multi-word command by adding @code{hook-} or
@code{hookpost-} to the last word of the command, e.g.@:
@samp{define target hook-remote} to add a hook to @samp{target remote}.

If an error occurs during the execution of your hook, execution of
@value{GDBN} commands stops and @value{GDBN} issues a prompt
(before the command that you actually typed had a chance to run).

If you try to define a hook which does not match any known command, you
get a warning from the @code{define} command.

@node Command Files
@subsection Command Files

@cindex command files
@cindex scripting commands
A command file for @value{GDBN} is a text file made of lines that are
@value{GDBN} commands.  Comments (lines starting with @kbd{#}) may
also be included.  An empty line in a command file does nothing; it
does not mean to repeat the last command, as it would from the
terminal.

You can request the execution of a command file with the @code{source}
command.  Note that the @code{source} command is also used to evaluate
scripts that are not Command Files.  The exact behavior can be configured
using the @code{script-extension} setting.
@xref{Extending GDB,, Extending GDB}.

@table @code
@kindex source
@cindex execute commands from a file
@item source [-s] [-v] @var{filename}
Execute the command file @var{filename}.
@end table

The lines in a command file are generally executed sequentially,
unless the order of execution is changed by one of the
@emph{flow-control commands} described below.  The commands are not
printed as they are executed.  An error in any command terminates
execution of the command file and control is returned to the console.

@value{GDBN} first searches for @var{filename} in the current directory.
If the file is not found there, and @var{filename} does not specify a
directory, then @value{GDBN} also looks for the file on the source search path
(specified with the @samp{directory} command);
except that @file{$cdir} is not searched because the compilation directory
is not relevant to scripts.

If @code{-s} is specified, then @value{GDBN} searches for @var{filename}
on the search path even if @var{filename} specifies a directory.
The search is done by appending @var{filename} to each element of the
search path.  So, for example, if @var{filename} is @file{mylib/myscript}
and the search path contains @file{/home/user} then @value{GDBN} will
look for the script @file{/home/user/mylib/myscript}.
The search is also done if @var{filename} is an absolute path.
For example, if @var{filename} is @file{/tmp/myscript} and
the search path contains @file{/home/user} then @value{GDBN} will
look for the script @file{/home/user/tmp/myscript}.
For DOS-like systems, if @var{filename} contains a drive specification,
it is stripped before concatenation.  For example, if @var{filename} is
@file{d:myscript} and the search path contains @file{c:/tmp} then @value{GDBN}
will look for the script @file{c:/tmp/myscript}.

If @code{-v}, for verbose mode, is given then @value{GDBN} displays
each command as it is executed.  The option must be given before
@var{filename}, and is interpreted as part of the filename anywhere else.

Commands that would ask for confirmation if used interactively proceed
without asking when used in a command file.  Many @value{GDBN} commands that
normally print messages to say what they are doing omit the messages
when called from command files.

@value{GDBN} also accepts command input from standard input.  In this
mode, normal output goes to standard output and error output goes to
standard error.  Errors in a command file supplied on standard input do
not terminate execution of the command file---execution continues with
the next command.

@smallexample
gdb < cmds > log 2>&1
@end smallexample

(The syntax above will vary depending on the shell used.) This example
will execute commands from the file @file{cmds}. All output and errors
would be directed to @file{log}.

Since commands stored on command files tend to be more general than
commands typed interactively, they frequently need to deal with
complicated situations, such as different or unexpected values of
variables and symbols, changes in how the program being debugged is
built, etc.  @value{GDBN} provides a set of flow-control commands to
deal with these complexities.  Using these commands, you can write
complex scripts that loop over data structures, execute commands
conditionally, etc.

@table @code
@kindex if
@kindex else
@item if
@itemx else
This command allows to include in your script conditionally executed
commands. The @code{if} command takes a single argument, which is an
expression to evaluate.  It is followed by a series of commands that
are executed only if the expression is true (its value is nonzero).
There can then optionally be an @code{else} line, followed by a series
of commands that are only executed if the expression was false.  The
end of the list is marked by a line containing @code{end}.

@kindex while
@item while
This command allows to write loops.  Its syntax is similar to
@code{if}: the command takes a single argument, which is an expression
to evaluate, and must be followed by the commands to execute, one per
line, terminated by an @code{end}.  These commands are called the
@dfn{body} of the loop.  The commands in the body of @code{while} are
executed repeatedly as long as the expression evaluates to true.

@kindex loop_break
@item loop_break
This command exits the @code{while} loop in whose body it is included.
Execution of the script continues after that @code{while}s @code{end}
line.

@kindex loop_continue
@item loop_continue
This command skips the execution of the rest of the body of commands
in the @code{while} loop in whose body it is included.  Execution
branches to the beginning of the @code{while} loop, where it evaluates
the controlling expression.

@kindex end@r{ (if/else/while commands)}
@item end
Terminate the block of commands that are the body of @code{if},
@code{else}, or @code{while} flow-control commands.
@end table


@node Output
@subsection Commands for Controlled Output

During the execution of a command file or a user-defined command, normal
@value{GDBN} output is suppressed; the only output that appears is what is
explicitly printed by the commands in the definition.  This section
describes three commands useful for generating exactly the output you
want.

@table @code
@kindex echo
@item echo @var{text}
@c I do not consider backslash-space a standard C escape sequence
@c because it is not in ANSI.
Print @var{text}.  Nonprinting characters can be included in
@var{text} using C escape sequences, such as @samp{\n} to print a
newline.  @strong{No newline is printed unless you specify one.}
In addition to the standard C escape sequences, a backslash followed
by a space stands for a space.  This is useful for displaying a
string with spaces at the beginning or the end, since leading and
trailing spaces are otherwise trimmed from all arguments.
To print @samp{@w{ }and foo =@w{ }}, use the command
@samp{echo \@w{ }and foo = \@w{ }}.

A backslash at the end of @var{text} can be used, as in C, to continue
the command onto subsequent lines.  For example,

@smallexample
echo This is some text\n\
which is continued\n\
onto several lines.\n
@end smallexample

produces the same output as

@smallexample
echo This is some text\n
echo which is continued\n
echo onto several lines.\n
@end smallexample

@kindex output
@item output @var{expression}
Print the value of @var{expression} and nothing but that value: no
newlines, no @samp{$@var{nn} = }.  The value is not entered in the
value history either.  @xref{Expressions, ,Expressions}, for more information
on expressions.

@item output/@var{fmt} @var{expression}
Print the value of @var{expression} in format @var{fmt}.  You can use
the same formats as for @code{print}.  @xref{Output Formats,,Output
Formats}, for more information.

@kindex printf
@item printf @var{template}, @var{expressions}@dots{}
Print the values of one or more @var{expressions} under the control of
the string @var{template}.  To print several values, make
@var{expressions} be a comma-separated list of individual expressions,
which may be either numbers or pointers.  Their values are printed as
specified by @var{template}, exactly as a C program would do by
executing the code below:

@smallexample
printf (@var{template}, @var{expressions}@dots{});
@end smallexample

As in @code{C} @code{printf}, ordinary characters in @var{template}
are printed verbatim, while @dfn{conversion specification} introduced
by the @samp{%} character cause subsequent @var{expressions} to be
evaluated, their values converted and formatted according to type and
style information encoded in the conversion specifications, and then
printed.

For example, you can print two values in hex like this:

@smallexample
printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-foo
@end smallexample

@code{printf} supports all the standard @code{C} conversion
specifications, including the flags and modifiers between the @samp{%}
character and the conversion letter, with the following exceptions:

@itemize @bullet
@item
The argument-ordering modifiers, such as @samp{2$}, are not supported.

@item
The modifier @samp{*} is not supported for specifying precision or
width.

@item
The @samp{'} flag (for separation of digits into groups according to
@code{LC_NUMERIC'}) is not supported.

@item
The type modifiers @samp{hh}, @samp{j}, @samp{t}, and @samp{z} are not
supported.

@item
The conversion letter @samp{n} (as in @samp{%n}) is not supported.

@item
The conversion letters @samp{a} and @samp{A} are not supported.
@end itemize

@noindent
Note that the @samp{ll} type modifier is supported only if the
underlying @code{C} implementation used to build @value{GDBN} supports
the @code{long long int} type, and the @samp{L} type modifier is
supported only if @code{long double} type is available.

As in @code{C}, @code{printf} supports simple backslash-escape
sequences, such as @code{\n}, @samp{\t}, @samp{\\}, @samp{\"},
@samp{\a}, and @samp{\f}, that consist of backslash followed by a
single character.  Octal and hexadecimal escape sequences are not
supported.

Additionally, @code{printf} supports conversion specifications for DFP
(@dfn{Decimal Floating Point}) types using the following length modifiers
together with a floating point specifier.
letters:

@itemize @bullet
@item
@samp{H} for printing @code{Decimal32} types.

@item
@samp{D} for printing @code{Decimal64} types.

@item
@samp{DD} for printing @code{Decimal128} types.
@end itemize

If the underlying @code{C} implementation used to build @value{GDBN} has
support for the three length modifiers for DFP types, other modifiers
such as width and precision will also be available for @value{GDBN} to use.

In case there is no such @code{C} support, no additional modifiers will be
available and the value will be printed in the standard way.

Here's an example of printing DFP types using the above conversion letters:
@smallexample
printf "D32: %Hf - D64: %Df - D128: %DDf\n",1.2345df,1.2E10dd,1.2E1dl
@end smallexample

@kindex eval
@item eval @var{template}, @var{expressions}@dots{}
Convert the values of one or more @var{expressions} under the control of
the string @var{template} to a command line, and call it.

@end table

@node Auto-loading sequences
@subsection Controlling auto-loading native @value{GDBN} scripts
@cindex native script auto-loading

When a new object file is read (for example, due to the @code{file}
command, or because the inferior has loaded a shared library),
@value{GDBN} will look for the command file @file{@var{objfile}-gdb.gdb}.
@xref{Auto-loading extensions}.

Auto-loading can be enabled or disabled,
and the list of auto-loaded scripts can be printed.

@table @code
@anchor{set auto-load gdb-scripts}
@kindex set auto-load gdb-scripts
@item set auto-load gdb-scripts [on|off]
Enable or disable the auto-loading of canned sequences of commands scripts.

@anchor{show auto-load gdb-scripts}
@kindex show auto-load gdb-scripts
@item show auto-load gdb-scripts
Show whether auto-loading of canned sequences of commands scripts is enabled or
disabled.

@anchor{info auto-load gdb-scripts}
@kindex info auto-load gdb-scripts
@cindex print list of auto-loaded canned sequences of commands scripts
@item info auto-load gdb-scripts [@var{regexp}]
Print the list of all canned sequences of commands scripts that @value{GDBN}
auto-loaded.
@end table

If @var{regexp} is supplied only canned sequences of commands scripts with
matching names are printed.

@c Python docs live in a separate file.
@include python.texi

@c Guile docs live in a separate file.
@include guile.texi

@node Auto-loading extensions
@section Auto-loading extensions
@cindex auto-loading extensions

@value{GDBN} provides two mechanisms for automatically loading extensions
when a new object file is read (for example, due to the @code{file}
command, or because the inferior has loaded a shared library):
@file{@var{objfile}-gdb.@var{ext}} and the @code{.debug_gdb_scripts}
section of modern file formats like ELF.

@menu
* objfile-gdb.ext file: objfile-gdbdotext file.  The @file{@var{objfile}-gdb.@var{ext}} file
* .debug_gdb_scripts section: dotdebug_gdb_scripts section.  The @code{.debug_gdb_scripts} section
* Which flavor to choose?::
@end menu

The auto-loading feature is useful for supplying application-specific
debugging commands and features.

Auto-loading can be enabled or disabled,
and the list of auto-loaded scripts can be printed.
See the @samp{auto-loading} section of each extension language
for more information.
For @value{GDBN} command files see @ref{Auto-loading sequences}.
For Python files see @ref{Python Auto-loading}.

Note that loading of this script file also requires accordingly configured
@code{auto-load safe-path} (@pxref{Auto-loading safe path}).

@node objfile-gdbdotext file
@subsection The @file{@var{objfile}-gdb.@var{ext}} file
@cindex @file{@var{objfile}-gdb.gdb}
@cindex @file{@var{objfile}-gdb.py}
@cindex @file{@var{objfile}-gdb.scm}

When a new object file is read, @value{GDBN} looks for a file named
@file{@var{objfile}-gdb.@var{ext}} (we call it @var{script-name} below),
where @var{objfile} is the object file's name and
where @var{ext} is the file extension for the extension language:

@table @code
@item @file{@var{objfile}-gdb.gdb}
GDB's own command language
@item @file{@var{objfile}-gdb.py}
Python
@item @file{@var{objfile}-gdb.scm}
Guile
@end table

@var{script-name} is formed by ensuring that the file name of @var{objfile}
is absolute, following all symlinks, and resolving @code{.} and @code{..}
components, and appending the @file{-gdb.@var{ext}} suffix.
If this file exists and is readable, @value{GDBN} will evaluate it as a
script in the specified extension language.

If this file does not exist, then @value{GDBN} will look for
@var{script-name} file in all of the directories as specified below.

Note that loading of these files requires an accordingly configured
@code{auto-load safe-path} (@pxref{Auto-loading safe path}).

For object files using @file{.exe} suffix @value{GDBN} tries to load first the
scripts normally according to its @file{.exe} filename.  But if no scripts are
found @value{GDBN} also tries script filenames matching the object file without
its @file{.exe} suffix.  This @file{.exe} stripping is case insensitive and it
is attempted on any platform.  This makes the script filenames compatible
between Unix and MS-Windows hosts.

@table @code
@anchor{set auto-load scripts-directory}
@kindex set auto-load scripts-directory
@item set auto-load scripts-directory @r{[}@var{directories}@r{]}
Control @value{GDBN} auto-loaded scripts location.  Multiple directory entries
may be delimited by the host platform path separator in use
(@samp{:} on Unix, @samp{;} on MS-Windows and MS-DOS).

Each entry here needs to be covered also by the security setting
@code{set auto-load safe-path} (@pxref{set auto-load safe-path}).

@anchor{with-auto-load-dir}
This variable defaults to @file{$debugdir:$datadir/auto-load}.  The default
@code{set auto-load safe-path} value can be also overriden by @value{GDBN}
configuration option @option{--with-auto-load-dir}.

Any reference to @file{$debugdir} will get replaced by
@var{debug-file-directory} value (@pxref{Separate Debug Files}) and any
reference to @file{$datadir} will get replaced by @var{data-directory} which is
determined at @value{GDBN} startup (@pxref{Data Files}).  @file{$debugdir} and
@file{$datadir} must be placed as a directory component --- either alone or
delimited by @file{/} or @file{\} directory separators, depending on the host
platform.

The list of directories uses path separator (@samp{:} on GNU and Unix
systems, @samp{;} on MS-Windows and MS-DOS) to separate directories, similarly
to the @env{PATH} environment variable.

@anchor{show auto-load scripts-directory}
@kindex show auto-load scripts-directory
@item show auto-load scripts-directory
Show @value{GDBN} auto-loaded scripts location.

@anchor{add-auto-load-scripts-directory}
@kindex add-auto-load-scripts-directory
@item add-auto-load-scripts-directory @r{[}@var{directories}@dots{}@r{]}
Add an entry (or list of entries) to the list of auto-loaded scripts locations.
Multiple entries may be delimited by the host platform path separator in use.
@end table

@value{GDBN} does not track which files it has already auto-loaded this way.
@value{GDBN} will load the associated script every time the corresponding
@var{objfile} is opened.
So your @file{-gdb.@var{ext}} file should be careful to avoid errors if it
is evaluated more than once.

@node dotdebug_gdb_scripts section
@subsection The @code{.debug_gdb_scripts} section
@cindex @code{.debug_gdb_scripts} section

For systems using file formats like ELF and COFF,
when @value{GDBN} loads a new object file
it will look for a special section named @code{.debug_gdb_scripts}.
If this section exists, its contents is a list of null-terminated entries
specifying scripts to load.  Each entry begins with a non-null prefix byte that
specifies the kind of entry, typically the extension language and whether the
script is in a file or inlined in @code{.debug_gdb_scripts}.

The following entries are supported:

@table @code
@item SECTION_SCRIPT_ID_PYTHON_FILE = 1
@item SECTION_SCRIPT_ID_SCHEME_FILE = 3
@item SECTION_SCRIPT_ID_PYTHON_TEXT = 4
@item SECTION_SCRIPT_ID_SCHEME_TEXT = 6
@end table

@subsubsection Script File Entries

If the entry specifies a file, @value{GDBN} will look for the file first
in the current directory and then along the source search path
(@pxref{Source Path, ,Specifying Source Directories}),
except that @file{$cdir} is not searched, since the compilation
directory is not relevant to scripts.

File entries can be placed in section @code{.debug_gdb_scripts} with,
for example, this GCC macro for Python scripts.

@example
/* Note: The "MS" section flags are to remove duplicates.  */
#define DEFINE_GDB_PY_SCRIPT(script_name) \
  asm("\
.pushsection \".debug_gdb_scripts\", \"MS\",@@progbits,1\n\
.byte 1 /* Python */\n\
.asciz \"" script_name "\"\n\
.popsection \n\
");
@end example

@noindent
For Guile scripts, replace @code{.byte 1} with @code{.byte 3}.
Then one can reference the macro in a header or source file like this:

@example
DEFINE_GDB_PY_SCRIPT ("my-app-scripts.py")
@end example

The script name may include directories if desired.

Note that loading of this script file also requires accordingly configured
@code{auto-load safe-path} (@pxref{Auto-loading safe path}).

If the macro invocation is put in a header, any application or library
using this header will get a reference to the specified script,
and with the use of @code{"MS"} attributes on the section, the linker
will remove duplicates.

@subsubsection Script Text Entries

Script text entries allow to put the executable script in the entry
itself instead of loading it from a file.
The first line of the entry, everything after the prefix byte and up to
the first newline (@code{0xa}) character, is the script name, and must not
contain any kind of space character, e.g., spaces or tabs.
The rest of the entry, up to the trailing null byte, is the script to
execute in the specified language.  The name needs to be unique among
all script names, as @value{GDBN} executes each script only once based
on its name.

Here is an example from file @file{py-section-script.c} in the @value{GDBN}
testsuite.

@example
#include "symcat.h"
#include "gdb/section-scripts.h"
asm(
".pushsection \".debug_gdb_scripts\", \"MS\",@@progbits,1\n"
".byte " XSTRING (SECTION_SCRIPT_ID_PYTHON_TEXT) "\n"
".ascii \"gdb.inlined-script\\n\"\n"
".ascii \"class test_cmd (gdb.Command):\\n\"\n"
".ascii \"  def __init__ (self):\\n\"\n"
".ascii \"    super (test_cmd, self).__init__ ("
    "\\\"test-cmd\\\", gdb.COMMAND_OBSCURE)\\n\"\n"
".ascii \"  def invoke (self, arg, from_tty):\\n\"\n"
".ascii \"    print (\\\"test-cmd output, arg = %s\\\" % arg)\\n\"\n"
".ascii \"test_cmd ()\\n\"\n"
".byte 0\n"
".popsection\n"
);
@end example

Loading of inlined scripts requires a properly configured
@code{auto-load safe-path} (@pxref{Auto-loading safe path}).
The path to specify in @code{auto-load safe-path} is the path of the file
containing the @code{.debug_gdb_scripts} section.

@node Which flavor to choose?
@subsection Which flavor to choose?

Given the multiple ways of auto-loading extensions, it might not always
be clear which one to choose.  This section provides some guidance.

@noindent
Benefits of the @file{-gdb.@var{ext}} way:

@itemize @bullet
@item
Can be used with file formats that don't support multiple sections.

@item
Ease of finding scripts for public libraries.

Scripts specified in the @code{.debug_gdb_scripts} section are searched for
in the source search path.
For publicly installed libraries, e.g., @file{libstdc++}, there typically
isn't a source directory in which to find the script.

@item
Doesn't require source code additions.
@end itemize

@noindent
Benefits of the @code{.debug_gdb_scripts} way:

@itemize @bullet
@item
Works with static linking.

Scripts for libraries done the @file{-gdb.@var{ext}} way require an objfile to
trigger their loading.  When an application is statically linked the only
objfile available is the executable, and it is cumbersome to attach all the
scripts from all the input libraries to the executable's
@file{-gdb.@var{ext}} script.

@item
Works with classes that are entirely inlined.

Some classes can be entirely inlined, and thus there may not be an associated
shared library to attach a @file{-gdb.@var{ext}} script to.

@item
Scripts needn't be copied out of the source tree.

In some circumstances, apps can be built out of large collections of internal
libraries, and the build infrastructure necessary to install the
@file{-gdb.@var{ext}} scripts in a place where @value{GDBN} can find them is
cumbersome.  It may be easier to specify the scripts in the
@code{.debug_gdb_scripts} section as relative paths, and add a path to the
top of the source tree to the source search path.
@end itemize

@node Multiple Extension Languages
@section Multiple Extension Languages

The Guile and Python extension languages do not share any state,
and generally do not interfere with each other.
There are some things to be aware of, however.

@subsection Python comes first

Python was @value{GDBN}'s first extension language, and to avoid breaking
existing behaviour Python comes first.  This is generally solved by the
``first one wins'' principle.  @value{GDBN} maintains a list of enabled
extension languages, and when it makes a call to an extension language,
(say to pretty-print a value), it tries each in turn until an extension
language indicates it has performed the request (e.g., has returned the
pretty-printed form of a value).
This extends to errors while performing such requests: If an error happens
while, for example, trying to pretty-print an object then the error is
reported and any following extension languages are not tried.

@node Aliases
@section Creating new spellings of existing commands
@cindex aliases for commands

It is often useful to define alternate spellings of existing commands.
For example, if a new @value{GDBN} command defined in Python has
a long name to type, it is handy to have an abbreviated version of it
that involves less typing.

@value{GDBN} itself uses aliases.  For example @samp{s} is an alias
of the @samp{step} command even though it is otherwise an ambiguous
abbreviation of other commands like @samp{set} and @samp{show}.

Aliases are also used to provide shortened or more common versions
of multi-word commands.  For example, @value{GDBN} provides the
@samp{tty} alias of the @samp{set inferior-tty} command.

You can define a new alias with the @samp{alias} command.

@table @code

@kindex alias
@item alias [-a] [--] @var{ALIAS} = @var{COMMAND}

@end table

@var{ALIAS} specifies the name of the new alias.
Each word of @var{ALIAS} must consist of letters, numbers, dashes and
underscores.

@var{COMMAND} specifies the name of an existing command
that is being aliased.

The @samp{-a} option specifies that the new alias is an abbreviation
of the command.  Abbreviations are not shown in command
lists displayed by the @samp{help} command.

The @samp{--} option specifies the end of options,
and is useful when @var{ALIAS} begins with a dash.

Here is a simple example showing how to make an abbreviation
of a command so that there is less to type.
Suppose you were tired of typing @samp{disas}, the current
shortest unambiguous abbreviation of the @samp{disassemble} command
and you wanted an even shorter version named @samp{di}.
The following will accomplish this.

@smallexample
(gdb) alias -a di = disas
@end smallexample

Note that aliases are different from user-defined commands.
With a user-defined command, you also need to write documentation
for it with the @samp{document} command.
An alias automatically picks up the documentation of the existing command.

Here is an example where we make @samp{elms} an abbreviation of
@samp{elements} in the @samp{set print elements} command.
This is to show that you can make an abbreviation of any part
of a command.

@smallexample
(gdb) alias -a set print elms = set print elements
(gdb) alias -a show print elms = show print elements
(gdb) set p elms 20
(gdb) show p elms
Limit on string chars or array elements to print is 200.
@end smallexample

Note that if you are defining an alias of a @samp{set} command,
and you want to have an alias for the corresponding @samp{show}
command, then you need to define the latter separately.

Unambiguously abbreviated commands are allowed in @var{COMMAND} and
@var{ALIAS}, just as they are normally.

@smallexample
(gdb) alias -a set pr elms = set p ele
@end smallexample

Finally, here is an example showing the creation of a one word
alias for a more complex command.
This creates alias @samp{spe} of the command @samp{set print elements}.

@smallexample
(gdb) alias spe = set print elements
(gdb) spe 20
@end smallexample

@node Interpreters
@chapter Command Interpreters
@cindex command interpreters

@value{GDBN} supports multiple command interpreters, and some command
infrastructure to allow users or user interface writers to switch
between interpreters or run commands in other interpreters.

@value{GDBN} currently supports two command interpreters, the console
interpreter (sometimes called the command-line interpreter or @sc{cli})
and the machine interface interpreter (or @sc{gdb/mi}).  This manual
describes both of these interfaces in great detail.

By default, @value{GDBN} will start with the console interpreter.
However, the user may choose to start @value{GDBN} with another
interpreter by specifying the @option{-i} or @option{--interpreter}
startup options.  Defined interpreters include:

@table @code
@item console
@cindex console interpreter
The traditional console or command-line interpreter.  This is the most often
used interpreter with @value{GDBN}. With no interpreter specified at runtime,
@value{GDBN} will use this interpreter.

@item mi
@cindex mi interpreter
The newest @sc{gdb/mi} interface (currently @code{mi2}).  Used primarily
by programs wishing to use @value{GDBN} as a backend for a debugger GUI
or an IDE.  For more information, see @ref{GDB/MI, ,The @sc{gdb/mi}
Interface}.

@item mi2
@cindex mi2 interpreter
The current @sc{gdb/mi} interface.

@item mi1
@cindex mi1 interpreter
The @sc{gdb/mi} interface included in @value{GDBN} 5.1, 5.2, and 5.3.

@end table

@cindex invoke another interpreter
The interpreter being used by @value{GDBN} may not be dynamically
switched at runtime.  Although possible, this could lead to a very
precarious situation.  Consider an IDE using @sc{gdb/mi}.  If a user
enters the command "interpreter-set console" in a console view,
@value{GDBN} would switch to using the console interpreter, rendering
the IDE inoperable!

@kindex interpreter-exec
Although you may only choose a single interpreter at startup, you may execute
commands in any interpreter from the current interpreter using the appropriate
command.  If you are running the console interpreter, simply use the
@code{interpreter-exec} command:

@smallexample
interpreter-exec mi "-data-list-register-names"
@end smallexample

@sc{gdb/mi} has a similar command, although it is only available in versions of
@value{GDBN} which support @sc{gdb/mi} version 2 (or greater).

@node TUI
@chapter @value{GDBN} Text User Interface
@cindex TUI
@cindex Text User Interface

@menu
* TUI Overview::                TUI overview
* TUI Keys::                    TUI key bindings
* TUI Single Key Mode::         TUI single key mode
* TUI Commands::                TUI-specific commands
* TUI Configuration::           TUI configuration variables
@end menu

The @value{GDBN} Text User Interface (TUI) is a terminal
interface which uses the @code{curses} library to show the source
file, the assembly output, the program registers and @value{GDBN}
commands in separate text windows.  The TUI mode is supported only
on platforms where a suitable version of the @code{curses} library
is available.

The TUI mode is enabled by default when you invoke @value{GDBN} as
@samp{@value{GDBP} -tui}.
You can also switch in and out of TUI mode while @value{GDBN} runs by
using various TUI commands and key bindings, such as @kbd{C-x C-a}. 
@xref{TUI Keys, ,TUI Key Bindings}.

@node TUI Overview
@section TUI Overview

In TUI mode, @value{GDBN} can display several text windows:

@table @emph
@item command
This window is the @value{GDBN} command window with the @value{GDBN}
prompt and the @value{GDBN} output.  The @value{GDBN} input is still
managed using readline.

@item source
The source window shows the source file of the program.  The current
line and active breakpoints are displayed in this window.

@item assembly
The assembly window shows the disassembly output of the program.

@item register
This window shows the processor registers.  Registers are highlighted
when their values change.
@end table

The source and assembly windows show the current program position
by highlighting the current line and marking it with a @samp{>} marker.
Breakpoints are indicated with two markers.  The first marker
indicates the breakpoint type:

@table @code
@item B
Breakpoint which was hit at least once.

@item b
Breakpoint which was never hit.

@item H
Hardware breakpoint which was hit at least once.

@item h
Hardware breakpoint which was never hit.
@end table

The second marker indicates whether the breakpoint is enabled or not:

@table @code
@item +
Breakpoint is enabled.

@item -
Breakpoint is disabled.
@end table

The source, assembly and register windows are updated when the current
thread changes, when the frame changes, or when the program counter
changes.

These windows are not all visible at the same time.  The command
window is always visible.  The others can be arranged in several
layouts:

@itemize @bullet
@item
source only,

@item
assembly only,

@item
source and assembly,

@item
source and registers, or

@item
assembly and registers.
@end itemize

A status line above the command window shows the following information:

@table @emph
@item target
Indicates the current @value{GDBN} target.
(@pxref{Targets, ,Specifying a Debugging Target}).

@item process
Gives the current process or thread number.
When no process is being debugged, this field is set to @code{No process}.

@item function
Gives the current function name for the selected frame.
The name is demangled if demangling is turned on (@pxref{Print Settings}).
When there is no symbol corresponding to the current program counter,
the string @code{??} is displayed.

@item line
Indicates the current line number for the selected frame.
When the current line number is not known, the string @code{??} is displayed.

@item pc
Indicates the current program counter address.
@end table

@node TUI Keys
@section TUI Key Bindings
@cindex TUI key bindings

The TUI installs several key bindings in the readline keymaps
@ifset SYSTEM_READLINE
(@pxref{Command Line Editing, , , rluserman, GNU Readline Library}).
@end ifset
@ifclear SYSTEM_READLINE
(@pxref{Command Line Editing}).
@end ifclear
The following key bindings are installed for both TUI mode and the
@value{GDBN} standard mode.

@table @kbd
@kindex C-x C-a
@item C-x C-a
@kindex C-x a
@itemx C-x a
@kindex C-x A
@itemx C-x A
Enter or leave the TUI mode.  When leaving the TUI mode,
the curses window management stops and @value{GDBN} operates using
its standard mode, writing on the terminal directly.  When reentering
the TUI mode, control is given back to the curses windows.
The screen is then refreshed.

@kindex C-x 1
@item C-x 1
Use a TUI layout with only one window.  The layout will
either be @samp{source} or @samp{assembly}.  When the TUI mode
is not active, it will switch to the TUI mode.

Think of this key binding as the Emacs @kbd{C-x 1} binding.

@kindex C-x 2
@item C-x 2
Use a TUI layout with at least two windows.  When the current
layout already has two windows, the next layout with two windows is used.
When a new layout is chosen, one window will always be common to the
previous layout and the new one.

Think of it as the Emacs @kbd{C-x 2} binding.

@kindex C-x o
@item C-x o
Change the active window.  The TUI associates several key bindings
(like scrolling and arrow keys) with the active window.  This command
gives the focus to the next TUI window.

Think of it as the Emacs @kbd{C-x o} binding.

@kindex C-x s
@item C-x s
Switch in and out of the TUI SingleKey mode that binds single
keys to @value{GDBN} commands (@pxref{TUI Single Key Mode}).
@end table

The following key bindings only work in the TUI mode:

@table @asis
@kindex PgUp
@item @key{PgUp}
Scroll the active window one page up.

@kindex PgDn
@item @key{PgDn}
Scroll the active window one page down.

@kindex Up
@item @key{Up}
Scroll the active window one line up.

@kindex Down
@item @key{Down}
Scroll the active window one line down.

@kindex Left
@item @key{Left}
Scroll the active window one column left.

@kindex Right
@item @key{Right}
Scroll the active window one column right.

@kindex C-L
@item @kbd{C-L}
Refresh the screen.
@end table

Because the arrow keys scroll the active window in the TUI mode, they
are not available for their normal use by readline unless the command
window has the focus.  When another window is active, you must use
other readline key bindings such as @kbd{C-p}, @kbd{C-n}, @kbd{C-b}
and @kbd{C-f} to control the command window.

@node TUI Single Key Mode
@section TUI Single Key Mode
@cindex TUI single key mode

The TUI also provides a @dfn{SingleKey} mode, which binds several
frequently used @value{GDBN} commands to single keys.  Type @kbd{C-x s} to
switch into this mode, where the following key bindings are used:

@table @kbd
@kindex c @r{(SingleKey TUI key)}
@item c
continue

@kindex d @r{(SingleKey TUI key)}
@item d
down

@kindex f @r{(SingleKey TUI key)}
@item f
finish

@kindex n @r{(SingleKey TUI key)}
@item n
next

@kindex q @r{(SingleKey TUI key)}
@item q
exit the SingleKey mode.

@kindex r @r{(SingleKey TUI key)}
@item r
run

@kindex s @r{(SingleKey TUI key)}
@item s
step

@kindex u @r{(SingleKey TUI key)}
@item u
up

@kindex v @r{(SingleKey TUI key)}
@item v
info locals

@kindex w @r{(SingleKey TUI key)}
@item w
where
@end table

Other keys temporarily switch to the @value{GDBN} command prompt.
The key that was pressed is inserted in the editing buffer so that
it is possible to type most @value{GDBN} commands without interaction
with the TUI SingleKey mode.  Once the command is entered the TUI
SingleKey mode is restored.  The only way to permanently leave
this mode is by typing @kbd{q} or @kbd{C-x s}.


@node TUI Commands
@section TUI-specific Commands
@cindex TUI commands

The TUI has specific commands to control the text windows.
These commands are always available, even when @value{GDBN} is not in
the TUI mode.  When @value{GDBN} is in the standard mode, most
of these commands will automatically switch to the TUI mode.

Note that if @value{GDBN}'s @code{stdout} is not connected to a
terminal, or @value{GDBN} has been started with the machine interface
interpreter (@pxref{GDB/MI, ,The @sc{gdb/mi} Interface}), most of
these commands will fail with an error, because it would not be
possible or desirable to enable curses window management.

@table @code
@item info win
@kindex info win
List and give the size of all displayed windows.

@item layout next
@kindex layout
Display the next layout.

@item layout prev
Display the previous layout.

@item layout src
Display the source window only.

@item layout asm
Display the assembly window only.

@item layout split
Display the source and assembly window.

@item layout regs
Display the register window together with the source or assembly window.

@item focus next
@kindex focus
Make the next window active for scrolling.

@item focus prev
Make the previous window active for scrolling.

@item focus src
Make the source window active for scrolling.

@item focus asm
Make the assembly window active for scrolling.

@item focus regs
Make the register window active for scrolling.

@item focus cmd
Make the command window active for scrolling.

@item refresh
@kindex refresh
Refresh the screen.  This is similar to typing @kbd{C-L}.

@item tui reg float
@kindex tui reg
Show the floating point registers in the register window.

@item tui reg general
Show the general registers in the register window.

@item tui reg next
Show the next register group.  The list of register groups as well as
their order is target specific.  The predefined register groups are the
following: @code{general}, @code{float}, @code{system}, @code{vector},
@code{all}, @code{save}, @code{restore}.

@item tui reg system
Show the system registers in the register window.

@item update
@kindex update
Update the source window and the current execution point.

@item winheight @var{name} +@var{count}
@itemx winheight @var{name} -@var{count}
@kindex winheight
Change the height of the window @var{name} by @var{count}
lines.  Positive counts increase the height, while negative counts
decrease it.  The @var{name} parameter can be one of @code{src} (the
source window), @code{cmd} (the command window), @code{asm} (the
disassembly window), or @code{regs} (the register display window).

@item tabset @var{nchars}
@kindex tabset
Set the width of tab stops to be @var{nchars} characters.  This
setting affects the display of TAB characters in the source and
assembly windows.
@end table

@node TUI Configuration
@section TUI Configuration Variables
@cindex TUI configuration variables

Several configuration variables control the appearance of TUI windows.

@table @code
@item set tui border-kind @var{kind}
@kindex set tui border-kind
Select the border appearance for the source, assembly and register windows.
The possible values are the following:
@table @code
@item space
Use a space character to draw the border.

@item ascii
Use @sc{ascii} characters @samp{+}, @samp{-} and @samp{|} to draw the border.

@item acs
Use the Alternate Character Set to draw the border.  The border is
drawn using character line graphics if the terminal supports them.
@end table

@item set tui border-mode @var{mode}
@kindex set tui border-mode
@itemx set tui active-border-mode @var{mode}
@kindex set tui active-border-mode
Select the display attributes for the borders of the inactive windows
or the active window.  The @var{mode} can be one of the following:
@table @code
@item normal
Use normal attributes to display the border.

@item standout
Use standout mode.

@item reverse
Use reverse video mode.

@item half
Use half bright mode.

@item half-standout
Use half bright and standout mode.

@item bold
Use extra bright or bold mode.

@item bold-standout
Use extra bright or bold and standout mode.
@end table
@end table

@node Emacs
@chapter Using @value{GDBN} under @sc{gnu} Emacs

@cindex Emacs
@cindex @sc{gnu} Emacs
A special interface allows you to use @sc{gnu} Emacs to view (and
edit) the source files for the program you are debugging with
@value{GDBN}.

To use this interface, use the command @kbd{M-x gdb} in Emacs.  Give the
executable file you want to debug as an argument.  This command starts
@value{GDBN} as a subprocess of Emacs, with input and output through a newly
created Emacs buffer.
@c (Do not use the @code{-tui} option to run @value{GDBN} from Emacs.)

Running @value{GDBN} under Emacs can be just like running @value{GDBN} normally except for two
things:

@itemize @bullet
@item
All ``terminal'' input and output goes through an Emacs buffer, called
the GUD buffer.

This applies both to @value{GDBN} commands and their output, and to the input
and output done by the program you are debugging.

This is useful because it means that you can copy the text of previous
commands and input them again; you can even use parts of the output
in this way.

All the facilities of Emacs' Shell mode are available for interacting
with your program.  In particular, you can send signals the usual
way---for example, @kbd{C-c C-c} for an interrupt, @kbd{C-c C-z} for a
stop.

@item
@value{GDBN} displays source code through Emacs.

Each time @value{GDBN} displays a stack frame, Emacs automatically finds the
source file for that frame and puts an arrow (@samp{=>}) at the
left margin of the current line.  Emacs uses a separate buffer for
source display, and splits the screen to show both your @value{GDBN} session
and the source.

Explicit @value{GDBN} @code{list} or search commands still produce output as
usual, but you probably have no reason to use them from Emacs.
@end itemize

We call this @dfn{text command mode}.  Emacs 22.1, and later, also uses
a graphical mode, enabled by default, which provides further buffers
that can control the execution and describe the state of your program.
@xref{GDB Graphical Interface,,, Emacs, The @sc{gnu} Emacs Manual}.

If you specify an absolute file name when prompted for the @kbd{M-x
gdb} argument, then Emacs sets your current working directory to where
your program resides.  If you only specify the file name, then Emacs
sets your current working directory to the directory associated
with the previous buffer.  In this case, @value{GDBN} may find your
program by searching your environment's @code{PATH} variable, but on
some operating systems it might not find the source.  So, although the
@value{GDBN} input and output session proceeds normally, the auxiliary
buffer does not display the current source and line of execution.

The initial working directory of @value{GDBN} is printed on the top
line of the GUD buffer and this serves as a default for the commands
that specify files for @value{GDBN} to operate on.  @xref{Files,
,Commands to Specify Files}.

By default, @kbd{M-x gdb} calls the program called @file{gdb}.  If you
need to call @value{GDBN} by a different name (for example, if you
keep several configurations around, with different names) you can
customize the Emacs variable @code{gud-gdb-command-name} to run the
one you want.

In the GUD buffer, you can use these special Emacs commands in
addition to the standard Shell mode commands:

@table @kbd
@item C-h m
Describe the features of Emacs' GUD Mode.

@item C-c C-s
Execute to another source line, like the @value{GDBN} @code{step} command; also
update the display window to show the current file and location.

@item C-c C-n
Execute to next source line in this function, skipping all function
calls, like the @value{GDBN} @code{next} command.  Then update the display window
to show the current file and location.

@item C-c C-i
Execute one instruction, like the @value{GDBN} @code{stepi} command; update
display window accordingly.

@item C-c C-f
Execute until exit from the selected stack frame, like the @value{GDBN}
@code{finish} command.

@item C-c C-r
Continue execution of your program, like the @value{GDBN} @code{continue}
command.

@item C-c <
Go up the number of frames indicated by the numeric argument
(@pxref{Arguments, , Numeric Arguments, Emacs, The @sc{gnu} Emacs Manual}),
like the @value{GDBN} @code{up} command.

@item C-c >
Go down the number of frames indicated by the numeric argument, like the
@value{GDBN} @code{down} command.
@end table

In any source file, the Emacs command @kbd{C-x @key{SPC}} (@code{gud-break})
tells @value{GDBN} to set a breakpoint on the source line point is on.

In text command mode, if you type @kbd{M-x speedbar}, Emacs displays a
separate frame which shows a backtrace when the GUD buffer is current.
Move point to any frame in the stack and type @key{RET} to make it
become the current frame and display the associated source in the
source buffer.  Alternatively, click @kbd{Mouse-2} to make the
selected frame become the current one.  In graphical mode, the
speedbar displays watch expressions.

If you accidentally delete the source-display buffer, an easy way to get
it back is to type the command @code{f} in the @value{GDBN} buffer, to
request a frame display; when you run under Emacs, this recreates
the source buffer if necessary to show you the context of the current
frame.

The source files displayed in Emacs are in ordinary Emacs buffers
which are visiting the source files in the usual way.  You can edit
the files with these buffers if you wish; but keep in mind that @value{GDBN}
communicates with Emacs in terms of line numbers.  If you add or
delete lines from the text, the line numbers that @value{GDBN} knows cease
to correspond properly with the code.

A more detailed description of Emacs' interaction with @value{GDBN} is
given in the Emacs manual (@pxref{Debuggers,,, Emacs, The @sc{gnu}
Emacs Manual}).

@node GDB/MI
@chapter The @sc{gdb/mi} Interface

@unnumberedsec Function and Purpose

@cindex @sc{gdb/mi}, its purpose
@sc{gdb/mi} is a line based machine oriented text interface to
@value{GDBN} and is activated by specifying using the
@option{--interpreter} command line option (@pxref{Mode Options}).  It
is specifically intended to support the development of systems which
use the debugger as just one small component of a larger system.

This chapter is a specification of the @sc{gdb/mi} interface.  It is written
in the form of a reference manual.

Note that @sc{gdb/mi} is still under construction, so some of the
features described below are incomplete and subject to change
(@pxref{GDB/MI Development and Front Ends, , @sc{gdb/mi} Development and Front Ends}).  

@unnumberedsec Notation and Terminology

@cindex notational conventions, for @sc{gdb/mi}
This chapter uses the following notation:

@itemize @bullet
@item
@code{|} separates two alternatives.

@item
@code{[ @var{something} ]} indicates that @var{something} is optional:
it may or may not be given.

@item
@code{( @var{group} )*} means that @var{group} inside the parentheses
may repeat zero or more times.

@item
@code{( @var{group} )+} means that @var{group} inside the parentheses
may repeat one or more times.

@item
@code{"@var{string}"} means a literal @var{string}.
@end itemize

@ignore
@heading Dependencies
@end ignore

@menu
* GDB/MI General Design::
* GDB/MI Command Syntax::
* GDB/MI Compatibility with CLI::
* GDB/MI Development and Front Ends::
* GDB/MI Output Records::
* GDB/MI Simple Examples::
* GDB/MI Command Description Format::
* GDB/MI Breakpoint Commands::
* GDB/MI Catchpoint Commands::
* GDB/MI Program Context::
* GDB/MI Thread Commands::
* GDB/MI Ada Tasking Commands::
* GDB/MI Program Execution::
* GDB/MI Stack Manipulation::
* GDB/MI Variable Objects::
* GDB/MI Data Manipulation::
* GDB/MI Tracepoint Commands::
* GDB/MI Symbol Query::
* GDB/MI File Commands::
@ignore
* GDB/MI Kod Commands::
* GDB/MI Memory Overlay Commands::
* GDB/MI Signal Handling Commands::
@end ignore
* GDB/MI Target Manipulation::
* GDB/MI File Transfer Commands::
* GDB/MI Ada Exceptions Commands::
* GDB/MI Support Commands::
* GDB/MI Miscellaneous Commands::
@end menu

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI General Design
@section @sc{gdb/mi} General Design
@cindex GDB/MI General Design

Interaction of a @sc{GDB/MI} frontend with @value{GDBN} involves three
parts---commands sent to @value{GDBN}, responses to those commands
and notifications.  Each command results in exactly one response,
indicating either successful completion of the command, or an error.
For the commands that do not resume the target, the response contains the
requested information.  For the commands that resume the target, the
response only indicates whether the target was successfully resumed.
Notifications is the mechanism for reporting changes in the state of the
target, or in @value{GDBN} state, that cannot conveniently be associated with
a command and reported as part of that command response.

The important examples of notifications are:
@itemize @bullet

@item 
Exec notifications.  These are used to report changes in
target state---when a target is resumed, or stopped.  It would not
be feasible to include this information in response of resuming
commands, because one resume commands can result in multiple events in
different threads.  Also, quite some time may pass before any event
happens in the target, while a frontend needs to know whether the resuming
command itself was successfully executed.

@item 
Console output, and status notifications.  Console output
notifications are used to report output of CLI commands, as well as
diagnostics for other commands.  Status notifications are used to
report the progress of a long-running operation.  Naturally, including
this information in command response would mean no output is produced
until the command is finished, which is undesirable.

@item
General notifications.  Commands may have various side effects on
the @value{GDBN} or target state beyond their official purpose.  For example,
a command may change the selected thread.  Although such changes can
be included in command response, using notification allows for more
orthogonal frontend design.

@end itemize

There's no guarantee that whenever an MI command reports an error,
@value{GDBN} or the target are in any specific state, and especially,
the state is not reverted to the state before the MI command was
processed.  Therefore, whenever an MI command results in an error, 
we recommend that the frontend refreshes all the information shown in 
the user interface.


@menu
* Context management::
* Asynchronous and non-stop modes::
* Thread groups::
@end menu

@node Context management
@subsection Context management

@subsubsection Threads and Frames

In most cases when @value{GDBN} accesses the target, this access is
done in context of a specific thread and frame (@pxref{Frames}).
Often, even when accessing global data, the target requires that a thread
be specified.  The CLI interface maintains the selected thread and frame,
and supplies them to target on each command.  This is convenient,
because a command line user would not want to specify that information
explicitly on each command, and because user interacts with
@value{GDBN} via a single terminal, so no confusion is possible as 
to what thread and frame are the current ones.

In the case of MI, the concept of selected thread and frame is less
useful.  First, a frontend can easily remember this information
itself.  Second, a graphical frontend can have more than one window,
each one used for debugging a different thread, and the frontend might
want to access additional threads for internal purposes.  This
increases the risk that by relying on implicitly selected thread, the
frontend may be operating on a wrong one.  Therefore, each MI command
should explicitly specify which thread and frame to operate on.  To
make it possible, each MI command accepts the @samp{--thread} and
@samp{--frame} options, the value to each is @value{GDBN} identifier
for thread and frame to operate on.

Usually, each top-level window in a frontend allows the user to select
a thread and a frame, and remembers the user selection for further
operations.  However, in some cases @value{GDBN} may suggest that the
current thread be changed.  For example, when stopping on a breakpoint
it is reasonable to switch to the thread where breakpoint is hit.  For
another example, if the user issues the CLI @samp{thread} command via
the frontend, it is desirable to change the frontend's selected thread to the
one specified by user.  @value{GDBN} communicates the suggestion to
change current thread using the @samp{=thread-selected} notification.
No such notification is available for the selected frame at the moment.

Note that historically, MI shares the selected thread with CLI, so 
frontends used the @code{-thread-select} to execute commands in the
right context.  However, getting this to work right is cumbersome.  The
simplest way is for frontend to emit @code{-thread-select} command
before every command.  This doubles the number of commands that need
to be sent.  The alternative approach is to suppress @code{-thread-select}
if the selected thread in @value{GDBN} is supposed to be identical to the
thread the frontend wants to operate on.  However, getting this
optimization right can be tricky.  In particular, if the frontend
sends several commands to @value{GDBN}, and one of the commands changes the
selected thread, then the behaviour of subsequent commands will
change.  So, a frontend should either wait for response from such
problematic commands, or explicitly add @code{-thread-select} for
all subsequent commands.  No frontend is known to do this exactly
right, so it is suggested to just always pass the @samp{--thread} and
@samp{--frame} options.

@subsubsection Language

The execution of several commands depends on which language is selected.
By default, the current language (@pxref{show language}) is used.
But for commands known to be language-sensitive, it is recommended
to use the @samp{--language} option.  This option takes one argument,
which is the name of the language to use while executing the command.
For instance:

@smallexample
-data-evaluate-expression --language c "sizeof (void*)"
^done,value="4"
(gdb) 
@end smallexample

The valid language names are the same names accepted by the
@samp{set language} command (@pxref{Manually}), excluding @samp{auto},
@samp{local} or @samp{unknown}.

@node Asynchronous and non-stop modes
@subsection Asynchronous command execution and non-stop mode

On some targets, @value{GDBN} is capable of processing MI commands
even while the target is running.  This is called @dfn{asynchronous
command execution} (@pxref{Background Execution}).  The frontend may
specify a preferrence for asynchronous execution using the
@code{-gdb-set mi-async 1} command, which should be emitted before
either running the executable or attaching to the target.  After the
frontend has started the executable or attached to the target, it can
find if asynchronous execution is enabled using the
@code{-list-target-features} command.

@table @code
@item -gdb-set mi-async on
@item -gdb-set mi-async off
Set whether MI is in asynchronous mode.

When @code{off}, which is the default, MI execution commands (e.g.,
@code{-exec-continue}) are foreground commands, and @value{GDBN} waits
for the program to stop before processing further commands.

When @code{on}, MI execution commands are background execution
commands (e.g., @code{-exec-continue} becomes the equivalent of the
@code{c&} CLI command), and so @value{GDBN} is capable of processing
MI commands even while the target is running.

@item -gdb-show mi-async
Show whether MI asynchronous mode is enabled.
@end table

Note: In @value{GDBN} version 7.7 and earlier, this option was called
@code{target-async} instead of @code{mi-async}, and it had the effect
of both putting MI in asynchronous mode and making CLI background
commands possible.  CLI background commands are now always possible
``out of the box'' if the target supports them.  The old spelling is
kept as a deprecated alias for backwards compatibility.

Even if @value{GDBN} can accept a command while target is running,
many commands that access the target do not work when the target is
running.  Therefore, asynchronous command execution is most useful
when combined with non-stop mode (@pxref{Non-Stop Mode}).  Then,
it is possible to examine the state of one thread, while other threads
are running.

When a given thread is running, MI commands that try to access the
target in the context of that thread may not work, or may work only on
some targets.  In particular, commands that try to operate on thread's
stack will not work, on any target.  Commands that read memory, or
modify breakpoints, may work or not work, depending on the target.  Note
that even commands that operate on global state, such as @code{print},
@code{set}, and breakpoint commands, still access the target in the
context of a specific thread,  so frontend should try to find a
stopped thread and perform the operation on that thread (using the
@samp{--thread} option).

Which commands will work in the context of a running thread is
highly target dependent.  However, the two commands
@code{-exec-interrupt}, to stop a thread, and @code{-thread-info},
to find the state of a thread, will always work.

@node Thread groups
@subsection Thread groups
@value{GDBN} may be used to debug several processes at the same time.
On some platfroms, @value{GDBN} may support debugging of several
hardware systems, each one having several cores with several different
processes running on each core.  This section describes the MI
mechanism to support such debugging scenarios.

The key observation is that regardless of the structure of the 
target, MI can have a global list of threads, because most commands that 
accept the @samp{--thread} option do not need to know what process that
thread belongs to.  Therefore, it is not necessary to introduce
neither additional @samp{--process} option, nor an notion of the
current process in the MI interface.  The only strictly new feature
that is required is the ability to find how the threads are grouped
into processes.

To allow the user to discover such grouping, and to support arbitrary
hierarchy of machines/cores/processes, MI introduces the concept of a
@dfn{thread group}.  Thread group is a collection of threads and other
thread groups.  A thread group always has a string identifier, a type,
and may have additional attributes specific to the type.  A new
command, @code{-list-thread-groups}, returns the list of top-level
thread groups, which correspond to processes that @value{GDBN} is
debugging at the moment.  By passing an identifier of a thread group
to the @code{-list-thread-groups} command, it is possible to obtain
the members of specific thread group.

To allow the user to easily discover processes, and other objects, he
wishes to debug, a concept of @dfn{available thread group} is
introduced.  Available thread group is an thread group that
@value{GDBN} is not debugging, but that can be attached to, using the
@code{-target-attach} command.  The list of available top-level thread
groups can be obtained using @samp{-list-thread-groups --available}.
In general, the content of a thread group may be only retrieved only
after attaching to that thread group.

Thread groups are related to inferiors (@pxref{Inferiors and
Programs}).  Each inferior corresponds to a thread group of a special
type @samp{process}, and some additional operations are permitted on
such thread groups.

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Command Syntax
@section @sc{gdb/mi} Command Syntax

@menu
* GDB/MI Input Syntax::
* GDB/MI Output Syntax::
@end menu

@node GDB/MI Input Syntax
@subsection @sc{gdb/mi} Input Syntax

@cindex input syntax for @sc{gdb/mi}
@cindex @sc{gdb/mi}, input syntax
@table @code
@item @var{command} @expansion{}
@code{@var{cli-command} | @var{mi-command}}

@item @var{cli-command} @expansion{}
@code{[ @var{token} ] @var{cli-command} @var{nl}}, where
@var{cli-command} is any existing @value{GDBN} CLI command.

@item @var{mi-command} @expansion{}
@code{[ @var{token} ] "-" @var{operation} ( " " @var{option} )*
@code{[} " --" @code{]} ( " " @var{parameter} )* @var{nl}}

@item @var{token} @expansion{}
"any sequence of digits"

@item @var{option} @expansion{}
@code{"-" @var{parameter} [ " " @var{parameter} ]}

@item @var{parameter} @expansion{}
@code{@var{non-blank-sequence} | @var{c-string}}

@item @var{operation} @expansion{}
@emph{any of the operations described in this chapter}

@item @var{non-blank-sequence} @expansion{}
@emph{anything, provided it doesn't contain special characters such as
"-", @var{nl}, """ and of course " "}

@item @var{c-string} @expansion{}
@code{""" @var{seven-bit-iso-c-string-content} """}

@item @var{nl} @expansion{}
@code{CR | CR-LF}
@end table

@noindent
Notes:

@itemize @bullet
@item
The CLI commands are still handled by the @sc{mi} interpreter; their
output is described below.

@item
The @code{@var{token}}, when present, is passed back when the command
finishes.

@item
Some @sc{mi} commands accept optional arguments as part of the parameter
list.  Each option is identified by a leading @samp{-} (dash) and may be
followed by an optional argument parameter.  Options occur first in the
parameter list and can be delimited from normal parameters using
@samp{--} (this is useful when some parameters begin with a dash).
@end itemize

Pragmatics:

@itemize @bullet
@item
We want easy access to the existing CLI syntax (for debugging).

@item
We want it to be easy to spot a @sc{mi} operation.
@end itemize

@node GDB/MI Output Syntax
@subsection @sc{gdb/mi} Output Syntax

@cindex output syntax of @sc{gdb/mi}
@cindex @sc{gdb/mi}, output syntax
The output from @sc{gdb/mi} consists of zero or more out-of-band records
followed, optionally, by a single result record.  This result record
is for the most recent command.  The sequence of output records is
terminated by @samp{(gdb)}.

If an input command was prefixed with a @code{@var{token}} then the
corresponding output for that command will also be prefixed by that same
@var{token}.

@table @code
@item @var{output} @expansion{}
@code{( @var{out-of-band-record} )* [ @var{result-record} ] "(gdb)" @var{nl}}

@item @var{result-record} @expansion{}
@code{ [ @var{token} ] "^" @var{result-class} ( "," @var{result} )* @var{nl}}

@item @var{out-of-band-record} @expansion{}
@code{@var{async-record} | @var{stream-record}}

@item @var{async-record} @expansion{}
@code{@var{exec-async-output} | @var{status-async-output} | @var{notify-async-output}}

@item @var{exec-async-output} @expansion{}
@code{[ @var{token} ] "*" @var{async-output nl}}

@item @var{status-async-output} @expansion{}
@code{[ @var{token} ] "+" @var{async-output nl}}

@item @var{notify-async-output} @expansion{}
@code{[ @var{token} ] "=" @var{async-output nl}}

@item @var{async-output} @expansion{}
@code{@var{async-class} ( "," @var{result} )*}

@item @var{result-class} @expansion{}
@code{"done" | "running" | "connected" | "error" | "exit"}

@item @var{async-class} @expansion{}
@code{"stopped" | @var{others}} (where @var{others} will be added
depending on the needs---this is still in development).

@item @var{result} @expansion{}
@code{ @var{variable} "=" @var{value}}

@item @var{variable} @expansion{}
@code{ @var{string} }

@item @var{value} @expansion{}
@code{ @var{const} | @var{tuple} | @var{list} }

@item @var{const} @expansion{}
@code{@var{c-string}}

@item @var{tuple} @expansion{}
@code{ "@{@}" | "@{" @var{result} ( "," @var{result} )* "@}" }

@item @var{list} @expansion{}
@code{ "[]" | "[" @var{value} ( "," @var{value} )* "]" | "["
@var{result} ( "," @var{result} )* "]" }

@item @var{stream-record} @expansion{}
@code{@var{console-stream-output} | @var{target-stream-output} | @var{log-stream-output}}

@item @var{console-stream-output} @expansion{}
@code{"~" @var{c-string nl}}

@item @var{target-stream-output} @expansion{}
@code{"@@" @var{c-string nl}}

@item @var{log-stream-output} @expansion{}
@code{"&" @var{c-string nl}}

@item @var{nl} @expansion{}
@code{CR | CR-LF}

@item @var{token} @expansion{}
@emph{any sequence of digits}.
@end table

@noindent
Notes:

@itemize @bullet
@item
All output sequences end in a single line containing a period.

@item
The @code{@var{token}} is from the corresponding request.  Note that
for all async output, while the token is allowed by the grammar and
may be output by future versions of @value{GDBN} for select async
output messages, it is generally omitted.  Frontends should treat
all async output as reporting general changes in the state of the
target and there should be no need to associate async output to any
prior command.

@item
@cindex status output in @sc{gdb/mi}
@var{status-async-output} contains on-going status information about the
progress of a slow operation.  It can be discarded.  All status output is
prefixed by @samp{+}.

@item
@cindex async output in @sc{gdb/mi}
@var{exec-async-output} contains asynchronous state change on the target
(stopped, started, disappeared).  All async output is prefixed by
@samp{*}.

@item
@cindex notify output in @sc{gdb/mi}
@var{notify-async-output} contains supplementary information that the
client should handle (e.g., a new breakpoint information).  All notify
output is prefixed by @samp{=}.

@item
@cindex console output in @sc{gdb/mi}
@var{console-stream-output} is output that should be displayed as is in the
console.  It is the textual response to a CLI command.  All the console
output is prefixed by @samp{~}.

@item
@cindex target output in @sc{gdb/mi}
@var{target-stream-output} is the output produced by the target program.
All the target output is prefixed by @samp{@@}.

@item
@cindex log output in @sc{gdb/mi}
@var{log-stream-output} is output text coming from @value{GDBN}'s internals, for
instance messages that should be displayed as part of an error log.  All
the log output is prefixed by @samp{&}.

@item
@cindex list output in @sc{gdb/mi}
New @sc{gdb/mi} commands should only output @var{lists} containing
@var{values}.


@end itemize

@xref{GDB/MI Stream Records, , @sc{gdb/mi} Stream Records}, for more
details about the various output records.

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Compatibility with CLI
@section @sc{gdb/mi} Compatibility with CLI

@cindex compatibility, @sc{gdb/mi} and CLI
@cindex @sc{gdb/mi}, compatibility with CLI

For the developers convenience CLI commands can be entered directly,
but there may be some unexpected behaviour.  For example, commands
that query the user will behave as if the user replied yes, breakpoint
command lists are not executed and some CLI commands, such as
@code{if}, @code{when} and @code{define}, prompt for further input with
@samp{>}, which is not valid MI output.

This feature may be removed at some stage in the future and it is
recommended that front ends use the @code{-interpreter-exec} command
(@pxref{-interpreter-exec}).

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Development and Front Ends
@section @sc{gdb/mi} Development and Front Ends
@cindex @sc{gdb/mi} development

The application which takes the MI output and presents the state of the
program being debugged to the user is called a @dfn{front end}.

Although @sc{gdb/mi} is still incomplete, it is currently being used
by a variety of front ends to @value{GDBN}.  This makes it difficult
to introduce new functionality without breaking existing usage.  This
section tries to minimize the problems by describing how the protocol
might change.

Some changes in MI need not break a carefully designed front end, and
for these the MI version will remain unchanged.  The following is a
list of changes that may occur within one level, so front ends should
parse MI output in a way that can handle them:

@itemize @bullet
@item
New MI commands may be added.

@item
New fields may be added to the output of any MI command.

@item
The range of values for fields with specified values, e.g.,
@code{in_scope} (@pxref{-var-update}) may be extended.

@c The format of field's content e.g type prefix, may change so parse it
@c   at your own risk.  Yes, in general?

@c The order of fields may change?  Shouldn't really matter but it might
@c resolve inconsistencies.
@end itemize

If the changes are likely to break front ends, the MI version level
will be increased by one.  This will allow the front end to parse the
output according to the MI version.  Apart from mi0, new versions of
@value{GDBN} will not support old versions of MI and it will be the
responsibility of the front end to work with the new one.

@c Starting with mi3, add a new command -mi-version that prints the MI
@c version?

The best way to avoid unexpected changes in MI that might break your front
end is to make your project known to @value{GDBN} developers and
follow development on @email{gdb@@sourceware.org} and
@email{gdb-patches@@sourceware.org}.
@cindex mailing lists

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Output Records
@section @sc{gdb/mi} Output Records

@menu
* GDB/MI Result Records::
* GDB/MI Stream Records::
* GDB/MI Async Records::
* GDB/MI Breakpoint Information::
* GDB/MI Frame Information::
* GDB/MI Thread Information::
* GDB/MI Ada Exception Information::
@end menu

@node GDB/MI Result Records
@subsection @sc{gdb/mi} Result Records

@cindex result records in @sc{gdb/mi}
@cindex @sc{gdb/mi}, result records
In addition to a number of out-of-band notifications, the response to a
@sc{gdb/mi} command includes one of the following result indications:

@table @code
@findex ^done
@item "^done" [ "," @var{results} ]
The synchronous operation was successful, @code{@var{results}} are the return
values.

@item "^running"
@findex ^running
This result record is equivalent to @samp{^done}.  Historically, it
was output instead of @samp{^done} if the command has resumed the
target.  This behaviour is maintained for backward compatibility, but
all frontends should treat @samp{^done} and @samp{^running}
identically and rely on the @samp{*running} output record to determine
which threads are resumed.

@item "^connected"
@findex ^connected
@value{GDBN} has connected to a remote target.

@item "^error" "," "msg=" @var{c-string} [ "," "code=" @var{c-string} ]
@findex ^error
The operation failed.  The @code{msg=@var{c-string}} variable contains
the corresponding error message.

If present, the @code{code=@var{c-string}} variable provides an error
code on which consumers can rely on to detect the corresponding
error condition.  At present, only one error code is defined:

@table @samp
@item "undefined-command"
Indicates that the command causing the error does not exist.
@end table

@item "^exit"
@findex ^exit
@value{GDBN} has terminated.

@end table

@node GDB/MI Stream Records
@subsection @sc{gdb/mi} Stream Records

@cindex @sc{gdb/mi}, stream records
@cindex stream records in @sc{gdb/mi}
@value{GDBN} internally maintains a number of output streams: the console, the
target, and the log.  The output intended for each of these streams is
funneled through the @sc{gdb/mi} interface using @dfn{stream records}.

Each stream record begins with a unique @dfn{prefix character} which
identifies its stream (@pxref{GDB/MI Output Syntax, , @sc{gdb/mi} Output
Syntax}).  In addition to the prefix, each stream record contains a
@code{@var{string-output}}.  This is either raw text (with an implicit new
line) or a quoted C string (which does not contain an implicit newline).

@table @code
@item "~" @var{string-output}
The console output stream contains text that should be displayed in the
CLI console window.  It contains the textual responses to CLI commands.

@item "@@" @var{string-output}
The target output stream contains any textual output from the running
target.  This is only present when GDB's event loop is truly
asynchronous, which is currently only the case for remote targets.

@item "&" @var{string-output}
The log stream contains debugging messages being produced by @value{GDBN}'s
internals.
@end table

@node GDB/MI Async Records
@subsection @sc{gdb/mi} Async Records

@cindex async records in @sc{gdb/mi}
@cindex @sc{gdb/mi}, async records
@dfn{Async} records are used to notify the @sc{gdb/mi} client of
additional changes that have occurred.  Those changes can either be a
consequence of @sc{gdb/mi} commands (e.g., a breakpoint modified) or a result of
target activity (e.g., target stopped).

The following is the list of possible async records:

@table @code

@item *running,thread-id="@var{thread}"
The target is now running.  The @var{thread} field tells which
specific thread is now running, and can be @samp{all} if all threads
are running.  The frontend should assume that no interaction with a 
running thread is possible after this notification is produced.
The frontend should not assume that this notification is output
only once for any command.  @value{GDBN} may emit this notification 
several times, either for different threads, because it cannot resume
all threads together, or even for a single thread, if the thread must
be stepped though some code before letting it run freely.

@item *stopped,reason="@var{reason}",thread-id="@var{id}",stopped-threads="@var{stopped}",core="@var{core}"
The target has stopped.  The @var{reason} field can have one of the
following values:

@table @code
@item breakpoint-hit
A breakpoint was reached.
@item watchpoint-trigger
A watchpoint was triggered.
@item read-watchpoint-trigger
A read watchpoint was triggered.
@item access-watchpoint-trigger 
An access watchpoint was triggered.
@item function-finished
An -exec-finish or similar CLI command was accomplished.
@item location-reached
An -exec-until or similar CLI command was accomplished.
@item watchpoint-scope
A watchpoint has gone out of scope.
@item end-stepping-range
An -exec-next, -exec-next-instruction, -exec-step, -exec-step-instruction or 
similar CLI command was accomplished.
@item exited-signalled 
The inferior exited because of a signal.
@item exited 
The inferior exited.
@item exited-normally 
The inferior exited normally.
@item signal-received 
A signal was received by the inferior.
@item solib-event
The inferior has stopped due to a library being loaded or unloaded.
This can happen when @code{stop-on-solib-events} (@pxref{Files}) is
set or when a @code{catch load} or @code{catch unload} catchpoint is
in use (@pxref{Set Catchpoints}).
@item fork
The inferior has forked.  This is reported when @code{catch fork}
(@pxref{Set Catchpoints}) has been used.
@item vfork
The inferior has vforked.  This is reported in when @code{catch vfork}
(@pxref{Set Catchpoints}) has been used.
@item syscall-entry
The inferior entered a system call.  This is reported when @code{catch
syscall} (@pxref{Set Catchpoints}) has been used.
@item syscall-entry
The inferior returned from a system call.  This is reported when
@code{catch syscall} (@pxref{Set Catchpoints}) has been used.
@item exec
The inferior called @code{exec}.  This is reported when @code{catch exec}
(@pxref{Set Catchpoints}) has been used.
@end table

The @var{id} field identifies the thread that directly caused the stop
-- for example by hitting a breakpoint.  Depending on whether all-stop
mode is in effect (@pxref{All-Stop Mode}), @value{GDBN} may either
stop all threads, or only the thread that directly triggered the stop.
If all threads are stopped, the @var{stopped} field will have the
value of @code{"all"}.  Otherwise, the value of the @var{stopped}
field will be a list of thread identifiers.  Presently, this list will
always include a single thread, but frontend should be prepared to see
several threads in the list.  The @var{core} field reports the
processor core on which the stop event has happened.  This field may be absent
if such information is not available.

@item =thread-group-added,id="@var{id}"
@itemx =thread-group-removed,id="@var{id}"
A thread group was either added or removed.  The @var{id} field
contains the @value{GDBN} identifier of the thread group.  When a thread
group is added, it generally might not be associated with a running
process.  When a thread group is removed, its id becomes invalid and
cannot be used in any way.

@item =thread-group-started,id="@var{id}",pid="@var{pid}"
A thread group became associated with a running program,
either because the program was just started or the thread group
was attached to a program.  The @var{id} field contains the
@value{GDBN} identifier of the thread group.  The @var{pid} field
contains process identifier, specific to the operating system.

@item =thread-group-exited,id="@var{id}"[,exit-code="@var{code}"]
A thread group is no longer associated with a running program,
either because the program has exited, or because it was detached
from.  The @var{id} field contains the @value{GDBN} identifier of the
thread group.  The @var{code} field is the exit code of the inferior; it exists
only when the inferior exited with some code.

@item =thread-created,id="@var{id}",group-id="@var{gid}"
@itemx =thread-exited,id="@var{id}",group-id="@var{gid}"
A thread either was created, or has exited.  The @var{id} field
contains the @value{GDBN} identifier of the thread.  The @var{gid}
field identifies the thread group this thread belongs to.

@item =thread-selected,id="@var{id}"
Informs that the selected thread was changed as result of the last
command.  This notification is not emitted as result of @code{-thread-select}
command but is emitted whenever an MI command that is not documented
to change the selected thread actually changes it.  In particular,
invoking, directly or indirectly (via user-defined command), the CLI
@code{thread} command, will generate this notification.

We suggest that in response to this notification, front ends
highlight the selected thread and cause subsequent commands to apply to
that thread.

@item =library-loaded,...
Reports that a new library file was loaded by the program.  This
notification has 4 fields---@var{id}, @var{target-name},
@var{host-name}, and @var{symbols-loaded}.  The @var{id} field is an
opaque identifier of the library.  For remote debugging case,
@var{target-name} and @var{host-name} fields give the name of the
library file on the target, and on the host respectively.  For native
debugging, both those fields have the same value.  The
@var{symbols-loaded} field is emitted only for backward compatibility
and should not be relied on to convey any useful information.  The
@var{thread-group} field, if present, specifies the id of the thread
group in whose context the library was loaded.  If the field is
absent, it means the library was loaded in the context of all present
thread groups.

@item =library-unloaded,...
Reports that a library was unloaded by the program.  This notification
has 3 fields---@var{id}, @var{target-name} and @var{host-name} with
the same meaning as for the @code{=library-loaded} notification.
The @var{thread-group} field, if present, specifies the id of the
thread group in whose context the library was unloaded.  If the field is
absent, it means the library was unloaded in the context of all present
thread groups.

@item =traceframe-changed,num=@var{tfnum},tracepoint=@var{tpnum}
@itemx =traceframe-changed,end
Reports that the trace frame was changed and its new number is
@var{tfnum}.  The number of the tracepoint associated with this trace
frame is @var{tpnum}.

@item =tsv-created,name=@var{name},initial=@var{initial}
Reports that the new trace state variable @var{name} is created with
initial value @var{initial}.

@item =tsv-deleted,name=@var{name}
@itemx =tsv-deleted
Reports that the trace state variable @var{name} is deleted or all
trace state variables are deleted.

@item =tsv-modified,name=@var{name},initial=@var{initial}[,current=@var{current}]
Reports that the trace state variable @var{name} is modified with
the initial value @var{initial}. The current value @var{current} of
trace state variable is optional and is reported if the current
value of trace state variable is known.

@item =breakpoint-created,bkpt=@{...@}
@itemx =breakpoint-modified,bkpt=@{...@}
@itemx =breakpoint-deleted,id=@var{number}
Reports that a breakpoint was created, modified, or deleted,
respectively.  Only user-visible breakpoints are reported to the MI
user.

The @var{bkpt} argument is of the same form as returned by the various
breakpoint commands; @xref{GDB/MI Breakpoint Commands}.  The
@var{number} is the ordinal number of the breakpoint.

Note that if a breakpoint is emitted in the result record of a
command, then it will not also be emitted in an async record.

@item =record-started,thread-group="@var{id}"
@itemx =record-stopped,thread-group="@var{id}"
Execution log recording was either started or stopped on an
inferior.  The @var{id} is the @value{GDBN} identifier of the thread
group corresponding to the affected inferior.

@item =cmd-param-changed,param=@var{param},value=@var{value}
Reports that a parameter of the command @code{set @var{param}} is
changed to @var{value}.  In the multi-word @code{set} command,
the @var{param} is the whole parameter list to @code{set} command.
For example, In command @code{set check type on}, @var{param}
is @code{check type} and @var{value} is @code{on}.

@item =memory-changed,thread-group=@var{id},addr=@var{addr},len=@var{len}[,type="code"]
Reports that bytes from @var{addr} to @var{data} + @var{len} were
written in an inferior.  The @var{id} is the identifier of the
thread group corresponding to the affected inferior.  The optional
@code{type="code"} part is reported if the memory written to holds
executable code.
@end table

@node GDB/MI Breakpoint Information
@subsection @sc{gdb/mi} Breakpoint Information

When @value{GDBN} reports information about a breakpoint, a
tracepoint, a watchpoint, or a catchpoint, it uses a tuple with the
following fields:

@table @code
@item number
The breakpoint number.  For a breakpoint that represents one location
of a multi-location breakpoint, this will be a dotted pair, like
@samp{1.2}.

@item type
The type of the breakpoint.  For ordinary breakpoints this will be
@samp{breakpoint}, but many values are possible.

@item catch-type
If the type of the breakpoint is @samp{catchpoint}, then this
indicates the exact type of catchpoint.

@item disp
This is the breakpoint disposition---either @samp{del}, meaning that
the breakpoint will be deleted at the next stop, or @samp{keep},
meaning that the breakpoint will not be deleted.

@item enabled
This indicates whether the breakpoint is enabled, in which case the
value is @samp{y}, or disabled, in which case the value is @samp{n}.
Note that this is not the same as the field @code{enable}.

@item addr
The address of the breakpoint.  This may be a hexidecimal number,
giving the address; or the string @samp{<PENDING>}, for a pending
breakpoint; or the string @samp{<MULTIPLE>}, for a breakpoint with
multiple locations.  This field will not be present if no address can
be determined.  For example, a watchpoint does not have an address.

@item func
If known, the function in which the breakpoint appears.
If not known, this field is not present.

@item filename
The name of the source file which contains this function, if known.
If not known, this field is not present.

@item fullname
The full file name of the source file which contains this function, if
known.  If not known, this field is not present.

@item line
The line number at which this breakpoint appears, if known.
If not known, this field is not present.

@item at
If the source file is not known, this field may be provided.  If
provided, this holds the address of the breakpoint, possibly followed
by a symbol name.

@item pending
If this breakpoint is pending, this field is present and holds the
text used to set the breakpoint, as entered by the user.

@item evaluated-by
Where this breakpoint's condition is evaluated, either @samp{host} or
@samp{target}.

@item thread
If this is a thread-specific breakpoint, then this identifies the
thread in which the breakpoint can trigger.

@item task
If this breakpoint is restricted to a particular Ada task, then this
field will hold the task identifier.

@item cond
If the breakpoint is conditional, this is the condition expression.

@item ignore
The ignore count of the breakpoint.

@item enable
The enable count of the breakpoint.

@item traceframe-usage
FIXME.

@item static-tracepoint-marker-string-id
For a static tracepoint, the name of the static tracepoint marker.

@item mask
For a masked watchpoint, this is the mask.

@item pass
A tracepoint's pass count.

@item original-location
The location of the breakpoint as originally specified by the user.
This field is optional.

@item times
The number of times the breakpoint has been hit.

@item installed
This field is only given for tracepoints.  This is either @samp{y},
meaning that the tracepoint is installed, or @samp{n}, meaning that it
is not.

@item what
Some extra data, the exact contents of which are type-dependent.

@end table

For example, here is what the output of @code{-break-insert}
(@pxref{GDB/MI Breakpoint Commands}) might be:

@smallexample
-> -break-insert main
<- ^done,bkpt=@{number="1",type="breakpoint",disp="keep",
    enabled="y",addr="0x08048564",func="main",file="myprog.c",
    fullname="/home/nickrob/myprog.c",line="68",thread-groups=["i1"],
    times="0"@}
<- (gdb)
@end smallexample

@node GDB/MI Frame Information
@subsection @sc{gdb/mi} Frame Information

Response from many MI commands includes an information about stack
frame.  This information is a tuple that may have the following
fields:

@table @code
@item level
The level of the stack frame.  The innermost frame has the level of
zero.  This field is always present.

@item func
The name of the function corresponding to the frame.  This field may
be absent if @value{GDBN} is unable to determine the function name.

@item addr
The code address for the frame.  This field is always present.

@item file
The name of the source files that correspond to the frame's code
address.  This field may be absent.

@item line
The source line corresponding to the frames' code address.  This field
may be absent.

@item from
The name of the binary file (either executable or shared library) the
corresponds to the frame's code address.  This field may be absent.

@end table

@node GDB/MI Thread Information
@subsection @sc{gdb/mi} Thread Information

Whenever @value{GDBN} has to report an information about a thread, it
uses a tuple with the following fields:

@table @code
@item id
The numeric id assigned to the thread by @value{GDBN}.  This field is
always present.

@item target-id
Target-specific string identifying the thread.  This field is always present.

@item details
Additional information about the thread provided by the target.
It is supposed to be human-readable and not interpreted by the
frontend.  This field is optional.

@item state
Either @samp{stopped} or @samp{running}, depending on whether the
thread is presently running.  This field is always present.

@item core
The value of this field is an integer number of the processor core the
thread was last seen on.  This field is optional.
@end table

@node GDB/MI Ada Exception Information
@subsection @sc{gdb/mi} Ada Exception Information

Whenever a @code{*stopped} record is emitted because the program
stopped after hitting an exception catchpoint (@pxref{Set Catchpoints}),
@value{GDBN} provides the name of the exception that was raised via
the @code{exception-name} field.

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Simple Examples
@section Simple Examples of @sc{gdb/mi} Interaction
@cindex @sc{gdb/mi}, simple examples

This subsection presents several simple examples of interaction using
the @sc{gdb/mi} interface.  In these examples, @samp{->} means that the
following line is passed to @sc{gdb/mi} as input, while @samp{<-} means
the output received from @sc{gdb/mi}.

Note the line breaks shown in the examples are here only for
readability, they don't appear in the real output.

@subheading Setting a Breakpoint

Setting a breakpoint generates synchronous output which contains detailed
information of the breakpoint.

@smallexample
-> -break-insert main
<- ^done,bkpt=@{number="1",type="breakpoint",disp="keep",
    enabled="y",addr="0x08048564",func="main",file="myprog.c",
    fullname="/home/nickrob/myprog.c",line="68",thread-groups=["i1"],
    times="0"@}
<- (gdb)
@end smallexample

@subheading Program Execution

Program execution generates asynchronous records and MI gives the
reason that execution stopped.

@smallexample
-> -exec-run
<- ^running
<- (gdb)
<- *stopped,reason="breakpoint-hit",disp="keep",bkptno="1",thread-id="0",
   frame=@{addr="0x08048564",func="main",
   args=[@{name="argc",value="1"@},@{name="argv",value="0xbfc4d4d4"@}],
   file="myprog.c",fullname="/home/nickrob/myprog.c",line="68"@}
<- (gdb)
-> -exec-continue
<- ^running
<- (gdb)
<- *stopped,reason="exited-normally"
<- (gdb)
@end smallexample

@subheading Quitting @value{GDBN}

Quitting @value{GDBN} just prints the result class @samp{^exit}.

@smallexample
-> (gdb)
<- -gdb-exit
<- ^exit
@end smallexample

Please note that @samp{^exit} is printed immediately, but it might
take some time for @value{GDBN} to actually exit.  During that time, @value{GDBN}
performs necessary cleanups, including killing programs being debugged
or disconnecting from debug hardware, so the frontend should wait till
@value{GDBN} exits and should only forcibly kill @value{GDBN} if it
fails to exit in reasonable time.

@subheading A Bad Command

Here's what happens if you pass a non-existent command:

@smallexample
-> -rubbish
<- ^error,msg="Undefined MI command: rubbish"
<- (gdb)
@end smallexample


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Command Description Format
@section @sc{gdb/mi} Command Description Format

The remaining sections describe blocks of commands.  Each block of
commands is laid out in a fashion similar to this section.

@subheading Motivation

The motivation for this collection of commands.

@subheading Introduction

A brief introduction to this collection of commands as a whole.

@subheading Commands

For each command in the block, the following is described:

@subsubheading Synopsis

@smallexample
 -command @var{args}@dots{}
@end smallexample

@subsubheading Result

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} CLI command(s), if any.

@subsubheading Example

Example(s) formatted for readability.  Some of the described commands  have
not been implemented yet and these are labeled N.A.@: (not available).


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Breakpoint Commands
@section @sc{gdb/mi} Breakpoint Commands

@cindex breakpoint commands for @sc{gdb/mi}
@cindex @sc{gdb/mi}, breakpoint commands
This section documents @sc{gdb/mi} commands for manipulating
breakpoints.

@subheading The @code{-break-after} Command
@findex -break-after

@subsubheading Synopsis

@smallexample
 -break-after @var{number} @var{count}
@end smallexample

The breakpoint number @var{number} is not in effect until it has been
hit @var{count} times.  To see how this is reflected in the output of
the @samp{-break-list} command, see the description of the
@samp{-break-list} command below.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{ignore}.

@subsubheading Example

@smallexample
(gdb)
-break-insert main
^done,bkpt=@{number="1",type="breakpoint",disp="keep",
enabled="y",addr="0x000100d0",func="main",file="hello.c",
fullname="/home/foo/hello.c",line="5",thread-groups=["i1"],
times="0"@}
(gdb)
-break-after 1 3
~
^done
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="1",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[bkpt=@{number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x000100d0",func="main",file="hello.c",fullname="/home/foo/hello.c",
line="5",thread-groups=["i1"],times="0",ignore="3"@}]@}
(gdb)
@end smallexample

@ignore
@subheading The @code{-break-catch} Command
@findex -break-catch
@end ignore

@subheading The @code{-break-commands} Command
@findex -break-commands

@subsubheading Synopsis

@smallexample
 -break-commands @var{number} [ @var{command1} ... @var{commandN} ]
@end smallexample

Specifies the CLI commands that should be executed when breakpoint
@var{number} is hit.  The parameters @var{command1} to @var{commandN}
are the commands.  If no command is specified, any previously-set
commands are cleared.  @xref{Break Commands}.  Typical use of this
functionality is tracing a program, that is, printing of values of
some variables whenever breakpoint is hit and then continuing.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{commands}.

@subsubheading Example

@smallexample
(gdb)
-break-insert main
^done,bkpt=@{number="1",type="breakpoint",disp="keep",
enabled="y",addr="0x000100d0",func="main",file="hello.c",
fullname="/home/foo/hello.c",line="5",thread-groups=["i1"],
times="0"@}
(gdb)
-break-commands 1 "print v" "continue"
^done
(gdb)
@end smallexample

@subheading The @code{-break-condition} Command
@findex -break-condition

@subsubheading Synopsis

@smallexample
 -break-condition @var{number} @var{expr}
@end smallexample

Breakpoint @var{number} will stop the program only if the condition in
@var{expr} is true.  The condition becomes part of the
@samp{-break-list} output (see the description of the @samp{-break-list}
command below).

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{condition}.

@subsubheading Example

@smallexample
(gdb)
-break-condition 1 1
^done
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="1",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[bkpt=@{number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x000100d0",func="main",file="hello.c",fullname="/home/foo/hello.c",
line="5",cond="1",thread-groups=["i1"],times="0",ignore="3"@}]@}
(gdb)
@end smallexample

@subheading The @code{-break-delete} Command
@findex -break-delete

@subsubheading Synopsis

@smallexample
 -break-delete ( @var{breakpoint} )+
@end smallexample

Delete the breakpoint(s) whose number(s) are specified in the argument
list.  This is obviously reflected in the breakpoint list.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{delete}.

@subsubheading Example

@smallexample
(gdb)
-break-delete 1
^done
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="0",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[]@}
(gdb)
@end smallexample

@subheading The @code{-break-disable} Command
@findex -break-disable

@subsubheading Synopsis

@smallexample
 -break-disable ( @var{breakpoint} )+
@end smallexample

Disable the named @var{breakpoint}(s).  The field @samp{enabled} in the
break list is now set to @samp{n} for the named @var{breakpoint}(s).

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{disable}.

@subsubheading Example

@smallexample
(gdb)
-break-disable 2
^done
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="1",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[bkpt=@{number="2",type="breakpoint",disp="keep",enabled="n",
addr="0x000100d0",func="main",file="hello.c",fullname="/home/foo/hello.c",
line="5",thread-groups=["i1"],times="0"@}]@}
(gdb)
@end smallexample

@subheading The @code{-break-enable} Command
@findex -break-enable

@subsubheading Synopsis

@smallexample
 -break-enable ( @var{breakpoint} )+
@end smallexample

Enable (previously disabled) @var{breakpoint}(s).

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{enable}.

@subsubheading Example

@smallexample
(gdb)
-break-enable 2
^done
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="1",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[bkpt=@{number="2",type="breakpoint",disp="keep",enabled="y",
addr="0x000100d0",func="main",file="hello.c",fullname="/home/foo/hello.c",
line="5",thread-groups=["i1"],times="0"@}]@}
(gdb)
@end smallexample

@subheading The @code{-break-info} Command
@findex -break-info

@subsubheading Synopsis

@smallexample
 -break-info @var{breakpoint}
@end smallexample

@c REDUNDANT???
Get information about a single breakpoint.

The result is a table of breakpoints.  @xref{GDB/MI Breakpoint
Information}, for details on the format of each breakpoint in the
table.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info break @var{breakpoint}}.

@subsubheading Example
N.A.

@subheading The @code{-break-insert} Command
@findex -break-insert

@subsubheading Synopsis

@smallexample
 -break-insert [ -t ] [ -h ] [ -f ] [ -d ] [ -a ]
    [ -c @var{condition} ] [ -i @var{ignore-count} ]
    [ -p @var{thread-id} ] [ @var{location} ]
@end smallexample

@noindent
If specified, @var{location}, can be one of:

@itemize @bullet
@item function
@c @item +offset
@c @item -offset
@c @item linenum
@item filename:linenum
@item filename:function
@item *address
@end itemize

The possible optional parameters of this command are:

@table @samp
@item -t
Insert a temporary breakpoint.
@item -h
Insert a hardware breakpoint.
@item -f
If @var{location} cannot be parsed (for example if it
refers to unknown files or functions), create a pending
breakpoint. Without this flag, @value{GDBN} will report
an error, and won't create a breakpoint, if @var{location}
cannot be parsed.
@item -d
Create a disabled breakpoint.
@item -a
Create a tracepoint.  @xref{Tracepoints}.  When this parameter
is used together with @samp{-h}, a fast tracepoint is created.
@item -c @var{condition}
Make the breakpoint conditional on @var{condition}.
@item -i @var{ignore-count}
Initialize the @var{ignore-count}.
@item -p @var{thread-id}
Restrict the breakpoint to the specified @var{thread-id}.
@end table

@subsubheading Result

@xref{GDB/MI Breakpoint Information}, for details on the format of the
resulting breakpoint.

Note: this format is open to change.
@c An out-of-band breakpoint instead of part of the result?

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} commands are @samp{break}, @samp{tbreak},
@samp{hbreak}, and @samp{thbreak}. @c and @samp{rbreak}.

@subsubheading Example

@smallexample
(gdb)
-break-insert main
^done,bkpt=@{number="1",addr="0x0001072c",file="recursive2.c",
fullname="/home/foo/recursive2.c,line="4",thread-groups=["i1"],
times="0"@}
(gdb)
-break-insert -t foo
^done,bkpt=@{number="2",addr="0x00010774",file="recursive2.c",
fullname="/home/foo/recursive2.c,line="11",thread-groups=["i1"],
times="0"@}
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="2",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[bkpt=@{number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x0001072c", func="main",file="recursive2.c",
fullname="/home/foo/recursive2.c,"line="4",thread-groups=["i1"],
times="0"@},
bkpt=@{number="2",type="breakpoint",disp="del",enabled="y",
addr="0x00010774",func="foo",file="recursive2.c",
fullname="/home/foo/recursive2.c",line="11",thread-groups=["i1"],
times="0"@}]@}
(gdb)
@c -break-insert -r foo.*
@c ~int foo(int, int);
@c ^done,bkpt=@{number="3",addr="0x00010774",file="recursive2.c,
@c "fullname="/home/foo/recursive2.c",line="11",thread-groups=["i1"],
@c times="0"@}
@c (gdb)
@end smallexample

@subheading The @code{-dprintf-insert} Command
@findex -dprintf-insert

@subsubheading Synopsis

@smallexample
 -dprintf-insert [ -t ] [ -f ] [ -d ]
    [ -c @var{condition} ] [ -i @var{ignore-count} ]
    [ -p @var{thread-id} ] [ @var{location} ] [ @var{format} ]
    [ @var{argument} ]
@end smallexample

@noindent
If specified, @var{location}, can be one of:

@itemize @bullet
@item @var{function}
@c @item +offset
@c @item -offset
@c @item @var{linenum}
@item @var{filename}:@var{linenum}
@item @var{filename}:function
@item *@var{address}
@end itemize

The possible optional parameters of this command are:

@table @samp
@item -t
Insert a temporary breakpoint.
@item -f
If @var{location} cannot be parsed (for example, if it
refers to unknown files or functions), create a pending
breakpoint.  Without this flag, @value{GDBN} will report
an error, and won't create a breakpoint, if @var{location}
cannot be parsed.
@item -d
Create a disabled breakpoint.
@item -c @var{condition}
Make the breakpoint conditional on @var{condition}.
@item -i @var{ignore-count}
Set the ignore count of the breakpoint (@pxref{Conditions, ignore count})
to @var{ignore-count}.
@item -p @var{thread-id}
Restrict the breakpoint to the specified @var{thread-id}.
@end table

@subsubheading Result

@xref{GDB/MI Breakpoint Information}, for details on the format of the
resulting breakpoint.

@c An out-of-band breakpoint instead of part of the result?

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{dprintf}.

@subsubheading Example

@smallexample
(gdb)
4-dprintf-insert foo "At foo entry\n"
4^done,bkpt=@{number="1",type="dprintf",disp="keep",enabled="y",
addr="0x000000000040061b",func="foo",file="mi-dprintf.c",
fullname="mi-dprintf.c",line="25",thread-groups=["i1"],
times="0",script=@{"printf \"At foo entry\\n\"","continue"@},
original-location="foo"@}
(gdb)
5-dprintf-insert 26 "arg=%d, g=%d\n" arg g
5^done,bkpt=@{number="2",type="dprintf",disp="keep",enabled="y",
addr="0x000000000040062a",func="foo",file="mi-dprintf.c",
fullname="mi-dprintf.c",line="26",thread-groups=["i1"],
times="0",script=@{"printf \"arg=%d, g=%d\\n\", arg, g","continue"@},
original-location="mi-dprintf.c:26"@}
(gdb)
@end smallexample

@subheading The @code{-break-list} Command
@findex -break-list

@subsubheading Synopsis

@smallexample
 -break-list
@end smallexample

Displays the list of inserted breakpoints, showing the following fields:

@table @samp
@item Number
number of the breakpoint
@item Type
type of the breakpoint: @samp{breakpoint} or @samp{watchpoint}
@item Disposition
should the breakpoint be deleted or disabled when it is hit: @samp{keep}
or @samp{nokeep}
@item Enabled
is the breakpoint enabled or no: @samp{y} or @samp{n}
@item Address
memory location at which the breakpoint is set
@item What
logical location of the breakpoint, expressed by function name, file
name, line number
@item Thread-groups
list of thread groups to which this breakpoint applies
@item Times
number of times the breakpoint has been hit
@end table

If there are no breakpoints or watchpoints, the @code{BreakpointTable}
@code{body} field is an empty list.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info break}.

@subsubheading Example

@smallexample
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="2",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[bkpt=@{number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x000100d0",func="main",file="hello.c",line="5",thread-groups=["i1"],
times="0"@},
bkpt=@{number="2",type="breakpoint",disp="keep",enabled="y",
addr="0x00010114",func="foo",file="hello.c",fullname="/home/foo/hello.c",
line="13",thread-groups=["i1"],times="0"@}]@}
(gdb)
@end smallexample

Here's an example of the result when there are no breakpoints:

@smallexample
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="0",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[]@}
(gdb)
@end smallexample

@subheading The @code{-break-passcount} Command
@findex -break-passcount

@subsubheading Synopsis

@smallexample
 -break-passcount @var{tracepoint-number} @var{passcount}
@end smallexample

Set the passcount for tracepoint @var{tracepoint-number} to
@var{passcount}.  If the breakpoint referred to by @var{tracepoint-number}
is not a tracepoint, error is emitted.  This corresponds to CLI
command @samp{passcount}.

@subheading The @code{-break-watch} Command
@findex -break-watch

@subsubheading Synopsis

@smallexample
 -break-watch [ -a | -r ]
@end smallexample

Create a watchpoint.  With the @samp{-a} option it will create an
@dfn{access} watchpoint, i.e., a watchpoint that triggers either on a
read from or on a write to the memory location.  With the @samp{-r}
option, the watchpoint created is a @dfn{read} watchpoint, i.e., it will
trigger only when the memory location is accessed for reading.  Without
either of the options, the watchpoint created is a regular watchpoint,
i.e., it will trigger when the memory location is accessed for writing.
@xref{Set Watchpoints, , Setting Watchpoints}.

Note that @samp{-break-list} will report a single list of watchpoints and
breakpoints inserted.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} commands are @samp{watch}, @samp{awatch}, and
@samp{rwatch}.

@subsubheading Example

Setting a watchpoint on a variable in the @code{main} function:

@smallexample
(gdb)
-break-watch x
^done,wpt=@{number="2",exp="x"@}
(gdb)
-exec-continue
^running
(gdb)
*stopped,reason="watchpoint-trigger",wpt=@{number="2",exp="x"@},
value=@{old="-268439212",new="55"@},
frame=@{func="main",args=[],file="recursive2.c",
fullname="/home/foo/bar/recursive2.c",line="5"@}
(gdb)
@end smallexample

Setting a watchpoint on a variable local to a function.  @value{GDBN} will stop
the program execution twice: first for the variable changing value, then
for the watchpoint going out of scope.

@smallexample
(gdb)
-break-watch C
^done,wpt=@{number="5",exp="C"@}
(gdb)
-exec-continue
^running
(gdb)
*stopped,reason="watchpoint-trigger",
wpt=@{number="5",exp="C"@},value=@{old="-276895068",new="3"@},
frame=@{func="callee4",args=[],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="13"@}
(gdb)
-exec-continue
^running
(gdb)
*stopped,reason="watchpoint-scope",wpnum="5",
frame=@{func="callee3",args=[@{name="strarg",
value="0x11940 \"A string argument.\""@}],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="18"@}
(gdb)
@end smallexample

Listing breakpoints and watchpoints, at different points in the program
execution.  Note that once the watchpoint goes out of scope, it is
deleted.

@smallexample
(gdb)
-break-watch C
^done,wpt=@{number="2",exp="C"@}
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="2",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[bkpt=@{number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x00010734",func="callee4",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/devo/gdb/testsuite/gdb.mi/basics.c"line="8",thread-groups=["i1"],
times="1"@},
bkpt=@{number="2",type="watchpoint",disp="keep",
enabled="y",addr="",what="C",thread-groups=["i1"],times="0"@}]@}
(gdb)
-exec-continue
^running
(gdb)
*stopped,reason="watchpoint-trigger",wpt=@{number="2",exp="C"@},
value=@{old="-276895068",new="3"@},
frame=@{func="callee4",args=[],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="13"@}
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="2",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[bkpt=@{number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x00010734",func="callee4",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/devo/gdb/testsuite/gdb.mi/basics.c",line="8",thread-groups=["i1"],
times="1"@},
bkpt=@{number="2",type="watchpoint",disp="keep",
enabled="y",addr="",what="C",thread-groups=["i1"],times="-5"@}]@}
(gdb)
-exec-continue
^running
^done,reason="watchpoint-scope",wpnum="2",
frame=@{func="callee3",args=[@{name="strarg",
value="0x11940 \"A string argument.\""@}],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="18"@}
(gdb)
-break-list
^done,BreakpointTable=@{nr_rows="1",nr_cols="6",
hdr=[@{width="3",alignment="-1",col_name="number",colhdr="Num"@},
@{width="14",alignment="-1",col_name="type",colhdr="Type"@},
@{width="4",alignment="-1",col_name="disp",colhdr="Disp"@},
@{width="3",alignment="-1",col_name="enabled",colhdr="Enb"@},
@{width="10",alignment="-1",col_name="addr",colhdr="Address"@},
@{width="40",alignment="2",col_name="what",colhdr="What"@}],
body=[bkpt=@{number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x00010734",func="callee4",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/devo/gdb/testsuite/gdb.mi/basics.c",line="8",
thread-groups=["i1"],times="1"@}]@}
(gdb)
@end smallexample


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Catchpoint Commands
@section @sc{gdb/mi} Catchpoint Commands

This section documents @sc{gdb/mi} commands for manipulating
catchpoints.

@menu
* Shared Library GDB/MI Catchpoint Commands::
* Ada Exception GDB/MI Catchpoint Commands::
@end menu

@node Shared Library GDB/MI Catchpoint Commands
@subsection Shared Library @sc{gdb/mi} Catchpoints

@subheading The @code{-catch-load} Command
@findex -catch-load

@subsubheading Synopsis

@smallexample
 -catch-load [ -t ] [ -d ] @var{regexp}
@end smallexample

Add a catchpoint for library load events.  If the @samp{-t} option is used,
the catchpoint is a temporary one (@pxref{Set Breaks, ,Setting
Breakpoints}).  If the @samp{-d} option is used, the catchpoint is created
in a disabled state.  The @samp{regexp} argument is a regular
expression used to match the name of the loaded library.


@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{catch load}.

@subsubheading Example

@smallexample
-catch-load -t foo.so
^done,bkpt=@{number="1",type="catchpoint",disp="del",enabled="y",
what="load of library matching foo.so",catch-type="load",times="0"@}
(gdb)
@end smallexample


@subheading The @code{-catch-unload} Command
@findex -catch-unload

@subsubheading Synopsis

@smallexample
 -catch-unload [ -t ] [ -d ] @var{regexp}
@end smallexample

Add a catchpoint for library unload events.  If the @samp{-t} option is
used, the catchpoint is a temporary one (@pxref{Set Breaks, ,Setting
Breakpoints}).  If the @samp{-d} option is used, the catchpoint is
created in a disabled state.  The @samp{regexp} argument is a regular
expression used to match the name of the unloaded library.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{catch unload}.

@subsubheading Example

@smallexample
-catch-unload -d bar.so
^done,bkpt=@{number="2",type="catchpoint",disp="keep",enabled="n",
what="load of library matching bar.so",catch-type="unload",times="0"@}
(gdb)
@end smallexample

@node Ada Exception GDB/MI Catchpoint Commands
@subsection Ada Exception @sc{gdb/mi} Catchpoints

The following @sc{gdb/mi} commands can be used to create catchpoints
that stop the execution when Ada exceptions are being raised.

@subheading The @code{-catch-assert} Command
@findex -catch-assert

@subsubheading Synopsis

@smallexample
 -catch-assert [ -c @var{condition}] [ -d ] [ -t ]
@end smallexample

Add a catchpoint for failed Ada assertions.

The possible optional parameters for this command are:

@table @samp
@item -c @var{condition}
Make the catchpoint conditional on @var{condition}.
@item -d
Create a disabled catchpoint.
@item -t
Create a temporary catchpoint.
@end table

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{catch assert}.

@subsubheading Example

@smallexample
-catch-assert
^done,bkptno="5",bkpt=@{number="5",type="breakpoint",disp="keep",
enabled="y",addr="0x0000000000404888",what="failed Ada assertions",
thread-groups=["i1"],times="0",
original-location="__gnat_debug_raise_assert_failure"@}
(gdb)
@end smallexample

@subheading The @code{-catch-exception} Command
@findex -catch-exception

@subsubheading Synopsis

@smallexample
 -catch-exception [ -c @var{condition}] [ -d ] [ -e @var{exception-name} ]
    [ -t ] [ -u ]
@end smallexample

Add a catchpoint stopping when Ada exceptions are raised.
By default, the command stops the program when any Ada exception
gets raised.  But it is also possible, by using some of the
optional parameters described below, to create more selective
catchpoints.

The possible optional parameters for this command are:

@table @samp
@item -c @var{condition}
Make the catchpoint conditional on @var{condition}.
@item -d
Create a disabled catchpoint.
@item -e @var{exception-name}
Only stop when @var{exception-name} is raised.  This option cannot
be used combined with @samp{-u}.
@item -t
Create a temporary catchpoint.
@item -u
Stop only when an unhandled exception gets raised.  This option
cannot be used combined with @samp{-e}.
@end table

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} commands are @samp{catch exception}
and @samp{catch exception unhandled}.

@subsubheading Example

@smallexample
-catch-exception -e Program_Error
^done,bkptno="4",bkpt=@{number="4",type="breakpoint",disp="keep",
enabled="y",addr="0x0000000000404874",
what="`Program_Error' Ada exception", thread-groups=["i1"],
times="0",original-location="__gnat_debug_raise_exception"@}
(gdb)
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Program Context
@section @sc{gdb/mi}  Program Context

@subheading The @code{-exec-arguments} Command
@findex -exec-arguments


@subsubheading Synopsis

@smallexample
 -exec-arguments @var{args}
@end smallexample

Set the inferior program arguments, to be used in the next
@samp{-exec-run}.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{set args}.

@subsubheading Example

@smallexample
(gdb)
-exec-arguments -v word
^done
(gdb)
@end smallexample


@ignore
@subheading The @code{-exec-show-arguments} Command
@findex -exec-show-arguments

@subsubheading Synopsis

@smallexample
 -exec-show-arguments
@end smallexample

Print the arguments of the program.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{show args}.

@subsubheading Example
N.A.
@end ignore


@subheading The @code{-environment-cd} Command
@findex -environment-cd

@subsubheading Synopsis

@smallexample
 -environment-cd @var{pathdir}
@end smallexample

Set @value{GDBN}'s working directory.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{cd}.

@subsubheading Example

@smallexample
(gdb)
-environment-cd /kwikemart/marge/ezannoni/flathead-dev/devo/gdb
^done
(gdb)
@end smallexample


@subheading The @code{-environment-directory} Command
@findex -environment-directory

@subsubheading Synopsis

@smallexample
 -environment-directory [ -r ] [ @var{pathdir} ]+
@end smallexample

Add directories @var{pathdir} to beginning of search path for source files.
If the @samp{-r} option is used, the search path is reset to the default
search path.  If directories @var{pathdir} are supplied in addition to the
@samp{-r} option, the search path is first reset and then addition
occurs as normal.
Multiple directories may be specified, separated by blanks.  Specifying
multiple directories in a single command
results in the directories added to the beginning of the
search path in the same order they were presented in the command.
If blanks are needed as
part of a directory name, double-quotes should be used around
the name.  In the command output, the path will show up separated
by the system directory-separator character.  The directory-separator
character must not be used
in any directory name.
If no directories are specified, the current search path is displayed.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{dir}.

@subsubheading Example

@smallexample
(gdb)
-environment-directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb
^done,source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd"
(gdb)
-environment-directory ""
^done,source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd"
(gdb)
-environment-directory -r /home/jjohnstn/src/gdb /usr/src
^done,source-path="/home/jjohnstn/src/gdb:/usr/src:$cdir:$cwd"
(gdb)
-environment-directory -r
^done,source-path="$cdir:$cwd"
(gdb)
@end smallexample


@subheading The @code{-environment-path} Command
@findex -environment-path

@subsubheading Synopsis

@smallexample
 -environment-path [ -r ] [ @var{pathdir} ]+
@end smallexample

Add directories @var{pathdir} to beginning of search path for object files.
If the @samp{-r} option is used, the search path is reset to the original
search path that existed at gdb start-up.  If directories @var{pathdir} are
supplied in addition to the
@samp{-r} option, the search path is first reset and then addition
occurs as normal.
Multiple directories may be specified, separated by blanks.  Specifying
multiple directories in a single command
results in the directories added to the beginning of the
search path in the same order they were presented in the command.
If blanks are needed as
part of a directory name, double-quotes should be used around
the name.  In the command output, the path will show up separated
by the system directory-separator character.  The directory-separator
character must not be used
in any directory name.
If no directories are specified, the current path is displayed.


@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{path}.

@subsubheading Example

@smallexample
(gdb)
-environment-path
^done,path="/usr/bin"
(gdb)
-environment-path /kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb /bin
^done,path="/kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb:/bin:/usr/bin"
(gdb)
-environment-path -r /usr/local/bin
^done,path="/usr/local/bin:/usr/bin"
(gdb)
@end smallexample


@subheading The @code{-environment-pwd} Command
@findex -environment-pwd

@subsubheading Synopsis

@smallexample
 -environment-pwd
@end smallexample

Show the current working directory.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{pwd}.

@subsubheading Example

@smallexample
(gdb)
-environment-pwd
^done,cwd="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb"
(gdb)
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Thread Commands
@section @sc{gdb/mi} Thread Commands


@subheading The @code{-thread-info} Command
@findex -thread-info

@subsubheading Synopsis

@smallexample
 -thread-info [ @var{thread-id} ]
@end smallexample

Reports information about either a specific thread, if 
the @var{thread-id} parameter is present, or about all
threads.  When printing information about all threads,
also reports the current thread.

@subsubheading @value{GDBN} Command

The @samp{info thread} command prints the same information
about all threads.

@subsubheading Result

The result is a list of threads.  The following attributes are
defined for a given thread:

@table @samp
@item current
This field exists only for the current thread.  It has the value @samp{*}.

@item id
The identifier that @value{GDBN} uses to refer to the thread.

@item target-id
The identifier that the target uses to refer to the thread.

@item details
Extra information about the thread, in a target-specific format.  This
field is optional.

@item name
The name of the thread.  If the user specified a name using the
@code{thread name} command, then this name is given.  Otherwise, if
@value{GDBN} can extract the thread name from the target, then that
name is given.  If @value{GDBN} cannot find the thread name, then this
field is omitted.

@item frame
The stack frame currently executing in the thread.

@item state
The thread's state.  The @samp{state} field may have the following
values:

@table @code
@item stopped
The thread is stopped.  Frame information is available for stopped
threads.

@item running
The thread is running.  There's no frame information for running
threads.

@end table

@item core
If @value{GDBN} can find the CPU core on which this thread is running,
then this field is the core identifier.  This field is optional.

@end table

@subsubheading Example

@smallexample
-thread-info
^done,threads=[
@{id="2",target-id="Thread 0xb7e14b90 (LWP 21257)",
   frame=@{level="0",addr="0xffffe410",func="__kernel_vsyscall",
           args=[]@},state="running"@},
@{id="1",target-id="Thread 0xb7e156b0 (LWP 21254)",
   frame=@{level="0",addr="0x0804891f",func="foo",
           args=[@{name="i",value="10"@}],
           file="/tmp/a.c",fullname="/tmp/a.c",line="158"@},
           state="running"@}],
current-thread-id="1"
(gdb)
@end smallexample

@subheading The @code{-thread-list-ids} Command
@findex -thread-list-ids

@subsubheading Synopsis

@smallexample
 -thread-list-ids
@end smallexample

Produces a list of the currently known @value{GDBN} thread ids.  At the
end of the list it also prints the total number of such threads.

This command is retained for historical reasons, the
@code{-thread-info} command should be used instead.

@subsubheading @value{GDBN} Command

Part of @samp{info threads} supplies the same information.

@subsubheading Example

@smallexample
(gdb)
-thread-list-ids
^done,thread-ids=@{thread-id="3",thread-id="2",thread-id="1"@},
current-thread-id="1",number-of-threads="3"
(gdb)
@end smallexample


@subheading The @code{-thread-select} Command
@findex -thread-select

@subsubheading Synopsis

@smallexample
 -thread-select @var{threadnum}
@end smallexample

Make @var{threadnum} the current thread.  It prints the number of the new
current thread, and the topmost frame for that thread.

This command is deprecated in favor of explicitly using the
@samp{--thread} option to each command.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{thread}.

@subsubheading Example

@smallexample
(gdb)
-exec-next
^running
(gdb)
*stopped,reason="end-stepping-range",thread-id="2",line="187",
file="../../../devo/gdb/testsuite/gdb.threads/linux-dp.c"
(gdb)
-thread-list-ids
^done,
thread-ids=@{thread-id="3",thread-id="2",thread-id="1"@},
number-of-threads="3"
(gdb)
-thread-select 3
^done,new-thread-id="3",
frame=@{level="0",func="vprintf",
args=[@{name="format",value="0x8048e9c \"%*s%c %d %c\\n\""@},
@{name="arg",value="0x2"@}],file="vprintf.c",line="31"@}
(gdb)
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Ada Tasking Commands
@section @sc{gdb/mi} Ada Tasking Commands

@subheading The @code{-ada-task-info} Command
@findex -ada-task-info

@subsubheading Synopsis

@smallexample
 -ada-task-info [ @var{task-id} ]
@end smallexample

Reports information about either a specific Ada task, if the
@var{task-id} parameter is present, or about all Ada tasks.

@subsubheading @value{GDBN} Command

The @samp{info tasks} command prints the same information
about all Ada tasks (@pxref{Ada Tasks}).

@subsubheading Result

The result is a table of Ada tasks.  The following columns are
defined for each Ada task:

@table @samp
@item current
This field exists only for the current thread.  It has the value @samp{*}.

@item id
The identifier that @value{GDBN} uses to refer to the Ada task.

@item task-id
The identifier that the target uses to refer to the Ada task.

@item thread-id
The identifier of the thread corresponding to the Ada task.

This field should always exist, as Ada tasks are always implemented
on top of a thread.  But if @value{GDBN} cannot find this corresponding
thread for any reason, the field is omitted.

@item parent-id
This field exists only when the task was created by another task.
In this case, it provides the ID of the parent task.

@item priority
The base priority of the task.

@item state
The current state of the task.  For a detailed description of the
possible states, see @ref{Ada Tasks}.

@item name
The name of the task.

@end table

@subsubheading Example

@smallexample
-ada-task-info
^done,tasks=@{nr_rows="3",nr_cols="8",
hdr=[@{width="1",alignment="-1",col_name="current",colhdr=""@},
@{width="3",alignment="1",col_name="id",colhdr="ID"@},
@{width="9",alignment="1",col_name="task-id",colhdr="TID"@},
@{width="4",alignment="1",col_name="thread-id",colhdr=""@},
@{width="4",alignment="1",col_name="parent-id",colhdr="P-ID"@},
@{width="3",alignment="1",col_name="priority",colhdr="Pri"@},
@{width="22",alignment="-1",col_name="state",colhdr="State"@},
@{width="1",alignment="2",col_name="name",colhdr="Name"@}],
body=[@{current="*",id="1",task-id="   644010",thread-id="1",priority="48",
state="Child Termination Wait",name="main_task"@}]@}
(gdb)
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Program Execution
@section @sc{gdb/mi} Program Execution

These are the asynchronous commands which generate the out-of-band
record @samp{*stopped}.  Currently @value{GDBN} only really executes
asynchronously with remote targets and this interaction is mimicked in
other cases.

@subheading The @code{-exec-continue} Command
@findex -exec-continue

@subsubheading Synopsis

@smallexample
 -exec-continue [--reverse] [--all|--thread-group N]
@end smallexample

Resumes the execution of the inferior program, which will continue
to execute until it reaches a debugger stop event.  If the 
@samp{--reverse} option is specified, execution resumes in reverse until 
it reaches a stop event.  Stop events may include
@itemize @bullet
@item
breakpoints or watchpoints
@item
signals or exceptions
@item
the end of the process (or its beginning under @samp{--reverse})
@item
the end or beginning of a replay log if one is being used.
@end itemize
In all-stop mode (@pxref{All-Stop
Mode}), may resume only one thread, or all threads, depending on the
value of the @samp{scheduler-locking} variable.  If @samp{--all} is
specified, all threads (in all inferiors) will be resumed.  The @samp{--all} option is
ignored in all-stop mode.  If the @samp{--thread-group} options is
specified, then all threads in that thread group are resumed.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} corresponding is @samp{continue}.

@subsubheading Example

@smallexample
-exec-continue
^running
(gdb)
@@Hello world
*stopped,reason="breakpoint-hit",disp="keep",bkptno="2",frame=@{
func="foo",args=[],file="hello.c",fullname="/home/foo/bar/hello.c",
line="13"@}
(gdb)
@end smallexample


@subheading The @code{-exec-finish} Command
@findex -exec-finish

@subsubheading Synopsis

@smallexample
 -exec-finish [--reverse]
@end smallexample

Resumes the execution of the inferior program until the current
function is exited.  Displays the results returned by the function.
If the @samp{--reverse} option is specified, resumes the reverse
execution of the inferior program until the point where current
function was called.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{finish}.

@subsubheading Example

Function returning @code{void}.

@smallexample
-exec-finish
^running
(gdb)
@@hello from foo
*stopped,reason="function-finished",frame=@{func="main",args=[],
file="hello.c",fullname="/home/foo/bar/hello.c",line="7"@}
(gdb)
@end smallexample

Function returning other than @code{void}.  The name of the internal
@value{GDBN} variable storing the result is printed, together with the
value itself.

@smallexample
-exec-finish
^running
(gdb)
*stopped,reason="function-finished",frame=@{addr="0x000107b0",func="foo",
args=[@{name="a",value="1"],@{name="b",value="9"@}@},
file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
gdb-result-var="$1",return-value="0"
(gdb)
@end smallexample


@subheading The @code{-exec-interrupt} Command
@findex -exec-interrupt

@subsubheading Synopsis

@smallexample
 -exec-interrupt [--all|--thread-group N]
@end smallexample

Interrupts the background execution of the target.  Note how the token
associated with the stop message is the one for the execution command
that has been interrupted.  The token for the interrupt itself only
appears in the @samp{^done} output.  If the user is trying to
interrupt a non-running program, an error message will be printed.

Note that when asynchronous execution is enabled, this command is
asynchronous just like other execution commands.  That is, first the
@samp{^done} response will be printed, and the target stop will be
reported after that using the @samp{*stopped} notification.

In non-stop mode, only the context thread is interrupted by default.
All threads (in all inferiors) will be interrupted if the
@samp{--all}  option is specified.  If the @samp{--thread-group}
option is specified, all threads in that group will be interrupted.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{interrupt}.

@subsubheading Example

@smallexample
(gdb)
111-exec-continue
111^running

(gdb)
222-exec-interrupt
222^done
(gdb)
111*stopped,signal-name="SIGINT",signal-meaning="Interrupt",
frame=@{addr="0x00010140",func="foo",args=[],file="try.c",
fullname="/home/foo/bar/try.c",line="13"@}
(gdb)

(gdb)
-exec-interrupt
^error,msg="mi_cmd_exec_interrupt: Inferior not executing."
(gdb)
@end smallexample

@subheading The @code{-exec-jump} Command
@findex -exec-jump

@subsubheading Synopsis

@smallexample
 -exec-jump @var{location}
@end smallexample

Resumes execution of the inferior program at the location specified by
parameter.  @xref{Specify Location}, for a description of the
different forms of @var{location}.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{jump}.

@subsubheading Example

@smallexample
-exec-jump foo.c:10
*running,thread-id="all"
^running
@end smallexample


@subheading The @code{-exec-next} Command
@findex -exec-next

@subsubheading Synopsis

@smallexample
 -exec-next [--reverse]
@end smallexample

Resumes execution of the inferior program, stopping when the beginning
of the next source line is reached.

If the @samp{--reverse} option is specified, resumes reverse execution
of the inferior program, stopping at the beginning of the previous
source line.  If you issue this command on the first line of a
function, it will take you back to the caller of that function, to the
source line where the function was called.


@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{next}.

@subsubheading Example

@smallexample
-exec-next
^running
(gdb)
*stopped,reason="end-stepping-range",line="8",file="hello.c"
(gdb)
@end smallexample


@subheading The @code{-exec-next-instruction} Command
@findex -exec-next-instruction

@subsubheading Synopsis

@smallexample
 -exec-next-instruction [--reverse]
@end smallexample

Executes one machine instruction.  If the instruction is a function
call, continues until the function returns.  If the program stops at an
instruction in the middle of a source line, the address will be
printed as well.

If the @samp{--reverse} option is specified, resumes reverse execution
of the inferior program, stopping at the previous instruction.  If the
previously executed instruction was a return from another function,
it will continue to execute in reverse until the call to that function
(from the current stack frame) is reached.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{nexti}.

@subsubheading Example

@smallexample
(gdb)
-exec-next-instruction
^running

(gdb)
*stopped,reason="end-stepping-range",
addr="0x000100d4",line="5",file="hello.c"
(gdb)
@end smallexample


@subheading The @code{-exec-return} Command
@findex -exec-return

@subsubheading Synopsis

@smallexample
 -exec-return
@end smallexample

Makes current function return immediately.  Doesn't execute the inferior.
Displays the new current frame.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{return}.

@subsubheading Example

@smallexample
(gdb)
200-break-insert callee4
200^done,bkpt=@{number="1",addr="0x00010734",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"@}
(gdb)
000-exec-run
000^running
(gdb)
000*stopped,reason="breakpoint-hit",disp="keep",bkptno="1",
frame=@{func="callee4",args=[],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="8"@}
(gdb)
205-break-delete
205^done
(gdb)
111-exec-return
111^done,frame=@{level="0",func="callee3",
args=[@{name="strarg",
value="0x11940 \"A string argument.\""@}],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="18"@}
(gdb)
@end smallexample


@subheading The @code{-exec-run} Command
@findex -exec-run

@subsubheading Synopsis

@smallexample
 -exec-run [ --all | --thread-group N ] [ --start ]
@end smallexample

Starts execution of the inferior from the beginning.  The inferior
executes until either a breakpoint is encountered or the program
exits.  In the latter case the output will include an exit code, if
the program has exited exceptionally.

When neither the @samp{--all} nor the @samp{--thread-group} option
is specified, the current inferior is started.  If the
@samp{--thread-group} option is specified, it should refer to a thread
group of type @samp{process}, and that thread group will be started.
If the @samp{--all} option is specified, then all inferiors will be started.

Using the @samp{--start} option instructs the debugger to stop
the execution at the start of the inferior's main subprogram,
following the same behavior as the @code{start} command
(@pxref{Starting}).

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{run}.

@subsubheading Examples

@smallexample
(gdb)
-break-insert main
^done,bkpt=@{number="1",addr="0x0001072c",file="recursive2.c",line="4"@}
(gdb)
-exec-run
^running
(gdb)
*stopped,reason="breakpoint-hit",disp="keep",bkptno="1",
frame=@{func="main",args=[],file="recursive2.c",
fullname="/home/foo/bar/recursive2.c",line="4"@}
(gdb)
@end smallexample

@noindent
Program exited normally:

@smallexample
(gdb)
-exec-run
^running
(gdb)
x = 55
*stopped,reason="exited-normally"
(gdb)
@end smallexample

@noindent
Program exited exceptionally:

@smallexample
(gdb)
-exec-run
^running
(gdb)
x = 55
*stopped,reason="exited",exit-code="01"
(gdb)
@end smallexample

Another way the program can terminate is if it receives a signal such as
@code{SIGINT}.  In this case, @sc{gdb/mi} displays this:

@smallexample
(gdb)
*stopped,reason="exited-signalled",signal-name="SIGINT",
signal-meaning="Interrupt"
@end smallexample


@c @subheading -exec-signal


@subheading The @code{-exec-step} Command
@findex -exec-step

@subsubheading Synopsis

@smallexample
 -exec-step [--reverse]
@end smallexample

Resumes execution of the inferior program, stopping when the beginning
of the next source line is reached, if the next source line is not a
function call.  If it is, stop at the first instruction of the called
function.  If the @samp{--reverse} option is specified, resumes reverse
execution of the inferior program, stopping at the beginning of the
previously executed source line.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{step}.

@subsubheading Example

Stepping into a function:

@smallexample
-exec-step
^running
(gdb)
*stopped,reason="end-stepping-range",
frame=@{func="foo",args=[@{name="a",value="10"@},
@{name="b",value="0"@}],file="recursive2.c",
fullname="/home/foo/bar/recursive2.c",line="11"@}
(gdb)
@end smallexample

Regular stepping:

@smallexample
-exec-step
^running
(gdb)
*stopped,reason="end-stepping-range",line="14",file="recursive2.c"
(gdb)
@end smallexample


@subheading The @code{-exec-step-instruction} Command
@findex -exec-step-instruction

@subsubheading Synopsis

@smallexample
 -exec-step-instruction [--reverse]
@end smallexample

Resumes the inferior which executes one machine instruction.  If the
@samp{--reverse} option is specified, resumes reverse execution of the
inferior program, stopping at the previously executed instruction.
The output, once @value{GDBN} has stopped, will vary depending on
whether we have stopped in the middle of a source line or not.  In the
former case, the address at which the program stopped will be printed
as well.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{stepi}.

@subsubheading Example

@smallexample
(gdb)
-exec-step-instruction
^running

(gdb)
*stopped,reason="end-stepping-range",
frame=@{func="foo",args=[],file="try.c",
fullname="/home/foo/bar/try.c",line="10"@}
(gdb)
-exec-step-instruction
^running

(gdb)
*stopped,reason="end-stepping-range",
frame=@{addr="0x000100f4",func="foo",args=[],file="try.c",
fullname="/home/foo/bar/try.c",line="10"@}
(gdb)
@end smallexample


@subheading The @code{-exec-until} Command
@findex -exec-until

@subsubheading Synopsis

@smallexample
 -exec-until [ @var{location} ]
@end smallexample

Executes the inferior until the @var{location} specified in the
argument is reached.  If there is no argument, the inferior executes
until a source line greater than the current one is reached.  The
reason for stopping in this case will be @samp{location-reached}.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{until}.

@subsubheading Example

@smallexample
(gdb)
-exec-until recursive2.c:6
^running
(gdb)
x = 55
*stopped,reason="location-reached",frame=@{func="main",args=[],
file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="6"@}
(gdb)
@end smallexample

@ignore
@subheading -file-clear
Is this going away????
@end ignore

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Stack Manipulation
@section @sc{gdb/mi} Stack Manipulation Commands

@subheading The @code{-enable-frame-filters} Command
@findex -enable-frame-filters

@smallexample
-enable-frame-filters
@end smallexample

@value{GDBN} allows Python-based frame filters to affect the output of
the MI commands relating to stack traces.  As there is no way to
implement this in a fully backward-compatible way, a front end must
request that this functionality be enabled.

Once enabled, this feature cannot be disabled.

Note that if Python support has not been compiled into @value{GDBN},
this command will still succeed (and do nothing).

@subheading The @code{-stack-info-frame} Command
@findex -stack-info-frame

@subsubheading Synopsis

@smallexample
 -stack-info-frame
@end smallexample

Get info on the selected frame.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info frame} or @samp{frame}
(without arguments).

@subsubheading Example

@smallexample
(gdb)
-stack-info-frame
^done,frame=@{level="1",addr="0x0001076c",func="callee3",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="17"@}
(gdb)
@end smallexample

@subheading The @code{-stack-info-depth} Command
@findex -stack-info-depth

@subsubheading Synopsis

@smallexample
 -stack-info-depth [ @var{max-depth} ]
@end smallexample

Return the depth of the stack.  If the integer argument @var{max-depth}
is specified, do not count beyond @var{max-depth} frames.

@subsubheading @value{GDBN} Command

There's no equivalent @value{GDBN} command.

@subsubheading Example

For a stack with frame levels 0 through 11:

@smallexample
(gdb)
-stack-info-depth
^done,depth="12"
(gdb)
-stack-info-depth 4
^done,depth="4"
(gdb)
-stack-info-depth 12
^done,depth="12"
(gdb)
-stack-info-depth 11
^done,depth="11"
(gdb)
-stack-info-depth 13
^done,depth="12"
(gdb)
@end smallexample

@anchor{-stack-list-arguments}
@subheading The @code{-stack-list-arguments} Command
@findex -stack-list-arguments

@subsubheading Synopsis

@smallexample
 -stack-list-arguments [ --no-frame-filters ] [ --skip-unavailable ] @var{print-values}
    [ @var{low-frame} @var{high-frame} ]
@end smallexample

Display a list of the arguments for the frames between @var{low-frame}
and @var{high-frame} (inclusive).  If @var{low-frame} and
@var{high-frame} are not provided, list the arguments for the whole
call stack.  If the two arguments are equal, show the single frame
at the corresponding level.  It is an error if @var{low-frame} is
larger than the actual number of frames.  On the other hand,
@var{high-frame} may be larger than the actual number of frames, in
which case only existing frames will be returned.

If @var{print-values} is 0 or @code{--no-values}, print only the names of
the variables; if it is 1 or @code{--all-values}, print also their
values; and if it is 2 or @code{--simple-values}, print the name,
type and value for simple data types, and the name and type for arrays,
structures and unions.  If the option @code{--no-frame-filters} is
supplied, then Python frame filters will not be executed.

If the @code{--skip-unavailable} option is specified, arguments that
are not available are not listed.  Partially available arguments
are still displayed, however.

Use of this command to obtain arguments in a single frame is
deprecated in favor of the @samp{-stack-list-variables} command.

@subsubheading @value{GDBN} Command

@value{GDBN} does not have an equivalent command.  @code{gdbtk} has a
@samp{gdb_get_args} command which partially overlaps with the
functionality of @samp{-stack-list-arguments}.

@subsubheading Example

@smallexample
(gdb)
-stack-list-frames
^done,
stack=[
frame=@{level="0",addr="0x00010734",func="callee4",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="8"@},
frame=@{level="1",addr="0x0001076c",func="callee3",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="17"@},
frame=@{level="2",addr="0x0001078c",func="callee2",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="22"@},
frame=@{level="3",addr="0x000107b4",func="callee1",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="27"@},
frame=@{level="4",addr="0x000107e0",func="main",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="32"@}]
(gdb)
-stack-list-arguments 0
^done,
stack-args=[
frame=@{level="0",args=[]@},
frame=@{level="1",args=[name="strarg"]@},
frame=@{level="2",args=[name="intarg",name="strarg"]@},
frame=@{level="3",args=[name="intarg",name="strarg",name="fltarg"]@},
frame=@{level="4",args=[]@}]
(gdb)
-stack-list-arguments 1
^done,
stack-args=[
frame=@{level="0",args=[]@},
frame=@{level="1",
 args=[@{name="strarg",value="0x11940 \"A string argument.\""@}]@},
frame=@{level="2",args=[
@{name="intarg",value="2"@},
@{name="strarg",value="0x11940 \"A string argument.\""@}]@},
@{frame=@{level="3",args=[
@{name="intarg",value="2"@},
@{name="strarg",value="0x11940 \"A string argument.\""@},
@{name="fltarg",value="3.5"@}]@},
frame=@{level="4",args=[]@}]
(gdb)
-stack-list-arguments 0 2 2
^done,stack-args=[frame=@{level="2",args=[name="intarg",name="strarg"]@}]
(gdb)
-stack-list-arguments 1 2 2
^done,stack-args=[frame=@{level="2",
args=[@{name="intarg",value="2"@},
@{name="strarg",value="0x11940 \"A string argument.\""@}]@}]
(gdb)
@end smallexample

@c @subheading -stack-list-exception-handlers


@anchor{-stack-list-frames}
@subheading The @code{-stack-list-frames} Command
@findex -stack-list-frames

@subsubheading Synopsis

@smallexample
 -stack-list-frames [ --no-frame-filters @var{low-frame} @var{high-frame} ]
@end smallexample

List the frames currently on the stack.  For each frame it displays the
following info:

@table @samp
@item @var{level}
The frame number, 0 being the topmost frame, i.e., the innermost function.
@item @var{addr}
The @code{$pc} value for that frame.
@item @var{func}
Function name.
@item @var{file}
File name of the source file where the function lives.
@item @var{fullname}
The full file name of the source file where the function lives.
@item @var{line}
Line number corresponding to the @code{$pc}.
@item @var{from}
The shared library where this function is defined.  This is only given
if the frame's function is not known.
@end table

If invoked without arguments, this command prints a backtrace for the
whole stack.  If given two integer arguments, it shows the frames whose
levels are between the two arguments (inclusive).  If the two arguments
are equal, it shows the single frame at the corresponding level.  It is
an error if @var{low-frame} is larger than the actual number of
frames.  On the other hand, @var{high-frame} may be larger than the
actual number of frames, in which case only existing frames will be
returned.  If the option @code{--no-frame-filters} is supplied, then
Python frame filters will not be executed.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} commands are @samp{backtrace} and @samp{where}.

@subsubheading Example

Full stack backtrace:

@smallexample
(gdb)
-stack-list-frames
^done,stack=
[frame=@{level="0",addr="0x0001076c",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="11"@},
frame=@{level="1",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="2",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="3",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="4",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="5",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="6",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="7",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="8",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="9",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="10",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="11",addr="0x00010738",func="main",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="4"@}]
(gdb)
@end smallexample

Show frames between @var{low_frame} and @var{high_frame}:

@smallexample
(gdb)
-stack-list-frames 3 5
^done,stack=
[frame=@{level="3",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="4",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@},
frame=@{level="5",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@}]
(gdb)
@end smallexample

Show a single frame:

@smallexample
(gdb)
-stack-list-frames 3 3
^done,stack=
[frame=@{level="3",addr="0x000107a4",func="foo",
  file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"@}]
(gdb)
@end smallexample


@subheading The @code{-stack-list-locals} Command
@findex -stack-list-locals
@anchor{-stack-list-locals}

@subsubheading Synopsis

@smallexample
 -stack-list-locals [ --no-frame-filters ] [ --skip-unavailable ] @var{print-values}
@end smallexample

Display the local variable names for the selected frame.  If
@var{print-values} is 0 or @code{--no-values}, print only the names of
the variables; if it is 1 or @code{--all-values}, print also their
values; and if it is 2 or @code{--simple-values}, print the name,
type and value for simple data types, and the name and type for arrays,
structures and unions.  In this last case, a frontend can immediately
display the value of simple data types and create variable objects for
other data types when the user wishes to explore their values in
more detail.  If the option @code{--no-frame-filters} is supplied, then
Python frame filters will not be executed.

If the @code{--skip-unavailable} option is specified, local variables
that are not available are not listed.  Partially available local
variables are still displayed, however.

This command is deprecated in favor of the
@samp{-stack-list-variables} command.

@subsubheading @value{GDBN} Command

@samp{info locals} in @value{GDBN}, @samp{gdb_get_locals} in @code{gdbtk}.

@subsubheading Example

@smallexample
(gdb)
-stack-list-locals 0
^done,locals=[name="A",name="B",name="C"]
(gdb)
-stack-list-locals --all-values
^done,locals=[@{name="A",value="1"@},@{name="B",value="2"@},
  @{name="C",value="@{1, 2, 3@}"@}]
-stack-list-locals --simple-values
^done,locals=[@{name="A",type="int",value="1"@},
  @{name="B",type="int",value="2"@},@{name="C",type="int [3]"@}]
(gdb)
@end smallexample

@anchor{-stack-list-variables}
@subheading The @code{-stack-list-variables} Command
@findex -stack-list-variables

@subsubheading Synopsis

@smallexample
 -stack-list-variables [ --no-frame-filters ] [ --skip-unavailable ] @var{print-values}
@end smallexample

Display the names of local variables and function arguments for the selected frame.  If
@var{print-values} is 0 or @code{--no-values}, print only the names of
the variables; if it is 1 or @code{--all-values}, print also their
values; and if it is 2 or @code{--simple-values}, print the name,
type and value for simple data types, and the name and type for arrays,
structures and unions.  If the option @code{--no-frame-filters} is
supplied, then Python frame filters will not be executed.

If the @code{--skip-unavailable} option is specified, local variables
and arguments that are not available are not listed.  Partially
available arguments and local variables are still displayed, however.

@subsubheading Example

@smallexample
(gdb)
-stack-list-variables --thread 1 --frame 0 --all-values
^done,variables=[@{name="x",value="11"@},@{name="s",value="@{a = 1, b = 2@}"@}]
(gdb)
@end smallexample


@subheading The @code{-stack-select-frame} Command
@findex -stack-select-frame

@subsubheading Synopsis

@smallexample
 -stack-select-frame @var{framenum}
@end smallexample

Change the selected frame.  Select a different frame @var{framenum} on
the stack.

This command in deprecated in favor of passing the @samp{--frame}
option to every command.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} commands are @samp{frame}, @samp{up},
@samp{down}, @samp{select-frame}, @samp{up-silent}, and @samp{down-silent}.

@subsubheading Example

@smallexample
(gdb)
-stack-select-frame 2
^done
(gdb)
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Variable Objects
@section @sc{gdb/mi} Variable Objects

@ignore

@subheading Motivation for Variable Objects in @sc{gdb/mi}

For the implementation of a variable debugger window (locals, watched
expressions, etc.), we are proposing the adaptation of the existing code
used by @code{Insight}.

The two main reasons for that are:

@enumerate 1
@item
It has been proven in practice (it is already on its second generation).

@item
It will shorten development time (needless to say how important it is
now).
@end enumerate

The original interface was designed to be used by Tcl code, so it was
slightly changed so it could be used through @sc{gdb/mi}.  This section
describes the @sc{gdb/mi} operations that will be available and gives some
hints about their use.

@emph{Note}: In addition to the set of operations described here, we
expect the @sc{gui} implementation of a variable window to require, at
least, the following operations:

@itemize @bullet
@item @code{-gdb-show} @code{output-radix}
@item @code{-stack-list-arguments}
@item @code{-stack-list-locals}
@item @code{-stack-select-frame}
@end itemize

@end ignore

@subheading Introduction to Variable Objects

@cindex variable objects in @sc{gdb/mi}

Variable objects are "object-oriented" MI interface for examining and
changing values of expressions.  Unlike some other MI interfaces that
work with expressions, variable objects are specifically designed for
simple and efficient presentation in the frontend.  A variable object
is identified by string name.  When a variable object is created, the
frontend specifies the expression for that variable object.  The
expression can be a simple variable, or it can be an arbitrary complex
expression, and can even involve CPU registers.  After creating a
variable object, the frontend can invoke other variable object
operations---for example to obtain or change the value of a variable
object, or to change display format.

Variable objects have hierarchical tree structure.  Any variable object
that corresponds to a composite type, such as structure in C, has
a number of child variable objects, for example corresponding to each
element of a structure.  A child variable object can itself have 
children, recursively.  Recursion ends when we reach 
leaf variable objects, which always have built-in types.  Child variable
objects are created only by explicit request, so if a frontend 
is not interested in the children of a particular variable object, no
child will be created.

For a leaf variable object it is possible to obtain its value as a
string, or set the value from a string.  String value can be also
obtained for a non-leaf variable object, but it's generally a string
that only indicates the type of the object, and does not list its
contents.  Assignment to a non-leaf variable object is not allowed.
 
A frontend does not need to read the values of all variable objects each time
the program stops.  Instead, MI provides an update command that lists all
variable objects whose values has changed since the last update
operation.  This considerably reduces the amount of data that must
be transferred to the frontend.  As noted above, children variable
objects are created on demand, and only leaf variable objects have a
real value.  As result, gdb will read target memory only for leaf
variables that frontend has created.

The automatic update is not always desirable.  For example, a frontend
might want to keep a value of some expression for future reference,
and never update it.  For another example,  fetching memory is
relatively slow for embedded targets, so a frontend might want
to disable automatic update for the variables that are either not
visible on the screen, or ``closed''.  This is possible using so
called ``frozen variable objects''.  Such variable objects are never
implicitly updated.  

Variable objects can be either @dfn{fixed} or @dfn{floating}.  For the
fixed variable object, the expression is parsed when the variable
object is created, including associating identifiers to specific
variables.  The meaning of expression never changes.  For a floating
variable object the values of variables whose names appear in the
expressions are re-evaluated every time in the context of the current
frame.  Consider this example:

@smallexample
void do_work(...)
@{
        struct work_state state;

        if (...)
           do_work(...);
@}
@end smallexample

If a fixed variable object for the @code{state} variable is created in
this function, and we enter the recursive call, the variable
object will report the value of @code{state} in the top-level
@code{do_work} invocation.  On the other hand, a floating variable
object will report the value of @code{state} in the current frame.

If an expression specified when creating a fixed variable object
refers to a local variable, the variable object becomes bound to the
thread and frame in which the variable object is created.  When such
variable object is updated, @value{GDBN} makes sure that the
thread/frame combination the variable object is bound to still exists,
and re-evaluates the variable object in context of that thread/frame.

The following is the complete set of @sc{gdb/mi} operations defined to
access this functionality:

@multitable @columnfractions .4 .6
@item @strong{Operation}
@tab @strong{Description}

@item @code{-enable-pretty-printing}
@tab enable Python-based pretty-printing
@item @code{-var-create}
@tab create a variable object
@item @code{-var-delete}
@tab delete the variable object and/or its children
@item @code{-var-set-format}
@tab set the display format of this variable
@item @code{-var-show-format}
@tab show the display format of this variable
@item @code{-var-info-num-children}
@tab tells how many children this object has
@item @code{-var-list-children}
@tab return a list of the object's children
@item @code{-var-info-type}
@tab show the type of this variable object
@item @code{-var-info-expression}
@tab print parent-relative expression that this variable object represents
@item @code{-var-info-path-expression}
@tab print full expression that this variable object represents
@item @code{-var-show-attributes}
@tab is this variable editable? does it exist here?
@item @code{-var-evaluate-expression}
@tab get the value of this variable
@item @code{-var-assign}
@tab set the value of this variable
@item @code{-var-update}
@tab update the variable and its children
@item @code{-var-set-frozen}
@tab set frozeness attribute
@item @code{-var-set-update-range}
@tab set range of children to display on update
@end multitable

In the next subsection we describe each operation in detail and suggest
how it can be used.

@subheading Description And Use of Operations on Variable Objects

@subheading The @code{-enable-pretty-printing} Command
@findex -enable-pretty-printing

@smallexample
-enable-pretty-printing
@end smallexample

@value{GDBN} allows Python-based visualizers to affect the output of the
MI variable object commands.  However, because there was no way to
implement this in a fully backward-compatible way, a front end must
request that this functionality be enabled.

Once enabled, this feature cannot be disabled.

Note that if Python support has not been compiled into @value{GDBN},
this command will still succeed (and do nothing).

This feature is currently (as of @value{GDBN} 7.0) experimental, and
may work differently in future versions of @value{GDBN}.

@subheading The @code{-var-create} Command
@findex -var-create

@subsubheading Synopsis

@smallexample
 -var-create @{@var{name} | "-"@}
    @{@var{frame-addr} | "*" | "@@"@} @var{expression}
@end smallexample

This operation creates a variable object, which allows the monitoring of
a variable, the result of an expression, a memory cell or a CPU
register.

The @var{name} parameter is the string by which the object can be
referenced.  It must be unique.  If @samp{-} is specified, the varobj
system will generate a string ``varNNNNNN'' automatically.  It will be
unique provided that one does not specify @var{name} of that format.
The command fails if a duplicate name is found.

The frame under which the expression should be evaluated can be
specified by @var{frame-addr}.  A @samp{*} indicates that the current
frame should be used.  A @samp{@@} indicates that a floating variable
object must be created.

@var{expression} is any expression valid on the current language set (must not
begin with a @samp{*}), or one of the following:

@itemize @bullet
@item
@samp{*@var{addr}}, where @var{addr} is the address of a memory cell

@item
@samp{*@var{addr}-@var{addr}} --- a memory address range (TBD)

@item
@samp{$@var{regname}} --- a CPU register name
@end itemize

@cindex dynamic varobj
A varobj's contents may be provided by a Python-based pretty-printer.  In this
case the varobj is known as a @dfn{dynamic varobj}.  Dynamic varobjs
have slightly different semantics in some cases.  If the
@code{-enable-pretty-printing} command is not sent, then @value{GDBN}
will never create a dynamic varobj.  This ensures backward
compatibility for existing clients.

@subsubheading Result

This operation returns attributes of the newly-created varobj.  These
are:

@table @samp
@item name
The name of the varobj.

@item numchild
The number of children of the varobj.  This number is not necessarily
reliable for a dynamic varobj.  Instead, you must examine the
@samp{has_more} attribute.

@item value
The varobj's scalar value.  For a varobj whose type is some sort of
aggregate (e.g., a @code{struct}), or for a dynamic varobj, this value
will not be interesting.

@item type
The varobj's type.  This is a string representation of the type, as
would be printed by the @value{GDBN} CLI.  If @samp{print object}
(@pxref{Print Settings, set print object}) is set to @code{on}, the
@emph{actual} (derived) type of the object is shown rather than the
@emph{declared} one.

@item thread-id
If a variable object is bound to a specific thread, then this is the
thread's identifier.

@item has_more
For a dynamic varobj, this indicates whether there appear to be any
children available.  For a non-dynamic varobj, this will be 0.

@item dynamic
This attribute will be present and have the value @samp{1} if the
varobj is a dynamic varobj.  If the varobj is not a dynamic varobj,
then this attribute will not be present.

@item displayhint
A dynamic varobj can supply a display hint to the front end.  The
value comes directly from the Python pretty-printer object's
@code{display_hint} method.  @xref{Pretty Printing API}.
@end table

Typical output will look like this:

@smallexample
 name="@var{name}",numchild="@var{N}",type="@var{type}",thread-id="@var{M}",
  has_more="@var{has_more}"
@end smallexample


@subheading The @code{-var-delete} Command
@findex -var-delete

@subsubheading Synopsis

@smallexample
 -var-delete [ -c ] @var{name}
@end smallexample

Deletes a previously created variable object and all of its children.
With the @samp{-c} option, just deletes the children.

Returns an error if the object @var{name} is not found.


@subheading The @code{-var-set-format} Command
@findex -var-set-format

@subsubheading Synopsis

@smallexample
 -var-set-format @var{name} @var{format-spec}
@end smallexample

Sets the output format for the value of the object @var{name} to be
@var{format-spec}.

@anchor{-var-set-format}
The syntax for the @var{format-spec} is as follows:

@smallexample
 @var{format-spec} @expansion{}
 @{binary | decimal | hexadecimal | octal | natural@}
@end smallexample

The natural format is the default format choosen automatically
based on the variable type (like decimal for an @code{int}, hex
for pointers, etc.).

For a variable with children, the format is set only on the 
variable itself, and the children are not affected.  

@subheading The @code{-var-show-format} Command
@findex -var-show-format

@subsubheading Synopsis

@smallexample
 -var-show-format @var{name}
@end smallexample

Returns the format used to display the value of the object @var{name}.

@smallexample
 @var{format} @expansion{}
 @var{format-spec}
@end smallexample


@subheading The @code{-var-info-num-children} Command
@findex -var-info-num-children

@subsubheading Synopsis

@smallexample
 -var-info-num-children @var{name}
@end smallexample

Returns the number of children of a variable object @var{name}:

@smallexample
 numchild=@var{n}
@end smallexample

Note that this number is not completely reliable for a dynamic varobj.
It will return the current number of children, but more children may
be available.


@subheading The @code{-var-list-children} Command
@findex -var-list-children

@subsubheading Synopsis

@smallexample
 -var-list-children [@var{print-values}] @var{name} [@var{from} @var{to}]
@end smallexample
@anchor{-var-list-children}

Return a list of the children of the specified variable object and
create variable objects for them, if they do not already exist.  With
a single argument or if @var{print-values} has a value of 0 or
@code{--no-values}, print only the names of the variables; if
@var{print-values} is 1 or @code{--all-values}, also print their
values; and if it is 2 or @code{--simple-values} print the name and
value for simple data types and just the name for arrays, structures
and unions.

@var{from} and @var{to}, if specified, indicate the range of children
to report.  If @var{from} or @var{to} is less than zero, the range is
reset and all children will be reported.  Otherwise, children starting
at @var{from} (zero-based) and up to and excluding @var{to} will be
reported.

If a child range is requested, it will only affect the current call to
@code{-var-list-children}, but not future calls to @code{-var-update}.
For this, you must instead use @code{-var-set-update-range}.  The
intent of this approach is to enable a front end to implement any
update approach it likes; for example, scrolling a view may cause the
front end to request more children with @code{-var-list-children}, and
then the front end could call @code{-var-set-update-range} with a
different range to ensure that future updates are restricted to just
the visible items.

For each child the following results are returned:

@table @var

@item name
Name of the variable object created for this child.

@item exp
The expression to be shown to the user by the front end to designate this child.
For example this may be the name of a structure member.

For a dynamic varobj, this value cannot be used to form an
expression.  There is no way to do this at all with a dynamic varobj.

For C/C@t{++} structures there are several pseudo children returned to
designate access qualifiers.  For these pseudo children @var{exp} is
@samp{public}, @samp{private}, or @samp{protected}.  In this case the
type and value are not present.

A dynamic varobj will not report the access qualifying
pseudo-children, regardless of the language.  This information is not
available at all with a dynamic varobj.

@item numchild
Number of children this child has.  For a dynamic varobj, this will be
0.

@item type
The type of the child.  If @samp{print object}
(@pxref{Print Settings, set print object}) is set to @code{on}, the
@emph{actual} (derived) type of the object is shown rather than the
@emph{declared} one.

@item value
If values were requested, this is the value.

@item thread-id
If this variable object is associated with a thread, this is the thread id.  
Otherwise this result is not present.

@item frozen
If the variable object is frozen, this variable will be present with a value of 1.

@item displayhint
A dynamic varobj can supply a display hint to the front end.  The
value comes directly from the Python pretty-printer object's
@code{display_hint} method.  @xref{Pretty Printing API}.

@item dynamic
This attribute will be present and have the value @samp{1} if the
varobj is a dynamic varobj.  If the varobj is not a dynamic varobj,
then this attribute will not be present.

@end table

The result may have its own attributes:

@table @samp
@item displayhint
A dynamic varobj can supply a display hint to the front end.  The
value comes directly from the Python pretty-printer object's
@code{display_hint} method.  @xref{Pretty Printing API}.

@item has_more
This is an integer attribute which is nonzero if there are children
remaining after the end of the selected range.
@end table

@subsubheading Example

@smallexample
(gdb)
 -var-list-children n
 ^done,numchild=@var{n},children=[child=@{name=@var{name},exp=@var{exp},
 numchild=@var{n},type=@var{type}@},@r{(repeats N times)}]
(gdb)
 -var-list-children --all-values n
 ^done,numchild=@var{n},children=[child=@{name=@var{name},exp=@var{exp},
 numchild=@var{n},value=@var{value},type=@var{type}@},@r{(repeats N times)}]
@end smallexample


@subheading The @code{-var-info-type} Command
@findex -var-info-type

@subsubheading Synopsis

@smallexample
 -var-info-type @var{name}
@end smallexample

Returns the type of the specified variable @var{name}.  The type is
returned as a string in the same format as it is output by the
@value{GDBN} CLI:

@smallexample
 type=@var{typename}
@end smallexample


@subheading The @code{-var-info-expression} Command
@findex -var-info-expression

@subsubheading Synopsis

@smallexample
 -var-info-expression @var{name}
@end smallexample

Returns a string that is suitable for presenting this
variable object in user interface.  The string is generally
not valid expression in the current language, and cannot be evaluated.

For example, if @code{a} is an array, and variable object
@code{A} was created for @code{a}, then we'll get this output:

@smallexample
(gdb) -var-info-expression A.1
^done,lang="C",exp="1"
@end smallexample

@noindent
Here, the value of @code{lang} is the language name, which can be
found in @ref{Supported Languages}.

Note that the output of the @code{-var-list-children} command also
includes those expressions, so the @code{-var-info-expression} command
is of limited use.

@subheading The @code{-var-info-path-expression} Command
@findex -var-info-path-expression

@subsubheading Synopsis

@smallexample
 -var-info-path-expression @var{name}
@end smallexample

Returns an expression that can be evaluated in the current
context and will yield the same value that a variable object has.
Compare this with the @code{-var-info-expression} command, which
result can be used only for UI presentation.  Typical use of
the @code{-var-info-path-expression} command is creating a 
watchpoint from a variable object.

This command is currently not valid for children of a dynamic varobj,
and will give an error when invoked on one.

For example, suppose @code{C} is a C@t{++} class, derived from class
@code{Base}, and that the @code{Base} class has a member called
@code{m_size}.  Assume a variable @code{c} is has the type of
@code{C} and a variable object @code{C} was created for variable
@code{c}.  Then, we'll get this output:
@smallexample
(gdb) -var-info-path-expression C.Base.public.m_size
^done,path_expr=((Base)c).m_size)
@end smallexample

@subheading The @code{-var-show-attributes} Command
@findex -var-show-attributes

@subsubheading Synopsis

@smallexample
 -var-show-attributes @var{name}
@end smallexample

List attributes of the specified variable object @var{name}:

@smallexample
 status=@var{attr} [ ( ,@var{attr} )* ]
@end smallexample

@noindent
where @var{attr} is @code{@{ @{ editable | noneditable @} | TBD @}}.

@subheading The @code{-var-evaluate-expression} Command
@findex -var-evaluate-expression

@subsubheading Synopsis

@smallexample
 -var-evaluate-expression [-f @var{format-spec}] @var{name}
@end smallexample

Evaluates the expression that is represented by the specified variable
object and returns its value as a string.  The format of the string
can be specified with the @samp{-f} option.  The possible values of 
this option are the same as for @code{-var-set-format} 
(@pxref{-var-set-format}).  If the @samp{-f} option is not specified,
the current display format will be used.  The current display format 
can be changed using the @code{-var-set-format} command.

@smallexample
 value=@var{value}
@end smallexample

Note that one must invoke @code{-var-list-children} for a variable
before the value of a child variable can be evaluated.

@subheading The @code{-var-assign} Command
@findex -var-assign

@subsubheading Synopsis

@smallexample
 -var-assign @var{name} @var{expression}
@end smallexample

Assigns the value of @var{expression} to the variable object specified
by @var{name}.  The object must be @samp{editable}.  If the variable's
value is altered by the assign, the variable will show up in any
subsequent @code{-var-update} list.

@subsubheading Example

@smallexample
(gdb)
-var-assign var1 3
^done,value="3"
(gdb)
-var-update *
^done,changelist=[@{name="var1",in_scope="true",type_changed="false"@}]
(gdb)
@end smallexample

@subheading The @code{-var-update} Command
@findex -var-update

@subsubheading Synopsis

@smallexample
 -var-update [@var{print-values}] @{@var{name} | "*"@}
@end smallexample

Reevaluate the expressions corresponding to the variable object
@var{name} and all its direct and indirect children, and return the
list of variable objects whose values have changed; @var{name} must
be a root variable object.  Here, ``changed'' means that the result of
@code{-var-evaluate-expression} before and after the
@code{-var-update} is different.  If @samp{*} is used as the variable
object names, all existing variable objects are updated, except
for frozen ones (@pxref{-var-set-frozen}).  The option
@var{print-values} determines whether both names and values, or just
names are printed.  The possible values of this option are the same
as for @code{-var-list-children} (@pxref{-var-list-children}).  It is
recommended to use the @samp{--all-values} option, to reduce the
number of MI commands needed on each program stop.

With the @samp{*} parameter, if a variable object is bound to a
currently running thread, it will not be updated, without any
diagnostic.

If @code{-var-set-update-range} was previously used on a varobj, then
only the selected range of children will be reported.

@code{-var-update} reports all the changed varobjs in a tuple named
@samp{changelist}.

Each item in the change list is itself a tuple holding:

@table @samp
@item name
The name of the varobj.

@item value
If values were requested for this update, then this field will be
present and will hold the value of the varobj.

@item in_scope
@anchor{-var-update}
This field is a string which may take one of three values:

@table @code
@item "true"
The variable object's current value is valid.

@item "false"
The variable object does not currently hold a valid value but it may
hold one in the future if its associated expression comes back into
scope.

@item "invalid"
The variable object no longer holds a valid value.
This can occur when the executable file being debugged has changed,
either through recompilation or by using the @value{GDBN} @code{file}
command.  The front end should normally choose to delete these variable
objects.
@end table

In the future new values may be added to this list so the front should
be prepared for this possibility.  @xref{GDB/MI Development and Front Ends, ,@sc{GDB/MI} Development and Front Ends}.

@item type_changed
This is only present if the varobj is still valid.  If the type
changed, then this will be the string @samp{true}; otherwise it will
be @samp{false}.

When a varobj's type changes, its children are also likely to have
become incorrect.  Therefore, the varobj's children are automatically
deleted when this attribute is @samp{true}.  Also, the varobj's update
range, when set using the @code{-var-set-update-range} command, is
unset.

@item new_type
If the varobj's type changed, then this field will be present and will
hold the new type.

@item new_num_children
For a dynamic varobj, if the number of children changed, or if the
type changed, this will be the new number of children.

The @samp{numchild} field in other varobj responses is generally not
valid for a dynamic varobj -- it will show the number of children that
@value{GDBN} knows about, but because dynamic varobjs lazily
instantiate their children, this will not reflect the number of
children which may be available.

The @samp{new_num_children} attribute only reports changes to the
number of children known by @value{GDBN}.  This is the only way to
detect whether an update has removed children (which necessarily can
only happen at the end of the update range).

@item displayhint
The display hint, if any.

@item has_more
This is an integer value, which will be 1 if there are more children
available outside the varobj's update range.

@item dynamic
This attribute will be present and have the value @samp{1} if the
varobj is a dynamic varobj.  If the varobj is not a dynamic varobj,
then this attribute will not be present.

@item new_children
If new children were added to a dynamic varobj within the selected
update range (as set by @code{-var-set-update-range}), then they will
be listed in this attribute.
@end table

@subsubheading Example

@smallexample
(gdb)
-var-assign var1 3
^done,value="3"
(gdb)
-var-update --all-values var1
^done,changelist=[@{name="var1",value="3",in_scope="true",
type_changed="false"@}]
(gdb)
@end smallexample

@subheading The @code{-var-set-frozen} Command
@findex -var-set-frozen
@anchor{-var-set-frozen}

@subsubheading Synopsis

@smallexample
 -var-set-frozen @var{name} @var{flag}
@end smallexample

Set the frozenness flag on the variable object @var{name}.  The
@var{flag} parameter should be either @samp{1} to make the variable
frozen or @samp{0} to make it unfrozen.  If a variable object is
frozen, then neither itself, nor any of its children, are 
implicitly updated by @code{-var-update} of 
a parent variable or by @code{-var-update *}.  Only
@code{-var-update} of the variable itself will update its value and
values of its children.  After a variable object is unfrozen, it is
implicitly updated by all subsequent @code{-var-update} operations.  
Unfreezing a variable does not update it, only subsequent
@code{-var-update} does.

@subsubheading Example

@smallexample
(gdb)
-var-set-frozen V 1
^done
(gdb)
@end smallexample

@subheading The @code{-var-set-update-range} command
@findex -var-set-update-range
@anchor{-var-set-update-range}

@subsubheading Synopsis

@smallexample
 -var-set-update-range @var{name} @var{from} @var{to}
@end smallexample

Set the range of children to be returned by future invocations of
@code{-var-update}.

@var{from} and @var{to} indicate the range of children to report.  If
@var{from} or @var{to} is less than zero, the range is reset and all
children will be reported.  Otherwise, children starting at @var{from}
(zero-based) and up to and excluding @var{to} will be reported.

@subsubheading Example

@smallexample
(gdb)
-var-set-update-range V 1 2
^done
@end smallexample

@subheading The @code{-var-set-visualizer} command
@findex -var-set-visualizer
@anchor{-var-set-visualizer}

@subsubheading Synopsis

@smallexample
 -var-set-visualizer @var{name} @var{visualizer}
@end smallexample

Set a visualizer for the variable object @var{name}.

@var{visualizer} is the visualizer to use.  The special value
@samp{None} means to disable any visualizer in use.

If not @samp{None}, @var{visualizer} must be a Python expression.
This expression must evaluate to a callable object which accepts a
single argument.  @value{GDBN} will call this object with the value of
the varobj @var{name} as an argument (this is done so that the same
Python pretty-printing code can be used for both the CLI and MI).
When called, this object must return an object which conforms to the
pretty-printing interface (@pxref{Pretty Printing API}).

The pre-defined function @code{gdb.default_visualizer} may be used to
select a visualizer by following the built-in process
(@pxref{Selecting Pretty-Printers}).  This is done automatically when
a varobj is created, and so ordinarily is not needed.

This feature is only available if Python support is enabled.  The MI
command @code{-list-features} (@pxref{GDB/MI Support Commands})
can be used to check this.

@subsubheading Example

Resetting the visualizer:

@smallexample
(gdb)
-var-set-visualizer V None
^done
@end smallexample

Reselecting the default (type-based) visualizer:

@smallexample
(gdb)
-var-set-visualizer V gdb.default_visualizer
^done
@end smallexample

Suppose @code{SomeClass} is a visualizer class.  A lambda expression
can be used to instantiate this class for a varobj:

@smallexample
(gdb)
-var-set-visualizer V "lambda val: SomeClass()"
^done
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Data Manipulation
@section @sc{gdb/mi} Data Manipulation

@cindex data manipulation, in @sc{gdb/mi}
@cindex @sc{gdb/mi}, data manipulation
This section describes the @sc{gdb/mi} commands that manipulate data:
examine memory and registers, evaluate expressions, etc.

@c REMOVED FROM THE INTERFACE.
@c @subheading -data-assign
@c Change the value of a program variable. Plenty of side effects.
@c @subsubheading GDB Command
@c set variable
@c @subsubheading Example
@c N.A.

@subheading The @code{-data-disassemble} Command
@findex -data-disassemble

@subsubheading Synopsis

@smallexample
 -data-disassemble
    [ -s @var{start-addr} -e @var{end-addr} ]
  | [ -f @var{filename} -l @var{linenum} [ -n @var{lines} ] ]
  -- @var{mode}
@end smallexample

@noindent
Where:

@table @samp
@item @var{start-addr}
is the beginning address (or @code{$pc})
@item @var{end-addr}
is the end address
@item @var{filename}
is the name of the file to disassemble
@item @var{linenum}
is the line number to disassemble around
@item @var{lines}
is the number of disassembly lines to be produced.  If it is -1,
the whole function will be disassembled, in case no @var{end-addr} is
specified.  If @var{end-addr} is specified as a non-zero value, and
@var{lines} is lower than the number of disassembly lines between
@var{start-addr} and @var{end-addr}, only @var{lines} lines are
displayed; if @var{lines} is higher than the number of lines between
@var{start-addr} and @var{end-addr}, only the lines up to @var{end-addr}
are displayed.
@item @var{mode}
is either 0 (meaning only disassembly), 1 (meaning mixed source and
disassembly), 2 (meaning disassembly with raw opcodes), or 3 (meaning
mixed source and disassembly with raw opcodes).
@end table

@subsubheading Result

The result of the @code{-data-disassemble} command will be a list named
@samp{asm_insns}, the contents of this list depend on the @var{mode}
used with the @code{-data-disassemble} command.

For modes 0 and 2 the @samp{asm_insns} list contains tuples with the
following fields:

@table @code
@item address
The address at which this instruction was disassembled.

@item func-name
The name of the function this instruction is within.

@item offset
The decimal offset in bytes from the start of @samp{func-name}.

@item inst
The text disassembly for this @samp{address}.

@item opcodes
This field is only present for mode 2.  This contains the raw opcode
bytes for the @samp{inst} field.

@end table

For modes 1 and 3 the @samp{asm_insns} list contains tuples named
@samp{src_and_asm_line}, each of which has the following fields:

@table @code
@item line
The line number within @samp{file}.

@item file
The file name from the compilation unit.  This might be an absolute
file name or a relative file name depending on the compile command
used.

@item fullname
Absolute file name of @samp{file}.  It is converted to a canonical form
using the source file search path
(@pxref{Source Path, ,Specifying Source Directories})
and after resolving all the symbolic links.

If the source file is not found this field will contain the path as
present in the debug information.

@item line_asm_insn
This is a list of tuples containing the disassembly for @samp{line} in
@samp{file}.  The fields of each tuple are the same as for
@code{-data-disassemble} in @var{mode} 0 and 2, so @samp{address},
@samp{func-name}, @samp{offset}, @samp{inst}, and optionally
@samp{opcodes}.

@end table

Note that whatever included in the @samp{inst} field, is not
manipulated directly by @sc{gdb/mi}, i.e., it is not possible to
adjust its format.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{disassemble}.

@subsubheading Example

Disassemble from the current value of @code{$pc} to @code{$pc + 20}:

@smallexample
(gdb)
-data-disassemble -s $pc -e "$pc + 20" -- 0
^done,
asm_insns=[
@{address="0x000107c0",func-name="main",offset="4",
inst="mov  2, %o0"@},
@{address="0x000107c4",func-name="main",offset="8",
inst="sethi  %hi(0x11800), %o2"@},
@{address="0x000107c8",func-name="main",offset="12",
inst="or  %o2, 0x140, %o1\t! 0x11940 <_lib_version+8>"@},
@{address="0x000107cc",func-name="main",offset="16",
inst="sethi  %hi(0x11800), %o2"@},
@{address="0x000107d0",func-name="main",offset="20",
inst="or  %o2, 0x168, %o4\t! 0x11968 <_lib_version+48>"@}]
(gdb)
@end smallexample

Disassemble the whole @code{main} function.  Line 32 is part of
@code{main}.

@smallexample
-data-disassemble -f basics.c -l 32 -- 0
^done,asm_insns=[
@{address="0x000107bc",func-name="main",offset="0",
inst="save  %sp, -112, %sp"@},
@{address="0x000107c0",func-name="main",offset="4",
inst="mov   2, %o0"@},
@{address="0x000107c4",func-name="main",offset="8",
inst="sethi %hi(0x11800), %o2"@},
[@dots{}]
@{address="0x0001081c",func-name="main",offset="96",inst="ret "@},
@{address="0x00010820",func-name="main",offset="100",inst="restore "@}]
(gdb)
@end smallexample

Disassemble 3 instructions from the start of @code{main}:

@smallexample
(gdb)
-data-disassemble -f basics.c -l 32 -n 3 -- 0
^done,asm_insns=[
@{address="0x000107bc",func-name="main",offset="0",
inst="save  %sp, -112, %sp"@},
@{address="0x000107c0",func-name="main",offset="4",
inst="mov  2, %o0"@},
@{address="0x000107c4",func-name="main",offset="8",
inst="sethi  %hi(0x11800), %o2"@}]
(gdb)
@end smallexample

Disassemble 3 instructions from the start of @code{main} in mixed mode:

@smallexample
(gdb)
-data-disassemble -f basics.c -l 32 -n 3 -- 1
^done,asm_insns=[
src_and_asm_line=@{line="31",
file="../../../src/gdb/testsuite/gdb.mi/basics.c",
fullname="/absolute/path/to/src/gdb/testsuite/gdb.mi/basics.c",
line_asm_insn=[@{address="0x000107bc",
func-name="main",offset="0",inst="save  %sp, -112, %sp"@}]@},
src_and_asm_line=@{line="32",
file="../../../src/gdb/testsuite/gdb.mi/basics.c",
fullname="/absolute/path/to/src/gdb/testsuite/gdb.mi/basics.c",
line_asm_insn=[@{address="0x000107c0",
func-name="main",offset="4",inst="mov  2, %o0"@},
@{address="0x000107c4",func-name="main",offset="8",
inst="sethi  %hi(0x11800), %o2"@}]@}]
(gdb)
@end smallexample


@subheading The @code{-data-evaluate-expression} Command
@findex -data-evaluate-expression

@subsubheading Synopsis

@smallexample
 -data-evaluate-expression @var{expr}
@end smallexample

Evaluate @var{expr} as an expression.  The expression could contain an
inferior function call.  The function call will execute synchronously.
If the expression contains spaces, it must be enclosed in double quotes.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} commands are @samp{print}, @samp{output}, and
@samp{call}.  In @code{gdbtk} only, there's a corresponding
@samp{gdb_eval} command.

@subsubheading Example

In the following example, the numbers that precede the commands are the
@dfn{tokens} described in @ref{GDB/MI Command Syntax, ,@sc{gdb/mi}
Command Syntax}.  Notice how @sc{gdb/mi} returns the same tokens in its
output.

@smallexample
211-data-evaluate-expression A
211^done,value="1"
(gdb)
311-data-evaluate-expression &A
311^done,value="0xefffeb7c"
(gdb)
411-data-evaluate-expression A+3
411^done,value="4"
(gdb)
511-data-evaluate-expression "A + 3"
511^done,value="4"
(gdb)
@end smallexample


@subheading The @code{-data-list-changed-registers} Command
@findex -data-list-changed-registers

@subsubheading Synopsis

@smallexample
 -data-list-changed-registers
@end smallexample

Display a list of the registers that have changed.

@subsubheading @value{GDBN} Command

@value{GDBN} doesn't have a direct analog for this command; @code{gdbtk}
has the corresponding command @samp{gdb_changed_register_list}.

@subsubheading Example

On a PPC MBX board:

@smallexample
(gdb)
-exec-continue
^running

(gdb)
*stopped,reason="breakpoint-hit",disp="keep",bkptno="1",frame=@{
func="main",args=[],file="try.c",fullname="/home/foo/bar/try.c",
line="5"@}
(gdb)
-data-list-changed-registers
^done,changed-registers=["0","1","2","4","5","6","7","8","9",
"10","11","13","14","15","16","17","18","19","20","21","22","23",
"24","25","26","27","28","30","31","64","65","66","67","69"]
(gdb)
@end smallexample


@subheading The @code{-data-list-register-names} Command
@findex -data-list-register-names

@subsubheading Synopsis

@smallexample
 -data-list-register-names [ ( @var{regno} )+ ]
@end smallexample

Show a list of register names for the current target.  If no arguments
are given, it shows a list of the names of all the registers.  If
integer numbers are given as arguments, it will print a list of the
names of the registers corresponding to the arguments.  To ensure
consistency between a register name and its number, the output list may
include empty register names.

@subsubheading @value{GDBN} Command

@value{GDBN} does not have a command which corresponds to
@samp{-data-list-register-names}.  In @code{gdbtk} there is a
corresponding command @samp{gdb_regnames}.

@subsubheading Example

For the PPC MBX board:
@smallexample
(gdb)
-data-list-register-names
^done,register-names=["r0","r1","r2","r3","r4","r5","r6","r7",
"r8","r9","r10","r11","r12","r13","r14","r15","r16","r17","r18",
"r19","r20","r21","r22","r23","r24","r25","r26","r27","r28","r29",
"r30","r31","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9",
"f10","f11","f12","f13","f14","f15","f16","f17","f18","f19","f20",
"f21","f22","f23","f24","f25","f26","f27","f28","f29","f30","f31",
"", "pc","ps","cr","lr","ctr","xer"]
(gdb)
-data-list-register-names 1 2 3
^done,register-names=["r1","r2","r3"]
(gdb)
@end smallexample

@subheading The @code{-data-list-register-values} Command
@findex -data-list-register-values

@subsubheading Synopsis

@smallexample
 -data-list-register-values
    [ @code{--skip-unavailable} ] @var{fmt} [ ( @var{regno} )*]
@end smallexample

Display the registers' contents.  The format according to which the
registers' contents are to be returned is given by @var{fmt}, followed
by an optional list of numbers specifying the registers to display.  A
missing list of numbers indicates that the contents of all the
registers must be returned.  The @code{--skip-unavailable} option
indicates that only the available registers are to be returned.

Allowed formats for @var{fmt} are:

@table @code
@item x
Hexadecimal
@item o
Octal
@item t
Binary
@item d
Decimal
@item r
Raw
@item N
Natural
@end table

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} commands are @samp{info reg}, @samp{info
all-reg}, and (in @code{gdbtk}) @samp{gdb_fetch_registers}.

@subsubheading Example

For a PPC MBX board (note: line breaks are for readability only, they
don't appear in the actual output):

@smallexample
(gdb)
-data-list-register-values r 64 65
^done,register-values=[@{number="64",value="0xfe00a300"@},
@{number="65",value="0x00029002"@}]
(gdb)
-data-list-register-values x
^done,register-values=[@{number="0",value="0xfe0043c8"@},
@{number="1",value="0x3fff88"@},@{number="2",value="0xfffffffe"@},
@{number="3",value="0x0"@},@{number="4",value="0xa"@},
@{number="5",value="0x3fff68"@},@{number="6",value="0x3fff58"@},
@{number="7",value="0xfe011e98"@},@{number="8",value="0x2"@},
@{number="9",value="0xfa202820"@},@{number="10",value="0xfa202808"@},
@{number="11",value="0x1"@},@{number="12",value="0x0"@},
@{number="13",value="0x4544"@},@{number="14",value="0xffdfffff"@},
@{number="15",value="0xffffffff"@},@{number="16",value="0xfffffeff"@},
@{number="17",value="0xefffffed"@},@{number="18",value="0xfffffffe"@},
@{number="19",value="0xffffffff"@},@{number="20",value="0xffffffff"@},
@{number="21",value="0xffffffff"@},@{number="22",value="0xfffffff7"@},
@{number="23",value="0xffffffff"@},@{number="24",value="0xffffffff"@},
@{number="25",value="0xffffffff"@},@{number="26",value="0xfffffffb"@},
@{number="27",value="0xffffffff"@},@{number="28",value="0xf7bfffff"@},
@{number="29",value="0x0"@},@{number="30",value="0xfe010000"@},
@{number="31",value="0x0"@},@{number="32",value="0x0"@},
@{number="33",value="0x0"@},@{number="34",value="0x0"@},
@{number="35",value="0x0"@},@{number="36",value="0x0"@},
@{number="37",value="0x0"@},@{number="38",value="0x0"@},
@{number="39",value="0x0"@},@{number="40",value="0x0"@},
@{number="41",value="0x0"@},@{number="42",value="0x0"@},
@{number="43",value="0x0"@},@{number="44",value="0x0"@},
@{number="45",value="0x0"@},@{number="46",value="0x0"@},
@{number="47",value="0x0"@},@{number="48",value="0x0"@},
@{number="49",value="0x0"@},@{number="50",value="0x0"@},
@{number="51",value="0x0"@},@{number="52",value="0x0"@},
@{number="53",value="0x0"@},@{number="54",value="0x0"@},
@{number="55",value="0x0"@},@{number="56",value="0x0"@},
@{number="57",value="0x0"@},@{number="58",value="0x0"@},
@{number="59",value="0x0"@},@{number="60",value="0x0"@},
@{number="61",value="0x0"@},@{number="62",value="0x0"@},
@{number="63",value="0x0"@},@{number="64",value="0xfe00a300"@},
@{number="65",value="0x29002"@},@{number="66",value="0x202f04b5"@},
@{number="67",value="0xfe0043b0"@},@{number="68",value="0xfe00b3e4"@},
@{number="69",value="0x20002b03"@}]
(gdb)
@end smallexample


@subheading The @code{-data-read-memory} Command
@findex -data-read-memory

This command is deprecated, use @code{-data-read-memory-bytes} instead.

@subsubheading Synopsis

@smallexample
 -data-read-memory [ -o @var{byte-offset} ]
   @var{address} @var{word-format} @var{word-size}
   @var{nr-rows} @var{nr-cols} [ @var{aschar} ]
@end smallexample

@noindent
where:

@table @samp
@item @var{address}
An expression specifying the address of the first memory word to be
read.  Complex expressions containing embedded white space should be
quoted using the C convention.

@item @var{word-format}
The format to be used to print the memory words.  The notation is the
same as for @value{GDBN}'s @code{print} command (@pxref{Output Formats,
,Output Formats}).

@item @var{word-size}
The size of each memory word in bytes.

@item @var{nr-rows}
The number of rows in the output table.

@item @var{nr-cols}
The number of columns in the output table.

@item @var{aschar}
If present, indicates that each row should include an @sc{ascii} dump.  The
value of @var{aschar} is used as a padding character when a byte is not a
member of the printable @sc{ascii} character set (printable @sc{ascii}
characters are those whose code is between 32 and 126, inclusively).

@item @var{byte-offset}
An offset to add to the @var{address} before fetching memory.
@end table

This command displays memory contents as a table of @var{nr-rows} by
@var{nr-cols} words, each word being @var{word-size} bytes.  In total,
@code{@var{nr-rows} * @var{nr-cols} * @var{word-size}} bytes are read
(returned as @samp{total-bytes}).  Should less than the requested number
of bytes be returned by the target, the missing words are identified
using @samp{N/A}.  The number of bytes read from the target is returned
in @samp{nr-bytes} and the starting address used to read memory in
@samp{addr}.

The address of the next/previous row or page is available in
@samp{next-row} and @samp{prev-row}, @samp{next-page} and
@samp{prev-page}.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{x}.  @code{gdbtk} has
@samp{gdb_get_mem} memory read command.

@subsubheading Example

Read six bytes of memory starting at @code{bytes+6} but then offset by
@code{-6} bytes.  Format as three rows of two columns.  One byte per
word.  Display each word in hex.

@smallexample
(gdb)
9-data-read-memory -o -6 -- bytes+6 x 1 3 2
9^done,addr="0x00001390",nr-bytes="6",total-bytes="6",
next-row="0x00001396",prev-row="0x0000138e",next-page="0x00001396",
prev-page="0x0000138a",memory=[
@{addr="0x00001390",data=["0x00","0x01"]@},
@{addr="0x00001392",data=["0x02","0x03"]@},
@{addr="0x00001394",data=["0x04","0x05"]@}]
(gdb)
@end smallexample

Read two bytes of memory starting at address @code{shorts + 64} and
display as a single word formatted in decimal.

@smallexample
(gdb)
5-data-read-memory shorts+64 d 2 1 1
5^done,addr="0x00001510",nr-bytes="2",total-bytes="2",
next-row="0x00001512",prev-row="0x0000150e",
next-page="0x00001512",prev-page="0x0000150e",memory=[
@{addr="0x00001510",data=["128"]@}]
(gdb)
@end smallexample

Read thirty two bytes of memory starting at @code{bytes+16} and format
as eight rows of four columns.  Include a string encoding with @samp{x}
used as the non-printable character.

@smallexample
(gdb)
4-data-read-memory bytes+16 x 1 8 4 x
4^done,addr="0x000013a0",nr-bytes="32",total-bytes="32",
next-row="0x000013c0",prev-row="0x0000139c",
next-page="0x000013c0",prev-page="0x00001380",memory=[
@{addr="0x000013a0",data=["0x10","0x11","0x12","0x13"],ascii="xxxx"@},
@{addr="0x000013a4",data=["0x14","0x15","0x16","0x17"],ascii="xxxx"@},
@{addr="0x000013a8",data=["0x18","0x19","0x1a","0x1b"],ascii="xxxx"@},
@{addr="0x000013ac",data=["0x1c","0x1d","0x1e","0x1f"],ascii="xxxx"@},
@{addr="0x000013b0",data=["0x20","0x21","0x22","0x23"],ascii=" !\"#"@},
@{addr="0x000013b4",data=["0x24","0x25","0x26","0x27"],ascii="$%&'"@},
@{addr="0x000013b8",data=["0x28","0x29","0x2a","0x2b"],ascii="()*+"@},
@{addr="0x000013bc",data=["0x2c","0x2d","0x2e","0x2f"],ascii=",-./"@}]
(gdb)
@end smallexample

@subheading The @code{-data-read-memory-bytes} Command
@findex -data-read-memory-bytes

@subsubheading Synopsis

@smallexample
 -data-read-memory-bytes [ -o @var{byte-offset} ]
   @var{address} @var{count}
@end smallexample

@noindent
where:

@table @samp
@item @var{address}
An expression specifying the address of the first memory word to be
read.  Complex expressions containing embedded white space should be
quoted using the C convention.

@item @var{count}
The number of bytes to read.  This should be an integer literal.

@item @var{byte-offset}
The offsets in bytes relative to @var{address} at which to start
reading.  This should be an integer literal.  This option is provided
so that a frontend is not required to first evaluate address and then
perform address arithmetics itself.

@end table

This command attempts to read all accessible memory regions in the
specified range.  First, all regions marked as unreadable in the memory
map (if one is defined) will be skipped.  @xref{Memory Region
Attributes}.  Second, @value{GDBN} will attempt to read the remaining
regions.  For each one, if reading full region results in an errors,
@value{GDBN} will try to read a subset of the region.

In general, every single byte in the region may be readable or not,
and the only way to read every readable byte is to try a read at
every address, which is not practical.   Therefore, @value{GDBN} will
attempt to read all accessible bytes at either beginning or the end
of the region, using a binary division scheme.  This heuristic works
well for reading accross a memory map boundary.  Note that if a region
has a readable range that is neither at the beginning or the end,
@value{GDBN} will not read it.

The result record (@pxref{GDB/MI Result Records}) that is output of
the command includes a field named @samp{memory} whose content is a
list of tuples.  Each tuple represent a successfully read memory block
and has the following fields:

@table @code
@item begin
The start address of the memory block, as hexadecimal literal.

@item end
The end address of the memory block, as hexadecimal literal.

@item offset
The offset of the memory block, as hexadecimal literal, relative to
the start address passed to @code{-data-read-memory-bytes}.

@item contents
The contents of the memory block, in hex.

@end table



@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{x}.

@subsubheading Example

@smallexample
(gdb)
-data-read-memory-bytes &a 10
^done,memory=[@{begin="0xbffff154",offset="0x00000000",
              end="0xbffff15e",
              contents="01000000020000000300"@}]
(gdb)
@end smallexample


@subheading The @code{-data-write-memory-bytes} Command
@findex -data-write-memory-bytes

@subsubheading Synopsis

@smallexample
 -data-write-memory-bytes @var{address} @var{contents}
 -data-write-memory-bytes @var{address} @var{contents} @r{[}@var{count}@r{]}
@end smallexample

@noindent
where:

@table @samp
@item @var{address}
An expression specifying the address of the first memory word to be
read.  Complex expressions containing embedded white space should be
quoted using the C convention.

@item @var{contents}
The hex-encoded bytes to write.

@item @var{count}
Optional argument indicating the number of bytes to be written.  If @var{count} 
is greater than @var{contents}' length, @value{GDBN} will repeatedly 
write @var{contents} until it fills @var{count} bytes.

@end table

@subsubheading @value{GDBN} Command

There's no corresponding @value{GDBN} command.

@subsubheading Example

@smallexample
(gdb)
-data-write-memory-bytes &a "aabbccdd"
^done
(gdb)
@end smallexample

@smallexample
(gdb)
-data-write-memory-bytes &a "aabbccdd" 16e
^done
(gdb)
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Tracepoint Commands
@section @sc{gdb/mi} Tracepoint Commands

The commands defined in this section implement MI support for
tracepoints.  For detailed introduction, see @ref{Tracepoints}.

@subheading The @code{-trace-find} Command
@findex -trace-find

@subsubheading Synopsis

@smallexample
 -trace-find @var{mode} [@var{parameters}@dots{}]
@end smallexample

Find a trace frame using criteria defined by @var{mode} and
@var{parameters}.  The following table lists permissible
modes and their parameters.  For details of operation, see @ref{tfind}.

@table @samp

@item none
No parameters are required.  Stops examining trace frames.

@item frame-number
An integer is required as parameter.  Selects tracepoint frame with
that index.

@item tracepoint-number
An integer is required as parameter.  Finds next
trace frame that corresponds to tracepoint with the specified number.

@item pc
An address is required as parameter.  Finds
next trace frame that corresponds to any tracepoint at the specified
address.

@item pc-inside-range
Two addresses are required as parameters.  Finds next trace
frame that corresponds to a tracepoint at an address inside the
specified range.  Both bounds are considered to be inside the range.

@item pc-outside-range
Two addresses are required as parameters.  Finds
next trace frame that corresponds to a tracepoint at an address outside
the specified range.  Both bounds are considered to be inside the range.

@item line
Line specification is required as parameter.  @xref{Specify Location}.
Finds next trace frame that corresponds to a tracepoint at
the specified location.

@end table

If @samp{none} was passed as @var{mode}, the response does not
have fields.  Otherwise, the response may have the following fields:

@table @samp
@item found
This field has either @samp{0} or @samp{1} as the value, depending
on whether a matching tracepoint was found.

@item traceframe
The index of the found traceframe.  This field is present iff
the @samp{found} field has value of @samp{1}.

@item tracepoint
The index of the found tracepoint.  This field is present iff
the @samp{found} field has value of @samp{1}.

@item frame
The information about the frame corresponding to the found trace
frame.  This field is present only if a trace frame was found.
@xref{GDB/MI Frame Information}, for description of this field.

@end table

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{tfind}.

@subheading -trace-define-variable
@findex -trace-define-variable

@subsubheading Synopsis

@smallexample
 -trace-define-variable @var{name} [ @var{value} ]
@end smallexample

Create trace variable @var{name} if it does not exist.  If
@var{value} is specified, sets the initial value of the specified
trace variable to that value.  Note that the @var{name} should start
with the @samp{$} character.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{tvariable}.

@subheading The @code{-trace-frame-collected} Command
@findex -trace-frame-collected

@subsubheading Synopsis

@smallexample
 -trace-frame-collected
    [--var-print-values @var{var_pval}]
    [--comp-print-values @var{comp_pval}]
    [--registers-format @var{regformat}]
    [--memory-contents]
@end smallexample

This command returns the set of collected objects, register names,
trace state variable names, memory ranges and computed expressions
that have been collected at a particular trace frame.  The optional
parameters to the command affect the output format in different ways.
See the output description table below for more details.

The reported names can be used in the normal manner to create
varobjs and inspect the objects themselves.  The items returned by
this command are categorized so that it is clear which is a variable,
which is a register, which is a trace state variable, which is a
memory range and which is a computed expression.

For instance, if the actions were
@smallexample
collect myVar, myArray[myIndex], myObj.field, myPtr->field, myCount + 2
collect *(int*)0xaf02bef0@@40
@end smallexample

@noindent
the object collected in its entirety would be @code{myVar}.  The
object @code{myArray} would be partially collected, because only the
element at index @code{myIndex} would be collected.  The remaining
objects would be computed expressions.

An example output would be:

@smallexample
(gdb)
-trace-frame-collected
^done,
  explicit-variables=[@{name="myVar",value="1"@}],
  computed-expressions=[@{name="myArray[myIndex]",value="0"@},
                        @{name="myObj.field",value="0"@},
                        @{name="myPtr->field",value="1"@},
                        @{name="myCount + 2",value="3"@},
                        @{name="$tvar1 + 1",value="43970027"@}],
  registers=[@{number="0",value="0x7fe2c6e79ec8"@},
             @{number="1",value="0x0"@},
             @{number="2",value="0x4"@},
             ...
             @{number="125",value="0x0"@}],
  tvars=[@{name="$tvar1",current="43970026"@}],
  memory=[@{address="0x0000000000602264",length="4"@},
          @{address="0x0000000000615bc0",length="4"@}]
(gdb)
@end smallexample

Where:

@table @code
@item explicit-variables
The set of objects that have been collected in their entirety (as
opposed to collecting just a few elements of an array or a few struct
members).  For each object, its name and value are printed.
The @code{--var-print-values} option affects how or whether the value
field is output.  If @var{var_pval} is 0, then print only the names;
if it is 1, print also their values; and if it is 2, print the name,
type and value for simple data types, and the name and type for
arrays, structures and unions.

@item computed-expressions
The set of computed expressions that have been collected at the
current trace frame.  The @code{--comp-print-values} option affects
this set like the @code{--var-print-values} option affects the
@code{explicit-variables} set.  See above.

@item registers
The registers that have been collected at the current trace frame.
For each register collected, the name and current value are returned.
The value is formatted according to the @code{--registers-format}
option.  See the @command{-data-list-register-values} command for a
list of the allowed formats.  The default is @samp{x}.

@item tvars
The trace state variables that have been collected at the current
trace frame.  For each trace state variable collected, the name and
current value are returned.

@item memory
The set of memory ranges that have been collected at the current trace
frame.  Its content is a list of tuples.  Each tuple represents a
collected memory range and has the following fields:

@table @code
@item address
The start address of the memory range, as hexadecimal literal.

@item length
The length of the memory range, as decimal literal.

@item contents
The contents of the memory block, in hex.  This field is only present
if the @code{--memory-contents} option is specified.

@end table

@end table

@subsubheading @value{GDBN} Command

There is no corresponding @value{GDBN} command.

@subsubheading Example

@subheading -trace-list-variables
@findex -trace-list-variables

@subsubheading Synopsis

@smallexample
 -trace-list-variables
@end smallexample

Return a table of all defined trace variables.  Each element of the
table has the following fields:

@table @samp
@item name
The name of the trace variable.  This field is always present.

@item initial
The initial value.  This is a 64-bit signed integer.  This
field is always present.

@item current
The value the trace variable has at the moment.  This is a 64-bit
signed integer.  This field is absent iff current value is
not defined, for example if the trace was never run, or is
presently running.

@end table

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{tvariables}.

@subsubheading Example

@smallexample
(gdb)
-trace-list-variables
^done,trace-variables=@{nr_rows="1",nr_cols="3",
hdr=[@{width="15",alignment="-1",col_name="name",colhdr="Name"@},
     @{width="11",alignment="-1",col_name="initial",colhdr="Initial"@},
     @{width="11",alignment="-1",col_name="current",colhdr="Current"@}],
body=[variable=@{name="$trace_timestamp",initial="0"@}
      variable=@{name="$foo",initial="10",current="15"@}]@}
(gdb)
@end smallexample

@subheading -trace-save
@findex -trace-save

@subsubheading Synopsis

@smallexample
 -trace-save [-r ] @var{filename}
@end smallexample

Saves the collected trace data to @var{filename}.  Without the
@samp{-r} option, the data is downloaded from the target and saved
in a local file.  With the @samp{-r} option the target is asked
to perform the save.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{tsave}.


@subheading -trace-start
@findex -trace-start

@subsubheading Synopsis

@smallexample
 -trace-start
@end smallexample

Starts a tracing experiments.  The result of this command does not
have any fields.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{tstart}.

@subheading -trace-status
@findex -trace-status

@subsubheading Synopsis

@smallexample
 -trace-status
@end smallexample

Obtains the status of a tracing experiment.  The result may include
the following fields:

@table @samp

@item supported
May have a value of either @samp{0}, when no tracing operations are
supported, @samp{1}, when all tracing operations are supported, or
@samp{file} when examining trace file.  In the latter case, examining
of trace frame is possible but new tracing experiement cannot be
started.  This field is always present.

@item running
May have a value of either @samp{0} or @samp{1} depending on whether
tracing experiement is in progress on target.  This field is present
if @samp{supported} field is not @samp{0}.

@item stop-reason
Report the reason why the tracing was stopped last time.  This field
may be absent iff tracing was never stopped on target yet.  The
value of @samp{request} means the tracing was stopped as result of
the @code{-trace-stop} command.  The value of @samp{overflow} means
the tracing buffer is full.  The value of @samp{disconnection} means
tracing was automatically stopped when @value{GDBN} has disconnected.
The value of @samp{passcount} means tracing was stopped when a
tracepoint was passed a maximal number of times for that tracepoint.
This field is present if @samp{supported} field is not @samp{0}.

@item stopping-tracepoint
The number of tracepoint whose passcount as exceeded.  This field is
present iff the @samp{stop-reason} field has the value of
@samp{passcount}.

@item frames
@itemx frames-created
The @samp{frames} field is a count of the total number of trace frames
in the trace buffer, while @samp{frames-created} is the total created
during the run, including ones that were discarded, such as when a
circular trace buffer filled up.  Both fields are optional.

@item buffer-size
@itemx buffer-free
These fields tell the current size of the tracing buffer and the
remaining space.  These fields are optional.

@item circular
The value of the circular trace buffer flag.  @code{1} means that the
trace buffer is circular and old trace frames will be discarded if
necessary to make room, @code{0} means that the trace buffer is linear
and may fill up.

@item disconnected
The value of the disconnected tracing flag.  @code{1} means that
tracing will continue after @value{GDBN} disconnects, @code{0} means
that the trace run will stop.

@item trace-file
The filename of the trace file being examined.  This field is
optional, and only present when examining a trace file.

@end table

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{tstatus}.

@subheading -trace-stop
@findex -trace-stop

@subsubheading Synopsis

@smallexample
 -trace-stop
@end smallexample

Stops a tracing experiment.  The result of this command has the same
fields as @code{-trace-status}, except that the @samp{supported} and
@samp{running} fields are not output.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{tstop}.


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Symbol Query
@section @sc{gdb/mi} Symbol Query Commands


@ignore
@subheading The @code{-symbol-info-address} Command
@findex -symbol-info-address

@subsubheading Synopsis

@smallexample
 -symbol-info-address @var{symbol}
@end smallexample

Describe where @var{symbol} is stored.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info address}.

@subsubheading Example
N.A.


@subheading The @code{-symbol-info-file} Command
@findex -symbol-info-file

@subsubheading Synopsis

@smallexample
 -symbol-info-file
@end smallexample

Show the file for the symbol.

@subsubheading @value{GDBN} Command

There's no equivalent @value{GDBN} command.  @code{gdbtk} has
@samp{gdb_find_file}.

@subsubheading Example
N.A.


@subheading The @code{-symbol-info-function} Command
@findex -symbol-info-function

@subsubheading Synopsis

@smallexample
 -symbol-info-function
@end smallexample

Show which function the symbol lives in.

@subsubheading @value{GDBN} Command

@samp{gdb_get_function} in @code{gdbtk}.

@subsubheading Example
N.A.


@subheading The @code{-symbol-info-line} Command
@findex -symbol-info-line

@subsubheading Synopsis

@smallexample
 -symbol-info-line
@end smallexample

Show the core addresses of the code for a source line.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info line}.
@code{gdbtk} has the @samp{gdb_get_line} and @samp{gdb_get_file} commands.

@subsubheading Example
N.A.


@subheading The @code{-symbol-info-symbol} Command
@findex -symbol-info-symbol

@subsubheading Synopsis

@smallexample
 -symbol-info-symbol @var{addr}
@end smallexample

Describe what symbol is at location @var{addr}.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info symbol}.

@subsubheading Example
N.A.


@subheading The @code{-symbol-list-functions} Command
@findex -symbol-list-functions

@subsubheading Synopsis

@smallexample
 -symbol-list-functions
@end smallexample

List the functions in the executable.

@subsubheading @value{GDBN} Command

@samp{info functions} in @value{GDBN}, @samp{gdb_listfunc} and
@samp{gdb_search} in @code{gdbtk}.

@subsubheading Example
N.A.
@end ignore


@subheading The @code{-symbol-list-lines} Command
@findex -symbol-list-lines

@subsubheading Synopsis

@smallexample
 -symbol-list-lines @var{filename}
@end smallexample

Print the list of lines that contain code and their associated program
addresses for the given source filename.  The entries are sorted in
ascending PC order.

@subsubheading @value{GDBN} Command

There is no corresponding @value{GDBN} command.

@subsubheading Example
@smallexample
(gdb)
-symbol-list-lines basics.c
^done,lines=[@{pc="0x08048554",line="7"@},@{pc="0x0804855a",line="8"@}]
(gdb)
@end smallexample


@ignore
@subheading The @code{-symbol-list-types} Command
@findex -symbol-list-types

@subsubheading Synopsis

@smallexample
 -symbol-list-types
@end smallexample

List all the type names.

@subsubheading @value{GDBN} Command

The corresponding commands are @samp{info types} in @value{GDBN},
@samp{gdb_search} in @code{gdbtk}.

@subsubheading Example
N.A.


@subheading The @code{-symbol-list-variables} Command
@findex -symbol-list-variables

@subsubheading Synopsis

@smallexample
 -symbol-list-variables
@end smallexample

List all the global and static variable names.

@subsubheading @value{GDBN} Command

@samp{info variables} in @value{GDBN}, @samp{gdb_search} in @code{gdbtk}.

@subsubheading Example
N.A.


@subheading The @code{-symbol-locate} Command
@findex -symbol-locate

@subsubheading Synopsis

@smallexample
 -symbol-locate
@end smallexample

@subsubheading @value{GDBN} Command

@samp{gdb_loc} in @code{gdbtk}.

@subsubheading Example
N.A.


@subheading The @code{-symbol-type} Command
@findex -symbol-type

@subsubheading Synopsis

@smallexample
 -symbol-type @var{variable}
@end smallexample

Show type of @var{variable}.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{ptype}, @code{gdbtk} has
@samp{gdb_obj_variable}.

@subsubheading Example
N.A.
@end ignore


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI File Commands
@section @sc{gdb/mi} File Commands

This section describes the GDB/MI commands to specify executable file names
and to read in and obtain symbol table information.

@subheading The @code{-file-exec-and-symbols} Command
@findex -file-exec-and-symbols

@subsubheading Synopsis

@smallexample
 -file-exec-and-symbols @var{file}
@end smallexample

Specify the executable file to be debugged.  This file is the one from
which the symbol table is also read.  If no file is specified, the
command clears the executable and symbol information.  If breakpoints
are set when using this command with no arguments, @value{GDBN} will produce
error messages.  Otherwise, no output is produced, except a completion
notification.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{file}.

@subsubheading Example

@smallexample
(gdb)
-file-exec-and-symbols /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
^done
(gdb)
@end smallexample


@subheading The @code{-file-exec-file} Command
@findex -file-exec-file

@subsubheading Synopsis

@smallexample
 -file-exec-file @var{file}
@end smallexample

Specify the executable file to be debugged.  Unlike
@samp{-file-exec-and-symbols}, the symbol table is @emph{not} read
from this file.  If used without argument, @value{GDBN} clears the information
about the executable file.  No output is produced, except a completion
notification.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{exec-file}.

@subsubheading Example

@smallexample
(gdb)
-file-exec-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
^done
(gdb)
@end smallexample


@ignore
@subheading The @code{-file-list-exec-sections} Command
@findex -file-list-exec-sections

@subsubheading Synopsis

@smallexample
 -file-list-exec-sections
@end smallexample

List the sections of the current executable file.

@subsubheading @value{GDBN} Command

The @value{GDBN} command @samp{info file} shows, among the rest, the same
information as this command.  @code{gdbtk} has a corresponding command
@samp{gdb_load_info}.

@subsubheading Example
N.A.
@end ignore


@subheading The @code{-file-list-exec-source-file} Command
@findex -file-list-exec-source-file

@subsubheading Synopsis

@smallexample
 -file-list-exec-source-file
@end smallexample

List the line number, the current source file, and the absolute path
to the current source file for the current executable.  The macro
information field has a value of @samp{1} or @samp{0} depending on
whether or not the file includes preprocessor macro information.

@subsubheading @value{GDBN} Command

The @value{GDBN} equivalent is @samp{info source}

@subsubheading Example

@smallexample
(gdb)
123-file-list-exec-source-file
123^done,line="1",file="foo.c",fullname="/home/bar/foo.c,macro-info="1"
(gdb)
@end smallexample


@subheading The @code{-file-list-exec-source-files} Command
@findex -file-list-exec-source-files

@subsubheading Synopsis

@smallexample
 -file-list-exec-source-files
@end smallexample

List the source files for the current executable.

It will always output both the filename and fullname (absolute file
name) of a source file.

@subsubheading @value{GDBN} Command

The @value{GDBN} equivalent is @samp{info sources}.
@code{gdbtk} has an analogous command @samp{gdb_listfiles}.

@subsubheading Example
@smallexample
(gdb)
-file-list-exec-source-files
^done,files=[
@{file=foo.c,fullname=/home/foo.c@},
@{file=/home/bar.c,fullname=/home/bar.c@},
@{file=gdb_could_not_find_fullpath.c@}]
(gdb)
@end smallexample

@ignore
@subheading The @code{-file-list-shared-libraries} Command
@findex -file-list-shared-libraries

@subsubheading Synopsis

@smallexample
 -file-list-shared-libraries
@end smallexample

List the shared libraries in the program.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info shared}.

@subsubheading Example
N.A.


@subheading The @code{-file-list-symbol-files} Command
@findex -file-list-symbol-files

@subsubheading Synopsis

@smallexample
 -file-list-symbol-files
@end smallexample

List symbol files.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info file} (part of it).

@subsubheading Example
N.A.
@end ignore


@subheading The @code{-file-symbol-file} Command
@findex -file-symbol-file

@subsubheading Synopsis

@smallexample
 -file-symbol-file @var{file}
@end smallexample

Read symbol table info from the specified @var{file} argument.  When
used without arguments, clears @value{GDBN}'s symbol table info.  No output is
produced, except for a completion notification.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{symbol-file}.

@subsubheading Example

@smallexample
(gdb)
-file-symbol-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
^done
(gdb)
@end smallexample

@ignore
@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Memory Overlay Commands
@section @sc{gdb/mi} Memory Overlay Commands

The memory overlay commands are not implemented.

@c @subheading -overlay-auto

@c @subheading -overlay-list-mapping-state

@c @subheading -overlay-list-overlays

@c @subheading -overlay-map

@c @subheading -overlay-off

@c @subheading -overlay-on

@c @subheading -overlay-unmap

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Signal Handling Commands
@section @sc{gdb/mi} Signal Handling Commands

Signal handling commands are not implemented.

@c @subheading -signal-handle

@c @subheading -signal-list-handle-actions

@c @subheading -signal-list-signal-types
@end ignore


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Target Manipulation
@section @sc{gdb/mi} Target Manipulation Commands


@subheading The @code{-target-attach} Command
@findex -target-attach

@subsubheading Synopsis

@smallexample
 -target-attach @var{pid} | @var{gid} | @var{file}
@end smallexample

Attach to a process @var{pid} or a file @var{file} outside of
@value{GDBN}, or a thread group @var{gid}.  If attaching to a thread
group, the id previously returned by 
@samp{-list-thread-groups --available} must be used.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{attach}.

@subsubheading Example
@smallexample
(gdb)
-target-attach 34
=thread-created,id="1"
*stopped,thread-id="1",frame=@{addr="0xb7f7e410",func="bar",args=[]@}
^done
(gdb)
@end smallexample

@ignore
@subheading The @code{-target-compare-sections} Command
@findex -target-compare-sections

@subsubheading Synopsis

@smallexample
 -target-compare-sections [ @var{section} ]
@end smallexample

Compare data of section @var{section} on target to the exec file.
Without the argument, all sections are compared.

@subsubheading @value{GDBN} Command

The @value{GDBN} equivalent is @samp{compare-sections}.

@subsubheading Example
N.A.
@end ignore


@subheading The @code{-target-detach} Command
@findex -target-detach

@subsubheading Synopsis

@smallexample
 -target-detach [ @var{pid} | @var{gid} ]
@end smallexample

Detach from the remote target which normally resumes its execution.
If either @var{pid} or @var{gid} is specified, detaches from either
the specified process, or specified thread group.  There's no output.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{detach}.

@subsubheading Example

@smallexample
(gdb)
-target-detach
^done
(gdb)
@end smallexample


@subheading The @code{-target-disconnect} Command
@findex -target-disconnect

@subsubheading Synopsis

@smallexample
 -target-disconnect
@end smallexample

Disconnect from the remote target.  There's no output and the target is
generally not resumed.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{disconnect}.

@subsubheading Example

@smallexample
(gdb)
-target-disconnect
^done
(gdb)
@end smallexample


@subheading The @code{-target-download} Command
@findex -target-download

@subsubheading Synopsis

@smallexample
 -target-download
@end smallexample

Loads the executable onto the remote target.
It prints out an update message every half second, which includes the fields:

@table @samp
@item section
The name of the section.
@item section-sent
The size of what has been sent so far for that section.
@item section-size
The size of the section.
@item total-sent
The total size of what was sent so far (the current and the previous sections).
@item total-size
The size of the overall executable to download.
@end table

@noindent
Each message is sent as status record (@pxref{GDB/MI Output Syntax, ,
@sc{gdb/mi} Output Syntax}).

In addition, it prints the name and size of the sections, as they are
downloaded.  These messages include the following fields:

@table @samp
@item section
The name of the section.
@item section-size
The size of the section.
@item total-size
The size of the overall executable to download.
@end table

@noindent
At the end, a summary is printed.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{load}.

@subsubheading Example

Note: each status message appears on a single line.  Here the messages
have been broken down so that they can fit onto a page.

@smallexample
(gdb)
-target-download
+download,@{section=".text",section-size="6668",total-size="9880"@}
+download,@{section=".text",section-sent="512",section-size="6668",
total-sent="512",total-size="9880"@}
+download,@{section=".text",section-sent="1024",section-size="6668",
total-sent="1024",total-size="9880"@}
+download,@{section=".text",section-sent="1536",section-size="6668",
total-sent="1536",total-size="9880"@}
+download,@{section=".text",section-sent="2048",section-size="6668",
total-sent="2048",total-size="9880"@}
+download,@{section=".text",section-sent="2560",section-size="6668",
total-sent="2560",total-size="9880"@}
+download,@{section=".text",section-sent="3072",section-size="6668",
total-sent="3072",total-size="9880"@}
+download,@{section=".text",section-sent="3584",section-size="6668",
total-sent="3584",total-size="9880"@}
+download,@{section=".text",section-sent="4096",section-size="6668",
total-sent="4096",total-size="9880"@}
+download,@{section=".text",section-sent="4608",section-size="6668",
total-sent="4608",total-size="9880"@}
+download,@{section=".text",section-sent="5120",section-size="6668",
total-sent="5120",total-size="9880"@}
+download,@{section=".text",section-sent="5632",section-size="6668",
total-sent="5632",total-size="9880"@}
+download,@{section=".text",section-sent="6144",section-size="6668",
total-sent="6144",total-size="9880"@}
+download,@{section=".text",section-sent="6656",section-size="6668",
total-sent="6656",total-size="9880"@}
+download,@{section=".init",section-size="28",total-size="9880"@}
+download,@{section=".fini",section-size="28",total-size="9880"@}
+download,@{section=".data",section-size="3156",total-size="9880"@}
+download,@{section=".data",section-sent="512",section-size="3156",
total-sent="7236",total-size="9880"@}
+download,@{section=".data",section-sent="1024",section-size="3156",
total-sent="7748",total-size="9880"@}
+download,@{section=".data",section-sent="1536",section-size="3156",
total-sent="8260",total-size="9880"@}
+download,@{section=".data",section-sent="2048",section-size="3156",
total-sent="8772",total-size="9880"@}
+download,@{section=".data",section-sent="2560",section-size="3156",
total-sent="9284",total-size="9880"@}
+download,@{section=".data",section-sent="3072",section-size="3156",
total-sent="9796",total-size="9880"@}
^done,address="0x10004",load-size="9880",transfer-rate="6586",
write-rate="429"
(gdb)
@end smallexample


@ignore
@subheading The @code{-target-exec-status} Command
@findex -target-exec-status

@subsubheading Synopsis

@smallexample
 -target-exec-status
@end smallexample

Provide information on the state of the target (whether it is running or
not, for instance).

@subsubheading @value{GDBN} Command

There's no equivalent @value{GDBN} command.

@subsubheading Example
N.A.


@subheading The @code{-target-list-available-targets} Command
@findex -target-list-available-targets

@subsubheading Synopsis

@smallexample
 -target-list-available-targets
@end smallexample

List the possible targets to connect to.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{help target}.

@subsubheading Example
N.A.


@subheading The @code{-target-list-current-targets} Command
@findex -target-list-current-targets

@subsubheading Synopsis

@smallexample
 -target-list-current-targets
@end smallexample

Describe the current target.

@subsubheading @value{GDBN} Command

The corresponding information is printed by @samp{info file} (among
other things).

@subsubheading Example
N.A.


@subheading The @code{-target-list-parameters} Command
@findex -target-list-parameters

@subsubheading Synopsis

@smallexample
 -target-list-parameters
@end smallexample

@c ????
@end ignore

@subsubheading @value{GDBN} Command

No equivalent.

@subsubheading Example
N.A.


@subheading The @code{-target-select} Command
@findex -target-select

@subsubheading Synopsis

@smallexample
 -target-select @var{type} @var{parameters @dots{}}
@end smallexample

Connect @value{GDBN} to the remote target.  This command takes two args:

@table @samp
@item @var{type}
The type of target, for instance @samp{remote}, etc.
@item @var{parameters}
Device names, host names and the like.  @xref{Target Commands, ,
Commands for Managing Targets}, for more details.
@end table

The output is a connection notification, followed by the address at
which the target program is, in the following form:

@smallexample
^connected,addr="@var{address}",func="@var{function name}",
  args=[@var{arg list}]
@end smallexample

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{target}.

@subsubheading Example

@smallexample
(gdb)
-target-select remote /dev/ttya
^connected,addr="0xfe00a300",func="??",args=[]
(gdb)
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI File Transfer Commands
@section @sc{gdb/mi} File Transfer Commands


@subheading The @code{-target-file-put} Command
@findex -target-file-put

@subsubheading Synopsis

@smallexample
 -target-file-put @var{hostfile} @var{targetfile}
@end smallexample

Copy file @var{hostfile} from the host system (the machine running
@value{GDBN}) to @var{targetfile} on the target system.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{remote put}.

@subsubheading Example

@smallexample
(gdb)
-target-file-put localfile remotefile
^done
(gdb)
@end smallexample


@subheading The @code{-target-file-get} Command
@findex -target-file-get

@subsubheading Synopsis

@smallexample
 -target-file-get @var{targetfile} @var{hostfile}
@end smallexample

Copy file @var{targetfile} from the target system to @var{hostfile}
on the host system.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{remote get}.

@subsubheading Example

@smallexample
(gdb)
-target-file-get remotefile localfile
^done
(gdb)
@end smallexample


@subheading The @code{-target-file-delete} Command
@findex -target-file-delete

@subsubheading Synopsis

@smallexample
 -target-file-delete @var{targetfile}
@end smallexample

Delete @var{targetfile} from the target system.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{remote delete}.

@subsubheading Example

@smallexample
(gdb)
-target-file-delete remotefile
^done
(gdb)
@end smallexample


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Ada Exceptions Commands
@section Ada Exceptions @sc{gdb/mi} Commands

@subheading The @code{-info-ada-exceptions} Command
@findex -info-ada-exceptions

@subsubheading Synopsis

@smallexample
 -info-ada-exceptions [ @var{regexp}]
@end smallexample

List all Ada exceptions defined within the program being debugged.
With a regular expression @var{regexp}, only those exceptions whose
names match @var{regexp} are listed.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info exceptions}.

@subsubheading Result

The result is a table of Ada exceptions.  The following columns are
defined for each exception:

@table @samp
@item name
The name of the exception.

@item address
The address of the exception.

@end table

@subsubheading Example

@smallexample
-info-ada-exceptions aint
^done,ada-exceptions=@{nr_rows="2",nr_cols="2",
hdr=[@{width="1",alignment="-1",col_name="name",colhdr="Name"@},
@{width="1",alignment="-1",col_name="address",colhdr="Address"@}],
body=[@{name="constraint_error",address="0x0000000000613da0"@},
@{name="const.aint_global_e",address="0x0000000000613b00"@}]@}
@end smallexample

@subheading Catching Ada Exceptions

The commands describing how to ask @value{GDBN} to stop when a program
raises an exception are described at @ref{Ada Exception GDB/MI
Catchpoint Commands}.


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Support Commands
@section @sc{gdb/mi} Support Commands

Since new commands and features get regularly added to @sc{gdb/mi},
some commands are available to help front-ends query the debugger
about support for these capabilities.  Similarly, it is also possible
to query @value{GDBN} about target support of certain features.

@subheading The @code{-info-gdb-mi-command} Command
@cindex @code{-info-gdb-mi-command}
@findex -info-gdb-mi-command

@subsubheading Synopsis

@smallexample
 -info-gdb-mi-command @var{cmd_name}
@end smallexample

Query support for the @sc{gdb/mi} command named @var{cmd_name}.

Note that the dash (@code{-}) starting all @sc{gdb/mi} commands
is technically not part of the command name (@pxref{GDB/MI Input
Syntax}), and thus should be omitted in @var{cmd_name}.  However,
for ease of use, this command also accepts the form with the leading
dash.

@subsubheading @value{GDBN} Command

There is no corresponding @value{GDBN} command.

@subsubheading Result

The result is a tuple.  There is currently only one field:

@table @samp
@item exists
This field is equal to @code{"true"} if the @sc{gdb/mi} command exists,
@code{"false"} otherwise.

@end table

@subsubheading Example

Here is an example where the @sc{gdb/mi} command does not exist:

@smallexample
-info-gdb-mi-command unsupported-command
^done,command=@{exists="false"@}
@end smallexample

@noindent
And here is an example where the @sc{gdb/mi} command is known
to the debugger:

@smallexample
-info-gdb-mi-command symbol-list-lines
^done,command=@{exists="true"@}
@end smallexample

@subheading The @code{-list-features} Command
@findex -list-features
@cindex supported @sc{gdb/mi} features, list

Returns a list of particular features of the MI protocol that
this version of gdb implements.  A feature can be a command,
or a new field in an output of some command, or even an
important bugfix.  While a frontend can sometimes detect presence
of a feature at runtime, it is easier to perform detection at debugger
startup.

The command returns a list of strings, with each string naming an
available feature.  Each returned string is just a name, it does not
have any internal structure.  The list of possible feature names
is given below.

Example output:

@smallexample
(gdb) -list-features
^done,result=["feature1","feature2"]
@end smallexample

The current list of features is:

@ftable @samp
@item frozen-varobjs
Indicates support for the @code{-var-set-frozen} command, as well
as possible presense of the @code{frozen} field in the output
of @code{-varobj-create}.
@item pending-breakpoints
Indicates support for the @option{-f} option to the @code{-break-insert}
command.
@item python
Indicates Python scripting support, Python-based
pretty-printing commands, and possible presence of the
@samp{display_hint} field in the output of @code{-var-list-children}
@item thread-info
Indicates support for the @code{-thread-info} command.
@item data-read-memory-bytes
Indicates support for the @code{-data-read-memory-bytes} and the
@code{-data-write-memory-bytes} commands.
@item breakpoint-notifications
Indicates that changes to breakpoints and breakpoints created via the
CLI will be announced via async records.
@item ada-task-info
Indicates support for the @code{-ada-task-info} command.
@item language-option
Indicates that all @sc{gdb/mi} commands accept the @option{--language}
option (@pxref{Context management}).
@item info-gdb-mi-command
Indicates support for the @code{-info-gdb-mi-command} command.
@item undefined-command-error-code
Indicates support for the "undefined-command" error code in error result
records, produced when trying to execute an undefined @sc{gdb/mi} command
(@pxref{GDB/MI Result Records}).
@item exec-run-start-option
Indicates that the @code{-exec-run} command supports the @option{--start}
option (@pxref{GDB/MI Program Execution}).
@end ftable

@subheading The @code{-list-target-features} Command
@findex -list-target-features

Returns a list of particular features that are supported by the
target.  Those features affect the permitted MI commands, but 
unlike the features reported by the @code{-list-features} command, the
features depend on which target GDB is using at the moment.  Whenever
a target can change, due to commands such as @code{-target-select},
@code{-target-attach} or @code{-exec-run}, the list of target features
may change, and the frontend should obtain it again.
Example output:

@smallexample
(gdb) -list-target-features
^done,result=["async"]
@end smallexample

The current list of features is:

@table @samp
@item async
Indicates that the target is capable of asynchronous command
execution, which means that @value{GDBN} will accept further commands
while the target is running.

@item reverse
Indicates that the target is capable of reverse execution.
@xref{Reverse Execution}, for more information.

@end table

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Miscellaneous Commands
@section Miscellaneous @sc{gdb/mi} Commands

@c @subheading -gdb-complete

@subheading The @code{-gdb-exit} Command
@findex -gdb-exit

@subsubheading Synopsis

@smallexample
 -gdb-exit
@end smallexample

Exit @value{GDBN} immediately.

@subsubheading @value{GDBN} Command

Approximately corresponds to @samp{quit}.

@subsubheading Example

@smallexample
(gdb)
-gdb-exit
^exit
@end smallexample


@ignore
@subheading The @code{-exec-abort} Command
@findex -exec-abort

@subsubheading Synopsis

@smallexample
 -exec-abort
@end smallexample

Kill the inferior running program.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{kill}.

@subsubheading Example
N.A.
@end ignore


@subheading The @code{-gdb-set} Command
@findex -gdb-set

@subsubheading Synopsis

@smallexample
 -gdb-set
@end smallexample

Set an internal @value{GDBN} variable.
@c IS THIS A DOLLAR VARIABLE? OR SOMETHING LIKE ANNOTATE ?????

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{set}.

@subsubheading Example

@smallexample
(gdb)
-gdb-set $foo=3
^done
(gdb)
@end smallexample


@subheading The @code{-gdb-show} Command
@findex -gdb-show

@subsubheading Synopsis

@smallexample
 -gdb-show
@end smallexample

Show the current value of a @value{GDBN} variable.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{show}.

@subsubheading Example

@smallexample
(gdb)
-gdb-show annotate
^done,value="0"
(gdb)
@end smallexample

@c @subheading -gdb-source


@subheading The @code{-gdb-version} Command
@findex -gdb-version

@subsubheading Synopsis

@smallexample
 -gdb-version
@end smallexample

Show version information for @value{GDBN}.  Used mostly in testing.

@subsubheading @value{GDBN} Command

The @value{GDBN} equivalent is @samp{show version}.  @value{GDBN} by
default shows this information when you start an interactive session.

@subsubheading Example

@c This example modifies the actual output from GDB to avoid overfull
@c box in TeX.
@smallexample
(gdb)
-gdb-version
~GNU gdb 5.2.1
~Copyright 2000 Free Software Foundation, Inc.
~GDB is free software, covered by the GNU General Public License, and
~you are welcome to change it and/or 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.
~This GDB was configured as
 "--host=sparc-sun-solaris2.5.1 --target=ppc-eabi".
^done
(gdb)
@end smallexample

@subheading The @code{-list-thread-groups} Command
@findex -list-thread-groups

@subheading Synopsis

@smallexample
-list-thread-groups [ --available ] [ --recurse 1 ] [ @var{group} ... ]
@end smallexample

Lists thread groups (@pxref{Thread groups}).  When a single thread
group is passed as the argument, lists the children of that group.
When several thread group are passed, lists information about those
thread groups.  Without any parameters, lists information about all
top-level thread groups.

Normally, thread groups that are being debugged are reported.
With the @samp{--available} option, @value{GDBN} reports thread groups
available on the target.

The output of this command may have either a @samp{threads} result or
a @samp{groups} result.  The @samp{thread} result has a list of tuples
as value, with each tuple describing a thread (@pxref{GDB/MI Thread
Information}).  The @samp{groups} result has a list of tuples as value,
each tuple describing a thread group.  If top-level groups are
requested (that is, no parameter is passed), or when several groups
are passed, the output always has a @samp{groups} result.  The format
of the @samp{group} result is described below.

To reduce the number of roundtrips it's possible to list thread groups
together with their children, by passing the @samp{--recurse} option
and the recursion depth.  Presently, only recursion depth of 1 is
permitted.  If this option is present, then every reported thread group
will also include its children, either as @samp{group} or
@samp{threads} field.

In general, any combination of option and parameters is permitted, with
the following caveats:

@itemize @bullet
@item
When a single thread group is passed, the output will typically
be the @samp{threads} result.  Because threads may not contain
anything, the @samp{recurse} option will be ignored.

@item
When the @samp{--available} option is passed, limited information may
be available.  In particular, the list of threads of a process might
be inaccessible.  Further, specifying specific thread groups might
not give any performance advantage over listing all thread groups.
The frontend should assume that @samp{-list-thread-groups --available}
is always an expensive operation and cache the results.

@end itemize

The @samp{groups} result is a list of tuples, where each tuple may
have the following fields:

@table @code
@item id
Identifier of the thread group.  This field is always present.
The identifier is an opaque string; frontends should not try to
convert it to an integer, even though it might look like one.

@item type
The type of the thread group.  At present, only @samp{process} is a
valid type.

@item pid
The target-specific process identifier.  This field is only present
for thread groups of type @samp{process} and only if the process exists.

@item exit-code
The exit code of this group's last exited thread, formatted in octal.
This field is only present for thread groups of type @samp{process} and
only if the process is not running.

@item num_children
The number of children this thread group has.  This field may be
absent for an available thread group.

@item threads
This field has a list of tuples as value, each tuple describing a
thread.  It may be present if the @samp{--recurse} option is
specified, and it's actually possible to obtain the threads.

@item cores
This field is a list of integers, each identifying a core that one
thread of the group is running on.  This field may be absent if
such information is not available.

@item executable
The name of the executable file that corresponds to this thread group.
The field is only present for thread groups of type @samp{process},
and only if there is a corresponding executable file.

@end table

@subheading Example

@smallexample
@value{GDBP}
-list-thread-groups
^done,groups=[@{id="17",type="process",pid="yyy",num_children="2"@}]
-list-thread-groups 17
^done,threads=[@{id="2",target-id="Thread 0xb7e14b90 (LWP 21257)",
   frame=@{level="0",addr="0xffffe410",func="__kernel_vsyscall",args=[]@},state="running"@},
@{id="1",target-id="Thread 0xb7e156b0 (LWP 21254)",
   frame=@{level="0",addr="0x0804891f",func="foo",args=[@{name="i",value="10"@}],
           file="/tmp/a.c",fullname="/tmp/a.c",line="158"@},state="running"@}]]
-list-thread-groups --available
^done,groups=[@{id="17",type="process",pid="yyy",num_children="2",cores=[1,2]@}]
-list-thread-groups --available --recurse 1
 ^done,groups=[@{id="17", types="process",pid="yyy",num_children="2",cores=[1,2],
                threads=[@{id="1",target-id="Thread 0xb7e14b90",cores=[1]@},
                         @{id="2",target-id="Thread 0xb7e14b90",cores=[2]@}]@},..]
-list-thread-groups --available --recurse 1 17 18
^done,groups=[@{id="17", types="process",pid="yyy",num_children="2",cores=[1,2],
               threads=[@{id="1",target-id="Thread 0xb7e14b90",cores=[1]@},
                        @{id="2",target-id="Thread 0xb7e14b90",cores=[2]@}]@},...]
@end smallexample

@subheading The @code{-info-os} Command
@findex -info-os

@subsubheading Synopsis

@smallexample
-info-os [ @var{type} ]
@end smallexample

If no argument is supplied, the command returns a table of available
operating-system-specific information types.  If one of these types is
supplied as an argument @var{type}, then the command returns a table
of data of that type.

The types of information available depend on the target operating
system.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info os}.

@subsubheading Example

When run on a @sc{gnu}/Linux system, the output will look something
like this:

@smallexample
@value{GDBP}
-info-os
^done,OSDataTable=@{nr_rows="9",nr_cols="3",
hdr=[@{width="10",alignment="-1",col_name="col0",colhdr="Type"@},
     @{width="10",alignment="-1",col_name="col1",colhdr="Description"@},
     @{width="10",alignment="-1",col_name="col2",colhdr="Title"@}],
body=[item=@{col0="processes",col1="Listing of all processes",
            col2="Processes"@},
      item=@{col0="procgroups",col1="Listing of all process groups",
            col2="Process groups"@},
      item=@{col0="threads",col1="Listing of all threads",
            col2="Threads"@},
      item=@{col0="files",col1="Listing of all file descriptors",
            col2="File descriptors"@},
      item=@{col0="sockets",col1="Listing of all internet-domain sockets",
            col2="Sockets"@},
      item=@{col0="shm",col1="Listing of all shared-memory regions",
            col2="Shared-memory regions"@},
      item=@{col0="semaphores",col1="Listing of all semaphores",
            col2="Semaphores"@},
      item=@{col0="msg",col1="Listing of all message queues",
            col2="Message queues"@},
      item=@{col0="modules",col1="Listing of all loaded kernel modules",
            col2="Kernel modules"@}]@}
@value{GDBP}
-info-os processes
^done,OSDataTable=@{nr_rows="190",nr_cols="4",
hdr=[@{width="10",alignment="-1",col_name="col0",colhdr="pid"@},
     @{width="10",alignment="-1",col_name="col1",colhdr="user"@},
     @{width="10",alignment="-1",col_name="col2",colhdr="command"@},
     @{width="10",alignment="-1",col_name="col3",colhdr="cores"@}],
body=[item=@{col0="1",col1="root",col2="/sbin/init",col3="0"@},
      item=@{col0="2",col1="root",col2="[kthreadd]",col3="1"@},
      item=@{col0="3",col1="root",col2="[ksoftirqd/0]",col3="0"@},
      ...
      item=@{col0="26446",col1="stan",col2="bash",col3="0"@},
      item=@{col0="28152",col1="stan",col2="bash",col3="1"@}]@}
(gdb)
@end smallexample

(Note that the MI output here includes a @code{"Title"} column that
does not appear in command-line @code{info os}; this column is useful
for MI clients that want to enumerate the types of data, such as in a
popup menu, but is needless clutter on the command line, and
@code{info os} omits it.)

@subheading The @code{-add-inferior} Command
@findex -add-inferior

@subheading Synopsis

@smallexample
-add-inferior
@end smallexample

Creates a new inferior (@pxref{Inferiors and Programs}).  The created
inferior is not associated with any executable.  Such association may
be established with the @samp{-file-exec-and-symbols} command
(@pxref{GDB/MI File Commands}).  The command response has a single
field, @samp{inferior}, whose value is the identifier of the
thread group corresponding to the new inferior.

@subheading Example

@smallexample
@value{GDBP}
-add-inferior
^done,inferior="i3"
@end smallexample

@subheading The @code{-interpreter-exec} Command
@findex -interpreter-exec

@subheading Synopsis

@smallexample
-interpreter-exec @var{interpreter} @var{command}
@end smallexample
@anchor{-interpreter-exec} 

Execute the specified @var{command} in the given @var{interpreter}.

@subheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{interpreter-exec}.

@subheading Example

@smallexample
(gdb)
-interpreter-exec console "break main"
&"During symbol reading, couldn't parse type; debugger out of date?.\n"
&"During symbol reading, bad structure-type format.\n"
~"Breakpoint 1 at 0x8074fc6: file ../../src/gdb/main.c, line 743.\n"
^done
(gdb)
@end smallexample

@subheading The @code{-inferior-tty-set} Command
@findex -inferior-tty-set

@subheading Synopsis

@smallexample
-inferior-tty-set /dev/pts/1
@end smallexample

Set terminal for future runs of the program being debugged.

@subheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{set inferior-tty} /dev/pts/1.

@subheading Example

@smallexample
(gdb)
-inferior-tty-set /dev/pts/1
^done
(gdb)
@end smallexample

@subheading The @code{-inferior-tty-show} Command
@findex -inferior-tty-show

@subheading Synopsis

@smallexample
-inferior-tty-show
@end smallexample

Show terminal for future runs of program being debugged.

@subheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{show inferior-tty}.

@subheading Example

@smallexample
(gdb)
-inferior-tty-set /dev/pts/1
^done
(gdb)
-inferior-tty-show
^done,inferior_tty_terminal="/dev/pts/1"
(gdb)
@end smallexample

@subheading The @code{-enable-timings} Command
@findex -enable-timings

@subheading Synopsis

@smallexample
-enable-timings [yes | no]
@end smallexample

Toggle the printing of the wallclock, user and system times for an MI
command as a field in its output.  This command is to help frontend
developers optimize the performance of their code.  No argument is
equivalent to @samp{yes}.

@subheading @value{GDBN} Command

No equivalent.

@subheading Example

@smallexample
(gdb)
-enable-timings
^done
(gdb)
-break-insert main
^done,bkpt=@{number="1",type="breakpoint",disp="keep",enabled="y",
addr="0x080484ed",func="main",file="myprog.c",
fullname="/home/nickrob/myprog.c",line="73",thread-groups=["i1"],
times="0"@},
time=@{wallclock="0.05185",user="0.00800",system="0.00000"@}
(gdb)
-enable-timings no
^done
(gdb)
-exec-run
^running
(gdb)
*stopped,reason="breakpoint-hit",disp="keep",bkptno="1",thread-id="0",
frame=@{addr="0x080484ed",func="main",args=[@{name="argc",value="1"@},
@{name="argv",value="0xbfb60364"@}],file="myprog.c",
fullname="/home/nickrob/myprog.c",line="73"@}
(gdb)
@end smallexample

@node Annotations
@chapter @value{GDBN} Annotations

This chapter describes annotations in @value{GDBN}.  Annotations were
designed to interface @value{GDBN} to graphical user interfaces or other
similar programs which want to interact with @value{GDBN} at a
relatively high level.

The annotation mechanism has largely been superseded by @sc{gdb/mi}
(@pxref{GDB/MI}).

@ignore
This is Edition @value{EDITION}, @value{DATE}.
@end ignore

@menu
* Annotations Overview::  What annotations are; the general syntax.
* Server Prefix::       Issuing a command without affecting user state.
* Prompting::           Annotations marking @value{GDBN}'s need for input.
* Errors::              Annotations for error messages.
* Invalidation::        Some annotations describe things now invalid.
* Annotations for Running::
                        Whether the program is running, how it stopped, etc.
* Source Annotations::  Annotations describing source code.
@end menu

@node Annotations Overview
@section What is an Annotation?
@cindex annotations

Annotations start with a newline character, two @samp{control-z}
characters, and the name of the annotation.  If there is no additional
information associated with this annotation, the name of the annotation
is followed immediately by a newline.  If there is additional
information, the name of the annotation is followed by a space, the
additional information, and a newline.  The additional information
cannot contain newline characters.

Any output not beginning with a newline and two @samp{control-z}
characters denotes literal output from @value{GDBN}.  Currently there is
no need for @value{GDBN} to output a newline followed by two
@samp{control-z} characters, but if there was such a need, the
annotations could be extended with an @samp{escape} annotation which
means those three characters as output.

The annotation @var{level}, which is specified using the
@option{--annotate} command line option (@pxref{Mode Options}), controls
how much information @value{GDBN} prints together with its prompt,
values of expressions, source lines, and other types of output.  Level 0
is for no annotations, level 1 is for use when @value{GDBN} is run as a
subprocess of @sc{gnu} Emacs, level 3 is the maximum annotation suitable
for programs that control @value{GDBN}, and level 2 annotations have
been made obsolete (@pxref{Limitations, , Limitations of the Annotation
Interface, annotate, GDB's Obsolete Annotations}).

@table @code
@kindex set annotate
@item set annotate @var{level}
The @value{GDBN} command @code{set annotate} sets the level of
annotations to the specified @var{level}.

@item show annotate
@kindex show annotate
Show the current annotation level.
@end table

This chapter describes level 3 annotations.

A simple example of starting up @value{GDBN} with annotations is:

@smallexample
$ @kbd{gdb --annotate=3}
GNU gdb 6.0
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License,
and you are welcome to change it and/or 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.
This GDB was configured as "i386-pc-linux-gnu"

^Z^Zpre-prompt
(@value{GDBP})
^Z^Zprompt
@kbd{quit}

^Z^Zpost-prompt
$
@end smallexample

Here @samp{quit} is input to @value{GDBN}; the rest is output from
@value{GDBN}.  The three lines beginning @samp{^Z^Z} (where @samp{^Z}
denotes a @samp{control-z} character) are annotations; the rest is
output from @value{GDBN}.

@node Server Prefix
@section The Server Prefix
@cindex server prefix

If you prefix a command with @samp{server } then it will not affect
the command history, nor will it affect @value{GDBN}'s notion of which
command to repeat if @key{RET} is pressed on a line by itself.  This
means that commands can be run behind a user's back by a front-end in
a transparent manner.

The @code{server } prefix does not affect the recording of values into
the value history; to print a value without recording it into the
value history, use the @code{output} command instead of the
@code{print} command.

Using this prefix also disables confirmation requests
(@pxref{confirmation requests}).

@node Prompting
@section Annotation for @value{GDBN} Input

@cindex annotations for prompts
When @value{GDBN} prompts for input, it annotates this fact so it is possible
to know when to send output, when the output from a given command is
over, etc.

Different kinds of input each have a different @dfn{input type}.  Each
input type has three annotations: a @code{pre-} annotation, which
denotes the beginning of any prompt which is being output, a plain
annotation, which denotes the end of the prompt, and then a @code{post-}
annotation which denotes the end of any echo which may (or may not) be
associated with the input.  For example, the @code{prompt} input type
features the following annotations:

@smallexample
^Z^Zpre-prompt
^Z^Zprompt
^Z^Zpost-prompt
@end smallexample

The input types are

@table @code
@findex pre-prompt annotation
@findex prompt annotation
@findex post-prompt annotation
@item prompt
When @value{GDBN} is prompting for a command (the main @value{GDBN} prompt).

@findex pre-commands annotation
@findex commands annotation
@findex post-commands annotation
@item commands
When @value{GDBN} prompts for a set of commands, like in the @code{commands}
command.  The annotations are repeated for each command which is input.

@findex pre-overload-choice annotation
@findex overload-choice annotation
@findex post-overload-choice annotation
@item overload-choice
When @value{GDBN} wants the user to select between various overloaded functions.

@findex pre-query annotation
@findex query annotation
@findex post-query annotation
@item query
When @value{GDBN} wants the user to confirm a potentially dangerous operation.

@findex pre-prompt-for-continue annotation
@findex prompt-for-continue annotation
@findex post-prompt-for-continue annotation
@item prompt-for-continue
When @value{GDBN} is asking the user to press return to continue.  Note: Don't
expect this to work well; instead use @code{set height 0} to disable
prompting.  This is because the counting of lines is buggy in the
presence of annotations.
@end table

@node Errors
@section Errors
@cindex annotations for errors, warnings and interrupts

@findex quit annotation
@smallexample
^Z^Zquit
@end smallexample

This annotation occurs right before @value{GDBN} responds to an interrupt.

@findex error annotation
@smallexample
^Z^Zerror
@end smallexample

This annotation occurs right before @value{GDBN} responds to an error.

Quit and error annotations indicate that any annotations which @value{GDBN} was
in the middle of may end abruptly.  For example, if a
@code{value-history-begin} annotation is followed by a @code{error}, one
cannot expect to receive the matching @code{value-history-end}.  One
cannot expect not to receive it either, however; an error annotation
does not necessarily mean that @value{GDBN} is immediately returning all the way
to the top level.

@findex error-begin annotation
A quit or error annotation may be preceded by

@smallexample
^Z^Zerror-begin
@end smallexample

Any output between that and the quit or error annotation is the error
message.

Warning messages are not yet annotated.
@c If we want to change that, need to fix warning(), type_error(),
@c range_error(), and possibly other places.

@node Invalidation
@section Invalidation Notices

@cindex annotations for invalidation messages
The following annotations say that certain pieces of state may have
changed.

@table @code
@findex frames-invalid annotation
@item ^Z^Zframes-invalid

The frames (for example, output from the @code{backtrace} command) may
have changed.

@findex breakpoints-invalid annotation
@item ^Z^Zbreakpoints-invalid

The breakpoints may have changed.  For example, the user just added or
deleted a breakpoint.
@end table

@node Annotations for Running
@section Running the Program
@cindex annotations for running programs

@findex starting annotation
@findex stopping annotation
When the program starts executing due to a @value{GDBN} command such as
@code{step} or @code{continue},

@smallexample
^Z^Zstarting
@end smallexample

is output.  When the program stops,

@smallexample
^Z^Zstopped
@end smallexample

is output.  Before the @code{stopped} annotation, a variety of
annotations describe how the program stopped.

@table @code
@findex exited annotation
@item ^Z^Zexited @var{exit-status}
The program exited, and @var{exit-status} is the exit status (zero for
successful exit, otherwise nonzero).

@findex signalled annotation
@findex signal-name annotation
@findex signal-name-end annotation
@findex signal-string annotation
@findex signal-string-end annotation
@item ^Z^Zsignalled
The program exited with a signal.  After the @code{^Z^Zsignalled}, the
annotation continues:

@smallexample
@var{intro-text}
^Z^Zsignal-name
@var{name}
^Z^Zsignal-name-end
@var{middle-text}
^Z^Zsignal-string
@var{string}
^Z^Zsignal-string-end
@var{end-text}
@end smallexample

@noindent
where @var{name} is the name of the signal, such as @code{SIGILL} or
@code{SIGSEGV}, and @var{string} is the explanation of the signal, such
as @code{Illegal Instruction} or @code{Segmentation fault}.  The arguments
@var{intro-text}, @var{middle-text}, and @var{end-text} are for the
user's benefit and have no particular format.

@findex signal annotation
@item ^Z^Zsignal
The syntax of this annotation is just like @code{signalled}, but @value{GDBN} is
just saying that the program received the signal, not that it was
terminated with it.

@findex breakpoint annotation
@item ^Z^Zbreakpoint @var{number}
The program hit breakpoint number @var{number}.

@findex watchpoint annotation
@item ^Z^Zwatchpoint @var{number}
The program hit watchpoint number @var{number}.
@end table

@node Source Annotations
@section Displaying Source
@cindex annotations for source display

@findex source annotation
The following annotation is used instead of displaying source code:

@smallexample
^Z^Zsource @var{filename}:@var{line}:@var{character}:@var{middle}:@var{addr}
@end smallexample

where @var{filename} is an absolute file name indicating which source
file, @var{line} is the line number within that file (where 1 is the
first line in the file), @var{character} is the character position
within the file (where 0 is the first character in the file) (for most
debug formats this will necessarily point to the beginning of a line),
@var{middle} is @samp{middle} if @var{addr} is in the middle of the
line, or @samp{beg} if @var{addr} is at the beginning of the line, and
@var{addr} is the address in the target program associated with the
source which is being displayed.  The @var{addr} is in the form @samp{0x}
followed by one or more lowercase hex digits (note that this does not
depend on the language).

@node JIT Interface
@chapter JIT Compilation Interface
@cindex just-in-time compilation
@cindex JIT compilation interface

This chapter documents @value{GDBN}'s @dfn{just-in-time} (JIT) compilation
interface.  A JIT compiler is a program or library that generates native
executable code at runtime and executes it, usually in order to achieve good
performance while maintaining platform independence. 

Programs that use JIT compilation are normally difficult to debug because
portions of their code are generated at runtime, instead of being loaded from
object files, which is where @value{GDBN} normally finds the program's symbols
and debug information.  In order to debug programs that use JIT compilation,
@value{GDBN} has an interface that allows the program to register in-memory
symbol files with @value{GDBN} at runtime.

If you are using @value{GDBN} to debug a program that uses this interface, then
it should work transparently so long as you have not stripped the binary.  If
you are developing a JIT compiler, then the interface is documented in the rest
of this chapter.  At this time, the only known client of this interface is the
LLVM JIT.

Broadly speaking, the JIT interface mirrors the dynamic loader interface.  The
JIT compiler communicates with @value{GDBN} by writing data into a global
variable and calling a fuction at a well-known symbol.  When @value{GDBN}
attaches, it reads a linked list of symbol files from the global variable to
find existing code, and puts a breakpoint in the function so that it can find
out about additional code.

@menu
* Declarations::                Relevant C struct declarations
* Registering Code::            Steps to register code
* Unregistering Code::          Steps to unregister code
* Custom Debug Info::           Emit debug information in a custom format
@end menu

@node Declarations
@section JIT Declarations

These are the relevant struct declarations that a C program should include to
implement the interface:

@smallexample
typedef enum
@{
  JIT_NOACTION = 0,
  JIT_REGISTER_FN,
  JIT_UNREGISTER_FN
@} jit_actions_t;

struct jit_code_entry
@{
  struct jit_code_entry *next_entry;
  struct jit_code_entry *prev_entry;
  const char *symfile_addr;
  uint64_t symfile_size;
@};

struct jit_descriptor
@{
  uint32_t version;
  /* This type should be jit_actions_t, but we use uint32_t
     to be explicit about the bitwidth.  */
  uint32_t action_flag;
  struct jit_code_entry *relevant_entry;
  struct jit_code_entry *first_entry;
@};

/* GDB puts a breakpoint in this function.  */
void __attribute__((noinline)) __jit_debug_register_code() @{ @};

/* Make sure to specify the version statically, because the
   debugger may check the version before we can set it.  */
struct jit_descriptor __jit_debug_descriptor = @{ 1, 0, 0, 0 @};
@end smallexample

If the JIT is multi-threaded, then it is important that the JIT synchronize any
modifications to this global data properly, which can easily be done by putting
a global mutex around modifications to these structures.

@node Registering Code
@section Registering Code

To register code with @value{GDBN}, the JIT should follow this protocol:

@itemize @bullet
@item
Generate an object file in memory with symbols and other desired debug
information.  The file must include the virtual addresses of the sections.

@item
Create a code entry for the file, which gives the start and size of the symbol
file.

@item
Add it to the linked list in the JIT descriptor.

@item
Point the relevant_entry field of the descriptor at the entry.

@item
Set @code{action_flag} to @code{JIT_REGISTER} and call
@code{__jit_debug_register_code}.
@end itemize

When @value{GDBN} is attached and the breakpoint fires, @value{GDBN} uses the
@code{relevant_entry} pointer so it doesn't have to walk the list looking for
new code.  However, the linked list must still be maintained in order to allow
@value{GDBN} to attach to a running process and still find the symbol files.

@node Unregistering Code
@section Unregistering Code

If code is freed, then the JIT should use the following protocol:

@itemize @bullet
@item
Remove the code entry corresponding to the code from the linked list.

@item
Point the @code{relevant_entry} field of the descriptor at the code entry.

@item
Set @code{action_flag} to @code{JIT_UNREGISTER} and call
@code{__jit_debug_register_code}.
@end itemize

If the JIT frees or recompiles code without unregistering it, then @value{GDBN}
and the JIT will leak the memory used for the associated symbol files.

@node Custom Debug Info
@section Custom Debug Info
@cindex custom JIT debug info
@cindex JIT debug info reader

Generating debug information in platform-native file formats (like ELF
or COFF) may be an overkill for JIT compilers; especially if all the
debug info is used for is displaying a meaningful backtrace.  The
issue can be resolved by having the JIT writers decide on a debug info
format and also provide a reader that parses the debug info generated
by the JIT compiler.  This section gives a brief overview on writing
such a parser.  More specific details can be found in the source file
@file{gdb/jit-reader.in}, which is also installed as a header at
@file{@var{includedir}/gdb/jit-reader.h} for easy inclusion.

The reader is implemented as a shared object (so this functionality is
not available on platforms which don't allow loading shared objects at
runtime).  Two @value{GDBN} commands, @code{jit-reader-load} and
@code{jit-reader-unload} are provided, to be used to load and unload
the readers from a preconfigured directory.  Once loaded, the shared
object is used the parse the debug information emitted by the JIT
compiler.

@menu
* Using JIT Debug Info Readers::       How to use supplied readers correctly
* Writing JIT Debug Info Readers::     Creating a debug-info reader
@end menu

@node Using JIT Debug Info Readers
@subsection Using JIT Debug Info Readers
@kindex jit-reader-load
@kindex jit-reader-unload

Readers can be loaded and unloaded using the @code{jit-reader-load}
and @code{jit-reader-unload} commands.

@table @code
@item jit-reader-load @var{reader}
Load the JIT reader named @var{reader}, which is a shared
object specified as either an absolute or a relative file name.  In
the latter case, @value{GDBN} will try to load the reader from a
pre-configured directory, usually @file{@var{libdir}/gdb/} on a UNIX
system (here @var{libdir} is the system library directory, often
@file{/usr/local/lib}).

Only one reader can be active at a time; trying to load a second
reader when one is already loaded will result in @value{GDBN}
reporting an error.  A new JIT reader can be loaded by first unloading
the current one using @code{jit-reader-unload} and then invoking
@code{jit-reader-load}.

@item jit-reader-unload
Unload the currently loaded JIT reader.

@end table

@node Writing JIT Debug Info Readers
@subsection Writing JIT Debug Info Readers
@cindex writing JIT debug info readers

As mentioned, a reader is essentially a shared object conforming to a
certain ABI.  This ABI is described in @file{jit-reader.h}.

@file{jit-reader.h} defines the structures, macros and functions
required to write a reader.  It is installed (along with
@value{GDBN}), in @file{@var{includedir}/gdb} where @var{includedir} is
the system include directory.

Readers need to be released under a GPL compatible license.  A reader
can be declared as released under such a license by placing the macro
@code{GDB_DECLARE_GPL_COMPATIBLE_READER} in a source file.

The entry point for readers is the symbol @code{gdb_init_reader},
which is expected to be a function with the prototype

@findex gdb_init_reader
@smallexample
extern struct gdb_reader_funcs *gdb_init_reader (void);
@end smallexample

@cindex @code{struct gdb_reader_funcs}

@code{struct gdb_reader_funcs} contains a set of pointers to callback
functions.  These functions are executed to read the debug info
generated by the JIT compiler (@code{read}), to unwind stack frames
(@code{unwind}) and to create canonical frame IDs
(@code{get_Frame_id}).  It also has a callback that is called when the
reader is being unloaded (@code{destroy}).  The struct looks like this

@smallexample
struct gdb_reader_funcs
@{
  /* Must be set to GDB_READER_INTERFACE_VERSION.  */
  int reader_version;

  /* For use by the reader.  */
  void *priv_data;

  gdb_read_debug_info *read;
  gdb_unwind_frame *unwind;
  gdb_get_frame_id *get_frame_id;
  gdb_destroy_reader *destroy;
@};
@end smallexample

@cindex @code{struct gdb_symbol_callbacks}
@cindex @code{struct gdb_unwind_callbacks}

The callbacks are provided with another set of callbacks by
@value{GDBN} to do their job.  For @code{read}, these callbacks are
passed in a @code{struct gdb_symbol_callbacks} and for @code{unwind}
and @code{get_frame_id}, in a @code{struct gdb_unwind_callbacks}.
@code{struct gdb_symbol_callbacks} has callbacks to create new object
files and new symbol tables inside those object files.  @code{struct
gdb_unwind_callbacks} has callbacks to read registers off the current
frame and to write out the values of the registers in the previous
frame.  Both have a callback (@code{target_read}) to read bytes off the
target's address space.

@node In-Process Agent
@chapter In-Process Agent
@cindex debugging agent
The traditional debugging model is conceptually low-speed, but works fine,
because most bugs can be reproduced in debugging-mode execution.  However,
as multi-core or many-core processors are becoming mainstream, and
multi-threaded programs become more and more popular, there should be more
and more bugs that only manifest themselves at normal-mode execution, for
example, thread races, because debugger's interference with the program's
timing may conceal the bugs.  On the other hand, 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 fail, even when the
code itself is correct.  It is useful to be able to observe the program's
behavior without interrupting it.

Therefore, traditional debugging model is too intrusive to reproduce
some bugs.  In order to reduce the interference with the program, we can
reduce the number of operations performed by debugger.  The
@dfn{In-Process Agent}, a shared library, is running within the same
process with inferior, and is able to perform some debugging operations
itself.  As a result, debugger is only involved when necessary, and
performance of debugging can be improved accordingly.  Note that
interference with program can be reduced but can't be removed completely,
because the in-process agent will still stop or slow down the program.

The in-process agent can interpret and execute Agent Expressions
(@pxref{Agent Expressions}) during performing debugging operations.  The
agent expressions can be used for different purposes, such as collecting
data in tracepoints, and condition evaluation in breakpoints.

@anchor{Control Agent}
You can control whether the in-process agent is used as an aid for
debugging with the following commands:

@table @code
@kindex set agent on
@item set agent on
Causes the in-process agent to perform some operations on behalf of the
debugger.  Just which operations requested by the user will be done
by the in-process agent depends on the its capabilities.  For example,
if you request to evaluate breakpoint conditions in the in-process agent,
and the in-process agent has such capability as well, then breakpoint
conditions will be evaluated in the in-process agent.

@kindex set agent off
@item set agent off
Disables execution of debugging operations by the in-process agent.  All
of the operations will be performed by @value{GDBN}.

@kindex show agent
@item show agent
Display the current setting of execution of debugging operations by
the in-process agent.
@end table

@menu
* In-Process Agent Protocol::
@end menu

@node In-Process Agent Protocol
@section In-Process Agent Protocol
@cindex in-process agent protocol

The in-process agent is able to communicate with both @value{GDBN} and
GDBserver (@pxref{In-Process Agent}).  This section documents the protocol
used for communications between @value{GDBN} or GDBserver and the IPA.
In general, @value{GDBN} or GDBserver sends commands
(@pxref{IPA Protocol Commands}) and data to in-process agent, and then
in-process agent replies back with the return result of the command, or
some other information.  The data sent to in-process agent is composed
of primitive data types, such as 4-byte or 8-byte type, and composite
types, which are called objects (@pxref{IPA Protocol Objects}).

@menu
* IPA Protocol Objects::
* IPA Protocol Commands::
@end menu

@node IPA Protocol Objects
@subsection IPA Protocol Objects
@cindex ipa protocol objects

The commands sent to and results received from agent may contain some
complex data types called @dfn{objects}.

The in-process agent is running on the same machine with @value{GDBN}
or GDBserver, so it doesn't have to handle as much differences between
two ends as remote protocol (@pxref{Remote Protocol}) tries to handle.
However, there are still some differences of two ends in two processes:

@enumerate
@item
word size.  On some 64-bit machines, @value{GDBN} or GDBserver can be
compiled as a 64-bit executable, while in-process agent is a 32-bit one.
@item
ABI.  Some machines may have multiple types of ABI, @value{GDBN} or
GDBserver is compiled with one, and in-process agent is compiled with
the other one.
@end enumerate

Here are the IPA Protocol Objects:

@enumerate
@item
agent expression object.  It represents an agent expression
(@pxref{Agent Expressions}).
@anchor{agent expression object}
@item
tracepoint action object.  It represents a tracepoint action
(@pxref{Tracepoint Actions,,Tracepoint Action Lists}) to collect registers,
memory, static trace data and to evaluate expression.
@anchor{tracepoint action object}
@item
tracepoint object.  It represents a tracepoint (@pxref{Tracepoints}).
@anchor{tracepoint object}

@end enumerate

The following table describes important attributes of each IPA protocol
object:

@multitable @columnfractions .30 .20 .50
@headitem Name @tab Size @tab Description
@item @emph{agent expression object} @tab @tab
@item length @tab 4 @tab length of bytes code
@item byte code @tab @var{length} @tab contents of byte code
@item @emph{tracepoint action for collecting memory} @tab @tab
@item 'M' @tab 1 @tab type of tracepoint action
@item addr @tab 8 @tab if @var{basereg} is @samp{-1}, @var{addr} is the
address of the lowest byte to collect, otherwise @var{addr} is the offset
of @var{basereg} for memory collecting.
@item len @tab 8 @tab length of memory for collecting
@item basereg @tab 4 @tab the register number containing the starting
memory address for collecting.
@item @emph{tracepoint action for collecting registers} @tab @tab
@item 'R' @tab 1 @tab type of tracepoint action
@item @emph{tracepoint action for collecting static trace data} @tab @tab
@item 'L' @tab 1 @tab type of tracepoint action
@item @emph{tracepoint action for expression evaluation} @tab @tab
@item 'X' @tab 1 @tab type of tracepoint action
@item agent expression @tab length of @tab @ref{agent expression object}
@item @emph{tracepoint object} @tab @tab
@item number @tab 4 @tab number of tracepoint
@item address @tab 8 @tab address of tracepoint inserted on
@item type @tab 4 @tab type of tracepoint
@item enabled @tab 1 @tab enable or disable of tracepoint
@item step_count @tab 8 @tab step
@item pass_count @tab 8 @tab pass
@item numactions @tab 4 @tab number of tracepoint actions
@item hit count @tab 8 @tab hit count
@item trace frame usage @tab 8 @tab trace frame usage
@item compiled_cond @tab 8 @tab compiled condition
@item orig_size @tab 8 @tab orig size
@item condition @tab 4 if condition is NULL otherwise length of
@ref{agent expression object}
@tab zero if condition is NULL, otherwise is
@ref{agent expression object}
@item actions @tab variable
@tab numactions number of @ref{tracepoint action object}
@end multitable

@node IPA Protocol Commands
@subsection IPA Protocol Commands
@cindex ipa protocol commands

The spaces in each command are delimiters to ease reading this commands
specification.  They don't exist in real commands.

@table @samp

@item FastTrace:@var{tracepoint_object} @var{gdb_jump_pad_head}
Installs a new fast tracepoint described by @var{tracepoint_object}
(@pxref{tracepoint object}).  The @var{gdb_jump_pad_head}, 8-byte long, is the
head of @dfn{jumppad}, which is used to jump to data collection routine
in IPA finally.

Replies:
@table @samp
@item OK @var{target_address} @var{gdb_jump_pad_head} @var{fjump_size} @var{fjump}
@var{target_address} is address of tracepoint in the inferior.
The @var{gdb_jump_pad_head} is updated head of jumppad.  Both of
@var{target_address} and @var{gdb_jump_pad_head} are 8-byte long.
The @var{fjump} contains a sequence of instructions jump to jumppad entry.
The @var{fjump_size}, 4-byte long, is the size of @var{fjump}.
@item E @var{NN}
for an error

@end table

@item close
Closes the in-process agent.  This command is sent when @value{GDBN} or GDBserver
is about to kill inferiors.

@item qTfSTM
@xref{qTfSTM}.
@item qTsSTM
@xref{qTsSTM}.
@item qTSTMat
@xref{qTSTMat}.
@item probe_marker_at:@var{address}
Asks in-process agent to probe the marker at @var{address}.

Replies:
@table @samp
@item E @var{NN}
for an error
@end table
@item unprobe_marker_at:@var{address}
Asks in-process agent to unprobe the marker at @var{address}.
@end table

@node GDB Bugs
@chapter Reporting Bugs in @value{GDBN}
@cindex bugs in @value{GDBN}
@cindex reporting bugs in @value{GDBN}

Your bug reports play an essential role in making @value{GDBN} reliable.

Reporting a bug may help you by bringing a solution to your problem, or it
may not.  But in any case the principal function of a bug report is to help
the entire community by making the next version of @value{GDBN} work better.  Bug
reports are your contribution to the maintenance of @value{GDBN}.

In order for a bug report to serve its purpose, you must include the
information that enables us to fix the bug.

@menu
* Bug Criteria::                Have you found a bug?
* Bug Reporting::               How to report bugs
@end menu

@node Bug Criteria
@section Have You Found a Bug?
@cindex bug criteria

If you are not sure whether you have found a bug, here are some guidelines:

@itemize @bullet
@cindex fatal signal
@cindex debugger crash
@cindex crash of debugger
@item
If the debugger gets a fatal signal, for any input whatever, that is a
@value{GDBN} bug.  Reliable debuggers never crash.

@cindex error on valid input
@item
If @value{GDBN} produces an error message for valid input, that is a
bug.  (Note that if you're cross debugging, the problem may also be
somewhere in the connection to the target.)

@cindex invalid input
@item
If @value{GDBN} does not produce an error message for invalid input,
that is a bug.  However, you should note that your idea of
``invalid input'' might be our idea of ``an extension'' or ``support
for traditional practice''.

@item
If you are an experienced user of debugging tools, your suggestions
for improvement of @value{GDBN} are welcome in any case.
@end itemize

@node Bug Reporting
@section How to Report Bugs
@cindex bug reports
@cindex @value{GDBN} bugs, reporting

A number of companies and individuals offer support for @sc{gnu} products.
If you obtained @value{GDBN} from a support organization, we recommend you
contact that organization first.

You can find contact information for many support companies and
individuals in the file @file{etc/SERVICE} in the @sc{gnu} Emacs
distribution.
@c should add a web page ref...

@ifset BUGURL
@ifset BUGURL_DEFAULT
In any event, we also recommend that you submit bug reports for
@value{GDBN}.  The preferred method is to submit them directly using
@uref{http://www.gnu.org/software/gdb/bugs/, @value{GDBN}'s Bugs web
page}.  Alternatively, the @email{bug-gdb@@gnu.org, e-mail gateway} can
be used.

@strong{Do not send bug reports to @samp{info-gdb}, or to
@samp{help-gdb}, or to any newsgroups.}  Most users of @value{GDBN} do
not want to receive bug reports.  Those that do have arranged to receive
@samp{bug-gdb}.

The mailing list @samp{bug-gdb} has a newsgroup @samp{gnu.gdb.bug} which
serves as a repeater.  The mailing list and the newsgroup carry exactly
the same messages.  Often people think of posting bug reports to the
newsgroup instead of mailing them.  This appears to work, but it has one
problem which can be crucial: a newsgroup posting often lacks a mail
path back to the sender.  Thus, if we need to ask for more information,
we may be unable to reach you.  For this reason, it is better to send
bug reports to the mailing list.
@end ifset
@ifclear BUGURL_DEFAULT
In any event, we also recommend that you submit bug reports for
@value{GDBN} to @value{BUGURL}.
@end ifclear
@end ifset

The fundamental principle of reporting bugs usefully is this:
@strong{report all the facts}.  If you are not sure whether to state a
fact or leave it out, state it!

Often people omit facts because they think they know what causes the
problem and assume that some details do not matter.  Thus, you might
assume that the name of the variable you use in an example does not matter.
Well, probably it does not, but one cannot be sure.  Perhaps the bug is a
stray memory reference which happens to fetch from the location where that
name is stored in memory; perhaps, if the name were different, the contents
of that location would fool the debugger into doing the right thing despite
the bug.  Play it safe and give a specific, complete example.  That is the
easiest thing for you to do, and the most helpful.

Keep in mind that the purpose of a bug report is to enable us to fix the
bug.  It may be that the bug has been reported previously, but neither
you nor we can know that unless your bug report is complete and
self-contained.

Sometimes people give a few sketchy facts and ask, ``Does this ring a
bell?''  Those bug reports are useless, and we urge everyone to
@emph{refuse to respond to them} except to chide the sender to report
bugs properly.

To enable us to fix the bug, you should include all these things:

@itemize @bullet
@item
The version of @value{GDBN}.  @value{GDBN} announces it if you start
with no arguments; you can also print it at any time using @code{show
version}.

Without this, we will not know whether there is any point in looking for
the bug in the current version of @value{GDBN}.

@item
The type of machine you are using, and the operating system name and
version number.

@item
The details of the @value{GDBN} build-time configuration.
@value{GDBN} shows these details if you invoke it with the
@option{--configuration} command-line option, or if you type
@code{show configuration} at @value{GDBN}'s prompt.

@item
What compiler (and its version) was used to compile @value{GDBN}---e.g.@:
``@value{GCC}--2.8.1''.

@item
What compiler (and its version) was used to compile the program you are
debugging---e.g.@:  ``@value{GCC}--2.8.1'', or ``HP92453-01 A.10.32.03 HP
C Compiler''.  For @value{NGCC}, you can say @kbd{@value{GCC} --version}
to get this information; for other compilers, see the documentation for
those compilers.

@item
The command arguments you gave the compiler to compile your example and
observe the bug.  For example, did you use @samp{-O}?  To guarantee
you will not omit something important, list them all.  A copy of the
Makefile (or the output from make) is sufficient.

If we were to try to guess the arguments, we would probably guess wrong
and then we might not encounter the bug.

@item
A complete input script, and all necessary source files, that will
reproduce the bug.

@item
A description of what behavior you observe that you believe is
incorrect.  For example, ``It gets a fatal signal.''

Of course, if the bug is that @value{GDBN} gets a fatal signal, then we
will certainly notice it.  But if the bug is incorrect output, we might
not notice unless it is glaringly wrong.  You might as well not give us
a chance to make a mistake.

Even if the problem you experience is a fatal signal, you should still
say so explicitly.  Suppose something strange is going on, such as, your
copy of @value{GDBN} is out of synch, or you have encountered a bug in
the C library on your system.  (This has happened!)  Your copy might
crash and ours would not.  If you told us to expect a crash, then when
ours fails to crash, we would know that the bug was not happening for
us.  If you had not told us to expect a crash, then we would not be able
to draw any conclusion from our observations.

@pindex script
@cindex recording a session script
To collect all this information, you can use a session recording program
such as @command{script}, which is available on many Unix systems.
Just run your @value{GDBN} session inside @command{script} and then
include the @file{typescript} file with your bug report.

Another way to record a @value{GDBN} session is to run @value{GDBN}
inside Emacs and then save the entire buffer to a file.

@item
If you wish to suggest changes to the @value{GDBN} source, send us context
diffs.  If you even discuss something in the @value{GDBN} source, refer to
it by context, not by line number.

The line numbers in our development sources will not match those in your
sources.  Your line numbers would convey no useful information to us.

@end itemize

Here are some things that are not necessary:

@itemize @bullet
@item
A description of the envelope of the bug.

Often people who encounter a bug spend a lot of time investigating
which changes to the input file will make the bug go away and which
changes will not affect it.

This is often time consuming and not very useful, because the way we
will find the bug is by running a single example under the debugger
with breakpoints, not by pure deduction from a series of examples.
We recommend that you save your time for something else.

Of course, if you can find a simpler example to report @emph{instead}
of the original one, that is a convenience for us.  Errors in the
output will be easier to spot, running under the debugger will take
less time, and so on.

However, simplification is not vital; if you do not want to do this,
report the bug anyway and send us the entire test case you used.

@item
A patch for the bug.

A patch for the bug does help us if it is a good one.  But do not omit
the necessary information, such as the test case, on the assumption that
a patch is all we need.  We might see problems with your patch and decide
to fix the problem another way, or we might not understand it at all.

Sometimes with a program as complicated as @value{GDBN} it is very hard to
construct an example that will make the program follow a certain path
through the code.  If you do not send us the example, we will not be able
to construct one, so we will not be able to verify that the bug is fixed.

And if we cannot understand what bug you are trying to fix, or why your
patch should be an improvement, we will not install it.  A test case will
help us to understand.

@item
A guess about what the bug is or what it depends on.

Such guesses are usually wrong.  Even we cannot guess right about such
things without first using the debugger to find the facts.
@end itemize

@c The readline documentation is distributed with the readline code
@c and consists of the two following files:
@c     rluser.texi
@c     hsuser.texi
@c Use -I with makeinfo to point to the appropriate directory,
@c environment var TEXINPUTS with TeX.
@ifclear SYSTEM_READLINE
@include rluser.texi
@include hsuser.texi
@end ifclear

@node In Memoriam
@appendix In Memoriam

The @value{GDBN} project mourns the loss of the following long-time
contributors:

@table @code
@item Fred Fish
Fred was a long-standing contributor to @value{GDBN} (1991-2006), and
to Free Software in general.  Outside of @value{GDBN}, he was known in
the Amiga world for his series of Fish Disks, and the GeekGadget project.

@item Michael Snyder
Michael was one of the Global Maintainers of the @value{GDBN} project,
with contributions recorded as early as 1996, until 2011.  In addition
to his day to day participation, he was a large driving force behind
adding Reverse Debugging to @value{GDBN}.
@end table

Beyond their technical contributions to the project, they were also
enjoyable members of the Free Software Community.  We will miss them.

@node Formatting Documentation
@appendix Formatting Documentation

@cindex @value{GDBN} reference card
@cindex reference card
The @value{GDBN} 4 release includes an already-formatted reference card, ready
for printing with PostScript or Ghostscript, in the @file{gdb}
subdirectory of the main source directory@footnote{In
@file{gdb-@value{GDBVN}/gdb/refcard.ps} of the version @value{GDBVN}
release.}.  If you can use PostScript or Ghostscript with your printer,
you can print the reference card immediately with @file{refcard.ps}.

The release also includes the source for the reference card.  You
can format it, using @TeX{}, by typing:

@smallexample
make refcard.dvi
@end smallexample

The @value{GDBN} reference card is designed to print in @dfn{landscape}
mode on US ``letter'' size paper;
that is, on a sheet 11 inches wide by 8.5 inches
high.  You will need to specify this form of printing as an option to
your @sc{dvi} output program.

@cindex documentation

All the documentation for @value{GDBN} comes as part of the machine-readable
distribution.  The documentation is written in Texinfo format, which is
a documentation system that uses a single source file to produce both
on-line information and a printed manual.  You can use one of the Info
formatting commands to create the on-line version of the documentation
and @TeX{} (or @code{texi2roff}) to typeset the printed version.

@value{GDBN} includes an already formatted copy of the on-line Info
version of this manual in the @file{gdb} subdirectory.  The main Info
file is @file{gdb-@value{GDBVN}/gdb/gdb.info}, and it refers to
subordinate files matching @samp{gdb.info*} in the same directory.  If
necessary, you can print out these files, or read them with any editor;
but they are easier to read using the @code{info} subsystem in @sc{gnu}
Emacs or the standalone @code{info} program, available as part of the
@sc{gnu} Texinfo distribution.

If you want to format these Info files yourself, you need one of the
Info formatting programs, such as @code{texinfo-format-buffer} or
@code{makeinfo}.

If you have @code{makeinfo} installed, and are in the top level
@value{GDBN} source directory (@file{gdb-@value{GDBVN}}, in the case of
version @value{GDBVN}), you can make the Info file by typing:

@smallexample
cd gdb
make gdb.info
@end smallexample

If you want to typeset and print copies of this manual, you need @TeX{},
a program to print its @sc{dvi} output files, and @file{texinfo.tex}, the
Texinfo definitions file.

@TeX{} is a typesetting program; it does not print files directly, but
produces output files called @sc{dvi} files.  To print a typeset
document, you need a program to print @sc{dvi} files.  If your system
has @TeX{} installed, chances are it has such a program.  The precise
command to use depends on your system; @kbd{lpr -d} is common; another
(for PostScript devices) is @kbd{dvips}.  The @sc{dvi} print command may
require a file name without any extension or a @samp{.dvi} extension.

@TeX{} also requires a macro definitions file called
@file{texinfo.tex}.  This file tells @TeX{} how to typeset a document
written in Texinfo format.  On its own, @TeX{} cannot either read or
typeset a Texinfo file.  @file{texinfo.tex} is distributed with GDB
and is located in the @file{gdb-@var{version-number}/texinfo}
directory.

If you have @TeX{} and a @sc{dvi} printer program installed, you can
typeset and print this manual.  First switch to the @file{gdb}
subdirectory of the main source directory (for example, to
@file{gdb-@value{GDBVN}/gdb}) and type:

@smallexample
make gdb.dvi
@end smallexample

Then give @file{gdb.dvi} to your @sc{dvi} printing program.

@node Installing GDB
@appendix Installing @value{GDBN}
@cindex installation

@menu
* Requirements::                Requirements for building @value{GDBN}
* Running Configure::           Invoking the @value{GDBN} @file{configure} script
* Separate Objdir::             Compiling @value{GDBN} in another directory
* Config Names::                Specifying names for hosts and targets
* Configure Options::           Summary of options for configure
* System-wide configuration::   Having a system-wide init file
@end menu

@node Requirements
@section Requirements for Building @value{GDBN}
@cindex building @value{GDBN}, requirements for

Building @value{GDBN} requires various tools and packages to be available.
Other packages will be used only if they are found.

@heading Tools/Packages Necessary for Building @value{GDBN}
@table @asis
@item ISO C90 compiler
@value{GDBN} is written in ISO C90.  It should be buildable with any
working C90 compiler, e.g.@: GCC.

@end table

@heading Tools/Packages Optional for Building @value{GDBN}
@table @asis
@item Expat
@anchor{Expat}
@value{GDBN} can use the Expat XML parsing library.  This library may be
included with your operating system distribution; if it is not, you
can get the latest version from @url{http://expat.sourceforge.net}.
The @file{configure} script will search for this library in several
standard locations; if it is installed in an unusual path, you can
use the @option{--with-libexpat-prefix} option to specify its location.

Expat is used for:

@itemize @bullet
@item
Remote protocol memory maps (@pxref{Memory Map Format})
@item
Target descriptions (@pxref{Target Descriptions})
@item
Remote shared library lists (@xref{Library List Format},
or alternatively @pxref{Library List Format for SVR4 Targets})
@item
MS-Windows shared libraries (@pxref{Shared Libraries})
@item
Traceframe info (@pxref{Traceframe Info Format})
@item
Branch trace (@pxref{Branch Trace Format})
@end itemize

@item zlib
@cindex compressed debug sections 
@value{GDBN} will use the @samp{zlib} library, if available, to read
compressed debug sections.  Some linkers, such as GNU gold, are capable
of producing binaries with compressed debug sections.  If @value{GDBN}
is compiled with @samp{zlib}, it will be able to read the debug
information in such binaries.

The @samp{zlib} library is likely included with your operating system
distribution; if it is not, you can get the latest version from
@url{http://zlib.net}.

@item iconv
@value{GDBN}'s features related to character sets (@pxref{Character
Sets}) require a functioning @code{iconv} implementation.  If you are
on a GNU system, then this is provided by the GNU C Library.  Some
other systems also provide a working @code{iconv}.

If @value{GDBN} is using the @code{iconv} program which is installed
in a non-standard place, you will need to tell @value{GDBN} where to find it.
This is done with @option{--with-iconv-bin} which specifies the
directory that contains the @code{iconv} program.

On systems without @code{iconv}, you can install GNU Libiconv.  If you
have previously installed Libiconv, you can use the
@option{--with-libiconv-prefix} option to configure.

@value{GDBN}'s top-level @file{configure} and @file{Makefile} will
arrange to build Libiconv if a directory named @file{libiconv} appears
in the top-most source directory.  If Libiconv is built this way, and
if the operating system does not provide a suitable @code{iconv}
implementation, then the just-built library will automatically be used
by @value{GDBN}.  One easy way to set this up is to download GNU
Libiconv, unpack it, and then rename the directory holding the
Libiconv source code to @samp{libiconv}.
@end table

@node Running Configure
@section Invoking the @value{GDBN} @file{configure} Script
@cindex configuring @value{GDBN}
@value{GDBN} comes with a @file{configure} script that automates the process
of preparing @value{GDBN} for installation; you can then use @code{make} to
build the @code{gdb} program.
@iftex
@c irrelevant in info file; it's as current as the code it lives with.
@footnote{If you have a more recent version of @value{GDBN} than @value{GDBVN},
look at the @file{README} file in the sources; we may have improved the
installation procedures since publishing this manual.}
@end iftex

The @value{GDBN} distribution includes all the source code you need for
@value{GDBN} in a single directory, whose name is usually composed by
appending the version number to @samp{gdb}.

For example, the @value{GDBN} version @value{GDBVN} distribution is in the
@file{gdb-@value{GDBVN}} directory.  That directory contains:

@table @code
@item gdb-@value{GDBVN}/configure @r{(and supporting files)}
script for configuring @value{GDBN} and all its supporting libraries

@item gdb-@value{GDBVN}/gdb
the source specific to @value{GDBN} itself

@item gdb-@value{GDBVN}/bfd
source for the Binary File Descriptor library

@item gdb-@value{GDBVN}/include
@sc{gnu} include files

@item gdb-@value{GDBVN}/libiberty
source for the @samp{-liberty} free software library

@item gdb-@value{GDBVN}/opcodes
source for the library of opcode tables and disassemblers

@item gdb-@value{GDBVN}/readline
source for the @sc{gnu} command-line interface

@item gdb-@value{GDBVN}/glob
source for the @sc{gnu} filename pattern-matching subroutine

@item gdb-@value{GDBVN}/mmalloc
source for the @sc{gnu} memory-mapped malloc package
@end table

The simplest way to configure and build @value{GDBN} is to run @file{configure}
from the @file{gdb-@var{version-number}} source directory, which in
this example is the @file{gdb-@value{GDBVN}} directory.

First switch to the @file{gdb-@var{version-number}} source directory
if you are not already in it; then run @file{configure}.  Pass the
identifier for the platform on which @value{GDBN} will run as an
argument.

For example:

@smallexample
cd gdb-@value{GDBVN}
./configure @var{host}
make
@end smallexample

@noindent
where @var{host} is an identifier such as @samp{sun4} or
@samp{decstation}, that identifies the platform where @value{GDBN} will run.
(You can often leave off @var{host}; @file{configure} tries to guess the
correct value by examining your system.)

Running @samp{configure @var{host}} and then running @code{make} builds the
@file{bfd}, @file{readline}, @file{mmalloc}, and @file{libiberty}
libraries, then @code{gdb} itself.  The configured source files, and the
binaries, are left in the corresponding source directories.

@need 750
@file{configure} is a Bourne-shell (@code{/bin/sh}) script; if your
system does not recognize this automatically when you run a different
shell, you may need to run @code{sh} on it explicitly:

@smallexample
sh configure @var{host}
@end smallexample

If you run @file{configure} from a directory that contains source
directories for multiple libraries or programs, such as the
@file{gdb-@value{GDBVN}} source directory for version @value{GDBVN},
@file{configure}
creates configuration files for every directory level underneath (unless
you tell it not to, with the @samp{--norecursion} option).

You should run the @file{configure} script from the top directory in the
source tree, the @file{gdb-@var{version-number}} directory.  If you run
@file{configure} from one of the subdirectories, you will configure only
that subdirectory.  That is usually not what you want.  In particular,
if you run the first @file{configure} from the @file{gdb} subdirectory
of the @file{gdb-@var{version-number}} directory, you will omit the
configuration of @file{bfd}, @file{readline}, and other sibling
directories of the @file{gdb} subdirectory.  This leads to build errors
about missing include files such as @file{bfd/bfd.h}.

You can install @code{@value{GDBP}} anywhere; it has no hardwired paths.
However, you should make sure that the shell on your path (named by
the @samp{SHELL} environment variable) is publicly readable.  Remember
that @value{GDBN} uses the shell to start your program---some systems refuse to
let @value{GDBN} debug child processes whose programs are not readable.

@node Separate Objdir
@section Compiling @value{GDBN} in Another Directory

If you want to run @value{GDBN} versions for several host or target machines,
you need a different @code{gdb} compiled for each combination of
host and target.  @file{configure} is designed to make this easy by
allowing you to generate each configuration in a separate subdirectory,
rather than in the source directory.  If your @code{make} program
handles the @samp{VPATH} feature (@sc{gnu} @code{make} does), running
@code{make} in each of these directories builds the @code{gdb}
program specified there.

To build @code{gdb} in a separate directory, run @file{configure}
with the @samp{--srcdir} option to specify where to find the source.
(You also need to specify a path to find @file{configure}
itself from your working directory.  If the path to @file{configure}
would be the same as the argument to @samp{--srcdir}, you can leave out
the @samp{--srcdir} option; it is assumed.)

For example, with version @value{GDBVN}, you can build @value{GDBN} in a
separate directory for a Sun 4 like this:

@smallexample
@group
cd gdb-@value{GDBVN}
mkdir ../gdb-sun4
cd ../gdb-sun4
../gdb-@value{GDBVN}/configure sun4
make
@end group
@end smallexample

When @file{configure} builds a configuration using a remote source
directory, it creates a tree for the binaries with the same structure
(and using the same names) as the tree under the source directory.  In
the example, you'd find the Sun 4 library @file{libiberty.a} in the
directory @file{gdb-sun4/libiberty}, and @value{GDBN} itself in
@file{gdb-sun4/gdb}.

Make sure that your path to the @file{configure} script has just one
instance of @file{gdb} in it.  If your path to @file{configure} looks
like @file{../gdb-@value{GDBVN}/gdb/configure}, you are configuring only
one subdirectory of @value{GDBN}, not the whole package.  This leads to
build errors about missing include files such as @file{bfd/bfd.h}.

One popular reason to build several @value{GDBN} configurations in separate
directories is to configure @value{GDBN} for cross-compiling (where
@value{GDBN} runs on one machine---the @dfn{host}---while debugging
programs that run on another machine---the @dfn{target}).
You specify a cross-debugging target by
giving the @samp{--target=@var{target}} option to @file{configure}.

When you run @code{make} to build a program or library, you must run
it in a configured directory---whatever directory you were in when you
called @file{configure} (or one of its subdirectories).

The @code{Makefile} that @file{configure} generates in each source
directory also runs recursively.  If you type @code{make} in a source
directory such as @file{gdb-@value{GDBVN}} (or in a separate configured
directory configured with @samp{--srcdir=@var{dirname}/gdb-@value{GDBVN}}), you
will build all the required libraries, and then build GDB.

When you have multiple hosts or targets configured in separate
directories, you can run @code{make} on them in parallel (for example,
if they are NFS-mounted on each of the hosts); they will not interfere
with each other.

@node Config Names
@section Specifying Names for Hosts and Targets

The specifications used for hosts and targets in the @file{configure}
script are based on a three-part naming scheme, but some short predefined
aliases are also supported.  The full naming scheme encodes three pieces
of information in the following pattern:

@smallexample
@var{architecture}-@var{vendor}-@var{os}
@end smallexample

For example, you can use the alias @code{sun4} as a @var{host} argument,
or as the value for @var{target} in a @code{--target=@var{target}}
option.  The equivalent full name is @samp{sparc-sun-sunos4}.

The @file{configure} script accompanying @value{GDBN} does not provide
any query facility to list all supported host and target names or
aliases.  @file{configure} calls the Bourne shell script
@code{config.sub} to map abbreviations to full names; you can read the
script, if you wish, or you can use it to test your guesses on
abbreviations---for example:

@smallexample
% sh config.sub i386-linux
i386-pc-linux-gnu
% sh config.sub alpha-linux
alpha-unknown-linux-gnu
% sh config.sub hp9k700
hppa1.1-hp-hpux
% sh config.sub sun4
sparc-sun-sunos4.1.1
% sh config.sub sun3
m68k-sun-sunos4.1.1
% sh config.sub i986v
Invalid configuration `i986v': machine `i986v' not recognized
@end smallexample

@noindent
@code{config.sub} is also distributed in the @value{GDBN} source
directory (@file{gdb-@value{GDBVN}}, for version @value{GDBVN}).

@node Configure Options
@section @file{configure} Options

Here is a summary of the @file{configure} options and arguments that
are most often useful for building @value{GDBN}.  @file{configure} also has
several other options not listed here.  @inforef{What Configure
Does,,configure.info}, for a full explanation of @file{configure}.

@smallexample
configure @r{[}--help@r{]}
          @r{[}--prefix=@var{dir}@r{]}
          @r{[}--exec-prefix=@var{dir}@r{]}
          @r{[}--srcdir=@var{dirname}@r{]}
          @r{[}--norecursion@r{]} @r{[}--rm@r{]}
          @r{[}--target=@var{target}@r{]}
          @var{host}
@end smallexample

@noindent
You may introduce options with a single @samp{-} rather than
@samp{--} if you prefer; but you may abbreviate option names if you use
@samp{--}.

@table @code
@item --help
Display a quick summary of how to invoke @file{configure}.

@item --prefix=@var{dir}
Configure the source to install programs and files under directory
@file{@var{dir}}.

@item --exec-prefix=@var{dir}
Configure the source to install programs under directory
@file{@var{dir}}.

@c avoid splitting the warning from the explanation:
@need 2000
@item --srcdir=@var{dirname}
@strong{Warning: using this option requires @sc{gnu} @code{make}, or another
@code{make} that implements the @code{VPATH} feature.}@*
Use this option to make configurations in directories separate from the
@value{GDBN} source directories.  Among other things, you can use this to
build (or maintain) several configurations simultaneously, in separate
directories.  @file{configure} writes configuration-specific files in
the current directory, but arranges for them to use the source in the
directory @var{dirname}.  @file{configure} creates directories under
the working directory in parallel to the source directories below
@var{dirname}.

@item --norecursion
Configure only the directory level where @file{configure} is executed; do not
propagate configuration to subdirectories.

@item --target=@var{target}
Configure @value{GDBN} for cross-debugging programs running on the specified
@var{target}.  Without this option, @value{GDBN} is configured to debug
programs that run on the same machine (@var{host}) as @value{GDBN} itself.

There is no convenient way to generate a list of all available targets.

@item @var{host} @dots{}
Configure @value{GDBN} to run on the specified @var{host}.

There is no convenient way to generate a list of all available hosts.
@end table

There are many other options available as well, but they are generally
needed for special purposes only.

@node System-wide configuration
@section System-wide configuration and settings
@cindex system-wide init file

@value{GDBN} can be configured to have a system-wide init file;
this file will be read and executed at startup (@pxref{Startup, , What
@value{GDBN} does during startup}).

Here is the corresponding configure option:

@table @code
@item --with-system-gdbinit=@var{file}
Specify that the default location of the system-wide init file is
@var{file}.
@end table

If @value{GDBN} has been configured with the option @option{--prefix=$prefix},
it may be subject to relocation.  Two possible cases:

@itemize @bullet
@item 
If the default location of this init file contains @file{$prefix},
it will be subject to relocation.  Suppose that the configure options
are @option{--prefix=$prefix --with-system-gdbinit=$prefix/etc/gdbinit};
if @value{GDBN} is moved from @file{$prefix} to @file{$install}, the system
init file is looked for as @file{$install/etc/gdbinit} instead of
@file{$prefix/etc/gdbinit}.

@item
By contrast, if the default location does not contain the prefix,
it will not be relocated.  E.g.@: if @value{GDBN} has been configured with
@option{--prefix=/usr/local --with-system-gdbinit=/usr/share/gdb/gdbinit},
then @value{GDBN} will always look for @file{/usr/share/gdb/gdbinit},
wherever @value{GDBN} is installed.
@end itemize

If the configured location of the system-wide init file (as given by the
@option{--with-system-gdbinit} option at configure time) is in the
data-directory (as specified by @option{--with-gdb-datadir} at configure
time) or in one of its subdirectories, then @value{GDBN} will look for the
system-wide init file in the directory specified by the
@option{--data-directory} command-line option.
Note that the system-wide init file is only read once, during @value{GDBN}
initialization.  If the data-directory is changed after @value{GDBN} has
started with the @code{set data-directory} command, the file will not be
reread.

@menu
* System-wide Configuration Scripts::  Installed System-wide Configuration Scripts
@end menu

@node System-wide Configuration Scripts
@subsection Installed System-wide Configuration Scripts
@cindex system-wide configuration scripts

The @file{system-gdbinit} directory, located inside the data-directory
(as specified by @option{--with-gdb-datadir} at configure time) contains
a number of scripts which can be used as system-wide init files.  To
automatically source those scripts at startup, @value{GDBN} should be
configured with @option{--with-system-gdbinit}.  Otherwise, any user
should be able to source them by hand as needed.

The following scripts are currently available:
@itemize @bullet

@item @file{elinos.py}
@pindex elinos.py
@cindex ELinOS system-wide configuration script
This script is useful when debugging a program on an ELinOS target.
It takes advantage of the environment variables defined in a standard
ELinOS environment in order to determine the location of the system
shared libraries, and then sets the @samp{solib-absolute-prefix}
and @samp{solib-search-path} variables appropriately.

@item @file{wrs-linux.py}
@pindex wrs-linux.py
@cindex Wind River Linux system-wide configuration script
This script is useful when debugging a program on a target running
Wind River Linux.  It expects the @env{ENV_PREFIX} to be set to
the host-side sysroot used by the target system.

@end itemize

@node Maintenance Commands
@appendix Maintenance Commands
@cindex maintenance commands
@cindex internal commands

In addition to commands intended for @value{GDBN} users, @value{GDBN}
includes a number of commands intended for @value{GDBN} developers,
that are not documented elsewhere in this manual.  These commands are
provided here for reference.  (For commands that turn on debugging
messages, see @ref{Debugging Output}.)

@table @code
@kindex maint agent
@kindex maint agent-eval
@item maint agent @r{[}-at @var{location}@r{,}@r{]} @var{expression}
@itemx maint agent-eval @r{[}-at @var{location}@r{,}@r{]} @var{expression}
Translate the given @var{expression} into remote agent bytecodes.
This command is useful for debugging the Agent Expression mechanism
(@pxref{Agent Expressions}).  The @samp{agent} version produces an
expression useful for data collection, such as by tracepoints, while
@samp{maint agent-eval} produces an expression that evaluates directly
to a result.  For instance, a collection expression for @code{globa +
globb} will include bytecodes to record four bytes of memory at each
of the addresses of @code{globa} and @code{globb}, while discarding
the result of the addition, while an evaluation expression will do the
addition and return the sum.
If @code{-at} is given, generate remote agent bytecode for @var{location}.
If not, generate remote agent bytecode for current frame PC address.

@kindex maint agent-printf
@item maint agent-printf @var{format},@var{expr},...
Translate the given format string and list of argument expressions
into remote agent bytecodes and display them as a disassembled list.
This command is useful for debugging the agent version of dynamic
printf (@pxref{Dynamic Printf}).

@kindex maint info breakpoints
@item @anchor{maint info breakpoints}maint info breakpoints
Using the same format as @samp{info breakpoints}, display both the
breakpoints you've set explicitly, and those @value{GDBN} is using for
internal purposes.  Internal breakpoints are shown with negative
breakpoint numbers.  The type column identifies what kind of breakpoint
is shown:

@table @code
@item breakpoint
Normal, explicitly set breakpoint.

@item watchpoint
Normal, explicitly set watchpoint.

@item longjmp
Internal breakpoint, used to handle correctly stepping through
@code{longjmp} calls.

@item longjmp resume
Internal breakpoint at the target of a @code{longjmp}.

@item until
Temporary internal breakpoint used by the @value{GDBN} @code{until} command.

@item finish
Temporary internal breakpoint used by the @value{GDBN} @code{finish} command.

@item shlib events
Shared library events.

@end table

@kindex maint info bfds
@item maint info bfds
This prints information about each @code{bfd} object that is known to
@value{GDBN}.  @xref{Top, , BFD, bfd, The Binary File Descriptor Library}.

@kindex set displaced-stepping
@kindex show displaced-stepping
@cindex displaced stepping support
@cindex out-of-line single-stepping
@item set displaced-stepping
@itemx show displaced-stepping
Control whether or not @value{GDBN} will do @dfn{displaced stepping}
if the target supports it.  Displaced stepping is a way to single-step
over breakpoints without removing them from the inferior, by executing
an out-of-line copy of the instruction that was originally at the
breakpoint location.  It is also known as out-of-line single-stepping.

@table @code
@item set displaced-stepping on
If the target architecture supports it, @value{GDBN} will use
displaced stepping to step over breakpoints.

@item set displaced-stepping off
@value{GDBN} will not use displaced stepping to step over breakpoints,
even if such is supported by the target architecture.

@cindex non-stop mode, and @samp{set displaced-stepping}
@item set displaced-stepping auto
This is the default mode.  @value{GDBN} will use displaced stepping
only if non-stop mode is active (@pxref{Non-Stop Mode}) and the target
architecture supports displaced stepping.
@end table

@kindex maint check-psymtabs
@item maint check-psymtabs
Check the consistency of currently expanded psymtabs versus symtabs.
Use this to check, for example, whether a symbol is in one but not the other.

@kindex maint check-symtabs
@item maint check-symtabs
Check the consistency of currently expanded symtabs.

@kindex maint expand-symtabs
@item maint expand-symtabs [@var{regexp}]
Expand symbol tables.
If @var{regexp} is specified, only expand symbol tables for file
names matching @var{regexp}.

@kindex maint set catch-demangler-crashes
@kindex maint show catch-demangler-crashes
@cindex demangler crashes
@item maint set catch-demangler-crashes [on|off]
@itemx maint show catch-demangler-crashes
Control whether @value{GDBN} should attempt to catch crashes in the
symbol name demangler.  The default is to attempt to catch crashes.
If enabled, the first time a crash is caught, a core file is created,
the offending symbol is displayed and the user is presented with the
option to terminate the current session.

@kindex maint cplus first_component
@item maint cplus first_component @var{name}
Print the first C@t{++} class/namespace component of @var{name}.

@kindex maint cplus namespace
@item maint cplus namespace
Print the list of possible C@t{++} namespaces.

@kindex maint deprecate
@kindex maint undeprecate
@cindex deprecated commands
@item maint deprecate @var{command} @r{[}@var{replacement}@r{]}
@itemx maint undeprecate @var{command}
Deprecate or undeprecate the named @var{command}.  Deprecated commands
cause @value{GDBN} to issue a warning when you use them.  The optional
argument @var{replacement} says which newer command should be used in
favor of the deprecated one; if it is given, @value{GDBN} will mention
the replacement as part of the warning.

@kindex maint dump-me
@item maint dump-me
@cindex @code{SIGQUIT} signal, dump core of @value{GDBN}
Cause a fatal signal in the debugger and force it to dump its core.
This is supported only on systems which support aborting a program
with the @code{SIGQUIT} signal.

@kindex maint internal-error
@kindex maint internal-warning
@kindex maint demangler-warning
@cindex demangler crashes
@item maint internal-error @r{[}@var{message-text}@r{]}
@itemx maint internal-warning @r{[}@var{message-text}@r{]}
@itemx maint demangler-warning @r{[}@var{message-text}@r{]}

Cause @value{GDBN} to call the internal function @code{internal_error},
@code{internal_warning} or @code{demangler_warning} and hence behave
as though an internal problam has been detected.  In addition to
reporting the internal problem, these functions give the user the
opportunity to either quit @value{GDBN} or (for @code{internal_error}
and @code{internal_warning}) create a core file of the current
@value{GDBN} session.

These commands take an optional parameter @var{message-text} that is
used as the text of the error or warning message.

Here's an example of using @code{internal-error}:

@smallexample
(@value{GDBP}) @kbd{maint internal-error testing, 1, 2}
@dots{}/maint.c:121: internal-error: testing, 1, 2
A problem internal to GDB has been detected.  Further
debugging may prove unreliable.
Quit this debugging session? (y or n) @kbd{n}
Create a core file? (y or n) @kbd{n}
(@value{GDBP})
@end smallexample

@cindex @value{GDBN} internal error
@cindex internal errors, control of @value{GDBN} behavior
@cindex demangler crashes

@kindex maint set internal-error
@kindex maint show internal-error
@kindex maint set internal-warning
@kindex maint show internal-warning
@kindex maint set demangler-warning
@kindex maint show demangler-warning
@item maint set internal-error @var{action} [ask|yes|no]
@itemx maint show internal-error @var{action}
@itemx maint set internal-warning @var{action} [ask|yes|no]
@itemx maint show internal-warning @var{action}
@itemx maint set demangler-warning @var{action} [ask|yes|no]
@itemx maint show demangler-warning @var{action}
When @value{GDBN} reports an internal problem (error or warning) it
gives the user the opportunity to both quit @value{GDBN} and create a
core file of the current @value{GDBN} session.  These commands let you
override the default behaviour for each particular @var{action},
described in the table below.

@table @samp
@item quit
You can specify that @value{GDBN} should always (yes) or never (no)
quit.  The default is to ask the user what to do.

@item corefile
You can specify that @value{GDBN} should always (yes) or never (no)
create a core file.  The default is to ask the user what to do.  Note
that there is no @code{corefile} option for @code{demangler-warning}:
demangler warnings always create a core file and this cannot be
disabled.
@end table

@kindex maint packet
@item maint packet @var{text}
If @value{GDBN} is talking to an inferior via the serial protocol,
then this command sends the string @var{text} to the inferior, and
displays the response packet.  @value{GDBN} supplies the initial
@samp{$} character, the terminating @samp{#} character, and the
checksum.

@kindex maint print architecture
@item maint print architecture @r{[}@var{file}@r{]}
Print the entire architecture configuration.  The optional argument
@var{file} names the file where the output goes.

@kindex maint print c-tdesc
@item maint print c-tdesc
Print the current target description (@pxref{Target Descriptions}) as
a C source file.  The created source file can be used in @value{GDBN}
when an XML parser is not available to parse the description.

@kindex maint print dummy-frames
@item maint print dummy-frames
Prints the contents of @value{GDBN}'s internal dummy-frame stack.

@smallexample
(@value{GDBP}) @kbd{b add}
@dots{}
(@value{GDBP}) @kbd{print add(2,3)}
Breakpoint 2, add (a=2, b=3) at @dots{}
58	  return (a + b);
The program being debugged stopped while in a function called from GDB.
@dots{}
(@value{GDBP}) @kbd{maint print dummy-frames}
0xa8206d8: id=@{stack=0xbfffe734,code=0xbfffe73f,!special@}, ptid=process 9353
(@value{GDBP})
@end smallexample

Takes an optional file parameter.

@kindex maint print registers
@kindex maint print raw-registers
@kindex maint print cooked-registers
@kindex maint print register-groups
@kindex maint print remote-registers
@item maint print registers @r{[}@var{file}@r{]}
@itemx maint print raw-registers @r{[}@var{file}@r{]}
@itemx maint print cooked-registers @r{[}@var{file}@r{]}
@itemx maint print register-groups @r{[}@var{file}@r{]}
@itemx maint print remote-registers @r{[}@var{file}@r{]}
Print @value{GDBN}'s internal register data structures.

The command @code{maint print raw-registers} includes the contents of
the raw register cache; the command @code{maint print
cooked-registers} includes the (cooked) value of all registers,
including registers which aren't available on the target nor visible
to user; the command @code{maint print register-groups} includes the
groups that each register is a member of; and the command @code{maint
print remote-registers} includes the remote target's register numbers
and offsets in the `G' packets.

These commands take an optional parameter, a file name to which to
write the information.

@kindex maint print reggroups
@item maint print reggroups @r{[}@var{file}@r{]}
Print @value{GDBN}'s internal register group data structures.  The
optional argument @var{file} tells to what file to write the
information.

The register groups info looks like this:

@smallexample
(@value{GDBP}) @kbd{maint print reggroups}
 Group      Type
 general    user
 float      user
 all        user
 vector     user
 system     user
 save       internal
 restore    internal
@end smallexample

@kindex flushregs
@item flushregs
This command forces @value{GDBN} to flush its internal register cache.

@kindex maint print objfiles
@cindex info for known object files
@item maint print objfiles @r{[}@var{regexp}@r{]}
Print a dump of all known object files.
If @var{regexp} is specified, only print object files whose names
match @var{regexp}.  For each object file, this command prints its name,
address in memory, and all of its psymtabs and symtabs.

@kindex maint print user-registers
@cindex user registers
@item maint print user-registers
List all currently available @dfn{user registers}.  User registers
typically provide alternate names for actual hardware registers.  They
include the four ``standard'' registers @code{$fp}, @code{$pc},
@code{$sp}, and @code{$ps}.  @xref{standard registers}.  User
registers can be used in expressions in the same way as the canonical
register names, but only the latter are listed by the @code{info
registers} and @code{maint print registers} commands.

@kindex maint print section-scripts
@cindex info for known .debug_gdb_scripts-loaded scripts
@item maint print section-scripts [@var{regexp}]
Print a dump of scripts specified in the @code{.debug_gdb_section} section.
If @var{regexp} is specified, only print scripts loaded by object files
matching @var{regexp}.
For each script, this command prints its name as specified in the objfile,
and the full path if known.
@xref{dotdebug_gdb_scripts section}.

@kindex maint print statistics
@cindex bcache statistics
@item maint print statistics
This command prints, for each object file in the program, various data
about that object file followed by the byte cache (@dfn{bcache})
statistics for the object file.  The objfile data includes the number
of minimal, partial, full, and stabs symbols, the number of types
defined by the objfile, the number of as yet unexpanded psym tables,
the number of line tables and string tables, and the amount of memory
used by the various tables.  The bcache statistics include the counts,
sizes, and counts of duplicates of all and unique objects, max,
average, and median entry size, total memory used and its overhead and
savings, and various measures of the hash table size and chain
lengths.

@kindex maint print target-stack
@cindex target stack description
@item maint print target-stack
A @dfn{target} is an interface between the debugger and a particular
kind of file or process.  Targets can be stacked in @dfn{strata},
so that more than one target can potentially respond to a request.
In particular, memory accesses will walk down the stack of targets
until they find a target that is interested in handling that particular
address.

This command prints a short description of each layer that was pushed on
the @dfn{target stack}, starting from the top layer down to the bottom one.

@kindex maint print type
@cindex type chain of a data type
@item maint print type @var{expr}
Print the type chain for a type specified by @var{expr}.  The argument
can be either a type name or a symbol.  If it is a symbol, the type of
that symbol is described.  The type chain produced by this command is
a recursive definition of the data type as stored in @value{GDBN}'s
data structures, including its flags and contained types.

@kindex maint set dwarf2 always-disassemble
@kindex maint show dwarf2 always-disassemble
@item maint set dwarf2 always-disassemble
@item maint show dwarf2 always-disassemble
Control the behavior of @code{info address} when using DWARF debugging
information.

The default is @code{off}, which means that @value{GDBN} should try to
describe a variable's location in an easily readable format.  When
@code{on}, @value{GDBN} will instead display the DWARF location
expression in an assembly-like format.  Note that some locations are
too complex for @value{GDBN} to describe simply; in this case you will
always see the disassembly form.

Here is an example of the resulting disassembly:

@smallexample
(gdb) info addr argc
Symbol "argc" is a complex DWARF expression:
     1: DW_OP_fbreg 0
@end smallexample

For more information on these expressions, see
@uref{http://www.dwarfstd.org/, the DWARF standard}.

@kindex maint set dwarf2 max-cache-age
@kindex maint show dwarf2 max-cache-age
@item maint set dwarf2 max-cache-age
@itemx maint show dwarf2 max-cache-age
Control the DWARF 2 compilation unit cache.

@cindex DWARF 2 compilation units cache
In object files with inter-compilation-unit references, such as those
produced by the GCC option @samp{-feliminate-dwarf2-dups}, the DWARF 2
reader needs to frequently refer to previously read compilation units.
This setting controls how long a compilation unit will remain in the
cache if it is not referenced.  A higher limit means that cached
compilation units will be stored in memory longer, and more total
memory will be used.  Setting it to zero disables caching, which will
slow down @value{GDBN} startup, but reduce memory consumption.

@kindex maint set profile
@kindex maint show profile
@cindex profiling GDB
@item maint set profile
@itemx maint show profile
Control profiling of @value{GDBN}.

Profiling will be disabled until you use the @samp{maint set profile}
command to enable it.  When you enable profiling, the system will begin
collecting timing and execution count data; when you disable profiling or
exit @value{GDBN}, the results will be written to a log file.  Remember that
if you use profiling, @value{GDBN} will overwrite the profiling log file
(often called @file{gmon.out}).  If you have a record of important profiling
data in a @file{gmon.out} file, be sure to move it to a safe location.

Configuring with @samp{--enable-profiling} arranges for @value{GDBN} to be
compiled with the @samp{-pg} compiler option.

@kindex maint set show-debug-regs
@kindex maint show show-debug-regs
@cindex hardware debug registers
@item maint set show-debug-regs
@itemx maint show show-debug-regs
Control whether to show variables that mirror the hardware debug
registers.  Use @code{on} to enable, @code{off} to disable.  If
enabled, the debug registers values are shown when @value{GDBN} inserts or
removes a hardware breakpoint or watchpoint, and when the inferior
triggers a hardware-assisted breakpoint or watchpoint.

@kindex maint set show-all-tib
@kindex maint show show-all-tib
@item maint set show-all-tib
@itemx maint show show-all-tib
Control whether to show all non zero areas within a 1k block starting
at thread local base, when using the @samp{info w32 thread-information-block}
command.

@kindex maint set target-async
@kindex maint show target-async
@item maint set target-async
@itemx maint show target-async
This controls whether @value{GDBN} targets operate in synchronous or
asynchronous mode (@pxref{Background Execution}).  Normally the
default is asynchronous, if it is available; but this can be changed
to more easily debug problems occurring only in synchronous mode.

@kindex maint set per-command
@kindex maint show per-command
@item maint set per-command
@itemx maint show per-command
@cindex resources used by commands

@value{GDBN} can display the resources used by each command.
This is useful in debugging performance problems.

@table @code
@item maint set per-command space [on|off]
@itemx maint show per-command space
Enable or disable the printing of the memory used by GDB for each command.
If enabled, @value{GDBN} will display how much memory each command
took, following the command's own output.
This can also be requested by invoking @value{GDBN} with the
@option{--statistics} command-line switch (@pxref{Mode Options}).

@item maint set per-command time [on|off]
@itemx maint show per-command time
Enable or disable the printing of the execution time of @value{GDBN}
for each command.
If enabled, @value{GDBN} will display how much time it
took to execute each command, following the command's own output.
Both CPU time and wallclock time are printed.
Printing both is useful when trying to determine whether the cost is
CPU or, e.g., disk/network latency.
Note that the CPU time printed is for @value{GDBN} only, it does not include
the execution time of the inferior because there's no mechanism currently
to compute how much time was spent by @value{GDBN} and how much time was
spent by the program been debugged.
This can also be requested by invoking @value{GDBN} with the
@option{--statistics} command-line switch (@pxref{Mode Options}).

@item maint set per-command symtab [on|off]
@itemx maint show per-command symtab
Enable or disable the printing of basic symbol table statistics
for each command.
If enabled, @value{GDBN} will display the following information:

@enumerate a
@item
number of symbol tables
@item
number of primary symbol tables
@item
number of blocks in the blockvector
@end enumerate
@end table

@kindex maint space
@cindex memory used by commands
@item maint space @var{value}
An alias for @code{maint set per-command space}.
A non-zero value enables it, zero disables it.

@kindex maint time
@cindex time of command execution
@item maint time @var{value}
An alias for @code{maint set per-command time}.
A non-zero value enables it, zero disables it.

@kindex maint translate-address
@item maint translate-address @r{[}@var{section}@r{]} @var{addr}
Find the symbol stored at the location specified by the address
@var{addr} and an optional section name @var{section}.  If found,
@value{GDBN} prints the name of the closest symbol and an offset from
the symbol's location to the specified address.  This is similar to
the @code{info address} command (@pxref{Symbols}), except that this
command also allows to find symbols in other sections.

If section was not specified, the section in which the symbol was found
is also printed.  For dynamically linked executables, the name of
executable or shared library containing the symbol is printed as well.

@end table

The following command is useful for non-interactive invocations of
@value{GDBN}, such as in the test suite.

@table @code
@item set watchdog @var{nsec}
@kindex set watchdog
@cindex watchdog timer
@cindex timeout for commands
Set the maximum number of seconds @value{GDBN} will wait for the
target operation to finish.  If this time expires, @value{GDBN}
reports and error and the command is aborted.

@item show watchdog
Show the current setting of the target wait timeout.
@end table

@node Remote Protocol
@appendix @value{GDBN} Remote Serial Protocol

@menu
* Overview::
* Packets::
* Stop Reply Packets::
* General Query Packets::
* Architecture-Specific Protocol Details::
* Tracepoint Packets::
* Host I/O Packets::
* Interrupts::
* Notification Packets::
* Remote Non-Stop::
* Packet Acknowledgment::
* Examples::
* File-I/O Remote Protocol Extension::
* Library List Format::
* Library List Format for SVR4 Targets::
* Memory Map Format::
* Thread List Format::
* Traceframe Info Format::
* Branch Trace Format::
@end menu

@node Overview
@section Overview

There may be occasions when you need to know something about the
protocol---for example, if there is only one serial port to your target
machine, you might want your program to do something special if it
recognizes a packet meant for @value{GDBN}.

In the examples below, @samp{->} and @samp{<-} are used to indicate
transmitted and received data, respectively.

@cindex protocol, @value{GDBN} remote serial
@cindex serial protocol, @value{GDBN} remote
@cindex remote serial protocol
All @value{GDBN} commands and responses (other than acknowledgments
and notifications, see @ref{Notification Packets}) are sent as a
@var{packet}.  A @var{packet} is introduced with the character
@samp{$}, the actual @var{packet-data}, and the terminating character
@samp{#} followed by a two-digit @var{checksum}:

@smallexample
@code{$}@var{packet-data}@code{#}@var{checksum}
@end smallexample
@noindent

@cindex checksum, for @value{GDBN} remote
@noindent
The two-digit @var{checksum} is computed as the modulo 256 sum of all
characters between the leading @samp{$} and the trailing @samp{#} (an
eight bit unsigned checksum).

Implementors should note that prior to @value{GDBN} 5.0 the protocol
specification also included an optional two-digit @var{sequence-id}:

@smallexample
@code{$}@var{sequence-id}@code{:}@var{packet-data}@code{#}@var{checksum}
@end smallexample

@cindex sequence-id, for @value{GDBN} remote
@noindent
That @var{sequence-id} was appended to the acknowledgment.  @value{GDBN}
has never output @var{sequence-id}s.  Stubs that handle packets added
since @value{GDBN} 5.0 must not accept @var{sequence-id}.

When either the host or the target machine receives a packet, the first
response expected is an acknowledgment: either @samp{+} (to indicate
the package was received correctly) or @samp{-} (to request
retransmission):

@smallexample
-> @code{$}@var{packet-data}@code{#}@var{checksum}
<- @code{+}
@end smallexample
@noindent

The @samp{+}/@samp{-} acknowledgments can be disabled
once a connection is established.
@xref{Packet Acknowledgment}, for details.

The host (@value{GDBN}) sends @var{command}s, and the target (the
debugging stub incorporated in your program) sends a @var{response}.  In
the case of step and continue @var{command}s, the response is only sent
when the operation has completed, and the target has again stopped all
threads in all attached processes.  This is the default all-stop mode
behavior, but the remote protocol also supports @value{GDBN}'s non-stop 
execution mode; see @ref{Remote Non-Stop}, for details.

@var{packet-data} consists of a sequence of characters with the
exception of @samp{#} and @samp{$} (see @samp{X} packet for additional
exceptions).

@cindex remote protocol, field separator
Fields within the packet should be separated using @samp{,} @samp{;} or
@samp{:}.  Except where otherwise noted all numbers are represented in
@sc{hex} with leading zeros suppressed.

Implementors should note that prior to @value{GDBN} 5.0, the character
@samp{:} could not appear as the third character in a packet (as it
would potentially conflict with the @var{sequence-id}).

@cindex remote protocol, binary data
@anchor{Binary Data}
Binary data in most packets is encoded either as two hexadecimal
digits per byte of binary data.  This allowed the traditional remote
protocol to work over connections which were only seven-bit clean.
Some packets designed more recently assume an eight-bit clean
connection, and use a more efficient encoding to send and receive
binary data.

The binary data representation uses @code{7d} (@sc{ascii} @samp{@}})
as an escape character.  Any escaped byte is transmitted as the escape
character followed by the original character XORed with @code{0x20}.
For example, the byte @code{0x7d} would be transmitted as the two
bytes @code{0x7d 0x5d}.  The bytes @code{0x23} (@sc{ascii} @samp{#}),
@code{0x24} (@sc{ascii} @samp{$}), and @code{0x7d} (@sc{ascii}
@samp{@}}) must always be escaped.  Responses sent by the stub
must also escape @code{0x2a} (@sc{ascii} @samp{*}), so that it
is not interpreted as the start of a run-length encoded sequence
(described next).

Response @var{data} can be run-length encoded to save space.
Run-length encoding replaces runs of identical characters with one
instance of the repeated character, followed by a @samp{*} and a
repeat count.  The repeat count is itself sent encoded, to avoid
binary characters in @var{data}: a value of @var{n} is sent as
@code{@var{n}+29}.  For a repeat count greater or equal to 3, this
produces a printable @sc{ascii} character, e.g.@: a space (@sc{ascii}
code 32) for a repeat count of 3.  (This is because run-length
encoding starts to win for counts 3 or more.)  Thus, for example,
@samp{0* } is a run-length encoding of ``0000'': the space character
after @samp{*} means repeat the leading @code{0} @w{@code{32 - 29 =
3}} more times.

The printable characters @samp{#} and @samp{$} or with a numeric value
greater than 126 must not be used.  Runs of six repeats (@samp{#}) or
seven repeats (@samp{$}) can be expanded using a repeat count of only
five (@samp{"}).  For example, @samp{00000000} can be encoded as
@samp{0*"00}.

The error response returned for some packets includes a two character
error number.  That number is not well defined.

@cindex empty response, for unsupported packets
For any @var{command} not supported by the stub, an empty response
(@samp{$#00}) should be returned.  That way it is possible to extend the
protocol.  A newer @value{GDBN} can tell if a packet is supported based
on that response.

At a minimum, a stub is required to support the @samp{g} and @samp{G}
commands for register access, and the @samp{m} and @samp{M} commands
for memory access.  Stubs that only control single-threaded targets
can implement run control with the @samp{c} (continue), and @samp{s}
(step) commands.  Stubs that support multi-threading targets should
support the @samp{vCont} command.  All other commands are optional.

@node Packets
@section Packets

The following table provides a complete list of all currently defined
@var{command}s and their corresponding response @var{data}.
@xref{File-I/O Remote Protocol Extension}, for details about the File
I/O extension of the remote protocol.

Each packet's description has a template showing the packet's overall
syntax, followed by an explanation of the packet's meaning.  We
include spaces in some of the templates for clarity; these are not
part of the packet's syntax.  No @value{GDBN} packet uses spaces to
separate its components.  For example, a template like @samp{foo
@var{bar} @var{baz}} describes a packet beginning with the three ASCII
bytes @samp{foo}, followed by a @var{bar}, followed directly by a
@var{baz}.  @value{GDBN} does not transmit a space character between the
@samp{foo} and the @var{bar}, or between the @var{bar} and the
@var{baz}.

@cindex @var{thread-id}, in remote protocol
@anchor{thread-id syntax} 
Several packets and replies include a @var{thread-id} field to identify
a thread.  Normally these are positive numbers with a target-specific
interpretation, formatted as big-endian hex strings.  A @var{thread-id}
can also be a literal @samp{-1} to indicate all threads, or @samp{0} to
pick any thread.

In addition, the remote protocol supports a multiprocess feature in
which the @var{thread-id} syntax is extended to optionally include both
process and thread ID fields, as @samp{p@var{pid}.@var{tid}}.
The @var{pid} (process) and @var{tid} (thread) components each have the
format described above: a positive number with target-specific
interpretation formatted as a big-endian hex string, literal @samp{-1}
to indicate all processes or threads (respectively), or @samp{0} to
indicate an arbitrary process or thread.  Specifying just a process, as
@samp{p@var{pid}}, is equivalent to @samp{p@var{pid}.-1}.  It is an
error to specify all processes but a specific thread, such as
@samp{p-1.@var{tid}}.  Note that the @samp{p} prefix is @emph{not} used
for those packets and replies explicitly documented to include a process
ID, rather than a @var{thread-id}.

The multiprocess @var{thread-id} syntax extensions are only used if both
@value{GDBN} and the stub report support for the @samp{multiprocess}
feature using @samp{qSupported}.  @xref{multiprocess extensions}, for
more information.

Note that all packet forms beginning with an upper- or lower-case
letter, other than those described here, are reserved for future use.

Here are the packet descriptions.

@table @samp

@item !
@cindex @samp{!} packet
@anchor{extended mode}
Enable extended mode.  In extended mode, the remote server is made
persistent.  The @samp{R} packet is used to restart the program being
debugged.

Reply:
@table @samp
@item OK
The remote target both supports and has enabled extended mode.
@end table

@item ?
@cindex @samp{?} packet
@anchor{? packet}
Indicate the reason the target halted.  The reply is the same as for
step and continue.  This packet has a special interpretation when the
target is in non-stop mode; see @ref{Remote Non-Stop}.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item A @var{arglen},@var{argnum},@var{arg},@dots{}
@cindex @samp{A} packet
Initialized @code{argv[]} array passed into program. @var{arglen}
specifies the number of bytes in the hex encoded byte stream
@var{arg}.  See @code{gdbserver} for more details.

Reply:
@table @samp
@item OK
The arguments were set.
@item E @var{NN}
An error occurred.
@end table

@item b @var{baud}
@cindex @samp{b} packet
(Don't use this packet; its behavior is not well-defined.)
Change the serial line speed to @var{baud}.

JTC: @emph{When does the transport layer state change?  When it's
received, or after the ACK is transmitted.  In either case, there are
problems if the command or the acknowledgment packet is dropped.}

Stan: @emph{If people really wanted to add something like this, and get
it working for the first time, they ought to modify ser-unix.c to send
some kind of out-of-band message to a specially-setup stub and have the
switch happen "in between" packets, so that from remote protocol's point
of view, nothing actually happened.}

@item B @var{addr},@var{mode}
@cindex @samp{B} packet
Set (@var{mode} is @samp{S}) or clear (@var{mode} is @samp{C}) a
breakpoint at @var{addr}.

Don't use this packet.  Use the @samp{Z} and @samp{z} packets instead
(@pxref{insert breakpoint or watchpoint packet}).

@cindex @samp{bc} packet
@anchor{bc}
@item bc
Backward continue.  Execute the target system in reverse.  No parameter.
@xref{Reverse Execution}, for more information.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@cindex @samp{bs} packet
@anchor{bs}
@item bs
Backward single step.  Execute one instruction in reverse.  No parameter.
@xref{Reverse Execution}, for more information.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item c @r{[}@var{addr}@r{]}
@cindex @samp{c} packet
Continue at @var{addr}, which is the address to resume.  If @var{addr}
is omitted, resume at current address.

This packet is deprecated for multi-threading support.  @xref{vCont
packet}.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item C @var{sig}@r{[};@var{addr}@r{]}
@cindex @samp{C} packet
Continue with signal @var{sig} (hex signal number).  If
@samp{;@var{addr}} is omitted, resume at same address.

This packet is deprecated for multi-threading support.  @xref{vCont
packet}.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item d
@cindex @samp{d} packet
Toggle debug flag.

Don't use this packet; instead, define a general set packet
(@pxref{General Query Packets}).

@item D
@itemx D;@var{pid}
@cindex @samp{D} packet
The first form of the packet is used to detach @value{GDBN} from the 
remote system.  It is sent to the remote target
before @value{GDBN} disconnects via the @code{detach} command.

The second form, including a process ID, is used when multiprocess
protocol extensions are enabled (@pxref{multiprocess extensions}), to
detach only a specific process.  The @var{pid} is specified as a
big-endian hex string.

Reply:
@table @samp
@item OK
for success
@item E @var{NN}
for an error
@end table

@item F @var{RC},@var{EE},@var{CF};@var{XX}
@cindex @samp{F} packet
A reply from @value{GDBN} to an @samp{F} packet sent by the target.
This is part of the File-I/O protocol extension.  @xref{File-I/O
Remote Protocol Extension}, for the specification.

@item g
@anchor{read registers packet}
@cindex @samp{g} packet
Read general registers.

Reply:
@table @samp
@item @var{XX@dots{}}
Each byte of register data is described by two hex digits.  The bytes
with the register are transmitted in target byte order.  The size of
each register and their position within the @samp{g} packet are
determined by the @value{GDBN} internal gdbarch functions
@code{DEPRECATED_REGISTER_RAW_SIZE} and @code{gdbarch_register_name}.  The
specification of several standard @samp{g} packets is specified below.

When reading registers from a trace frame (@pxref{Analyze Collected
Data,,Using the Collected Data}), the stub may also return a string of
literal @samp{x}'s in place of the register data digits, to indicate
that the corresponding register has not been collected, thus its value
is unavailable.  For example, for an architecture with 4 registers of
4 bytes each, the following reply indicates to @value{GDBN} that
registers 0 and 2 have not been collected, while registers 1 and 3
have been collected, and both have zero value:

@smallexample
-> @code{g}
<- @code{xxxxxxxx00000000xxxxxxxx00000000}
@end smallexample

@item E @var{NN}
for an error.
@end table

@item G @var{XX@dots{}}
@cindex @samp{G} packet
Write general registers.  @xref{read registers packet}, for a
description of the @var{XX@dots{}} data.

Reply:
@table @samp
@item OK
for success
@item E @var{NN}
for an error
@end table

@item H @var{op} @var{thread-id}
@cindex @samp{H} packet
Set thread for subsequent operations (@samp{m}, @samp{M}, @samp{g},
@samp{G}, et.al.).  Depending on the operation to be performed, @var{op}
should be @samp{c} for step and continue operations (note that this
is deprecated, supporting the @samp{vCont} command is a better
option), and @samp{g} for other operations.  The thread designator
@var{thread-id} has the format and interpretation described in
@ref{thread-id syntax}.

Reply:
@table @samp
@item OK
for success
@item E @var{NN}
for an error
@end table

@c FIXME: JTC:
@c   'H': How restrictive (or permissive) is the thread model.  If a
@c        thread is selected and stopped, are other threads allowed
@c        to continue to execute?  As I mentioned above, I think the
@c        semantics of each command when a thread is selected must be
@c        described.  For example:
@c
@c        'g':    If the stub supports threads and a specific thread is
@c                selected, returns the register block from that thread;
@c                otherwise returns current registers.
@c
@c        'G'     If the stub supports threads and a specific thread is
@c                selected, sets the registers of the register block of
@c                that thread; otherwise sets current registers.

@item i @r{[}@var{addr}@r{[},@var{nnn}@r{]]}
@anchor{cycle step packet}
@cindex @samp{i} packet
Step the remote target by a single clock cycle.  If @samp{,@var{nnn}} is
present, cycle step @var{nnn} cycles.  If @var{addr} is present, cycle
step starting at that address.

@item I
@cindex @samp{I} packet
Signal, then cycle step.  @xref{step with signal packet}.  @xref{cycle
step packet}.

@item k
@cindex @samp{k} packet
Kill request.

The exact effect of this packet is not specified.

For a bare-metal target, it may power cycle or reset the target
system.  For that reason, the @samp{k} packet has no reply.

For a single-process target, it may kill that process if possible.

A multiple-process target may choose to kill just one process, or all
that are under @value{GDBN}'s control.  For more precise control, use
the vKill packet (@pxref{vKill packet}).

If the target system immediately closes the connection in response to
@samp{k}, @value{GDBN} does not consider the lack of packet
acknowledgment to be an error, and assumes the kill was successful.

If connected using @kbd{target extended-remote}, and the target does
not close the connection in response to a kill request, @value{GDBN}
probes the target state as if a new connection was opened
(@pxref{? packet}).

@item m @var{addr},@var{length}
@cindex @samp{m} packet
Read @var{length} bytes of memory starting at address @var{addr}.
Note that @var{addr} may not be aligned to any particular boundary.

The stub need not use any particular size or alignment when gathering
data from memory for the response; even if @var{addr} is word-aligned
and @var{length} is a multiple of the word size, the stub is free to
use byte accesses, or not.  For this reason, this packet may not be
suitable for accessing memory-mapped I/O devices.
@cindex alignment of remote memory accesses
@cindex size of remote memory accesses
@cindex memory, alignment and size of remote accesses

Reply:
@table @samp
@item @var{XX@dots{}}
Memory contents; each byte is transmitted as a two-digit hexadecimal
number.  The reply may contain fewer bytes than requested if the
server was able to read only part of the region of memory.
@item E @var{NN}
@var{NN} is errno
@end table

@item M @var{addr},@var{length}:@var{XX@dots{}}
@cindex @samp{M} packet
Write @var{length} bytes of memory starting at address @var{addr}.
The data is given by @var{XX@dots{}}; each byte is transmitted as a two-digit
hexadecimal number.

Reply:
@table @samp
@item OK
for success
@item E @var{NN}
for an error (this includes the case where only part of the data was
written).
@end table

@item p @var{n}
@cindex @samp{p} packet
Read the value of register @var{n}; @var{n} is in hex.
@xref{read registers packet}, for a description of how the returned
register value is encoded.

Reply:
@table @samp
@item @var{XX@dots{}}
the register's value
@item E @var{NN}
for an error
@item @w{}
Indicating an unrecognized @var{query}.
@end table

@item P @var{n@dots{}}=@var{r@dots{}}
@anchor{write register packet}
@cindex @samp{P} packet
Write register @var{n@dots{}} with value @var{r@dots{}}.  The register
number @var{n} is in hexadecimal, and @var{r@dots{}} contains two hex
digits for each byte in the register (target byte order).

Reply:
@table @samp
@item OK
for success
@item E @var{NN}
for an error
@end table

@item q @var{name} @var{params}@dots{}
@itemx Q @var{name} @var{params}@dots{}
@cindex @samp{q} packet
@cindex @samp{Q} packet
General query (@samp{q}) and set (@samp{Q}).  These packets are
described fully in @ref{General Query Packets}.

@item r
@cindex @samp{r} packet
Reset the entire system.

Don't use this packet; use the @samp{R} packet instead.

@item R @var{XX}
@cindex @samp{R} packet
Restart the program being debugged.  The @var{XX}, while needed, is ignored.
This packet is only available in extended mode (@pxref{extended mode}).

The @samp{R} packet has no reply.

@item s @r{[}@var{addr}@r{]}
@cindex @samp{s} packet
Single step, resuming at @var{addr}.  If
@var{addr} is omitted, resume at same address.

This packet is deprecated for multi-threading support.  @xref{vCont
packet}.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item S @var{sig}@r{[};@var{addr}@r{]}
@anchor{step with signal packet}
@cindex @samp{S} packet
Step with signal.  This is analogous to the @samp{C} packet, but
requests a single-step, rather than a normal resumption of execution.

This packet is deprecated for multi-threading support.  @xref{vCont
packet}.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item t @var{addr}:@var{PP},@var{MM}
@cindex @samp{t} packet
Search backwards starting at address @var{addr} for a match with pattern
@var{PP} and mask @var{MM}, both of which are are 4 byte long.
There must be at least 3 digits in @var{addr}.

@item T @var{thread-id}
@cindex @samp{T} packet
Find out if the thread @var{thread-id} is alive.  @xref{thread-id syntax}.

Reply:
@table @samp
@item OK
thread is still alive
@item E @var{NN}
thread is dead
@end table

@item v
Packets starting with @samp{v} are identified by a multi-letter name,
up to the first @samp{;} or @samp{?} (or the end of the packet).

@item vAttach;@var{pid}
@cindex @samp{vAttach} packet
Attach to a new process with the specified process ID @var{pid}.
The process ID is a
hexadecimal integer identifying the process.  In all-stop mode, all
threads in the attached process are stopped; in non-stop mode, it may be
attached without being stopped if that is supported by the target.

@c In non-stop mode, on a successful vAttach, the stub should set the
@c current thread to a thread of the newly-attached process.  After
@c attaching, GDB queries for the attached process's thread ID with qC.
@c Also note that, from a user perspective, whether or not the 
@c target is stopped on attach in non-stop mode depends on whether you 
@c use the foreground or background version of the attach command, not 
@c on what vAttach does; GDB does the right thing with respect to either 
@c stopping or restarting threads.

This packet is only available in extended mode (@pxref{extended mode}).

Reply:
@table @samp
@item E @var{nn}
for an error
@item @r{Any stop packet}
for success in all-stop mode (@pxref{Stop Reply Packets})
@item OK
for success in non-stop mode (@pxref{Remote Non-Stop})
@end table

@item vCont@r{[};@var{action}@r{[}:@var{thread-id}@r{]]}@dots{}
@cindex @samp{vCont} packet
@anchor{vCont packet}
Resume the inferior, specifying different actions for each thread.
If an action is specified with no @var{thread-id}, then it is applied to any
threads that don't have a specific action specified; if no default action is
specified then other threads should remain stopped in all-stop mode and
in their current state in non-stop mode.
Specifying multiple
default actions is an error; specifying no actions is also an error.
Thread IDs are specified using the syntax described in @ref{thread-id syntax}.

Currently supported actions are:

@table @samp
@item c
Continue.
@item C @var{sig}
Continue with signal @var{sig}.  The signal @var{sig} should be two hex digits.
@item s
Step.
@item S @var{sig}
Step with signal @var{sig}.  The signal @var{sig} should be two hex digits.
@item t
Stop.
@item r @var{start},@var{end}
Step once, and then keep stepping as long as the thread stops at
addresses between @var{start} (inclusive) and @var{end} (exclusive).
The remote stub reports a stop reply when either the thread goes out
of the range or is stopped due to an unrelated reason, such as hitting
a breakpoint.  @xref{range stepping}.

If the range is empty (@var{start} == @var{end}), then the action
becomes equivalent to the @samp{s} action.  In other words,
single-step once, and report the stop (even if the stepped instruction
jumps to @var{start}).

(A stop reply may be sent at any point even if the PC is still within
the stepping range; for example, it is valid to implement this packet
in a degenerate way as a single instruction step operation.)

@end table

The optional argument @var{addr} normally associated with the 
@samp{c}, @samp{C}, @samp{s}, and @samp{S} packets is
not supported in @samp{vCont}.

The @samp{t} action is only relevant in non-stop mode
(@pxref{Remote Non-Stop}) and may be ignored by the stub otherwise.
A stop reply should be generated for any affected thread not already stopped.
When a thread is stopped by means of a @samp{t} action,
the corresponding stop reply should indicate that the thread has stopped with
signal @samp{0}, regardless of whether the target uses some other signal
as an implementation detail.

The stub must support @samp{vCont} if it reports support for
multiprocess extensions (@pxref{multiprocess extensions}).  Note that in
this case @samp{vCont} actions can be specified to apply to all threads
in a process by using the @samp{p@var{pid}.-1} form of the
@var{thread-id}.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item vCont?
@cindex @samp{vCont?} packet
Request a list of actions supported by the @samp{vCont} packet.

Reply:
@table @samp
@item vCont@r{[};@var{action}@dots{}@r{]}
The @samp{vCont} packet is supported.  Each @var{action} is a supported
command in the @samp{vCont} packet.
@item @w{}
The @samp{vCont} packet is not supported.
@end table

@item vFile:@var{operation}:@var{parameter}@dots{}
@cindex @samp{vFile} packet
Perform a file operation on the target system.  For details,
see @ref{Host I/O Packets}.

@item vFlashErase:@var{addr},@var{length}
@cindex @samp{vFlashErase} packet
Direct the stub to erase @var{length} bytes of flash starting at
@var{addr}.  The region may enclose any number of flash blocks, but
its start and end must fall on block boundaries, as indicated by the
flash block size appearing in the memory map (@pxref{Memory Map
Format}).  @value{GDBN} groups flash memory programming operations
together, and sends a @samp{vFlashDone} request after each group; the
stub is allowed to delay erase operation until the @samp{vFlashDone}
packet is received.

Reply:
@table @samp
@item OK
for success
@item E @var{NN}
for an error
@end table

@item vFlashWrite:@var{addr}:@var{XX@dots{}}
@cindex @samp{vFlashWrite} packet
Direct the stub to write data to flash address @var{addr}.  The data
is passed in binary form using the same encoding as for the @samp{X}
packet (@pxref{Binary Data}).  The memory ranges specified by
@samp{vFlashWrite} packets preceding a @samp{vFlashDone} packet must
not overlap, and must appear in order of increasing addresses
(although @samp{vFlashErase} packets for higher addresses may already
have been received; the ordering is guaranteed only between
@samp{vFlashWrite} packets).  If a packet writes to an address that was
neither erased by a preceding @samp{vFlashErase} packet nor by some other
target-specific method, the results are unpredictable.


Reply:
@table @samp
@item OK
for success
@item E.memtype
for vFlashWrite addressing non-flash memory
@item E @var{NN}
for an error
@end table

@item vFlashDone
@cindex @samp{vFlashDone} packet
Indicate to the stub that flash programming operation is finished.
The stub is permitted to delay or batch the effects of a group of
@samp{vFlashErase} and @samp{vFlashWrite} packets until a
@samp{vFlashDone} packet is received.  The contents of the affected
regions of flash memory are unpredictable until the @samp{vFlashDone}
request is completed.

@item vKill;@var{pid}
@cindex @samp{vKill} packet
@anchor{vKill packet}
Kill the process with the specified process ID @var{pid}, which is a
hexadecimal integer identifying the process.  This packet is used in
preference to @samp{k} when multiprocess protocol extensions are
supported; see @ref{multiprocess extensions}.

Reply:
@table @samp
@item E @var{nn}
for an error
@item OK
for success
@end table

@item vRun;@var{filename}@r{[};@var{argument}@r{]}@dots{}
@cindex @samp{vRun} packet
Run the program @var{filename}, passing it each @var{argument} on its
command line.  The file and arguments are hex-encoded strings.  If
@var{filename} is an empty string, the stub may use a default program
(e.g.@: the last program run).  The program is created in the stopped
state.

@c FIXME:  What about non-stop mode?

This packet is only available in extended mode (@pxref{extended mode}).

Reply:
@table @samp
@item E @var{nn}
for an error
@item @r{Any stop packet}
for success (@pxref{Stop Reply Packets})
@end table

@item vStopped
@cindex @samp{vStopped} packet
@xref{Notification Packets}.

@item X @var{addr},@var{length}:@var{XX@dots{}}
@anchor{X packet}
@cindex @samp{X} packet
Write data to memory, where the data is transmitted in binary.
Memory is specified by its address @var{addr} and number of bytes @var{length};
@samp{@var{XX}@dots{}} is binary data (@pxref{Binary Data}).

Reply:
@table @samp
@item OK
for success
@item E @var{NN}
for an error
@end table

@item z @var{type},@var{addr},@var{kind}
@itemx Z @var{type},@var{addr},@var{kind}
@anchor{insert breakpoint or watchpoint packet}
@cindex @samp{z} packet
@cindex @samp{Z} packets
Insert (@samp{Z}) or remove (@samp{z}) a @var{type} breakpoint or
watchpoint starting at address @var{address} of kind @var{kind}.

Each breakpoint and watchpoint packet @var{type} is documented
separately.

@emph{Implementation notes: A remote target shall return an empty string
for an unrecognized breakpoint or watchpoint packet @var{type}.  A
remote target shall support either both or neither of a given
@samp{Z@var{type}@dots{}} and @samp{z@var{type}@dots{}} packet pair.  To
avoid potential problems with duplicate packets, the operations should
be implemented in an idempotent way.}

@item z0,@var{addr},@var{kind}
@itemx Z0,@var{addr},@var{kind}@r{[};@var{cond_list}@dots{}@r{]}@r{[};cmds:@var{persist},@var{cmd_list}@dots{}@r{]}
@cindex @samp{z0} packet
@cindex @samp{Z0} packet
Insert (@samp{Z0}) or remove (@samp{z0}) a memory breakpoint at address
@var{addr} of type @var{kind}.

A memory breakpoint is implemented by replacing the instruction at
@var{addr} with a software breakpoint or trap instruction.  The
@var{kind} is target-specific and typically indicates the size of
the breakpoint in bytes that should be inserted.  E.g., the @sc{arm}
and @sc{mips} can insert either a 2 or 4 byte breakpoint.  Some
architectures have additional meanings for @var{kind};
@var{cond_list} is an optional list of conditional expressions in bytecode
form that should be evaluated on the target's side.  These are the
conditions that should be taken into consideration when deciding if
the breakpoint trigger should be reported back to @var{GDBN}.

The @var{cond_list} parameter is comprised of a series of expressions,
concatenated without separators. Each expression has the following form:

@table @samp

@item X @var{len},@var{expr}
@var{len} is the length of the bytecode expression and @var{expr} is the
actual conditional expression in bytecode form.

@end table

The optional @var{cmd_list} parameter introduces commands that may be
run on the target, rather than being reported back to @value{GDBN}.
The parameter starts with a numeric flag @var{persist}; if the flag is
nonzero, then the breakpoint may remain active and the commands
continue to be run even when @value{GDBN} disconnects from the target.
Following this flag is a series of expressions concatenated with no
separators.  Each expression has the following form:

@table @samp

@item X @var{len},@var{expr}
@var{len} is the length of the bytecode expression and @var{expr} is the
actual conditional expression in bytecode form.

@end table

see @ref{Architecture-Specific Protocol Details}.

@emph{Implementation note: It is possible for a target to copy or move
code that contains memory breakpoints (e.g., when implementing
overlays).  The behavior of this packet, in the presence of such a
target, is not defined.}

Reply:
@table @samp
@item OK
success
@item @w{}
not supported
@item E @var{NN}
for an error
@end table

@item z1,@var{addr},@var{kind}
@itemx Z1,@var{addr},@var{kind}@r{[};@var{cond_list}@dots{}@r{]}
@cindex @samp{z1} packet
@cindex @samp{Z1} packet
Insert (@samp{Z1}) or remove (@samp{z1}) a hardware breakpoint at
address @var{addr}.

A hardware breakpoint is implemented using a mechanism that is not
dependant on being able to modify the target's memory.  The @var{kind}
and @var{cond_list} have the same meaning as in @samp{Z0} packets.

@emph{Implementation note: A hardware breakpoint is not affected by code
movement.}

Reply:
@table @samp
@item OK
success
@item @w{}
not supported
@item E @var{NN}
for an error
@end table

@item z2,@var{addr},@var{kind}
@itemx Z2,@var{addr},@var{kind}
@cindex @samp{z2} packet
@cindex @samp{Z2} packet
Insert (@samp{Z2}) or remove (@samp{z2}) a write watchpoint at @var{addr}.
The number of bytes to watch is specified by @var{kind}.

Reply:
@table @samp
@item OK
success
@item @w{}
not supported
@item E @var{NN}
for an error
@end table

@item z3,@var{addr},@var{kind}
@itemx Z3,@var{addr},@var{kind}
@cindex @samp{z3} packet
@cindex @samp{Z3} packet
Insert (@samp{Z3}) or remove (@samp{z3}) a read watchpoint at @var{addr}.
The number of bytes to watch is specified by @var{kind}.

Reply:
@table @samp
@item OK
success
@item @w{}
not supported
@item E @var{NN}
for an error
@end table

@item z4,@var{addr},@var{kind}
@itemx Z4,@var{addr},@var{kind}
@cindex @samp{z4} packet
@cindex @samp{Z4} packet
Insert (@samp{Z4}) or remove (@samp{z4}) an access watchpoint at @var{addr}.
The number of bytes to watch is specified by @var{kind}.

Reply:
@table @samp
@item OK
success
@item @w{}
not supported
@item E @var{NN}
for an error
@end table

@end table

@node Stop Reply Packets
@section Stop Reply Packets
@cindex stop reply packets

The @samp{C}, @samp{c}, @samp{S}, @samp{s}, @samp{vCont},
@samp{vAttach}, @samp{vRun}, @samp{vStopped}, and @samp{?} packets can
receive any of the below as a reply.  Except for @samp{?}
and @samp{vStopped}, that reply is only returned
when the target halts.  In the below the exact meaning of @dfn{signal
number} is defined by the header @file{include/gdb/signals.h} in the
@value{GDBN} source code.

As in the description of request packets, we include spaces in the
reply templates for clarity; these are not part of the reply packet's
syntax.  No @value{GDBN} stop reply packet uses spaces to separate its
components.

@table @samp

@item S @var{AA}
The program received signal number @var{AA} (a two-digit hexadecimal
number).  This is equivalent to a @samp{T} response with no
@var{n}:@var{r} pairs.

@item T @var{AA} @var{n1}:@var{r1};@var{n2}:@var{r2};@dots{}
@cindex @samp{T} packet reply
The program received signal number @var{AA} (a two-digit hexadecimal
number).  This is equivalent to an @samp{S} response, except that the
@samp{@var{n}:@var{r}} pairs can carry values of important registers
and other information directly in the stop reply packet, reducing
round-trip latency.  Single-step and breakpoint traps are reported
this way.  Each @samp{@var{n}:@var{r}} pair is interpreted as follows:

@itemize @bullet
@item
If @var{n} is a hexadecimal number, it is a register number, and the
corresponding @var{r} gives that register's value.  The data @var{r} is a
series of bytes in target byte order, with each byte given by a
two-digit hex number.

@item
If @var{n} is @samp{thread}, then @var{r} is the @var{thread-id} of
the stopped thread, as specified in @ref{thread-id syntax}.

@item
If @var{n} is @samp{core}, then @var{r} is the hexadecimal number of
the core on which the stop event was detected.

@item
If @var{n} is a recognized @dfn{stop reason}, it describes a more
specific event that stopped the target.  The currently defined stop
reasons are listed below.  The @var{aa} should be @samp{05}, the trap
signal.  At most one stop reason should be present.

@item
Otherwise, @value{GDBN} should ignore this @samp{@var{n}:@var{r}} pair
and go on to the next; this allows us to extend the protocol in the
future.
@end itemize

The currently defined stop reasons are:

@table @samp
@item watch
@itemx rwatch
@itemx awatch
The packet indicates a watchpoint hit, and @var{r} is the data address, in
hex.

@cindex shared library events, remote reply
@item library
The packet indicates that the loaded libraries have changed.
@value{GDBN} should use @samp{qXfer:libraries:read} to fetch a new
list of loaded libraries.  The @var{r} part is ignored.

@cindex replay log events, remote reply
@item replaylog
The packet indicates that the target cannot continue replaying 
logged execution events, because it has reached the end (or the
beginning when executing backward) of the log.  The value of @var{r}
will be either @samp{begin} or @samp{end}.  @xref{Reverse Execution}, 
for more information.
@end table

@item W @var{AA}
@itemx W @var{AA} ; process:@var{pid}
The process exited, and @var{AA} is the exit status.  This is only
applicable to certain targets.

The second form of the response, including the process ID of the exited
process, can be used only when @value{GDBN} has reported support for
multiprocess protocol extensions; see @ref{multiprocess extensions}.
The @var{pid} is formatted as a big-endian hex string.

@item X @var{AA}
@itemx X @var{AA} ; process:@var{pid}
The process terminated with signal @var{AA}.

The second form of the response, including the process ID of the
terminated process, can be used only when @value{GDBN} has reported
support for multiprocess protocol extensions; see @ref{multiprocess
extensions}.  The @var{pid} is formatted as a big-endian hex string.

@item O @var{XX}@dots{}
@samp{@var{XX}@dots{}} is hex encoding of @sc{ascii} data, to be
written as the program's console output.  This can happen at any time
while the program is running and the debugger should continue to wait
for @samp{W}, @samp{T}, etc.  This reply is not permitted in non-stop mode.

@item F @var{call-id},@var{parameter}@dots{}
@var{call-id} is the identifier which says which host system call should
be called.  This is just the name of the function.  Translation into the
correct system call is only applicable as it's defined in @value{GDBN}.
@xref{File-I/O Remote Protocol Extension}, for a list of implemented
system calls.

@samp{@var{parameter}@dots{}} is a list of parameters as defined for
this very system call.

The target replies with this packet when it expects @value{GDBN} to
call a host system call on behalf of the target.  @value{GDBN} replies
with an appropriate @samp{F} packet and keeps up waiting for the next
reply packet from the target.  The latest @samp{C}, @samp{c}, @samp{S}
or @samp{s} action is expected to be continued.  @xref{File-I/O Remote
Protocol Extension}, for more details.

@end table

@node General Query Packets
@section General Query Packets
@cindex remote query requests

Packets starting with @samp{q} are @dfn{general query packets};
packets starting with @samp{Q} are @dfn{general set packets}.  General
query and set packets are a semi-unified form for retrieving and
sending information to and from the stub.

The initial letter of a query or set packet is followed by a name
indicating what sort of thing the packet applies to.  For example,
@value{GDBN} may use a @samp{qSymbol} packet to exchange symbol
definitions with the stub.  These packet names follow some
conventions:

@itemize @bullet
@item
The name must not contain commas, colons or semicolons.
@item
Most @value{GDBN} query and set packets have a leading upper case
letter.
@item
The names of custom vendor packets should use a company prefix, in
lower case, followed by a period.  For example, packets designed at
the Acme Corporation might begin with @samp{qacme.foo} (for querying
foos) or @samp{Qacme.bar} (for setting bars).
@end itemize

The name of a query or set packet should be separated from any
parameters by a @samp{:}; the parameters themselves should be
separated by @samp{,} or @samp{;}.  Stubs must be careful to match the
full packet name, and check for a separator or the end of the packet,
in case two packet names share a common prefix.  New packets should not begin
with @samp{qC}, @samp{qP}, or @samp{qL}@footnote{The @samp{qP} and @samp{qL}
packets predate these conventions, and have arguments without any terminator
for the packet name; we suspect they are in widespread use in places that
are difficult to upgrade.  The @samp{qC} packet has no arguments, but some
existing stubs (e.g.@: RedBoot) are known to not check for the end of the
packet.}.

Like the descriptions of the other packets, each description here
has a template showing the packet's overall syntax, followed by an
explanation of the packet's meaning.  We include spaces in some of the
templates for clarity; these are not part of the packet's syntax.  No
@value{GDBN} packet uses spaces to separate its components.

Here are the currently defined query and set packets:

@table @samp

@item QAgent:1
@itemx QAgent:0
Turn on or off the agent as a helper to perform some debugging operations
delegated from @value{GDBN} (@pxref{Control Agent}).

@item QAllow:@var{op}:@var{val}@dots{}
@cindex @samp{QAllow} packet
Specify which operations @value{GDBN} expects to request of the
target, as a semicolon-separated list of operation name and value
pairs.  Possible values for @var{op} include @samp{WriteReg},
@samp{WriteMem}, @samp{InsertBreak}, @samp{InsertTrace},
@samp{InsertFastTrace}, and @samp{Stop}. @var{val} is either 0,
indicating that @value{GDBN} will not request the operation, or 1,
indicating that it may.  (The target can then use this to set up its
own internals optimally, for instance if the debugger never expects to
insert breakpoints, it may not need to install its own trap handler.)

@item qC
@cindex current thread, remote request
@cindex @samp{qC} packet
Return the current thread ID.

Reply:
@table @samp
@item QC @var{thread-id}
Where @var{thread-id} is a thread ID as documented in 
@ref{thread-id syntax}.
@item @r{(anything else)}
Any other reply implies the old thread ID.
@end table

@item qCRC:@var{addr},@var{length}
@cindex CRC of memory block, remote request
@cindex @samp{qCRC} packet
@anchor{qCRC packet}
Compute the CRC checksum of a block of memory using CRC-32 defined in
IEEE 802.3.  The CRC is computed byte at a time, taking the most
significant bit of each byte first.  The initial pattern code
@code{0xffffffff} is used to ensure leading zeros affect the CRC.

@emph{Note:} This is the same CRC used in validating separate debug
files (@pxref{Separate Debug Files, , Debugging Information in Separate
Files}).  However the algorithm is slightly different.  When validating
separate debug files, the CRC is computed taking the @emph{least}
significant bit of each byte first, and the final result is inverted to
detect trailing zeros.

Reply:
@table @samp
@item E @var{NN}
An error (such as memory fault)
@item C @var{crc32}
The specified memory region's checksum is @var{crc32}.
@end table

@item QDisableRandomization:@var{value}
@cindex disable address space randomization, remote request
@cindex @samp{QDisableRandomization} packet
Some target operating systems will randomize the virtual address space
of the inferior process as a security feature, but provide a feature
to disable such randomization, e.g.@: to allow for a more deterministic
debugging experience.  On such systems, this packet with a @var{value}
of 1 directs the target to disable address space randomization for
processes subsequently started via @samp{vRun} packets, while a packet
with a @var{value} of 0 tells the target to enable address space
randomization.

This packet is only available in extended mode (@pxref{extended mode}).

Reply:
@table @samp
@item OK
The request succeeded.

@item E @var{nn}
An error occurred.  The error number @var{nn} is given as hex digits.

@item @w{}
An empty reply indicates that @samp{QDisableRandomization} is not supported
by the stub.
@end table

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).
This should only be done on targets that actually support disabling
address space randomization.

@item qfThreadInfo
@itemx qsThreadInfo
@cindex list active threads, remote request
@cindex @samp{qfThreadInfo} packet
@cindex @samp{qsThreadInfo} packet
Obtain a list of all active thread IDs from the target (OS).  Since there
may be too many active threads to fit into one reply packet, this query
works iteratively: it may require more than one query/reply sequence to
obtain the entire list of threads.  The first query of the sequence will
be the @samp{qfThreadInfo} query; subsequent queries in the
sequence will be the @samp{qsThreadInfo} query.

NOTE: This packet replaces the @samp{qL} query (see below).

Reply:
@table @samp
@item m @var{thread-id}
A single thread ID
@item m @var{thread-id},@var{thread-id}@dots{}
a comma-separated list of thread IDs
@item l
(lower case letter @samp{L}) denotes end of list.
@end table

In response to each query, the target will reply with a list of one or
more thread IDs, separated by commas.
@value{GDBN} will respond to each reply with a request for more thread
ids (using the @samp{qs} form of the query), until the target responds
with @samp{l} (lower-case ell, for @dfn{last}).
Refer to @ref{thread-id syntax}, for the format of the @var{thread-id}
fields.

@emph{Note: @value{GDBN} will send the @code{qfThreadInfo} query during the
initial connection with the remote target, and the very first thread ID
mentioned in the reply will be stopped by @value{GDBN} in a subsequent
message.  Therefore, the stub should ensure that the first thread ID in
the @code{qfThreadInfo} reply is suitable for being stopped by @value{GDBN}.}

@item qGetTLSAddr:@var{thread-id},@var{offset},@var{lm}
@cindex get thread-local storage address, remote request
@cindex @samp{qGetTLSAddr} packet
Fetch the address associated with thread local storage specified
by @var{thread-id}, @var{offset}, and @var{lm}.

@var{thread-id} is the thread ID associated with the
thread for which to fetch the TLS address.  @xref{thread-id syntax}.

@var{offset} is the (big endian, hex encoded) offset associated with the
thread local variable.  (This offset is obtained from the debug
information associated with the variable.)

@var{lm} is the (big endian, hex encoded) OS/ABI-specific encoding of the
load module associated with the thread local storage.  For example,
a @sc{gnu}/Linux system will pass the link map address of the shared
object associated with the thread local storage under consideration. 
Other operating environments may choose to represent the load module
differently, so the precise meaning of this parameter will vary.

Reply:
@table @samp
@item @var{XX}@dots{}
Hex encoded (big endian) bytes representing the address of the thread
local storage requested.

@item E @var{nn}
An error occurred.  The error number @var{nn} is given as hex digits.

@item @w{}
An empty reply indicates that @samp{qGetTLSAddr} is not supported by the stub.
@end table

@item qGetTIBAddr:@var{thread-id}
@cindex get thread information block address
@cindex @samp{qGetTIBAddr} packet
Fetch address of the Windows OS specific Thread Information Block.

@var{thread-id} is the thread ID associated with the thread.

Reply:
@table @samp
@item @var{XX}@dots{}
Hex encoded (big endian) bytes representing the linear address of the
thread information block.

@item E @var{nn}
An error occured.  This means that either the thread was not found, or the
address could not be retrieved.

@item @w{}
An empty reply indicates that @samp{qGetTIBAddr} is not supported by the stub.
@end table

@item qL @var{startflag} @var{threadcount} @var{nextthread}
Obtain thread information from RTOS.  Where: @var{startflag} (one hex
digit) is one to indicate the first query and zero to indicate a
subsequent query; @var{threadcount} (two hex digits) is the maximum
number of threads the response packet can contain; and @var{nextthread}
(eight hex digits), for subsequent queries (@var{startflag} is zero), is
returned in the response as @var{argthread}.

Don't use this packet; use the @samp{qfThreadInfo} query instead (see above).

Reply:
@table @samp
@item qM @var{count} @var{done} @var{argthread} @var{thread}@dots{}
Where: @var{count} (two hex digits) is the number of threads being
returned; @var{done} (one hex digit) is zero to indicate more threads
and one indicates no further threads; @var{argthreadid} (eight hex
digits) is @var{nextthread} from the request packet; @var{thread}@dots{}
is a sequence of thread IDs, @var{threadid} (eight hex
digits), from the target.  See @code{remote.c:parse_threadlist_response()}.
@end table

@item qOffsets
@cindex section offsets, remote request
@cindex @samp{qOffsets} packet
Get section offsets that the target used when relocating the downloaded
image.

Reply:
@table @samp
@item Text=@var{xxx};Data=@var{yyy}@r{[};Bss=@var{zzz}@r{]}
Relocate the @code{Text} section by @var{xxx} from its original address.
Relocate the @code{Data} section by @var{yyy} from its original address.
If the object file format provides segment information (e.g.@: @sc{elf}
@samp{PT_LOAD} program headers), @value{GDBN} will relocate entire
segments by the supplied offsets.

@emph{Note: while a @code{Bss} offset may be included in the response,
@value{GDBN} ignores this and instead applies the @code{Data} offset
to the @code{Bss} section.}

@item TextSeg=@var{xxx}@r{[};DataSeg=@var{yyy}@r{]}
Relocate the first segment of the object file, which conventionally
contains program code, to a starting address of @var{xxx}.  If
@samp{DataSeg} is specified, relocate the second segment, which
conventionally contains modifiable data, to a starting address of
@var{yyy}.  @value{GDBN} will report an error if the object file
does not contain segment information, or does not contain at least
as many segments as mentioned in the reply.  Extra segments are
kept at fixed offsets relative to the last relocated segment.
@end table

@item qP @var{mode} @var{thread-id}
@cindex thread information, remote request
@cindex @samp{qP} packet
Returns information on @var{thread-id}.  Where: @var{mode} is a hex
encoded 32 bit mode; @var{thread-id} is a thread ID 
(@pxref{thread-id syntax}).

Don't use this packet; use the @samp{qThreadExtraInfo} query instead
(see below).

Reply: see @code{remote.c:remote_unpack_thread_info_response()}.

@item QNonStop:1
@itemx QNonStop:0
@cindex non-stop mode, remote request
@cindex @samp{QNonStop} packet
@anchor{QNonStop}
Enter non-stop (@samp{QNonStop:1}) or all-stop (@samp{QNonStop:0}) mode.
@xref{Remote Non-Stop}, for more information.

Reply:
@table @samp
@item OK
The request succeeded.

@item E @var{nn}
An error occurred.  The error number @var{nn} is given as hex digits.

@item @w{}
An empty reply indicates that @samp{QNonStop} is not supported by
the stub.
@end table

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).
Use of this packet is controlled by the @code{set non-stop} command; 
@pxref{Non-Stop Mode}.

@item QPassSignals: @var{signal} @r{[};@var{signal}@r{]}@dots{}
@cindex pass signals to inferior, remote request
@cindex @samp{QPassSignals} packet
@anchor{QPassSignals}
Each listed @var{signal} should be passed directly to the inferior process. 
Signals are numbered identically to continue packets and stop replies
(@pxref{Stop Reply Packets}).  Each @var{signal} list item should be
strictly greater than the previous item.  These signals do not need to stop
the inferior, or be reported to @value{GDBN}.  All other signals should be
reported to @value{GDBN}.  Multiple @samp{QPassSignals} packets do not
combine; any earlier @samp{QPassSignals} list is completely replaced by the
new list.  This packet improves performance when using @samp{handle
@var{signal} nostop noprint pass}.

Reply:
@table @samp
@item OK
The request succeeded.

@item E @var{nn}
An error occurred.  The error number @var{nn} is given as hex digits.

@item @w{}
An empty reply indicates that @samp{QPassSignals} is not supported by
the stub.
@end table

Use of this packet is controlled by the @code{set remote pass-signals}
command (@pxref{Remote Configuration, set remote pass-signals}).
This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

@item QProgramSignals: @var{signal} @r{[};@var{signal}@r{]}@dots{}
@cindex signals the inferior may see, remote request
@cindex @samp{QProgramSignals} packet
@anchor{QProgramSignals}
Each listed @var{signal} may be delivered to the inferior process.
Others should be silently discarded.

In some cases, the remote stub may need to decide whether to deliver a
signal to the program or not without @value{GDBN} involvement.  One
example of that is while detaching --- the program's threads may have
stopped for signals that haven't yet had a chance of being reported to
@value{GDBN}, and so the remote stub can use the signal list specified
by this packet to know whether to deliver or ignore those pending
signals.

This does not influence whether to deliver a signal as requested by a
resumption packet (@pxref{vCont packet}).

Signals are numbered identically to continue packets and stop replies
(@pxref{Stop Reply Packets}).  Each @var{signal} list item should be
strictly greater than the previous item.  Multiple
@samp{QProgramSignals} packets do not combine; any earlier
@samp{QProgramSignals} list is completely replaced by the new list.

Reply:
@table @samp
@item OK
The request succeeded.

@item E @var{nn}
An error occurred.  The error number @var{nn} is given as hex digits.

@item @w{}
An empty reply indicates that @samp{QProgramSignals} is not supported
by the stub.
@end table

Use of this packet is controlled by the @code{set remote program-signals}
command (@pxref{Remote Configuration, set remote program-signals}).
This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

@item qRcmd,@var{command}
@cindex execute remote command, remote request
@cindex @samp{qRcmd} packet
@var{command} (hex encoded) is passed to the local interpreter for
execution.  Invalid commands should be reported using the output
string.  Before the final result packet, the target may also respond
with a number of intermediate @samp{O@var{output}} console output
packets.  @emph{Implementors should note that providing access to a
stubs's interpreter may have security implications}.

Reply:
@table @samp
@item OK
A command response with no output.
@item @var{OUTPUT}
A command response with the hex encoded output string @var{OUTPUT}.
@item E @var{NN}
Indicate a badly formed request.
@item @w{}
An empty reply indicates that @samp{qRcmd} is not recognized.
@end table

(Note that the @code{qRcmd} packet's name is separated from the
command by a @samp{,}, not a @samp{:}, contrary to the naming
conventions above.  Please don't use this packet as a model for new
packets.)

@item qSearch:memory:@var{address};@var{length};@var{search-pattern}
@cindex searching memory, in remote debugging
@ifnotinfo
@cindex @samp{qSearch:memory} packet
@end ifnotinfo
@cindex @samp{qSearch memory} packet
@anchor{qSearch memory}
Search @var{length} bytes at @var{address} for @var{search-pattern}.
Both @var{address} and @var{length} are encoded in hex;
@var{search-pattern} is a sequence of bytes, also hex encoded.

Reply:
@table @samp
@item 0
The pattern was not found.
@item 1,address
The pattern was found at @var{address}.
@item E @var{NN}
A badly formed request or an error was encountered while searching memory.
@item @w{}
An empty reply indicates that @samp{qSearch:memory} is not recognized.
@end table

@item QStartNoAckMode
@cindex @samp{QStartNoAckMode} packet
@anchor{QStartNoAckMode}
Request that the remote stub disable the normal @samp{+}/@samp{-}
protocol acknowledgments (@pxref{Packet Acknowledgment}).

Reply:
@table @samp
@item OK
The stub has switched to no-acknowledgment mode.
@value{GDBN} acknowledges this reponse,
but neither the stub nor @value{GDBN} shall send or expect further
@samp{+}/@samp{-} acknowledgments in the current connection.
@item @w{}
An empty reply indicates that the stub does not support no-acknowledgment mode.
@end table

@item qSupported @r{[}:@var{gdbfeature} @r{[};@var{gdbfeature}@r{]}@dots{} @r{]}
@cindex supported packets, remote query
@cindex features of the remote protocol
@cindex @samp{qSupported} packet
@anchor{qSupported}
Tell the remote stub about features supported by @value{GDBN}, and
query the stub for features it supports.  This packet allows
@value{GDBN} and the remote stub to take advantage of each others'
features.  @samp{qSupported} also consolidates multiple feature probes
at startup, to improve @value{GDBN} performance---a single larger
packet performs better than multiple smaller probe packets on
high-latency links.  Some features may enable behavior which must not
be on by default, e.g.@: because it would confuse older clients or
stubs.  Other features may describe packets which could be
automatically probed for, but are not.  These features must be
reported before @value{GDBN} will use them.  This ``default
unsupported'' behavior is not appropriate for all packets, but it
helps to keep the initial connection time under control with new
versions of @value{GDBN} which support increasing numbers of packets.

Reply:
@table @samp
@item @var{stubfeature} @r{[};@var{stubfeature}@r{]}@dots{}
The stub supports or does not support each returned @var{stubfeature},
depending on the form of each @var{stubfeature} (see below for the
possible forms).
@item @w{}
An empty reply indicates that @samp{qSupported} is not recognized,
or that no features needed to be reported to @value{GDBN}.
@end table

The allowed forms for each feature (either a @var{gdbfeature} in the
@samp{qSupported} packet, or a @var{stubfeature} in the response)
are:

@table @samp
@item @var{name}=@var{value}
The remote protocol feature @var{name} is supported, and associated
with the specified @var{value}.  The format of @var{value} depends
on the feature, but it must not include a semicolon.
@item @var{name}+
The remote protocol feature @var{name} is supported, and does not
need an associated value.
@item @var{name}-
The remote protocol feature @var{name} is not supported.
@item @var{name}?
The remote protocol feature @var{name} may be supported, and
@value{GDBN} should auto-detect support in some other way when it is
needed.  This form will not be used for @var{gdbfeature} notifications,
but may be used for @var{stubfeature} responses.
@end table

Whenever the stub receives a @samp{qSupported} request, the
supplied set of @value{GDBN} features should override any previous
request.  This allows @value{GDBN} to put the stub in a known
state, even if the stub had previously been communicating with
a different version of @value{GDBN}.

The following values of @var{gdbfeature} (for the packet sent by @value{GDBN})
are defined:  

@table @samp
@item multiprocess
This feature indicates whether @value{GDBN} supports multiprocess 
extensions to the remote protocol.  @value{GDBN} does not use such
extensions unless the stub also reports that it supports them by
including @samp{multiprocess+} in its @samp{qSupported} reply.
@xref{multiprocess extensions}, for details.

@item xmlRegisters
This feature indicates that @value{GDBN} supports the XML target
description.  If the stub sees @samp{xmlRegisters=} with target
specific strings separated by a comma, it will report register
description.

@item qRelocInsn
This feature indicates whether @value{GDBN} supports the
@samp{qRelocInsn} packet (@pxref{Tracepoint Packets,,Relocate
instruction reply packet}).
@end table

Stubs should ignore any unknown values for
@var{gdbfeature}.  Any @value{GDBN} which sends a @samp{qSupported}
packet supports receiving packets of unlimited length (earlier
versions of @value{GDBN} may reject overly long responses).  Additional values
for @var{gdbfeature} may be defined in the future to let the stub take
advantage of new features in @value{GDBN}, e.g.@: incompatible
improvements in the remote protocol---the @samp{multiprocess} feature is
an example of such a feature.  The stub's reply should be independent
of the @var{gdbfeature} entries sent by @value{GDBN}; first @value{GDBN}
describes all the features it supports, and then the stub replies with
all the features it supports.

Similarly, @value{GDBN} will silently ignore unrecognized stub feature
responses, as long as each response uses one of the standard forms.

Some features are flags.  A stub which supports a flag feature
should respond with a @samp{+} form response.  Other features
require values, and the stub should respond with an @samp{=}
form response.

Each feature has a default value, which @value{GDBN} will use if
@samp{qSupported} is not available or if the feature is not mentioned
in the @samp{qSupported} response.  The default values are fixed; a
stub is free to omit any feature responses that match the defaults.

Not all features can be probed, but for those which can, the probing
mechanism is useful: in some cases, a stub's internal
architecture may not allow the protocol layer to know some information
about the underlying target in advance.  This is especially common in
stubs which may be configured for multiple targets.

These are the currently defined stub features and their properties:

@multitable @columnfractions 0.35 0.2 0.12 0.2
@c NOTE: The first row should be @headitem, but we do not yet require
@c a new enough version of Texinfo (4.7) to use @headitem.
@item Feature Name
@tab Value Required
@tab Default
@tab Probe Allowed

@item @samp{PacketSize}
@tab Yes
@tab @samp{-}
@tab No

@item @samp{qXfer:auxv:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:btrace:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:features:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:libraries:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:libraries-svr4:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{augmented-libraries-svr4-read}
@tab No
@tab @samp{-}
@tab No

@item @samp{qXfer:memory-map:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:sdata:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:spu:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:spu:write}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:siginfo:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:siginfo:write}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:threads:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:traceframe-info:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:uib:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:fdpic:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{Qbtrace:off}
@tab Yes
@tab @samp{-}
@tab Yes

@item @samp{Qbtrace:bts}
@tab Yes
@tab @samp{-}
@tab Yes

@item @samp{QNonStop}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{QPassSignals}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{QStartNoAckMode}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{multiprocess}
@tab No
@tab @samp{-}
@tab No

@item @samp{ConditionalBreakpoints}
@tab No
@tab @samp{-}
@tab No

@item @samp{ConditionalTracepoints}
@tab No
@tab @samp{-}
@tab No

@item @samp{ReverseContinue}
@tab No
@tab @samp{-}
@tab No

@item @samp{ReverseStep}
@tab No
@tab @samp{-}
@tab No

@item @samp{TracepointSource}
@tab No
@tab @samp{-}
@tab No

@item @samp{QAgent}
@tab No
@tab @samp{-}
@tab No

@item @samp{QAllow}
@tab No
@tab @samp{-}
@tab No

@item @samp{QDisableRandomization}
@tab No
@tab @samp{-}
@tab No

@item @samp{EnableDisableTracepoints}
@tab No
@tab @samp{-}
@tab No

@item @samp{QTBuffer:size}
@tab No
@tab @samp{-}
@tab No

@item @samp{tracenz}
@tab No
@tab @samp{-}
@tab No

@item @samp{BreakpointCommands}
@tab No
@tab @samp{-}
@tab No

@end multitable

These are the currently defined stub features, in more detail:

@table @samp
@cindex packet size, remote protocol
@item PacketSize=@var{bytes}
The remote stub can accept packets up to at least @var{bytes} in
length.  @value{GDBN} will send packets up to this size for bulk
transfers, and will never send larger packets.  This is a limit on the
data characters in the packet, including the frame and checksum.
There is no trailing NUL byte in a remote protocol packet; if the stub
stores packets in a NUL-terminated format, it should allow an extra
byte in its buffer for the NUL.  If this stub feature is not supported,
@value{GDBN} guesses based on the size of the @samp{g} packet response.

@item qXfer:auxv:read
The remote stub understands the @samp{qXfer:auxv:read} packet
(@pxref{qXfer auxiliary vector read}).

@item qXfer:btrace:read
The remote stub understands the @samp{qXfer:btrace:read}
packet (@pxref{qXfer btrace read}).

@item qXfer:features:read
The remote stub understands the @samp{qXfer:features:read} packet
(@pxref{qXfer target description read}).

@item qXfer:libraries:read
The remote stub understands the @samp{qXfer:libraries:read} packet
(@pxref{qXfer library list read}).

@item qXfer:libraries-svr4:read
The remote stub understands the @samp{qXfer:libraries-svr4:read} packet
(@pxref{qXfer svr4 library list read}).

@item augmented-libraries-svr4-read
The remote stub understands the augmented form of the
@samp{qXfer:libraries-svr4:read} packet
(@pxref{qXfer svr4 library list read}).

@item qXfer:memory-map:read
The remote stub understands the @samp{qXfer:memory-map:read} packet
(@pxref{qXfer memory map read}).

@item qXfer:sdata:read
The remote stub understands the @samp{qXfer:sdata:read} packet
(@pxref{qXfer sdata read}).

@item qXfer:spu:read
The remote stub understands the @samp{qXfer:spu:read} packet
(@pxref{qXfer spu read}).

@item qXfer:spu:write
The remote stub understands the @samp{qXfer:spu:write} packet
(@pxref{qXfer spu write}).

@item qXfer:siginfo:read
The remote stub understands the @samp{qXfer:siginfo:read} packet
(@pxref{qXfer siginfo read}).

@item qXfer:siginfo:write
The remote stub understands the @samp{qXfer:siginfo:write} packet
(@pxref{qXfer siginfo write}).

@item qXfer:threads:read
The remote stub understands the @samp{qXfer:threads:read} packet
(@pxref{qXfer threads read}).

@item qXfer:traceframe-info:read
The remote stub understands the @samp{qXfer:traceframe-info:read}
packet (@pxref{qXfer traceframe info read}).

@item qXfer:uib:read
The remote stub understands the @samp{qXfer:uib:read}
packet (@pxref{qXfer unwind info block}).

@item qXfer:fdpic:read
The remote stub understands the @samp{qXfer:fdpic:read}
packet (@pxref{qXfer fdpic loadmap read}).

@item QNonStop
The remote stub understands the @samp{QNonStop} packet
(@pxref{QNonStop}).

@item QPassSignals
The remote stub understands the @samp{QPassSignals} packet
(@pxref{QPassSignals}).

@item QStartNoAckMode
The remote stub understands the @samp{QStartNoAckMode} packet and
prefers to operate in no-acknowledgment mode.  @xref{Packet Acknowledgment}.

@item multiprocess
@anchor{multiprocess extensions}
@cindex multiprocess extensions, in remote protocol
The remote stub understands the multiprocess extensions to the remote
protocol syntax.  The multiprocess extensions affect the syntax of
thread IDs in both packets and replies (@pxref{thread-id syntax}), and
add process IDs to the @samp{D} packet and @samp{W} and @samp{X}
replies.  Note that reporting this feature indicates support for the
syntactic extensions only, not that the stub necessarily supports
debugging of more than one process at a time.  The stub must not use
multiprocess extensions in packet replies unless @value{GDBN} has also
indicated it supports them in its @samp{qSupported} request.

@item qXfer:osdata:read
The remote stub understands the @samp{qXfer:osdata:read} packet
((@pxref{qXfer osdata read}).

@item ConditionalBreakpoints
The target accepts and implements evaluation of conditional expressions
defined for breakpoints.  The target will only report breakpoint triggers
when such conditions are true (@pxref{Conditions, ,Break Conditions}).

@item ConditionalTracepoints
The remote stub accepts and implements conditional expressions defined
for tracepoints (@pxref{Tracepoint Conditions}).

@item ReverseContinue
The remote stub accepts and implements the reverse continue packet
(@pxref{bc}).

@item ReverseStep
The remote stub accepts and implements the reverse step packet
(@pxref{bs}).

@item TracepointSource
The remote stub understands the @samp{QTDPsrc} packet that supplies
the source form of tracepoint definitions.

@item QAgent
The remote stub understands the @samp{QAgent} packet.

@item QAllow
The remote stub understands the @samp{QAllow} packet.

@item QDisableRandomization
The remote stub understands the @samp{QDisableRandomization} packet.

@item StaticTracepoint
@cindex static tracepoints, in remote protocol
The remote stub supports static tracepoints.

@item InstallInTrace
@anchor{install tracepoint in tracing}
The remote stub supports installing tracepoint in tracing.

@item EnableDisableTracepoints
The remote stub supports the @samp{QTEnable} (@pxref{QTEnable}) and
@samp{QTDisable} (@pxref{QTDisable}) packets that allow tracepoints
to be enabled and disabled while a trace experiment is running.

@item QTBuffer:size
The remote stub supports the @samp{QTBuffer:size} (@pxref{QTBuffer-size})
packet that allows to change the size of the trace buffer.

@item tracenz
@cindex string tracing, in remote protocol
The remote stub supports the @samp{tracenz} bytecode for collecting strings.
See @ref{Bytecode Descriptions} for details about the bytecode.

@item BreakpointCommands
@cindex breakpoint commands, in remote protocol
The remote stub supports running a breakpoint's command list itself,
rather than reporting the hit to @value{GDBN}.

@item Qbtrace:off
The remote stub understands the @samp{Qbtrace:off} packet.

@item Qbtrace:bts
The remote stub understands the @samp{Qbtrace:bts} packet.

@end table

@item qSymbol::
@cindex symbol lookup, remote request
@cindex @samp{qSymbol} packet
Notify the target that @value{GDBN} is prepared to serve symbol lookup
requests.  Accept requests from the target for the values of symbols.

Reply:
@table @samp
@item OK
The target does not need to look up any (more) symbols.
@item qSymbol:@var{sym_name}
The target requests the value of symbol @var{sym_name} (hex encoded).
@value{GDBN} may provide the value by using the
@samp{qSymbol:@var{sym_value}:@var{sym_name}} message, described
below.
@end table

@item qSymbol:@var{sym_value}:@var{sym_name}
Set the value of @var{sym_name} to @var{sym_value}.

@var{sym_name} (hex encoded) is the name of a symbol whose value the
target has previously requested.

@var{sym_value} (hex) is the value for symbol @var{sym_name}.  If
@value{GDBN} cannot supply a value for @var{sym_name}, then this field
will be empty.

Reply:
@table @samp
@item OK
The target does not need to look up any (more) symbols.
@item qSymbol:@var{sym_name}
The target requests the value of a new symbol @var{sym_name} (hex
encoded).  @value{GDBN} will continue to supply the values of symbols
(if available), until the target ceases to request them.
@end table

@item qTBuffer
@itemx QTBuffer
@itemx QTDisconnected
@itemx QTDP
@itemx QTDPsrc
@itemx QTDV
@itemx qTfP
@itemx qTfV
@itemx QTFrame
@itemx qTMinFTPILen

@xref{Tracepoint Packets}.

@item qThreadExtraInfo,@var{thread-id}
@cindex thread attributes info, remote request
@cindex @samp{qThreadExtraInfo} packet
Obtain from the target OS a printable string description of thread
attributes for the thread @var{thread-id}; see @ref{thread-id syntax},
for the forms of @var{thread-id}.  This
string may contain anything that the target OS thinks is interesting
for @value{GDBN} to tell the user about the thread.  The string is
displayed in @value{GDBN}'s @code{info threads} display.  Some
examples of possible thread extra info strings are @samp{Runnable}, or
@samp{Blocked on Mutex}.

Reply:
@table @samp
@item @var{XX}@dots{}
Where @samp{@var{XX}@dots{}} is a hex encoding of @sc{ascii} data,
comprising the printable string containing the extra information about
the thread's attributes.
@end table

(Note that the @code{qThreadExtraInfo} packet's name is separated from
the command by a @samp{,}, not a @samp{:}, contrary to the naming
conventions above.  Please don't use this packet as a model for new
packets.)

@item QTNotes
@itemx qTP
@itemx QTSave
@itemx qTsP
@itemx qTsV
@itemx QTStart    
@itemx QTStop     
@itemx QTEnable
@itemx QTDisable
@itemx QTinit     
@itemx QTro       
@itemx qTStatus   
@itemx qTV
@itemx qTfSTM
@itemx qTsSTM
@itemx qTSTMat
@xref{Tracepoint Packets}.

@item qXfer:@var{object}:read:@var{annex}:@var{offset},@var{length}
@cindex read special object, remote request
@cindex @samp{qXfer} packet
@anchor{qXfer read}
Read uninterpreted bytes from the target's special data area
identified by the keyword @var{object}.  Request @var{length} bytes
starting at @var{offset} bytes into the data.  The content and
encoding of @var{annex} is specific to @var{object}; it can supply
additional details about what data to access.

Here are the specific requests of this form defined so far.  All
@samp{qXfer:@var{object}:read:@dots{}} requests use the same reply
formats, listed below.

@table @samp
@item qXfer:auxv:read::@var{offset},@var{length}
@anchor{qXfer auxiliary vector read}
Access the target's @dfn{auxiliary vector}.  @xref{OS Information,
auxiliary vector}.  Note @var{annex} must be empty.

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

@item qXfer:btrace:read:@var{annex}:@var{offset},@var{length}
@anchor{qXfer btrace read}

Return a description of the current branch trace.
@xref{Branch Trace Format}.  The annex part of the generic @samp{qXfer}
packet may have one of the following values:

@table @code
@item all
Returns all available branch trace.

@item new
Returns all available branch trace if the branch trace changed since
the last read request.

@item delta
Returns the new branch trace since the last read request.  Adds a new
block to the end of the trace that begins at zero and ends at the source
location of the first branch in the trace buffer.  This extra block is
used to stitch traces together.

If the trace buffer overflowed, returns an error indicating the overflow.
@end table

This packet is not probed by default; the remote stub must request it
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

@item qXfer:features:read:@var{annex}:@var{offset},@var{length}
@anchor{qXfer target description read}
Access the @dfn{target description}.  @xref{Target Descriptions}.  The
annex specifies which XML document to access.  The main description is
always loaded from the @samp{target.xml} annex.

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

@item qXfer:libraries:read:@var{annex}:@var{offset},@var{length}
@anchor{qXfer library list read}
Access the target's list of loaded libraries.  @xref{Library List Format}.
The annex part of the generic @samp{qXfer} packet must be empty
(@pxref{qXfer read}).

Targets which maintain a list of libraries in the program's memory do
not need to implement this packet; it is designed for platforms where
the operating system manages the list of loaded libraries.

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

@item qXfer:libraries-svr4:read:@var{annex}:@var{offset},@var{length}
@anchor{qXfer svr4 library list read}
Access the target's list of loaded libraries when the target is an SVR4
platform.  @xref{Library List Format for SVR4 Targets}.  The annex part
of the generic @samp{qXfer} packet must be empty unless the remote
stub indicated it supports the augmented form of this packet
by supplying an appropriate @samp{qSupported} response
(@pxref{qXfer read}, @ref{qSupported}).

This packet is optional for better performance on SVR4 targets.  
@value{GDBN} uses memory read packets to read the SVR4 library list otherwise.

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

If the remote stub indicates it supports the augmented form of this
packet then the annex part of the generic @samp{qXfer} packet may
contain a semicolon-separated list of @samp{@var{name}=@var{value}}
arguments.  The currently supported arguments are:

@table @code
@item start=@var{address}
A hexadecimal number specifying the address of the @samp{struct
link_map} to start reading the library list from.  If unset or zero
then the first @samp{struct link_map} in the library list will be
chosen as the starting point.

@item prev=@var{address}
A hexadecimal number specifying the address of the @samp{struct
link_map} immediately preceding the @samp{struct link_map}
specified by the @samp{start} argument.  If unset or zero then
the remote stub will expect that no @samp{struct link_map}
exists prior to the starting point.

@end table

Arguments that are not understood by the remote stub will be silently
ignored.

@item qXfer:memory-map:read::@var{offset},@var{length}
@anchor{qXfer memory map read}
Access the target's @dfn{memory-map}.  @xref{Memory Map Format}.  The
annex part of the generic @samp{qXfer} packet must be empty
(@pxref{qXfer read}).

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

@item qXfer:sdata:read::@var{offset},@var{length}
@anchor{qXfer sdata read}

Read contents of the extra collected static tracepoint marker
information.  The annex part of the generic @samp{qXfer} packet must
be empty (@pxref{qXfer read}).  @xref{Tracepoint Actions,,Tracepoint
Action Lists}.

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response
(@pxref{qSupported}).

@item qXfer:siginfo:read::@var{offset},@var{length}
@anchor{qXfer siginfo read}
Read contents of the extra signal information on the target
system.  The annex part of the generic @samp{qXfer} packet must be
empty (@pxref{qXfer read}).

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response
(@pxref{qSupported}).

@item qXfer:spu:read:@var{annex}:@var{offset},@var{length}
@anchor{qXfer spu read}
Read contents of an @code{spufs} file on the target system.  The
annex specifies which file to read; it must be of the form 
@file{@var{id}/@var{name}}, where @var{id} specifies an SPU context ID
in the target process, and @var{name} identifes the @code{spufs} file
in that context to be accessed.

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response
(@pxref{qSupported}).

@item qXfer:threads:read::@var{offset},@var{length}
@anchor{qXfer threads read}
Access the list of threads on target.  @xref{Thread List Format}.  The
annex part of the generic @samp{qXfer} packet must be empty
(@pxref{qXfer read}).

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

@item qXfer:traceframe-info:read::@var{offset},@var{length}
@anchor{qXfer traceframe info read}

Return a description of the current traceframe's contents.
@xref{Traceframe Info Format}.  The annex part of the generic
@samp{qXfer} packet must be empty (@pxref{qXfer read}).

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

@item qXfer:uib:read:@var{pc}:@var{offset},@var{length}
@anchor{qXfer unwind info block}

Return the unwind information block for @var{pc}.  This packet is used
on OpenVMS/ia64 to ask the kernel unwind information.

This packet is not probed by default.

@item qXfer:fdpic:read:@var{annex}:@var{offset},@var{length}
@anchor{qXfer fdpic loadmap read}
Read contents of @code{loadmap}s on the target system.  The
annex, either @samp{exec} or @samp{interp}, specifies which @code{loadmap},
executable @code{loadmap} or interpreter @code{loadmap} to read.

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).

@item qXfer:osdata:read::@var{offset},@var{length}
@anchor{qXfer osdata read}
Access the target's @dfn{operating system information}.
@xref{Operating System Information}.

@end table

Reply:
@table @samp
@item m @var{data}
Data @var{data} (@pxref{Binary Data}) has been read from the
target.  There may be more data at a higher address (although
it is permitted to return @samp{m} even for the last valid
block of data, as long as at least one byte of data was read).
It is possible for @var{data} to have fewer bytes than the @var{length} in the
request.

@item l @var{data}
Data @var{data} (@pxref{Binary Data}) has been read from the target.
There is no more data to be read.  It is possible for @var{data} to
have fewer bytes than the @var{length} in the request.

@item l
The @var{offset} in the request is at the end of the data.
There is no more data to be read.

@item E00
The request was malformed, or @var{annex} was invalid.

@item E @var{nn}
The offset was invalid, or there was an error encountered reading the data.
The @var{nn} part is a hex-encoded @code{errno} value.

@item @w{}
An empty reply indicates the @var{object} string was not recognized by
the stub, or that the object does not support reading.
@end table

@item qXfer:@var{object}:write:@var{annex}:@var{offset}:@var{data}@dots{}
@cindex write data into object, remote request
@anchor{qXfer write}
Write uninterpreted bytes into the target's special data area
identified by the keyword @var{object}, starting at @var{offset} bytes
into the data.  The binary-encoded data (@pxref{Binary Data}) to be
written is given by @var{data}@dots{}.  The content and encoding of @var{annex}
is specific to @var{object}; it can supply additional details about what data
to access.

Here are the specific requests of this form defined so far.  All
@samp{qXfer:@var{object}:write:@dots{}} requests use the same reply
formats, listed below.

@table @samp
@item qXfer:siginfo:write::@var{offset}:@var{data}@dots{}
@anchor{qXfer siginfo write}
Write @var{data} to the extra signal information on the target system.
The annex part of the generic @samp{qXfer} packet must be
empty (@pxref{qXfer write}).

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response
(@pxref{qSupported}).

@item qXfer:spu:write:@var{annex}:@var{offset}:@var{data}@dots{}
@anchor{qXfer spu write}
Write @var{data} to an @code{spufs} file on the target system.  The
annex specifies which file to write; it must be of the form
@file{@var{id}/@var{name}}, where @var{id} specifies an SPU context ID
in the target process, and @var{name} identifes the @code{spufs} file
in that context to be accessed.

This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).
@end table

Reply:
@table @samp
@item @var{nn}
@var{nn} (hex encoded) is the number of bytes written.
This may be fewer bytes than supplied in the request.

@item E00
The request was malformed, or @var{annex} was invalid.

@item E @var{nn}
The offset was invalid, or there was an error encountered writing the data.
The @var{nn} part is a hex-encoded @code{errno} value.

@item @w{}
An empty reply indicates the @var{object} string was not
recognized by the stub, or that the object does not support writing.
@end table

@item qXfer:@var{object}:@var{operation}:@dots{}
Requests of this form may be added in the future.  When a stub does
not recognize the @var{object} keyword, or its support for
@var{object} does not recognize the @var{operation} keyword, the stub
must respond with an empty packet.

@item qAttached:@var{pid}
@cindex query attached, remote request
@cindex @samp{qAttached} packet
Return an indication of whether the remote server attached to an
existing process or created a new process.  When the multiprocess
protocol extensions are supported (@pxref{multiprocess extensions}),
@var{pid} is an integer in hexadecimal format identifying the target
process.  Otherwise, @value{GDBN} will omit the @var{pid} field and
the query packet will be simplified as @samp{qAttached}.

This query is used, for example, to know whether the remote process
should be detached or killed when a @value{GDBN} session is ended with
the @code{quit} command.

Reply:
@table @samp
@item 1
The remote server attached to an existing process.
@item 0
The remote server created a new process.
@item E @var{NN}
A badly formed request or an error was encountered.
@end table

@item Qbtrace:bts
Enable branch tracing for the current thread using bts tracing.

Reply:
@table @samp
@item OK
Branch tracing has been enabled.
@item E.errtext
A badly formed request or an error was encountered.
@end table

@item Qbtrace:off
Disable branch tracing for the current thread.

Reply:
@table @samp
@item OK
Branch tracing has been disabled.
@item E.errtext
A badly formed request or an error was encountered.
@end table

@end table

@node Architecture-Specific Protocol Details
@section Architecture-Specific Protocol Details

This section describes how the remote protocol is applied to specific
target architectures.  Also see @ref{Standard Target Features}, for
details of XML target descriptions for each architecture.

@menu
* ARM-Specific Protocol Details::
* MIPS-Specific Protocol Details::
@end menu

@node ARM-Specific Protocol Details
@subsection @acronym{ARM}-specific Protocol Details

@menu
* ARM Breakpoint Kinds::
@end menu

@node ARM Breakpoint Kinds
@subsubsection @acronym{ARM} Breakpoint Kinds
@cindex breakpoint kinds, @acronym{ARM}

These breakpoint kinds are defined for the @samp{Z0} and @samp{Z1} packets.

@table @r

@item 2
16-bit Thumb mode breakpoint.

@item 3
32-bit Thumb mode (Thumb-2) breakpoint.

@item 4
32-bit @acronym{ARM} mode breakpoint.

@end table

@node MIPS-Specific Protocol Details
@subsection @acronym{MIPS}-specific Protocol Details

@menu
* MIPS Register packet Format::
* MIPS Breakpoint Kinds::
@end menu

@node MIPS Register packet Format
@subsubsection @acronym{MIPS} Register Packet Format
@cindex register packet format, @acronym{MIPS}

The following @code{g}/@code{G} packets have previously been defined.
In the below, some thirty-two bit registers are transferred as
sixty-four bits.  Those registers should be zero/sign extended (which?)
to fill the space allocated.  Register bytes are transferred in target
byte order.  The two nibbles within a register byte are transferred
most-significant -- least-significant.

@table @r

@item MIPS32
All registers are transferred as thirty-two bit quantities in the order:
32 general-purpose; sr; lo; hi; bad; cause; pc; 32 floating-point
registers; fsr; fir; fp.

@item MIPS64
All registers are transferred as sixty-four bit quantities (including
thirty-two bit registers such as @code{sr}).  The ordering is the same
as @code{MIPS32}.

@end table

@node MIPS Breakpoint Kinds
@subsubsection @acronym{MIPS} Breakpoint Kinds
@cindex breakpoint kinds, @acronym{MIPS}

These breakpoint kinds are defined for the @samp{Z0} and @samp{Z1} packets.

@table @r

@item 2
16-bit @acronym{MIPS16} mode breakpoint.

@item 3
16-bit @acronym{microMIPS} mode breakpoint.

@item 4
32-bit standard @acronym{MIPS} mode breakpoint.

@item 5
32-bit @acronym{microMIPS} mode breakpoint.

@end table

@node Tracepoint Packets
@section Tracepoint Packets
@cindex tracepoint packets
@cindex packets, tracepoint

Here we describe the packets @value{GDBN} uses to implement
tracepoints (@pxref{Tracepoints}).

@table @samp

@item QTDP:@var{n}:@var{addr}:@var{ena}:@var{step}:@var{pass}[:F@var{flen}][:X@var{len},@var{bytes}]@r{[}-@r{]}
@cindex @samp{QTDP} packet
Create a new tracepoint, number @var{n}, at @var{addr}.  If @var{ena}
is @samp{E}, then the tracepoint is enabled; if it is @samp{D}, then
the tracepoint is disabled.  The @var{step} gives the tracepoint's step
count, and @var{pass} gives its pass count.  If an @samp{F} is present,
then the tracepoint is to be a fast tracepoint, and the @var{flen} is
the number of bytes that the target should copy elsewhere to make room
for the tracepoint.  If an @samp{X} is present, it introduces a
tracepoint condition, which consists of a hexadecimal length, followed
by a comma and hex-encoded bytes, in a manner similar to action
encodings as described below.  If the trailing @samp{-} is present,
further @samp{QTDP} packets will follow to specify this tracepoint's
actions.

Replies:
@table @samp
@item OK
The packet was understood and carried out.
@item qRelocInsn
@xref{Tracepoint Packets,,Relocate instruction reply packet}.
@item  @w{}
The packet was not recognized.
@end table

@item QTDP:-@var{n}:@var{addr}:@r{[}S@r{]}@var{action}@dots{}@r{[}-@r{]}
Define actions to be taken when a tracepoint is hit.  The @var{n} and
@var{addr} must be the same as in the initial @samp{QTDP} packet for
this tracepoint.  This packet may only be sent immediately after
another @samp{QTDP} packet that ended with a @samp{-}.  If the
trailing @samp{-} is present, further @samp{QTDP} packets will follow,
specifying more actions for this tracepoint.

In the series of action packets for a given tracepoint, at most one
can have an @samp{S} before its first @var{action}.  If such a packet
is sent, it and the following packets define ``while-stepping''
actions.  Any prior packets define ordinary actions --- that is, those
taken when the tracepoint is first hit.  If no action packet has an
@samp{S}, then all the packets in the series specify ordinary
tracepoint actions.

The @samp{@var{action}@dots{}} portion of the packet is a series of
actions, concatenated without separators.  Each action has one of the
following forms:

@table @samp

@item R @var{mask}
Collect the registers whose bits are set in @var{mask},
a hexadecimal number whose @var{i}'th bit is set if register number
@var{i} should be collected.  (The least significant bit is numbered
zero.)  Note that @var{mask} may be any number of digits long; it may
not fit in a 32-bit word.

@item M @var{basereg},@var{offset},@var{len}
Collect @var{len} bytes of memory starting at the address in register
number @var{basereg}, plus @var{offset}.  If @var{basereg} is
@samp{-1}, then the range has a fixed address: @var{offset} is the
address of the lowest byte to collect.  The @var{basereg},
@var{offset}, and @var{len} parameters are all unsigned hexadecimal
values (the @samp{-1} value for @var{basereg} is a special case).

@item X @var{len},@var{expr}
Evaluate @var{expr}, whose length is @var{len}, and collect memory as
it directs.  The agent expression @var{expr} is as described in
@ref{Agent Expressions}.  Each byte of the expression is encoded as a
two-digit hex number in the packet; @var{len} is the number of bytes
in the expression (and thus one-half the number of hex digits in the
packet).

@end table

Any number of actions may be packed together in a single @samp{QTDP}
packet, as long as the packet does not exceed the maximum packet
length (400 bytes, for many stubs).  There may be only one @samp{R}
action per tracepoint, and it must precede any @samp{M} or @samp{X}
actions.  Any registers referred to by @samp{M} and @samp{X} actions
must be collected by a preceding @samp{R} action.  (The
``while-stepping'' actions are treated as if they were attached to a
separate tracepoint, as far as these restrictions are concerned.)

Replies:
@table @samp
@item OK
The packet was understood and carried out.
@item qRelocInsn
@xref{Tracepoint Packets,,Relocate instruction reply packet}.
@item  @w{}
The packet was not recognized.
@end table

@item QTDPsrc:@var{n}:@var{addr}:@var{type}:@var{start}:@var{slen}:@var{bytes}
@cindex @samp{QTDPsrc} packet
Specify a source string of tracepoint @var{n} at address @var{addr}.
This is useful to get accurate reproduction of the tracepoints
originally downloaded at the beginning of the trace run.  The @var{type}
is the name of the tracepoint part, such as @samp{cond} for the
tracepoint's conditional expression (see below for a list of types), while
@var{bytes} is the string, encoded in hexadecimal.

@var{start} is the offset of the @var{bytes} within the overall source
string, while @var{slen} is the total length of the source string.
This is intended for handling source strings that are longer than will
fit in a single packet.
@c Add detailed example when this info is moved into a dedicated
@c tracepoint descriptions section.

The available string types are @samp{at} for the location,
@samp{cond} for the conditional, and @samp{cmd} for an action command.
@value{GDBN} sends a separate packet for each command in the action
list, in the same order in which the commands are stored in the list.

The target does not need to do anything with source strings except
report them back as part of the replies to the @samp{qTfP}/@samp{qTsP}
query packets.

Although this packet is optional, and @value{GDBN} will only send it
if the target replies with @samp{TracepointSource} @xref{General
Query Packets}, it makes both disconnected tracing and trace files
much easier to use.  Otherwise the user must be careful that the
tracepoints in effect while looking at trace frames are identical to
the ones in effect during the trace run; even a small discrepancy
could cause @samp{tdump} not to work, or a particular trace frame not
be found.

@item QTDV:@var{n}:@var{value}
@cindex define trace state variable, remote request
@cindex @samp{QTDV} packet
Create a new trace state variable, number @var{n}, with an initial
value of @var{value}, which is a 64-bit signed integer.  Both @var{n}
and @var{value} are encoded as hexadecimal values. @value{GDBN} has
the option of not using this packet for initial values of zero; the
target should simply create the trace state variables as they are
mentioned in expressions.

@item QTFrame:@var{n}
@cindex @samp{QTFrame} packet
Select the @var{n}'th tracepoint frame from the buffer, and use the
register and memory contents recorded there to answer subsequent
request packets from @value{GDBN}.

A successful reply from the stub indicates that the stub has found the
requested frame.  The response is a series of parts, concatenated
without separators, describing the frame we selected.  Each part has
one of the following forms:

@table @samp
@item F @var{f}
The selected frame is number @var{n} in the trace frame buffer;
@var{f} is a hexadecimal number.  If @var{f} is @samp{-1}, then there
was no frame matching the criteria in the request packet.

@item T @var{t}
The selected trace frame records a hit of tracepoint number @var{t};
@var{t} is a hexadecimal number.

@end table

@item QTFrame:pc:@var{addr}
Like @samp{QTFrame:@var{n}}, but select the first tracepoint frame after the
currently selected frame whose PC is @var{addr};
@var{addr} is a hexadecimal number.

@item QTFrame:tdp:@var{t}
Like @samp{QTFrame:@var{n}}, but select the first tracepoint frame after the
currently selected frame that is a hit of tracepoint @var{t}; @var{t}
is a hexadecimal number.

@item QTFrame:range:@var{start}:@var{end}
Like @samp{QTFrame:@var{n}}, but select the first tracepoint frame after the
currently selected frame whose PC is between @var{start} (inclusive)
and @var{end} (inclusive); @var{start} and @var{end} are hexadecimal
numbers.

@item QTFrame:outside:@var{start}:@var{end}
Like @samp{QTFrame:range:@var{start}:@var{end}}, but select the first
frame @emph{outside} the given range of addresses (exclusive).

@item qTMinFTPILen
@cindex @samp{qTMinFTPILen} packet
This packet requests the minimum length of instruction at which a fast
tracepoint (@pxref{Set Tracepoints}) may be placed.  For instance, on
the 32-bit x86 architecture, it is possible to use a 4-byte jump, but
it depends on the target system being able to create trampolines in
the first 64K of memory, which might or might not be possible for that
system.  So the reply to this packet will be 4 if it is able to
arrange for that.

Replies:

@table @samp
@item 0
The minimum instruction length is currently unknown.
@item @var{length}
The minimum instruction length is @var{length}, where @var{length}
is a hexadecimal number greater or equal to 1.  A reply
of 1 means that a fast tracepoint may be placed on any instruction
regardless of size.
@item E
An error has occurred.
@item @w{}
An empty reply indicates that the request is not supported by the stub.
@end table

@item QTStart
@cindex @samp{QTStart} packet
Begin the tracepoint experiment.  Begin collecting data from
tracepoint hits in the trace frame buffer.  This packet supports the
@samp{qRelocInsn} reply (@pxref{Tracepoint Packets,,Relocate
instruction reply packet}).

@item QTStop
@cindex @samp{QTStop} packet
End the tracepoint experiment.  Stop collecting trace frames.

@item QTEnable:@var{n}:@var{addr}
@anchor{QTEnable}
@cindex @samp{QTEnable} packet
Enable tracepoint @var{n} at address @var{addr} in a started tracepoint
experiment.  If the tracepoint was previously disabled, then collection
of data from it will resume.

@item QTDisable:@var{n}:@var{addr}
@anchor{QTDisable}
@cindex @samp{QTDisable} packet
Disable tracepoint @var{n} at address @var{addr} in a started tracepoint
experiment.  No more data will be collected from the tracepoint unless
@samp{QTEnable:@var{n}:@var{addr}} is subsequently issued.

@item QTinit
@cindex @samp{QTinit} packet
Clear the table of tracepoints, and empty the trace frame buffer.

@item QTro:@var{start1},@var{end1}:@var{start2},@var{end2}:@dots{}
@cindex @samp{QTro} packet
Establish the given ranges of memory as ``transparent''.  The stub
will answer requests for these ranges from memory's current contents,
if they were not collected as part of the tracepoint hit.

@value{GDBN} uses this to mark read-only regions of memory, like those
containing program code.  Since these areas never change, they should
still have the same contents they did when the tracepoint was hit, so
there's no reason for the stub to refuse to provide their contents.

@item QTDisconnected:@var{value}
@cindex @samp{QTDisconnected} packet
Set the choice to what to do with the tracing run when @value{GDBN}
disconnects from the target.  A @var{value} of 1 directs the target to
continue the tracing run, while 0 tells the target to stop tracing if
@value{GDBN} is no longer in the picture.

@item qTStatus
@cindex @samp{qTStatus} packet
Ask the stub if there is a trace experiment running right now.

The reply has the form:

@table @samp

@item T@var{running}@r{[};@var{field}@r{]}@dots{}
@var{running} is a single digit @code{1} if the trace is presently
running, or @code{0} if not.  It is followed by semicolon-separated
optional fields that an agent may use to report additional status.

@end table

If the trace is not running, the agent may report any of several
explanations as one of the optional fields:

@table @samp

@item tnotrun:0
No trace has been run yet.

@item tstop[:@var{text}]:0
The trace was stopped by a user-originated stop command.  The optional
@var{text} field is a user-supplied string supplied as part of the
stop command (for instance, an explanation of why the trace was
stopped manually).  It is hex-encoded.

@item tfull:0
The trace stopped because the trace buffer filled up.

@item tdisconnected:0
The trace stopped because @value{GDBN} disconnected from the target.

@item tpasscount:@var{tpnum}
The trace stopped because tracepoint @var{tpnum} exceeded its pass count.

@item terror:@var{text}:@var{tpnum}
The trace stopped because tracepoint @var{tpnum} had an error.  The
string @var{text} is available to describe the nature of the error
(for instance, a divide by zero in the condition expression); it
is hex encoded.

@item tunknown:0
The trace stopped for some other reason.

@end table

Additional optional fields supply statistical and other information.
Although not required, they are extremely useful for users monitoring
the progress of a trace run.  If a trace has stopped, and these
numbers are reported, they must reflect the state of the just-stopped
trace.

@table @samp

@item tframes:@var{n}
The number of trace frames in the buffer.

@item tcreated:@var{n}
The total number of trace frames created during the run. This may
be larger than the trace frame count, if the buffer is circular.

@item tsize:@var{n}
The total size of the trace buffer, in bytes.

@item tfree:@var{n}
The number of bytes still unused in the buffer.

@item circular:@var{n}
The value of the circular trace buffer flag.  @code{1} means that the
trace buffer is circular and old trace frames will be discarded if
necessary to make room, @code{0} means that the trace buffer is linear
and may fill up.

@item disconn:@var{n}
The value of the disconnected tracing flag.  @code{1} means that
tracing will continue after @value{GDBN} disconnects, @code{0} means
that the trace run will stop.

@end table

@item qTP:@var{tp}:@var{addr}
@cindex tracepoint status, remote request
@cindex @samp{qTP} packet
Ask the stub for the current state of tracepoint number @var{tp} at
address @var{addr}.

Replies:
@table @samp
@item V@var{hits}:@var{usage}
The tracepoint has been hit @var{hits} times so far during the trace
run, and accounts for @var{usage} in the trace buffer.  Note that
@code{while-stepping} steps are not counted as separate hits, but the
steps' space consumption is added into the usage number.

@end table

@item qTV:@var{var}
@cindex trace state variable value, remote request
@cindex @samp{qTV} packet
Ask the stub for the value of the trace state variable number @var{var}.

Replies:
@table @samp
@item V@var{value}
The value of the variable is @var{value}.  This will be the current
value of the variable if the user is examining a running target, or a
saved value if the variable was collected in the trace frame that the
user is looking at.  Note that multiple requests may result in
different reply values, such as when requesting values while the
program is running.

@item U
The value of the variable is unknown.  This would occur, for example,
if the user is examining a trace frame in which the requested variable
was not collected.
@end table

@item qTfP
@cindex @samp{qTfP} packet
@itemx qTsP
@cindex @samp{qTsP} packet
These packets request data about tracepoints that are being used by
the target.  @value{GDBN} sends @code{qTfP} to get the first piece
of data, and multiple @code{qTsP} to get additional pieces.  Replies
to these packets generally take the form of the @code{QTDP} packets
that define tracepoints. (FIXME add detailed syntax)

@item qTfV
@cindex @samp{qTfV} packet
@itemx qTsV
@cindex @samp{qTsV} packet
These packets request data about trace state variables that are on the
target.  @value{GDBN} sends @code{qTfV} to get the first vari of data,
and multiple @code{qTsV} to get additional variables.  Replies to
these packets follow the syntax of the @code{QTDV} packets that define
trace state variables.

@item qTfSTM
@itemx qTsSTM
@anchor{qTfSTM}
@anchor{qTsSTM}
@cindex @samp{qTfSTM} packet
@cindex @samp{qTsSTM} packet
These packets request data about static tracepoint markers that exist
in the target program.  @value{GDBN} sends @code{qTfSTM} to get the
first piece of data, and multiple @code{qTsSTM} to get additional
pieces.  Replies to these packets take the following form:

Reply:
@table @samp
@item m @var{address}:@var{id}:@var{extra}
A single marker
@item m @var{address}:@var{id}:@var{extra},@var{address}:@var{id}:@var{extra}@dots{}
a comma-separated list of markers
@item l
(lower case letter @samp{L}) denotes end of list.
@item E @var{nn}
An error occurred.  The error number @var{nn} is given as hex digits.
@item @w{}
An empty reply indicates that the request is not supported by the
stub.
@end table

The @var{address} is encoded in hex;
@var{id} and @var{extra} are strings encoded in hex.

In response to each query, the target will reply with a list of one or
more markers, separated by commas.  @value{GDBN} will respond to each
reply with a request for more markers (using the @samp{qs} form of the
query), until the target responds with @samp{l} (lower-case ell, for
@dfn{last}).

@item qTSTMat:@var{address}
@anchor{qTSTMat}
@cindex @samp{qTSTMat} packet
This packets requests data about static tracepoint markers in the
target program at @var{address}.  Replies to this packet follow the
syntax of the @samp{qTfSTM} and @code{qTsSTM} packets that list static
tracepoint markers.

@item QTSave:@var{filename}
@cindex @samp{QTSave} packet
This packet directs the target to save trace data to the file name
@var{filename} in the target's filesystem.  The @var{filename} is encoded
as a hex string; the interpretation of the file name (relative vs
absolute, wild cards, etc) is up to the target.

@item qTBuffer:@var{offset},@var{len}
@cindex @samp{qTBuffer} packet
Return up to @var{len} bytes of the current contents of trace buffer,
starting at @var{offset}.  The trace buffer is treated as if it were
a contiguous collection of traceframes, as per the trace file format.
The reply consists as many hex-encoded bytes as the target can deliver
in a packet; it is not an error to return fewer than were asked for.
A reply consisting of just @code{l} indicates that no bytes are
available.

@item QTBuffer:circular:@var{value}
This packet directs the target to use a circular trace buffer if
@var{value} is 1, or a linear buffer if the value is 0.

@item QTBuffer:size:@var{size}
@anchor{QTBuffer-size}
@cindex @samp{QTBuffer size} packet
This packet directs the target to make the trace buffer be of size
@var{size} if possible.  A value of @code{-1} tells the target to
use whatever size it prefers.

@item QTNotes:@r{[}@var{type}:@var{text}@r{]}@r{[};@var{type}:@var{text}@r{]}@dots{}
@cindex @samp{QTNotes} packet
This packet adds optional textual notes to the trace run.  Allowable
types include @code{user}, @code{notes}, and @code{tstop}, the
@var{text} fields are arbitrary strings, hex-encoded.

@end table

@subsection Relocate instruction reply packet
When installing fast tracepoints in memory, the target may need to
relocate the instruction currently at the tracepoint address to a
different address in memory.  For most instructions, a simple copy is
enough, but, for example, call instructions that implicitly push the
return address on the stack, and relative branches or other
PC-relative instructions require offset adjustment, so that the effect
of executing the instruction at a different address is the same as if
it had executed in the original location.

In response to several of the tracepoint packets, the target may also
respond with a number of intermediate @samp{qRelocInsn} request
packets before the final result packet, to have @value{GDBN} handle
this relocation operation.  If a packet supports this mechanism, its
documentation will explicitly say so.  See for example the above
descriptions for the @samp{QTStart} and @samp{QTDP} packets.  The
format of the request is:

@table @samp
@item qRelocInsn:@var{from};@var{to}

This requests @value{GDBN} to copy instruction at address @var{from}
to address @var{to}, possibly adjusted so that executing the
instruction at @var{to} has the same effect as executing it at
@var{from}.  @value{GDBN} writes the adjusted instruction to target
memory starting at @var{to}.
@end table

Replies:
@table @samp
@item qRelocInsn:@var{adjusted_size}
Informs the stub the relocation is complete.  The @var{adjusted_size} is
the length in bytes of resulting relocated instruction sequence.
@item E @var{NN}
A badly formed request was detected, or an error was encountered while
relocating the instruction.
@end table

@node Host I/O Packets
@section Host I/O Packets
@cindex Host I/O, remote protocol
@cindex file transfer, remote protocol

The @dfn{Host I/O} packets allow @value{GDBN} to perform I/O
operations on the far side of a remote link.  For example, Host I/O is
used to upload and download files to a remote target with its own
filesystem.  Host I/O uses the same constant values and data structure
layout as the target-initiated File-I/O protocol.  However, the
Host I/O packets are structured differently.  The target-initiated
protocol relies on target memory to store parameters and buffers.
Host I/O requests are initiated by @value{GDBN}, and the
target's memory is not involved.  @xref{File-I/O Remote Protocol
Extension}, for more details on the target-initiated protocol.

The Host I/O request packets all encode a single operation along with
its arguments.  They have this format:

@table @samp

@item vFile:@var{operation}: @var{parameter}@dots{}
@var{operation} is the name of the particular request; the target
should compare the entire packet name up to the second colon when checking
for a supported operation.  The format of @var{parameter} depends on
the operation.  Numbers are always passed in hexadecimal.  Negative
numbers have an explicit minus sign (i.e.@: two's complement is not
used).  Strings (e.g.@: filenames) are encoded as a series of
hexadecimal bytes.  The last argument to a system call may be a
buffer of escaped binary data (@pxref{Binary Data}).

@end table

The valid responses to Host I/O packets are:

@table @samp

@item F @var{result} [, @var{errno}] [; @var{attachment}]
@var{result} is the integer value returned by this operation, usually
non-negative for success and -1 for errors.  If an error has occured,
@var{errno} will be included in the result specifying a
value defined by the File-I/O protocol (@pxref{Errno Values}).  For
operations which return data, @var{attachment} supplies the data as a
binary buffer.  Binary buffers in response packets are escaped in the
normal way (@pxref{Binary Data}).  See the individual packet
documentation for the interpretation of @var{result} and
@var{attachment}.

@item @w{}
An empty response indicates that this operation is not recognized.

@end table

These are the supported Host I/O operations:

@table @samp
@item vFile:open: @var{filename}, @var{flags}, @var{mode}
Open a file at @var{filename} and return a file descriptor for it, or
return -1 if an error occurs.  The @var{filename} is a string,
@var{flags} is an integer indicating a mask of open flags
(@pxref{Open Flags}), and @var{mode} is an integer indicating a mask
of mode bits to use if the file is created (@pxref{mode_t Values}).
@xref{open}, for details of the open flags and mode values.

@item vFile:close: @var{fd}
Close the open file corresponding to @var{fd} and return 0, or
-1 if an error occurs.

@item vFile:pread: @var{fd}, @var{count}, @var{offset}
Read data from the open file corresponding to @var{fd}.  Up to
@var{count} bytes will be read from the file, starting at @var{offset}
relative to the start of the file.  The target may read fewer bytes;
common reasons include packet size limits and an end-of-file
condition.  The number of bytes read is returned.  Zero should only be
returned for a successful read at the end of the file, or if
@var{count} was zero.

The data read should be returned as a binary attachment on success.
If zero bytes were read, the response should include an empty binary
attachment (i.e.@: a trailing semicolon).  The return value is the
number of target bytes read; the binary attachment may be longer if
some characters were escaped.

@item vFile:pwrite: @var{fd}, @var{offset}, @var{data}
Write @var{data} (a binary buffer) to the open file corresponding
to @var{fd}.  Start the write at @var{offset} from the start of the
file.  Unlike many @code{write} system calls, there is no
separate @var{count} argument; the length of @var{data} in the
packet is used.  @samp{vFile:write} returns the number of bytes written,
which may be shorter than the length of @var{data}, or -1 if an
error occurred.

@item vFile:unlink: @var{filename}
Delete the file at @var{filename} on the target.  Return 0,
or -1 if an error occurs.  The @var{filename} is a string.

@item vFile:readlink: @var{filename}
Read value of symbolic link @var{filename} on the target.  Return
the number of bytes read, or -1 if an error occurs.

The data read should be returned as a binary attachment on success.
If zero bytes were read, the response should include an empty binary
attachment (i.e.@: a trailing semicolon).  The return value is the
number of target bytes read; the binary attachment may be longer if
some characters were escaped.

@end table

@node Interrupts
@section Interrupts
@cindex interrupts (remote protocol)

When a program on the remote target is running, @value{GDBN} may
attempt to interrupt it by sending a @samp{Ctrl-C}, @code{BREAK} or
a @code{BREAK} followed by @code{g},
control of which is specified via @value{GDBN}'s @samp{interrupt-sequence}.

The precise meaning of @code{BREAK} is defined by the transport
mechanism and may, in fact, be undefined.  @value{GDBN} does not
currently define a @code{BREAK} mechanism for any of the network
interfaces except for TCP, in which case @value{GDBN} sends the
@code{telnet} BREAK sequence.

@samp{Ctrl-C}, on the other hand, is defined and implemented for all
transport mechanisms.  It is represented by sending the single byte
@code{0x03} without any of the usual packet overhead described in
the Overview section (@pxref{Overview}).  When a @code{0x03} byte is
transmitted as part of a packet, it is considered to be packet data
and does @emph{not} represent an interrupt.  E.g., an @samp{X} packet
(@pxref{X packet}), used for binary downloads, may include an unescaped
@code{0x03} as part of its packet.

@code{BREAK} followed by @code{g} is also known as Magic SysRq g.
When Linux kernel receives this sequence from serial port,
it stops execution and connects to gdb.

Stubs are not required to recognize these interrupt mechanisms and the
precise meaning associated with receipt of the interrupt is
implementation defined.  If the target supports debugging of multiple
threads and/or processes, it should attempt to interrupt all 
currently-executing threads and processes.
If the stub is successful at interrupting the
running program, it should send one of the stop
reply packets (@pxref{Stop Reply Packets}) to @value{GDBN} as a result
of successfully stopping the program in all-stop mode, and a stop reply
for each stopped thread in non-stop mode.
Interrupts received while the
program is stopped are discarded.

@node Notification Packets
@section Notification Packets
@cindex notification packets
@cindex packets, notification

The @value{GDBN} remote serial protocol includes @dfn{notifications},
packets that require no acknowledgment.  Both the GDB and the stub
may send notifications (although the only notifications defined at
present are sent by the stub).  Notifications carry information
without incurring the round-trip latency of an acknowledgment, and so
are useful for low-impact communications where occasional packet loss
is not a problem.

A notification packet has the form @samp{% @var{data} #
@var{checksum}}, where @var{data} is the content of the notification,
and @var{checksum} is a checksum of @var{data}, computed and formatted
as for ordinary @value{GDBN} packets.  A notification's @var{data}
never contains @samp{$}, @samp{%} or @samp{#} characters.  Upon
receiving a notification, the recipient sends no @samp{+} or @samp{-}
to acknowledge the notification's receipt or to report its corruption.

Every notification's @var{data} begins with a name, which contains no
colon characters, followed by a colon character.

Recipients should silently ignore corrupted notifications and
notifications they do not understand.  Recipients should restart
timeout periods on receipt of a well-formed notification, whether or
not they understand it.

Senders should only send the notifications described here when this
protocol description specifies that they are permitted.  In the
future, we may extend the protocol to permit existing notifications in
new contexts; this rule helps older senders avoid confusing newer
recipients.

(Older versions of @value{GDBN} ignore bytes received until they see
the @samp{$} byte that begins an ordinary packet, so new stubs may
transmit notifications without fear of confusing older clients.  There
are no notifications defined for @value{GDBN} to send at the moment, but we
assume that most older stubs would ignore them, as well.)

Each notification is comprised of three parts:
@table @samp
@item @var{name}:@var{event}
The notification packet is sent by the side that initiates the
exchange (currently, only the stub does that), with @var{event}
carrying the specific information about the notification, and
@var{name} specifying the name of the notification.
@item @var{ack}
The acknowledge sent by the other side, usually @value{GDBN}, to
acknowledge the exchange and request the event.
@end table

The purpose of an asynchronous notification mechanism is to report to
@value{GDBN} that something interesting happened in the remote stub.

The remote stub may send notification @var{name}:@var{event}
at any time, but @value{GDBN} acknowledges the notification when
appropriate.  The notification event is pending before @value{GDBN}
acknowledges.  Only one notification at a time may be pending; if
additional events occur before @value{GDBN} has acknowledged the
previous notification, they must be queued by the stub for later
synchronous transmission in response to @var{ack} packets from
@value{GDBN}.  Because the notification mechanism is unreliable,
the stub is permitted to resend a notification if it believes
@value{GDBN} may not have received it.

Specifically, notifications may appear when @value{GDBN} is not
otherwise reading input from the stub, or when @value{GDBN} is
expecting to read a normal synchronous response or a
@samp{+}/@samp{-} acknowledgment to a packet it has sent.
Notification packets are distinct from any other communication from
the stub so there is no ambiguity.

After receiving a notification, @value{GDBN} shall acknowledge it by
sending a @var{ack} packet as a regular, synchronous request to the
stub.  Such acknowledgment is not required to happen immediately, as
@value{GDBN} is permitted to send other, unrelated packets to the
stub first, which the stub should process normally.

Upon receiving a @var{ack} packet, if the stub has other queued
events to report to @value{GDBN}, it shall respond by sending a
normal @var{event}.  @value{GDBN} shall then send another @var{ack}
packet to solicit further responses; again, it is permitted to send
other, unrelated packets as well which the stub should process
normally.

If the stub receives a @var{ack} packet and there are no additional
@var{event} to report, the stub shall return an @samp{OK} response.
At this point, @value{GDBN} has finished processing a notification
and the stub has completed sending any queued events.  @value{GDBN}
won't accept any new notifications until the final @samp{OK} is
received .  If further notification events occur, the stub shall send
a new notification, @value{GDBN} shall accept the notification, and
the process shall be repeated.

The process of asynchronous notification can be illustrated by the
following example:
@smallexample
<- @code{%%Stop:T0505:98e7ffbf;04:4ce6ffbf;08:b1b6e54c;thread:p7526.7526;core:0;}
@code{...}
-> @code{vStopped}
<- @code{T0505:68f37db7;04:40f37db7;08:63850408;thread:p7526.7528;core:0;}
-> @code{vStopped}
<- @code{T0505:68e3fdb6;04:40e3fdb6;08:63850408;thread:p7526.7529;core:0;}
-> @code{vStopped}
<- @code{OK}
@end smallexample

The following notifications are defined:
@multitable @columnfractions 0.12 0.12 0.38 0.38

@item Notification
@tab Ack
@tab Event
@tab Description

@item Stop
@tab vStopped
@tab @var{reply}.  The @var{reply} has the form of a stop reply, as
described in @ref{Stop Reply Packets}.  Refer to @ref{Remote Non-Stop},
for information on how these notifications are acknowledged by 
@value{GDBN}.
@tab Report an asynchronous stop event in non-stop mode.

@end multitable

@node Remote Non-Stop
@section Remote Protocol Support for Non-Stop Mode

@value{GDBN}'s remote protocol supports non-stop debugging of
multi-threaded programs, as described in @ref{Non-Stop Mode}.  If the stub
supports non-stop mode, it should report that to @value{GDBN} by including
@samp{QNonStop+} in its @samp{qSupported} response (@pxref{qSupported}).

@value{GDBN} typically sends a @samp{QNonStop} packet only when
establishing a new connection with the stub.  Entering non-stop mode
does not alter the state of any currently-running threads, but targets
must stop all threads in any already-attached processes when entering
all-stop mode.  @value{GDBN} uses the @samp{?} packet as necessary to
probe the target state after a mode change.

In non-stop mode, when an attached process encounters an event that
would otherwise be reported with a stop reply, it uses the
asynchronous notification mechanism (@pxref{Notification Packets}) to
inform @value{GDBN}.  In contrast to all-stop mode, where all threads
in all processes are stopped when a stop reply is sent, in non-stop
mode only the thread reporting the stop event is stopped.  That is,
when reporting a @samp{S} or @samp{T} response to indicate completion
of a step operation, hitting a breakpoint, or a fault, only the
affected thread is stopped; any other still-running threads continue
to run.  When reporting a @samp{W} or @samp{X} response, all running
threads belonging to other attached processes continue to run.

In non-stop mode, the target shall respond to the @samp{?} packet as
follows.  First, any incomplete stop reply notification/@samp{vStopped} 
sequence in progress is abandoned.  The target must begin a new
sequence reporting stop events for all stopped threads, whether or not
it has previously reported those events to @value{GDBN}.  The first
stop reply is sent as a synchronous reply to the @samp{?} packet, and
subsequent stop replies are sent as responses to @samp{vStopped} packets
using the mechanism described above.  The target must not send
asynchronous stop reply notifications until the sequence is complete.
If all threads are running when the target receives the @samp{?} packet,
or if the target is not attached to any process, it shall respond
@samp{OK}.

@node Packet Acknowledgment
@section Packet Acknowledgment

@cindex acknowledgment, for @value{GDBN} remote
@cindex packet acknowledgment, for @value{GDBN} remote
By default, when either the host or the target machine receives a packet,
the first response expected is an acknowledgment: either @samp{+} (to indicate
the package was received correctly) or @samp{-} (to request retransmission).
This mechanism allows the @value{GDBN} remote protocol to operate over
unreliable transport mechanisms, such as a serial line.

In cases where the transport mechanism is itself reliable (such as a pipe or
TCP connection), the @samp{+}/@samp{-} acknowledgments are redundant.
It may be desirable to disable them in that case to reduce communication
overhead, or for other reasons.  This can be accomplished by means of the
@samp{QStartNoAckMode} packet; @pxref{QStartNoAckMode}.

When in no-acknowledgment mode, neither the stub nor @value{GDBN} shall send or
expect @samp{+}/@samp{-} protocol acknowledgments.  The packet
and response format still includes the normal checksum, as described in
@ref{Overview}, but the checksum may be ignored by the receiver.

If the stub supports @samp{QStartNoAckMode} and prefers to operate in
no-acknowledgment mode, it should report that to @value{GDBN}
by including @samp{QStartNoAckMode+} in its response to @samp{qSupported};
@pxref{qSupported}.
If @value{GDBN} also supports @samp{QStartNoAckMode} and it has not been
disabled via the @code{set remote noack-packet off} command
(@pxref{Remote Configuration}),
@value{GDBN} may then send a @samp{QStartNoAckMode} packet to the stub.
Only then may the stub actually turn off packet acknowledgments.
@value{GDBN} sends a final @samp{+} acknowledgment of the stub's @samp{OK}
response, which can be safely ignored by the stub.

Note that @code{set remote noack-packet} command only affects negotiation
between @value{GDBN} and the stub when subsequent connections are made;
it does not affect the protocol acknowledgment state for any current
connection.
Since @samp{+}/@samp{-} acknowledgments are enabled by default when a
new connection is established,
there is also no protocol request to re-enable the acknowledgments
for the current connection, once disabled.

@node Examples
@section Examples

Example sequence of a target being re-started.  Notice how the restart
does not get any direct output:

@smallexample
-> @code{R00}
<- @code{+}
@emph{target restarts}
-> @code{?}
<- @code{+}
<- @code{T001:1234123412341234}
-> @code{+}
@end smallexample

Example sequence of a target being stepped by a single instruction:

@smallexample
-> @code{G1445@dots{}}
<- @code{+}
-> @code{s}
<- @code{+}
@emph{time passes}
<- @code{T001:1234123412341234}
-> @code{+}
-> @code{g}
<- @code{+}
<- @code{1455@dots{}}
-> @code{+}
@end smallexample

@node File-I/O Remote Protocol Extension
@section File-I/O Remote Protocol Extension
@cindex File-I/O remote protocol extension

@menu
* File-I/O Overview::
* Protocol Basics::
* The F Request Packet::
* The F Reply Packet::
* The Ctrl-C Message::
* Console I/O::
* List of Supported Calls::
* Protocol-specific Representation of Datatypes::
* Constants::
* File-I/O Examples::
@end menu

@node File-I/O Overview
@subsection File-I/O Overview
@cindex file-i/o overview

The @dfn{File I/O remote protocol extension} (short: File-I/O) allows the
target to use the host's file system and console I/O to perform various
system calls.  System calls on the target system are translated into a
remote protocol packet to the host system, which then performs the needed
actions and returns a response packet to the target system.
This simulates file system operations even on targets that lack file systems.

The protocol is defined to be independent of both the host and target systems.
It uses its own internal representation of datatypes and values.  Both
@value{GDBN} and the target's @value{GDBN} stub are responsible for
translating the system-dependent value representations into the internal
protocol representations when data is transmitted.

The communication is synchronous.  A system call is possible only when 
@value{GDBN} is waiting for a response from the @samp{C}, @samp{c}, @samp{S} 
or @samp{s} packets.  While @value{GDBN} handles the request for a system call,
the target is stopped to allow deterministic access to the target's
memory.  Therefore File-I/O is not interruptible by target signals.  On
the other hand, it is possible to interrupt File-I/O by a user interrupt 
(@samp{Ctrl-C}) within @value{GDBN}.

The target's request to perform a host system call does not finish
the latest @samp{C}, @samp{c}, @samp{S} or @samp{s} action.  That means,
after finishing the system call, the target returns to continuing the
previous activity (continue, step).  No additional continue or step
request from @value{GDBN} is required.

@smallexample
(@value{GDBP}) continue
  <- target requests 'system call X'
  target is stopped, @value{GDBN} executes system call
  -> @value{GDBN} returns result
  ... target continues, @value{GDBN} returns to wait for the target
  <- target hits breakpoint and sends a Txx packet
@end smallexample

The protocol only supports I/O on the console and to regular files on 
the host file system.  Character or block special devices, pipes,
named pipes, sockets or any other communication method on the host
system are not supported by this protocol.

File I/O is not supported in non-stop mode.

@node Protocol Basics
@subsection Protocol Basics
@cindex protocol basics, file-i/o

The File-I/O protocol uses the @code{F} packet as the request as well
as reply packet.  Since a File-I/O system call can only occur when
@value{GDBN} is waiting for a response from the continuing or stepping target, 
the File-I/O request is a reply that @value{GDBN} has to expect as a result
of a previous @samp{C}, @samp{c}, @samp{S} or @samp{s} packet.
This @code{F} packet contains all information needed to allow @value{GDBN}
to call the appropriate host system call:

@itemize @bullet
@item
A unique identifier for the requested system call.

@item
All parameters to the system call.  Pointers are given as addresses
in the target memory address space.  Pointers to strings are given as
pointer/length pair.  Numerical values are given as they are.
Numerical control flags are given in a protocol-specific representation.

@end itemize

At this point, @value{GDBN} has to perform the following actions.

@itemize @bullet
@item
If the parameters include pointer values to data needed as input to a 
system call, @value{GDBN} requests this data from the target with a
standard @code{m} packet request.  This additional communication has to be
expected by the target implementation and is handled as any other @code{m}
packet.

@item
@value{GDBN} translates all value from protocol representation to host
representation as needed.  Datatypes are coerced into the host types.

@item
@value{GDBN} calls the system call.

@item
It then coerces datatypes back to protocol representation.

@item
If the system call is expected to return data in buffer space specified
by pointer parameters to the call, the data is transmitted to the
target using a @code{M} or @code{X} packet.  This packet has to be expected
by the target implementation and is handled as any other @code{M} or @code{X}
packet.

@end itemize

Eventually @value{GDBN} replies with another @code{F} packet which contains all
necessary information for the target to continue.  This at least contains

@itemize @bullet
@item
Return value.

@item
@code{errno}, if has been changed by the system call.

@item
``Ctrl-C'' flag.

@end itemize

After having done the needed type and value coercion, the target continues
the latest continue or step action.

@node The F Request Packet
@subsection The @code{F} Request Packet
@cindex file-i/o request packet
@cindex @code{F} request packet

The @code{F} request packet has the following format:

@table @samp
@item F@var{call-id},@var{parameter@dots{}}

@var{call-id} is the identifier to indicate the host system call to be called.
This is just the name of the function.

@var{parameter@dots{}} are the parameters to the system call.  
Parameters are hexadecimal integer values, either the actual values in case
of scalar datatypes, pointers to target buffer space in case of compound
datatypes and unspecified memory areas, or pointer/length pairs in case
of string parameters.  These are appended to the @var{call-id} as a 
comma-delimited list.  All values are transmitted in ASCII
string representation, pointer/length pairs separated by a slash.

@end table



@node The F Reply Packet
@subsection The @code{F} Reply Packet
@cindex file-i/o reply packet
@cindex @code{F} reply packet

The @code{F} reply packet has the following format:

@table @samp

@item F@var{retcode},@var{errno},@var{Ctrl-C flag};@var{call-specific attachment}

@var{retcode} is the return code of the system call as hexadecimal value.

@var{errno} is the @code{errno} set by the call, in protocol-specific
representation.
This parameter can be omitted if the call was successful.

@var{Ctrl-C flag} is only sent if the user requested a break.  In this
case, @var{errno} must be sent as well, even if the call was successful.
The @var{Ctrl-C flag} itself consists of the character @samp{C}:

@smallexample
F0,0,C
@end smallexample

@noindent
or, if the call was interrupted before the host call has been performed:

@smallexample
F-1,4,C
@end smallexample

@noindent
assuming 4 is the protocol-specific representation of @code{EINTR}.

@end table


@node The Ctrl-C Message
@subsection The @samp{Ctrl-C} Message
@cindex ctrl-c message, in file-i/o protocol

If the @samp{Ctrl-C} flag is set in the @value{GDBN}
reply packet (@pxref{The F Reply Packet}),
the target should behave as if it had
gotten a break message.  The meaning for the target is ``system call
interrupted by @code{SIGINT}''.  Consequentially, the target should actually stop
(as with a break message) and return to @value{GDBN} with a @code{T02}
packet.

It's important for the target to know in which
state the system call was interrupted.  There are two possible cases:

@itemize @bullet
@item
The system call hasn't been performed on the host yet.

@item
The system call on the host has been finished.

@end itemize

These two states can be distinguished by the target by the value of the
returned @code{errno}.  If it's the protocol representation of @code{EINTR}, the system
call hasn't been performed.  This is equivalent to the @code{EINTR} handling
on POSIX systems.  In any other case, the target may presume that the
system call has been finished --- successfully or not --- and should behave
as if the break message arrived right after the system call.

@value{GDBN} must behave reliably.  If the system call has not been called
yet, @value{GDBN} may send the @code{F} reply immediately, setting @code{EINTR} as
@code{errno} in the packet.  If the system call on the host has been finished
before the user requests a break, the full action must be finished by
@value{GDBN}.  This requires sending @code{M} or @code{X} packets as necessary.
The @code{F} packet may only be sent when either nothing has happened
or the full action has been completed.

@node Console I/O
@subsection Console I/O
@cindex console i/o as part of file-i/o

By default and if not explicitly closed by the target system, the file
descriptors 0, 1 and 2 are connected to the @value{GDBN} console.  Output
on the @value{GDBN} console is handled as any other file output operation
(@code{write(1, @dots{})} or @code{write(2, @dots{})}).  Console input is handled
by @value{GDBN} so that after the target read request from file descriptor
0 all following typing is buffered until either one of the following
conditions is met:

@itemize @bullet
@item
The user types @kbd{Ctrl-c}.  The behaviour is as explained above, and the
@code{read}
system call is treated as finished.

@item
The user presses @key{RET}.  This is treated as end of input with a trailing
newline.

@item
The user types @kbd{Ctrl-d}.  This is treated as end of input.  No trailing
character (neither newline nor @samp{Ctrl-D}) is appended to the input.

@end itemize

If the user has typed more characters than fit in the buffer given to
the @code{read} call, the trailing characters are buffered in @value{GDBN} until
either another @code{read(0, @dots{})} is requested by the target, or debugging
is stopped at the user's request.


@node List of Supported Calls
@subsection List of Supported Calls
@cindex list of supported file-i/o calls

@menu
* open::
* close::
* read::
* write::
* lseek::
* rename::
* unlink::
* stat/fstat::
* gettimeofday::
* isatty::
* system::
@end menu

@node open
@unnumberedsubsubsec open
@cindex open, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
@end smallexample

@item Request:
@samp{Fopen,@var{pathptr}/@var{len},@var{flags},@var{mode}}

@noindent
@var{flags} is the bitwise @code{OR} of the following values:

@table @code
@item O_CREAT
If the file does not exist it will be created.  The host
rules apply as far as file ownership and time stamps
are concerned.

@item O_EXCL
When used with @code{O_CREAT}, if the file already exists it is
an error and open() fails.

@item O_TRUNC
If the file already exists and the open mode allows
writing (@code{O_RDWR} or @code{O_WRONLY} is given) it will be
truncated to zero length.

@item O_APPEND
The file is opened in append mode.

@item O_RDONLY
The file is opened for reading only.

@item O_WRONLY
The file is opened for writing only.

@item O_RDWR
The file is opened for reading and writing.
@end table

@noindent
Other bits are silently ignored.


@noindent
@var{mode} is the bitwise @code{OR} of the following values:

@table @code
@item S_IRUSR
User has read permission.

@item S_IWUSR
User has write permission.

@item S_IRGRP
Group has read permission.

@item S_IWGRP
Group has write permission.

@item S_IROTH
Others have read permission.

@item S_IWOTH
Others have write permission.
@end table

@noindent
Other bits are silently ignored.


@item Return value:
@code{open} returns the new file descriptor or -1 if an error
occurred.

@item Errors:

@table @code
@item EEXIST
@var{pathname} already exists and @code{O_CREAT} and @code{O_EXCL} were used.

@item EISDIR
@var{pathname} refers to a directory.

@item EACCES
The requested access is not allowed.

@item ENAMETOOLONG
@var{pathname} was too long.

@item ENOENT
A directory component in @var{pathname} does not exist.

@item ENODEV
@var{pathname} refers to a device, pipe, named pipe or socket.

@item EROFS
@var{pathname} refers to a file on a read-only filesystem and
write access was requested.

@item EFAULT
@var{pathname} is an invalid pointer value.

@item ENOSPC
No space on device to create the file.

@item EMFILE
The process already has the maximum number of files open.

@item ENFILE
The limit on the total number of files open on the system
has been reached.

@item EINTR
The call was interrupted by the user.
@end table

@end table

@node close
@unnumberedsubsubsec close
@cindex close, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
int close(int fd);
@end smallexample

@item Request:
@samp{Fclose,@var{fd}}

@item Return value:
@code{close} returns zero on success, or -1 if an error occurred.

@item Errors:

@table @code
@item EBADF
@var{fd} isn't a valid open file descriptor.

@item EINTR
The call was interrupted by the user.
@end table

@end table

@node read
@unnumberedsubsubsec read
@cindex read, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
int read(int fd, void *buf, unsigned int count);
@end smallexample

@item Request:
@samp{Fread,@var{fd},@var{bufptr},@var{count}}

@item Return value:
On success, the number of bytes read is returned.
Zero indicates end of file.  If count is zero, read
returns zero as well.  On error, -1 is returned.

@item Errors:

@table @code
@item EBADF
@var{fd} is not a valid file descriptor or is not open for
reading.

@item EFAULT
@var{bufptr} is an invalid pointer value.

@item EINTR
The call was interrupted by the user.
@end table

@end table

@node write
@unnumberedsubsubsec write
@cindex write, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
int write(int fd, const void *buf, unsigned int count);
@end smallexample

@item Request:
@samp{Fwrite,@var{fd},@var{bufptr},@var{count}}

@item Return value:
On success, the number of bytes written are returned.
Zero indicates nothing was written.  On error, -1
is returned.

@item Errors:

@table @code
@item EBADF
@var{fd} is not a valid file descriptor or is not open for
writing.

@item EFAULT
@var{bufptr} is an invalid pointer value.

@item EFBIG
An attempt was made to write a file that exceeds the
host-specific maximum file size allowed.

@item ENOSPC
No space on device to write the data.

@item EINTR
The call was interrupted by the user.
@end table

@end table

@node lseek
@unnumberedsubsubsec lseek
@cindex lseek, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
long lseek (int fd, long offset, int flag);
@end smallexample

@item Request:
@samp{Flseek,@var{fd},@var{offset},@var{flag}}

@var{flag} is one of:

@table @code
@item SEEK_SET
The offset is set to @var{offset} bytes.

@item SEEK_CUR
The offset is set to its current location plus @var{offset}
bytes.

@item SEEK_END
The offset is set to the size of the file plus @var{offset}
bytes.
@end table

@item Return value:
On success, the resulting unsigned offset in bytes from
the beginning of the file is returned.  Otherwise, a
value of -1 is returned.

@item Errors:

@table @code
@item EBADF
@var{fd} is not a valid open file descriptor.

@item ESPIPE
@var{fd} is associated with the @value{GDBN} console.

@item EINVAL
@var{flag} is not a proper value.

@item EINTR
The call was interrupted by the user.
@end table

@end table

@node rename
@unnumberedsubsubsec rename
@cindex rename, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
int rename(const char *oldpath, const char *newpath);
@end smallexample

@item Request:
@samp{Frename,@var{oldpathptr}/@var{len},@var{newpathptr}/@var{len}}

@item Return value:
On success, zero is returned.  On error, -1 is returned.

@item Errors:

@table @code
@item EISDIR
@var{newpath} is an existing directory, but @var{oldpath} is not a
directory.

@item EEXIST
@var{newpath} is a non-empty directory.

@item EBUSY
@var{oldpath} or @var{newpath} is a directory that is in use by some
process.

@item EINVAL
An attempt was made to make a directory a subdirectory
of itself.

@item ENOTDIR
A  component used as a directory in @var{oldpath} or new
path is not a directory.  Or @var{oldpath} is a directory
and @var{newpath} exists but is not a directory.

@item EFAULT
@var{oldpathptr} or @var{newpathptr} are invalid pointer values.

@item EACCES
No access to the file or the path of the file.

@item ENAMETOOLONG

@var{oldpath} or @var{newpath} was too long.

@item ENOENT
A directory component in @var{oldpath} or @var{newpath} does not exist.

@item EROFS
The file is on a read-only filesystem.

@item ENOSPC
The device containing the file has no room for the new
directory entry.

@item EINTR
The call was interrupted by the user.
@end table

@end table

@node unlink
@unnumberedsubsubsec unlink
@cindex unlink, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
int unlink(const char *pathname);
@end smallexample

@item Request:
@samp{Funlink,@var{pathnameptr}/@var{len}}

@item Return value:
On success, zero is returned.  On error, -1 is returned.

@item Errors:

@table @code
@item EACCES
No access to the file or the path of the file.

@item EPERM
The system does not allow unlinking of directories.

@item EBUSY
The file @var{pathname} cannot be unlinked because it's
being used by another process.

@item EFAULT
@var{pathnameptr} is an invalid pointer value.

@item ENAMETOOLONG
@var{pathname} was too long.

@item ENOENT
A directory component in @var{pathname} does not exist.

@item ENOTDIR
A component of the path is not a directory.

@item EROFS
The file is on a read-only filesystem.

@item EINTR
The call was interrupted by the user.
@end table

@end table

@node stat/fstat
@unnumberedsubsubsec stat/fstat
@cindex fstat, file-i/o system call
@cindex stat, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);
@end smallexample

@item Request:
@samp{Fstat,@var{pathnameptr}/@var{len},@var{bufptr}}@*
@samp{Ffstat,@var{fd},@var{bufptr}}

@item Return value:
On success, zero is returned.  On error, -1 is returned.

@item Errors:

@table @code
@item EBADF
@var{fd} is not a valid open file.

@item ENOENT
A directory component in @var{pathname} does not exist or the
path is an empty string.

@item ENOTDIR
A component of the path is not a directory.

@item EFAULT
@var{pathnameptr} is an invalid pointer value.

@item EACCES
No access to the file or the path of the file.

@item ENAMETOOLONG
@var{pathname} was too long.

@item EINTR
The call was interrupted by the user.
@end table

@end table

@node gettimeofday
@unnumberedsubsubsec gettimeofday
@cindex gettimeofday, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
int gettimeofday(struct timeval *tv, void *tz);
@end smallexample

@item Request:
@samp{Fgettimeofday,@var{tvptr},@var{tzptr}}

@item Return value:
On success, 0 is returned, -1 otherwise.

@item Errors:

@table @code
@item EINVAL
@var{tz} is a non-NULL pointer.

@item EFAULT
@var{tvptr} and/or @var{tzptr} is an invalid pointer value.
@end table

@end table

@node isatty
@unnumberedsubsubsec isatty
@cindex isatty, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
int isatty(int fd);
@end smallexample

@item Request:
@samp{Fisatty,@var{fd}}

@item Return value:
Returns 1 if @var{fd} refers to the @value{GDBN} console, 0 otherwise.

@item Errors:

@table @code
@item EINTR
The call was interrupted by the user.
@end table

@end table

Note that the @code{isatty} call is treated as a special case: it returns
1 to the target if the file descriptor is attached
to the @value{GDBN} console, 0 otherwise.  Implementing through system calls
would require implementing @code{ioctl} and would be more complex than
needed.


@node system
@unnumberedsubsubsec system
@cindex system, file-i/o system call

@table @asis
@item Synopsis:
@smallexample
int system(const char *command);
@end smallexample

@item Request:
@samp{Fsystem,@var{commandptr}/@var{len}}

@item Return value:
If @var{len} is zero, the return value indicates whether a shell is
available.  A zero return value indicates a shell is not available.
For non-zero @var{len}, the value returned is -1 on error and the
return status of the command otherwise.  Only the exit status of the
command is returned, which is extracted from the host's @code{system}
return value by calling @code{WEXITSTATUS(retval)}.  In case
@file{/bin/sh} could not be executed, 127 is returned.

@item Errors:

@table @code
@item EINTR
The call was interrupted by the user.
@end table

@end table

@value{GDBN} takes over the full task of calling the necessary host calls 
to perform the @code{system} call.  The return value of @code{system} on 
the host is simplified before it's returned
to the target.  Any termination signal information from the child process 
is discarded, and the return value consists
entirely of the exit status of the called command.

Due to security concerns, the @code{system} call is by default refused
by @value{GDBN}.  The user has to allow this call explicitly with the
@code{set remote system-call-allowed 1} command.

@table @code
@item set remote system-call-allowed
@kindex set remote system-call-allowed
Control whether to allow the @code{system} calls in the File I/O
protocol for the remote target.  The default is zero (disabled).

@item show remote system-call-allowed
@kindex show remote system-call-allowed
Show whether the @code{system} calls are allowed in the File I/O
protocol.
@end table

@node Protocol-specific Representation of Datatypes
@subsection Protocol-specific Representation of Datatypes
@cindex protocol-specific representation of datatypes, in file-i/o protocol

@menu
* Integral Datatypes::
* Pointer Values::
* Memory Transfer::
* struct stat::
* struct timeval::
@end menu

@node Integral Datatypes
@unnumberedsubsubsec Integral Datatypes
@cindex integral datatypes, in file-i/o protocol

The integral datatypes used in the system calls are @code{int}, 
@code{unsigned int}, @code{long}, @code{unsigned long},
@code{mode_t}, and @code{time_t}.  

@code{int}, @code{unsigned int}, @code{mode_t} and @code{time_t} are
implemented as 32 bit values in this protocol.

@code{long} and @code{unsigned long} are implemented as 64 bit types.

@xref{Limits}, for corresponding MIN and MAX values (similar to those
in @file{limits.h}) to allow range checking on host and target.

@code{time_t} datatypes are defined as seconds since the Epoch.

All integral datatypes transferred as part of a memory read or write of a
structured datatype e.g.@: a @code{struct stat} have to be given in big endian
byte order.

@node Pointer Values
@unnumberedsubsubsec Pointer Values
@cindex pointer values, in file-i/o protocol

Pointers to target data are transmitted as they are.  An exception
is made for pointers to buffers for which the length isn't
transmitted as part of the function call, namely strings.  Strings
are transmitted as a pointer/length pair, both as hex values, e.g.@:

@smallexample
@code{1aaf/12}
@end smallexample

@noindent
which is a pointer to data of length 18 bytes at position 0x1aaf.
The length is defined as the full string length in bytes, including
the trailing null byte.  For example, the string @code{"hello world"}
at address 0x123456 is transmitted as

@smallexample
@code{123456/d}
@end smallexample

@node Memory Transfer
@unnumberedsubsubsec Memory Transfer
@cindex memory transfer, in file-i/o protocol

Structured data which is transferred using a memory read or write (for
example, a @code{struct stat}) is expected to be in a protocol-specific format 
with all scalar multibyte datatypes being big endian.  Translation to
this representation needs to be done both by the target before the @code{F} 
packet is sent, and by @value{GDBN} before 
it transfers memory to the target.  Transferred pointers to structured
data should point to the already-coerced data at any time.


@node struct stat
@unnumberedsubsubsec struct stat
@cindex struct stat, in file-i/o protocol

The buffer of type @code{struct stat} used by the target and @value{GDBN} 
is defined as follows:

@smallexample
struct stat @{
    unsigned int  st_dev;      /* device */
    unsigned int  st_ino;      /* inode */
    mode_t        st_mode;     /* protection */
    unsigned int  st_nlink;    /* number of hard links */
    unsigned int  st_uid;      /* user ID of owner */
    unsigned int  st_gid;      /* group ID of owner */
    unsigned int  st_rdev;     /* device type (if inode device) */
    unsigned long st_size;     /* total size, in bytes */
    unsigned long st_blksize;  /* blocksize for filesystem I/O */
    unsigned long st_blocks;   /* number of blocks allocated */
    time_t        st_atime;    /* time of last access */
    time_t        st_mtime;    /* time of last modification */
    time_t        st_ctime;    /* time of last change */
@};
@end smallexample

The integral datatypes conform to the definitions given in the
appropriate section (see @ref{Integral Datatypes}, for details) so this
structure is of size 64 bytes.

The values of several fields have a restricted meaning and/or
range of values.

@table @code

@item st_dev
A value of 0 represents a file, 1 the console.

@item st_ino
No valid meaning for the target.  Transmitted unchanged.

@item st_mode
Valid mode bits are described in @ref{Constants}.  Any other
bits have currently no meaning for the target.

@item st_uid
@itemx st_gid
@itemx st_rdev
No valid meaning for the target.  Transmitted unchanged.

@item st_atime
@itemx st_mtime
@itemx st_ctime
These values have a host and file system dependent
accuracy.  Especially on Windows hosts, the file system may not
support exact timing values.
@end table

The target gets a @code{struct stat} of the above representation and is
responsible for coercing it to the target representation before
continuing.

Note that due to size differences between the host, target, and protocol
representations of @code{struct stat} members, these members could eventually
get truncated on the target.

@node struct timeval
@unnumberedsubsubsec struct timeval
@cindex struct timeval, in file-i/o protocol

The buffer of type @code{struct timeval} used by the File-I/O protocol
is defined as follows:

@smallexample
struct timeval @{
    time_t tv_sec;  /* second */
    long   tv_usec; /* microsecond */
@};
@end smallexample

The integral datatypes conform to the definitions given in the
appropriate section (see @ref{Integral Datatypes}, for details) so this
structure is of size 8 bytes.

@node Constants
@subsection Constants
@cindex constants, in file-i/o protocol

The following values are used for the constants inside of the
protocol.  @value{GDBN} and target are responsible for translating these
values before and after the call as needed.

@menu
* Open Flags::
* mode_t Values::
* Errno Values::
* Lseek Flags::
* Limits::
@end menu

@node Open Flags
@unnumberedsubsubsec Open Flags
@cindex open flags, in file-i/o protocol

All values are given in hexadecimal representation.

@smallexample
  O_RDONLY        0x0
  O_WRONLY        0x1
  O_RDWR          0x2
  O_APPEND        0x8
  O_CREAT       0x200
  O_TRUNC       0x400
  O_EXCL        0x800
@end smallexample

@node mode_t Values
@unnumberedsubsubsec mode_t Values
@cindex mode_t values, in file-i/o protocol

All values are given in octal representation.

@smallexample
  S_IFREG       0100000
  S_IFDIR        040000
  S_IRUSR          0400
  S_IWUSR          0200
  S_IXUSR          0100
  S_IRGRP           040
  S_IWGRP           020
  S_IXGRP           010
  S_IROTH            04
  S_IWOTH            02
  S_IXOTH            01
@end smallexample

@node Errno Values
@unnumberedsubsubsec Errno Values
@cindex errno values, in file-i/o protocol

All values are given in decimal representation.

@smallexample
  EPERM           1
  ENOENT          2
  EINTR           4
  EBADF           9
  EACCES         13
  EFAULT         14
  EBUSY          16
  EEXIST         17
  ENODEV         19
  ENOTDIR        20
  EISDIR         21
  EINVAL         22
  ENFILE         23
  EMFILE         24
  EFBIG          27
  ENOSPC         28
  ESPIPE         29
  EROFS          30
  ENAMETOOLONG   91
  EUNKNOWN       9999
@end smallexample

  @code{EUNKNOWN} is used as a fallback error value if a host system returns
  any error value not in the list of supported error numbers.

@node Lseek Flags
@unnumberedsubsubsec Lseek Flags
@cindex lseek flags, in file-i/o protocol

@smallexample
  SEEK_SET      0
  SEEK_CUR      1
  SEEK_END      2
@end smallexample

@node Limits
@unnumberedsubsubsec Limits
@cindex limits, in file-i/o protocol

All values are given in decimal representation.

@smallexample
  INT_MIN       -2147483648
  INT_MAX        2147483647
  UINT_MAX       4294967295
  LONG_MIN      -9223372036854775808
  LONG_MAX       9223372036854775807
  ULONG_MAX      18446744073709551615
@end smallexample

@node File-I/O Examples
@subsection File-I/O Examples
@cindex file-i/o examples

Example sequence of a write call, file descriptor 3, buffer is at target
address 0x1234, 6 bytes should be written:

@smallexample
<- @code{Fwrite,3,1234,6}
@emph{request memory read from target}
-> @code{m1234,6}
<- XXXXXX
@emph{return "6 bytes written"}
-> @code{F6}
@end smallexample

Example sequence of a read call, file descriptor 3, buffer is at target
address 0x1234, 6 bytes should be read:

@smallexample
<- @code{Fread,3,1234,6}
@emph{request memory write to target}
-> @code{X1234,6:XXXXXX}
@emph{return "6 bytes read"}
-> @code{F6}
@end smallexample

Example sequence of a read call, call fails on the host due to invalid
file descriptor (@code{EBADF}):

@smallexample
<- @code{Fread,3,1234,6}
-> @code{F-1,9}
@end smallexample

Example sequence of a read call, user presses @kbd{Ctrl-c} before syscall on
host is called:

@smallexample
<- @code{Fread,3,1234,6}
-> @code{F-1,4,C}
<- @code{T02}
@end smallexample

Example sequence of a read call, user presses @kbd{Ctrl-c} after syscall on
host is called:

@smallexample
<- @code{Fread,3,1234,6}
-> @code{X1234,6:XXXXXX}
<- @code{T02}
@end smallexample

@node Library List Format
@section Library List Format
@cindex library list format, remote protocol

On some platforms, a dynamic loader (e.g.@: @file{ld.so}) runs in the
same process as your application to manage libraries.  In this case,
@value{GDBN} can use the loader's symbol table and normal memory
operations to maintain a list of shared libraries.  On other
platforms, the operating system manages loaded libraries.
@value{GDBN} can not retrieve the list of currently loaded libraries
through memory operations, so it uses the @samp{qXfer:libraries:read}
packet (@pxref{qXfer library list read}) instead.  The remote stub
queries the target's operating system and reports which libraries
are loaded.

The @samp{qXfer:libraries:read} packet returns an XML document which
lists loaded libraries and their offsets.  Each library has an
associated name and one or more segment or section base addresses,
which report where the library was loaded in memory.

For the common case of libraries that are fully linked binaries, the
library should have a list of segments.  If the target supports
dynamic linking of a relocatable object file, its library XML element
should instead include a list of allocated sections.  The segment or
section bases are start addresses, not relocation offsets; they do not
depend on the library's link-time base addresses.

@value{GDBN} must be linked with the Expat library to support XML
library lists.  @xref{Expat}.

A simple memory map, with one loaded library relocated by a single
offset, looks like this:

@smallexample
<library-list>
  <library name="/lib/libc.so.6">
    <segment address="0x10000000"/>
  </library>
</library-list>
@end smallexample

Another simple memory map, with one loaded library with three
allocated sections (.text, .data, .bss), looks like this:

@smallexample
<library-list>
  <library name="sharedlib.o">
    <section address="0x10000000"/>
    <section address="0x20000000"/>
    <section address="0x30000000"/>
  </library>
</library-list>
@end smallexample

The format of a library list is described by this DTD:

@smallexample
<!-- library-list: Root element with versioning -->
<!ELEMENT library-list  (library)*>
<!ATTLIST library-list  version CDATA   #FIXED  "1.0">
<!ELEMENT library       (segment*, section*)>
<!ATTLIST library       name    CDATA   #REQUIRED>
<!ELEMENT segment       EMPTY>
<!ATTLIST segment       address CDATA   #REQUIRED>
<!ELEMENT section       EMPTY>
<!ATTLIST section       address CDATA   #REQUIRED>
@end smallexample

In addition, segments and section descriptors cannot be mixed within a
single library element, and you must supply at least one segment or
section for each library.

@node Library List Format for SVR4 Targets
@section Library List Format for SVR4 Targets
@cindex library list format, remote protocol

On SVR4 platforms @value{GDBN} can use the symbol table of a dynamic loader
(e.g.@: @file{ld.so}) and normal memory operations to maintain a list of
shared libraries.  Still a special library list provided by this packet is
more efficient for the @value{GDBN} remote protocol.

The @samp{qXfer:libraries-svr4:read} packet returns an XML document which lists
loaded libraries and their SVR4 linker parameters.  For each library on SVR4
target, the following parameters are reported:

@itemize @minus
@item
@code{name}, the absolute file name from the @code{l_name} field of
@code{struct link_map}.
@item
@code{lm} with address of @code{struct link_map} used for TLS
(Thread Local Storage) access.
@item
@code{l_addr}, the displacement as read from the field @code{l_addr} of
@code{struct link_map}.  For prelinked libraries this is not an absolute
memory address.  It is a displacement of absolute memory address against
address the file was prelinked to during the library load.
@item
@code{l_ld}, which is memory address of the @code{PT_DYNAMIC} segment
@end itemize

Additionally the single @code{main-lm} attribute specifies address of
@code{struct link_map} used for the main executable.  This parameter is used
for TLS access and its presence is optional.

@value{GDBN} must be linked with the Expat library to support XML
SVR4 library lists.  @xref{Expat}.

A simple memory map, with two loaded libraries (which do not use prelink),
looks like this:

@smallexample
<library-list-svr4 version="1.0" main-lm="0xe4f8f8">
  <library name="/lib/ld-linux.so.2" lm="0xe4f51c" l_addr="0xe2d000"
           l_ld="0xe4eefc"/>
  <library name="/lib/libc.so.6" lm="0xe4fbe8" l_addr="0x154000"
           l_ld="0x152350"/>
</library-list-svr>
@end smallexample

The format of an SVR4 library list is described by this DTD:

@smallexample
<!-- library-list-svr4: Root element with versioning -->
<!ELEMENT library-list-svr4  (library)*>
<!ATTLIST library-list-svr4  version CDATA   #FIXED  "1.0">
<!ATTLIST library-list-svr4  main-lm CDATA   #IMPLIED>
<!ELEMENT library            EMPTY>
<!ATTLIST library            name    CDATA   #REQUIRED>
<!ATTLIST library            lm      CDATA   #REQUIRED>
<!ATTLIST library            l_addr  CDATA   #REQUIRED>
<!ATTLIST library            l_ld    CDATA   #REQUIRED>
@end smallexample

@node Memory Map Format
@section Memory Map Format
@cindex memory map format

To be able to write into flash memory, @value{GDBN} needs to obtain a
memory map from the target.  This section describes the format of the
memory map.

The memory map is obtained using the @samp{qXfer:memory-map:read}
(@pxref{qXfer memory map read}) packet and is an XML document that
lists memory regions.

@value{GDBN} must be linked with the Expat library to support XML
memory maps.  @xref{Expat}.

The top-level structure of the document is shown below:

@smallexample
<?xml version="1.0"?>
<!DOCTYPE memory-map
          PUBLIC "+//IDN gnu.org//DTD GDB Memory Map V1.0//EN"
                 "http://sourceware.org/gdb/gdb-memory-map.dtd">
<memory-map>
    region...
</memory-map>
@end smallexample

Each region can be either:

@itemize

@item
A region of RAM starting at @var{addr} and extending for @var{length}
bytes from there:

@smallexample
<memory type="ram" start="@var{addr}" length="@var{length}"/>
@end smallexample


@item
A region of read-only memory:

@smallexample
<memory type="rom" start="@var{addr}" length="@var{length}"/>
@end smallexample


@item
A region of flash memory, with erasure blocks @var{blocksize}
bytes in length:

@smallexample
<memory type="flash" start="@var{addr}" length="@var{length}">
  <property name="blocksize">@var{blocksize}</property>
</memory>
@end smallexample

@end itemize

Regions must not overlap.  @value{GDBN} assumes that areas of memory not covered
by the memory map are RAM, and uses the ordinary @samp{M} and @samp{X}
packets to write to addresses in such ranges.

The formal DTD for memory map format is given below:

@smallexample
<!-- ................................................... -->
<!-- Memory Map XML DTD ................................ -->
<!-- File: memory-map.dtd .............................. -->
<!-- .................................... .............. -->
<!-- memory-map.dtd -->
<!-- memory-map: Root element with versioning -->
<!ELEMENT memory-map (memory | property)>
<!ATTLIST memory-map    version CDATA   #FIXED  "1.0.0">
<!ELEMENT memory (property)>
<!-- memory: Specifies a memory region,
             and its type, or device. -->
<!ATTLIST memory        type    CDATA   #REQUIRED
                        start   CDATA   #REQUIRED
                        length  CDATA   #REQUIRED
                        device  CDATA   #IMPLIED>
<!-- property: Generic attribute tag -->
<!ELEMENT property (#PCDATA | property)*>
<!ATTLIST property      name    CDATA   #REQUIRED>
@end smallexample

@node Thread List Format
@section Thread List Format
@cindex thread list format

To efficiently update the list of threads and their attributes,
@value{GDBN} issues the @samp{qXfer:threads:read} packet
(@pxref{qXfer threads read}) and obtains the XML document with
the following structure:

@smallexample
<?xml version="1.0"?>
<threads>
    <thread id="id" core="0">
    ... description ...
    </thread>
</threads>
@end smallexample

Each @samp{thread} element must have the @samp{id} attribute that
identifies the thread (@pxref{thread-id syntax}).  The
@samp{core} attribute, if present, specifies which processor core
the thread was last executing on.  The content of the of @samp{thread}
element is interpreted as human-readable auxilliary information.

@node Traceframe Info Format
@section Traceframe Info Format
@cindex traceframe info format

To be able to know which objects in the inferior can be examined when
inspecting a tracepoint hit, @value{GDBN} needs to obtain the list of
memory ranges, registers and trace state variables that have been
collected in a traceframe.

This list is obtained using the @samp{qXfer:traceframe-info:read}
(@pxref{qXfer traceframe info read}) packet and is an XML document.

@value{GDBN} must be linked with the Expat library to support XML
traceframe info discovery.  @xref{Expat}.

The top-level structure of the document is shown below:

@smallexample
<?xml version="1.0"?>
<!DOCTYPE traceframe-info
          PUBLIC "+//IDN gnu.org//DTD GDB Memory Map V1.0//EN"
                 "http://sourceware.org/gdb/gdb-traceframe-info.dtd">
<traceframe-info>
   block...
</traceframe-info>
@end smallexample

Each traceframe block can be either:

@itemize

@item
A region of collected memory starting at @var{addr} and extending for
@var{length} bytes from there:

@smallexample
<memory start="@var{addr}" length="@var{length}"/>
@end smallexample

@item
A block indicating trace state variable numbered @var{number} has been
collected:

@smallexample
<tvar id="@var{number}"/>
@end smallexample

@end itemize

The formal DTD for the traceframe info format is given below:

@smallexample
<!ELEMENT traceframe-info  (memory | tvar)* >
<!ATTLIST traceframe-info  version CDATA   #FIXED  "1.0">

<!ELEMENT memory        EMPTY>
<!ATTLIST memory        start   CDATA   #REQUIRED
                        length  CDATA   #REQUIRED>
<!ELEMENT tvar>
<!ATTLIST tvar          id      CDATA   #REQUIRED>
@end smallexample

@node Branch Trace Format
@section Branch Trace Format
@cindex branch trace format

In order to display the branch trace of an inferior thread,
@value{GDBN} needs to obtain the list of branches.  This list is
represented as list of sequential code blocks that are connected via
branches.  The code in each block has been executed sequentially.

This list is obtained using the @samp{qXfer:btrace:read}
(@pxref{qXfer btrace read}) packet and is an XML document.

@value{GDBN} must be linked with the Expat library to support XML
traceframe info discovery.  @xref{Expat}.

The top-level structure of the document is shown below:

@smallexample
<?xml version="1.0"?>
<!DOCTYPE btrace
          PUBLIC "+//IDN gnu.org//DTD GDB Branch Trace V1.0//EN"
                 "http://sourceware.org/gdb/gdb-btrace.dtd">
<btrace>
   block...
</btrace>
@end smallexample

@itemize

@item
A block of sequentially executed instructions starting at @var{begin}
and ending at @var{end}:

@smallexample
<block begin="@var{begin}" end="@var{end}"/>
@end smallexample

@end itemize

The formal DTD for the branch trace format is given below:

@smallexample
<!ELEMENT btrace  (block)* >
<!ATTLIST btrace  version CDATA   #FIXED "1.0">

<!ELEMENT block        EMPTY>
<!ATTLIST block        begin  CDATA   #REQUIRED
                       end    CDATA   #REQUIRED>
@end smallexample

@include agentexpr.texi

@node Target Descriptions
@appendix Target Descriptions
@cindex target descriptions

One of the challenges of using @value{GDBN} to debug embedded systems
is that there are so many minor variants of each processor
architecture in use.  It is common practice for vendors to start with
a standard processor core --- ARM, PowerPC, or @acronym{MIPS}, for example ---
and then make changes to adapt it to a particular market niche.  Some
architectures have hundreds of variants, available from dozens of
vendors.  This leads to a number of problems:

@itemize @bullet
@item
With so many different customized processors, it is difficult for
the @value{GDBN} maintainers to keep up with the changes.
@item
Since individual variants may have short lifetimes or limited
audiences, it may not be worthwhile to carry information about every
variant in the @value{GDBN} source tree.
@item
When @value{GDBN} does support the architecture of the embedded system
at hand, the task of finding the correct architecture name to give the
@command{set architecture} command can be error-prone.
@end itemize

To address these problems, the @value{GDBN} remote protocol allows a
target system to not only identify itself to @value{GDBN}, but to
actually describe its own features.  This lets @value{GDBN} support
processor variants it has never seen before --- to the extent that the
descriptions are accurate, and that @value{GDBN} understands them.

@value{GDBN} must be linked with the Expat library to support XML
target descriptions.  @xref{Expat}.

@menu
* Retrieving Descriptions::         How descriptions are fetched from a target.
* Target Description Format::       The contents of a target description.
* Predefined Target Types::         Standard types available for target
                                    descriptions.
* Standard Target Features::        Features @value{GDBN} knows about.
@end menu

@node Retrieving Descriptions
@section Retrieving Descriptions

Target descriptions can be read from the target automatically, or
specified by the user manually.  The default behavior is to read the
description from the target.  @value{GDBN} retrieves it via the remote
protocol using @samp{qXfer} requests (@pxref{General Query Packets,
qXfer}).  The @var{annex} in the @samp{qXfer} packet will be
@samp{target.xml}.  The contents of the @samp{target.xml} annex are an
XML document, of the form described in @ref{Target Description
Format}.

Alternatively, you can specify a file to read for the target description.
If a file is set, the target will not be queried.  The commands to
specify a file are:

@table @code
@cindex set tdesc filename
@item set tdesc filename @var{path}
Read the target description from @var{path}.

@cindex unset tdesc filename
@item unset tdesc filename
Do not read the XML target description from a file.  @value{GDBN}
will use the description supplied by the current target.

@cindex show tdesc filename
@item show tdesc filename
Show the filename to read for a target description, if any.
@end table


@node Target Description Format
@section Target Description Format
@cindex target descriptions, XML format

A target description annex is an @uref{http://www.w3.org/XML/, XML}
document which complies with the Document Type Definition provided in
the @value{GDBN} sources in @file{gdb/features/gdb-target.dtd}.  This
means you can use generally available tools like @command{xmllint} to
check that your feature descriptions are well-formed and valid.
However, to help people unfamiliar with XML write descriptions for
their targets, we also describe the grammar here.

Target descriptions can identify the architecture of the remote target
and (for some architectures) provide information about custom register
sets.  They can also identify the OS ABI of the remote target.
@value{GDBN} can use this information to autoconfigure for your
target, or to warn you if you connect to an unsupported target.

Here is a simple target description:

@smallexample
<target version="1.0">
  <architecture>i386:x86-64</architecture>
</target>
@end smallexample

@noindent
This minimal description only says that the target uses
the x86-64 architecture.

A target description has the following overall form, with [ ] marking
optional elements and @dots{} marking repeatable elements.  The elements
are explained further below.

@smallexample
<?xml version="1.0"?>
<!DOCTYPE target SYSTEM "gdb-target.dtd">
<target version="1.0">
  @r{[}@var{architecture}@r{]}
  @r{[}@var{osabi}@r{]}
  @r{[}@var{compatible}@r{]}
  @r{[}@var{feature}@dots{}@r{]}
</target>
@end smallexample

@noindent
The description is generally insensitive to whitespace and line
breaks, under the usual common-sense rules.  The XML version
declaration and document type declaration can generally be omitted
(@value{GDBN} does not require them), but specifying them may be
useful for XML validation tools.  The @samp{version} attribute for
@samp{<target>} may also be omitted, but we recommend
including it; if future versions of @value{GDBN} use an incompatible
revision of @file{gdb-target.dtd}, they will detect and report
the version mismatch.

@subsection Inclusion
@cindex target descriptions, inclusion
@cindex XInclude
@ifnotinfo
@cindex <xi:include>
@end ifnotinfo

It can sometimes be valuable to split a target description up into
several different annexes, either for organizational purposes, or to
share files between different possible target descriptions.  You can
divide a description into multiple files by replacing any element of
the target description with an inclusion directive of the form:

@smallexample
<xi:include href="@var{document}"/>
@end smallexample

@noindent
When @value{GDBN} encounters an element of this form, it will retrieve
the named XML @var{document}, and replace the inclusion directive with
the contents of that document.  If the current description was read
using @samp{qXfer}, then so will be the included document;
@var{document} will be interpreted as the name of an annex.  If the
current description was read from a file, @value{GDBN} will look for
@var{document} as a file in the same directory where it found the
original description.

@subsection Architecture
@cindex <architecture>

An @samp{<architecture>} element has this form:

@smallexample
  <architecture>@var{arch}</architecture>
@end smallexample

@var{arch} is one of the architectures from the set accepted by
@code{set architecture} (@pxref{Targets, ,Specifying a Debugging Target}).

@subsection OS ABI
@cindex @code{<osabi>}

This optional field was introduced in @value{GDBN} version 7.0.
Previous versions of @value{GDBN} ignore it.

An @samp{<osabi>} element has this form:

@smallexample
  <osabi>@var{abi-name}</osabi>
@end smallexample

@var{abi-name} is an OS ABI name from the same selection accepted by
@w{@code{set osabi}} (@pxref{ABI, ,Configuring the Current ABI}).

@subsection Compatible Architecture
@cindex @code{<compatible>}

This optional field was introduced in @value{GDBN} version 7.0.
Previous versions of @value{GDBN} ignore it.

A @samp{<compatible>} element has this form:

@smallexample
  <compatible>@var{arch}</compatible>
@end smallexample

@var{arch} is one of the architectures from the set accepted by
@code{set architecture} (@pxref{Targets, ,Specifying a Debugging Target}).

A @samp{<compatible>} element is used to specify that the target
is able to run binaries in some other than the main target architecture
given by the @samp{<architecture>} element.  For example, on the
Cell Broadband Engine, the main architecture is @code{powerpc:common}
or @code{powerpc:common64}, but the system is able to run binaries
in the @code{spu} architecture as well.  The way to describe this
capability with @samp{<compatible>} is as follows:

@smallexample
  <architecture>powerpc:common</architecture>
  <compatible>spu</compatible>
@end smallexample

@subsection Features
@cindex <feature>

Each @samp{<feature>} describes some logical portion of the target
system.  Features are currently used to describe available CPU
registers and the types of their contents.  A @samp{<feature>} element
has this form:

@smallexample
<feature name="@var{name}">
  @r{[}@var{type}@dots{}@r{]}
  @var{reg}@dots{}
</feature>
@end smallexample

@noindent
Each feature's name should be unique within the description.  The name
of a feature does not matter unless @value{GDBN} has some special
knowledge of the contents of that feature; if it does, the feature
should have its standard name.  @xref{Standard Target Features}.

@subsection Types

Any register's value is a collection of bits which @value{GDBN} must
interpret.  The default interpretation is a two's complement integer,
but other types can be requested by name in the register description.
Some predefined types are provided by @value{GDBN} (@pxref{Predefined
Target Types}), and the description can define additional composite types.

Each type element must have an @samp{id} attribute, which gives
a unique (within the containing @samp{<feature>}) name to the type.
Types must be defined before they are used.

@cindex <vector>
Some targets offer vector registers, which can be treated as arrays
of scalar elements.  These types are written as @samp{<vector>} elements,
specifying the array element type, @var{type}, and the number of elements,
@var{count}:

@smallexample
<vector id="@var{id}" type="@var{type}" count="@var{count}"/>
@end smallexample

@cindex <union>
If a register's value is usefully viewed in multiple ways, define it
with a union type containing the useful representations.  The
@samp{<union>} element contains one or more @samp{<field>} elements,
each of which has a @var{name} and a @var{type}:

@smallexample
<union id="@var{id}">
  <field name="@var{name}" type="@var{type}"/>
  @dots{}
</union>
@end smallexample

@cindex <struct>
If a register's value is composed from several separate values, define
it with a structure type.  There are two forms of the @samp{<struct>}
element; a @samp{<struct>} element must either contain only bitfields
or contain no bitfields.  If the structure contains only bitfields,
its total size in bytes must be specified, each bitfield must have an
explicit start and end, and bitfields are automatically assigned an
integer type.  The field's @var{start} should be less than or
equal to its @var{end}, and zero represents the least significant bit.

@smallexample
<struct id="@var{id}" size="@var{size}">
  <field name="@var{name}" start="@var{start}" end="@var{end}"/>
  @dots{}
</struct>
@end smallexample

If the structure contains no bitfields, then each field has an
explicit type, and no implicit padding is added.

@smallexample
<struct id="@var{id}">
  <field name="@var{name}" type="@var{type}"/>
  @dots{}
</struct>
@end smallexample

@cindex <flags>
If a register's value is a series of single-bit flags, define it with
a flags type.  The @samp{<flags>} element has an explicit @var{size}
and contains one or more @samp{<field>} elements.  Each field has a
@var{name}, a @var{start}, and an @var{end}.  Only single-bit flags
are supported.

@smallexample
<flags id="@var{id}" size="@var{size}">
  <field name="@var{name}" start="@var{start}" end="@var{end}"/>
  @dots{}
</flags>
@end smallexample

@subsection Registers
@cindex <reg>

Each register is represented as an element with this form:

@smallexample
<reg name="@var{name}"
     bitsize="@var{size}"
     @r{[}regnum="@var{num}"@r{]}
     @r{[}save-restore="@var{save-restore}"@r{]}
     @r{[}type="@var{type}"@r{]}
     @r{[}group="@var{group}"@r{]}/>
@end smallexample

@noindent
The components are as follows:

@table @var

@item name
The register's name; it must be unique within the target description.

@item bitsize
The register's size, in bits.

@item regnum
The register's number.  If omitted, a register's number is one greater
than that of the previous register (either in the current feature or in
a preceding feature); the first register in the target description
defaults to zero.  This register number is used to read or write
the register; e.g.@: it is used in the remote @code{p} and @code{P}
packets, and registers appear in the @code{g} and @code{G} packets
in order of increasing register number.

@item save-restore
Whether the register should be preserved across inferior function
calls; this must be either @code{yes} or @code{no}.  The default is
@code{yes}, which is appropriate for most registers except for
some system control registers; this is not related to the target's
ABI.

@item type
The type of the register.  It may be a predefined type, a type
defined in the current feature, or one of the special types @code{int}
and @code{float}.  @code{int} is an integer type of the correct size
for @var{bitsize}, and @code{float} is a floating point type (in the
architecture's normal floating point format) of the correct size for
@var{bitsize}.  The default is @code{int}.

@item group
The register group to which this register belongs.  It must
be either @code{general}, @code{float}, or @code{vector}.  If no
@var{group} is specified, @value{GDBN} will not display the register
in @code{info registers}.

@end table

@node Predefined Target Types
@section Predefined Target Types
@cindex target descriptions, predefined types

Type definitions in the self-description can build up composite types
from basic building blocks, but can not define fundamental types.  Instead,
standard identifiers are provided by @value{GDBN} for the fundamental
types.  The currently supported types are:

@table @code

@item int8
@itemx int16
@itemx int32
@itemx int64
@itemx int128
Signed integer types holding the specified number of bits.

@item uint8
@itemx uint16
@itemx uint32
@itemx uint64
@itemx uint128
Unsigned integer types holding the specified number of bits.

@item code_ptr
@itemx data_ptr
Pointers to unspecified code and data.  The program counter and
any dedicated return address register may be marked as code
pointers; printing a code pointer converts it into a symbolic
address.  The stack pointer and any dedicated address registers
may be marked as data pointers.

@item ieee_single
Single precision IEEE floating point.

@item ieee_double
Double precision IEEE floating point.

@item arm_fpa_ext
The 12-byte extended precision format used by ARM FPA registers.

@item i387_ext
The 10-byte extended precision format used by x87 registers.

@item i386_eflags
32bit @sc{eflags} register used by x86.

@item i386_mxcsr
32bit @sc{mxcsr} register used by x86.

@end table

@node Standard Target Features
@section Standard Target Features
@cindex target descriptions, standard features

A target description must contain either no registers or all the
target's registers.  If the description contains no registers, then
@value{GDBN} will assume a default register layout, selected based on
the architecture.  If the description contains any registers, the
default layout will not be used; the standard registers must be
described in the target description, in such a way that @value{GDBN}
can recognize them.

This is accomplished by giving specific names to feature elements
which contain standard registers.  @value{GDBN} will look for features
with those names and verify that they contain the expected registers;
if any known feature is missing required registers, or if any required
feature is missing, @value{GDBN} will reject the target
description.  You can add additional registers to any of the
standard features --- @value{GDBN} will display them just as if
they were added to an unrecognized feature.

This section lists the known features and their expected contents.
Sample XML documents for these features are included in the
@value{GDBN} source tree, in the directory @file{gdb/features}.

Names recognized by @value{GDBN} should include the name of the
company or organization which selected the name, and the overall
architecture to which the feature applies; so e.g.@: the feature
containing ARM core registers is named @samp{org.gnu.gdb.arm.core}.

The names of registers are not case sensitive for the purpose
of recognizing standard features, but @value{GDBN} will only display
registers using the capitalization used in the description.

@menu
* AArch64 Features::
* ARM Features::
* i386 Features::
* MicroBlaze Features::
* MIPS Features::
* M68K Features::
* Nios II Features::
* PowerPC Features::
* S/390 and System z Features::
* TIC6x Features::
@end menu


@node AArch64 Features
@subsection AArch64 Features
@cindex target descriptions, AArch64 features

The @samp{org.gnu.gdb.aarch64.core} feature is required for AArch64
targets.  It should contain registers @samp{x0} through @samp{x30},
@samp{sp}, @samp{pc}, and @samp{cpsr}.

The @samp{org.gnu.gdb.aarch64.fpu} feature is optional.  If present,
it should contain registers @samp{v0} through @samp{v31}, @samp{fpsr},
and @samp{fpcr}.

@node ARM Features
@subsection ARM Features
@cindex target descriptions, ARM features

The @samp{org.gnu.gdb.arm.core} feature is required for non-M-profile
ARM targets.
It should contain registers @samp{r0} through @samp{r13}, @samp{sp},
@samp{lr}, @samp{pc}, and @samp{cpsr}.

For M-profile targets (e.g. Cortex-M3), the @samp{org.gnu.gdb.arm.core}
feature is replaced by @samp{org.gnu.gdb.arm.m-profile}.  It should contain
registers @samp{r0} through @samp{r13}, @samp{sp}, @samp{lr}, @samp{pc},
and @samp{xpsr}.

The @samp{org.gnu.gdb.arm.fpa} feature is optional.  If present, it
should contain registers @samp{f0} through @samp{f7} and @samp{fps}.

The @samp{org.gnu.gdb.xscale.iwmmxt} feature is optional.  If present,
it should contain at least registers @samp{wR0} through @samp{wR15} and
@samp{wCGR0} through @samp{wCGR3}.  The @samp{wCID}, @samp{wCon},
@samp{wCSSF}, and @samp{wCASF} registers are optional.

The @samp{org.gnu.gdb.arm.vfp} feature is optional.  If present, it
should contain at least registers @samp{d0} through @samp{d15}.  If
they are present, @samp{d16} through @samp{d31} should also be included.
@value{GDBN} will synthesize the single-precision registers from
halves of the double-precision registers.

The @samp{org.gnu.gdb.arm.neon} feature is optional.  It does not
need to contain registers; it instructs @value{GDBN} to display the
VFP double-precision registers as vectors and to synthesize the
quad-precision registers from pairs of double-precision registers.
If this feature is present, @samp{org.gnu.gdb.arm.vfp} must also
be present and include 32 double-precision registers.

@node i386 Features
@subsection i386 Features
@cindex target descriptions, i386 features

The @samp{org.gnu.gdb.i386.core} feature is required for i386/amd64
targets.  It should describe the following registers:

@itemize @minus
@item
@samp{eax} through @samp{edi} plus @samp{eip} for i386
@item
@samp{rax} through @samp{r15} plus @samp{rip} for amd64
@item
@samp{eflags}, @samp{cs}, @samp{ss}, @samp{ds}, @samp{es},
@samp{fs}, @samp{gs}
@item 
@samp{st0} through @samp{st7}
@item 
@samp{fctrl}, @samp{fstat}, @samp{ftag}, @samp{fiseg}, @samp{fioff},
@samp{foseg}, @samp{fooff} and @samp{fop}
@end itemize

The register sets may be different, depending on the target.

The @samp{org.gnu.gdb.i386.sse} feature is optional.  It should
describe registers:

@itemize @minus
@item
@samp{xmm0} through @samp{xmm7} for i386
@item
@samp{xmm0} through @samp{xmm15} for amd64
@item 
@samp{mxcsr}
@end itemize

The @samp{org.gnu.gdb.i386.avx} feature is optional and requires the
@samp{org.gnu.gdb.i386.sse} feature.  It should
describe the upper 128 bits of @sc{ymm} registers:

@itemize @minus
@item
@samp{ymm0h} through @samp{ymm7h} for i386
@item
@samp{ymm0h} through @samp{ymm15h} for amd64
@end itemize

The @samp{org.gnu.gdb.i386.mpx} is an optional feature representing Intel(R)
Memory Protection Extension (MPX).  It should describe the following registers:

@itemize @minus
@item
@samp{bnd0raw} through @samp{bnd3raw} for i386 and amd64.
@item
@samp{bndcfgu} and @samp{bndstatus} for i386 and amd64.
@end itemize

The @samp{org.gnu.gdb.i386.linux} feature is optional.  It should
describe a single register, @samp{orig_eax}.

The @samp{org.gnu.gdb.i386.avx512} feature is optional and requires the
@samp{org.gnu.gdb.i386.avx} feature.  It should
describe additional @sc{xmm} registers:

@itemize @minus
@item
@samp{xmm16h} through @samp{xmm31h}, only valid for amd64.
@end itemize

It should describe the upper 128 bits of additional @sc{ymm} registers:

@itemize @minus
@item
@samp{ymm16h} through @samp{ymm31h}, only valid for amd64.
@end itemize

It should
describe the upper 256 bits of @sc{zmm} registers:

@itemize @minus
@item
@samp{zmm0h} through @samp{zmm7h} for i386.
@item
@samp{zmm0h} through @samp{zmm15h} for amd64.
@end itemize

It should
describe the additional @sc{zmm} registers:

@itemize @minus
@item
@samp{zmm16h} through @samp{zmm31h}, only valid for amd64.
@end itemize

@node MicroBlaze Features
@subsection MicroBlaze Features
@cindex target descriptions, MicroBlaze features

The @samp{org.gnu.gdb.microblaze.core} feature is required for MicroBlaze
targets.  It should contain registers @samp{r0} through @samp{r31},
@samp{rpc}, @samp{rmsr}, @samp{rear}, @samp{resr}, @samp{rfsr}, @samp{rbtr},
@samp{rpvr}, @samp{rpvr1} through @samp{rpvr11}, @samp{redr}, @samp{rpid},
@samp{rzpr}, @samp{rtlbx}, @samp{rtlbsx}, @samp{rtlblo}, and @samp{rtlbhi}.

The @samp{org.gnu.gdb.microblaze.stack-protect} feature is optional.
If present, it should contain registers @samp{rshr} and @samp{rslr}

@node MIPS Features
@subsection @acronym{MIPS} Features
@cindex target descriptions, @acronym{MIPS} features

The @samp{org.gnu.gdb.mips.cpu} feature is required for @acronym{MIPS} targets.
It should contain registers @samp{r0} through @samp{r31}, @samp{lo},
@samp{hi}, and @samp{pc}.  They may be 32-bit or 64-bit depending
on the target.

The @samp{org.gnu.gdb.mips.cp0} feature is also required.  It should
contain at least the @samp{status}, @samp{badvaddr}, and @samp{cause}
registers.  They may be 32-bit or 64-bit depending on the target.

The @samp{org.gnu.gdb.mips.fpu} feature is currently required, though
it may be optional in a future version of @value{GDBN}.  It should
contain registers @samp{f0} through @samp{f31}, @samp{fcsr}, and
@samp{fir}.  They may be 32-bit or 64-bit depending on the target.

The @samp{org.gnu.gdb.mips.dsp} feature is optional.  It should
contain registers @samp{hi1} through @samp{hi3}, @samp{lo1} through
@samp{lo3}, and @samp{dspctl}.  The @samp{dspctl} register should
be 32-bit and the rest may be 32-bit or 64-bit depending on the target.

The @samp{org.gnu.gdb.mips.linux} feature is optional.  It should
contain a single register, @samp{restart}, which is used by the
Linux kernel to control restartable syscalls.

@node M68K Features
@subsection M68K Features
@cindex target descriptions, M68K features

@table @code
@item @samp{org.gnu.gdb.m68k.core}
@itemx @samp{org.gnu.gdb.coldfire.core}
@itemx @samp{org.gnu.gdb.fido.core}
One of those features must be always present. 
The feature that is present determines which flavor of m68k is
used.  The feature that is present should contain registers
@samp{d0} through @samp{d7}, @samp{a0} through @samp{a5}, @samp{fp},
@samp{sp}, @samp{ps} and @samp{pc}.

@item @samp{org.gnu.gdb.coldfire.fp}
This feature is optional.  If present, it should contain registers
@samp{fp0} through @samp{fp7}, @samp{fpcontrol}, @samp{fpstatus} and
@samp{fpiaddr}.
@end table

@node Nios II Features
@subsection Nios II Features
@cindex target descriptions, Nios II features

The @samp{org.gnu.gdb.nios2.cpu} feature is required for Nios II
targets.  It should contain the 32 core registers (@samp{zero},
@samp{at}, @samp{r2} through @samp{r23}, @samp{et} through @samp{ra}),
@samp{pc}, and the 16 control registers (@samp{status} through
@samp{mpuacc}).

@node PowerPC Features
@subsection PowerPC Features
@cindex target descriptions, PowerPC features

The @samp{org.gnu.gdb.power.core} feature is required for PowerPC
targets.  It should contain registers @samp{r0} through @samp{r31},
@samp{pc}, @samp{msr}, @samp{cr}, @samp{lr}, @samp{ctr}, and
@samp{xer}.  They may be 32-bit or 64-bit depending on the target.

The @samp{org.gnu.gdb.power.fpu} feature is optional.  It should
contain registers @samp{f0} through @samp{f31} and @samp{fpscr}.

The @samp{org.gnu.gdb.power.altivec} feature is optional.  It should
contain registers @samp{vr0} through @samp{vr31}, @samp{vscr},
and @samp{vrsave}.

The @samp{org.gnu.gdb.power.vsx} feature is optional.  It should
contain registers @samp{vs0h} through @samp{vs31h}.  @value{GDBN}
will combine these registers with the floating point registers
(@samp{f0} through @samp{f31}) and the altivec registers (@samp{vr0}
through @samp{vr31}) to present the 128-bit wide registers @samp{vs0}
through @samp{vs63}, the set of vector registers for POWER7.

The @samp{org.gnu.gdb.power.spe} feature is optional.  It should
contain registers @samp{ev0h} through @samp{ev31h}, @samp{acc}, and
@samp{spefscr}.  SPE targets should provide 32-bit registers in
@samp{org.gnu.gdb.power.core} and provide the upper halves in
@samp{ev0h} through @samp{ev31h}.  @value{GDBN} will combine
these to present registers @samp{ev0} through @samp{ev31} to the
user.

@node S/390 and System z Features
@subsection S/390 and System z Features
@cindex target descriptions, S/390 features
@cindex target descriptions, System z features

The @samp{org.gnu.gdb.s390.core} feature is required for S/390 and
System z targets.  It should contain the PSW and the 16 general
registers.  In particular, System z targets should provide the 64-bit
registers @samp{pswm}, @samp{pswa}, and @samp{r0} through @samp{r15}.
S/390 targets should provide the 32-bit versions of these registers.
A System z target that runs in 31-bit addressing mode should provide
32-bit versions of @samp{pswm} and @samp{pswa}, as well as the general
register's upper halves @samp{r0h} through @samp{r15h}, and their
lower halves @samp{r0l} through @samp{r15l}.

The @samp{org.gnu.gdb.s390.fpr} feature is required.  It should
contain the 64-bit registers @samp{f0} through @samp{f15}, and
@samp{fpc}.

The @samp{org.gnu.gdb.s390.acr} feature is required.  It should
contain the 32-bit registers @samp{acr0} through @samp{acr15}.

The @samp{org.gnu.gdb.s390.linux} feature is optional.  It should
contain the register @samp{orig_r2}, which is 64-bit wide on System z
targets and 32-bit otherwise.  In addition, the feature may contain
the @samp{last_break} register, whose width depends on the addressing
mode, as well as the @samp{system_call} register, which is always
32-bit wide.

The @samp{org.gnu.gdb.s390.tdb} feature is optional.  It should
contain the 64-bit registers @samp{tdb0}, @samp{tac}, @samp{tct},
@samp{atia}, and @samp{tr0} through @samp{tr15}.

@node TIC6x Features
@subsection TMS320C6x Features
@cindex target descriptions, TIC6x features
@cindex target descriptions, TMS320C6x features
The @samp{org.gnu.gdb.tic6x.core} feature is required for TMS320C6x
targets.  It should contain registers @samp{A0} through @samp{A15},
registers @samp{B0} through @samp{B15}, @samp{CSR} and @samp{PC}.

The @samp{org.gnu.gdb.tic6x.gp} feature is optional.  It should
contain registers @samp{A16} through @samp{A31} and @samp{B16}
through @samp{B31}.

The @samp{org.gnu.gdb.tic6x.c6xp} feature is optional.  It should
contain registers @samp{TSR}, @samp{ILC} and @samp{RILC}.

@node Operating System Information
@appendix Operating System Information
@cindex operating system information

@menu
* Process list::
@end menu

Users of @value{GDBN} often wish to obtain information about the state of
the operating system running on the target---for example the list of
processes, or the list of open files.  This section describes the
mechanism that makes it possible.  This mechanism is similar to the 
target features mechanism (@pxref{Target Descriptions}), but focuses
on a different aspect of target.

Operating system information is retrived from the target via the
remote protocol, using @samp{qXfer} requests (@pxref{qXfer osdata
read}).  The object name in the request should be @samp{osdata}, and
the @var{annex} identifies the data to be fetched.

@node Process list
@appendixsection Process list
@cindex operating system information, process list

When requesting the process list, the @var{annex} field in the
@samp{qXfer} request should be @samp{processes}.  The returned data is
an XML document.  The formal syntax of this document is defined in
@file{gdb/features/osdata.dtd}.

An example document is:

@smallexample
<?xml version="1.0"?>
<!DOCTYPE target SYSTEM "osdata.dtd">
<osdata type="processes">
  <item>
    <column name="pid">1</column>
    <column name="user">root</column>
    <column name="command">/sbin/init</column>
    <column name="cores">1,2,3</column>
  </item>
</osdata>
@end smallexample

Each item should include a column whose name is @samp{pid}.  The value
of that column should identify the process on the target.  The
@samp{user} and @samp{command} columns are optional, and will be
displayed by @value{GDBN}.  The @samp{cores} column, if present,
should contain a comma-separated list of cores that this process
is running on.  Target may provide additional columns,
which @value{GDBN} currently ignores.

@node Trace File Format
@appendix Trace File Format
@cindex trace file format

The trace file comes in three parts: a header, a textual description
section, and a trace frame section with binary data.

The header has the form @code{\x7fTRACE0\n}.  The first byte is
@code{0x7f} so as to indicate that the file contains binary data,
while the @code{0} is a version number that may have different values
in the future.

The description section consists of multiple lines of @sc{ascii} text
separated by newline characters (@code{0xa}).  The lines may include a
variety of optional descriptive or context-setting information, such
as tracepoint definitions or register set size.  @value{GDBN} will
ignore any line that it does not recognize.  An empty line marks the end
of this section.

@c FIXME add some specific types of data

The trace frame section consists of a number of consecutive frames.
Each frame begins with a two-byte tracepoint number, followed by a
four-byte size giving the amount of data in the frame.  The data in
the frame consists of a number of blocks, each introduced by a
character indicating its type (at least register, memory, and trace
state variable).  The data in this section is raw binary, not a
hexadecimal or other encoding; its endianness matches the target's
endianness.

@c FIXME bi-arch may require endianness/arch info in description section

@table @code
@item R @var{bytes}
Register block.  The number and ordering of bytes matches that of a
@code{g} packet in the remote protocol.  Note that these are the
actual bytes, in target order and @value{GDBN} register order, not a
hexadecimal encoding.

@item M @var{address} @var{length} @var{bytes}...
Memory block.  This is a contiguous block of memory, at the 8-byte
address @var{address}, with a 2-byte length @var{length}, followed by
@var{length} bytes.

@item V @var{number} @var{value}
Trace state variable block.  This records the 8-byte signed value
@var{value} of trace state variable numbered @var{number}.

@end table

Future enhancements of the trace file format may include additional types
of blocks.

@node Index Section Format
@appendix @code{.gdb_index} section format
@cindex .gdb_index section format
@cindex index section format

This section documents the index section that is created by @code{save
gdb-index} (@pxref{Index Files}).  The index section is
DWARF-specific; some knowledge of DWARF is assumed in this
description.

The mapped index file format is designed to be directly
@code{mmap}able on any architecture.  In most cases, a datum is
represented using a little-endian 32-bit integer value, called an
@code{offset_type}.  Big endian machines must byte-swap the values
before using them.  Exceptions to this rule are noted.  The data is
laid out such that alignment is always respected.

A mapped index consists of several areas, laid out in order.

@enumerate
@item
The file header.  This is a sequence of values, of @code{offset_type}
unless otherwise noted:

@enumerate
@item
The version number, currently 8.  Versions 1, 2 and 3 are obsolete.
Version 4 uses a different hashing function from versions 5 and 6.
Version 6 includes symbols for inlined functions, whereas versions 4
and 5 do not.  Version 7 adds attributes to the CU indices in the
symbol table.  Version 8 specifies that symbols from DWARF type units
(@samp{DW_TAG_type_unit}) refer to the type unit's symbol table and not the
compilation unit (@samp{DW_TAG_comp_unit}) using the type.

@value{GDBN} will only read version 4, 5, or 6 indices
by specifying @code{set use-deprecated-index-sections on}.
GDB has a workaround for potentially broken version 7 indices so it is
currently not flagged as deprecated.

@item
The offset, from the start of the file, of the CU list.

@item
The offset, from the start of the file, of the types CU list.  Note
that this area can be empty, in which case this offset will be equal
to the next offset.

@item
The offset, from the start of the file, of the address area.

@item
The offset, from the start of the file, of the symbol table.

@item
The offset, from the start of the file, of the constant pool.
@end enumerate

@item
The CU list.  This is a sequence of pairs of 64-bit little-endian
values, sorted by the CU offset.  The first element in each pair is
the offset of a CU in the @code{.debug_info} section.  The second
element in each pair is the length of that CU.  References to a CU
elsewhere in the map are done using a CU index, which is just the
0-based index into this table.  Note that if there are type CUs, then
conceptually CUs and type CUs form a single list for the purposes of
CU indices.

@item
The types CU list.  This is a sequence of triplets of 64-bit
little-endian values.  In a triplet, the first value is the CU offset,
the second value is the type offset in the CU, and the third value is
the type signature.  The types CU list is not sorted.

@item
The address area.  The address area consists of a sequence of address
entries.  Each address entry has three elements:

@enumerate
@item
The low address.  This is a 64-bit little-endian value.

@item
The high address.  This is a 64-bit little-endian value.  Like
@code{DW_AT_high_pc}, the value is one byte beyond the end.

@item
The CU index.  This is an @code{offset_type} value.
@end enumerate

@item
The symbol table.  This is an open-addressed hash table.  The size of
the hash table is always a power of 2.

Each slot in the hash table consists of a pair of @code{offset_type}
values.  The first value is the offset of the symbol's name in the
constant pool.  The second value is the offset of the CU vector in the
constant pool.

If both values are 0, then this slot in the hash table is empty.  This
is ok because while 0 is a valid constant pool index, it cannot be a
valid index for both a string and a CU vector.

The hash value for a table entry is computed by applying an
iterative hash function to the symbol's name.  Starting with an
initial value of @code{r = 0}, each (unsigned) character @samp{c} in
the string is incorporated into the hash using the formula depending on the
index version:

@table @asis
@item Version 4
The formula is @code{r = r * 67 + c - 113}.

@item Versions 5 to 7
The formula is @code{r = r * 67 + tolower (c) - 113}.
@end table

The terminating @samp{\0} is not incorporated into the hash.

The step size used in the hash table is computed via
@code{((hash * 17) & (size - 1)) | 1}, where @samp{hash} is the hash
value, and @samp{size} is the size of the hash table.  The step size
is used to find the next candidate slot when handling a hash
collision.

The names of C@t{++} symbols in the hash table are canonicalized.  We
don't currently have a simple description of the canonicalization
algorithm; if you intend to create new index sections, you must read
the code.

@item
The constant pool.  This is simply a bunch of bytes.  It is organized
so that alignment is correct: CU vectors are stored first, followed by
strings.

A CU vector in the constant pool is a sequence of @code{offset_type}
values.  The first value is the number of CU indices in the vector.
Each subsequent value is the index and symbol attributes of a CU in
the CU list.  This element in the hash table is used to indicate which
CUs define the symbol and how the symbol is used.
See below for the format of each CU index+attributes entry.

A string in the constant pool is zero-terminated.
@end enumerate

Attributes were added to CU index values in @code{.gdb_index} version 7.
If a symbol has multiple uses within a CU then there is one
CU index+attributes value for each use.

The format of each CU index+attributes entry is as follows
(bit 0 = LSB):

@table @asis

@item Bits 0-23
This is the index of the CU in the CU list.
@item Bits 24-27
These bits are reserved for future purposes and must be zero.
@item Bits 28-30
The kind of the symbol in the CU.

@table @asis
@item 0
This value is reserved and should not be used.
By reserving zero the full @code{offset_type} value is backwards compatible
with previous versions of the index.
@item 1
The symbol is a type.
@item 2
The symbol is a variable or an enum value.
@item 3
The symbol is a function.
@item 4
Any other kind of symbol.
@item 5,6,7
These values are reserved.
@end table

@item Bit 31
This bit is zero if the value is global and one if it is static.

The determination of whether a symbol is global or static is complicated.
The authorative reference is the file @file{dwarf2read.c} in
@value{GDBN} sources.

@end table

This pseudo-code describes the computation of a symbol's kind and
global/static attributes in the index.

@smallexample
is_external = get_attribute (die, DW_AT_external);
language = get_attribute (cu_die, DW_AT_language);
switch (die->tag)
  @{
  case DW_TAG_typedef:
  case DW_TAG_base_type:
  case DW_TAG_subrange_type:
    kind = TYPE;
    is_static = 1;
    break;
  case DW_TAG_enumerator:
    kind = VARIABLE;
    is_static = (language != CPLUS && language != JAVA);
    break;
  case DW_TAG_subprogram:
    kind = FUNCTION;
    is_static = ! (is_external || language == ADA);
    break;
  case DW_TAG_constant:
    kind = VARIABLE;
    is_static = ! is_external;
    break;
  case DW_TAG_variable:
    kind = VARIABLE;
    is_static = ! is_external;
    break;
  case DW_TAG_namespace:
    kind = TYPE;
    is_static = 0;
    break;
  case DW_TAG_class_type:
  case DW_TAG_interface_type:
  case DW_TAG_structure_type:
  case DW_TAG_union_type:
  case DW_TAG_enumeration_type:
    kind = TYPE;
    is_static = (language != CPLUS && language != JAVA);
    break;
  default:
    assert (0);
  @}
@end smallexample

@node Man Pages
@appendix Manual pages
@cindex Man pages

@menu
* gdb man::                     The GNU Debugger man page
* gdbserver man::               Remote Server for the GNU Debugger man page
* gcore man::                   Generate a core file of a running program
* gdbinit man::                 gdbinit scripts
@end menu

@node gdb man
@heading gdb man

@c man title gdb The GNU Debugger

@c man begin SYNOPSIS gdb
gdb [@option{-help}] [@option{-nh}] [@option{-nx}] [@option{-q}]
[@option{-batch}] [@option{-cd=}@var{dir}] [@option{-f}]
[@option{-b}@w{ }@var{bps}]
    [@option{-tty=}@var{dev}] [@option{-s} @var{symfile}]
[@option{-e}@w{ }@var{prog}] [@option{-se}@w{ }@var{prog}]
[@option{-c}@w{ }@var{core}] [@option{-p}@w{ }@var{procID}]
    [@option{-x}@w{ }@var{cmds}] [@option{-d}@w{ }@var{dir}]
[@var{prog}|@var{prog} @var{procID}|@var{prog} @var{core}]
@c man end

@c man begin DESCRIPTION gdb
The purpose of a debugger such as @value{GDBN} 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.

@value{GDBN} can do four main kinds of things (plus other things in support of
these) to help you catch bugs in the act:

@itemize @bullet
@item
Start your program, specifying anything that might affect its behavior.

@item
Make your program stop on specified conditions.

@item
Examine what has happened, when your program has stopped.

@item
Change things in your program, so you can experiment with correcting the
effects of one bug and go on to learn about another.
@end itemize

You can use @value{GDBN} to debug programs written in C, C@t{++}, Fortran and
Modula-2.

@value{GDBN} is invoked with the shell command @code{gdb}.  Once started, it reads
commands from the terminal until you tell it to exit with the @value{GDBN}
command @code{quit}.  You can get online help from @value{GDBN} itself
by using the command @code{help}.

You can run @code{gdb} with no arguments or options; but the most
usual way to start @value{GDBN} is with one argument or two, specifying an
executable program as the argument:

@smallexample
gdb program
@end smallexample

You can also start with both an executable program and a core file specified:

@smallexample
gdb program core
@end smallexample

You can, instead, specify a process ID as a second argument, if you want
to debug a running process:

@smallexample
gdb program 1234
gdb -p 1234
@end smallexample

@noindent
would attach @value{GDBN} to process @code{1234} (unless you also have a file
named @file{1234}; @value{GDBN} does check for a core file first).
With option @option{-p} you can omit the @var{program} filename.

Here are some of the most frequently needed @value{GDBN} commands:

@c pod2man highlights the right hand side of the @item lines.
@table @env
@item break [@var{file}:]@var{functiop}
Set a breakpoint at @var{function} (in @var{file}).

@item run [@var{arglist}]
Start your program (with @var{arglist}, if specified).

@item bt
Backtrace: display the program stack.

@item print @var{expr}
Display the value of an expression.

@item c
Continue running your program (after stopping, e.g. at a breakpoint).

@item next
Execute next program line (after stopping); step @emph{over} any
function calls in the line.

@item edit [@var{file}:]@var{function}
look at the program line where it is presently stopped.

@item list [@var{file}:]@var{function}
type the text of the program in the vicinity of where it is presently stopped.

@item step
Execute next program line (after stopping); step @emph{into} any
function calls in the line.

@item help [@var{name}]
Show information about @value{GDBN} command @var{name}, or general information
about using @value{GDBN}.

@item quit
Exit from @value{GDBN}.
@end table

@ifset man
For full details on @value{GDBN},
see @cite{Using GDB: A Guide to the GNU Source-Level Debugger},
by Richard M. Stallman and Roland H. Pesch.  The same text is available online
as the @code{gdb} entry in the @code{info} program.
@end ifset
@c man end

@c man begin OPTIONS gdb
Any arguments other than options specify an executable
file and core file (or process ID); that is, the first argument
encountered with no
associated option flag is equivalent to a @option{-se} option, and the second,
if any, is equivalent to a @option{-c} option if it's the name of a file.
Many options have
both long and short forms; both are shown here.  The long forms are also
recognized if you truncate them, so long as enough of the option is
present to be unambiguous.  (If you prefer, you can flag option
arguments with @option{+} rather than @option{-}, though we illustrate the
more usual convention.)

All the options and command line arguments you give are processed
in sequential order.  The order makes a difference when the @option{-x}
option is used.

@table @env
@item -help
@itemx -h
List all options, with brief explanations.

@item -symbols=@var{file}
@itemx -s @var{file}
Read symbol table from file @var{file}.

@item -write
Enable writing into executable and core files.

@item -exec=@var{file}
@itemx -e @var{file}
Use file @var{file} as the executable file to execute when
appropriate, and for examining pure data in conjunction with a core
dump.

@item -se=@var{file}
Read symbol table from file @var{file} and use it as the executable
file.

@item -core=@var{file}
@itemx -c @var{file}
Use file @var{file} as a core dump to examine.

@item -command=@var{file}
@itemx -x @var{file}
Execute @value{GDBN} commands from file @var{file}.

@item -ex @var{command}
Execute given @value{GDBN} @var{command}.

@item -directory=@var{directory}
@itemx -d @var{directory}
Add @var{directory} to the path to search for source files.

@item -nh
Do not execute commands from @file{~/.gdbinit}.

@item -nx
@itemx -n
Do not execute commands from any @file{.gdbinit} initialization files.

@item -quiet
@itemx -q
``Quiet''.  Do not print the introductory and copyright messages.  These
messages are also suppressed in batch mode.

@item -batch
Run in batch mode.  Exit with status @code{0} after processing all the command
files specified with @option{-x} (and @file{.gdbinit}, if not inhibited).
Exit with nonzero status if an error occurs in executing the @value{GDBN}
commands in the command files.

Batch mode may be useful for running @value{GDBN} as a filter, for example to
download and run a program on another computer; in order to make this
more useful, the message

@smallexample
Program exited normally.
@end smallexample

@noindent
(which is ordinarily issued whenever a program running under @value{GDBN} control
terminates) is not issued when running in batch mode.

@item -cd=@var{directory}
Run @value{GDBN} using @var{directory} as its working directory,
instead of the current directory.

@item -fullname
@itemx -f
Emacs sets this option when it runs @value{GDBN} as a subprocess.  It tells
@value{GDBN} 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 the program stops).  This recognizable format looks
like two @samp{\032} characters, followed by the file name, line number
and character position separated by colons, and a newline.  The
Emacs-to-@value{GDBN} interface program uses the two @samp{\032}
characters as a signal to display the source code for the frame.

@item -b @var{bps}
Set the line speed (baud rate or bits per second) of any serial
interface used by @value{GDBN} for remote debugging.

@item -tty=@var{device}
Run using @var{device} for your program's standard input and output.
@end table
@c man end

@c man begin SEEALSO gdb
@ifset man
The full documentation for @value{GDBN} is maintained as a Texinfo manual.
If the @code{info} and @code{gdb} programs and @value{GDBN}'s Texinfo
documentation are properly installed at your site, the command

@smallexample
info gdb
@end smallexample

@noindent
should give you access to the complete manual.

@cite{Using GDB: A Guide to the GNU Source-Level Debugger},
Richard M. Stallman and Roland H. Pesch, July 1991.
@end ifset
@c man end

@node gdbserver man
@heading gdbserver man

@c man title gdbserver Remote Server for the GNU Debugger
@format
@c man begin SYNOPSIS gdbserver
gdbserver @var{comm} @var{prog} [@var{args}@dots{}]

gdbserver --attach @var{comm} @var{pid}

gdbserver --multi @var{comm}
@c man end
@end format

@c man begin DESCRIPTION gdbserver
@command{gdbserver} is a program that allows you to run @value{GDBN} on a different machine
than the one which is running the program being debugged.

@ifclear man
@subheading Usage (server (target) side)
@end ifclear
@ifset man
Usage (server (target) side):
@end ifset

First, you need to have a copy of the program you want to debug put onto
the target system.  The program can be stripped to save space if needed, as
@command{gdbserver} doesn't care about symbols.  All symbol handling is taken care of by
the @value{GDBN} running on the host system.

To use the server, you log on to the target system, and run the @command{gdbserver}
program.  You must tell it (a) how to communicate with @value{GDBN}, (b) the name of
your program, and (c) its arguments.  The general syntax is:

@smallexample
target> gdbserver @var{comm} @var{program} [@var{args} ...]
@end smallexample

For example, using a serial port, you might say:

@smallexample
@ifset man
@c @file would wrap it as F</dev/com1>.
target> gdbserver /dev/com1 emacs foo.txt
@end ifset
@ifclear man
target> gdbserver @file{/dev/com1} emacs foo.txt
@end ifclear
@end smallexample

This tells @command{gdbserver} to debug emacs with an argument of foo.txt, and
to communicate with @value{GDBN} via @file{/dev/com1}.  @command{gdbserver} now
waits patiently for the host @value{GDBN} to communicate with it.

To use a TCP connection, you could say:

@smallexample
target> gdbserver host:2345 emacs foo.txt
@end smallexample

This says pretty much the same thing as the last example, except that we are
going to communicate with the @code{host} @value{GDBN} via TCP.  The @code{host:2345} argument means
that we are expecting to see a TCP connection from @code{host} to local TCP port
2345.  (Currently, the @code{host} part is ignored.)  You can choose any number you
want for the port number as long as it does not conflict with any existing TCP
ports on the target system.  This same port number must be used in the host
@value{GDBN}s @code{target remote} command, which will be described shortly.  Note that if
you chose a port number that conflicts with another service, @command{gdbserver} will
print an error message and exit.

@command{gdbserver} can also attach to running programs.
This is accomplished via the @option{--attach} argument.  The syntax is:

@smallexample
target> gdbserver --attach @var{comm} @var{pid}
@end smallexample

@var{pid} is the process ID of a currently running process.  It isn't
necessary to point @command{gdbserver} at a binary for the running process.

To start @code{gdbserver} without supplying an initial command to run
or process ID to attach, use the @option{--multi} command line option.
In such case you should connect using @kbd{target extended-remote} to start
the program you want to debug.

@smallexample
target> gdbserver --multi @var{comm}
@end smallexample

@ifclear man
@subheading Usage (host side)
@end ifclear
@ifset man
Usage (host side):
@end ifset

You need an unstripped copy of the target program on your host system, since
@value{GDBN} needs to examine it's symbol tables and such.  Start up @value{GDBN} as you normally
would, with the target program as the first argument.  (You may need to use the
@option{--baud} option if the serial line is running at anything except 9600 baud.)
That is @code{gdb TARGET-PROG}, or @code{gdb --baud BAUD TARGET-PROG}.  After that, the only
new command you need to know about is @code{target remote}
(or @code{target extended-remote}).  Its argument is either
a device name (usually a serial device, like @file{/dev/ttyb}), or a @code{HOST:PORT}
descriptor.  For example:

@smallexample
@ifset man
@c @file would wrap it as F</dev/ttyb>.
(gdb) target remote /dev/ttyb
@end ifset
@ifclear man
(gdb) target remote @file{/dev/ttyb}
@end ifclear
@end smallexample

@noindent
communicates with the server via serial line @file{/dev/ttyb}, and:

@smallexample
(gdb) target remote the-target:2345
@end smallexample

@noindent
communicates via a TCP connection to port 2345 on host `the-target', where
you previously started up @command{gdbserver} with the same port number.  Note that for
TCP connections, you must start up @command{gdbserver} prior to using the `target remote'
command, otherwise you may get an error that looks something like
`Connection refused'.

@command{gdbserver} can also debug multiple inferiors at once,
described in
@ifset man
the @value{GDBN} manual in node @code{Inferiors and Programs}
-- shell command @code{info -f gdb -n 'Inferiors and Programs'}.
@end ifset
@ifclear man
@ref{Inferiors and Programs}.
@end ifclear
In such case use the @code{extended-remote} @value{GDBN} command variant:

@smallexample
(gdb) target extended-remote the-target:2345
@end smallexample

The @command{gdbserver} option @option{--multi} may or may not be used in such
case.
@c man end

@c man begin OPTIONS gdbserver
There are three different modes for invoking @command{gdbserver}:

@itemize @bullet

@item
Debug a specific program specified by its program name:

@smallexample
gdbserver @var{comm} @var{prog} [@var{args}@dots{}]
@end smallexample

The @var{comm} parameter specifies how should the server communicate
with @value{GDBN}; it is either a device name (to use a serial line),
a TCP port number (@code{:1234}), or @code{-} or @code{stdio} to use
stdin/stdout of @code{gdbserver}.  Specify the name of the program to
debug in @var{prog}.  Any remaining arguments will be passed to the
program verbatim.  When the program exits, @value{GDBN} will close the
connection, and @code{gdbserver} will exit.

@item
Debug a specific program by specifying the process ID of a running
program:

@smallexample
gdbserver --attach @var{comm} @var{pid}
@end smallexample

The @var{comm} parameter is as described above.  Supply the process ID
of a running program in @var{pid}; @value{GDBN} will do everything
else.  Like with the previous mode, when the process @var{pid} exits,
@value{GDBN} will close the connection, and @code{gdbserver} will exit.

@item
Multi-process mode -- debug more than one program/process:

@smallexample
gdbserver --multi @var{comm}
@end smallexample

In this mode, @value{GDBN} can instruct @command{gdbserver} which
command(s) to run.  Unlike the other 2 modes, @value{GDBN} will not
close the connection when a process being debugged exits, so you can
debug several processes in the same session.
@end itemize

In each of the modes you may specify these options:

@table @env

@item --help
List all options, with brief explanations.

@item --version
This option causes @command{gdbserver} to print its version number and exit.

@item --attach
@command{gdbserver} will attach to a running program.  The syntax is:

@smallexample
target> gdbserver --attach @var{comm} @var{pid}
@end smallexample

@var{pid} is the process ID of a currently running process.  It isn't
necessary to point @command{gdbserver} at a binary for the running process.

@item --multi
To start @code{gdbserver} without supplying an initial command to run
or process ID to attach, use this command line option.
Then you can connect using @kbd{target extended-remote} and start
the program you want to debug.  The syntax is:

@smallexample
target> gdbserver --multi @var{comm}
@end smallexample

@item --debug
Instruct @code{gdbserver} to display extra status information about the debugging
process.
This option is intended for @code{gdbserver} development and for bug reports to
the developers.

@item --remote-debug
Instruct @code{gdbserver} to display remote protocol debug output.
This option is intended for @code{gdbserver} development and for bug reports to
the developers.

@item --debug-format=option1@r{[},option2,...@r{]}
Instruct @code{gdbserver} to include extra information in each line
of debugging output.
@xref{Other Command-Line Arguments for gdbserver}.

@item --wrapper
Specify a wrapper to launch programs
for debugging.  The option should be followed by the name of the
wrapper, then any command-line arguments to pass to the wrapper, then
@kbd{--} indicating the end of the wrapper arguments.

@item --once
By default, @command{gdbserver} keeps the listening TCP port open, so that
additional connections are possible.  However, if you start @code{gdbserver}
with the @option{--once} option, it will stop listening for any further
connection attempts after connecting to the first @value{GDBN} session.

@c --disable-packet is not documented for users.

@c --disable-randomization and --no-disable-randomization are superseded by
@c QDisableRandomization.

@end table
@c man end

@c man begin SEEALSO gdbserver
@ifset man
The full documentation for @value{GDBN} is maintained as a Texinfo manual.
If the @code{info} and @code{gdb} programs and @value{GDBN}'s Texinfo
documentation are properly installed at your site, the command

@smallexample
info gdb
@end smallexample

should give you access to the complete manual.

@cite{Using GDB: A Guide to the GNU Source-Level Debugger},
Richard M. Stallman and Roland H. Pesch, July 1991.
@end ifset
@c man end

@node gcore man
@heading gcore

@c man title gcore Generate a core file of a running program

@format
@c man begin SYNOPSIS gcore
gcore [-o @var{filename}] @var{pid}
@c man end
@end format

@c man begin DESCRIPTION gcore
Generate a core dump of a running program with process ID @var{pid}.
Produced file is equivalent to a kernel produced core file as if the process
crashed (and if @kbd{ulimit -c} were used to set up an appropriate core dump
limit).  Unlike after a crash, after @command{gcore} the program remains
running without any change.
@c man end

@c man begin OPTIONS gcore
@table @env
@item -o @var{filename}
The optional argument
@var{filename} specifies the file name where to put the core dump.
If not specified, the file name defaults to @file{core.@var{pid}},
where @var{pid} is the running program process ID.
@end table
@c man end

@c man begin SEEALSO gcore
@ifset man
The full documentation for @value{GDBN} is maintained as a Texinfo manual.
If the @code{info} and @code{gdb} programs and @value{GDBN}'s Texinfo
documentation are properly installed at your site, the command

@smallexample
info gdb
@end smallexample

@noindent
should give you access to the complete manual.

@cite{Using GDB: A Guide to the GNU Source-Level Debugger},
Richard M. Stallman and Roland H. Pesch, July 1991.
@end ifset
@c man end

@node gdbinit man
@heading gdbinit

@c man title gdbinit GDB initialization scripts

@format
@c man begin SYNOPSIS gdbinit
@ifset SYSTEM_GDBINIT
@value{SYSTEM_GDBINIT}
@end ifset

~/.gdbinit

./.gdbinit
@c man end
@end format

@c man begin DESCRIPTION gdbinit
These files contain @value{GDBN} commands to automatically execute during
@value{GDBN} startup.  The lines of contents are canned sequences of commands,
described in
@ifset man
the @value{GDBN} manual in node @code{Sequences}
-- shell command @code{info -f gdb -n Sequences}.
@end ifset
@ifclear man
@ref{Sequences}.
@end ifclear

Please read more in
@ifset man
the @value{GDBN} manual in node @code{Startup}
-- shell command @code{info -f gdb -n Startup}.
@end ifset
@ifclear man
@ref{Startup}.
@end ifclear

@table @env
@ifset SYSTEM_GDBINIT
@item @value{SYSTEM_GDBINIT}
@end ifset
@ifclear SYSTEM_GDBINIT
@item (not enabled with @code{--with-system-gdbinit} during compilation)
@end ifclear
System-wide initialization file.  It is executed unless user specified
@value{GDBN} option @code{-nx} or @code{-n}.
See more in
@ifset man
the @value{GDBN} manual in node @code{System-wide configuration}
-- shell command @code{info -f gdb -n 'System-wide configuration'}.
@end ifset
@ifclear man
@ref{System-wide configuration}.
@end ifclear

@item ~/.gdbinit
User initialization file.  It is executed unless user specified
@value{GDBN} options @code{-nx}, @code{-n} or @code{-nh}.

@item ./.gdbinit
Initialization file for current directory.  It may need to be enabled with
@value{GDBN} security command @code{set auto-load local-gdbinit}.
See more in
@ifset man
the @value{GDBN} manual in node @code{Init File in the Current Directory}
-- shell command @code{info -f gdb -n 'Init File in the Current Directory'}.
@end ifset
@ifclear man
@ref{Init File in the Current Directory}.
@end ifclear
@end table
@c man end

@c man begin SEEALSO gdbinit
@ifset man
gdb(1), @code{info -f gdb -n Startup}

The full documentation for @value{GDBN} is maintained as a Texinfo manual.
If the @code{info} and @code{gdb} programs and @value{GDBN}'s Texinfo
documentation are properly installed at your site, the command

@smallexample
info gdb
@end smallexample

should give you access to the complete manual.

@cite{Using GDB: A Guide to the GNU Source-Level Debugger},
Richard M. Stallman and Roland H. Pesch, July 1991.
@end ifset
@c man end

@include gpl.texi

@node GNU Free Documentation License
@appendix GNU Free Documentation License
@include fdl.texi

@node Concept Index
@unnumbered Concept Index

@printindex cp

@node Command and Variable Index
@unnumbered Command, Variable, and Function Index

@printindex fn

@tex
% I think something like @@colophon should be in texinfo.  In the
% meantime:
\long\def\colophon{\hbox to0pt{}\vfill
\centerline{The body of this manual is set in}
\centerline{\fontname\tenrm,}
\centerline{with headings in {\bf\fontname\tenbf}}
\centerline{and examples in {\tt\fontname\tentt}.}
\centerline{{\it\fontname\tenit\/},}
\centerline{{\bf\fontname\tenbf}, and}
\centerline{{\sl\fontname\tensl\/}}
\centerline{are used for emphasis.}\vfill}
\page\colophon
% Blame: doc@@cygnus.com, 1991.
@end tex

@bye
