\input texinfo      @c -*-texinfo-*-
@c Copyright (C) 1988-1996, 1998-2012 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
@include gdb-cfg.texi
@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
@syncodeindex fn 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.
@end direntry

@copying
Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
2011, 2012
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.''
@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-2012 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
* 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}:

@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 files.  Normally,
@value{GDBN} executes the commands in these files after all the command
options and arguments have been processed.  @xref{Command Files,,Command
Files}.

@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}
@cindex @code{--data-directory}
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 -epoch
@cindex @code{--epoch}
The Epoch Emacs-@value{GDBN} interface sets this option when it runs
@value{GDBN} as a subprocess.  It tells @value{GDBN} to modify its print
routines so as to allow Epoch to display values of expressions in a
separate window.

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

@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
ports of @value{GDBN} use the standard name, but if they find a
@file{gdb.ini} file, they warn you about that and suggest 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{?}.

@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 three 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.

@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 (except on VxWorks) 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.
@xref{Arguments, ,Your Program's Arguments}.

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

@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 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 only, not for @value{GDBN} itself.  @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.)

@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---such as @file{.cshrc} for C-shell, or
@file{.bashrc} 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 @var{directory}
Set the @value{GDBN} working directory to @var{directory}.

@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.  @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}]}.  @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] @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, type @kbd{thread apply all @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.  @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.  @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.  @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.

@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 removed.

@cindex non-stop mode, and @code{breakpoint always-inserted}
@item set breakpoint always-inserted auto
This is the default mode.  If @value{GDBN} is controlling the inferior
in non-stop mode (@pxref{Non-Stop Mode}), gdb behaves as if
@code{breakpoint always-inserted} mode is on.  If @value{GDBN} is
controlling the inferior in all-stop mode, @value{GDBN} behaves as if
@code{breakpoint always-inserted} mode is off.
@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.  @var{event} can be any of the following:
@table @code
@item throw
@cindex stop on C@t{++} exceptions
The throwing of a C@t{++} exception.

@item catch
The catching of a C@t{++} exception.

@item 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
An exception that was raised but is not handled by the program.

@item assert
A failed Ada assertion.

@item 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{} 
@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
A call to @code{fork}.  This is currently only available for HP-UX
and @sc{gnu}/Linux.

@item 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{]}
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.

@end table

@item tcatch @var{event}
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.

There are currently some limitations to C@t{++} exception handling
(@code{catch throw} and @code{catch catch}) in @value{GDBN}:

@itemize @bullet
@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.

@item
You cannot raise an exception interactively.

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

@cindex raise exceptions
Sometimes @code{catch} is not the best way to debug exception handling:
if you need to know exactly where an exception is raised, it is better to
stop @emph{before} the exception handler is called, since that way you
can see the stack before any unwinding takes place.  If you set a
breakpoint in an exception handler instead, it may not be easy to find
out where the exception was raised.

To stop just before an exception handler is called, you need some
knowledge of the implementation.  In the case of @sc{gnu} C@t{++}, exceptions are
raised by calling a library function named @code{__raise_exception}
which has the following ANSI C interface:

@smallexample
    /* @var{addr} is where the exception identifier is stored.
       @var{id} is the exception identifier.  */
    void __raise_exception (void **addr, void *id);
@end smallexample

@noindent
To make the debugger catch all exceptions before any stack
unwinding takes place, set a breakpoint on @code{__raise_exception}
(@pxref{Breakpoints, ,Breakpoints; Watchpoints; and Exceptions}).

With a conditional breakpoint (@pxref{Conditions, ,Break Conditions})
that depends on the value of @var{id}, you can stop your program when
a specific exception is raised.  You can use multiple conditional
breakpoints to stop your program when any of a number of exceptions are
raised.


@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.  @xref{Signals, ,Signals}.)

@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 location is
reached, or the current stack frame returns.  @var{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

@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}.

@kindex handle
@item handle @var{signal} @r{[}@var{keywords}@dots{}@r{]}
Change the way @value{GDBN} handles signal @var{signal}.  @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 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
# Enable the async interface.  
set target-async 1

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

You need to explicitly enable asynchronous mode before you can use
background execution commands.  You can use these commands to
manipulate the asynchronous mode setting:

@table @code
@kindex set target-async
@item set target-async on
Enable asynchronous mode.
@item set target-async off
Disable asynchronous mode.
@kindex show target-async
@item show target-async
Show the current target-async setting.
@end table

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.  @var{threadno} 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

@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 record
@kindex rec
@item target record
This command starts the process record and replay target.  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{target record} command.

Both @code{record} and @code{rec} are aliases of @code{target record}.

@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}), the
process record and replay target cannot be started because it doesn't
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 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.

@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 insn-number-max
@item set record insn-number-max @var{limit}
Set the limit of instructions to be recorded.  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 zero, @value{GDBN} will never delete recorded
instructions from the execution log.  The number of recorded
instructions is unlimited in this case.

@kindex show record insn-number-max
@item show record insn-number-max
Show the limit of instructions to be recorded.

@kindex set record stop-at-limit
@item set record stop-at-limit
Control the behavior 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.

@kindex show record stop-at-limit
@item show record stop-at-limit
Show the current setting of @code{stop-at-limit}.

@kindex set record memory-query
@item set record memory-query
Control the behavior when @value{GDBN} is unable to record memory
changes caused by an instruction.  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.

@kindex show record memory-query
@item show record memory-query
Show the current setting of @code{memory-query}.

@kindex info record
@item info record
Show various statistics about 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

@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''.
@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
* 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 @var{args}
The @code{frame} command allows you to move from one stack frame to another,
and to print the stack frame you select.  @var{args} 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.

@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.  @var{n} specifies the
number of frames to print, as described above.
@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
@cindex backtrace limit
Limit the backtrace to @var{n} levels.  A value of zero means
unlimited.

@item show backtrace limit
Display the current limit on backtrace levels.
@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.  For positive numbers @var{n}, this
advances toward the outermost frame, to higher frame numbers, to frames
that have existed longer.  @var{n} defaults to one.

@kindex down
@kindex do @r{(@code{down})}
@item down @var{n}
Move @var{n} frames down the stack.  For positive numbers @var{n}, this
advances toward the innermost frame, to lower frame numbers, to frames
that were created more recently.  @var{n} defaults to one.  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}
Make the @code{list} command display @var{count} source lines (unless
the @code{list} argument explicitly specifies some other number).

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

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
@c "inspect" is not quite a synonym if you are using Epoch, which we do not
@c document because it is nonstandard...  Under Epoch it displays in a
@c different window or something like that.
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
* 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 Remote Data::         Data caching for remote 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.  @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{++}.  @value{GDBN} also supports use of the C@t{++}
scope resolution operator in @value{GDBN} expressions.
@c FIXME: Um, so what happens in one of those rare cases where it's in
@c conflict??  --mew

@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 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 verify remote 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.  The @code{compare-sections} command is provided for such
situations.

@table @code
@kindex compare-sections
@item compare-sections @r{[}@var{section-name}@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 remote machine's memory, and report any mismatches.  With no
arguments, compares all loadable sections.  This command's
availability depends on the target's support for the @code{"qCRC"}
remote request.
@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}
@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 0, which tells @value{GDBN}
to always print the symbolic form of an address if any symbol precedes it.

@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}
@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 zero means that the printing 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.

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

@item gnu
Decode based on the @sc{gnu} C@t{++} compiler (@code{g++}) encoding algorithm.
This is the default.

@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
@item show convenience
Print a list of convenience variables used so far, and their values.
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}
The variable @code{$_exitcode} is automatically set to the exit code when
the program being debugged terminates.

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

@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}.

@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.  @var{regname} may be any register name valid on
the machine you are using, with or without the initial @samp{$}.
@end table

@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}).

However, @value{GDBN} must deduce where registers are saved, from the machine
code generated by your compiler.  If some registers are not saved, or if
@value{GDBN} is unable to locate the saved registers, the selected stack
frame makes no difference.

@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 @code{ptrace} system call
@cindex @code{struct user} contents
When @value{GDBN} runs on a @dfn{Posix system} (such as GNU or Unix
machines), it interfaces with the inferior via the @code{ptrace}
system call.  The operating system creates a special sata structure,
called @code{struct user}, for this interface.  You can use the
command @code{info udot} to display the contents of this data
structure.

@table @code
@item info udot
@kindex info udot
Display the contents of the @code{struct user} maintained by the OS
kernel for the program being debugged.  @value{GDBN} displays the
contents of @code{struct user} as a list of hex numbers, similar to
the @code{examine} command.
@end table

@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, Unixware, 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 Remote Data
@section Caching Data of Remote Targets
@cindex caching data of remote targets

@value{GDBN} caches data exchanged between the debugger and a
remote target (@pxref{Remote Debugging}).  Such caching generally improves
performance, 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.}.
Other regions of memory can be explicitly marked as
cacheable; see @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 info dcache
@item info dcache @r{[}line@r{]}
Print the information about the data cache performance.  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.  See also @ref{Caching Remote Data, info dcache}.

@item show dcache line-size
@kindex show dcache line-size
Show default size of dcache lines.  See also @ref{Caching Remote Data, info dcache}.

@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}.  @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
@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 
(@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-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}
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.)

@kindex target tfile
@kindex tfile
@item target tfile @var{filename}
Use the file named @var{filename} 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.  @var{filename} must be
on a filesystem accessible to the host.

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

@quotation
@emph{Warning:} In this release, the @value{GDBN} commands for type and range
checking are included, but they do not yet have any effect.  This
section documents the intended facilities.
@end quotation
@c FIXME remove warning when type/range code added

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.

@value{GDBN} can check for conditions like the above if you wish.
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.  As with the
working language, @value{GDBN} can also decide whether or not to check
automatically based on your program's source language.
@xref{Supported Languages, ,Supported Languages}, for the default
settings of supported languages.

@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 Modula-2, 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
1 + 2 @result{} 3
@exdent but
@error{} 1 + 2.3
@end smallexample

The second example fails because the @code{CARDINAL} 1 is not
type-compatible with the @code{REAL} 2.3.

For the expressions you use in @value{GDBN} commands, you can tell the
@value{GDBN} type checker to skip checking;
to treat any mismatches as errors and abandon the expression;
or to only issue warnings when type mismatches occur,
but evaluate the expression anyway.  When you choose the last of
these, @value{GDBN} evaluates expressions like the second example above, but
also issues a warning.

Even if you turn type checking 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, such as
the one described above, which make little sense to evaluate anyway.

Each language defines to what degree it is strict about type.  For
instance, both Modula-2 and C require the arguments to arithmetical
operators to be numbers.  In C, enumerated types and pointers can be
represented as numbers, so that they are valid arguments to mathematical
operators.  @xref{Supported Languages, ,Supported Languages}, for further
details on specific languages.

@value{GDBN} provides some additional commands for controlling the type checker:

@kindex set check type
@kindex show check type
@table @code
@item set check type auto
Set type 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 type on
@itemx set check type off
Set type checking on or off, overriding the default setting for the
current working language.  Issue a warning if the setting does not
match the language default.  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 set check type warn
Cause the type checker to issue warnings, but to always attempt to
evaluate the expression.  Evaluating the expression may still
be impossible for other reasons.  For example, @value{GDBN} cannot add
numbers and structures.

@item show type
Show the current setting of the type checker, and whether or not @value{GDBN}
is setting it automatically.
@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.
@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}.  @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 type and range checking automatically, they
both default 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.

@c Type checking is (a) primarily motivated by Modula-2, and (b)
@c unimplemented.  If (b) changes, it might make sense to let this node
@c appear even if Mod-2 does not, but meanwhile ignore it. roland 16jul93.

@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, type checking
is not used.  However, if you turn type checking on, @value{GDBN}
considers two variables type equivalent if:

@itemize @bullet
@item
The two variables are structured and have the same structure, union, or
enumerated tag.

@item
The two variables have the same type name, or types that have been
declared equivalent through @code{typedef}.

@ignore
@c leaving this out because neither J Gilmore nor R Pesch understand it.
@c FIXME--beers?
@item
The two @code{struct}, @code{union}, or @code{enum} variables are
declared in the same declaration.  (Note: this may not be true for all C
compilers.)
@end ignore
@end itemize

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 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{++} 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.  @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).  @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.  @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.  @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 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 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}).
@var{linespec} 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.  @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 Tru64, however, task switching will work
as usual.

On certain platforms, including Tru64, 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

@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 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 whatis
@item whatis [@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}}.

@kindex ptype
@item ptype [@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 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
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 maint print symbols
@cindex symbol dump
@kindex maint print psymbols
@cindex partial 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
@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
@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
@item jump @var{linespec}
@itemx jump @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 stopped, but immediately give it the
signal @var{signal}.  @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 ordinary see the signal when resumed with the
@code{continue} command; @samp{signal 0} causes it to resume without a
signal.

@code{signal} does not repeat when you press @key{RET} a second time
after executing the command.
@end table
@c @end group

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.


@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.
@var{expr} 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 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
* 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.  @var{address} should be 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 keeps adding to the old.  To discard all old symbol data
instead, use the @code{symbol-file} command without any arguments.

@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 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 add-shared-symbol-files
@kindex assf
@item add-shared-symbol-files @var{library-file}
@itemx assf @var{library-file}
The @code{add-shared-symbol-files} command can currently be used only
in the Cygwin build of @value{GDBN} on MS-Windows OS, where it is an
alias for the @code{dll-symbols} command (@pxref{Cygwin Native}).
@value{GDBN} automatically looks for shared libraries, however if
@value{GDBN} does not find yours, you can invoke
@code{add-shared-symbol-files}.  It takes one argument: the shared
library's file name.  @code{assf} is a shorthand alias for
@code{add-shared-symbol-files}.

@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{Remote Protocol,
, @value{GDBN} Remote Serial Protocol}).  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 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 BDF 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}.

@end table

Some configurations may include these targets as well:

@table @code

@item target nrom @var{dev}
@cindex NetROM ROM emulator target
NetROM ROM emulator.  This target only supports downloading.

@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
@w{@samp{--baud}} option, or use the @code{set remotebaud} command
(@pxref{Remote Configuration, set remotebaud}) 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
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.  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.

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

@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{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}).
@var{exception_number} is the exception number 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
* Neutrino::                    Features specific to QNX Neutrino
* 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.  @code{info
proc} works only on SVR4 systems that include the @code{procfs} code.
This includes, as of this writing, @sc{gnu}/Linux, OSF/1 (Digital
Unix), Solaris, Irix, and Unixware, but not HP-UX, for example.

@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 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 dll-symbols
@item dll-symbols
This command loads symbols from a dll similarly to
add-sym command but without the need to specify a base address.

@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.  It is also possible to force
@value{GDBN} to load a particular DLL before starting the executable ---
see the shared library information in @ref{Files}, or the
@code{dll-symbols} command in @ref{Cygwin Native}.  Currently,
explicitly loading symbols from a DLL with no debugging information will
cause the symbol names to be duplicated in @value{GDBN}'s lookup table,
which may adversely affect symbol lookup performance.

@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 Neutrino
@subsection QNX Neutrino
@cindex QNX Neutrino

@value{GDBN} provides the following commands specific to the QNX
Neutrino target:

@table @code
@item set debug nto-debug
@kindex set debug nto-debug
When set to on, enables debugging messages specific to the QNX
Neutrino support.

@item show debug nto-debug
@kindex show debug nto-debug
Show the current state of QNX Neutrino messages.
@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.

@menu
* VxWorks::                     Using @value{GDBN} with VxWorks
@end menu

@value{GDBN} includes the ability to debug programs running on
various real-time operating systems.

@node VxWorks
@subsection Using @value{GDBN} with VxWorks

@cindex VxWorks

@table @code

@kindex target vxworks
@item target vxworks @var{machinename}
A VxWorks system, attached via TCP/IP.  The argument @var{machinename}
is the target system's machine name or IP address.

@end table

On VxWorks, @code{load} links @var{filename} dynamically on the
current target system as well as adding its symbols in @value{GDBN}.

@value{GDBN} enables developers to spawn and debug tasks running on networked
VxWorks targets from a Unix host.  Already-running tasks spawned from
the VxWorks shell can also be debugged.  @value{GDBN} uses code that runs on
both the Unix host and on the VxWorks target.  The program
@code{@value{GDBP}} is installed and executed on the Unix host.  (It may be
installed with the name @code{vxgdb}, to distinguish it from a
@value{GDBN} for debugging programs on the host itself.)

@table @code
@item VxWorks-timeout @var{args}
@kindex vxworks-timeout
All VxWorks-based targets now support the option @code{vxworks-timeout}.
This option is set by the user, and  @var{args} represents the number of
seconds @value{GDBN} waits for responses to rpc's.  You might use this if
your VxWorks target is a slow software simulator or is on the far side
of a thin network line.
@end table

The following information on connecting to VxWorks was current when
this manual was produced; newer releases of VxWorks may use revised
procedures.

@findex INCLUDE_RDB
To use @value{GDBN} with VxWorks, you must rebuild your VxWorks kernel
to include the remote debugging interface routines in the VxWorks
library @file{rdb.a}.  To do this, define @code{INCLUDE_RDB} in the
VxWorks configuration file @file{configAll.h} and rebuild your VxWorks
kernel.  The resulting kernel contains @file{rdb.a}, and spawns the
source debugging task @code{tRdbTask} when VxWorks is booted.  For more
information on configuring and remaking VxWorks, see the manufacturer's
manual.
@c VxWorks, see the @cite{VxWorks Programmer's Guide}.

Once you have included @file{rdb.a} in your VxWorks system image and 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{vxgdb}, depending on your installation).

@value{GDBN} comes up showing the prompt:

@smallexample
(vxgdb)
@end smallexample

@menu
* VxWorks Connection::          Connecting to VxWorks
* VxWorks Download::            VxWorks download
* VxWorks Attach::              Running tasks
@end menu

@node VxWorks Connection
@subsubsection Connecting to VxWorks

The @value{GDBN} command @code{target} lets you connect to a VxWorks target on the
network.  To connect to a target whose host name is ``@code{tt}'', type:

@smallexample
(vxgdb) target vxworks tt
@end smallexample

@need 750
@value{GDBN} displays messages like these:

@smallexample
Attaching remote machine across net...
Connected to tt.
@end smallexample

@need 1000
@value{GDBN} then attempts to read the symbol tables of any object modules
loaded into the VxWorks target since it was last booted.  @value{GDBN} locates
these files by searching the directories listed in the command search
path (@pxref{Environment, ,Your Program's Environment}); if it fails
to find an object file, it displays a message such as:

@smallexample
prog.o: No such file or directory.
@end smallexample

When this happens, add the appropriate directory to the search path with
the @value{GDBN} command @code{path}, and execute the @code{target}
command again.

@node VxWorks Download
@subsubsection VxWorks Download

@cindex download to VxWorks
If you have connected to the VxWorks target and you want to debug an
object that has not yet been loaded, you can use the @value{GDBN}
@code{load} command to download a file from Unix to VxWorks
incrementally.  The object file given as an argument to the @code{load}
command is actually opened twice: first by the VxWorks target in order
to download the code, then by @value{GDBN} in order to read the symbol
table.  This can lead to problems if the current working directories on
the two systems differ.  If both systems have NFS mounted the same
filesystems, you can avoid these problems by using absolute paths.
Otherwise, it is simplest to set the working directory on both systems
to the directory in which the object file resides, and then to reference
the file by its name, without any path.  For instance, a program
@file{prog.o} may reside in @file{@var{vxpath}/vw/demo/rdb} in VxWorks
and in @file{@var{hostpath}/vw/demo/rdb} on the host.  To load this
program, type this on VxWorks:

@smallexample
-> cd "@var{vxpath}/vw/demo/rdb"
@end smallexample

@noindent
Then, in @value{GDBN}, type:

@smallexample
(vxgdb) cd @var{hostpath}/vw/demo/rdb
(vxgdb) load prog.o
@end smallexample

@value{GDBN} displays a response similar to this:

@smallexample
Reading symbol data from wherever/vw/demo/rdb/prog.o... done.
@end smallexample

You can also use the @code{load} command to reload an object module
after editing and recompiling the corresponding source file.  Note that
this makes @value{GDBN} delete all currently-defined breakpoints,
auto-displays, and convenience variables, and to clear the value
history.  (This is necessary in order to preserve the integrity of
debugger's data structures that reference the target system's symbol
table.)

@node VxWorks Attach
@subsubsection Running Tasks

@cindex running VxWorks tasks
You can also attach to an existing task using the @code{attach} command as
follows:

@smallexample
(vxgdb) attach @var{task}
@end smallexample

@noindent
where @var{task} is the VxWorks hexadecimal task ID.  The task can be running
or suspended when you attach to it.  Running tasks are suspended at
the time of attachment.

@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
* OpenRISC 1000::               OpenRisc 1000
* 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.
@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 OpenRISC 1000
@subsection OpenRISC 1000
@cindex OpenRISC 1000

@cindex or1k boards
See OR1k Architecture document (@uref{www.opencores.org}) for more information
about platform and commands.

@table @code

@kindex target jtag
@item target jtag jtag://@var{host}:@var{port}

Connects to remote JTAG server.
JTAG remote server can be either an or1ksim or JTAG server,
connected via parallel port to the board.

Example: @code{target jtag jtag://localhost:9999}

@kindex or1ksim
@item or1ksim @var{command}
If connected to @code{or1ksim} OpenRISC 1000 Architectural
Simulator, proprietary commands can be executed.

@kindex info or1k spr
@item info or1k spr
Displays spr groups.

@item info or1k spr @var{group}
@itemx info or1k spr @var{groupno}
Displays register names in selected group.

@item info or1k spr @var{group} @var{register}
@itemx info or1k spr @var{register}
@itemx info or1k spr @var{groupno} @var{registerno}
@itemx info or1k spr @var{registerno}
Shows information about specified spr register.

@kindex spr
@item spr @var{group} @var{register} @var{value}
@itemx spr @var{register @var{value}}
@itemx spr @var{groupno} @var{registerno @var{value}}
@itemx spr @var{registerno @var{value}}
Writes @var{value} to specified spr register.
@end table

Some implementations of OpenRISC 1000 Architecture also have hardware trace.
It is very similar to @value{GDBN} trace, except it does not interfere with normal
program execution and is thus much faster.  Hardware breakpoints/watchpoint
triggers can be set using:
@table @code
@item $LEA/$LDATA
Load effective address/data
@item $SEA/$SDATA
Store effective address/data
@item $AEA/$ADATA
Access effective address ($SEA or $LEA) or data ($SDATA/$LDATA)
@item $FETCH
Fetch data
@end table

When triggered, it can capture low level data, like: @code{PC}, @code{LSEA},
@code{LDATA}, @code{SDATA}, @code{READSPR}, @code{WRITESPR}, @code{INSTR}.

@code{htrace} commands:
@cindex OpenRISC 1000 htrace
@table @code
@kindex hwatch
@item hwatch @var{conditional}
Set hardware watchpoint on combination of Load/Store Effective Address(es)
or Data.  For example:

@code{hwatch ($LEA == my_var) && ($LDATA < 50) || ($SEA == my_var) && ($SDATA >= 50)}

@code{hwatch ($LEA == my_var) && ($LDATA < 50) || ($SEA == my_var) && ($SDATA >= 50)}

@kindex htrace
@item htrace info
Display information about current HW trace configuration.

@item htrace trigger @var{conditional}
Set starting criteria for HW trace.

@item htrace qualifier @var{conditional}
Set acquisition qualifier for HW trace.

@item htrace stop @var{conditional}
Set HW trace stopping criteria.

@item htrace record [@var{data}]*
Selects the data to be recorded, when qualifier is met and HW trace was
triggered.

@item htrace enable
@itemx htrace disable
Enables/disables the HW trace.

@item htrace rewind [@var{filename}]
Clears currently recorded trace data.

If filename is specified, new trace file is made and any newly collected data
will be written there.

@item htrace print [@var{start} [@var{len}]]
Prints trace buffer, using current record configuration.

@item htrace mode continuous
Set continuous trace mode.

@item htrace mode suspend
Set suspend trace mode.

@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.
@var{start-location} and @var{end-location} 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 regs
@kindex regs@r{, Super-H}
This command is deprecated, and @code{info all-registers} should be
used instead.

Show the values of all Super-H registers.

@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
* i386::
* Alpha::
* MIPS::
* HPPA::               HP PA architecture
* SPU::                Cell Broadband Engine SPU architecture
* PowerPC::
@end menu

@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

@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 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}
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.
@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 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 show height
@itemx set width @var{cpl}
@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 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 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 0}.  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.  @var{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.  @var{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

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.

@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).

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 various kinds of files @value{GDBN} can automatically load:

@itemize @bullet
@item
@xref{objfile-gdb.py file}, controlled by @ref{set auto-load python-scripts}.
@item
@xref{objfile-gdb.gdb file}, controlled by @ref{set auto-load gdb-scripts}.
@item
@xref{dotdebug_gdb_scripts section},
controlled by @ref{set auto-load python-scripts}.
@item
@xref{Init File in the Current Directory},
controlled by @ref{set auto-load local-gdbinit}.
@item
@xref{libthread_db.so.1 file}, controlled by @ref{set auto-load libthread-db}.
@end itemize

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 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{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

@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}
* objfile-gdb.gdb file::               @samp{set/show/info auto-load gdb-script}
* Auto-loading safe path::             @samp{set/show/info auto-load safe-path}
* Auto-loading verbose mode::          @samp{set/show debug auto-load}
@xref{Python Auto-loading}.
@end menu

@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 objfile-gdb.gdb file
@subsection The @file{@var{objfile}-gdb.gdb} file
@cindex auto-loading @file{@var{objfile}-gdb.gdb}

@value{GDBN} tries to load an @file{@var{objfile}-gdb.gdb} file containing
canned sequences of commands (@pxref{Sequences}), as long as @samp{set
auto-load gdb-scripts} is set to @samp{on}.

Note that loading of this script file also requires accordingly configured
@code{auto-load safe-path} (@pxref{Auto-loading safe path}).

For more background refer to the similar Python scripts auto-loading
description (@pxref{objfile-gdb.py file}).

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

@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

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) 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 gdbarch debugging info
@cindex architecture debugging info
@item set debug arch
Turns on or off display of gdbarch debugging info.  The default is off
@kindex show debug
@item show debug arch
Displays the current state of displaying gdbarch debugging info.
@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 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 off.
@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 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 symtab-create
@cindex symbol table creation
Turns on or off display of debugging messages related to symbol table creation.
The default is off.
@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.  Changes to this flag do not take effect
until the next time you connect to a target or use the @code{run} command.
@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 debugvarobj
@cindex variable object debugging info
Turns on or off display of @value{GDBN} variable object debugging
info. The default is off.
@item show debugvarobj
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 three mechanisms for extension.  The first is based
on composition of @value{GDBN} commands, the second is based on the
Python scripting language, and the third is for defining new aliases of
existing commands.

To facilitate the use of the first two extensions, @value{GDBN} is capable
of evaluating the contents of a file.  When doing so, @value{GDBN}
can recognize which scripting 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

@menu
* Sequences::          Canned Sequences of Commands
* Python::             Scripting @value{GDBN} using Python
* Aliases::            Creating new spellings of existing commands
@end menu

@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
@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.
@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 Python
@section Scripting @value{GDBN} using Python
@cindex python scripting
@cindex scripting with python

You can script @value{GDBN} using the @uref{http://www.python.org/,
Python programming language}.  This feature is available only if
@value{GDBN} was configured using @option{--with-python}.

@cindex python directory
Python scripts used by @value{GDBN} should be installed in
@file{@var{data-directory}/python}, where @var{data-directory} is
the data directory as determined at @value{GDBN} startup (@pxref{Data Files}).
This directory, known as the @dfn{python directory},
is automatically added to the Python Search Path in order to allow
the Python interpreter to locate all scripts installed at this location.

Additionally, @value{GDBN} commands and convenience functions which
are written in Python and are located in the
@file{@var{data-directory}/python/gdb/command} or
@file{@var{data-directory}/python/gdb/function} directories are
automatically imported when @value{GDBN} starts.

@menu
* Python Commands::             Accessing Python from @value{GDBN}.
* Python API::                  Accessing @value{GDBN} from Python.
* Python Auto-loading::         Automatically loading Python code.
* Python modules::              Python modules provided by @value{GDBN}.
@end menu

@node Python Commands
@subsection Python Commands
@cindex python commands
@cindex commands to access python

@value{GDBN} provides one command for accessing the Python interpreter,
and one related setting:

@table @code
@kindex python
@item python @r{[}@var{code}@r{]}
The @code{python} command can be used to evaluate Python code.

If given an argument, the @code{python} command will evaluate the
argument as a Python command.  For example:

@smallexample
(@value{GDBP}) python print 23
23
@end smallexample

If you do not provide an argument to @code{python}, it will act as a
multi-line command, like @code{define}.  In this case, the Python
script is made up of subsequent command lines, given after the
@code{python} command.  This command list is terminated using a line
containing @code{end}.  For example:

@smallexample
(@value{GDBP}) python
Type python script
End with a line saying just "end".
>print 23
>end
23
@end smallexample

@kindex set python print-stack
@item set python print-stack
By default, @value{GDBN} will print only the message component of a
Python exception when an error occurs in a Python script.  This can be
controlled using @code{set python print-stack}: if @code{full}, then
full Python stack printing is enabled; if @code{none}, then Python stack
and message printing is disabled; if @code{message}, the default, only
the message component of the error is printed.
@end table

It is also possible to execute a Python script from the @value{GDBN}
interpreter:

@table @code
@item source @file{script-name}
The script name must end with @samp{.py} and @value{GDBN} must be configured
to recognize the script language based on filename extension using
the @code{script-extension} setting.  @xref{Extending GDB, ,Extending GDB}.

@item python execfile ("script-name")
This method is based on the @code{execfile} Python built-in function,
and thus is always available.
@end table

@node Python API
@subsection Python API
@cindex python api
@cindex programming in python

@cindex python stdout
@cindex python pagination
At startup, @value{GDBN} overrides Python's @code{sys.stdout} and
@code{sys.stderr} to print using @value{GDBN}'s output-paging streams.
A Python program which outputs to one of these streams may have its
output interrupted by the user (@pxref{Screen Size}).  In this
situation, a Python @code{KeyboardInterrupt} exception is thrown.

@menu
* Basic Python::                Basic Python Functions.
* Exception Handling::          How Python exceptions are translated.
* Values From Inferior::        Python representation of values.
* Types In Python::             Python representation of types.
* Pretty Printing API::         Pretty-printing values.
* Selecting Pretty-Printers::   How GDB chooses a pretty-printer.
* Writing a Pretty-Printer::    Writing a Pretty-Printer.
* Inferiors In Python::         Python representation of inferiors (processes)
* Events In Python::            Listening for events from @value{GDBN}.
* Threads In Python::           Accessing inferior threads from Python.
* Commands In Python::          Implementing new commands in Python.
* Parameters In Python::        Adding new @value{GDBN} parameters.
* Functions In Python::         Writing new convenience functions.
* Progspaces In Python::        Program spaces.
* Objfiles In Python::          Object files.
* Frames In Python::            Accessing inferior stack frames from Python.
* Blocks In Python::            Accessing frame blocks from Python.
* Symbols In Python::           Python representation of symbols.
* Symbol Tables In Python::     Python representation of symbol tables.
* Breakpoints In Python::       Manipulating breakpoints using Python.
* Finish Breakpoints in Python:: Setting Breakpoints on function return
                                using Python.
* Lazy Strings In Python::      Python representation of lazy strings.
@end menu

@node Basic Python
@subsubsection Basic Python

@cindex python functions
@cindex python module
@cindex gdb module
@value{GDBN} introduces a new Python module, named @code{gdb}.  All
methods and classes added by @value{GDBN} are placed in this module.
@value{GDBN} automatically @code{import}s the @code{gdb} module for
use in all scripts evaluated by the @code{python} command.

@findex gdb.PYTHONDIR
@defvar gdb.PYTHONDIR
A string containing the python directory (@pxref{Python}).
@end defvar

@findex gdb.execute
@defun gdb.execute (command @r{[}, from_tty @r{[}, to_string@r{]]})
Evaluate @var{command}, a string, as a @value{GDBN} CLI command.
If a GDB exception happens while @var{command} runs, it is
translated as described in @ref{Exception Handling,,Exception Handling}.

@var{from_tty} specifies whether @value{GDBN} ought to consider this
command as having originated from the user invoking it interactively.
It must be a boolean value.  If omitted, it defaults to @code{False}.

By default, any output produced by @var{command} is sent to
@value{GDBN}'s standard output.  If the @var{to_string} parameter is
@code{True}, then output will be collected by @code{gdb.execute} and
returned as a string.  The default is @code{False}, in which case the
return value is @code{None}.  If @var{to_string} is @code{True}, the
@value{GDBN} virtual terminal will be temporarily set to unlimited width
and height, and its pagination will be disabled; @pxref{Screen Size}.
@end defun

@findex gdb.breakpoints
@defun gdb.breakpoints ()
Return a sequence holding all of @value{GDBN}'s breakpoints.
@xref{Breakpoints In Python}, for more information.
@end defun

@findex gdb.parameter
@defun gdb.parameter (parameter)
Return the value of a @value{GDBN} parameter.  @var{parameter} is a
string naming the parameter to look up; @var{parameter} may contain
spaces if the parameter has a multi-part name.  For example,
@samp{print object} is a valid parameter name.

If the named parameter does not exist, this function throws a
@code{gdb.error} (@pxref{Exception Handling}).  Otherwise, the
parameter's value is converted to a Python value of the appropriate
type, and returned.
@end defun

@findex gdb.history
@defun gdb.history (number)
Return a value from @value{GDBN}'s value history (@pxref{Value
History}).  @var{number} indicates which history element to return.
If @var{number} is negative, then @value{GDBN} will take its absolute value
and count backward from the last element (i.e., the most recent element) to
find the value to return.  If @var{number} is zero, then @value{GDBN} will
return the most recent element.  If the element specified by @var{number}
doesn't exist in the value history, a @code{gdb.error} exception will be
raised.

If no exception is raised, the return value is always an instance of
@code{gdb.Value} (@pxref{Values From Inferior}).
@end defun

@findex gdb.parse_and_eval
@defun gdb.parse_and_eval (expression)
Parse @var{expression} as an expression in the current language,
evaluate it, and return the result as a @code{gdb.Value}.
@var{expression} must be a string.

This function can be useful when implementing a new command
(@pxref{Commands In Python}), as it provides a way to parse the
command's argument as an expression.  It is also useful simply to
compute values, for example, it is the only way to get the value of a
convenience variable (@pxref{Convenience Vars}) as a @code{gdb.Value}.
@end defun

@findex gdb.find_pc_line
@defun gdb.find_pc_line (pc)
Return the @code{gdb.Symtab_and_line} object corresponding to the
@var{pc} value.  @xref{Symbol Tables In Python}.  If an invalid
value of @var{pc} is passed as an argument, then the @code{symtab} and
@code{line} attributes of the returned @code{gdb.Symtab_and_line} object
will be @code{None} and 0 respectively.
@end defun

@findex gdb.post_event
@defun gdb.post_event (event)
Put @var{event}, a callable object taking no arguments, into
@value{GDBN}'s internal event queue.  This callable will be invoked at
some later point, during @value{GDBN}'s event processing.  Events
posted using @code{post_event} will be run in the order in which they
were posted; however, there is no way to know when they will be
processed relative to other events inside @value{GDBN}.

@value{GDBN} is not thread-safe.  If your Python program uses multiple
threads, you must be careful to only call @value{GDBN}-specific
functions in the main @value{GDBN} thread.  @code{post_event} ensures
this.  For example:

@smallexample
(@value{GDBP}) python
>import threading
>
>class Writer():
> def __init__(self, message):
>        self.message = message;
> def __call__(self):
>        gdb.write(self.message)
>
>class MyThread1 (threading.Thread):
> def run (self):
>        gdb.post_event(Writer("Hello "))
>
>class MyThread2 (threading.Thread):
> def run (self):
>        gdb.post_event(Writer("World\n"))
>
>MyThread1().start()
>MyThread2().start()
>end
(@value{GDBP}) Hello World
@end smallexample
@end defun

@findex gdb.write 
@defun gdb.write (string @r{[}, stream{]})
Print a string to @value{GDBN}'s paginated output stream.  The
optional @var{stream} determines the stream to print to.  The default
stream is @value{GDBN}'s standard output stream.  Possible stream
values are:

@table @code
@findex STDOUT
@findex gdb.STDOUT
@item gdb.STDOUT
@value{GDBN}'s standard output stream.

@findex STDERR
@findex gdb.STDERR
@item gdb.STDERR
@value{GDBN}'s standard error stream.

@findex STDLOG
@findex gdb.STDLOG
@item gdb.STDLOG
@value{GDBN}'s log stream (@pxref{Logging Output}).
@end table

Writing to @code{sys.stdout} or @code{sys.stderr} will automatically
call this function and will automatically direct the output to the
relevant stream.
@end defun

@findex gdb.flush
@defun gdb.flush ()
Flush the buffer of a @value{GDBN} paginated stream so that the
contents are displayed immediately.  @value{GDBN} will flush the
contents of a stream automatically when it encounters a newline in the
buffer.  The optional @var{stream} determines the stream to flush.  The
default stream is @value{GDBN}'s standard output stream.  Possible
stream values are: 

@table @code
@findex STDOUT
@findex gdb.STDOUT
@item gdb.STDOUT
@value{GDBN}'s standard output stream.

@findex STDERR
@findex gdb.STDERR
@item gdb.STDERR
@value{GDBN}'s standard error stream.

@findex STDLOG
@findex gdb.STDLOG
@item gdb.STDLOG
@value{GDBN}'s log stream (@pxref{Logging Output}).

@end table

Flushing @code{sys.stdout} or @code{sys.stderr} will automatically
call this function for the relevant stream.
@end defun

@findex gdb.target_charset
@defun gdb.target_charset ()
Return the name of the current target character set (@pxref{Character
Sets}).  This differs from @code{gdb.parameter('target-charset')} in
that @samp{auto} is never returned.
@end defun

@findex gdb.target_wide_charset
@defun gdb.target_wide_charset ()
Return the name of the current target wide character set
(@pxref{Character Sets}).  This differs from
@code{gdb.parameter('target-wide-charset')} in that @samp{auto} is
never returned.
@end defun

@findex gdb.solib_name
@defun gdb.solib_name (address)
Return the name of the shared library holding the given @var{address}
as a string, or @code{None}.
@end defun

@findex gdb.decode_line 
@defun gdb.decode_line @r{[}expression@r{]}
Return locations of the line specified by @var{expression}, or of the
current line if no argument was given.  This function returns a Python
tuple containing two elements.  The first element contains a string
holding any unparsed section of @var{expression} (or @code{None} if
the expression has been fully parsed).  The second element contains
either @code{None} or another tuple that contains all the locations
that match the expression represented as @code{gdb.Symtab_and_line}
objects (@pxref{Symbol Tables In Python}).  If @var{expression} is
provided, it is decoded the way that @value{GDBN}'s inbuilt
@code{break} or @code{edit} commands do (@pxref{Specify Location}).
@end defun

@defun gdb.prompt_hook (current_prompt)
@anchor{prompt_hook}

If @var{prompt_hook} is callable, @value{GDBN} will call the method
assigned to this operation before a prompt is displayed by
@value{GDBN}.

The parameter @code{current_prompt} contains the current @value{GDBN} 
prompt.  This method must return a Python string, or @code{None}.  If
a string is returned, the @value{GDBN} prompt will be set to that
string.  If @code{None} is returned, @value{GDBN} will continue to use
the current prompt.

Some prompts cannot be substituted in @value{GDBN}.  Secondary prompts
such as those used by readline for command input, and annotation
related prompts are prohibited from being changed.
@end defun

@node Exception Handling
@subsubsection Exception Handling
@cindex python exceptions
@cindex exceptions, python

When executing the @code{python} command, Python exceptions
uncaught within the Python code are translated to calls to
@value{GDBN} error-reporting mechanism.  If the command that called
@code{python} does not handle the error, @value{GDBN} will
terminate it and print an error message containing the Python
exception name, the associated value, and the Python call stack
backtrace at the point where the exception was raised.  Example:

@smallexample
(@value{GDBP}) python print foo
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined
@end smallexample

@value{GDBN} errors that happen in @value{GDBN} commands invoked by
Python code are converted to Python exceptions.  The type of the
Python exception depends on the error.

@ftable @code
@item gdb.error
This is the base class for most exceptions generated by @value{GDBN}.
It is derived from @code{RuntimeError}, for compatibility with earlier
versions of @value{GDBN}.

If an error occurring in @value{GDBN} does not fit into some more
specific category, then the generated exception will have this type.

@item gdb.MemoryError
This is a subclass of @code{gdb.error} which is thrown when an
operation tried to access invalid memory in the inferior.

@item KeyboardInterrupt
User interrupt (via @kbd{C-c} or by typing @kbd{q} at a pagination
prompt) is translated to a Python @code{KeyboardInterrupt} exception.
@end ftable

In all cases, your exception handler will see the @value{GDBN} error
message as its value and the Python call stack backtrace at the Python
statement closest to where the @value{GDBN} error occured as the
traceback.

@findex gdb.GdbError
When implementing @value{GDBN} commands in Python via @code{gdb.Command},
it is useful to be able to throw an exception that doesn't cause a
traceback to be printed.  For example, the user may have invoked the
command incorrectly.  Use the @code{gdb.GdbError} exception
to handle this case.  Example:

@smallexample
(gdb) python
>class HelloWorld (gdb.Command):
>  """Greet the whole world."""
>  def __init__ (self):
>    super (HelloWorld, self).__init__ ("hello-world", gdb.COMMAND_USER)
>  def invoke (self, args, from_tty):
>    argv = gdb.string_to_argv (args)
>    if len (argv) != 0:
>      raise gdb.GdbError ("hello-world takes no arguments")
>    print "Hello, World!"
>HelloWorld ()
>end
(gdb) hello-world 42
hello-world takes no arguments
@end smallexample

@node Values From Inferior
@subsubsection Values From Inferior
@cindex values from inferior, with Python
@cindex python, working with values from inferior

@cindex @code{gdb.Value}
@value{GDBN} provides values it obtains from the inferior program in
an object of type @code{gdb.Value}.  @value{GDBN} uses this object
for its internal bookkeeping of the inferior's values, and for
fetching values when necessary.

Inferior values that are simple scalars can be used directly in
Python expressions that are valid for the value's data type.  Here's
an example for an integer or floating-point value @code{some_val}:

@smallexample
bar = some_val + 2
@end smallexample

@noindent
As result of this, @code{bar} will also be a @code{gdb.Value} object
whose values are of the same type as those of @code{some_val}.

Inferior values that are structures or instances of some class can
be accessed using the Python @dfn{dictionary syntax}.  For example, if
@code{some_val} is a @code{gdb.Value} instance holding a structure, you
can access its @code{foo} element with:

@smallexample
bar = some_val['foo']
@end smallexample

Again, @code{bar} will also be a @code{gdb.Value} object.

A @code{gdb.Value} that represents a function can be executed via
inferior function call.  Any arguments provided to the call must match
the function's prototype, and must be provided in the order specified
by that prototype.

For example, @code{some_val} is a @code{gdb.Value} instance
representing a function that takes two integers as arguments.  To
execute this function, call it like so:

@smallexample
result = some_val (10,20)
@end smallexample

Any values returned from a function call will be stored as a
@code{gdb.Value}.

The following attributes are provided:

@table @code
@defvar Value.address
If this object is addressable, this read-only attribute holds a
@code{gdb.Value} object representing the address.  Otherwise,
this attribute holds @code{None}.
@end defvar

@cindex optimized out value in Python
@defvar Value.is_optimized_out
This read-only boolean attribute is true if the compiler optimized out
this value, thus it is not available for fetching from the inferior.
@end defvar

@defvar Value.type
The type of this @code{gdb.Value}.  The value of this attribute is a
@code{gdb.Type} object (@pxref{Types In Python}).
@end defvar

@defvar Value.dynamic_type
The dynamic type of this @code{gdb.Value}.  This uses C@t{++} run-time
type information (@acronym{RTTI}) to determine the dynamic type of the
value.  If this value is of class type, it will return the class in
which the value is embedded, if any.  If this value is of pointer or
reference to a class type, it will compute the dynamic type of the
referenced object, and return a pointer or reference to that type,
respectively.  In all other cases, it will return the value's static
type.

Note that this feature will only work when debugging a C@t{++} program
that includes @acronym{RTTI} for the object in question.  Otherwise,
it will just return the static type of the value as in @kbd{ptype foo}
(@pxref{Symbols, ptype}).
@end defvar

@defvar Value.is_lazy
The value of this read-only boolean attribute is @code{True} if this
@code{gdb.Value} has not yet been fetched from the inferior.  
@value{GDBN} does not fetch values until necessary, for efficiency.  
For example:

@smallexample
myval = gdb.parse_and_eval ('somevar')
@end smallexample

The value of @code{somevar} is not fetched at this time.  It will be 
fetched when the value is needed, or when the @code{fetch_lazy}
method is invoked.  
@end defvar
@end table

The following methods are provided:

@table @code
@defun Value.__init__ (@var{val})
Many Python values can be converted directly to a @code{gdb.Value} via
this object initializer.  Specifically:

@table @asis
@item Python boolean
A Python boolean is converted to the boolean type from the current
language.

@item Python integer
A Python integer is converted to the C @code{long} type for the
current architecture.

@item Python long
A Python long is converted to the C @code{long long} type for the
current architecture.

@item Python float
A Python float is converted to the C @code{double} type for the
current architecture.

@item Python string
A Python string is converted to a target string, using the current
target encoding.

@item @code{gdb.Value}
If @code{val} is a @code{gdb.Value}, then a copy of the value is made.

@item @code{gdb.LazyString}
If @code{val} is a @code{gdb.LazyString} (@pxref{Lazy Strings In
Python}), then the lazy string's @code{value} method is called, and
its result is used.
@end table
@end defun

@defun Value.cast (type)
Return a new instance of @code{gdb.Value} that is the result of
casting this instance to the type described by @var{type}, which must
be a @code{gdb.Type} object.  If the cast cannot be performed for some
reason, this method throws an exception.
@end defun

@defun Value.dereference ()
For pointer data types, this method returns a new @code{gdb.Value} object
whose contents is the object pointed to by the pointer.  For example, if
@code{foo} is a C pointer to an @code{int}, declared in your C program as

@smallexample
int *foo;
@end smallexample

@noindent
then you can use the corresponding @code{gdb.Value} to access what
@code{foo} points to like this:

@smallexample
bar = foo.dereference ()
@end smallexample

The result @code{bar} will be a @code{gdb.Value} object holding the
value pointed to by @code{foo}.

A similar function @code{Value.referenced_value} exists which also
returns @code{gdb.Value} objects corresonding to the values pointed to
by pointer values (and additionally, values referenced by reference
values).  However, the behavior of @code{Value.dereference}
differs from @code{Value.referenced_value} by the fact that the
behavior of @code{Value.dereference} is identical to applying the C
unary operator @code{*} on a given value.  For example, consider a
reference to a pointer @code{ptrref}, declared in your C@t{++} program
as

@smallexample
typedef int *intptr;
...
int val = 10;
intptr ptr = &val;
intptr &ptrref = ptr;
@end smallexample

Though @code{ptrref} is a reference value, one can apply the method
@code{Value.dereference} to the @code{gdb.Value} object corresponding
to it and obtain a @code{gdb.Value} which is identical to that
corresponding to @code{val}.  However, if you apply the method
@code{Value.referenced_value}, the result would be a @code{gdb.Value}
object identical to that corresponding to @code{ptr}.

@smallexample
py_ptrref = gdb.parse_and_eval ("ptrref")
py_val = py_ptrref.dereference ()
py_ptr = py_ptrref.referenced_value ()
@end smallexample

The @code{gdb.Value} object @code{py_val} is identical to that
corresponding to @code{val}, and @code{py_ptr} is identical to that
corresponding to @code{ptr}.  In general, @code{Value.dereference} can
be applied whenever the C unary operator @code{*} can be applied
to the corresponding C value.  For those cases where applying both
@code{Value.dereference} and @code{Value.referenced_value} is allowed,
the results obtained need not be identical (as we have seen in the above
example).  The results are however identical when applied on
@code{gdb.Value} objects corresponding to pointers (@code{gdb.Value}
objects with type code @code{TYPE_CODE_PTR}) in a C/C@t{++} program.
@end defun

@defun Value.referenced_value ()
For pointer or reference data types, this method returns a new
@code{gdb.Value} object corresponding to the value referenced by the
pointer/reference value.  For pointer data types,
@code{Value.dereference} and @code{Value.referenced_value} produce
identical results.  The difference between these methods is that
@code{Value.dereference} cannot get the values referenced by reference
values.  For example, consider a reference to an @code{int}, declared
in your C@t{++} program as

@smallexample
int val = 10;
int &ref = val;
@end smallexample

@noindent
then applying @code{Value.dereference} to the @code{gdb.Value} object
corresponding to @code{ref} will result in an error, while applying
@code{Value.referenced_value} will result in a @code{gdb.Value} object
identical to that corresponding to @code{val}.

@smallexample
py_ref = gdb.parse_and_eval ("ref")
er_ref = py_ref.dereference ()       # Results in error
py_val = py_ref.referenced_value ()  # Returns the referenced value
@end smallexample

The @code{gdb.Value} object @code{py_val} is identical to that
corresponding to @code{val}.
@end defun

@defun Value.dynamic_cast (type)
Like @code{Value.cast}, but works as if the C@t{++} @code{dynamic_cast}
operator were used.  Consult a C@t{++} reference for details.
@end defun

@defun Value.reinterpret_cast (type)
Like @code{Value.cast}, but works as if the C@t{++} @code{reinterpret_cast}
operator were used.  Consult a C@t{++} reference for details.
@end defun

@defun Value.string (@r{[}encoding@r{[}, errors@r{[}, length@r{]]]})
If this @code{gdb.Value} represents a string, then this method
converts the contents to a Python string.  Otherwise, this method will
throw an exception.

Strings are recognized in a language-specific way; whether a given
@code{gdb.Value} represents a string is determined by the current
language.

For C-like languages, a value is a string if it is a pointer to or an
array of characters or ints.  The string is assumed to be terminated
by a zero of the appropriate width.  However if the optional length
argument is given, the string will be converted to that given length,
ignoring any embedded zeros that the string may contain.

If the optional @var{encoding} argument is given, it must be a string
naming the encoding of the string in the @code{gdb.Value}, such as
@code{"ascii"}, @code{"iso-8859-6"} or @code{"utf-8"}.  It accepts
the same encodings as the corresponding argument to Python's
@code{string.decode} method, and the Python codec machinery will be used
to convert the string.  If @var{encoding} is not given, or if
@var{encoding} is the empty string, then either the @code{target-charset}
(@pxref{Character Sets}) will be used, or a language-specific encoding
will be used, if the current language is able to supply one.

The optional @var{errors} argument is the same as the corresponding
argument to Python's @code{string.decode} method.

If the optional @var{length} argument is given, the string will be
fetched and converted to the given length.
@end defun

@defun Value.lazy_string (@r{[}encoding @r{[}, length@r{]]})
If this @code{gdb.Value} represents a string, then this method
converts the contents to a @code{gdb.LazyString} (@pxref{Lazy Strings
In Python}).  Otherwise, this method will throw an exception.

If the optional @var{encoding} argument is given, it must be a string
naming the encoding of the @code{gdb.LazyString}.  Some examples are:
@samp{ascii}, @samp{iso-8859-6} or @samp{utf-8}.  If the
@var{encoding} argument is an encoding that @value{GDBN} does
recognize, @value{GDBN} will raise an error.

When a lazy string is printed, the @value{GDBN} encoding machinery is
used to convert the string during printing.  If the optional
@var{encoding} argument is not provided, or is an empty string,
@value{GDBN} will automatically select the encoding most suitable for
the string type.  For further information on encoding in @value{GDBN}
please see @ref{Character Sets}.

If the optional @var{length} argument is given, the string will be
fetched and encoded to the length of characters specified.  If
the @var{length} argument is not provided, the string will be fetched
and encoded until a null of appropriate width is found.
@end defun

@defun Value.fetch_lazy ()
If the @code{gdb.Value} object is currently a lazy value 
(@code{gdb.Value.is_lazy} is @code{True}), then the value is
fetched from the inferior.  Any errors that occur in the process
will produce a Python exception.

If the @code{gdb.Value} object is not a lazy value, this method
has no effect.

This method does not return a value.
@end defun

@end table

@node Types In Python
@subsubsection Types In Python
@cindex types in Python
@cindex Python, working with types

@tindex gdb.Type
@value{GDBN} represents types from the inferior using the class
@code{gdb.Type}.

The following type-related functions are available in the @code{gdb}
module:

@findex gdb.lookup_type
@defun gdb.lookup_type (name @r{[}, block@r{]})
This function looks up a type by name.  @var{name} is the name of the
type to look up.  It must be a string.

If @var{block} is given, then @var{name} is looked up in that scope.
Otherwise, it is searched for globally.

Ordinarily, this function will return an instance of @code{gdb.Type}.
If the named type cannot be found, it will throw an exception.
@end defun

If the type is a structure or class type, or an enum type, the fields
of that type can be accessed using the Python @dfn{dictionary syntax}.
For example, if @code{some_type} is a @code{gdb.Type} instance holding
a structure type, you can access its @code{foo} field with:

@smallexample
bar = some_type['foo']
@end smallexample

@code{bar} will be a @code{gdb.Field} object; see below under the
description of the @code{Type.fields} method for a description of the
@code{gdb.Field} class.

An instance of @code{Type} has the following attributes:

@table @code
@defvar Type.code
The type code for this type.  The type code will be one of the
@code{TYPE_CODE_} constants defined below.
@end defvar

@defvar Type.sizeof
The size of this type, in target @code{char} units.  Usually, a
target's @code{char} type will be an 8-bit byte.  However, on some
unusual platforms, this type may have a different size.
@end defvar

@defvar Type.tag
The tag name for this type.  The tag name is the name after
@code{struct}, @code{union}, or @code{enum} in C and C@t{++}; not all
languages have this concept.  If this type has no tag name, then
@code{None} is returned.
@end defvar
@end table

The following methods are provided:

@table @code
@defun Type.fields ()
For structure and union types, this method returns the fields.  Range
types have two fields, the minimum and maximum values.  Enum types
have one field per enum constant.  Function and method types have one
field per parameter.  The base types of C@t{++} classes are also
represented as fields.  If the type has no fields, or does not fit
into one of these categories, an empty sequence will be returned.

Each field is a @code{gdb.Field} object, with some pre-defined attributes:
@table @code
@item bitpos
This attribute is not available for @code{static} fields (as in
C@t{++} or Java).  For non-@code{static} fields, the value is the bit
position of the field.  For @code{enum} fields, the value is the
enumeration member's integer representation.

@item name
The name of the field, or @code{None} for anonymous fields.

@item artificial
This is @code{True} if the field is artificial, usually meaning that
it was provided by the compiler and not the user.  This attribute is
always provided, and is @code{False} if the field is not artificial.

@item is_base_class
This is @code{True} if the field represents a base class of a C@t{++}
structure.  This attribute is always provided, and is @code{False}
if the field is not a base class of the type that is the argument of
@code{fields}, or if that type was not a C@t{++} class.

@item bitsize
If the field is packed, or is a bitfield, then this will have a
non-zero value, which is the size of the field in bits.  Otherwise,
this will be zero; in this case the field's size is given by its type.

@item type
The type of the field.  This is usually an instance of @code{Type},
but it can be @code{None} in some situations.
@end table
@end defun

@defun Type.array (@var{n1} @r{[}, @var{n2}@r{]})
Return a new @code{gdb.Type} object which represents an array of this
type.  If one argument is given, it is the inclusive upper bound of
the array; in this case the lower bound is zero.  If two arguments are
given, the first argument is the lower bound of the array, and the
second argument is the upper bound of the array.  An array's length
must not be negative, but the bounds can be.
@end defun

@defun Type.const ()
Return a new @code{gdb.Type} object which represents a
@code{const}-qualified variant of this type.
@end defun

@defun Type.volatile ()
Return a new @code{gdb.Type} object which represents a
@code{volatile}-qualified variant of this type.
@end defun

@defun Type.unqualified ()
Return a new @code{gdb.Type} object which represents an unqualified
variant of this type.  That is, the result is neither @code{const} nor
@code{volatile}.
@end defun

@defun Type.range ()
Return a Python @code{Tuple} object that contains two elements: the
low bound of the argument type and the high bound of that type.  If
the type does not have a range, @value{GDBN} will raise a
@code{gdb.error} exception (@pxref{Exception Handling}).
@end defun

@defun Type.reference ()
Return a new @code{gdb.Type} object which represents a reference to this
type.
@end defun

@defun Type.pointer ()
Return a new @code{gdb.Type} object which represents a pointer to this
type.
@end defun

@defun Type.strip_typedefs ()
Return a new @code{gdb.Type} that represents the real type,
after removing all layers of typedefs.
@end defun

@defun Type.target ()
Return a new @code{gdb.Type} object which represents the target type
of this type.

For a pointer type, the target type is the type of the pointed-to
object.  For an array type (meaning C-like arrays), the target type is
the type of the elements of the array.  For a function or method type,
the target type is the type of the return value.  For a complex type,
the target type is the type of the elements.  For a typedef, the
target type is the aliased type.

If the type does not have a target, this method will throw an
exception.
@end defun

@defun Type.template_argument (n @r{[}, block@r{]})
If this @code{gdb.Type} is an instantiation of a template, this will
return a new @code{gdb.Type} which represents the type of the
@var{n}th template argument.

If this @code{gdb.Type} is not a template type, this will throw an
exception.  Ordinarily, only C@t{++} code will have template types.

If @var{block} is given, then @var{name} is looked up in that scope.
Otherwise, it is searched for globally.
@end defun
@end table


Each type has a code, which indicates what category this type falls
into.  The available type categories are represented by constants
defined in the @code{gdb} module:

@table @code
@findex TYPE_CODE_PTR
@findex gdb.TYPE_CODE_PTR
@item gdb.TYPE_CODE_PTR
The type is a pointer.

@findex TYPE_CODE_ARRAY
@findex gdb.TYPE_CODE_ARRAY
@item gdb.TYPE_CODE_ARRAY
The type is an array.

@findex TYPE_CODE_STRUCT
@findex gdb.TYPE_CODE_STRUCT
@item gdb.TYPE_CODE_STRUCT
The type is a structure.

@findex TYPE_CODE_UNION
@findex gdb.TYPE_CODE_UNION
@item gdb.TYPE_CODE_UNION
The type is a union.

@findex TYPE_CODE_ENUM
@findex gdb.TYPE_CODE_ENUM
@item gdb.TYPE_CODE_ENUM
The type is an enum.

@findex TYPE_CODE_FLAGS
@findex gdb.TYPE_CODE_FLAGS
@item gdb.TYPE_CODE_FLAGS
A bit flags type, used for things such as status registers.

@findex TYPE_CODE_FUNC
@findex gdb.TYPE_CODE_FUNC
@item gdb.TYPE_CODE_FUNC
The type is a function.

@findex TYPE_CODE_INT
@findex gdb.TYPE_CODE_INT
@item gdb.TYPE_CODE_INT
The type is an integer type.

@findex TYPE_CODE_FLT
@findex gdb.TYPE_CODE_FLT
@item gdb.TYPE_CODE_FLT
A floating point type.

@findex TYPE_CODE_VOID
@findex gdb.TYPE_CODE_VOID
@item gdb.TYPE_CODE_VOID
The special type @code{void}.

@findex TYPE_CODE_SET
@findex gdb.TYPE_CODE_SET
@item gdb.TYPE_CODE_SET
A Pascal set type.

@findex TYPE_CODE_RANGE
@findex gdb.TYPE_CODE_RANGE
@item gdb.TYPE_CODE_RANGE
A range type, that is, an integer type with bounds.

@findex TYPE_CODE_STRING
@findex gdb.TYPE_CODE_STRING
@item gdb.TYPE_CODE_STRING
A string type.  Note that this is only used for certain languages with
language-defined string types; C strings are not represented this way.

@findex TYPE_CODE_BITSTRING
@findex gdb.TYPE_CODE_BITSTRING
@item gdb.TYPE_CODE_BITSTRING
A string of bits.

@findex TYPE_CODE_ERROR
@findex gdb.TYPE_CODE_ERROR
@item gdb.TYPE_CODE_ERROR
An unknown or erroneous type.

@findex TYPE_CODE_METHOD
@findex gdb.TYPE_CODE_METHOD
@item gdb.TYPE_CODE_METHOD
A method type, as found in C@t{++} or Java.

@findex TYPE_CODE_METHODPTR
@findex gdb.TYPE_CODE_METHODPTR
@item gdb.TYPE_CODE_METHODPTR
A pointer-to-member-function.

@findex TYPE_CODE_MEMBERPTR
@findex gdb.TYPE_CODE_MEMBERPTR
@item gdb.TYPE_CODE_MEMBERPTR
A pointer-to-member.

@findex TYPE_CODE_REF
@findex gdb.TYPE_CODE_REF
@item gdb.TYPE_CODE_REF
A reference type.

@findex TYPE_CODE_CHAR
@findex gdb.TYPE_CODE_CHAR
@item gdb.TYPE_CODE_CHAR
A character type.

@findex TYPE_CODE_BOOL
@findex gdb.TYPE_CODE_BOOL
@item gdb.TYPE_CODE_BOOL
A boolean type.

@findex TYPE_CODE_COMPLEX
@findex gdb.TYPE_CODE_COMPLEX
@item gdb.TYPE_CODE_COMPLEX
A complex float type.

@findex TYPE_CODE_TYPEDEF
@findex gdb.TYPE_CODE_TYPEDEF
@item gdb.TYPE_CODE_TYPEDEF
A typedef to some other type.

@findex TYPE_CODE_NAMESPACE
@findex gdb.TYPE_CODE_NAMESPACE
@item gdb.TYPE_CODE_NAMESPACE
A C@t{++} namespace.

@findex TYPE_CODE_DECFLOAT
@findex gdb.TYPE_CODE_DECFLOAT
@item gdb.TYPE_CODE_DECFLOAT
A decimal floating point type.

@findex TYPE_CODE_INTERNAL_FUNCTION
@findex gdb.TYPE_CODE_INTERNAL_FUNCTION
@item gdb.TYPE_CODE_INTERNAL_FUNCTION
A function internal to @value{GDBN}.  This is the type used to represent
convenience functions.
@end table

Further support for types is provided in the @code{gdb.types}
Python module (@pxref{gdb.types}).

@node Pretty Printing API
@subsubsection Pretty Printing API

An example output is provided (@pxref{Pretty Printing}).

A pretty-printer is just an object that holds a value and implements a
specific interface, defined here.

@defun pretty_printer.children (self)
@value{GDBN} will call this method on a pretty-printer to compute the
children of the pretty-printer's value.

This method must return an object conforming to the Python iterator
protocol.  Each item returned by the iterator must be a tuple holding
two elements.  The first element is the ``name'' of the child; the
second element is the child's value.  The value can be any Python
object which is convertible to a @value{GDBN} value.

This method is optional.  If it does not exist, @value{GDBN} will act
as though the value has no children.
@end defun

@defun pretty_printer.display_hint (self)
The CLI may call this method and use its result to change the
formatting of a value.  The result will also be supplied to an MI
consumer as a @samp{displayhint} attribute of the variable being
printed.

This method is optional.  If it does exist, this method must return a
string.

Some display hints are predefined by @value{GDBN}:

@table @samp
@item array
Indicate that the object being printed is ``array-like''.  The CLI
uses this to respect parameters such as @code{set print elements} and
@code{set print array}.

@item map
Indicate that the object being printed is ``map-like'', and that the
children of this value can be assumed to alternate between keys and
values.

@item string
Indicate that the object being printed is ``string-like''.  If the
printer's @code{to_string} method returns a Python string of some
kind, then @value{GDBN} will call its internal language-specific
string-printing function to format the string.  For the CLI this means
adding quotation marks, possibly escaping some characters, respecting
@code{set print elements}, and the like.
@end table
@end defun

@defun pretty_printer.to_string (self)
@value{GDBN} will call this method to display the string
representation of the value passed to the object's constructor.

When printing from the CLI, if the @code{to_string} method exists,
then @value{GDBN} will prepend its result to the values returned by
@code{children}.  Exactly how this formatting is done is dependent on
the display hint, and may change as more hints are added.  Also,
depending on the print settings (@pxref{Print Settings}), the CLI may
print just the result of @code{to_string} in a stack trace, omitting
the result of @code{children}.

If this method returns a string, it is printed verbatim.

Otherwise, if this method returns an instance of @code{gdb.Value},
then @value{GDBN} prints this value.  This may result in a call to
another pretty-printer.

If instead the method returns a Python value which is convertible to a
@code{gdb.Value}, then @value{GDBN} performs the conversion and prints
the resulting value.  Again, this may result in a call to another
pretty-printer.  Python scalars (integers, floats, and booleans) and
strings are convertible to @code{gdb.Value}; other types are not.

Finally, if this method returns @code{None} then no further operations
are peformed in this method and nothing is printed.

If the result is not one of these types, an exception is raised.
@end defun

@value{GDBN} provides a function which can be used to look up the
default pretty-printer for a @code{gdb.Value}:

@findex gdb.default_visualizer
@defun gdb.default_visualizer (value)
This function takes a @code{gdb.Value} object as an argument.  If a
pretty-printer for this value exists, then it is returned.  If no such
printer exists, then this returns @code{None}.
@end defun

@node Selecting Pretty-Printers
@subsubsection Selecting Pretty-Printers

The Python list @code{gdb.pretty_printers} contains an array of
functions or callable objects that have been registered via addition
as a pretty-printer.  Printers in this list are called @code{global}
printers, they're available when debugging all inferiors.
Each @code{gdb.Progspace} contains a @code{pretty_printers} attribute.
Each @code{gdb.Objfile} also contains a @code{pretty_printers}
attribute.

Each function on these lists is passed a single @code{gdb.Value}
argument and should return a pretty-printer object conforming to the
interface definition above (@pxref{Pretty Printing API}).  If a function
cannot create a pretty-printer for the value, it should return
@code{None}.

@value{GDBN} first checks the @code{pretty_printers} attribute of each
@code{gdb.Objfile} in the current program space and iteratively calls
each enabled lookup routine in the list for that @code{gdb.Objfile}
until it receives a pretty-printer object.
If no pretty-printer is found in the objfile lists, @value{GDBN} then
searches the pretty-printer list of the current program space,
calling each enabled function until an object is returned.
After these lists have been exhausted, it tries the global
@code{gdb.pretty_printers} list, again calling each enabled function until an
object is returned.

The order in which the objfiles are searched is not specified.  For a
given list, functions are always invoked from the head of the list,
and iterated over sequentially until the end of the list, or a printer
object is returned.

For various reasons a pretty-printer may not work.
For example, the underlying data structure may have changed and
the pretty-printer is out of date.

The consequences of a broken pretty-printer are severe enough that
@value{GDBN} provides support for enabling and disabling individual
printers.  For example, if @code{print frame-arguments} is on,
a backtrace can become highly illegible if any argument is printed
with a broken printer.

Pretty-printers are enabled and disabled by attaching an @code{enabled}
attribute to the registered function or callable object.  If this attribute
is present and its value is @code{False}, the printer is disabled, otherwise
the printer is enabled.

@node Writing a Pretty-Printer
@subsubsection Writing a Pretty-Printer
@cindex writing a pretty-printer

A pretty-printer consists of two parts: a lookup function to detect
if the type is supported, and the printer itself.

Here is an example showing how a @code{std::string} printer might be
written.  @xref{Pretty Printing API}, for details on the API this class
must provide.

@smallexample
class StdStringPrinter(object):
    "Print a std::string"

    def __init__(self, val):
        self.val = val

    def to_string(self):
        return self.val['_M_dataplus']['_M_p']

    def display_hint(self):
        return 'string'
@end smallexample

And here is an example showing how a lookup function for the printer
example above might be written.

@smallexample
def str_lookup_function(val):
    lookup_tag = val.type.tag
    if lookup_tag == None:
        return None
    regex = re.compile("^std::basic_string<char,.*>$")
    if regex.match(lookup_tag):
        return StdStringPrinter(val)
    return None
@end smallexample

The example lookup function extracts the value's type, and attempts to
match it to a type that it can pretty-print.  If it is a type the
printer can pretty-print, it will return a printer object.  If not, it
returns @code{None}.

We recommend that you put your core pretty-printers into a Python
package.  If your pretty-printers are for use with a library, we
further recommend embedding a version number into the package name.
This practice will enable @value{GDBN} to load multiple versions of
your pretty-printers at the same time, because they will have
different names.

You should write auto-loaded code (@pxref{Python Auto-loading}) such that it
can be evaluated multiple times without changing its meaning.  An
ideal auto-load file will consist solely of @code{import}s of your
printer modules, followed by a call to a register pretty-printers with
the current objfile.

Taken as a whole, this approach will scale nicely to multiple
inferiors, each potentially using a different library version.
Embedding a version number in the Python package name will ensure that
@value{GDBN} is able to load both sets of printers simultaneously.
Then, because the search for pretty-printers is done by objfile, and
because your auto-loaded code took care to register your library's
printers with a specific objfile, @value{GDBN} will find the correct
printers for the specific version of the library used by each
inferior.

To continue the @code{std::string} example (@pxref{Pretty Printing API}),
this code might appear in @code{gdb.libstdcxx.v6}:

@smallexample
def register_printers(objfile):
    objfile.pretty_printers.append(str_lookup_function)
@end smallexample

@noindent
And then the corresponding contents of the auto-load file would be:

@smallexample
import gdb.libstdcxx.v6
gdb.libstdcxx.v6.register_printers(gdb.current_objfile())
@end smallexample

The previous example illustrates a basic pretty-printer.
There are a few things that can be improved on.
The printer doesn't have a name, making it hard to identify in a
list of installed printers.  The lookup function has a name, but
lookup functions can have arbitrary, even identical, names.

Second, the printer only handles one type, whereas a library typically has
several types.  One could install a lookup function for each desired type
in the library, but one could also have a single lookup function recognize
several types.  The latter is the conventional way this is handled.
If a pretty-printer can handle multiple data types, then its
@dfn{subprinters} are the printers for the individual data types.

The @code{gdb.printing} module provides a formal way of solving these
problems (@pxref{gdb.printing}).
Here is another example that handles multiple types.

These are the types we are going to pretty-print:

@smallexample
struct foo @{ int a, b; @};
struct bar @{ struct foo x, y; @};
@end smallexample

Here are the printers:

@smallexample
class fooPrinter:
    """Print a foo object."""

    def __init__(self, val):
        self.val = val

    def to_string(self):
        return ("a=<" + str(self.val["a"]) +
                "> b=<" + str(self.val["b"]) + ">")

class barPrinter:
    """Print a bar object."""

    def __init__(self, val):
        self.val = val

    def to_string(self):
        return ("x=<" + str(self.val["x"]) +
                "> y=<" + str(self.val["y"]) + ">")
@end smallexample

This example doesn't need a lookup function, that is handled by the
@code{gdb.printing} module.  Instead a function is provided to build up
the object that handles the lookup.

@smallexample
import gdb.printing

def build_pretty_printer():
    pp = gdb.printing.RegexpCollectionPrettyPrinter(
        "my_library")
    pp.add_printer('foo', '^foo$', fooPrinter)
    pp.add_printer('bar', '^bar$', barPrinter)
    return pp
@end smallexample

And here is the autoload support:

@smallexample
import gdb.printing
import my_library
gdb.printing.register_pretty_printer(
    gdb.current_objfile(),
    my_library.build_pretty_printer())
@end smallexample

Finally, when this printer is loaded into @value{GDBN}, here is the
corresponding output of @samp{info pretty-printer}:

@smallexample
(gdb) info pretty-printer
my_library.so:
  my_library
    foo
    bar
@end smallexample

@node Inferiors In Python
@subsubsection Inferiors In Python
@cindex inferiors in Python

@findex gdb.Inferior
Programs which are being run under @value{GDBN} are called inferiors
(@pxref{Inferiors and Programs}).  Python scripts can access
information about and manipulate inferiors controlled by @value{GDBN}
via objects of the @code{gdb.Inferior} class.

The following inferior-related functions are available in the @code{gdb}
module:

@defun gdb.inferiors ()
Return a tuple containing all inferior objects.
@end defun

@defun gdb.selected_inferior ()
Return an object representing the current inferior.
@end defun

A @code{gdb.Inferior} object has the following attributes:

@table @code
@defvar Inferior.num
ID of inferior, as assigned by GDB.
@end defvar

@defvar Inferior.pid
Process ID of the inferior, as assigned by the underlying operating
system.
@end defvar

@defvar Inferior.was_attached
Boolean signaling whether the inferior was created using `attach', or
started by @value{GDBN} itself.
@end defvar
@end table

A @code{gdb.Inferior} object has the following methods:

@table @code
@defun Inferior.is_valid ()
Returns @code{True} if the @code{gdb.Inferior} object is valid,
@code{False} if not.  A @code{gdb.Inferior} object will become invalid
if the inferior no longer exists within @value{GDBN}.  All other
@code{gdb.Inferior} methods will throw an exception if it is invalid
at the time the method is called.
@end defun

@defun Inferior.threads ()
This method returns a tuple holding all the threads which are valid
when it is called.  If there are no valid threads, the method will
return an empty tuple.
@end defun

@findex Inferior.read_memory
@defun Inferior.read_memory (address, length)
Read @var{length} bytes of memory from the inferior, starting at
@var{address}.  Returns a buffer object, which behaves much like an array
or a string.  It can be modified and given to the
@code{Inferior.write_memory} function.
@end defun

@findex Inferior.write_memory
@defun Inferior.write_memory (address, buffer @r{[}, length@r{]})
Write the contents of @var{buffer} to the inferior, starting at
@var{address}.  The @var{buffer} parameter must be a Python object
which supports the buffer protocol, i.e., a string, an array or the
object returned from @code{Inferior.read_memory}.  If given, @var{length}
determines the number of bytes from @var{buffer} to be written.
@end defun

@findex gdb.search_memory
@defun Inferior.search_memory (address, length, pattern)
Search a region of the inferior memory starting at @var{address} with
the given @var{length} using the search pattern supplied in
@var{pattern}.  The @var{pattern} parameter must be a Python object
which supports the buffer protocol, i.e., a string, an array or the
object returned from @code{gdb.read_memory}.  Returns a Python @code{Long}
containing the address where the pattern was found, or @code{None} if
the pattern could not be found.
@end defun
@end table

@node Events In Python
@subsubsection Events In Python
@cindex inferior events in Python

@value{GDBN} provides a general event facility so that Python code can be
notified of various state changes, particularly changes that occur in
the inferior.

An @dfn{event} is just an object that describes some state change.  The
type of the object and its attributes will vary depending on the details
of the change.  All the existing events are described below.

In order to be notified of an event, you must register an event handler
with an @dfn{event registry}.  An event registry is an object in the
@code{gdb.events} module which dispatches particular events.  A registry
provides methods to register and unregister event handlers:

@table @code
@defun EventRegistry.connect (object)
Add the given callable @var{object} to the registry.  This object will be
called when an event corresponding to this registry occurs.
@end defun

@defun EventRegistry.disconnect (object)
Remove the given @var{object} from the registry.  Once removed, the object
will no longer receive notifications of events.
@end defun
@end table

Here is an example:

@smallexample
def exit_handler (event):
    print "event type: exit"
    print "exit code: %d" % (event.exit_code)

gdb.events.exited.connect (exit_handler)
@end smallexample

In the above example we connect our handler @code{exit_handler} to the
registry @code{events.exited}.  Once connected, @code{exit_handler} gets
called when the inferior exits.  The argument @dfn{event} in this example is
of type @code{gdb.ExitedEvent}.  As you can see in the example the
@code{ExitedEvent} object has an attribute which indicates the exit code of
the inferior.

The following is a listing of the event registries that are available and
details of the events they emit:

@table @code

@item events.cont
Emits @code{gdb.ThreadEvent}.

Some events can be thread specific when @value{GDBN} is running in non-stop
mode.  When represented in Python, these events all extend
@code{gdb.ThreadEvent}.  Note, this event is not emitted directly; instead,
events which are emitted by this or other modules might extend this event.
Examples of these events are @code{gdb.BreakpointEvent} and
@code{gdb.ContinueEvent}.

@table @code
@defvar ThreadEvent.inferior_thread
In non-stop mode this attribute will be set to the specific thread which was
involved in the emitted event. Otherwise, it will be set to @code{None}.
@end defvar
@end table

Emits @code{gdb.ContinueEvent} which extends @code{gdb.ThreadEvent}.

This event indicates that the inferior has been continued after a stop. For
inherited attribute refer to @code{gdb.ThreadEvent} above.

@item events.exited
Emits @code{events.ExitedEvent} which indicates that the inferior has exited.
@code{events.ExitedEvent} has two attributes:
@table @code
@defvar ExitedEvent.exit_code
An integer representing the exit code, if available, which the inferior 
has returned.  (The exit code could be unavailable if, for example,
@value{GDBN} detaches from the inferior.) If the exit code is unavailable,
the attribute does not exist.
@end defvar
@defvar ExitedEvent inferior
A reference to the inferior which triggered the @code{exited} event.
@end defvar
@end table

@item events.stop
Emits @code{gdb.StopEvent} which extends @code{gdb.ThreadEvent}.

Indicates that the inferior has stopped.  All events emitted by this registry
extend StopEvent.  As a child of @code{gdb.ThreadEvent}, @code{gdb.StopEvent}
will indicate the stopped thread when @value{GDBN} is running in non-stop
mode.  Refer to @code{gdb.ThreadEvent} above for more details.

Emits @code{gdb.SignalEvent} which extends @code{gdb.StopEvent}.

This event indicates that the inferior or one of its threads has received as
signal.  @code{gdb.SignalEvent} has the following attributes:

@table @code
@defvar SignalEvent.stop_signal
A string representing the signal received by the inferior.  A list of possible
signal values can be obtained by running the command @code{info signals} in
the @value{GDBN} command prompt.
@end defvar
@end table

Also emits  @code{gdb.BreakpointEvent} which extends @code{gdb.StopEvent}.

@code{gdb.BreakpointEvent} event indicates that one or more breakpoints have
been hit, and has the following attributes:

@table @code
@defvar BreakpointEvent.breakpoints
A sequence containing references to all the breakpoints (type 
@code{gdb.Breakpoint}) that were hit.
@xref{Breakpoints In Python}, for details of the @code{gdb.Breakpoint} object.
@end defvar
@defvar BreakpointEvent.breakpoint
A reference to the first breakpoint that was hit.
This function is maintained for backward compatibility and is now deprecated 
in favor of the @code{gdb.BreakpointEvent.breakpoints} attribute.
@end defvar
@end table

@item events.new_objfile
Emits @code{gdb.NewObjFileEvent} which indicates that a new object file has
been loaded by @value{GDBN}.  @code{gdb.NewObjFileEvent} has one attribute:

@table @code
@defvar NewObjFileEvent.new_objfile
A reference to the object file (@code{gdb.Objfile}) which has been loaded.
@xref{Objfiles In Python}, for details of the @code{gdb.Objfile} object.
@end defvar
@end table

@end table

@node Threads In Python
@subsubsection Threads In Python
@cindex threads in python

@findex gdb.InferiorThread
Python scripts can access information about, and manipulate inferior threads
controlled by @value{GDBN}, via objects of the @code{gdb.InferiorThread} class.

The following thread-related functions are available in the @code{gdb}
module:

@findex gdb.selected_thread
@defun gdb.selected_thread ()
This function returns the thread object for the selected thread.  If there
is no selected thread, this will return @code{None}.
@end defun

A @code{gdb.InferiorThread} object has the following attributes:

@table @code
@defvar InferiorThread.name
The name of the thread.  If the user specified a name using
@code{thread name}, then this returns that name.  Otherwise, if an
OS-supplied name is available, then it is returned.  Otherwise, this
returns @code{None}.

This attribute can be assigned to.  The new value must be a string
object, which sets the new name, or @code{None}, which removes any
user-specified thread name.
@end defvar

@defvar InferiorThread.num
ID of the thread, as assigned by GDB.
@end defvar

@defvar InferiorThread.ptid
ID of the thread, as assigned by the operating system.  This attribute is a
tuple containing three integers.  The first is the Process ID (PID); the second
is the Lightweight Process ID (LWPID), and the third is the Thread ID (TID).
Either the LWPID or TID may be 0, which indicates that the operating system
does not  use that identifier.
@end defvar
@end table

A @code{gdb.InferiorThread} object has the following methods:

@table @code
@defun InferiorThread.is_valid ()
Returns @code{True} if the @code{gdb.InferiorThread} object is valid,
@code{False} if not.  A @code{gdb.InferiorThread} object will become
invalid if the thread exits, or the inferior that the thread belongs
is deleted.  All other @code{gdb.InferiorThread} methods will throw an
exception if it is invalid at the time the method is called.
@end defun

@defun InferiorThread.switch ()
This changes @value{GDBN}'s currently selected thread to the one represented
by this object.
@end defun

@defun InferiorThread.is_stopped ()
Return a Boolean indicating whether the thread is stopped.
@end defun

@defun InferiorThread.is_running ()
Return a Boolean indicating whether the thread is running.
@end defun

@defun InferiorThread.is_exited ()
Return a Boolean indicating whether the thread is exited.
@end defun
@end table

@node Commands In Python
@subsubsection Commands In Python

@cindex commands in python
@cindex python commands
You can implement new @value{GDBN} CLI commands in Python.  A CLI
command is implemented using an instance of the @code{gdb.Command}
class, most commonly using a subclass.

@defun Command.__init__ (name, @var{command_class} @r{[}, @var{completer_class} @r{[}, @var{prefix}@r{]]})
The object initializer for @code{Command} registers the new command
with @value{GDBN}.  This initializer is normally invoked from the
subclass' own @code{__init__} method.

@var{name} is the name of the command.  If @var{name} consists of
multiple words, then the initial words are looked for as prefix
commands.  In this case, if one of the prefix commands does not exist,
an exception is raised.

There is no support for multi-line commands.

@var{command_class} should be one of the @samp{COMMAND_} constants
defined below.  This argument tells @value{GDBN} how to categorize the
new command in the help system.

@var{completer_class} is an optional argument.  If given, it should be
one of the @samp{COMPLETE_} constants defined below.  This argument
tells @value{GDBN} how to perform completion for this command.  If not
given, @value{GDBN} will attempt to complete using the object's
@code{complete} method (see below); if no such method is found, an
error will occur when completion is attempted.

@var{prefix} is an optional argument.  If @code{True}, then the new
command is a prefix command; sub-commands of this command may be
registered.

The help text for the new command is taken from the Python
documentation string for the command's class, if there is one.  If no
documentation string is provided, the default value ``This command is
not documented.'' is used.
@end defun

@cindex don't repeat Python command
@defun Command.dont_repeat ()
By default, a @value{GDBN} command is repeated when the user enters a
blank line at the command prompt.  A command can suppress this
behavior by invoking the @code{dont_repeat} method.  This is similar
to the user command @code{dont-repeat}, see @ref{Define, dont-repeat}.
@end defun

@defun Command.invoke (argument, from_tty)
This method is called by @value{GDBN} when this command is invoked.

@var{argument} is a string.  It is the argument to the command, after
leading and trailing whitespace has been stripped.

@var{from_tty} is a boolean argument.  When true, this means that the
command was entered by the user at the terminal; when false it means
that the command came from elsewhere.

If this method throws an exception, it is turned into a @value{GDBN}
@code{error} call.  Otherwise, the return value is ignored.

@findex gdb.string_to_argv
To break @var{argument} up into an argv-like string use
@code{gdb.string_to_argv}.  This function behaves identically to
@value{GDBN}'s internal argument lexer @code{buildargv}.
It is recommended to use this for consistency.
Arguments are separated by spaces and may be quoted.
Example:

@smallexample
print gdb.string_to_argv ("1 2\ \\\"3 '4 \"5' \"6 '7\"")
['1', '2 "3', '4 "5', "6 '7"]
@end smallexample

@end defun

@cindex completion of Python commands
@defun Command.complete (text, word)
This method is called by @value{GDBN} when the user attempts
completion on this command.  All forms of completion are handled by
this method, that is, the @key{TAB} and @key{M-?} key bindings
(@pxref{Completion}), and the @code{complete} command (@pxref{Help,
complete}).

The arguments @var{text} and @var{word} are both strings.  @var{text}
holds the complete command line up to the cursor's location.
@var{word} holds the last word of the command line; this is computed
using a word-breaking heuristic.

The @code{complete} method can return several values:
@itemize @bullet
@item
If the return value is a sequence, the contents of the sequence are
used as the completions.  It is up to @code{complete} to ensure that the
contents actually do complete the word.  A zero-length sequence is
allowed, it means that there were no completions available.  Only
string elements of the sequence are used; other elements in the
sequence are ignored.

@item
If the return value is one of the @samp{COMPLETE_} constants defined
below, then the corresponding @value{GDBN}-internal completion
function is invoked, and its result is used.

@item
All other results are treated as though there were no available
completions.
@end itemize
@end defun

When a new command is registered, it must be declared as a member of
some general class of commands.  This is used to classify top-level
commands in the on-line help system; note that prefix commands are not
listed under their own category but rather that of their top-level
command.  The available classifications are represented by constants
defined in the @code{gdb} module:

@table @code
@findex COMMAND_NONE
@findex gdb.COMMAND_NONE
@item gdb.COMMAND_NONE
The command does not belong to any particular class.  A command in
this category will not be displayed in any of the help categories.

@findex COMMAND_RUNNING
@findex gdb.COMMAND_RUNNING
@item gdb.COMMAND_RUNNING
The command is related to running the inferior.  For example,
@code{start}, @code{step}, and @code{continue} are in this category.
Type @kbd{help running} at the @value{GDBN} prompt to see a list of
commands in this category.

@findex COMMAND_DATA
@findex gdb.COMMAND_DATA
@item gdb.COMMAND_DATA
The command is related to data or variables.  For example,
@code{call}, @code{find}, and @code{print} are in this category.  Type
@kbd{help data} at the @value{GDBN} prompt to see a list of commands
in this category.

@findex COMMAND_STACK
@findex gdb.COMMAND_STACK
@item gdb.COMMAND_STACK
The command has to do with manipulation of the stack.  For example,
@code{backtrace}, @code{frame}, and @code{return} are in this
category.  Type @kbd{help stack} at the @value{GDBN} prompt to see a
list of commands in this category.

@findex COMMAND_FILES
@findex gdb.COMMAND_FILES
@item gdb.COMMAND_FILES
This class is used for file-related commands.  For example,
@code{file}, @code{list} and @code{section} are in this category.
Type @kbd{help files} at the @value{GDBN} prompt to see a list of
commands in this category.

@findex COMMAND_SUPPORT
@findex gdb.COMMAND_SUPPORT
@item gdb.COMMAND_SUPPORT
This should be used for ``support facilities'', generally meaning
things that are useful to the user when interacting with @value{GDBN},
but not related to the state of the inferior.  For example,
@code{help}, @code{make}, and @code{shell} are in this category.  Type
@kbd{help support} at the @value{GDBN} prompt to see a list of
commands in this category.

@findex COMMAND_STATUS
@findex gdb.COMMAND_STATUS
@item gdb.COMMAND_STATUS
The command is an @samp{info}-related command, that is, related to the
state of @value{GDBN} itself.  For example, @code{info}, @code{macro},
and @code{show} are in this category.  Type @kbd{help status} at the
@value{GDBN} prompt to see a list of commands in this category.

@findex COMMAND_BREAKPOINTS
@findex gdb.COMMAND_BREAKPOINTS
@item gdb.COMMAND_BREAKPOINTS
The command has to do with breakpoints.  For example, @code{break},
@code{clear}, and @code{delete} are in this category.  Type @kbd{help
breakpoints} at the @value{GDBN} prompt to see a list of commands in
this category.

@findex COMMAND_TRACEPOINTS
@findex gdb.COMMAND_TRACEPOINTS
@item gdb.COMMAND_TRACEPOINTS
The command has to do with tracepoints.  For example, @code{trace},
@code{actions}, and @code{tfind} are in this category.  Type
@kbd{help tracepoints} at the @value{GDBN} prompt to see a list of
commands in this category.

@findex COMMAND_USER
@findex gdb.COMMAND_USER
@item gdb.COMMAND_USER
The command is a general purpose command for the user, and typically
does not fit in one of the other categories.
Type @kbd{help user-defined} at the @value{GDBN} prompt to see
a list of commands in this category, as well as the list of gdb macros
(@pxref{Sequences}).

@findex COMMAND_OBSCURE
@findex gdb.COMMAND_OBSCURE
@item gdb.COMMAND_OBSCURE
The command is only used in unusual circumstances, or is not of
general interest to users.  For example, @code{checkpoint},
@code{fork}, and @code{stop} are in this category.  Type @kbd{help
obscure} at the @value{GDBN} prompt to see a list of commands in this
category.

@findex COMMAND_MAINTENANCE
@findex gdb.COMMAND_MAINTENANCE
@item gdb.COMMAND_MAINTENANCE
The command is only useful to @value{GDBN} maintainers.  The
@code{maintenance} and @code{flushregs} commands are in this category.
Type @kbd{help internals} at the @value{GDBN} prompt to see a list of
commands in this category.
@end table

A new command can use a predefined completion function, either by
specifying it via an argument at initialization, or by returning it
from the @code{complete} method.  These predefined completion
constants are all defined in the @code{gdb} module:

@table @code
@findex COMPLETE_NONE
@findex gdb.COMPLETE_NONE
@item gdb.COMPLETE_NONE
This constant means that no completion should be done.

@findex COMPLETE_FILENAME
@findex gdb.COMPLETE_FILENAME
@item gdb.COMPLETE_FILENAME
This constant means that filename completion should be performed.

@findex COMPLETE_LOCATION
@findex gdb.COMPLETE_LOCATION
@item gdb.COMPLETE_LOCATION
This constant means that location completion should be done.
@xref{Specify Location}.

@findex COMPLETE_COMMAND
@findex gdb.COMPLETE_COMMAND
@item gdb.COMPLETE_COMMAND
This constant means that completion should examine @value{GDBN}
command names.

@findex COMPLETE_SYMBOL
@findex gdb.COMPLETE_SYMBOL
@item gdb.COMPLETE_SYMBOL
This constant means that completion should be done using symbol names
as the source.
@end table

The following code snippet shows how a trivial CLI command can be
implemented in Python:

@smallexample
class HelloWorld (gdb.Command):
  """Greet the whole world."""

  def __init__ (self):
    super (HelloWorld, self).__init__ ("hello-world", gdb.COMMAND_USER)

  def invoke (self, arg, from_tty):
    print "Hello, World!"

HelloWorld ()
@end smallexample

The last line instantiates the class, and is necessary to trigger the
registration of the command with @value{GDBN}.  Depending on how the
Python code is read into @value{GDBN}, you may need to import the
@code{gdb} module explicitly.

@node Parameters In Python
@subsubsection Parameters In Python

@cindex parameters in python
@cindex python parameters
@tindex gdb.Parameter
@tindex Parameter
You can implement new @value{GDBN} parameters using Python.  A new
parameter is implemented as an instance of the @code{gdb.Parameter}
class.

Parameters are exposed to the user via the @code{set} and
@code{show} commands.  @xref{Help}.

There are many parameters that already exist and can be set in
@value{GDBN}.  Two examples are: @code{set follow fork} and
@code{set charset}.  Setting these parameters influences certain
behavior in @value{GDBN}.  Similarly, you can define parameters that
can be used to influence behavior in custom Python scripts and commands.

@defun Parameter.__init__ (name, @var{command-class}, @var{parameter-class} @r{[}, @var{enum-sequence}@r{]})
The object initializer for @code{Parameter} registers the new
parameter with @value{GDBN}.  This initializer is normally invoked
from the subclass' own @code{__init__} method.

@var{name} is the name of the new parameter.  If @var{name} consists
of multiple words, then the initial words are looked for as prefix
parameters.  An example of this can be illustrated with the
@code{set print} set of parameters.  If @var{name} is
@code{print foo}, then @code{print} will be searched as the prefix
parameter.  In this case the parameter can subsequently be accessed in
@value{GDBN} as @code{set print foo}.

If @var{name} consists of multiple words, and no prefix parameter group
can be found, an exception is raised.

@var{command-class} should be one of the @samp{COMMAND_} constants
(@pxref{Commands In Python}).  This argument tells @value{GDBN} how to
categorize the new parameter in the help system.

@var{parameter-class} should be one of the @samp{PARAM_} constants
defined below.  This argument tells @value{GDBN} the type of the new
parameter; this information is used for input validation and
completion.

If @var{parameter-class} is @code{PARAM_ENUM}, then
@var{enum-sequence} must be a sequence of strings.  These strings
represent the possible values for the parameter.

If @var{parameter-class} is not @code{PARAM_ENUM}, then the presence
of a fourth argument will cause an exception to be thrown.

The help text for the new parameter is taken from the Python
documentation string for the parameter's class, if there is one.  If
there is no documentation string, a default value is used.
@end defun

@defvar Parameter.set_doc
If this attribute exists, and is a string, then its value is used as
the help text for this parameter's @code{set} command.  The value is
examined when @code{Parameter.__init__} is invoked; subsequent changes
have no effect.
@end defvar

@defvar Parameter.show_doc
If this attribute exists, and is a string, then its value is used as
the help text for this parameter's @code{show} command.  The value is
examined when @code{Parameter.__init__} is invoked; subsequent changes
have no effect.
@end defvar

@defvar Parameter.value
The @code{value} attribute holds the underlying value of the
parameter.  It can be read and assigned to just as any other
attribute.  @value{GDBN} does validation when assignments are made.
@end defvar

There are two methods that should be implemented in any
@code{Parameter} class.  These are:

@defun Parameter.get_set_string (self)
@value{GDBN} will call this method when a @var{parameter}'s value has
been changed via the @code{set} API (for example, @kbd{set foo off}).
The @code{value} attribute has already been populated with the new
value and may be used in output.  This method must return a string.
@end defun

@defun Parameter.get_show_string (self, svalue)
@value{GDBN} will call this method when a @var{parameter}'s
@code{show} API has been invoked (for example, @kbd{show foo}).  The
argument @code{svalue} receives the string representation of the
current value.  This method must return a string.
@end defun

When a new parameter is defined, its type must be specified.  The
available types are represented by constants defined in the @code{gdb}
module:

@table @code
@findex PARAM_BOOLEAN
@findex gdb.PARAM_BOOLEAN
@item gdb.PARAM_BOOLEAN
The value is a plain boolean.  The Python boolean values, @code{True}
and @code{False} are the only valid values.

@findex PARAM_AUTO_BOOLEAN
@findex gdb.PARAM_AUTO_BOOLEAN
@item gdb.PARAM_AUTO_BOOLEAN
The value has three possible states: true, false, and @samp{auto}.  In
Python, true and false are represented using boolean constants, and
@samp{auto} is represented using @code{None}.

@findex PARAM_UINTEGER
@findex gdb.PARAM_UINTEGER
@item gdb.PARAM_UINTEGER
The value is an unsigned integer.  The value of 0 should be
interpreted to mean ``unlimited''.

@findex PARAM_INTEGER
@findex gdb.PARAM_INTEGER
@item gdb.PARAM_INTEGER
The value is a signed integer.  The value of 0 should be interpreted
to mean ``unlimited''.

@findex PARAM_STRING
@findex gdb.PARAM_STRING
@item gdb.PARAM_STRING
The value is a string.  When the user modifies the string, any escape
sequences, such as @samp{\t}, @samp{\f}, and octal escapes, are
translated into corresponding characters and encoded into the current
host charset.

@findex PARAM_STRING_NOESCAPE
@findex gdb.PARAM_STRING_NOESCAPE
@item gdb.PARAM_STRING_NOESCAPE
The value is a string.  When the user modifies the string, escapes are
passed through untranslated.

@findex PARAM_OPTIONAL_FILENAME
@findex gdb.PARAM_OPTIONAL_FILENAME
@item gdb.PARAM_OPTIONAL_FILENAME
The value is a either a filename (a string), or @code{None}.

@findex PARAM_FILENAME
@findex gdb.PARAM_FILENAME
@item gdb.PARAM_FILENAME
The value is a filename.  This is just like
@code{PARAM_STRING_NOESCAPE}, but uses file names for completion.

@findex PARAM_ZINTEGER
@findex gdb.PARAM_ZINTEGER
@item gdb.PARAM_ZINTEGER
The value is an integer.  This is like @code{PARAM_INTEGER}, except 0
is interpreted as itself.

@findex PARAM_ENUM
@findex gdb.PARAM_ENUM
@item gdb.PARAM_ENUM
The value is a string, which must be one of a collection string
constants provided when the parameter is created.
@end table

@node Functions In Python
@subsubsection Writing new convenience functions

@cindex writing convenience functions
@cindex convenience functions in python
@cindex python convenience functions
@tindex gdb.Function
@tindex Function
You can implement new convenience functions (@pxref{Convenience Vars})
in Python.  A convenience function is an instance of a subclass of the
class @code{gdb.Function}.

@defun Function.__init__ (name)
The initializer for @code{Function} registers the new function with
@value{GDBN}.  The argument @var{name} is the name of the function,
a string.  The function will be visible to the user as a convenience
variable of type @code{internal function}, whose name is the same as
the given @var{name}.

The documentation for the new function is taken from the documentation
string for the new class.
@end defun

@defun Function.invoke (@var{*args})
When a convenience function is evaluated, its arguments are converted
to instances of @code{gdb.Value}, and then the function's
@code{invoke} method is called.  Note that @value{GDBN} does not
predetermine the arity of convenience functions.  Instead, all
available arguments are passed to @code{invoke}, following the
standard Python calling convention.  In particular, a convenience
function can have default values for parameters without ill effect.

The return value of this method is used as its value in the enclosing
expression.  If an ordinary Python value is returned, it is converted
to a @code{gdb.Value} following the usual rules.
@end defun

The following code snippet shows how a trivial convenience function can
be implemented in Python:

@smallexample
class Greet (gdb.Function):
  """Return string to greet someone.
Takes a name as argument."""

  def __init__ (self):
    super (Greet, self).__init__ ("greet")

  def invoke (self, name):
    return "Hello, %s!" % name.string ()

Greet ()
@end smallexample

The last line instantiates the class, and is necessary to trigger the
registration of the function with @value{GDBN}.  Depending on how the
Python code is read into @value{GDBN}, you may need to import the
@code{gdb} module explicitly.

@node Progspaces In Python
@subsubsection Program Spaces In Python

@cindex progspaces in python
@tindex gdb.Progspace
@tindex Progspace
A program space, or @dfn{progspace}, represents a symbolic view
of an address space.
It consists of all of the objfiles of the program.
@xref{Objfiles In Python}.
@xref{Inferiors and Programs, program spaces}, for more details
about program spaces.

The following progspace-related functions are available in the
@code{gdb} module:

@findex gdb.current_progspace
@defun gdb.current_progspace ()
This function returns the program space of the currently selected inferior.
@xref{Inferiors and Programs}.
@end defun

@findex gdb.progspaces
@defun gdb.progspaces ()
Return a sequence of all the progspaces currently known to @value{GDBN}.
@end defun

Each progspace is represented by an instance of the @code{gdb.Progspace}
class.

@defvar Progspace.filename
The file name of the progspace as a string.
@end defvar

@defvar Progspace.pretty_printers
The @code{pretty_printers} attribute is a list of functions.  It is
used to look up pretty-printers.  A @code{Value} is passed to each
function in order; if the function returns @code{None}, then the
search continues.  Otherwise, the return value should be an object
which is used to format the value.  @xref{Pretty Printing API}, for more
information.
@end defvar

@node Objfiles In Python
@subsubsection Objfiles In Python

@cindex objfiles in python
@tindex gdb.Objfile
@tindex Objfile
@value{GDBN} loads symbols for an inferior from various
symbol-containing files (@pxref{Files}).  These include the primary
executable file, any shared libraries used by the inferior, and any
separate debug info files (@pxref{Separate Debug Files}).
@value{GDBN} calls these symbol-containing files @dfn{objfiles}.

The following objfile-related functions are available in the
@code{gdb} module:

@findex gdb.current_objfile
@defun gdb.current_objfile ()
When auto-loading a Python script (@pxref{Python Auto-loading}), @value{GDBN}
sets the ``current objfile'' to the corresponding objfile.  This
function returns the current objfile.  If there is no current objfile,
this function returns @code{None}.
@end defun

@findex gdb.objfiles
@defun gdb.objfiles ()
Return a sequence of all the objfiles current known to @value{GDBN}.
@xref{Objfiles In Python}.
@end defun

Each objfile is represented by an instance of the @code{gdb.Objfile}
class.

@defvar Objfile.filename
The file name of the objfile as a string.
@end defvar

@defvar Objfile.pretty_printers
The @code{pretty_printers} attribute is a list of functions.  It is
used to look up pretty-printers.  A @code{Value} is passed to each
function in order; if the function returns @code{None}, then the
search continues.  Otherwise, the return value should be an object
which is used to format the value.  @xref{Pretty Printing API}, for more
information.
@end defvar

A @code{gdb.Objfile} object has the following methods:

@defun Objfile.is_valid ()
Returns @code{True} if the @code{gdb.Objfile} object is valid,
@code{False} if not.  A @code{gdb.Objfile} object can become invalid
if the object file it refers to is not loaded in @value{GDBN} any
longer.  All other @code{gdb.Objfile} methods will throw an exception
if it is invalid at the time the method is called.
@end defun

@node Frames In Python
@subsubsection Accessing inferior stack frames from Python.

@cindex frames in python
When the debugged program stops, @value{GDBN} is able to analyze its call
stack (@pxref{Frames,,Stack frames}).  The @code{gdb.Frame} class
represents a frame in the stack.  A @code{gdb.Frame} object is only valid
while its corresponding frame exists in the inferior's stack.  If you try
to use an invalid frame object, @value{GDBN} will throw a @code{gdb.error}
exception (@pxref{Exception Handling}).

Two @code{gdb.Frame} objects can be compared for equality with the @code{==}
operator, like:

@smallexample
(@value{GDBP}) python print gdb.newest_frame() == gdb.selected_frame ()
True
@end smallexample

The following frame-related functions are available in the @code{gdb} module:

@findex gdb.selected_frame
@defun gdb.selected_frame ()
Return the selected frame object.  (@pxref{Selection,,Selecting a Frame}).
@end defun

@findex gdb.newest_frame
@defun gdb.newest_frame ()
Return the newest frame object for the selected thread.
@end defun

@defun gdb.frame_stop_reason_string (reason)
Return a string explaining the reason why @value{GDBN} stopped unwinding
frames, as expressed by the given @var{reason} code (an integer, see the
@code{unwind_stop_reason} method further down in this section).
@end defun

A @code{gdb.Frame} object has the following methods:

@table @code
@defun Frame.is_valid ()
Returns true if the @code{gdb.Frame} object is valid, false if not.
A frame object can become invalid if the frame it refers to doesn't
exist anymore in the inferior.  All @code{gdb.Frame} methods will throw
an exception if it is invalid at the time the method is called.
@end defun

@defun Frame.name ()
Returns the function name of the frame, or @code{None} if it can't be
obtained.
@end defun

@defun Frame.type ()
Returns the type of the frame.  The value can be one of:
@table @code
@item gdb.NORMAL_FRAME
An ordinary stack frame.

@item gdb.DUMMY_FRAME
A fake stack frame that was created by @value{GDBN} when performing an
inferior function call.

@item gdb.INLINE_FRAME
A frame representing an inlined function.  The function was inlined
into a @code{gdb.NORMAL_FRAME} that is older than this one.

@item gdb.TAILCALL_FRAME
A frame representing a tail call.  @xref{Tail Call Frames}.

@item gdb.SIGTRAMP_FRAME
A signal trampoline frame.  This is the frame created by the OS when
it calls into a signal handler.

@item gdb.ARCH_FRAME
A fake stack frame representing a cross-architecture call.

@item gdb.SENTINEL_FRAME
This is like @code{gdb.NORMAL_FRAME}, but it is only used for the
newest frame.
@end table
@end defun

@defun Frame.unwind_stop_reason ()
Return an integer representing the reason why it's not possible to find
more frames toward the outermost frame.  Use
@code{gdb.frame_stop_reason_string} to convert the value returned by this
function to a string. The value can be one of:

@table @code
@item gdb.FRAME_UNWIND_NO_REASON
No particular reason (older frames should be available).

@item gdb.FRAME_UNWIND_NULL_ID
The previous frame's analyzer returns an invalid result.

@item gdb.FRAME_UNWIND_OUTERMOST
This frame is the outermost.

@item gdb.FRAME_UNWIND_UNAVAILABLE
Cannot unwind further, because that would require knowing the 
values of registers or memory that have not been collected.

@item gdb.FRAME_UNWIND_INNER_ID
This frame ID looks like it ought to belong to a NEXT frame,
but we got it for a PREV frame.  Normally, this is a sign of
unwinder failure.  It could also indicate stack corruption.

@item gdb.FRAME_UNWIND_SAME_ID
This frame has the same ID as the previous one.  That means
that unwinding further would almost certainly give us another
frame with exactly the same ID, so break the chain.  Normally,
this is a sign of unwinder failure.  It could also indicate
stack corruption.

@item gdb.FRAME_UNWIND_NO_SAVED_PC
The frame unwinder did not find any saved PC, but we needed
one to unwind further.

@item gdb.FRAME_UNWIND_FIRST_ERROR
Any stop reason greater or equal to this value indicates some kind
of error.  This special value facilitates writing code that tests
for errors in unwinding in a way that will work correctly even if
the list of the other values is modified in future @value{GDBN}
versions.  Using it, you could write:
@smallexample
reason = gdb.selected_frame().unwind_stop_reason ()
reason_str =  gdb.frame_stop_reason_string (reason)
if reason >=  gdb.FRAME_UNWIND_FIRST_ERROR:
    print "An error occured: %s" % reason_str
@end smallexample
@end table

@end defun

@defun Frame.pc ()
Returns the frame's resume address.
@end defun

@defun Frame.block ()
Return the frame's code block.  @xref{Blocks In Python}.
@end defun

@defun Frame.function ()
Return the symbol for the function corresponding to this frame.
@xref{Symbols In Python}.
@end defun

@defun Frame.older ()
Return the frame that called this frame.
@end defun

@defun Frame.newer ()
Return the frame called by this frame.
@end defun

@defun Frame.find_sal ()
Return the frame's symtab and line object.
@xref{Symbol Tables In Python}.
@end defun

@defun Frame.read_var (variable @r{[}, block@r{]})
Return the value of @var{variable} in this frame.  If the optional
argument @var{block} is provided, search for the variable from that
block; otherwise start at the frame's current block (which is
determined by the frame's current program counter).  @var{variable}
must be a string or a @code{gdb.Symbol} object.  @var{block} must be a
@code{gdb.Block} object.
@end defun

@defun Frame.select ()
Set this frame to be the selected frame.  @xref{Stack, ,Examining the
Stack}.
@end defun
@end table

@node Blocks In Python
@subsubsection Accessing frame blocks from Python.

@cindex blocks in python
@tindex gdb.Block

Within each frame, @value{GDBN} maintains information on each block
stored in that frame.  These blocks are organized hierarchically, and
are represented individually in Python as a @code{gdb.Block}.
Please see @ref{Frames In Python}, for a more in-depth discussion on
frames.  Furthermore, see @ref{Stack, ,Examining the Stack}, for more
detailed technical information on @value{GDBN}'s book-keeping of the
stack.

A @code{gdb.Block} is iterable.  The iterator returns the symbols
(@pxref{Symbols In Python}) local to the block.  Python programs
should not assume that a specific block object will always contain a
given symbol, since changes in @value{GDBN} features and
infrastructure may cause symbols move across blocks in a symbol
table.

The following block-related functions are available in the @code{gdb}
module:

@findex gdb.block_for_pc
@defun gdb.block_for_pc (pc)
Return the @code{gdb.Block} containing the given @var{pc} value.  If the
block cannot be found for the @var{pc} value specified, the function
will return @code{None}.
@end defun

A @code{gdb.Block} object has the following methods:

@table @code
@defun Block.is_valid ()
Returns @code{True} if the @code{gdb.Block} object is valid,
@code{False} if not.  A block object can become invalid if the block it
refers to doesn't exist anymore in the inferior.  All other
@code{gdb.Block} methods will throw an exception if it is invalid at
the time the method is called.  The block's validity is also checked
during iteration over symbols of the block.
@end defun
@end table

A @code{gdb.Block} object has the following attributes:

@table @code
@defvar Block.start
The start address of the block.  This attribute is not writable.
@end defvar

@defvar Block.end
The end address of the block.  This attribute is not writable.
@end defvar

@defvar Block.function
The name of the block represented as a @code{gdb.Symbol}.  If the
block is not named, then this attribute holds @code{None}.  This
attribute is not writable.
@end defvar

@defvar Block.superblock
The block containing this block.  If this parent block does not exist,
this attribute holds @code{None}.  This attribute is not writable.
@end defvar

@defvar Block.global_block
The global block associated with this block.  This attribute is not
writable.
@end defvar

@defvar Block.static_block
The static block associated with this block.  This attribute is not
writable.
@end defvar

@defvar Block.is_global
@code{True} if the @code{gdb.Block} object is a global block,
@code{False} if not.  This attribute is not
writable.
@end defvar

@defvar Block.is_static
@code{True} if the @code{gdb.Block} object is a static block,
@code{False} if not.  This attribute is not writable.
@end defvar
@end table

@node Symbols In Python
@subsubsection Python representation of Symbols.

@cindex symbols in python
@tindex gdb.Symbol

@value{GDBN} represents every variable, function and type as an
entry in a symbol table.  @xref{Symbols, ,Examining the Symbol Table}.
Similarly, Python represents these symbols in @value{GDBN} with the
@code{gdb.Symbol} object.

The following symbol-related functions are available in the @code{gdb}
module:

@findex gdb.lookup_symbol
@defun gdb.lookup_symbol (name @r{[}, block @r{[}, domain@r{]]})
This function searches for a symbol by name.  The search scope can be
restricted to the parameters defined in the optional domain and block
arguments.

@var{name} is the name of the symbol.  It must be a string.  The
optional @var{block} argument restricts the search to symbols visible
in that @var{block}.  The @var{block} argument must be a
@code{gdb.Block} object.  If omitted, the block for the current frame
is used.  The optional @var{domain} argument restricts
the search to the domain type.  The @var{domain} argument must be a
domain constant defined in the @code{gdb} module and described later
in this chapter.

The result is a tuple of two elements.
The first element is a @code{gdb.Symbol} object or @code{None} if the symbol
is not found.
If the symbol is found, the second element is @code{True} if the symbol
is a field of a method's object (e.g., @code{this} in C@t{++}),
otherwise it is @code{False}.
If the symbol is not found, the second element is @code{False}.
@end defun

@findex gdb.lookup_global_symbol
@defun gdb.lookup_global_symbol (name @r{[}, domain@r{]})
This function searches for a global symbol by name.
The search scope can be restricted to by the domain argument.

@var{name} is the name of the symbol.  It must be a string.
The optional @var{domain} argument restricts the search to the domain type.
The @var{domain} argument must be a domain constant defined in the @code{gdb}
module and described later in this chapter.

The result is a @code{gdb.Symbol} object or @code{None} if the symbol
is not found.
@end defun

A @code{gdb.Symbol} object has the following attributes:

@table @code
@defvar Symbol.type
The type of the symbol or @code{None} if no type is recorded.
This attribute is represented as a @code{gdb.Type} object.
@xref{Types In Python}.  This attribute is not writable.
@end defvar

@defvar Symbol.symtab
The symbol table in which the symbol appears.  This attribute is
represented as a @code{gdb.Symtab} object.  @xref{Symbol Tables In
Python}.  This attribute is not writable.
@end defvar

@defvar Symbol.line
The line number in the source code at which the symbol was defined.
This is an integer.
@end defvar

@defvar Symbol.name
The name of the symbol as a string.  This attribute is not writable.
@end defvar

@defvar Symbol.linkage_name
The name of the symbol, as used by the linker (i.e., may be mangled).
This attribute is not writable.
@end defvar

@defvar Symbol.print_name
The name of the symbol in a form suitable for output.  This is either
@code{name} or @code{linkage_name}, depending on whether the user
asked @value{GDBN} to display demangled or mangled names.
@end defvar

@defvar Symbol.addr_class
The address class of the symbol.  This classifies how to find the value
of a symbol.  Each address class is a constant defined in the
@code{gdb} module and described later in this chapter.
@end defvar

@defvar Symbol.needs_frame
This is @code{True} if evaluating this symbol's value requires a frame
(@pxref{Frames In Python}) and @code{False} otherwise.  Typically,
local variables will require a frame, but other symbols will not.
@end defvar

@defvar Symbol.is_argument
@code{True} if the symbol is an argument of a function.
@end defvar

@defvar Symbol.is_constant
@code{True} if the symbol is a constant.
@end defvar

@defvar Symbol.is_function
@code{True} if the symbol is a function or a method.
@end defvar

@defvar Symbol.is_variable
@code{True} if the symbol is a variable.
@end defvar
@end table

A @code{gdb.Symbol} object has the following methods:

@table @code
@defun Symbol.is_valid ()
Returns @code{True} if the @code{gdb.Symbol} object is valid,
@code{False} if not.  A @code{gdb.Symbol} object can become invalid if
the symbol it refers to does not exist in @value{GDBN} any longer.
All other @code{gdb.Symbol} methods will throw an exception if it is
invalid at the time the method is called.
@end defun

@defun Symbol.value (@r{[}frame@r{]})
Compute the value of the symbol, as a @code{gdb.Value}.  For
functions, this computes the address of the function, cast to the
appropriate type.  If the symbol requires a frame in order to compute
its value, then @var{frame} must be given.  If @var{frame} is not
given, or if @var{frame} is invalid, then this method will throw an
exception.
@end defun
@end table

The available domain categories in @code{gdb.Symbol} are represented
as constants in the @code{gdb} module:

@table @code
@findex SYMBOL_UNDEF_DOMAIN
@findex gdb.SYMBOL_UNDEF_DOMAIN
@item gdb.SYMBOL_UNDEF_DOMAIN
This is used when a domain has not been discovered or none of the
following domains apply.  This usually indicates an error either
in the symbol information or in @value{GDBN}'s handling of symbols.
@findex SYMBOL_VAR_DOMAIN
@findex gdb.SYMBOL_VAR_DOMAIN
@item gdb.SYMBOL_VAR_DOMAIN
This domain contains variables, function names, typedef names and enum
type values.
@findex SYMBOL_STRUCT_DOMAIN
@findex gdb.SYMBOL_STRUCT_DOMAIN
@item gdb.SYMBOL_STRUCT_DOMAIN
This domain holds struct, union and enum type names.
@findex SYMBOL_LABEL_DOMAIN
@findex gdb.SYMBOL_LABEL_DOMAIN
@item gdb.SYMBOL_LABEL_DOMAIN
This domain contains names of labels (for gotos).
@findex SYMBOL_VARIABLES_DOMAIN
@findex gdb.SYMBOL_VARIABLES_DOMAIN
@item gdb.SYMBOL_VARIABLES_DOMAIN
This domain holds a subset of the @code{SYMBOLS_VAR_DOMAIN}; it
contains everything minus functions and types.
@findex SYMBOL_FUNCTIONS_DOMAIN
@findex gdb.SYMBOL_FUNCTIONS_DOMAIN
@item gdb.SYMBOL_FUNCTION_DOMAIN
This domain contains all functions.
@findex SYMBOL_TYPES_DOMAIN
@findex gdb.SYMBOL_TYPES_DOMAIN
@item gdb.SYMBOL_TYPES_DOMAIN
This domain contains all types.
@end table

The available address class categories in @code{gdb.Symbol} are represented
as constants in the @code{gdb} module:

@table @code
@findex SYMBOL_LOC_UNDEF
@findex gdb.SYMBOL_LOC_UNDEF
@item gdb.SYMBOL_LOC_UNDEF
If this is returned by address class, it indicates an error either in
the symbol information or in @value{GDBN}'s handling of symbols.
@findex SYMBOL_LOC_CONST
@findex gdb.SYMBOL_LOC_CONST
@item gdb.SYMBOL_LOC_CONST
Value is constant int.
@findex SYMBOL_LOC_STATIC
@findex gdb.SYMBOL_LOC_STATIC
@item gdb.SYMBOL_LOC_STATIC
Value is at a fixed address.
@findex SYMBOL_LOC_REGISTER
@findex gdb.SYMBOL_LOC_REGISTER
@item gdb.SYMBOL_LOC_REGISTER
Value is in a register.
@findex SYMBOL_LOC_ARG
@findex gdb.SYMBOL_LOC_ARG
@item gdb.SYMBOL_LOC_ARG
Value is an argument.  This value is at the offset stored within the
symbol inside the frame's argument list.
@findex SYMBOL_LOC_REF_ARG
@findex gdb.SYMBOL_LOC_REF_ARG
@item gdb.SYMBOL_LOC_REF_ARG
Value address is stored in the frame's argument list.  Just like
@code{LOC_ARG} except that the value's address is stored at the
offset, not the value itself.
@findex SYMBOL_LOC_REGPARM_ADDR
@findex gdb.SYMBOL_LOC_REGPARM_ADDR
@item gdb.SYMBOL_LOC_REGPARM_ADDR
Value is a specified register.  Just like @code{LOC_REGISTER} except
the register holds the address of the argument instead of the argument
itself.
@findex SYMBOL_LOC_LOCAL
@findex gdb.SYMBOL_LOC_LOCAL
@item gdb.SYMBOL_LOC_LOCAL
Value is a local variable.
@findex SYMBOL_LOC_TYPEDEF
@findex gdb.SYMBOL_LOC_TYPEDEF
@item gdb.SYMBOL_LOC_TYPEDEF
Value not used.  Symbols in the domain @code{SYMBOL_STRUCT_DOMAIN} all
have this class.
@findex SYMBOL_LOC_BLOCK
@findex gdb.SYMBOL_LOC_BLOCK
@item gdb.SYMBOL_LOC_BLOCK
Value is a block.
@findex SYMBOL_LOC_CONST_BYTES
@findex gdb.SYMBOL_LOC_CONST_BYTES
@item gdb.SYMBOL_LOC_CONST_BYTES
Value is a byte-sequence.
@findex SYMBOL_LOC_UNRESOLVED
@findex gdb.SYMBOL_LOC_UNRESOLVED
@item gdb.SYMBOL_LOC_UNRESOLVED
Value is at a fixed address, but the address of the variable has to be
determined from the minimal symbol table whenever the variable is
referenced.
@findex SYMBOL_LOC_OPTIMIZED_OUT
@findex gdb.SYMBOL_LOC_OPTIMIZED_OUT
@item gdb.SYMBOL_LOC_OPTIMIZED_OUT
The value does not actually exist in the program.
@findex SYMBOL_LOC_COMPUTED
@findex gdb.SYMBOL_LOC_COMPUTED
@item gdb.SYMBOL_LOC_COMPUTED
The value's address is a computed location.
@end table

@node Symbol Tables In Python
@subsubsection Symbol table representation in Python.

@cindex symbol tables in python
@tindex gdb.Symtab
@tindex gdb.Symtab_and_line

Access to symbol table data maintained by @value{GDBN} on the inferior
is exposed to Python via two objects: @code{gdb.Symtab_and_line} and
@code{gdb.Symtab}.  Symbol table and line data for a frame is returned
from the @code{find_sal} method in @code{gdb.Frame} object.
@xref{Frames In Python}.

For more information on @value{GDBN}'s symbol table management, see
@ref{Symbols, ,Examining the Symbol Table}, for more information.

A @code{gdb.Symtab_and_line} object has the following attributes:

@table @code
@defvar Symtab_and_line.symtab
The symbol table object (@code{gdb.Symtab}) for this frame.
This attribute is not writable.
@end defvar

@defvar Symtab_and_line.pc
Indicates the start of the address range occupied by code for the
current source line.  This attribute is not writable.
@end defvar

@defvar Symtab_and_line.last
Indicates the end of the address range occupied by code for the current
source line.  This attribute is not writable.
@end defvar

@defvar Symtab_and_line.line
Indicates the current line number for this object.  This
attribute is not writable.
@end defvar
@end table

A @code{gdb.Symtab_and_line} object has the following methods:

@table @code
@defun Symtab_and_line.is_valid ()
Returns @code{True} if the @code{gdb.Symtab_and_line} object is valid,
@code{False} if not.  A @code{gdb.Symtab_and_line} object can become
invalid if the Symbol table and line object it refers to does not
exist in @value{GDBN} any longer.  All other
@code{gdb.Symtab_and_line} methods will throw an exception if it is
invalid at the time the method is called.
@end defun
@end table

A @code{gdb.Symtab} object has the following attributes:

@table @code
@defvar Symtab.filename
The symbol table's source filename.  This attribute is not writable.
@end defvar

@defvar Symtab.objfile
The symbol table's backing object file.  @xref{Objfiles In Python}.
This attribute is not writable.
@end defvar
@end table

A @code{gdb.Symtab} object has the following methods:

@table @code
@defun Symtab.is_valid ()
Returns @code{True} if the @code{gdb.Symtab} object is valid,
@code{False} if not.  A @code{gdb.Symtab} object can become invalid if
the symbol table it refers to does not exist in @value{GDBN} any
longer.  All other @code{gdb.Symtab} methods will throw an exception
if it is invalid at the time the method is called.
@end defun

@defun Symtab.fullname ()
Return the symbol table's source absolute file name.
@end defun

@defun Symtab.global_block ()
Return the global block of the underlying symbol table.
@xref{Blocks In Python}.
@end defun

@defun Symtab.static_block ()
Return the static block of the underlying symbol table.
@xref{Blocks In Python}.
@end defun
@end table

@node Breakpoints In Python
@subsubsection Manipulating breakpoints using Python

@cindex breakpoints in python
@tindex gdb.Breakpoint

Python code can manipulate breakpoints via the @code{gdb.Breakpoint}
class.

@defun Breakpoint.__init__ (spec @r{[}, type @r{[}, wp_class @r{[},internal@r{]]]})
Create a new breakpoint.  @var{spec} is a string naming the
location of the breakpoint, or an expression that defines a
watchpoint.  The contents can be any location recognized by the
@code{break} command, or in the case of a watchpoint, by the @code{watch}
command.  The optional @var{type} denotes the breakpoint to create
from the types defined later in this chapter.  This argument can be
either: @code{gdb.BP_BREAKPOINT} or @code{gdb.BP_WATCHPOINT}.  @var{type}
defaults to @code{gdb.BP_BREAKPOINT}.  The optional @var{internal} argument
allows the breakpoint to become invisible to the user.  The breakpoint
will neither be reported when created, nor will it be listed in the
output from @code{info breakpoints} (but will be listed with the
@code{maint info breakpoints} command).  The optional @var{wp_class}
argument defines the class of watchpoint to create, if @var{type} is
@code{gdb.BP_WATCHPOINT}.  If a watchpoint class is not provided, it is
assumed to be a @code{gdb.WP_WRITE} class.
@end defun

@defun Breakpoint.stop (self)
The @code{gdb.Breakpoint} class can be sub-classed and, in
particular, you may choose to implement the @code{stop} method.
If this method is defined as a sub-class of @code{gdb.Breakpoint},
it will be called when the inferior reaches any location of a
breakpoint which instantiates that sub-class.  If the method returns
@code{True}, the inferior will be stopped at the location of the
breakpoint, otherwise the inferior will continue.

If there are multiple breakpoints at the same location with a
@code{stop} method, each one will be called regardless of the
return status of the previous.  This ensures that all @code{stop}
methods have a chance to execute at that location.  In this scenario
if one of the methods returns @code{True} but the others return
@code{False}, the inferior will still be stopped.

You should not alter the execution state of the inferior (i.e.@:, step,
next, etc.), alter the current frame context (i.e.@:, change the current
active frame), or alter, add or delete any breakpoint.  As a general
rule, you should not alter any data within @value{GDBN} or the inferior
at this time.

Example @code{stop} implementation:

@smallexample
class MyBreakpoint (gdb.Breakpoint):
      def stop (self):
        inf_val = gdb.parse_and_eval("foo")
        if inf_val == 3:
          return True
        return False
@end smallexample
@end defun

The available watchpoint types represented by constants are defined in the
@code{gdb} module:

@table @code
@findex WP_READ
@findex gdb.WP_READ
@item gdb.WP_READ
Read only watchpoint.

@findex WP_WRITE
@findex gdb.WP_WRITE
@item gdb.WP_WRITE
Write only watchpoint.

@findex WP_ACCESS
@findex gdb.WP_ACCESS
@item gdb.WP_ACCESS
Read/Write watchpoint.
@end table

@defun Breakpoint.is_valid ()
Return @code{True} if this @code{Breakpoint} object is valid,
@code{False} otherwise.  A @code{Breakpoint} object can become invalid
if the user deletes the breakpoint.  In this case, the object still
exists, but the underlying breakpoint does not.  In the cases of
watchpoint scope, the watchpoint remains valid even if execution of the
inferior leaves the scope of that watchpoint.
@end defun

@defun Breakpoint.delete
Permanently deletes the @value{GDBN} breakpoint.  This also
invalidates the Python @code{Breakpoint} object.  Any further access
to this object's attributes or methods will raise an error.
@end defun

@defvar Breakpoint.enabled
This attribute is @code{True} if the breakpoint is enabled, and
@code{False} otherwise.  This attribute is writable.
@end defvar

@defvar Breakpoint.silent
This attribute is @code{True} if the breakpoint is silent, and
@code{False} otherwise.  This attribute is writable.

Note that a breakpoint can also be silent if it has commands and the
first command is @code{silent}.  This is not reported by the
@code{silent} attribute.
@end defvar

@defvar Breakpoint.thread
If the breakpoint is thread-specific, this attribute holds the thread
id.  If the breakpoint is not thread-specific, this attribute is
@code{None}.  This attribute is writable.
@end defvar

@defvar Breakpoint.task
If the breakpoint is Ada task-specific, this attribute holds the Ada task
id.  If the breakpoint is not task-specific (or the underlying
language is not Ada), this attribute is @code{None}.  This attribute
is writable.
@end defvar

@defvar Breakpoint.ignore_count
This attribute holds the ignore count for the breakpoint, an integer.
This attribute is writable.
@end defvar

@defvar Breakpoint.number
This attribute holds the breakpoint's number --- the identifier used by
the user to manipulate the breakpoint.  This attribute is not writable.
@end defvar

@defvar Breakpoint.type
This attribute holds the breakpoint's type --- the identifier used to
determine the actual breakpoint type or use-case.  This attribute is not
writable.
@end defvar

@defvar Breakpoint.visible
This attribute tells whether the breakpoint is visible to the user
when set, or when the @samp{info breakpoints} command is run.  This
attribute is not writable.
@end defvar

The available types are represented by constants defined in the @code{gdb}
module:

@table @code
@findex BP_BREAKPOINT
@findex gdb.BP_BREAKPOINT
@item gdb.BP_BREAKPOINT
Normal code breakpoint.

@findex BP_WATCHPOINT
@findex gdb.BP_WATCHPOINT
@item gdb.BP_WATCHPOINT
Watchpoint breakpoint.

@findex BP_HARDWARE_WATCHPOINT
@findex gdb.BP_HARDWARE_WATCHPOINT
@item gdb.BP_HARDWARE_WATCHPOINT
Hardware assisted watchpoint.

@findex BP_READ_WATCHPOINT
@findex gdb.BP_READ_WATCHPOINT
@item gdb.BP_READ_WATCHPOINT
Hardware assisted read watchpoint.

@findex BP_ACCESS_WATCHPOINT
@findex gdb.BP_ACCESS_WATCHPOINT
@item gdb.BP_ACCESS_WATCHPOINT
Hardware assisted access watchpoint.
@end table

@defvar Breakpoint.hit_count
This attribute holds the hit count for the breakpoint, an integer.
This attribute is writable, but currently it can only be set to zero.
@end defvar

@defvar Breakpoint.location
This attribute holds the location of the breakpoint, as specified by
the user.  It is a string.  If the breakpoint does not have a location
(that is, it is a watchpoint) the attribute's value is @code{None}.  This
attribute is not writable.
@end defvar

@defvar Breakpoint.expression
This attribute holds a breakpoint expression, as specified by
the user.  It is a string.  If the breakpoint does not have an
expression (the breakpoint is not a watchpoint) the attribute's value
is @code{None}.  This attribute is not writable.
@end defvar

@defvar Breakpoint.condition
This attribute holds the condition of the breakpoint, as specified by
the user.  It is a string.  If there is no condition, this attribute's
value is @code{None}.  This attribute is writable.
@end defvar

@defvar Breakpoint.commands
This attribute holds the commands attached to the breakpoint.  If
there are commands, this attribute's value is a string holding all the
commands, separated by newlines.  If there are no commands, this
attribute is @code{None}.  This attribute is not writable.
@end defvar

@node Finish Breakpoints in Python
@subsubsection Finish Breakpoints

@cindex python finish breakpoints
@tindex gdb.FinishBreakpoint

A finish breakpoint is a temporary breakpoint set at the return address of
a frame, based on the @code{finish} command.  @code{gdb.FinishBreakpoint}
extends @code{gdb.Breakpoint}.  The underlying breakpoint will be disabled 
and deleted when the execution will run out of the breakpoint scope (i.e.@: 
@code{Breakpoint.stop} or @code{FinishBreakpoint.out_of_scope} triggered).
Finish breakpoints are thread specific and must be create with the right 
thread selected.  
 
@defun FinishBreakpoint.__init__ (@r{[}frame@r{]} @r{[}, internal@r{]})
Create a finish breakpoint at the return address of the @code{gdb.Frame}
object @var{frame}.  If @var{frame} is not provided, this defaults to the
newest frame.  The optional @var{internal} argument allows the breakpoint to
become invisible to the user.  @xref{Breakpoints In Python}, for further 
details about this argument.
@end defun

@defun FinishBreakpoint.out_of_scope (self)
In some circumstances (e.g.@: @code{longjmp}, C@t{++} exceptions, @value{GDBN} 
@code{return} command, @dots{}), a function may not properly terminate, and
thus never hit the finish breakpoint.  When @value{GDBN} notices such a
situation, the @code{out_of_scope} callback will be triggered.

You may want to sub-class @code{gdb.FinishBreakpoint} and override this
method:

@smallexample
class MyFinishBreakpoint (gdb.FinishBreakpoint)
    def stop (self):
        print "normal finish"
        return True
    
    def out_of_scope ():
        print "abnormal finish"
@end smallexample 
@end defun

@defvar FinishBreakpoint.return_value
When @value{GDBN} is stopped at a finish breakpoint and the frame 
used to build the @code{gdb.FinishBreakpoint} object had debug symbols, this
attribute will contain a @code{gdb.Value} object corresponding to the return
value of the function.  The value will be @code{None} if the function return 
type is @code{void} or if the return value was not computable.  This attribute
is not writable.
@end defvar

@node Lazy Strings In Python
@subsubsection Python representation of lazy strings.

@cindex lazy strings in python
@tindex gdb.LazyString

A @dfn{lazy string} is a string whose contents is not retrieved or
encoded until it is needed.

A @code{gdb.LazyString} is represented in @value{GDBN} as an
@code{address} that points to a region of memory, an @code{encoding}
that will be used to encode that region of memory, and a @code{length}
to delimit the region of memory that represents the string.  The
difference between a @code{gdb.LazyString} and a string wrapped within
a @code{gdb.Value} is that a @code{gdb.LazyString} will be treated
differently by @value{GDBN} when printing.  A @code{gdb.LazyString} is
retrieved and encoded during printing, while a @code{gdb.Value}
wrapping a string is immediately retrieved and encoded on creation.

A @code{gdb.LazyString} object has the following functions:

@defun LazyString.value ()
Convert the @code{gdb.LazyString} to a @code{gdb.Value}.  This value
will point to the string in memory, but will lose all the delayed
retrieval, encoding and handling that @value{GDBN} applies to a
@code{gdb.LazyString}.
@end defun

@defvar LazyString.address
This attribute holds the address of the string.  This attribute is not
writable.
@end defvar

@defvar LazyString.length
This attribute holds the length of the string in characters.  If the
length is -1, then the string will be fetched and encoded up to the
first null of appropriate width.  This attribute is not writable.
@end defvar

@defvar LazyString.encoding
This attribute holds the encoding that will be applied to the string
when the string is printed by @value{GDBN}.  If the encoding is not
set, or contains an empty string,  then @value{GDBN} will select the
most appropriate encoding when the string is printed.  This attribute
is not writable.
@end defvar

@defvar LazyString.type
This attribute holds the type that is represented by the lazy string's
type.  For a lazy string this will always be a pointer type.  To
resolve this to the lazy string's character type, use the type's
@code{target} method.  @xref{Types In Python}.  This attribute is not
writable.
@end defvar

@node Python Auto-loading
@subsection Python Auto-loading
@cindex Python 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 Python support scripts in several ways:
@file{@var{objfile}-gdb.py} (@pxref{objfile-gdb.py file})
and @code{.debug_gdb_scripts} section
(@pxref{dotdebug_gdb_scripts section}).

The auto-loading feature is useful for supplying application-specific
debugging commands and scripts.

Auto-loading can be enabled or disabled,
and the list of auto-loaded scripts can be printed.

@table @code
@anchor{set auto-load python-scripts}
@kindex set auto-load python-scripts
@item set auto-load python-scripts [on|off]
Enable or disable the auto-loading of Python scripts.

@anchor{show auto-load python-scripts}
@kindex show auto-load python-scripts
@item show auto-load python-scripts
Show whether auto-loading of Python scripts is enabled or disabled.

@anchor{info auto-load python-scripts}
@kindex info auto-load python-scripts
@cindex print list of auto-loaded Python scripts
@item info auto-load python-scripts [@var{regexp}]
Print the list of all Python scripts that @value{GDBN} auto-loaded.

Also printed is the list of Python scripts that were mentioned in
the @code{.debug_gdb_scripts} section and were not found
(@pxref{dotdebug_gdb_scripts section}).
This is useful because their names are not printed when @value{GDBN}
tries to load them and fails.  There may be many of them, and printing
an error message for each one is problematic.

If @var{regexp} is supplied only Python scripts with matching names are printed.

Example:

@smallexample
(gdb) info auto-load python-scripts
Loaded Script
Yes    py-section-script.py
       full name: /tmp/py-section-script.py
No     my-foo-pretty-printers.py
@end smallexample
@end table

When reading an auto-loaded file, @value{GDBN} sets the
@dfn{current objfile}.  This is available via the @code{gdb.current_objfile}
function (@pxref{Objfiles In Python}).  This can be useful for
registering objfile-specific pretty-printers.

@menu
* objfile-gdb.py file::          The @file{@var{objfile}-gdb.py} file
* dotdebug_gdb_scripts section:: The @code{.debug_gdb_scripts} section
* Which flavor to choose?::
@end menu

@node objfile-gdb.py file
@subsubsection The @file{@var{objfile}-gdb.py} file
@cindex @file{@var{objfile}-gdb.py}

When a new object file is read, @value{GDBN} looks for
a file named @file{@var{objfile}-gdb.py} (we call it @var{script-name} below),
where @var{objfile} is the object file's real name, formed by ensuring
that the file name is absolute, following all symlinks, and resolving
@code{.} and @code{..} components.  If this file exists and is
readable, @value{GDBN} will evaluate it as a Python script.

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 this script file also requires accordingly configured
@code{auto-load safe-path} (@pxref{Auto-loading safe path}).

@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.
@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.py} file should be careful to avoid errors if it
is evaluated more than once.

@node dotdebug_gdb_scripts section
@subsubsection 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 @samp{.debug_gdb_scripts}.
If this section exists, its contents is a list of names of scripts to load.

@value{GDBN} will look for each specified script 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.

Entries can be placed in section @code{.debug_gdb_scripts} with,
for example, this GCC macro:

@example
/* Note: The "MS" section flags are to remove duplicates.  */
#define DEFINE_GDB_SCRIPT(script_name) \
  asm("\
.pushsection \".debug_gdb_scripts\", \"MS\",@@progbits,1\n\
.byte 1\n\
.asciz \"" script_name "\"\n\
.popsection \n\
");
@end example

@noindent
Then one can reference the macro in a header or source file like this:

@example
DEFINE_GDB_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 is put in a header, any application or library
using this header will get a reference to the specified script.

@node Which flavor to choose?
@subsubsection Which flavor to choose?

Given the multiple ways of auto-loading Python scripts, it might not always
be clear which one to choose.  This section provides some guidance.

Benefits of the @file{-gdb.py} 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

Benefits of the @code{.debug_gdb_scripts} way:

@itemize @bullet
@item
Works with static linking.

Scripts for libraries done the @file{-gdb.py} 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.py} 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.py} 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.py} 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 Python modules
@subsection Python modules
@cindex python modules

@value{GDBN} comes with several modules to assist writing Python code.

@menu
* gdb.printing::       Building and registering pretty-printers.
* gdb.types::          Utilities for working with types.
* gdb.prompt::         Utilities for prompt value substitution.
@end menu

@node gdb.printing
@subsubsection gdb.printing
@cindex gdb.printing

This module provides a collection of utilities for working with
pretty-printers.

@table @code
@item PrettyPrinter (@var{name}, @var{subprinters}=None)
This class specifies the API that makes @samp{info pretty-printer},
@samp{enable pretty-printer} and @samp{disable pretty-printer} work.
Pretty-printers should generally inherit from this class.

@item SubPrettyPrinter (@var{name})
For printers that handle multiple types, this class specifies the
corresponding API for the subprinters.

@item RegexpCollectionPrettyPrinter (@var{name})
Utility class for handling multiple printers, all recognized via
regular expressions.
@xref{Writing a Pretty-Printer}, for an example.

@item FlagEnumerationPrinter (@var{name})
A pretty-printer which handles printing of @code{enum} values.  Unlike
@value{GDBN}'s built-in @code{enum} printing, this printer attempts to
work properly when there is some overlap between the enumeration
constants.  @var{name} is the name of the printer and also the name of
the @code{enum} type to look up.

@item register_pretty_printer (@var{obj}, @var{printer}, @var{replace}=False)
Register @var{printer} with the pretty-printer list of @var{obj}.
If @var{replace} is @code{True} then any existing copy of the printer
is replaced.  Otherwise a @code{RuntimeError} exception is raised
if a printer with the same name already exists.
@end table

@node gdb.types
@subsubsection gdb.types
@cindex gdb.types

This module provides a collection of utilities for working with
@code{gdb.Types} objects.

@table @code
@item get_basic_type (@var{type})
Return @var{type} with const and volatile qualifiers stripped,
and with typedefs and C@t{++} references converted to the underlying type.

C@t{++} example:

@smallexample
typedef const int const_int;
const_int foo (3);
const_int& foo_ref (foo);
int main () @{ return 0; @}
@end smallexample

Then in gdb:

@smallexample
(gdb) start
(gdb) python import gdb.types
(gdb) python foo_ref = gdb.parse_and_eval("foo_ref")
(gdb) python print gdb.types.get_basic_type(foo_ref.type)
int
@end smallexample

@item has_field (@var{type}, @var{field})
Return @code{True} if @var{type}, assumed to be a type with fields
(e.g., a structure or union), has field @var{field}.

@item make_enum_dict (@var{enum_type})
Return a Python @code{dictionary} type produced from @var{enum_type}.

@item deep_items (@var{type})
Returns a Python iterator similar to the standard
@code{gdb.Type.iteritems} method, except that the iterator returned
by @code{deep_items} will recursively traverse anonymous struct or
union fields.  For example:

@smallexample
struct A
@{
    int a;
    union @{
        int b0;
        int b1;
    @};
@};
@end smallexample

@noindent
Then in @value{GDBN}:
@smallexample
(@value{GDBP}) python import gdb.types
(@value{GDBP}) python struct_a = gdb.lookup_type("struct A")
(@value{GDBP}) python print struct_a.keys ()
@{['a', '']@}
(@value{GDBP}) python print [k for k,v in gdb.types.deep_items(struct_a)]
@{['a', 'b0', 'b1']@}
@end smallexample

@end table

@node gdb.prompt
@subsubsection gdb.prompt
@cindex gdb.prompt

This module provides a method for prompt value-substitution.

@table @code
@item substitute_prompt (@var{string})
Return @var{string} with escape sequences substituted by values.  Some
escape sequences take arguments.  You can specify arguments inside
``@{@}'' immediately following the escape sequence.

The escape sequences you can pass to this function are:

@table @code
@item \\
Substitute a backslash.
@item \e
Substitute an ESC character.
@item \f
Substitute the selected frame; an argument names a frame parameter.
@item \n
Substitute a newline.
@item \p
Substitute a parameter's value; the argument names the parameter.
@item \r
Substitute a carriage return.
@item \t
Substitute the selected thread; an argument names a thread parameter.
@item \v
Substitute the version of GDB.
@item \w
Substitute the current working directory.
@item \[
Begin a sequence of non-printing characters.  These sequences are
typically used with the ESC character, and are not counted in the string
length.  Example: ``\[\e[0;34m\](gdb)\[\e[0m\]'' will return a
blue-colored ``(gdb)'' prompt where the length is five.
@item \]
End a sequence of non-printing characters.
@end table

For example:

@smallexample
substitute_prompt (``frame: \f,
                   print arguments: \p@{print frame-arguments@}'')
@end smallexample

@exdent will return the string:

@smallexample
"frame: main, print arguments: scalars"
@end smallexample
@end table

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

@item tabset @var{nchars}
@kindex tabset
Set the width of tab stops to be @var{nchars} characters.
@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}).

@c The following dropped because Epoch is nonstandard.  Reactivate
@c if/when v19 does something similar. ---doc@cygnus.com 19dec1990
@ignore
@kindex Emacs Epoch environment
@kindex Epoch
@kindex inspect

Version 18 of @sc{gnu} Emacs has a built-in window system
called the @code{epoch}
environment.  Users of this environment can use a new command,
@code{inspect} which performs identically to @code{print} except that
each value is printed in its own window.
@end ignore


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

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.

@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 target-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.

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}}

@item @var{status-async-output} @expansion{}
@code{[ @var{token} ] "+" @var{async-output}}

@item @var{notify-async-output} @expansion{}
@code{[ @var{token} ] "=" @var{async-output}}

@item @var{async-output} @expansion{}
@code{@var{async-class} ( "," @var{result} )* @var{nl}}

@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}}

@item @var{target-stream-output} @expansion{}
@code{"@@" @var{c-string}}

@item @var{log-stream-output} @expansion{}
@code{"&" @var{c-string}}

@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 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" "," @var{c-string}
@findex ^error
The operation failed.  The @code{@var{c-string}} contains the corresponding
error message.

@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.  @var{code} 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 =breakpoint-created,bkpt=@{...@}
@itemx =breakpoint-modified,bkpt=@{...@}
@itemx =breakpoint-deleted,bkpt=@{...@}
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}.

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.

@end table

@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",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",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",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",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",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",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",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.

@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

The result is in the form:

@smallexample
^done,bkpt=@{number="@var{number}",type="@var{type}",disp="del"|"keep",
enabled="y"|"n",addr="@var{hex}",func="@var{funcname}",file="@var{filename}",
fullname="@var{full_filename}",line="@var{lineno}",[thread="@var{threadno},]
times="@var{times}"@}
@end smallexample

@noindent
where @var{number} is the @value{GDBN} number for this breakpoint,
@var{funcname} is the name of the function where the breakpoint was
inserted, @var{filename} is the name of the source file which contains
this function, @var{lineno} is the source line number within that file
and @var{times} the number of times that the breakpoint has been hit
(always 0 for -break-insert but may be greater for -break-info or -break-list
which use the same output).

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",times="0"@}
(gdb)
-break-insert -t foo
^done,bkpt=@{number="2",addr="0x00010774",file="recursive2.c",
fullname="/home/foo/recursive2.c,line="11",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",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",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",times="0"@}
@c (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 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",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",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",times="1"@},
bkpt=@{number="2",type="watchpoint",disp="keep",
enabled="y",addr="",what="C",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",times="1"@},
bkpt=@{number="2",type="watchpoint",disp="keep",
enabled="y",addr="",what="C",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",
times="1"@}]@}
(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]
@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 no 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.

@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{-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

@subheading The @code{-stack-list-arguments} Command
@findex -stack-list-arguments

@subsubheading Synopsis

@smallexample
 -stack-list-arguments @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.

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


@subheading The @code{-stack-list-frames} Command
@findex -stack-list-frames

@subsubheading Synopsis

@smallexample
 -stack-list-frames [ @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.

@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

@subsubheading Synopsis

@smallexample
 -stack-list-locals @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.

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

@subheading The @code{-stack-list-variables} Command
@findex -stack-list-variables

@subsubheading Synopsis

@smallexample
 -stack-list-variables @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.  

@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.
@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 values of @code{lang} can be @code{@{"C" | "C++" | "Java"@}}.

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 Miscellaneous 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 output for each instruction is composed of four fields:

@itemize @bullet
@item Address
@item Func-name
@item Offset
@item Instruction
@end itemize

Note that whatever included in the instruction field, is not manipulated
directly by @sc{gdb/mi}, i.e., it is not possible to adjust its format.

@subsubheading @value{GDBN} Command

There's no direct mapping from this command to the CLI.

@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="/kwikemart/marge/ezannoni/flathead-dev/devo/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="/kwikemart/marge/ezannoni/flathead-dev/devo/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 @var{fmt} [ ( @var{regno} )*]
@end smallexample

Display the registers' contents.  @var{fmt} is the format according to
which the registers' contents are to be returned, 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.

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}
@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.

@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


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

@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 the filename, but only when @value{GDBN} can find
the absolute file name of a source file, will it output the fullname.

@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 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-features} Command
@findex -list-features

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:

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

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

@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 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{thread-group}, whose value is the identifier of the
thread group corresponding to the new inferior.

@subheading Example

@smallexample
@value{GDBP}
-add-inferior
^done,thread-group="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",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}.
@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.  @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-name}
Load the JIT reader named @var{reader-name}.  On a UNIX system, this
will usually load @file{@var{libdir}/gdb/@var{reader-name}}, where
@var{libdir} is the system library directory, usually
@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-load} 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}).  @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.
@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.
@var{fjump} contains a sequence of instructions jump to jumppad entry.
@var{fjump_size}, 4-byte long, is the size of @var{fjump}.
@item E @var{NN}
for an error

@end table

@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
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})
@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

@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 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-symtabs
@item maint check-symtabs
Check the consistency of psymtabs and symtabs.

@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 demangle
@item maint demangle @var{name}
Demangle a C@t{++} or Objective-C mangled @var{name}.

@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
@item maint internal-error @r{[}@var{message-text}@r{]}
@itemx maint internal-warning @r{[}@var{message-text}@r{]}
Cause @value{GDBN} to call the internal function @code{internal_error}
or @code{internal_warning} and hence behave as though an internal error
or internal warning has been detected.  In addition to reporting the
internal problem, these functions give the user the opportunity to
either quit @value{GDBN} or 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

@kindex maint set internal-error
@kindex maint show internal-error
@kindex maint set internal-warning
@kindex maint show internal-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}
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.
@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}
0x1a57c80: pc=0x01014068 fp=0x0200bddc sp=0x0200bdd6
 top=0x0200bdd4 id=@{stack=0x200bddc,code=0x101405c@}
 call_lo=0x01014000 call_hi=0x01014001
(@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.  @xref{Registers,, Registers, gdbint,
@value{GDBN} Internals}.

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
Print a dump of all known object files.  For each object file, this
command prints its name, address in memory, and all of its psymtabs
and symtabs.

@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 space
@cindex memory used by commands
@item maint space
Control whether to display memory usage for each command.  If set to a
nonzero value, @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}).

@kindex maint time
@cindex time of command execution
@item maint time
Control whether to display the execution time of @value{GDBN} for each command.
If set to a nonzero value, @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}).

@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::
@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
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.  @var{addr} is 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.).  @var{op} depends on the operation to be performed:
it should be @samp{c} for step and continue operations (note that this
is deprecated, supporting the @samp{vCont} command is a better
option), @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.

FIXME: @emph{There is no description of how to operate when a specific
thread context has been selected (i.e.@: does 'k' kill only that
thread?)}.

@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}.
@var{XX@dots{}} is the data; 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
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.  @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.  @var{addr} is the address at which to resume.  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}.  @var{PP} and @var{MM} are 4 bytes.
@var{addr} must be at least 3 digits.

@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.
@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
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
Kill the process with the specified process ID.  @var{pid} 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
@anchor{vStopped packet}
@cindex @samp{vStopped} packet

In non-stop mode (@pxref{Remote Non-Stop}), acknowledge a previous stop
reply and prompt for the stub to report another one.

Reply:
@table @samp
@item @r{Any stop packet}
if there is another unreported stop event (@pxref{Stop Reply Packets})
@item OK
if there are no unreported stop events
@end table

@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.
@var{addr} is address, @var{length} is number of bytes,
@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
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.  @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
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}.
@var{kind} is interpreted as the number of bytes to watch.

Reply:
@table @samp
@item OK
success
@item
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}.
@var{kind} is interpreted as the number of bytes to watch.

Reply:
@table @samp
@item OK
success
@item
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}.
@var{kind} is interpreted as the number of bytes to watch.

Reply:
@table @samp
@item OK
success
@item
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.  @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.  @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.  @var{r} 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
@item 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
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.  @var{nn} are hex digits.

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

@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.  @var{nn} are hex digits.

@item
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
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 from the target.  @var{threadid} (eight hex
digits).  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
@item 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.  @var{nn} are hex digits.

@item
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.  @var{nn} are hex digits.

@item
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.  @var{nn} are hex digits.

@item
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
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
@cindex @samp{qSearch:memory} packet
@anchor{qSearch memory}
Search @var{length} bytes at @var{address} for @var{search-pattern}.
@var{address} and @var{length} are encoded in hex.
@var{search-pattern} is a sequence of bytes, 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
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
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
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:features:read}
@tab No
@tab @samp{-}
@tab Yes

@item @samp{qXfer:libraries:read}
@tab No
@tab @samp{-}
@tab Yes

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

@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
@item QTBuffer
@item 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 a printable string description of a thread's attributes from
the target OS.  @var{thread-id} is a thread ID; 
see @ref{thread-id syntax}.  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
@item qTP
@item QTSave
@item qTsP
@item 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: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 (@pxref{qXfer read}).

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}).

@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).
@var{data} may 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.  @var{data} may 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.
@var{nn} is a hex-encoded @code{errno} value.

@item
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.  @var{data}@dots{} is the binary-encoded data
(@pxref{Binary Data}) to be written.  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.
@var{nn} is a hex-encoded @code{errno} value.

@item
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

@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.  @var{step} is the tracepoint's step
count, and @var{pass} is 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 
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.  @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}.  @var{mask} is
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.  @var{expr} is an agent expression, 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 
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.  @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 greater
or equal to 1.  @var{length} is a hexadecimal number.  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
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).
@var{text} 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.  @var{nn} are hex digits.
@item
An empty reply indicates that the request is not supported by the
stub.
@end table

@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.  @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 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.  @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.  @var{errno} will have 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
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{pathname}, @var{flags}, @var{mode}
Open a file at @var{pathname} and return a file descriptor for it, or
return -1 if an error occurs.  @var{pathname} 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{pathname}
Delete the file at @var{pathname} on the target.  Return 0,
or -1 if an error occurs.  @var{pathname} 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.)

The following notification packets from the stub to @value{GDBN} are
defined:

@table @samp
@item Stop: @var{reply}
Report an asynchronous stop event in non-stop mode.  
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}.
@end table

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

Only one stop reply notification at a time may be pending; if
additional stop events occur before @value{GDBN} has acknowledged the
previous notification, they must be queued by the stub for later
synchronous transmission in response to @samp{vStopped} packets from
@value{GDBN}.  Because the notification mechanism is unreliable, 
the stub is permitted to resend a stop reply notification
if it believes @value{GDBN} may not have received it.  @value{GDBN}
ignores additional stop reply notifications received before it has
finished processing a previous notification and the stub has completed
sending any queued stop events.

Otherwise, @value{GDBN} must be prepared to receive a stop reply
notification at any time.  Specifically, they 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 stop reply notification, @value{GDBN} shall
acknowledge it by sending a @samp{vStopped} packet (@pxref{vStopped 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 @samp{vStopped} packet, if the stub has other queued
stop events to report to @value{GDBN}, it shall respond by sending a
normal stop reply response.  @value{GDBN} shall then send another
@samp{vStopped} 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 @samp{vStopped} packet and there are no
additional stop events to report, the stub shall return an @samp{OK}
response.  At this point, if further stop events occur, the stub shall
send a new stop reply notification, @value{GDBN} shall accept the
notification, and the process shall be repeated.

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

@end itemize

The formal DTD for the traceframe info format is given below:

@smallexample
<!ELEMENT traceframe-info  (memory)* >
<!ATTLIST traceframe-info  version CDATA   #FIXED  "1.0">

<!ELEMENT memory        EMPTY>
<!ATTLIST memory        start   CDATA   #REQUIRED
                        length  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.  @var{type} 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.  @var{group} 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
* ARM Features::
* i386 Features::
* MIPS Features::
* M68K Features::
* PowerPC Features::
* TIC6x Features::
@end menu


@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.linux} feature is optional.  It should
describe a single register, @samp{orig_eax}.

@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 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 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 7.  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.  @value{GDBN} will only read version 4, 5, or 6 indices
by specifying @code{set use-deprecated-index-sections on}.

@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

@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
