\input texinfo      @c -*-texinfo-*-
@c Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
@c 1999, 2000, 2001, 2002, 2003, 2004
@c 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
@syncodeindex ky cp

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

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

@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 Programming & development tools.
@direntry
* Gdb: (gdb).                     The @sc{gnu} debugger.
@end direntry

@ifinfo
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}
Version @value{GDBVN}.

Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998,@*
              1999, 2000, 2001, 2002, 2003, 2004 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.1 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 Free Software Foundation's Back-Cover Text is: ``You have
freedom to copy and modify this GNU Manual, like GNU software.  Copies
published by the Free Software Foundation raise funds for GNU
development.''
@end ifinfo

@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}
@author Richard Stallman, Roland Pesch, Stan Shebs, et al.
@page
@tex
{\parskip=0pt
\hfill (Send bugs and comments on @value{GDBN} to bug-gdb\@gnu.org.)\par
\hfill {\it Debugging with @value{GDBN}}\par
\hfill \TeX{}info \texinfoversion\par
}
@end tex

@vskip 0pt plus 1filll
Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
@sp 2
Published by the Free Software Foundation @*
59 Temple Place - Suite 330, @*
Boston, MA 02111-1307 USA @*
ISBN 1-882114-77-9 @*

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1 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 Free Software Foundation's Back-Cover Text is: ``You have
freedom to copy and modify this GNU Manual, like GNU software.  Copies
published by the Free Software Foundation raise funds for GNU
development.''
@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} Version
@value{GDBVN}.

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

@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
* Stack::                       Examining the stack
* Source::                      Examining source files
* Data::                        Examining data
* 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}
* Sequences::                   Canned sequences of commands
* TUI::                         @value{GDBN} Text User Interface
* Interpreters::		Command Interpreters
* Emacs::                       Using @value{GDBN} under @sc{gnu} Emacs
* Annotations::                 @value{GDBN}'s annotation interface.
* GDB/MI::                      @value{GDBN}'s Machine Interface.

* GDB Bugs::                    Reporting bugs in @value{GDBN}
* Formatting Documentation::    How to format and print @value{GDBN} documentation

* Command Line Editing::        Command Line Editing
* Using History Interactively:: Using History Interactively
* Installing GDB::              Installing GDB
* Maintenance Commands::        Maintenance Commands
* Remote Protocol::             GDB Remote Serial Protocol
* Agent Expressions::           The GDB Agent Expression Mechanism
* Copying::			GNU General Public License says
                                how you can copy and share GDB
* GNU Free Documentation License::  The license for this documentation
* Index::                       Index
@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{Support,,Supported languages}.
For more information, see @ref{C,,C and C++}.

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

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

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

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

@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{C-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{C-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{C-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
gdb --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
@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{./}, eg. @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 -c @var{number}
@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.
If there is no such process, @value{GDBN} will attempt to open a core
file named @var{number}.

@item -command @var{file}
@itemx -x @var{file}
@cindex @code{--command}
@cindex @code{-x}
Execute @value{GDBN} commands from file @var{file}.  @xref{Command
Files,, Command files}.

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

@item -m
@itemx -mapped
@cindex @code{--mapped}
@cindex @code{-m}
@emph{Warning: this option depends on operating system facilities that are not
supported on all systems.}@*
If memory-mapped files are available on your system through the @code{mmap}
system call, you can use this option
to have @value{GDBN} write the symbols from your
program into a reusable file in the current directory.  If the program you are debugging is
called @file{/tmp/fred}, the mapped symbol file is @file{/tmp/fred.syms}.
Future @value{GDBN} debugging sessions notice the presence of this file,
and can quickly map in symbol information from it, rather than reading
the symbol table from the executable program.

The @file{.syms} file is specific to the host machine where @value{GDBN}
is run.  It holds an exact image of the internal @value{GDBN} symbol
table.  It cannot be shared across multiple host platforms.

@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

You typically combine the @code{-mapped} and @code{-readnow} options in
order to build a @file{.syms} file that contains complete symbol
information.  (@xref{Files,,Commands to specify files}, for information
on @file{.syms} files.)  A simple @value{GDBN} invocation to do nothing
but build a @file{.syms} file for future use is:

@smallexample
gdb -batch -nx -mapped -readnow programname
@end smallexample

@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
@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 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 -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 -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 superseeded by @sc{gdb/mi}
(@pxref{GDB/MI}).

@item -async
@cindex @code{--async}
Use the asynchronous event loop for the command-line interface.
@value{GDBN} processes all events, such as user keyboard input, via a
special event loop.  This allows @value{GDBN} to accept and process user
commands in parallel with the debugged process being
run@footnote{@value{GDBN} built with @sc{djgpp} tools for
MS-DOS/MS-Windows supports this mode of operation, but the event loop is
suspended when the debuggee runs.}, so you don't need to wait for
control to return to @value{GDBN} before you type the next command.
(@emph{Note:} as of version 5.1, the target side of the asynchronous
operation is not yet in place, so @samp{-async} does not work fully
yet.)
@c FIXME: when the target side of the event loop is done, the above NOTE
@c should be removed.

When the standard input is connected to a terminal device, @value{GDBN}
uses the asynchronous event loop by default, unless disabled by the
@samp{-noasync} option.

@item -noasync
@cindex @code{--noasync}
Disable the asynchronous event loop for the command-line interface.

@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 -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 Terminal User Interface when starting.
The Terminal 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 in @var{GDBN} version 6.0.  The
previous @sc{gdb/mi} interface, included in @value{GDBN} version 5.3,
can be selected with @samp{--interpreter=mi1}.  Earlier @sc{gdb/mi}
interfaces are not 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 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{C-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{C-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
@cindex shell escape
@item shell @var{command string}
Invoke a standard shell to execute @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

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

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 C-o @r{(operate-and-get-next)}
The @kbd{C-o} binding is useful for repeating a complex sequence of
commands.  This command accepts the current line, like @kbd{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{++}}.


@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 @var{args}} 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 reload
@end smallexample

@noindent
results in:

@smallexample
@c @group
set symbol-reloading -- Set dynamic symbol table reloading
                                 multiple times in one run
show symbol-reloading -- Show dynamic symbol table reloading
                                 multiple times in one run
@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 Index point to
all the sub-commands.  @xref{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 list the arguments given to your program
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 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
@item show copying
Display information about permission for copying @value{GDBN}.

@kindex show warranty
@item show 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

* Threads::                     Debugging programs with multiple threads
* Processes::                   Debugging programs with multiple processes
@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.

Most compilers do not include information about preprocessor macros in
the debugging information if you specify the @option{-g} flag alone,
because this information is rather large.  Version 3.1 of @value{NGCC},
the @sc{gnu} C compiler, provides macro information if you specify the
options @option{-gdwarf-2} and @option{-g3}; the former option requests
debugging information in the Dwarf 2 format, and the latter requests
``extra information''.  In the future, we hope to find more compact ways
to represent macro information, so that it can be included with
@option{-g} alone.

Many C 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 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.

@cindex optimized code, debugging
@cindex debugging optimized code
When you debug a program compiled with @samp{-g -O}, remember that the
optimizer is rearranging 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!).

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.

@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 environments without processes,
@code{run} jumps to the start of your program.)

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.

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

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

@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 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} or use the @code{run} command while you have an
attached process, 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 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
@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
LynxOS, you might see

@smallexample
[New process 35 thread 27]
@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
Display a summary of all threads currently in your
program.  @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 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
  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 HP-UX systems:

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

@cindex @code{New} @var{systag} message, on HP-UX
@cindex thread identifier (system), on HP-UX
@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
both @value{GDBN}'s thread number and 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
HP-UX, you see

@smallexample
[New thread 2 (system thread 26594)]
@end smallexample

@noindent
when @value{GDBN} notices a new thread.

@table @code
@kindex info threads
@item info threads
Display a summary of all threads currently in your
program.  @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 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
    * 3 system thread 26607  worker (wptr=0x7b09c318 "@@") \@*
                               at quicksort.c:137
      2 system thread 26606  0x7b0030d8 in __ksleep () \@*
                               from /usr/lib/libc.2
      1 system thread 27905  0x7b003498 in _brk () \@*
                               from /usr/lib/libc.2
@end smallexample

@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
@c FIXME!! This example made up; find a @value{GDBN} w/threads and get real one
(@value{GDBP}) thread 2
[Switching to process 35 thread 23]
0x34e5 in sigpause ()
@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.

@kindex thread apply
@item thread apply [@var{threadno}] [@var{all}]  @var{args}
The @code{thread apply} command allows you to apply a command to one or
more threads.  Specify the numbers of the threads that you want affected
with the command argument @var{threadno}.  @var{threadno} is the internal
@value{GDBN} thread number, as shown in the first field of the @samp{info
threads} display.  To apply a command to all threads, use
@code{thread apply all} @var{args}.
@end table

@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 of the form @samp{[Switching to @var{systag}]} to identify the
thread.

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

@node Processes
@section Debugging programs with multiple processes

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

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

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

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.

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

In HP-UX, SunOS 4.x, SVR4, and Alpha OSF/1 configurations, 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 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.  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 breakpoint 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
* Breakpoint Menus::            Breakpoint menus
* 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.

You have several ways to say where the breakpoint should go.

@table @code
@item break @var{function}
Set a breakpoint at entry to function @var{function}.
When using source languages that permit overloading of symbols, such as
C@t{++}, @var{function} may refer to more than one possible place to break.
@xref{Breakpoint Menus,,Breakpoint menus}, for a discussion of that situation.

@item break +@var{offset}
@itemx break -@var{offset}
Set a breakpoint some number of lines forward or back from the position
at which execution stopped in the currently selected @dfn{stack frame}.
(@xref{Frames, ,Frames}, for a description of stack frames.)

@item break @var{linenum}
Set a breakpoint at line @var{linenum} in the current source file.
The current source file is the last file whose source text was printed.
The breakpoint will stop your program just before it executes any of the
code on that line.

@item break @var{filename}:@var{linenum}
Set a breakpoint at line @var{linenum} in source file @var{filename}.

@item break @var{filename}:@var{function}
Set a breakpoint at entry to function @var{function} found in file
@var{filename}.  Specifying a file name as well as a function name is
superfluous except when multiple files contain similarly named
functions.

@item break *@var{address}
Set a breakpoint at address @var{address}.  You can use this to set
breakpoints in parts of your program which do not have debugging
information or source files.

@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
@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 some 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}).  @xref{Conditions, ,Break conditions}.
@xref{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
@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}.

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

@kindex info breakpoints
@cindex @code{$_} and @code{info breakpoints}
@item info breakpoints @r{[}@var{n}@r{]}
@itemx info break @r{[}@var{n}@r{]}
@itemx info watchpoints @r{[}@var{n}@r{]}
Print a table of all breakpoints, watchpoints, and catchpoints set and
not deleted, with the following columns for each breakpoint:

@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.  If the
breakpoint is pending (see below for details) on a future load of a shared library, the address
will be listed as @samp{<PENDING>}.
@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, @code{info break} shows the condition on
the line following the affected breakpoint; 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.
@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 pending breakpoints
If a specified breakpoint location cannot be found, @value{GDBN} will
prompt you
as to whether to make the breakpoint pending on a future shared
library load.  This is useful for setting breakpoints at the start of your
@value{GDBN} session for locations that you know will be dynamically loaded
later by the program being debugged.  When shared libraries are loaded,
a check is made to see if the load resoloves any pending breakpoint locations.
If a pending breakpoint location has been resolved,
a real breakpoint is created and the original pending breakpoint is removed.

@cindex operations allowed on pending breakpoints 
Normal breakpoint operations apply to pending breakpoints as well.  You may 
specify a condition for a pending breakpoint and/or commands to run when the 
breakpoint is reached.  You can also enable or disable
the pending breakpoint.  When you specify a condition for a pending breakpoint,
the parsing of the condition will be deferred until the point where the
pending breakpoint location is resolved.  Disabling a pending breakpoint
tells @value{GDBN} to not attempt to resolve the breakpoint on any subsequent
shared library load.  When a pending breakpoint is re-enabled,
@value{GDBN} checks to see if the location is already resolved. 
This is done because any number of shared library loads could have
occurred since the time the breakpoint was disabled and one or more
of these loads could resolve the location.

@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
@cindex software watchpoints
@cindex hardware 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.

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, @sc{gnu}/Linux and some 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 @var{expr}
Set a watchpoint for an expression.  @value{GDBN} will break when @var{expr}
is written into by the program and its value changes.

@kindex rwatch
@item rwatch @var{expr}
Set a watchpoint that will break when watch @var{expr} is read by the program.

@kindex awatch
@item awatch @var{expr}
Set a watchpoint that will break when @var{expr} is either read or written into
by the program.

@kindex info watchpoints
@item info watchpoints
This command prints a list of watchpoints, breakpoints, and catchpoints;
it is the same as @code{info break}.
@end table

@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
statement, not the instruction, after the change occurs.

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.

The SPARClite DSU will generate traps when a program accesses some data
or instruction address that is assigned to the debug registers.  For the
data addresses, DSU facilitates the @code{watch} command.  However the
hardware breakpoint registers can only take two data watchpoints, and
both watchpoints must be the same kind.  For example, you can set two
watchpoints with @code{watch} commands, two with @code{rwatch} commands,
@strong{or} two with @code{awatch} commands, but you cannot set one
watchpoint with one command and the other with a different command.
@value{GDBN} will reject the command if you try to mix watchpoints.
Delete or disable unused watchpoint commands before setting new ones.

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.

@quotation
@cindex watchpoints and threads
@cindex threads and watchpoints
@emph{Warning:} In multi-thread programs, watchpoints have only limited
usefulness.  With the current watchpoint implementation, @value{GDBN}
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 watchpoints as usual.  However,
@value{GDBN} may not notice when a non-current thread's activity changes
the expression.

@c FIXME: this is almost identical to the previous paragraph.
@emph{HP-UX Warning:} In multi-thread 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
@kindex catch throw
The throwing of a C@t{++} exception.

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

@item exec
@kindex catch exec
A call to @code{exec}.  This is currently only available for HP-UX.

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

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

@item load
@itemx load @var{libname}
@kindex catch load
The dynamic loading of any shared library, or the loading of the library
@var{libname}.  This is currently only available for HP-UX.

@item unload
@itemx unload @var{libname}
@kindex catch unload
The unloading of any dynamically loaded shared library, or the unloading
of the library @var{libname}.  This is currently only available for HP-UX.
@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{function}
@itemx clear @var{filename}:@var{function}
Delete any breakpoints set at entry to the function @var{function}.

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

@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

@kindex disable breakpoints
@kindex enable breakpoints
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} or
@code{info watch} to print a list of breakpoints, watchpoints, and
catchpoints if you do not know which numbers to use.

A breakpoint, watchpoint, or catchpoint can have any of four 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 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 breakpoints
@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 breakpoints
@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{]} 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.
@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}).

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
@item commands @r{[}@var{bnum}@r{]}
@itemx @dots{} @var{command-list} @dots{}
@itemx end
Specify a list of commands for breakpoint number @var{bnum}.  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 @var{bnum} argument, @code{commands} refers to the last
breakpoint, watchpoint, or catchpoint set (not to the breakpoint most
recently encountered).
@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 Breakpoint Menus
@subsection Breakpoint menus
@cindex overloading
@cindex symbol overloading

Some programming languages (notably 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}.  When a function name is overloaded,
@samp{break @var{function}} is not enough to tell @value{GDBN} where you want
a breakpoint.  If you realize this is a problem, you can use
something like @samp{break @var{function}(@var{types})} to specify which
particular version of the function you want.  Otherwise, @value{GDBN} offers
you a menu of numbered choices for different possible breakpoints, and
waits for your selection with the prompt @samp{>}.  The first two
options are always @samp{[0] cancel} and @samp{[1] all}.  Typing @kbd{1}
sets a breakpoint at each definition of @var{function}, and typing
@kbd{0} aborts the @code{break} command without setting any new
breakpoints.

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

@c  @ifclear BARETARGET
@node Error in Breakpoints
@subsection ``Cannot insert breakpoints''
@c
@c  FIXME!! 14/6/95  Is there a real example of this?  Let's use it.
@c
Under some operating systems, breakpoints cannot be used in a program if
any other process is running that program.  In this situation,
attempting to run or continue a program with a breakpoint causes
@value{GDBN} to print an error message:

@smallexample
Cannot insert breakpoints.
The same program may be running in another process.
@end smallexample

When this happens, you have three ways to proceed:

@enumerate
@item
Remove or disable the breakpoints, then continue.

@item
Suspend @value{GDBN}, and copy the file containing your program to a new
name.  Resume @value{GDBN} and use the @code{exec-file} command to specify
that @value{GDBN} should run your program under that name.
Then start your program again.

@item
Relink your program so that the text segment is nonsharable, using the
linker option @samp{-N}.  The operating system limitation may not apply
to nonsharable executables.
@end enumerate
@c  @end ifclear

A similar message can be printed if you request too many active
hardware-assisted breakpoints and watchpoints:

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

@kindex finish
@item finish
Continue running until just after function in the selected stack frame
returns.  Print the returned value (if any).

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

@kindex until
@kindex u @r{(@code{until})}
@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 of argument acceptable to @code{break} (@pxref{Set Breaks,
,Setting breakpoints}).  This form of the command uses 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}
@itemx advance @var{location}
Continue running the program up to the given location.  An argument is
required, anything of the same form as arguments for the @code{break}
command.  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 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{C-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
@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.

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

@kindex handle
@item handle @var{signal} @var{keywords}@dots{}
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.  The @var{keywords} 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}.

@node Thread Stops
@section Stopping and starting multi-thread programs

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, 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 the
breakpoint condition, like this:

@smallexample
(@value{GDBP}) break frik.c:13 thread 28 if bartab > lim
@end smallexample

@end table

@cindex stopped threads
@cindex threads, stopped
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.

@cindex thread breakpoints and system calls
@cindex system calls and thread breakpoints
@cindex premature return from system calls
There is an unfortunate side effect.  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.

@cindex continuing threads
@cindex threads, continuing
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.

On some OSes, you can lock the OS scheduler and thus allow only a single
thread to run.

@table @code
@item set scheduler-locking @var{mode}
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 stops other threads from
``seizing the prompt'' by preempting the current thread while you are
stepping.  Other threads will 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, they will never steal the
@value{GDBN} prompt away from the thread that you are debugging.

@item show scheduler-locking
Display the current scheduler locking mode.
@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} 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{GCC} 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 backtraces
@cindex tracebacks
@cindex 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{C-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.
@end table

@kindex where
@kindex info stack
@kindex info s @r{(@code{info stack})}
The names @code{where} and @code{info stack} (abbreviated @code{info s})
are additional aliases for @code{backtrace}.

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

@kindex set backtrace past-main
@kindex show backtrace past-main
@kindex set backtrace limit
@kindex show backtrace limit

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}.  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
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
Display the current user 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 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.
@c note to future updaters: this is conditioned on a flag
@c SETUP_ARBITRARY_FRAME in the tm-*.h files.  The above is up to date
@c as of 27 Jan 1994.

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

@kindex info catch
@cindex catch exceptions, list active handlers
@cindex exception handlers, how to list
@item info catch
Print a list of all the exception handlers that are active in the
current stack frame at the current point of execution.  To see other
exception handlers, visit the associated frame (using the @code{up},
@code{down}, or @code{frame} commands); then type @code{info catch}.
@xref{Set Catchpoints, , Setting catchpoints}.

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

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

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.

@cindex linespec
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, 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.

@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

Here are the ways of specifying a single source line---all the
kinds of linespec.

@table @code
@item @var{number}
Specifies line @var{number} of the current source file.
When a @code{list} command has two linespecs, this refers to
the same source file as the first linespec.

@item +@var{offset}
Specifies the line @var{offset} lines after the last line printed.
When used as the second linespec in a @code{list} command that has
two, this specifies the line @var{offset} lines down from the
first linespec.

@item -@var{offset}
Specifies the line @var{offset} lines before the last line printed.

@item @var{filename}:@var{number}
Specifies line @var{number} in the source file @var{filename}.

@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{filename}:@var{function}
Specifies the line of the open-brace 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{address}
Specifies the line containing the program address @var{address}.
@var{address} may be any expression.
@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.

Here are the forms of the @code{edit} command most commonly used:

@table @code
@item edit
Edit the current source file at the active line number in the program.

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

@item edit @var{filename}:@var{number}
Specifies line @var{number} in the source file @var{filename}.

@item edit @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 edit *@var{address}
Specifies the line containing the program address @var{address}.
@var{address} may be any expression.
@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} designates the active line in
the file.}.  By default, it is @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 ...
@end smallexample
or in the @code{csh} shell,
@smallexample
setenv EDITOR /usr/bin/vi
gdb ...
@end smallexample

@node Search
@section Searching source files
@cindex searching
@kindex reverse-search

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

@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.  Note that
the executable search path is @emph{not} used for this purpose.  Neither is
the current working directory, unless it happens to be in the source
path.

If @value{GDBN} cannot find a source file in the source path, and the
object program records a directory, @value{GDBN} tries that directory
too.  If the source path is empty, and there is no record of the
compilation directory, @value{GDBN} looks in the current directory as a
last resort.

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.

@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 $cwdr@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 empty again.  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 show directories
@kindex show directories
Print the source path: show which directories it contains.
@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 empty.

@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

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.  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 understood by the @code{list} command (@pxref{List, ,Printing
source lines}).
@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
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}
@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
This specialized command dumps a range of memory as machine
instructions.  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.  Two arguments specify a range of addresses
(first inclusive, second exclusive) to dump.
@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

Some architectures have more than one commonly-used set of instruction
mnemonics or other syntax.

@table @code
@kindex set disassembly-flavor
@cindex assembly instructions
@cindex instructions, assembly
@cindex machine instructions
@cindex listing machine instructions
@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.
@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}).

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

@menu
* Expressions::                 Expressions
* Variables::                   Program variables
* Arrays::                      Artificial arrays
* Output Formats::              Output formats
* Memory::                      Examining memory
* Auto Display::                Automatic display
* Print Settings::              Print settings
* Value History::               Value history
* Convenience Vars::            Convenience variables
* Registers::                   Registers
* Floating Point Hardware::     Floating point hardware
* Vector Unit::                 Vector Unit
* Auxiliary Vector::            Auxiliary data provided by operating system
* Memory Region Attributes::    Memory region attributes
* Dump/Restore Files::          Copy between memory and a file
* Character Sets::              Debugging programs that use a different
                                character set than GDB does
@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}.

@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 build up an array in
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.

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 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,
using the colon-colon notation:

@cindex colon-colon, context for variables/functions
@iftex
@c info cannot cope with a :: index entry, but why deprive hard copy readers?
@cindex @code{::}, context for variables/functions
@end iftex
@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

@cindex C@t{++} scope resolution
This use of @samp{::} is 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
@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.  For example, @value{NGCC}, the @sc{gnu} C/C@t{++} compiler
usually supports the @option{-gstabs+} option.  @option{-gstabs+}
produces debug info in a format that is superior to formats such as
COFF.  You may be able to use DWARF 2 (@option{-gdwarf-2}), which is also
an effective form for debug info.  @xref{Debugging Options,,Options
for Debugging Your Program or @sc{gnu} CC, gcc.info, Using @sc{gnu} CC}.


@node Arrays
@section Artificial arrays

@cindex artificial array
@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.

@item f
Regard the bits of the value as a floating point number and print
using typical floating point syntax.
@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{s} (null-terminated string), or @samp{i} (machine instruction).
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{s} and
@samp{i} formats, the unit size is ignored and is normally not written.)

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

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

@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 on how elaborate your
format specification is---it uses @code{x} if you specify a unit size,
or one of the two formats (@samp{i} and @samp{s}) that are only
supported by @code{x}; 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 item numbers @var{dnums} from the list of expressions to display.

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

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

@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

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 address
@item set print address
@itemx set print address on
@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 address
@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
@kindex set print symbol-filename
@item set print symbol-filename on
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.

@kindex show print symbol-filename
@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
@kindex set print max-symbolic-offset
@item set print max-symbolic-offset @var{max-offset}
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.

@kindex show print max-symbolic-offset
@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

Other settings control how different kinds of objects are printed:

@table @code
@kindex set print array
@item set print array
@itemx set print array on
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.

@kindex show print array
@item show print array
Show whether compressed or pretty format is selected for displaying
arrays.

@kindex set print elements
@item set print elements @var{number-of-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.

@kindex show print elements
@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.

@kindex set print null-stop
@item set print null-stop
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.

@kindex set print pretty
@item set print pretty on
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.

@kindex show print pretty
@item show print pretty
Show which format @value{GDBN} is using to print structures.

@kindex set print sevenbit-strings
@item set print sevenbit-strings on
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.

@kindex show print sevenbit-strings
@item show print sevenbit-strings
Show whether or not @value{GDBN} is printing only seven-bit characters.

@kindex set print union
@item set print union on
Tell @value{GDBN} to print unions which are contained in structures.  This
is the default setting.

@item set print union off
Tell @value{GDBN} not to print unions which are contained in structures.

@kindex show print union
@item show print union
Ask @value{GDBN} whether or not it will print unions which are contained in
structures.

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

@need 1000
@noindent
These settings are of interest when debugging C@t{++} programs:

@table @code
@cindex demangling
@kindex set print demangle
@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.

@kindex show print demangle
@item show print demangle
Show whether C@t{++} names are printed in mangled or demangled form.

@kindex set print asm-demangle
@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.

@kindex show print asm-demangle
@item show print asm-demangle
Show whether C@t{++} names in assembly listings are printed in mangled
or demangled form.

@kindex set demangle-style
@cindex C@t{++} symbol decoding style
@cindex symbol decoding style, C@t{++}
@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.

@kindex show demangle-style
@item show demangle-style
Display the encoding style currently in use for decoding C@t{++} symbols.

@kindex set print object
@item set print object
@itemx set print object on
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.

@item set print object off
Display only the declared type of objects, without reference to the
virtual function table.  This is the default setting.

@kindex show print object
@item show print object
Show whether actual, or declared, object types are displayed.

@kindex set print static-members
@item set print static-members
@itemx set print static-members on
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.

@kindex show print static-members
@item show print static-members
Show whether C@t{++} static members are printed, or not.

@c These don't work with HP ANSI C++ yet.
@kindex set print vtbl
@item set print vtbl
@itemx set print vtbl on
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.

@kindex show print vtbl
@item show print vtbl
Show whether C@t{++} virtual function tables are pretty printed, or not.
@end table

@node Value History
@section Value history

@cindex value history
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
@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
@item show convenience
Print a list of convenience variables used so far, and their values.
Abbreviated @code{show conv}.
@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.
@end table

On HP-UX systems, if you refer to a function or variable name that
begins with a dollar sign, @value{GDBN} searches for a user or system
name first, before it searches for a convenience variable.

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

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

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 Auxiliary Vector
@section Operating system auxiliary vector
@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.

@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

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

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 memory region bounded by @var{lower} and @var{upper} with
attributes @var{attributes}@dots{}.  Note that @var{upper} == 0 is a
special case: it is treated as the the target's maximum memory address.
(0xffff on 16 bit targets, 0xffffffff on 32 bit targets, etc.)

@kindex delete mem
@item delete mem @var{nums}@dots{}
Remove memory regions @var{nums}@dots{}.

@kindex disable mem
@item disable mem @var{nums}@dots{}
Disable 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 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 acccess size attributes 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

@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 @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 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,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}.  We list the
character set names @value{GDBN} recognizes below, but if you type
@code{set target-charset} followed by @key{TAB}@key{TAB}, @value{GDBN} will
list the target character sets it supports.
@end table

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

@value{GDBN} can only use certain character sets as its host character
set.  We list the character set names @value{GDBN} recognizes below, and
indicate which can be host character sets, but if you type
@code{set target-charset} followed by @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 @code{set charset} followed by @key{TAB}@key{TAB},
@value{GDBN} will list the name 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 charsets.

@itemx show host-charset
@kindex show host-charset
Show the name of the current host charset.

@itemx show target-charset
@kindex show target-charset
Show the name of the current target charset.

@end table

@value{GDBN} currently includes support for the following character
sets:

@table @code

@item ASCII
@cindex ASCII character set
Seven-bit U.S. @sc{ascii}.  @value{GDBN} can use this as its host
character set.

@item ISO-8859-1
@cindex ISO 8859-1 character set
@cindex ISO Latin 1 character set
The ISO Latin 1 character set.  This extends @sc{ascii} with accented
characters needed for French, German, and Spanish.  @value{GDBN} can use
this as its host character set.

@item EBCDIC-US
@itemx IBM1047
@cindex EBCDIC character set
@cindex IBM1047 character set
Variants of the @sc{ebcdic} character set, used on some of IBM's
mainframe operating systems.  (@sc{gnu}/Linux on the S/390 uses U.S. @sc{ascii}.)
@value{GDBN} cannot use these as its host character set.

@end table

Note that these are all single-byte character sets.  More work inside
GDB is needed to support multi-byte or variable-width character
encodings, like the UTF-8 and UCS-2 encodings of Unicode.

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{}
(gdb)
@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
(gdb) show charset
The current host and target character set is `ISO-8859-1'.
(gdb)
@end smallexample

For the sake of printing this manual, let's use @sc{ascii} as our
initial character set:
@smallexample
(gdb) set charset ASCII
(gdb) show charset
The current host and target character set is `ASCII'.
(gdb)
@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
(gdb) print ascii_hello
$1 = 0x401698 "Hello, world!\n"
(gdb) print ascii_hello[0]
$2 = 72 'H'
(gdb)
@end smallexample

@value{GDBN} uses the target character set for character and string
literals you use in expressions:

@smallexample
(gdb) print '+'
$3 = 43 '+'
(gdb)
@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
(gdb) print ibm1047_hello
$4 = 0x4016a8 "\310\205\223\223\226k@@\246\226\231\223\204Z%"
(gdb) print ibm1047_hello[0]
$5 = 200 '\310'
(gdb)
@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
(gdb) set target-charset
ASCII       EBCDIC-US   IBM1047     ISO-8859-1
(gdb) 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
(gdb) set target-charset IBM1047
(gdb) show charset
The current host character set is `ASCII'.
The current target character set is `IBM1047'.
(gdb) print ascii_hello
$6 = 0x401698 "\110\145%%?\054\040\167?\162%\144\041\012"
(gdb) print ascii_hello[0]
$7 = 72 '\110'
(gdb) print ibm1047_hello
$8 = 0x4016a8 "Hello, world!\n"
(gdb) print ibm1047_hello[0]
$9 = 200 'H'
(gdb)
@end smallexample

As above, @value{GDBN} uses the target character set for character and
string literals you use in expressions:

@smallexample
(gdb) print '+'
$10 = 78 '+'
(gdb)
@end smallexample

The @sc{ibm1047} character set uses the number 78 to encode the @samp{+}
character.


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

At the moment, @value{GDBN} does not support the @code{##}
token-splicing operator, the @code{#} stringification operator, or
variable-arity macros.

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 expand-once
@item macro expand-once @var{expression}
@itemx macro exp1 @var{expression}
@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, showing a macro's
@item info macro @var{macro}
Show the definition of the macro named @var{macro}, and describe the
source location where that definition was 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}
@i{(This command is not yet implemented.)}  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 @command{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}
@i{(This command is not yet implemented.)}  Remove any user-supplied
definition for the macro named @var{macro}.  This command only affects
definitions provided with the @command{macro define} command, described
above; it cannot remove definitions present in the program being
debugged.

@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} 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{}
(gdb)
@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
(gdb) list main
3
4       #define M 42
5       #define ADD(x) (M + x)
6
7       main ()
8       @{
9       #define N 28
10        printf ("Hello, world!\n");
11      #undef N
12        printf ("We're so creative.\n");
(gdb) info macro ADD
Defined at /home/jimb/gdb/macros/play/sample.c:5
#define ADD(x) (M + x)
(gdb) info macro Q
Defined at /home/jimb/gdb/macros/play/sample.h:1
  included at /home/jimb/gdb/macros/play/sample.c:2
#define Q <
(gdb) macro expand ADD(1)
expands to: (42 + 1)
(gdb) macro expand-once ADD(1)
expands to: once (M + 1)
(gdb)
@end smallexample

In the example above, note that @command{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, GDB uses the macro definitions in force at
the source line of the current stack frame:

@smallexample
(gdb) break main
Breakpoint 1 at 0x8048370: file sample.c, line 10.
(gdb) run
Starting program: /home/jimb/gdb/macros/play/sample

Breakpoint 1, main () at sample.c:10
10        printf ("Hello, world!\n");
(gdb)
@end smallexample

At line 10, the definition of the macro @code{N} at line 9 is in force:

@smallexample
(gdb) info macro N
Defined at /home/jimb/gdb/macros/play/sample.c:9
#define N 28
(gdb) macro expand N Q M
expands to: 28 < 42
(gdb) print N Q M
$1 = 1
(gdb)
@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
(gdb) next
Hello, world!
12        printf ("We're so creative.\n");
(gdb) info macro N
The symbol `N' has no definition as a C/C++ preprocessor macro
at /home/jimb/gdb/macros/play/sample.c:12
(gdb) next
We're so creative.
14        printf ("Goodbye, world!\n");
(gdb) info macro N
Defined at /home/jimb/gdb/macros/play/sample.c:13
#define N 1729
(gdb) macro expand N Q M
expands to: 1729 < 42
(gdb) print N Q M
$2 = 0
(gdb)
@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.

This chapter describes the tracepoint commands and features.

@menu
* Set Tracepoints::
* Analyze Collected Data::
* Tracepoint Variables::
@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.  Like a breakpoint (@pxref{Set Breaks}), a
tracepoint has a number assigned to it by @value{GDBN}.  Like with
breakpoints, tracepoint numbers are successive integers starting from
one.  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.

This section describes commands to set tracepoints and associated
conditions and actions.

@menu
* Create and Delete Tracepoints::
* Enable and Disable Tracepoints::
* Tracepoint Passcounts::
* Tracepoint Actions::
* Listing Tracepoints::
* Starting and Stopping Trace Experiment::
@end menu

@node Create and Delete Tracepoints
@subsection Create and Delete Tracepoints

@table @code
@cindex set tracepoint
@kindex trace
@item trace
The @code{trace} command is very similar to the @code{break} command.
Its argument can be a source line, a function name, or an address in
the target program.  @xref{Set Breaks}.  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 commands
doesn't take effect until the next @code{tstart} command; thus, you
cannot change the tracepoint attributes once a trace experiment is
running.

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

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

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

@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
the next trace experiment, but it is not forgotten.  You can re-enable
a disabled tracepoint using the @code{enable tracepoint} command.

@kindex enable tracepoint
@item enable tracepoint @r{[}@var{num}@r{]}
Enable tracepoint @var{num}, or all tracepoints.  The enabled
tracepoints 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 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} and
@code{while-stepping}.

@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 while stepping.  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 $fp, $sp
  > end
end
@end smallexample

@kindex collect @r{(tracepoints)}
@item collect @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.
@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 command @code{info scope} (@pxref{Symbols, info scope}) is
particularly useful for figuring out what data to collect.

@kindex while-stepping @r{(tracepoints)}
@item while-stepping @var{n}
Perform @var{n} single-step traces after the tracepoint, collecting
new data at 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
You may abbreviate @code{while-stepping} as @code{ws} or
@code{stepping}.
@end table

@node Listing Tracepoints
@subsection Listing Tracepoints

@table @code
@kindex info tracepoints
@cindex information about tracepoints
@item info tracepoints @r{[}@var{num}@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.  For each tracepoint, the following information is
shown:

@itemize @bullet
@item
its number
@item
whether it is enabled or disabled
@item
its address
@item
its passcount as given by the @code{passcount @var{n}} command
@item
its step count as given by the @code{while-stepping @var{n}} command
@item
where in the source files is the tracepoint set
@item
its action list as given by the @code{actions} command
@end itemize

@smallexample
(@value{GDBP}) @b{info trace}
Num Enb Address    PassC StepC What
1   y   0x002117c4 0     0     <gdb_asm>
2   y   0x0020dc64 0     0     in g_test at g_test.c:1375
3   y   0x0020b1f4 0     0     in get_data at ../foo.c:41
(@value{GDBP})
@end smallexample

@noindent
This command can be abbreviated @code{info tp}.
@end table

@node Starting and Stopping Trace Experiment
@subsection Starting and Stopping Trace Experiment

@table @code
@kindex tstart
@cindex start a new trace experiment
@cindex collected data discarded
@item tstart
This command takes no arguments.  It starts the trace experiment, and
begins collecting data.  This has the side effect of discarding all
the data collected in the trace buffer during the previous trace
experiment.

@kindex tstop
@cindex stop a running trace experiment
@item tstop
This command takes no arguments.  It ends the trace experiment, and
stops collecting data.

@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


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

@item tfind range @var{addr1}, @var{addr2}
Find the next snapshot whose PC is between @var{addr1} and
@var{addr2}.  @c FIXME: Is the range inclusive or exclusive?

@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

@node save-tracepoints
@subsection @code{save-tracepoints @var{filename}}
@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}).

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

@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 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 off
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
@kindex 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}
@kindex overlay map-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}
@kindex overlay unmap-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
@kindex 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
@kindex overlay load-target
@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
(gdb) 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
(gdb) overlay list
No sections are mapped.
(gdb) 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
(gdb) overlay list
Section .ov.foo.text, loaded at 0x100000 - 0x100034,
        mapped at 0x1016 - 0x104a
(gdb) 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
* Support::                     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 .c
C source file

@item .C
@itemx .cc
@itemx .cp
@itemx .cpp
@itemx .cxx
@itemx .c++
C@t{++} 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.

@kindex show language
@kindex info frame@r{, show the source language}
@kindex info source@r{, show the source language}
@table @code
@item 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
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
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:

@kindex set extension-language
@kindex info extensions
@table @code
@item set extension-language @var{.ext} @var{language}
Set source files with extension @var{.ext} to be assumed to be in
the source language @var{language}.

@item 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{Support, ,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{Support, ,Supported languages}, for further
details on specific languages.

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

@kindex set check@r{, type}
@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{Support, ,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{Support, ,
Supported languages}, for further details on specific languages.

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

@kindex set check@r{, range}
@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{Support, ,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 Support
@section Supported languages

@value{GDBN} supports C, C@t{++}, Objective-C, Fortran, Java, assembly, and Modula-2.
@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{++}
* Objective-C::                 Objective-C
* Modula-2::                    Modula-2
@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}).

For best results when using @sc{gnu} C@t{++}, use the DWARF 2 debugging
format; if it doesn't work on your system, try the stabs+ debugging
format.  You can select those formats explicitly with the @code{g++}
command-line options @option{-gdwarf-2} and @option{-gstabs+}.
@xref{Debugging Options,,Options for Debugging Your Program or @sc{gnu}
CC, gcc.info, Using @sc{gnu} CC}.

@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{++}
@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})}
(or, if you prefer, simply @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.

@menu
* C Constants::
@end menu

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

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

@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

@menu
* C plus plus expressions::
* C Defaults::
* C Checks::

* Debugging C::
@end menu

@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
@value{NGCC} 2.95.3 or with @value{NGCC} 3.1 or newer, using the options
@option{-gdwarf-2} or @option{-gstabs+}.  DWARF 2 is preferred over
stabs+.  Most configurations of @value{NGCC} emit either DWARF 2 or
stabs+ as their default debug format, so you usually don't need to
specify a debug format explicitly.  Other compilers and/or debug formats
are likely to work badly or not at all when using @value{GDBN} to debug
C@t{++} code.
@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{++}.

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

In addition, when used with HP's C@t{++} compiler, @value{GDBN} supports
calling virtual functions correctly, printing out virtual bases of
objects, calling functions in a base subobject, casting objects, and
invoking user-defined operators.

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

@menu
* Debugging C plus plus::
@end menu

@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} breakpoint menus help you specify which function definition
you want.  @xref{Breakpoint Menus,,Breakpoint menus}.

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

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

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

@menu
* Method Names in Commands::
* The Print Command with Objective-C::
@end menu

@node Method Names in Commands, The Print Command with Objective-C, Objective-C, Objective-C
@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
@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 Modula-2,  , Objective-C, Support
@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 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:} Sets 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 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 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} set
the language automatically}, 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
@iftex
@vindex ::@r{, in Modula-2}
@end iftex

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

@kindex whatis
@item whatis @var{expr}
Print the data type of expression @var{expr}.  @var{expr} is not
actually evaluated, and any side-effecting operations (such as
assignments or function calls) inside it do not take place.
@xref{Expressions, ,Expressions}.

@item whatis
Print the data type of @code{$}, the last value in the value history.

@kindex ptype
@item ptype @var{typename}
Print a description of data type @var{typename}.  @var{typename} may be
the name of a type, or for C code it may have the form @samp{class
@var{class-name}}, @samp{struct @var{struct-tag}}, @samp{union
@var{union-tag}} or @samp{enum @var{enum-tag}}.

@item ptype @var{expr}
@itemx ptype
Print a description of the type of expression @var{expr}.  @code{ptype}
differs from @code{whatis} by printing a detailed description, instead
of just the name of the type.

For example, for this variable declaration:

@smallexample
struct complex @{double real; double imag;@} v;
@end smallexample

@noindent
the two commands give this output:

@smallexample
@group
(@value{GDBP}) whatis v
type = struct complex
(@value{GDBP}) ptype v
type = struct complex @{
    double real;
    double imag;
@}
@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.

@kindex info types
@item info types @var{regexp}
@itemx info types
Print a brief description of all types whose names match @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{addr}
List all the variables local to a particular scope.  This command
accepts a location---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.  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 (eg.
@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 declared
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
@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 reloading symbols
Some systems allow individual object files that make up your program to
be replaced without stopping and restarting your program.  For example,
in VxWorks you can simply recompile a defective object file and keep on
running.  If you are running on one of these systems, you can allow
@value{GDBN} to reload the symbols for automatically relinked modules:

@table @code
@kindex set symbol-reloading
@item set symbol-reloading on
Replace symbol definitions for the corresponding source file when an
object file with a particular name is seen again.

@item set symbol-reloading off
Do not replace symbol definitions when encountering object files of the
same name more than once.  This is the default state; if you are not
running on a system that permits automatic relinking of modules, you
should leave @code{symbol-reloading} off, since otherwise @value{GDBN}
may discard symbols when linking large programs, that may contain
several modules (from different directories or libraries) with the same
name.

@kindex show symbol-reloading
@item show symbol-reloading
Show the current @code{on} or @code{off} setting.
@end table

@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)
    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}
Resume execution at line @var{linespec}.  Execution stops again
immediately if there is a breakpoint there.  @xref{List, ,Printing
source lines}, for a description of the different forms of
@var{linespec}.  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.

@item jump *@var{address}
Resume execution at the instruction at address @var{address}.
@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

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

@node Calling
@section Calling program functions

@cindex calling functions
@kindex call
@table @code
@item call @var{expr}
Evaluate the expression @var{expr} without displaying @code{void}
returned values.
@end table

You can use this variant of the @code{print} command if you want to
execute a function from your program, but without cluttering the output
with @code{void} returned values.  If the result is not void, it
is printed and saved in the value history.

@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 @samp{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
* Symbol Errors::               Errors reading symbol 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.  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.

On systems with memory-mapped files, an auxiliary file named
@file{@var{filename}.syms} may hold symbol table information for
@var{filename}.  If so, @value{GDBN} maps in the symbol table from
@file{@var{filename}.syms}, starting up more quickly.  See the
descriptions of the file options @samp{-mapped} and @samp{-readnow}
(available on the command line, and with the commands @code{file},
@code{symbol-file}, or @code{add-symbol-file}, described below),
for more information.

@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 its convenience variables, the value history, and all 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{GCC}} 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
@kindex mapped
@cindex memory-mapped symbol file
@cindex saving symbol table
@item symbol-file @var{filename} @r{[} -readnow @r{]} @r{[} -mapped @r{]}
@itemx file @var{filename} @r{[} -readnow @r{]} @r{[} -mapped @r{]}
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.

If memory-mapped files are available on your system through the
@code{mmap} system call, you can use another option, @samp{-mapped}, to
cause @value{GDBN} to write the symbols for your program into a reusable
file.  Future @value{GDBN} debugging sessions map in symbol information
from this auxiliary symbol file (if the program has not changed), rather
than spending time reading the symbol table from the executable
program.  Using the @samp{-mapped} option has the same effect as
starting @value{GDBN} with the @samp{-mapped} command-line option.

You can use both options together, to make sure the auxiliary symbol
file has all the symbol information for your program.

The auxiliary symbol file for a program called @var{myprog} is called
@samp{@var{myprog}.syms}.  Once this file exists (so long as it is newer
than the corresponding executable), @value{GDBN} always attempts to use
it when you debug @var{myprog}; no special options or commands are
needed.

The @file{.syms} file is specific to the host machine where you run
@value{GDBN}.  It holds an exact image of the internal @value{GDBN}
symbol table.  It cannot be shared across multiple host platforms.

@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
@kindex core-file
@item core-file @r{[} @var{filename} @r{]}
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{]} @r{[} -mapped @r{]}
@itemx add-symbol-file @var{filename} @r{-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{@r{-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.

You can use the @samp{-mapped} and @samp{-readnow} options just as with
the @code{symbol-file} command, to change how @value{GDBN} manages the symbol
table information for @var{filename}.

@kindex add-shared-symbol-file
@item add-shared-symbol-file
The @code{add-shared-symbol-file} command can be used only under Harris' CXUX
operating system for the Motorola 88k.  @value{GDBN} automatically looks for
shared libraries, however if @value{GDBN} does not find yours, you can run
@code{add-shared-symbol-file}.  It takes no arguments.

@kindex section
@item section
The @code{section} command changes the base address of section SECTION of
the exec file to ADDR.  This can be used if the exec file does not contain
section addresses, (such as in the 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
@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.
@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
@value{GDBN} supports HP-UX, SunOS, SVr4, Irix 5, and IBM RS/6000 shared
libraries.

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

@kindex show auto-solib-add
@item show auto-solib-add
Display the current autoloading mode.
@end table

To explicitly load shared library symbols, use the @code{sharedlibrary}
command:

@table @code
@kindex info sharedlibrary
@kindex info share
@item info share
@itemx info sharedlibrary
Print the names of the shared libraries which are currently 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.
@end table

On some systems, such as HP-UX systems, @value{GDBN} supports
autoloading shared library symbols until a limiting threshold size is
reached.  This provides the benefit of allowing autoloading to remain on
by default, but avoids autoloading excessively large shared libraries,
up to a threshold that is initially set, but which you can modify if you
wish.

Beyond that threshold, symbols from shared libraries must be explicitly
loaded.  To load these symbols, use the command @code{sharedlibrary
@var{filename}}.  The base address of the shared library is determined
automatically by @value{GDBN} and need not be specified.

To display or set the threshold, use the commands:

@table @code
@kindex set auto-solib-limit
@item set auto-solib-limit @var{threshold}
Set the autoloading size threshold, in an integral number of megabytes.
If @var{threshold} is nonzero and shared library autoloading is enabled,
symbols from all shared object libraries will be loaded until the total
size of the loaded shared library symbols exceeds this threshold.
Otherwise, symbols must be loaded manually, using the
@code{sharedlibrary} command.  The default threshold is 100 (i.e.@: 100
Mb).

@kindex show auto-solib-limit
@item show auto-solib-limit
Display the current autoloading size threshold, in megabytes.
@end table

Shared libraries are also supported in many cross or remote debugging
configurations.  A copy of the target's libraries need to be present on the
host system; 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.

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
@kindex set solib-absolute-prefix
@item set solib-absolute-prefix @var{path}
If this variable is set, @var{path} will be used as a prefix for any
absolute shared library paths; many runtime loaders store the absolute
paths to the shared library in the target program's memory.  If you use
@samp{solib-absolute-prefix} 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{/usr/lib} hierarchy under @var{path}.

You can set the default value of @samp{solib-absolute-prefix} by using the
configure-time @samp{--with-sysroot} option.

@kindex show solib-absolute-prefix
@item show solib-absolute-prefix
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{solib-absolute-prefix} 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{solib-absolute-prefix}, be sure to
set @samp{solib-absolute-prefix} to a nonexistant directory to prevent
@value{GDBN} from finding your host's libraries.

@kindex show solib-search-path
@item show solib-search-path
Display the current shared library search path.
@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 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.

If an executable's debugging information has been extracted to a
separate file, the executable should contain a @dfn{debug link} giving
the name of the debugging information file (with no directory
components), and a checksum of its contents.  (The exact form of a
debug link is described below.)  If the full name of the directory
containing the executable is @var{execdir}, and the executable has a
debug link that specifies the name @var{debugfile}, then @value{GDBN}
will automatically search for the debugging information file in three
places:

@itemize @bullet
@item
the directory containing the executable file (that is, it will look
for a file named @file{@var{execdir}/@var{debugfile}},
@item
a subdirectory of that directory named @file{.debug} (that is, the
file @file{@var{execdir}/.debug/@var{debugfile}}, and
@item
a subdirectory of the global debug file directory that includes the
executable's full path, and the name from the link (that is, the file
@file{@var{globaldebugdir}/@var{execdir}/@var{debugfile}}, where
@var{globaldebugdir} is the global debug file directory, and
@var{execdir} has been turned into a relative path).
@end itemize
@noindent
@value{GDBN} checks under each of these names for a debugging
information file whose checksum matches that given in the link, and
reads the debugging information from the first one it finds.

So, for example, if you ask @value{GDBN} to debug @file{/usr/bin/ls},
which has a link containing the name @file{ls.debug}, and the global
debug directory is @file{/usr/lib/debug}, then @value{GDBN} will look
for debug information in @file{/usr/bin/ls.debug},
@file{/usr/bin/.debug/ls.debug}, and
@file{/usr/lib/debug/usr/bin/ls.debug}.

You can set the global debugging info directory's name, and view the
name @value{GDBN} is currently using.

@table @code

@kindex set debug-file-directory
@item set debug-file-directory @var{directory}
Set the directory which @value{GDBN} searches for separate debugging
information files to @var{directory}.

@kindex show debug-file-directory
@item show debug-file-directory
Show the directory @value{GDBN} searches for separate debugging
information files.

@end table

@cindex @code{.gnu_debuglink} sections
@cindex debug links
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.

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.

As of December 2002, there is no standard GNU utility to produce
separated executable / debugging information file pairs.  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} removes the debugging information from
the executable file @file{foo}, places it in the file
@file{foo.debug}, and leaves behind a debug link in @file{foo}.

Since there are many different ways to compute CRC's (different
polynomials, reversals, byte ordering, etc.), the simplest way to
describe the CRC used in @code{.gnu_debuglink} sections is to give the
complete code for a function that computes it:

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


@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 Targets
@chapter Specifying a Debugging Target

@cindex debugging target
@kindex 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}).

@menu
* Active Targets::              Active targets
* Target Commands::             Commands for managing targets
* Byte Order::                  Choosing target byte order
* Remote::                      Remote debugging
* KOD::                         Kernel Object Display

@end menu

@node Active Targets
@section Active targets

@cindex stacking targets
@cindex active targets
@cindex multiple targets

There are three classes of targets: processes, core files, and
executable files.  @value{GDBN} can work concurrently on up to three
active targets, one in each class.  This allows you to (for example)
start a process and inspect its activity without abandoning your work on
a core file.

For example, if you execute @samp{gdb a.out}, then the executable file
@code{a.out} is the only active target.  If you designate a core file as
well---presumably from a prior run that crashed and coredumped---then
@value{GDBN} has two active targets and uses them in tandem, looking
first in the corefile target, then in the executable file, to satisfy
requests for memory addresses.  (Typically, these two classes of target
are complementary, since core files contain only a program's
read-write memory---variables and so on---plus machine status, while
executable files contain only the program text and initialized data.)

When you type @code{run}, your executable file becomes an active process
target as well.  When a process target is active, all @value{GDBN}
commands requesting memory addresses refer to that target; addresses in
an active core file or executable file target are obscured while the
process target is active.

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

Here are some common targets (available, or not, depending on the GDB
configuration):

@table @code
@kindex target exec
@item target exec @var{program}
An executable file.  @samp{target exec @var{program}} is the same as
@samp{exec-file @var{program}}.

@kindex target core
@item target core @var{filename}
A core dump file.  @samp{target core @var{filename}} is the same as
@samp{core-file @var{filename}}.

@kindex target remote
@item target remote @var{dev}
Remote serial target in GDB-specific protocol.  The argument @var{dev}
specifies what serial device to use for the connection (e.g.
@file{/dev/ttya}). @xref{Remote, ,Remote debugging}.  @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.

@kindex target sim
@item target sim
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

@kindex target nrom
@item target nrom @var{dev}
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.

@table @code

@kindex load @var{filename}
@item load @var{filename}
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.

@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 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 big
@item set endian big
Instruct @value{GDBN} to assume the target is big-endian.

@kindex set endian little
@item set endian little
Instruct @value{GDBN} to assume the target is little-endian.

@kindex set endian auto
@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
@section Remote debugging
@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.

@node KOD
@section Kernel Object Display
@cindex kernel object display
@cindex KOD

Some targets support kernel object display.  Using this facility,
@value{GDBN} communicates specially with the underlying operating system
and can display information about operating system-level objects such as
mutexes and other synchronization objects.  Exactly which objects can be
displayed is determined on a per-OS basis.

@kindex set os
Use the @code{set os} command to set the operating system.  This tells
@value{GDBN} which kernel object display module to initialize:

@smallexample
(@value{GDBP}) set os cisco
@end smallexample

@kindex show os
The associated command @code{show os} displays the operating system
set with the @code{set os} command; if no operating system has been
set, @code{show os} will display an empty string @samp{""}.

If @code{set os} succeeds, @value{GDBN} will display some information
about the operating system, and will create a new @code{info} command
which can be used to query the target.  The @code{info} command is named
after the operating system:

@kindex info cisco
@smallexample
(@value{GDBP}) info cisco
List of Cisco Kernel Objects
Object     Description
any        Any and all objects
@end smallexample

Further subcommands can be used to query about particular objects known
by the kernel.

There is currently no way to determine whether a given operating
system is supported other than to try setting it with @kbd{set os
@var{name}}, where @var{name} is the name of the operating system you
want to try.


@node Remote Debugging
@chapter Debugging remote programs

@menu
* Connecting::                  Connecting to a remote target
* Server::	                Using the gdbserver program
* NetWare::                     Using the gdbserve.nlm 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 symobl and debugging information.
Start up @value{GDBN} as usual, using the name of the local copy of your
program as the first argument.

@cindex serial line, @code{target remote}
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
before the @code{target} command.

After that, use @code{target remote} to establish communications with
the target machine.  Its argument specifies how to communicate---either
via a devicename attached to a direct serial line, or a TCP or UDP port
(possibly to a terminal server which in turn has a serial line to the
target).  For example, to use a serial line connected to the device
named @file{/dev/ttyb}:

@smallexample
target remote /dev/ttyb
@end smallexample

@cindex TCP port, @code{target remote}
To use a TCP connection, use an argument of the form
@code{@var{host}:@var{port}} or @code{tcp:@var{host}:@var{port}}.
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 of 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.

@cindex UDP port, @code{target remote}
To use a UDP connection, use an argument of the form
@code{udp:@var{host}:@var{port}}.  For example, to connect to UDP port 2828
on a terminal server named @code{manyfarms}:

@smallexample
target remote udp:manyfarms:2828
@end smallexample

When using a UDP connection for remote debugging, you should keep in mind
that the `U' stands for ``Unreliable''.  UDP can silently drop packets on
busy or unreliable networks, which will cause havoc with your debugging
session.

Now you can use all the usual commands to examine and change data and to
step and continue the remote program.

@cindex interrupting remote programs
@cindex remote programs, interrupting
Whenever @value{GDBN} is waiting for the remote program, if you type the
interrupt character (often @key{C-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.
@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.

@table @emph
@item On the target machine,
you need to have a copy of the program you want to debug.
@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.  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.

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 @var{comm} --attach @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
@cindex attach to a program by name
You can debug processes by name instead of process ID if your target has the
@code{pidof} utility:

@smallexample
target> gdbserver @var{comm} --attach `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.

@item On the host machine,
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}.  You don't need to use the @code{load}
command in @value{GDBN} when using gdbserver, since the program is
already on the target.

@end table

@node NetWare
@section Using the @code{gdbserve.nlm} program

@kindex gdbserve.nlm
@code{gdbserve.nlm} is a control program for NetWare systems, which
allows you to connect your program with a remote @value{GDBN} via
@code{target remote}.

@value{GDBN} and @code{gdbserve.nlm} communicate via a serial line,
using the standard @value{GDBN} remote serial protocol.

@table @emph
@item On the target machine,
you need to have a copy of the program you want to debug.
@code{gdbserve.nlm} 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 syntax is:

@smallexample
load gdbserve [ BOARD=@var{board} ] [ PORT=@var{port} ]
              [ BAUD=@var{baud} ] @var{program} [ @var{args} @dots{} ]
@end smallexample

@var{board} and @var{port} specify the serial line; @var{baud} specifies
the baud rate used by the connection.  @var{port} and @var{node} default
to 0, @var{baud} defaults to 9600@dmn{bps}.

For example, to debug Emacs with the argument @samp{foo.txt}and
communicate with @value{GDBN} over serial port number 2 or board 1
using a 19200@dmn{bps} connection:

@smallexample
load gdbserve BOARD=1 PORT=2 BAUD=19200 emacs foo.txt
@end smallexample

@item
On the @value{GDBN} host machine, connect to your target (@pxref{Connecting,,
Connecting to a remote target}).

@end table

@node Remote configuration
@section Remote configuration

The following configuration options are available when debugging remote
programs:

@table @code
@kindex set remote hardware-watchpoint-limit
@kindex set remote hardware-breakpoint-limit
@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.
@end table

@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
@kindex 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 near the
beginning of your program.

@item handle_exception
@kindex 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()
@kindex 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)
@kindex 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})
@kindex 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()
@kindex 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)
@kindex 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{GCC}} 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 near the top of your program:

@smallexample
set_debug_traps();
breakpoint();
@end smallexample

@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
* SVR4 Process Information::    SVR4 process information
* DJGPP Native::                Features specific to the DJGPP port
* Cygwin Native::		Features specific to the Cygwin port
@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 SVR4 Process Information
@subsection SVR4 process information

@kindex /proc
@cindex process image

Many versions of SVR4 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 on
several kinds of information about the process running your program.
@code{info proc} works only on SVR4 systems that include the
@code{procfs} code.  This includes OSF/1 (Digital Unix), Solaris, Irix,
and Unixware, but not HP-UX or @sc{gnu}/Linux, for example.

@table @code
@kindex info proc
@item info proc
Summarize available information about the process.

@kindex info proc mappings
@item info proc mappings
Report on the address ranges accessible in the program, with information
on whether your program may read, write, or execute each range.
@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.

@kindex info proc status
@item info proc status
General information on the state of the process.  If the process is
stopped, this report includes the reason for stopping, and any signal
received.

@item info proc all
Show all the above information about the process.
@end ignore
@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

@sc{djgpp} is the port of @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 linear address @var{addr} 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
the 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 prints 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 of
this command clearly shows that addresses in conventional memory are
mapped 1:1, i.e.@: the physical and linear addresses are identical.

This command is supported only with some DPMI servers.
@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. There are various
additional Cygwin-specific commands, described in this subsection.  The
subsubsection @pxref{Non-debug DLL symbols} describes working with DLLs
that have no debugging 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 the six segment registers.

@kindex info dll
@item info dll
This is a Cygwin specific alias of 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 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}i, 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
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 events seen by the debugger.

@kindex set debugexec
@item set debugexec
This boolean value adds debug output concerning execute events
seen by the debugger.

@kindex set debugexceptions
@item set debugexceptions
This boolean value adds debug ouptut concerning exception events
seen by the debugger.

@kindex set debugmemory
@item set debugmemory
This boolean value adds debug ouptut concerning memory events
seen 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 subsubsection
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 @pxref{Files} or the
@code{dll-symbols} command in @pxref{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} (see
@pxref{Symbols}). Here's an example:

@smallexample
(gdb) info function CreateFileA
All functions matching regular expression "CreateFileA":

Non-debugging symbols:
0x77e885f4  CreateFileA
0x77e885f4  KERNEL32!CreateFileA
@end smallexample

@smallexample
(gdb) 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
(gdb) print 'cygwin1!__argv'
$1 = 268572168
@end smallexample

@smallexample
(gdb) x 'cygwin1!__argv'
0x10021610:      "\230y\""
@end smallexample

And two possible solutions:

@smallexample
(gdb) print ((char **)'cygwin1!__argv')[0]
$2 = 0x22fd98 "/cygdrive/c/mydirectory/myprogram"
@end smallexample

@smallexample
(gdb) x/2x &'cygwin1!__argv'
0x610c0aa8 <cygwin1!__argv>:    0x10021608      0x00000000
(gdb) x/x 0x10021608
0x10021608:     0x0022fd98
(gdb) 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
(gdb) 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 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.

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


@menu
* ARM::                         ARM
* H8/300::                      Renesas H8/300
* H8/500::                      Renesas H8/500
* M32R/D::                      Renesas M32R/D
* M68K::                        Motorola M68K
* MIPS Embedded::               MIPS Embedded
* OpenRISC 1000::               OpenRisc 1000
* PA::                          HP PA Embedded
* PowerPC:                      PowerPC
* SH::                          Renesas SH
* Sparclet::                    Tsqware Sparclet
* Sparclite::                   Fujitsu Sparclite
* ST2000::                      Tandem ST2000
* Z8000::                       Zilog Z8000
@end menu

@node ARM
@subsection ARM

@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

@node H8/300
@subsection Renesas H8/300

@table @code

@kindex target hms@r{, with H8/300}
@item target hms @var{dev}
A Renesas SH, H8/300, or H8/500 board, attached via serial line to your host.
Use special commands @code{device} and @code{speed} to control the serial
line and the communications speed used.

@kindex target e7000@r{, with H8/300}
@item target e7000 @var{dev}
E7000 emulator for Renesas H8 and SH.

@kindex target sh3@r{, with H8/300}
@kindex target sh3e@r{, with H8/300}
@item target sh3 @var{dev}
@itemx target sh3e @var{dev}
Renesas SH-3 and SH-3E target systems.

@end table

@cindex download to H8/300 or H8/500
@cindex H8/300 or H8/500 download
@cindex download to Renesas SH
@cindex Renesas SH download
When you select remote debugging to a Renesas SH, H8/300, or H8/500
board, the @code{load} command downloads your program to the Renesas
board and also opens it as the current executable target for
@value{GDBN} on your host (like the @code{file} command).

@value{GDBN} needs to know these things to talk to your
Renesas SH, H8/300, or H8/500:

@enumerate
@item
that you want to use @samp{target hms}, the remote debugging interface
for Renesas microprocessors, or @samp{target e7000}, the in-circuit
emulator for the Renesas SH and the Renesas 300H.  (@samp{target hms} is
the default when @value{GDBN} is configured specifically for the Renesas SH,
H8/300, or H8/500.)

@item
what serial device connects your host to your Renesas board (the first
serial device available on your host is the default).

@item
what speed to use over the serial device.
@end enumerate

@menu
* Renesas Boards::      Connecting to Renesas boards.
* Renesas ICE::         Using the E7000 In-Circuit Emulator.
* Renesas Special::     Special @value{GDBN} commands for Renesas micros.
@end menu

@node Renesas Boards
@subsubsection Connecting to Renesas boards

@c only for Unix hosts
@kindex device
@cindex serial device, Renesas micros
Use the special @code{@value{GDBN}} command @samp{device @var{port}} if you
need to explicitly set the serial device.  The default @var{port} is the
first available port on your host.  This is only necessary on Unix
hosts, where it is typically something like @file{/dev/ttya}.

@kindex speed
@cindex serial line speed, Renesas micros
@code{@value{GDBN}} has another special command to set the communications
speed: @samp{speed @var{bps}}.  This command also is only used from Unix
hosts; on DOS hosts, set the line speed as usual from outside @value{GDBN} with
the DOS @code{mode} command (for instance,
@w{@kbd{mode com2:9600,n,8,1,p}} for a 9600@dmn{bps} connection).

The @samp{device} and @samp{speed} commands are available only when you
use a Unix host to debug your Renesas microprocessor programs.  If you
use a DOS host,
@value{GDBN} depends on an auxiliary terminate-and-stay-resident program
called @code{asynctsr} to communicate with the development board
through a PC serial port.  You must also use the DOS @code{mode} command
to set up the serial port on the DOS side.

The following sample session illustrates the steps needed to start a
program under @value{GDBN} control on an H8/300.  The example uses a
sample H8/300 program called @file{t.x}.  The procedure is the same for
the Renesas SH and the H8/500.

First hook up your development board.  In this example, we use a
board attached to serial port @code{COM2}; if you use a different serial
port, substitute its name in the argument of the @code{mode} command.
When you call @code{asynctsr}, the auxiliary comms program used by the
debugger, you give it just the numeric part of the serial port's name;
for example, @samp{asyncstr 2} below runs @code{asyncstr} on
@code{COM2}.

@smallexample
C:\H8300\TEST> asynctsr 2
C:\H8300\TEST> mode com2:9600,n,8,1,p

Resident portion of MODE loaded

COM2: 9600, n, 8, 1, p

@end smallexample

@quotation
@emph{Warning:} We have noticed a bug in PC-NFS that conflicts with
@code{asynctsr}.  If you also run PC-NFS on your DOS host, you may need to
disable it, or even boot without it, to use @code{asynctsr} to control
your development board.
@end quotation

@kindex target hms@r{, and serial protocol}
Now that serial communications are set up, and the development board is
connected, you can start up @value{GDBN}.  Call @code{@value{GDBP}} with
the name of your program as the argument.  @code{@value{GDBN}} prompts
you, as usual, with the prompt @samp{(@value{GDBP})}.  Use two special
commands to begin your debugging session: @samp{target hms} to specify
cross-debugging to the Renesas board, and the @code{load} command to
download your program to the board.  @code{load} displays the names of
the program's sections, and a @samp{*} for each 2K of data downloaded.
(If you want to refresh @value{GDBN} data on symbols or on the
executable file without downloading, use the @value{GDBN} commands
@code{file} or @code{symbol-file}.  These commands, and @code{load}
itself, are described in @ref{Files,,Commands to specify files}.)

@smallexample
(eg-C:\H8300\TEST) @value{GDBP} t.x
@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 1992 Free Software Foundation, Inc...
(@value{GDBP}) target hms
Connected to remote H8/300 HMS system.
(@value{GDBP}) load t.x
.text   : 0x8000 .. 0xabde ***********
.data   : 0xabde .. 0xad30 *
.stack  : 0xf000 .. 0xf014 *
@end smallexample

At this point, you're ready to run or debug your program.  From here on,
you can use all the usual @value{GDBN} commands.  The @code{break} command
sets breakpoints; the @code{run} command starts your program;
@code{print} or @code{x} display data; the @code{continue} command
resumes execution after stopping at a breakpoint.  You can use the
@code{help} command at any time to find out more about @value{GDBN} commands.

Remember, however, that @emph{operating system} facilities aren't
available on your development board; for example, if your program hangs,
you can't send an interrupt---but you can press the @sc{reset} switch!

Use the @sc{reset} button on the development board
@itemize @bullet
@item
to interrupt your program (don't use @kbd{ctl-C} on the DOS host---it has
no way to pass an interrupt signal to the development board); and

@item
to return to the @value{GDBN} command prompt after your program finishes
normally.  The communications protocol provides no other way for @value{GDBN}
to detect program completion.
@end itemize

In either case, @value{GDBN} sees the effect of a @sc{reset} on the
development board as a ``normal exit'' of your program.

@node Renesas ICE
@subsubsection Using the E7000 in-circuit emulator

@kindex target e7000@r{, with Renesas ICE}
You can use the E7000 in-circuit emulator to develop code for either the
Renesas SH or the H8/300H.  Use one of these forms of the @samp{target
e7000} command to connect @value{GDBN} to your E7000:

@table @code
@item target e7000 @var{port} @var{speed}
Use this form if your E7000 is connected to a serial port.  The
@var{port} argument identifies what serial port to use (for example,
@samp{com2}).  The third argument is the line speed in bits per second
(for example, @samp{9600}).

@item target e7000 @var{hostname}
If your E7000 is installed as a host on a TCP/IP network, you can just
specify its hostname; @value{GDBN} uses @code{telnet} to connect.
@end table

@node Renesas Special
@subsubsection Special @value{GDBN} commands for Renesas micros

Some @value{GDBN} commands are available only for the H8/300:

@table @code

@kindex set machine
@kindex show machine
@item set machine h8300
@itemx set machine h8300h
Condition @value{GDBN} for one of the two variants of the H8/300
architecture with @samp{set machine}.  You can use @samp{show machine}
to check which variant is currently in effect.

@end table

@node H8/500
@subsection H8/500

@table @code

@kindex set memory @var{mod}
@cindex memory models, H8/500
@item set memory @var{mod}
@itemx show memory
Specify which H8/500 memory model (@var{mod}) you are using with
@samp{set memory}; check which memory model is in effect with @samp{show
memory}.  The accepted values for @var{mod} are @code{small},
@code{big}, @code{medium}, and @code{compact}.

@end table

@node M32R/D
@subsection Renesas M32R/D

@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

@node M68K
@subsection M68k

The Motorola m68k configuration includes ColdFire support, and
target command for the following ROM monitors.

@table @code

@kindex target abug
@item target abug @var{dev}
ABug ROM monitor for M68K.

@kindex target cpu32bug
@item target cpu32bug @var{dev}
CPU32BUG monitor, running on a CPU32 (M68K) board.

@kindex target dbug
@item target dbug @var{dev}
dBUG ROM monitor for Motorola ColdFire.

@kindex target est
@item target est @var{dev}
EST-300 ICE monitor, running on a CPU32 (M68K) board.

@kindex target rom68k
@item target rom68k @var{dev}
ROM 68K monitor, running on an M68K IDP board.

@end table

@table @code

@kindex target rombug
@item target rombug @var{dev}
ROMBUG ROM monitor for OS/9000.

@end table

@node MIPS Embedded
@subsection MIPS Embedded

@cindex MIPS boards
@value{GDBN} can use the MIPS remote debugging protocol to talk to a
MIPS board attached to a serial line.  This is available when
you configure @value{GDBN} with @samp{--target=mips-idt-ecoff}.

@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 MIPS targets:

@table @code
@item set processor @var{args}
@itemx show processor
@kindex set processor @var{args}
@kindex show processor
Use the @code{set processor} command to set the type of MIPS
processor when you want to access processor-type-specific registers.
For example, @code{set processor @var{r3041}} tells @value{GDBN}
to use the CPU registers appropriate for the 3041 chip.
Use the @code{show processor} command to see what MIPS processor @value{GDBN}
is using.  Use the @code{info reg} command to see what registers
@value{GDBN} is using.

@item set mipsfpu double
@itemx set mipsfpu single
@itemx set mipsfpu none
@itemx show mipsfpu
@kindex set mipsfpu
@kindex show mipsfpu
@cindex MIPS remote floating point
@cindex floating point, MIPS remote
If your target board does not support the 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 remotedebug @var{n}
@itemx show remotedebug
@kindex set remotedebug@r{, MIPS protocol}
@kindex show remotedebug@r{, MIPS protocol}
@cindex @code{remotedebug}, MIPS protocol
@cindex MIPS @code{remotedebug} protocol
@c FIXME! For this to be useful, you must know something about the MIPS
@c FIXME...protocol.  Where is it described?
You can see some debugging information about communications with the board
by setting the @code{remotedebug} variable.  If you set it to @code{1} using
@samp{set remotedebug 1}, every packet is displayed.  If you set it
to @code{2}, every character is displayed.  You can check the current value
at any time with the command @samp{show remotedebug}.

@item set timeout @var{seconds}
@itemx set retransmit-timeout @var{seconds}
@itemx show timeout
@itemx show retransmit-timeout
@cindex @code{timeout}, MIPS protocol
@cindex @code{retransmit-timeout}, 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 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 acknowledgement 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-idt-ecoff}.)

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.
@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 Effecive 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 info
@item htrace info
Display information about current HW trace configuration.

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

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

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

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

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

@kindex htrace rewind
@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.

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

@kindex htrace mode continuous
@item htrace mode continuous
Set continuous trace mode.

@kindex htrace mode suspend
@item htrace mode suspend
Set suspend trace mode.

@end table

@node PowerPC
@subsection PowerPC

@table @code

@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

@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 SH
@subsection Renesas SH

@table @code

@kindex target hms@r{, with Renesas SH}
@item target hms @var{dev}
A Renesas SH board attached via serial line to your host.  Use special
commands @code{device} and @code{speed} to control the serial line and
the communications speed used.

@kindex target e7000@r{, with Renesas SH}
@item target e7000 @var{dev}
E7000 emulator for Renesas SH.

@kindex target sh3@r{, with SH}
@kindex target sh3e@r{, with SH}
@item target sh3 @var{dev}
@item target sh3e @var{dev}
Renesas SH-3 and SH-3E target systems.

@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 "-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 ST2000
@subsection Tandem ST2000

@value{GDBN} may be used with a Tandem ST2000 phone switch, running Tandem's
STDBUG protocol.

To connect your ST2000 to the host system, see the manufacturer's
manual.  Once the ST2000 is physically attached, you can run:

@smallexample
target st2000 @var{dev} @var{speed}
@end smallexample

@noindent
to establish it as your debugging environment.  @var{dev} is normally
the name of a serial device, such as @file{/dev/ttya}, connected to the
ST2000 via a serial line.  You can instead specify @var{dev} as a TCP
connection (for example, to a serial line attached via a terminal
concentrator) using the syntax @code{@var{hostname}:@var{portnumber}}.

The @code{load} and @code{attach} commands are @emph{not} defined for
this target; you must load your program into the ST2000 as you normally
would for standalone operation.  @value{GDBN} reads debugging information
(such as symbols) from a separate, debugging version of the program
available on your host computer.
@c FIXME!! This is terribly vague; what little content is here is
@c basically hearsay.

@cindex ST2000 auxiliary commands
These auxiliary @value{GDBN} commands are available to help you with the ST2000
environment:

@table @code
@item st2000 @var{command}
@kindex st2000 @var{cmd}
@cindex STDBUG commands (ST2000)
@cindex commands to STDBUG (ST2000)
Send a @var{command} to the STDBUG monitor.  See the manufacturer's
manual for available commands.

@item connect
@cindex connect (to STDBUG)
Connect the controlling terminal to the STDBUG command monitor.  When
you are done interacting with STDBUG, typing either of two character
sequences gets you back to the @value{GDBN} command prompt:
@kbd{@key{RET}~.} (Return, followed by tilde and period) or
@kbd{@key{RET}~@key{C-d}} (Return, followed by tilde and control-D).
@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 Architectures
@section Architectures

This section describes characteristics of architectures that affect
all uses of @value{GDBN} with the architecture, both native and cross.

@menu
* A29K::
* Alpha::
* MIPS::
@end menu

@node A29K
@subsection A29K

@table @code

@kindex set rstack_high_address
@cindex AMD 29K register stack
@cindex register stack, AMD29K
@item set rstack_high_address @var{address}
On AMD 29000 family processors, registers are saved in a separate
@dfn{register stack}.  There is no way for @value{GDBN} to determine the
extent of this stack.  Normally, @value{GDBN} just assumes that the
stack is ``large enough''.  This may result in @value{GDBN} referencing
memory locations that do not exist.  If necessary, you can get around
this problem by specifying the ending address of the register stack with
the @code{set rstack_high_address} command.  The argument should be an
address, which you probably want to precede with @samp{0x} to specify in
hexadecimal.

@kindex show rstack_high_address
@item show rstack_high_address
Display the current limit of the register stack, on AMD 29000 family
processors.

@end table

@node Alpha
@subsection Alpha

See the following section.

@node MIPS
@subsection MIPS

@cindex stack on Alpha
@cindex stack on MIPS
@cindex Alpha stack
@cindex MIPS stack
Alpha- and 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, 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, 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.

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


@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
* History::                     Command history
* Screen Size::                 Screen size
* Numbers::                     Numbers
* ABI::                         Configuring the current ABI
* Messages/Warnings::           Optional warnings and messages
* Debugging Output::            Optional messages about internal happenings
@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

@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

@node History
@section 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.

@table @code
@cindex history substitution
@cindex history file
@kindex set history filename
@kindex GDBHISTFILE
@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 history save
@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
@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

@cindex history expansion
History expansion assigns special meaning to the character @kbd{!}.
@ifset have-readline-appendices
@xref{Event Designators}.
@end ifset

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
@kindex set history expansion
@item set history expansion on
@itemx set history expansion
Enable history expansion.  History expansion is off by default.

@item set history expansion off
Disable history expansion.

The readline code comes with more complete documentation of
editing and history expansion features.  Users unfamiliar with @sc{gnu} Emacs
or @code{vi} may wish to read it.
@ifset have-readline-appendices
@xref{Command Line Editing}.
@end ifset

@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 shows
@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.
@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 begin with none of these 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 @code{set
radix} command.

@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 default radix; for
example, any of

@smallexample
set radix 012
set radix 10.
set radix 0xa
@end smallexample

@noindent
sets the base to decimal.  On the other hand, @samp{set radix 10}
leaves the radix unchanged no matter what it was.

@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 default 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.
@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
@kindex set coerce-float-to-double

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
@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.
@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 Messages/Warnings
@section Optional warnings and messages

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

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.

@item set confirm on
Enables confirmation requests (the default).

@kindex show confirm
@item show confirm
Displays state of confirmation requests.

@end table

@node Debugging Output
@section Optional messages about internal happenings
@table @code
@kindex set debug arch
@item set debug arch
Turns on or off display of gdbarch debugging info. The default is off
@kindex show debug arch
@item show debug arch
Displays the current state of displaying gdbarch debugging info.
@kindex set debug event
@item set debug event
Turns on or off display of @value{GDBN} event debugging info. The
default is off.
@kindex show debug event
@item show debug event
Displays the current state of displaying @value{GDBN} event debugging
info.
@kindex set debug expression
@item set debug expression
Turns on or off display of @value{GDBN} expression debugging info. The
default is off.
@kindex show debug expression
@item show debug expression
Displays the current state of displaying @value{GDBN} expression
debugging info.
@kindex set debug frame
@item set debug frame
Turns on or off display of @value{GDBN} frame debugging info.  The
default is off.
@kindex show debug frame
@item show debug frame
Displays the current state of displaying @value{GDBN} frame debugging
info.
@kindex set debug overload
@item set debug overload
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.
@kindex show debug overload
@item show debug overload
Displays the current state of displaying @value{GDBN} C@t{++} overload
debugging info.
@kindex set debug remote
@cindex packets, reporting on stdout
@cindex serial connections, debugging
@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.
@kindex show debug remote
@item show debug remote
Displays the state of display of remote packets.
@kindex set debug serial
@item set debug serial
Turns on or off display of @value{GDBN} serial debugging info. The
default is off.
@kindex show debug serial
@item show debug serial
Displays the current state of displaying @value{GDBN} serial debugging
info.
@kindex set debug target
@item set debug target
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 off.
@kindex show debug target
@item show debug target
Displays the current state of displaying @value{GDBN} target debugging
info.
@kindex set debug varobj
@item set debug varobj
Turns on or off display of @value{GDBN} variable object debugging
info. The default is off.
@kindex show debug varobj
@item show debug varobj
Displays the current state of displaying @value{GDBN} variable object
debugging info.
@end table

@node Sequences
@chapter 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::                      User-defined commands
* Hooks::                       User-defined command hooks
* Command Files::               Command files
* Output::                      Commands for controlled output
@end menu

@node Define
@section User-defined commands

@cindex user-defined command
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 @var{$arg0@dots{}$arg9}.  A trivial example:

@smallexample
define adder
  print $arg0 + $arg1 + $arg2
@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.

@table @code

@kindex define
@item define @var{commandname}
Define a command named @var{commandname}.  If there is already a command
by that name, you are asked to confirm that you want to redefine it.

The 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 if
@kindex else
@item if
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 (nonzero).
There can then optionally be a line @code{else}, 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
The 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}.
The commands are executed repeatedly as long as the expression
evaluates to true.

@kindex document
@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 help user-defined
@item help user-defined
List all user-defined commands, with the first line of the documentation
(if any) for each.

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

@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 GDB suspects an
infinite recursion and aborts the command.

@end table

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
@section User-defined command hooks
@cindex command hooks
@cindex hooks, for commands
@cindex hooks, pre-command

@kindex hook
@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
@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 infinte 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 SIGLARM pass
end
@end smallexample

As a further example, to hook at the begining 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?
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
@section Command files

@cindex command files
A command file for @value{GDBN} is a file 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.

@cindex init file
@cindex @file{.gdbinit}
@cindex @file{gdb.ini}
When you start @value{GDBN}, it automatically executes commands from its
@dfn{init files}, normally called @file{.gdbinit}@footnote{The DJGPP
port of @value{GDBN} uses the name @file{gdb.ini} instead, due to the
limitations of file names imposed by DOS filesystems.}.
During startup, @value{GDBN} does the following:

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

@item
Processes command line options and operands.

@item
Reads the init file (if any) in the current working directory.

@item
Reads command files specified by the @samp{-x} option.
@end enumerate

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

@cindex init file name
On some configurations of @value{GDBN}, the init file is known by a
different name (these are typically environments where a specialized
form of @value{GDBN} may need to coexist with other forms, hence a
different name for the specialized version's init file).  These are the
environments with special init file names:

@cindex @file{.vxgdbinit}
@itemize @bullet
@item
VxWorks (Wind River Systems real-time OS): @file{.vxgdbinit}

@cindex @file{.os68gdbinit}
@item
OS68K (Enea Data Systems real-time OS): @file{.os68gdbinit}

@cindex @file{.esgdbinit}
@item
ES-1800 (Ericsson Telecom AB M68000 emulator): @file{.esgdbinit}
@end itemize

You can also request the execution of a command file with the
@code{source} command:

@table @code
@kindex source
@item source @var{filename}
Execute the command file @var{filename}.
@end table

The lines in a command file are executed sequentially.  They 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.

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

@node Output
@section 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{string}, @var{expressions}@dots{}
Print the values of the @var{expressions} under the control of
@var{string}.  The @var{expressions} are separated by commas and may be
either numbers or pointers.  Their values are printed as specified by
@var{string}, exactly as if your program were to execute the C
subroutine
@c FIXME: the above implies that at least all ANSI C formats are
@c supported, but it isn't true: %E and %G don't work (or so it seems).
@c Either this is a bug, or the manual should document what formats are
@c supported.

@smallexample
printf (@var{string}, @var{expressions}@dots{});
@end smallexample

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

The only backslash-escape sequences that you can use in the format
string are the simple ones that consist of backslash followed by a
letter.
@end table

@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

@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 in short,
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 is available only when @value{GDBN} is configured
with the @code{--enable-tui} configure option (@pxref{Configure Options}).

@node TUI Overview
@section TUI overview

The TUI has two display modes that can be switched while
@value{GDBN} runs:

@itemize @bullet
@item
A curses (or TUI) mode in which it displays several text
windows on the terminal.

@item
A standard mode which corresponds to the @value{GDBN} configured without
the TUI.
@end itemize

In the TUI mode, @value{GDBN} can display several text window
on the terminal:

@table @emph
@item command
This window is the @value{GDBN} command window with the @value{GDBN}
prompt and the @value{GDBN} outputs.  The @value{GDBN} input is still
managed using readline but through the TUI.  The @emph{command}
window is always visible.

@item source
The source window shows the source file of the program.  The current
line as well as 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.  It detects when
a register is changed and when this is the case, registers that have
changed are highlighted.

@end table

The source and assembly windows show the current program position
by highlighting the current line and marking them with the @samp{>} marker.
Breakpoints are also indicated with two markers.  A first one
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 attached to the thread
and the frame position.  They are updated when the current thread
changes, when the frame changes or when the program counter changes.
These three windows are arranged by the TUI according to several
layouts.  The layout defines which of these three windows are visible.
The following layouts are available:

@itemize @bullet
@item
source

@item
assembly

@item
source and assembly

@item
source and registers

@item
assembly and registers

@end itemize

On top of the command window a status line gives various information
concerning the current process begin debugged.  The status line is
updated when the information it shows changes.  The following fields
are displayed:

@table @emph
@item target
Indicates the current gdb target
(@pxref{Targets, ,Specifying a Debugging Target}).

@item process
Gives information about 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
(@pxref{Command Line Editing}).
They allow to leave or enter in the TUI mode or they operate
directly on the TUI layout and windows.  The TUI also provides
a @emph{SingleKey} keymap which binds several keys directly to
@value{GDBN} commands.  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 the TUI mode is left,
the curses window management is left and @value{GDBN} operates using
its standard mode writing on the terminal directly.  When the TUI
mode is entered, the 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 shows already two windows, a 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) to 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
Use the TUI @emph{SingleKey} keymap that binds single key to gdb commands
(@pxref{TUI Single Key Mode}).

@end table

The following key bindings are handled only by the TUI mode:

@table @key
@kindex PgUp
@item PgUp
Scroll the active window one page up.

@kindex PgDn
@item PgDn
Scroll the active window one page down.

@kindex Up
@item Up
Scroll the active window one line up.

@kindex Down
@item Down
Scroll the active window one line down.

@kindex Left
@item Left
Scroll the active window one column left.

@kindex Right
@item Right
Scroll the active window one column right.

@kindex C-L
@item C-L
Refresh the screen.

@end table

In the TUI mode, the arrow keys are used by the active window
for scrolling.  This means they are available for readline when the
active window is the command window.  When the command window
does not have the focus, it is necessary to use other readline
key bindings such as @key{C-p}, @key{C-n}, @key{C-b} and @key{C-f}.

@node TUI Single Key Mode
@section TUI Single Key Mode
@cindex TUI single key mode

The TUI provides a @emph{SingleKey} mode in which it installs a particular
key binding in the readline keymaps to connect single keys to
some gdb commands.

@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 @emph{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 @emph{SingleKey} mode.  Once the command is entered the TUI
@emph{SingleKey} mode is restored.  The only way to permanently leave
this mode is by hitting @key{q} or @samp{@key{C-x} @key{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, that is they do not depend on
the current terminal mode in which @value{GDBN} runs.  When @value{GDBN}
is in the standard mode, using these commands will automatically switch
in the TUI mode.

@table @code
@item info win
@kindex info win
List and give the size of all displayed windows.

@item layout next
@kindex layout next
Display the next layout.

@item layout prev
@kindex layout prev
Display the previous layout.

@item layout src
@kindex layout src
Display the source window only.

@item layout asm
@kindex layout asm
Display the assembly window only.

@item layout split
@kindex layout split
Display the source and assembly window.

@item layout regs
@kindex layout regs
Display the register window together with the source or assembly window.

@item focus next | prev | src | asm | regs | split
@kindex focus
Set the focus to the named window.
This command allows to change the active window so that scrolling keys
can be affected to another window.

@item refresh
@kindex refresh
Refresh the screen.  This is similar to using @key{C-L} key.

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

@end table

@node TUI Configuration
@section TUI configuration variables
@cindex TUI configuration variables

The TUI has several configuration variables that control the
appearance of windows on the terminal.

@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 ascii characters + - and | 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 active-border-mode @var{mode}
@kindex set tui active-border-mode
Select the attributes to display the border of the active window.
The possible values are @code{normal}, @code{standout}, @code{reverse},
@code{half}, @code{half-standout}, @code{bold} and @code{bold-standout}.

@item set tui border-mode @var{mode}
@kindex set tui border-mode
Select the attributes to display the border of other windows.
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.)

Using @value{GDBN} under Emacs is just like using @value{GDBN} normally except for two
things:

@itemize @bullet
@item
All ``terminal'' input and output goes through the Emacs buffer.
@end itemize

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.

@itemize @bullet
@item
@value{GDBN} displays source code through Emacs.
@end itemize

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.

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 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 @value{GDBN} I/O 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 @value{GDBN} I/O 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' @value{GDBN} 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 SPC} (@code{gud-break})
tells @value{GDBN} to set a breakpoint on the source line point is on.

If you type @kbd{M-x speedbar}, then Emacs displays a separate frame which
shows a backtrace when the @value{GDBN} I/O 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.

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.

The description given here is for GNU Emacs version 21.3 and a more
detailed description of its 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}.  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.

@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

@heading Acknowledgments

In alphabetic order: Andrew Cagney, Fernando Nasser, Stan Shebs and
Elena Zannoni.

@menu
* GDB/MI Command Syntax::
* GDB/MI Compatibility with CLI::
* GDB/MI Output Records::
* GDB/MI Command Description Format::
* GDB/MI Breakpoint Table Commands::
* GDB/MI Data Manipulation::
* GDB/MI Program Control::
* GDB/MI Miscellaneous Commands::
@ignore
* GDB/MI Kod Commands::
* GDB/MI Memory Overlay Commands::
* GDB/MI Signal Handling Commands::
@end ignore
* GDB/MI Stack Manipulation::
* GDB/MI Symbol Query::
* GDB/MI Target Manipulation::
* GDB/MI Thread Commands::
* GDB/MI Tracepoint Commands::
* GDB/MI Variable Objects::
@end menu

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Command Syntax
@section @sc{gdb/mi} Command Syntax

@menu
* GDB/MI Input Syntax::
* GDB/MI Output Syntax::
* GDB/MI Simple Examples::
@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{(@value{GDBP})}.

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.  If an execution
command is interrupted by the @samp{-exec-interrupt} command, the
@var{token} associated with the @samp{*stopped} message is the one of the
original execution command, not the one of the interrupt 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.

@node GDB/MI Simple Examples
@subsection 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}.

@subsubheading Target Stop
@c Ummm... There is no "-stop" command. This assumes async, no?
Here's an example of stopping the inferior process:

@smallexample
-> -stop
<- (@value{GDBP})
@end smallexample

@noindent
and later:

@smallexample
<- *stop,reason="stop",address="0x123",source="a.c:123"
<- (@value{GDBP})
@end smallexample

@subsubheading Simple CLI Command

Here's an example of a simple CLI command being passed through
@sc{gdb/mi} and on to the CLI.

@smallexample
-> print 1+2
<- &"print 1+2\n"
<- ~"$1 = 3\n"
<- ^done
<- (@value{GDBP})
@end smallexample

@subsubheading Command With Side Effects

@smallexample
-> -symbol-file xyz.exe
<- *breakpoint,nr="3",address="0x123",source="a.c:123"
<- (@value{GDBP})
@end smallexample

@subsubheading A Bad Command

Here's what happens if you pass a non-existent command:

@smallexample
-> -rubbish
<- ^error,msg="Undefined MI command: rubbish"
<- (@value{GDBP})
@end smallexample

@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
To help users familiar with @value{GDBN}'s existing CLI interface, @sc{gdb/mi}
accepts existing CLI commands.  As specified by the syntax, such
commands can be directly entered into the @sc{gdb/mi} interface and @value{GDBN} will
respond.

This mechanism is provided as an aid to developers of @sc{gdb/mi}
clients and not as a reliable interface into the CLI.  Since the command
is being interpreteted in an environment that assumes @sc{gdb/mi}
behaviour, the exact output of such commands is likely to end up being
an un-supported hybrid of @sc{gdb/mi} and CLI output.

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Output Records
@section @sc{gdb/mi} Output Records

@menu
* GDB/MI Result Records::
* GDB/MI Stream Records::
* GDB/MI Out-of-band Records::
@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
@c Is this one correct?  Should it be an out-of-band notification?
The asynchronous operation was successfully started.  The target is
running.

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

@item "&" @var{string-output}
The log stream contains debugging messages being produced by @value{GDBN}'s
internals.
@end table

@node GDB/MI Out-of-band Records
@subsection @sc{gdb/mi} Out-of-band Records

@cindex out-of-band records in @sc{gdb/mi}
@cindex @sc{gdb/mi}, out-of-band records
@dfn{Out-of-band} 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} (e.g., a breakpoint modified) or a result of
target activity (e.g., target stopped).

The following is a preliminary list of possible out-of-band records.

@table @code
@item "*" "stop"
@end table


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

Note the the line breaks shown in the examples are here only for
readability.  They don't appear in the real output.
Also note that the commands with a non-available example (N.A.@:) are
not yet implemented.

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

The corresponding @value{GDBN} CLI command.

@subsubheading Result

@subsubheading Out-of-band

@subsubheading Notes

@subsubheading Example


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Breakpoint Table Commands
@section @sc{gdb/mi} Breakpoint table 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
(@value{GDBP})
-break-insert main
^done,bkpt=@{number="1",addr="0x000100d0",file="hello.c",line="5"@}
(@value{GDBP})
-break-after 1 3
~
^done
(@value{GDBP})
-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",line="5",times="0",
ignore="3"@}]@}
(@value{GDBP})
@end smallexample

@ignore
@subheading The @code{-break-catch} Command
@findex -break-catch

@subheading The @code{-break-commands} Command
@findex -break-commands
@end ignore


@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
(@value{GDBP})
-break-condition 1 1
^done
(@value{GDBP})
-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",line="5",cond="1",
times="0",ignore="3"@}]@}
(@value{GDBP})
@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
(@value{GDBP})
-break-delete 1
^done
(@value{GDBP})
-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=[]@}
(@value{GDBP})
@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
(@value{GDBP})
-break-disable 2
^done
(@value{GDBP})
-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",line="5",times="0"@}]@}
(@value{GDBP})
@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
(@value{GDBP})
-break-enable 2
^done
(@value{GDBP})
-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",line="5",times="0"@}]@}
(@value{GDBP})
@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 ] [ -r ]
    [ -c @var{condition} ] [ -i @var{ignore-count} ]
    [ -p @var{thread} ] [ @var{line} | @var{addr} ]
@end smallexample

@noindent
If specified, @var{line}, 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 tempoary breakpoint.
@item -h
Insert a hardware breakpoint.
@item -c @var{condition}
Make the breakpoint conditional on @var{condition}.
@item -i @var{ignore-count}
Initialize the @var{ignore-count}.
@item -r
Insert a regular breakpoint in all the functions whose names match the
given regular expression.  Other flags are not applicable to regular
expresson.
@end table

@subsubheading Result

The result is in the form:

@smallexample
 ^done,bkptno="@var{number}",func="@var{funcname}",
  file="@var{filename}",line="@var{lineno}"
@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, and @var{lineno} is the source line number within that file.

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}, @samp{thbreak}, and @samp{rbreak}.

@subsubheading Example

@smallexample
(@value{GDBP})
-break-insert main
^done,bkpt=@{number="1",addr="0x0001072c",file="recursive2.c",line="4"@}
(@value{GDBP})
-break-insert -t foo
^done,bkpt=@{number="2",addr="0x00010774",file="recursive2.c",line="11"@}
(@value{GDBP})
-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",line="4",times="0"@},
bkpt=@{number="2",type="breakpoint",disp="del",enabled="y",
addr="0x00010774",func="foo",file="recursive2.c",line="11",times="0"@}]@}
(@value{GDBP})
-break-insert -r foo.*
~int foo(int, int);
^done,bkpt=@{number="3",addr="0x00010774",file="recursive2.c",line="11"@}
(@value{GDBP})
@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
(@value{GDBP})
-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",line="13",times="0"@}]@}
(@value{GDBP})
@end smallexample

Here's an example of the result when there are no breakpoints:

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

@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
(@value{GDBP})
-break-watch x
^done,wpt=@{number="2",exp="x"@}
(@value{GDBP})
-exec-continue
^running
^done,reason="watchpoint-trigger",wpt=@{number="2",exp="x"@},
value=@{old="-268439212",new="55"@},
frame=@{func="main",args=[],file="recursive2.c",line="5"@}
(@value{GDBP})
@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
(@value{GDBP})
-break-watch C
^done,wpt=@{number="5",exp="C"@}
(@value{GDBP})
-exec-continue
^running
^done,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",line="13"@}
(@value{GDBP})
-exec-continue
^running
^done,reason="watchpoint-scope",wpnum="5",
frame=@{func="callee3",args=[@{name="strarg",
value="0x11940 \"A string argument.\""@}],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="18"@}
(@value{GDBP})
@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
(@value{GDBP})
-break-watch C
^done,wpt=@{number="2",exp="C"@}
(@value{GDBP})
-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",line="8",times="1"@},
bkpt=@{number="2",type="watchpoint",disp="keep",
enabled="y",addr="",what="C",times="0"@}]@}
(@value{GDBP})
-exec-continue
^running
^done,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",line="13"@}
(@value{GDBP})
-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",line="8",times="1"@},
bkpt=@{number="2",type="watchpoint",disp="keep",
enabled="y",addr="",what="C",times="-5"@}]@}
(@value{GDBP})
-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",line="18"@}
(@value{GDBP})
-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",line="8",times="1"@}]@}
(@value{GDBP})
@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 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) or 1 (meaning mixed source and
disassembly).
@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
directely 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
(@value{GDBP})
-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>"@}]
(@value{GDBP})
@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 "@}]
(@value{GDBP})
@end smallexample

Disassemble 3 instructions from the start of @code{main}:

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

Disassemble 3 instructions from the start of @code{main} in mixed mode:

@smallexample
(@value{GDBP})
-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"@}]@}]
(@value{GDBP})
@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"
(@value{GDBP})
311-data-evaluate-expression &A
311^done,value="0xefffeb7c"
(@value{GDBP})
411-data-evaluate-expression A+3
411^done,value="4"
(@value{GDBP})
511-data-evaluate-expression "A + 3"
511^done,value="4"
(@value{GDBP})
@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
(@value{GDBP})
-exec-continue
^running

(@value{GDBP})
*stopped,reason="breakpoint-hit",bkptno="1",frame=@{func="main",
args=[],file="try.c",line="5"@}
(@value{GDBP})
-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"]
(@value{GDBP})
@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
(@value{GDBP})
-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"]
(@value{GDBP})
-data-list-register-names 1 2 3
^done,register-names=["r1","r2","r3"]
(@value{GDBP})
@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
(@value{GDBP})
-data-list-register-values r 64 65
^done,register-values=[@{number="64",value="0xfe00a300"@},
@{number="65",value="0x00029002"@}]
(@value{GDBP})
-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"@}]
(@value{GDBP})
@end smallexample


@subheading The @code{-data-read-memory} Command
@findex -data-read-memory

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

Read two bytes of memory starting at address @code{shorts + 64} and
display as a single word formatted in decimal.

@smallexample
(@value{GDBP})
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"]@}]
(@value{GDBP})
@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
(@value{GDBP})
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=",-./"@}]
(@value{GDBP})
@end smallexample

@subheading The @code{-display-delete} Command
@findex -display-delete

@subsubheading Synopsis

@smallexample
 -display-delete @var{number}
@end smallexample

Delete the display @var{number}.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{delete display}.

@subsubheading Example
N.A.


@subheading The @code{-display-disable} Command
@findex -display-disable

@subsubheading Synopsis

@smallexample
 -display-disable @var{number}
@end smallexample

Disable display @var{number}.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{disable display}.

@subsubheading Example
N.A.


@subheading The @code{-display-enable} Command
@findex -display-enable

@subsubheading Synopsis

@smallexample
 -display-enable @var{number}
@end smallexample

Enable display @var{number}.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{enable display}.

@subsubheading Example
N.A.


@subheading The @code{-display-insert} Command
@findex -display-insert

@subsubheading Synopsis

@smallexample
 -display-insert @var{expression}
@end smallexample

Display @var{expression} every time the program stops.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{display}.

@subsubheading Example
N.A.


@subheading The @code{-display-list} Command
@findex -display-list

@subsubheading Synopsis

@smallexample
 -display-list
@end smallexample

List the displays.  Do not show the current values.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info display}.

@subsubheading Example
N.A.


@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
(@value{GDBP})
-environment-cd /kwikemart/marge/ezannoni/flathead-dev/devo/gdb
^done
(@value{GDBP})
@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-seperator
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
(@value{GDBP})
-environment-directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb
^done,source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd"
(@value{GDBP})
-environment-directory ""
^done,source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd"
(@value{GDBP})
-environment-directory -r /home/jjohnstn/src/gdb /usr/src
^done,source-path="/home/jjohnstn/src/gdb:/usr/src:$cdir:$cwd"
(@value{GDBP})
-environment-directory -r
^done,source-path="$cdir:$cwd"
(@value{GDBP})
@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-seperator
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
(@value{GDBP})
-environment-path
^done,path="/usr/bin"
(@value{GDBP})
-environment-path /kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb /bin
^done,path="/kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb:/bin:/usr/bin"
(@value{GDBP})
-environment-path -r /usr/local/bin
^done,path="/usr/local/bin:/usr/bin"
(@value{GDBP})
@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
(@value{GDBP})
-environment-pwd
^done,cwd="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb"
(@value{GDBP})
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Program Control
@section @sc{gdb/mi} Program control

@subsubheading Program termination

As a result of execution, the inferior program can run to completion, if
it doesn't encounter any breakpoints.  In this case the output will
include an exit code, if the program has exited exceptionally.

@subsubheading Examples

@noindent
Program exited normally:

@smallexample
(@value{GDBP})
-exec-run
^running
(@value{GDBP})
x = 55
*stopped,reason="exited-normally"
(@value{GDBP})
@end smallexample

@noindent
Program exited exceptionally:

@smallexample
(@value{GDBP})
-exec-run
^running
(@value{GDBP})
x = 55
*stopped,reason="exited",exit-code="01"
(@value{GDBP})
@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
(@value{GDBP})
*stopped,reason="exited-signalled",signal-name="SIGINT",
signal-meaning="Interrupt"
@end smallexample


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


@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

@c FIXME!
Don't have one around.


@subheading The @code{-exec-continue} Command
@findex -exec-continue

@subsubheading Synopsis

@smallexample
 -exec-continue
@end smallexample

Asynchronous command.  Resumes the execution of the inferior program
until a breakpoint is encountered, or until the inferior exits.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} corresponding is @samp{continue}.

@subsubheading Example

@smallexample
-exec-continue
^running
(@value{GDBP})
@@Hello world
*stopped,reason="breakpoint-hit",bkptno="2",frame=@{func="foo",args=[],
file="hello.c",line="13"@}
(@value{GDBP})
@end smallexample


@subheading The @code{-exec-finish} Command
@findex -exec-finish

@subsubheading Synopsis

@smallexample
 -exec-finish
@end smallexample

Asynchronous command.  Resumes the execution of the inferior program
until the current function is exited.  Displays the results returned by
the function.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{finish}.

@subsubheading Example

Function returning @code{void}.

@smallexample
-exec-finish
^running
(@value{GDBP})
@@hello from foo
*stopped,reason="function-finished",frame=@{func="main",args=[],
file="hello.c",line="7"@}
(@value{GDBP})
@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
(@value{GDBP})
*stopped,reason="function-finished",frame=@{addr="0x000107b0",func="foo",
args=[@{name="a",value="1"],@{name="b",value="9"@}@},
file="recursive2.c",line="14"@},
gdb-result-var="$1",return-value="0"
(@value{GDBP})
@end smallexample


@subheading The @code{-exec-interrupt} Command
@findex -exec-interrupt

@subsubheading Synopsis

@smallexample
 -exec-interrupt
@end smallexample

Asynchronous command.  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.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{interrupt}.

@subsubheading Example

@smallexample
(@value{GDBP})
111-exec-continue
111^running

(@value{GDBP})
222-exec-interrupt
222^done
(@value{GDBP})
111*stopped,signal-name="SIGINT",signal-meaning="Interrupt",
frame=@{addr="0x00010140",func="foo",args=[],file="try.c",line="13"@}
(@value{GDBP})

(@value{GDBP})
-exec-interrupt
^error,msg="mi_cmd_exec_interrupt: Inferior not executing."
(@value{GDBP})
@end smallexample


@subheading The @code{-exec-next} Command
@findex -exec-next

@subsubheading Synopsis

@smallexample
 -exec-next
@end smallexample

Asynchronous command.  Resumes execution of the inferior program, stopping
when the beginning of the next source line is reached.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{next}.

@subsubheading Example

@smallexample
-exec-next
^running
(@value{GDBP})
*stopped,reason="end-stepping-range",line="8",file="hello.c"
(@value{GDBP})
@end smallexample


@subheading The @code{-exec-next-instruction} Command
@findex -exec-next-instruction

@subsubheading Synopsis

@smallexample
 -exec-next-instruction
@end smallexample

Asynchronous command.  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.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{nexti}.

@subsubheading Example

@smallexample
(@value{GDBP})
-exec-next-instruction
^running

(@value{GDBP})
*stopped,reason="end-stepping-range",
addr="0x000100d4",line="5",file="hello.c"
(@value{GDBP})
@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
(@value{GDBP})
200-break-insert callee4
200^done,bkpt=@{number="1",addr="0x00010734",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"@}
(@value{GDBP})
000-exec-run
000^running
(@value{GDBP})
000*stopped,reason="breakpoint-hit",bkptno="1",
frame=@{func="callee4",args=[],
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"@}
(@value{GDBP})
205-break-delete
205^done
(@value{GDBP})
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",line="18"@}
(@value{GDBP})
@end smallexample


@subheading The @code{-exec-run} Command
@findex -exec-run

@subsubheading Synopsis

@smallexample
 -exec-run
@end smallexample

Asynchronous command.  Starts execution of the inferior from the
beginning.  The inferior executes until either a breakpoint is
encountered or the program exits.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{run}.

@subsubheading Example

@smallexample
(@value{GDBP})
-break-insert main
^done,bkpt=@{number="1",addr="0x0001072c",file="recursive2.c",line="4"@}
(@value{GDBP})
-exec-run
^running
(@value{GDBP})
*stopped,reason="breakpoint-hit",bkptno="1",
frame=@{func="main",args=[],file="recursive2.c",line="4"@}
(@value{GDBP})
@end smallexample


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

@c @subheading -exec-signal

@subheading The @code{-exec-step} Command
@findex -exec-step

@subsubheading Synopsis

@smallexample
 -exec-step
@end smallexample

Asynchronous command.  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.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{step}.

@subsubheading Example

Stepping into a function:

@smallexample
-exec-step
^running
(@value{GDBP})
*stopped,reason="end-stepping-range",
frame=@{func="foo",args=[@{name="a",value="10"@},
@{name="b",value="0"@}],file="recursive2.c",line="11"@}
(@value{GDBP})
@end smallexample

Regular stepping:

@smallexample
-exec-step
^running
(@value{GDBP})
*stopped,reason="end-stepping-range",line="14",file="recursive2.c"
(@value{GDBP})
@end smallexample


@subheading The @code{-exec-step-instruction} Command
@findex -exec-step-instruction

@subsubheading Synopsis

@smallexample
 -exec-step-instruction
@end smallexample

Asynchronous command.  Resumes the inferior which executes one machine
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
(@value{GDBP})
-exec-step-instruction
^running

(@value{GDBP})
*stopped,reason="end-stepping-range",
frame=@{func="foo",args=[],file="try.c",line="10"@}
(@value{GDBP})
-exec-step-instruction
^running

(@value{GDBP})
*stopped,reason="end-stepping-range",
frame=@{addr="0x000100f4",func="foo",args=[],file="try.c",line="10"@}
(@value{GDBP})
@end smallexample


@subheading The @code{-exec-until} Command
@findex -exec-until

@subsubheading Synopsis

@smallexample
 -exec-until [ @var{location} ]
@end smallexample

Asynchronous command.  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
(@value{GDBP})
-exec-until recursive2.c:6
^running
(@value{GDBP})
x = 55
*stopped,reason="location-reached",frame=@{func="main",args=[],
file="recursive2.c",line="6"@}
(@value{GDBP})
@end smallexample

@ignore
@subheading -file-clear
Is this going away????
@end ignore


@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
(@value{GDBP})
-file-exec-and-symbols /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
^done
(@value{GDBP})
@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
(@value{GDBP})
-file-exec-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
^done
(@value{GDBP})
@end smallexample


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


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

@subsubheading @value{GDBN} Command

There's no @value{GDBN} command which directly corresponds to this one.

@subsubheading Example

@smallexample
(@value{GDBP})
123-file-list-exec-source-file
123^done,line="1",file="foo.c",fullname="/home/bar/foo.c"
(@value{GDBP})
@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.

@subsubheading @value{GDBN} Command

There's no @value{GDBN} command which directly corresponds to this one.
@code{gdbtk} has an analogous command @samp{gdb_listfiles}.

@subsubheading Example
N.A.


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


@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
(@value{GDBP})
-file-symbol-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
^done
(@value{GDBP})
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Miscellaneous Commands
@section Miscellaneous @value{GDBN} commands in @sc{gdb/mi}

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

@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
(@value{GDBP})
-gdb-set $foo=3
^done
(@value{GDBP})
@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
(@value{GDBP})
-gdb-show annotate
^done,value="0"
(@value{GDBP})
@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

There's no equivalent @value{GDBN} command.  @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
(@value{GDBP})
-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
(@value{GDBP})
@end smallexample

@subheading The @code{-interpreter-exec} Command
@findex -interpreter-exec

@subheading Synopsis

@smallexample
-interpreter-exec @var{interpreter} @var{command}
@end smallexample

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

@ignore
@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Kod Commands
@section @sc{gdb/mi} Kod Commands

The Kod commands are not implemented.

@c @subheading -kod-info

@c @subheading -kod-list

@c @subheading -kod-list-object-types

@c @subheading -kod-show

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

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{info frame} or @samp{frame}
(without arguments).

@subsubheading Example
N.A.

@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
(@value{GDBP})
-stack-info-depth
^done,depth="12"
(@value{GDBP})
-stack-info-depth 4
^done,depth="4"
(@value{GDBP})
-stack-info-depth 12
^done,depth="12"
(@value{GDBP})
-stack-info-depth 11
^done,depth="11"
(@value{GDBP})
-stack-info-depth 13
^done,depth="12"
(@value{GDBP})
@end smallexample

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

@subsubheading Synopsis

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

The @var{show-values} argument must have a value of 0 or 1.  A value of
0 means that only the names of the arguments are listed, a value of 1
means that both names and values of the arguments are printed.

@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
(@value{GDBP})
-stack-list-frames
^done,
stack=[
frame=@{level="0",addr="0x00010734",func="callee4",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"@},
frame=@{level="1",addr="0x0001076c",func="callee3",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="17"@},
frame=@{level="2",addr="0x0001078c",func="callee2",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="22"@},
frame=@{level="3",addr="0x000107b4",func="callee1",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="27"@},
frame=@{level="4",addr="0x000107e0",func="main",
file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="32"@}]
(@value{GDBP})
-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=[]@}]
(@value{GDBP})
-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=[]@}]
(@value{GDBP})
-stack-list-arguments 0 2 2
^done,stack-args=[frame=@{level="2",args=[name="intarg",name="strarg"]@}]
(@value{GDBP})
-stack-list-arguments 1 2 2
^done,stack-args=[frame=@{level="2",
args=[@{name="intarg",value="2"@},
@{name="strarg",value="0x11940 \"A string argument.\""@}]@}]
(@value{GDBP})
@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{line}
Line number corresponding to the @code{$pc}.
@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.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} commands are @samp{backtrace} and @samp{where}.

@subsubheading Example

Full stack backtrace:

@smallexample
(@value{GDBP})
-stack-list-frames
^done,stack=
[frame=@{level="0",addr="0x0001076c",func="foo",
  file="recursive2.c",line="11"@},
frame=@{level="1",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="2",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="3",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="4",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="5",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="6",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="7",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="8",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="9",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="10",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="11",addr="0x00010738",func="main",
  file="recursive2.c",line="4"@}]
(@value{GDBP})
@end smallexample

Show frames between @var{low_frame} and @var{high_frame}:

@smallexample
(@value{GDBP})
-stack-list-frames 3 5
^done,stack=
[frame=@{level="3",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="4",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@},
frame=@{level="5",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@}]
(@value{GDBP})
@end smallexample

Show a single frame:

@smallexample
(@value{GDBP})
-stack-list-frames 3 3
^done,stack=
[frame=@{level="3",addr="0x000107a4",func="foo",
  file="recursive2.c",line="14"@}]
(@value{GDBP})
@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 current frame.  With an
argument of 0 or @code{--no-values}, prints only the names of the variables.
With argument of 1 or @code{--all-values}, prints also their values.  With
argument of 2 or @code{--simple-values}, prints the name, type and value for
simple data types and the name and type for arrays, structures and
unions.  In this last case, the idea is that the user can see the
value of simple data types immediately and he can create variable
objects for other data types if he wishes to explore their values in
more detail.

@subsubheading @value{GDBN} Command

@samp{info locals} in @value{GDBN}, @samp{gdb_get_locals} in @code{gdbtk}.

@subsubheading Example

@smallexample
(@value{GDBP})
-stack-list-locals 0
^done,locals=[name="A",name="B",name="C"]
(@value{GDBP})
-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]"@}]
(@value{GDBP})
@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 current frame.  Select a different frame @var{framenum} on
the stack.

@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
(@value{GDBP})
-stack-select-frame 2
^done
(@value{GDBP})
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Symbol Query
@section @sc{gdb/mi} Symbol Query Commands


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


@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
(@value{GDBP})
-symbol-list-lines basics.c
^done,lines=[@{pc="0x08048554",line="7"@},@{pc="0x0804855a",line="8"@}]
(@value{GDBP})
@end smallexample


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


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

Attach to a process @var{pid} or a file @var{file} outside of @value{GDBN}.

@subsubheading @value{GDBN} command

The corresponding @value{GDBN} command is @samp{attach}.

@subsubheading Example
N.A.


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


@subheading The @code{-target-detach} Command
@findex -target-detach

@subsubheading Synopsis

@smallexample
 -target-detach
@end smallexample

Disconnect from the remote target.  There's no output.

@subsubheading @value{GDBN} command

The corresponding @value{GDBN} command is @samp{detach}.

@subsubheading Example

@smallexample
(@value{GDBP})
-target-detach
^done
(@value{GDBP})
@end smallexample


@subheading The @code{-target-disconnect} Command
@findex -target-disconnect

@subsubheading Synopsis

@example
 -target-disconnect
@end example

Disconnect from the remote target.  There's no output.

@subsubheading @value{GDBN} command

The corresponding @value{GDBN} command is @samp{disconnect}.

@subsubheading Example

@smallexample
(@value{GDBP})
-target-disconnect
^done
(@value{GDBP})
@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
(@value{GDBP})
-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"
(@value{GDBP})
@end smallexample


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

@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{async}, @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
(@value{GDBP})
-target-select async /dev/ttya
^connected,addr="0xfe00a300",func="??",args=[]
(@value{GDBP})
@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
@end smallexample

@subsubheading @value{GDBN} command

No equivalent.

@subsubheading Example
N.A.


@subheading The @code{-thread-list-all-threads} Command
@findex -thread-list-all-threads

@subsubheading Synopsis

@smallexample
 -thread-list-all-threads
@end smallexample

@subsubheading @value{GDBN} Command

The equivalent @value{GDBN} command is @samp{info threads}.

@subsubheading Example
N.A.


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

@subsubheading @value{GDBN} Command

Part of @samp{info threads} supplies the same information.

@subsubheading Example

No threads present, besides the main process:

@smallexample
(@value{GDBP})
-thread-list-ids
^done,thread-ids=@{@},number-of-threads="0"
(@value{GDBP})
@end smallexample


Several threads:

@smallexample
(@value{GDBP})
-thread-list-ids
^done,thread-ids=@{thread-id="3",thread-id="2",thread-id="1"@},
number-of-threads="3"
(@value{GDBP})
@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.

@subsubheading @value{GDBN} Command

The corresponding @value{GDBN} command is @samp{thread}.

@subsubheading Example

@smallexample
(@value{GDBP})
-exec-next
^running
(@value{GDBP})
*stopped,reason="end-stepping-range",thread-id="2",line="187",
file="../../../devo/gdb/testsuite/gdb.threads/linux-dp.c"
(@value{GDBP})
-thread-list-ids
^done,
thread-ids=@{thread-id="3",thread-id="2",thread-id="1"@},
number-of-threads="3"
(@value{GDBP})
-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"@}
(@value{GDBP})
@end smallexample

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Tracepoint Commands
@section @sc{gdb/mi} Tracepoint Commands

The tracepoint commands are not yet implemented.

@c @subheading -trace-actions

@c @subheading -trace-delete

@c @subheading -trace-disable

@c @subheading -trace-dump

@c @subheading -trace-enable

@c @subheading -trace-exists

@c @subheading -trace-find

@c @subheading -trace-frame-number

@c @subheading -trace-info

@c @subheading -trace-insert

@c @subheading -trace-list

@c @subheading -trace-pass-count

@c @subheading -trace-save

@c @subheading -trace-start

@c @subheading -trace-stop


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Variable Objects
@section @sc{gdb/mi} Variable Objects


@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

@subheading Introduction to Variable Objects in @sc{gdb/mi}

@cindex variable objects in @sc{gdb/mi}
The basic idea behind variable objects is the creation of a named object
to represent a variable, an expression, a memory location or even a CPU
register.  For each object created, a set of operations is available for
examining or changing its properties.

Furthermore, complex data types, such as C structures, are represented
in a tree format.  For instance, the @code{struct} type variable is the
root and the children will represent the struct members.  If a child
is itself of a complex type, it will also have children of its own.
Appropriate language differences are handled for C, C@t{++} and Java.

When returning the actual values of the objects, this facility allows
for the individual selection of the display format used in the result
creation.  It can be chosen among: binary, decimal, hexadecimal, octal
and natural.  Natural refers to a default format automatically
chosen based on the variable type (like decimal for an @code{int}, hex
for pointers, etc.).

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{-var-create}
@tab create a variable object
@item @code{-var-delete}
@tab delete the variable object and 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 what 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
@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{-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} on 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.

@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

@subsubheading Result

This operation returns the name, number of children and the type of the
object created.  Type is returned as a string as the ones generated by
the @value{GDBN} CLI:

@smallexample
 name="@var{name}",numchild="N",type="@var{type}"
@end smallexample


@subheading The @code{-var-delete} Command
@findex -var-delete

@subsubheading Synopsis

@smallexample
 -var-delete @var{name}
@end smallexample

Deletes a previously created variable object and all of its 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}.

The syntax for the @var{format-spec} is as follows:

@smallexample
 @var{format-spec} @expansion{}
 @{binary | decimal | hexadecimal | octal | natural@}
@end smallexample


@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


@subheading The @code{-var-list-children} Command
@findex -var-list-children

@subsubheading Synopsis

@smallexample
 -var-list-children [@var{print-values}] @var{name}
@end smallexample

Returns a list of the children of the specified variable object.  With
just the variable object name as an argument or with an optional
preceding argument of 0 or @code{--no-values}, prints only the names of the
variables.  With an optional preceding argument of 1 or @code{--all-values},
also prints their values.

@subsubheading Example

@smallexample
(@value{GDBP})
 -var-list-children n
 numchild=@var{n},children=[@{name=@var{name},
 numchild=@var{n},type=@var{type}@},@r{(repeats N times)}]
(@value{GDBP})
 -var-list-children --all-values n
 numchild=@var{n},children=[@{name=@var{name},
 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 what is represented by the variable object @var{name}:

@smallexample
 lang=@var{lang-spec},exp=@var{expression}
@end smallexample

@noindent
where @var{lang-spec} is @code{@{"C" | "C++" | "Java"@}}.

@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 @var{name}
@end smallexample

Evaluates the expression that is represented by the specified variable
object and returns its value as a string in the current format specified
for the object:

@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
(@value{GDBP})
-var-assign var1 3
^done,value="3"
(@value{GDBP})
-var-update *
^done,changelist=[@{name="var1",in_scope="true",type_changed="false"@}]
(@value{GDBP})
@end smallexample

@subheading The @code{-var-update} Command
@findex -var-update

@subsubheading Synopsis

@smallexample
 -var-update @{@var{name} | "*"@}
@end smallexample

Update the value of the variable object @var{name} by evaluating its
expression after fetching all the new values from memory or registers.
A @samp{*} causes all existing variable objects to be updated.


@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 superseeded 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 anntations, 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}).  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
(gdb)
^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 for annotations

To issue a command to @value{GDBN} without affecting certain aspects of
the state which is seen by users, prefix it with @samp{server }.  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.

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.

@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
@findex prompt
@findex post-prompt
@item prompt
When @value{GDBN} is prompting for a command (the main @value{GDBN} prompt).

@findex pre-commands
@findex commands
@findex post-commands
@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
@findex overload-choice
@findex post-overload-choice
@item overload-choice
When @value{GDBN} wants the user to select between various overloaded functions.

@findex pre-query
@findex query
@findex post-query
@item query
When @value{GDBN} wants the user to confirm a potentially dangerous operation.

@findex pre-prompt-for-continue
@findex prompt-for-continue
@findex post-prompt-for-continue
@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
@smallexample
^Z^Zquit
@end smallexample

This annotation occurs right before @value{GDBN} responds to an interrupt.

@findex error
@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
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
@item ^Z^Zframes-invalid

The frames (for example, output from the @code{backtrace} command) may
have changed.

@findex breakpoints-invalid
@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
@findex stopping
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
@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
@findex signal-name
@findex signal-name-end
@findex signal-string
@findex signal-string-end
@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
@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
@item ^Z^Zbreakpoint @var{number}
The program hit breakpoint number @var{number}.

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

In any event, we also recommend that you submit bug reports for
@value{GDBN}.  The prefered 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.

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 GCC, you can say @code{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.

@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.texinfo
@c     inc-hist.texinfo
@c Use -I with makeinfo to point to the appropriate directory,
@c environment var TEXINPUTS with TeX.
@include rluser.texinfo
@include inc-hist.texinfo


@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 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 configuring @value{GDBN}
@cindex installation
@cindex configuring @value{GDBN}, and source tree subdirectories

@value{GDBN} comes with a @code{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 @code{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 @code{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}; @code{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
@code{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 @code{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}, @code{configure}
creates configuration files for every directory level underneath (unless
you tell it not to, with the @samp{--norecursion} option).

You should run the @code{configure} script from the top directory in the
source tree, the @file{gdb-@var{version-number}} directory.  If you run
@code{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 @code{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.

@menu
* Separate Objdir::             Compiling @value{GDBN} in another directory
* Config Names::                Specifying names for hosts and targets
* Configure Options::           Summary of options for configure
@end menu

@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.  @code{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 @code{configure}
with the @samp{--srcdir} option to specify where to find the source.
(You also need to specify a path to find @code{configure}
itself from your working directory.  If the path to @code{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 @code{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 @code{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 @code{configure} (or one of its subdirectories).

The @code{Makefile} that @code{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 @code{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 @code{configure} script accompanying @value{GDBN} does not provide
any query facility to list all supported host and target names or
aliases.  @code{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 @code{configure} options

Here is a summary of the @code{configure} options and arguments that
are most often useful for building @value{GDBN}.  @code{configure} also has
several other options not listed here.  @inforef{What Configure
Does,,configure.info}, for a full explanation of @code{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 @code{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.  @code{configure} writes configuration specific files in
the current directory, but arranges for them to use the source in the
directory @var{dirname}.  @code{configure} creates directories under
the working directory in parallel to the source directories below
@var{dirname}.

@item --norecursion
Configure only the directory level where @code{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 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.
These commands are provided here for reference.

@table @code
@kindex maint info breakpoints
@item @anchor{maint info breakpoints}maint info breakpoints
Using the same format as @samp{info breakpoints}, display both the
breakpoints you've set explicitly, and those @value{GDBN} is using for
internal purposes.  Internal breakpoints are shown with negative
breakpoint numbers.  The type column identifies what kind of breakpoint
is shown:

@table @code
@item breakpoint
Normal, explicitly set breakpoint.

@item watchpoint
Normal, explicitly set watchpoint.

@item longjmp
Internal breakpoint, used to handle correctly stepping through
@code{longjmp} calls.

@item longjmp resume
Internal breakpoint at the target of a @code{longjmp}.

@item until
Temporary internal breakpoint used by the @value{GDBN} @code{until} command.

@item finish
Temporary internal breakpoint used by the @value{GDBN} @code{finish} command.

@item shlib events
Shared library events.

@end table

@kindex maint internal-error
@kindex maint internal-warning
@item maint internal-error
@itemx maint internal-warning
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.

@smallexample
(gdb) @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}
(gdb)
@end smallexample

Takes an optional parameter that is used as the text of the error or
warning message.

@kindex maint print dummy-frames
@item maint print dummy-frames

Prints the contents of @value{GDBN}'s internal dummy-frame stack.

@smallexample
(gdb) @kbd{b add}
@dots{}
(gdb) @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{}
(gdb) @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
(gdb)
@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
@item maint print registers
@itemx maint print raw-registers
@itemx maint print cooked-registers
@itemx maint print register-groups
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; and the command
@code{maint print register-groups} includes the groups that each
register is a member of.  @xref{Registers,, Registers, gdbint,
@value{GDBN} Internals}.

Takes an optional file parameter.

@kindex maint print reggroups
@item maint print reggroups
Print @value{GDBN}'s internal register group data structures.

Takes an optional file parameter.

@smallexample
(gdb) @kbd{maint print reggroups}
 Group      Type
 general    user
 float      user
 all        user
 vector     user
 system     user
 save       internal
 restore    internal
@end smallexample

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

@end table


@node Remote Protocol
@appendix @value{GDBN} Remote Serial Protocol

@menu
* Overview::
* Packets::
* Stop Reply Packets::
* General Query Packets::
* Register Packet Format::
* Examples::
* File-I/O remote protocol extension::
@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 respectfully.

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

@cindex acknowledgment, for @value{GDBN} remote
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 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 (the target has again stopped).

@var{packet-data} consists of a sequence of characters with the
exception of @samp{#} and @samp{$} (see @samp{X} packet for additional
exceptions).

Fields within the packet should be separated using @samp{,} @samp{;} or
@cindex remote protocol, field separator
@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}).

Response @var{data} can be run-length encoded to save space.  A @samp{*}
means that the next character is an @sc{ascii} encoding giving a repeat count
which stands for that many repetitions of the character preceding the
@samp{*}.  The encoding is @code{n+29}, yielding a printable character
where @code{n >=3} (which is where rle starts to win).  The printable
characters @samp{$}, @samp{#}, @samp{+} and @samp{-} or with a numeric
value greater than 126 should not be used.

So:
@smallexample
"@code{0* }"
@end smallexample
@noindent
means the same as "0000".

The error response returned for some packets includes a two character
error number.  That number is not well defined.

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.

A stub is required to support the @samp{g}, @samp{G}, @samp{m}, @samp{M},
@samp{c}, and @samp{s} @var{command}s.  All other @var{command}s 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}.

@table @r

@item @code{!} --- extended mode
@cindex @code{!} packet

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 @code{?} --- last signal
@cindex @code{?} packet

Indicate the reason the target halted.  The reply is the same as for
step and continue.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item @code{a} --- reserved

Reserved for future use.

@item @code{A}@var{arglen}@code{,}@var{argnum}@code{,}@var{arg}@code{,@dots{}} ---  set program arguments @strong{(reserved)}
@cindex @code{A} packet

Initialized @samp{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
@item E@var{NN}
@end table

@item @code{b}@var{baud} --- set baud @strong{(deprecated)}
@cindex @code{b} packet

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 @code{B}@var{addr},@var{mode} --- set breakpoint @strong{(deprecated)}
@cindex @code{B} packet

Set (@var{mode} is @samp{S}) or clear (@var{mode} is @samp{C}) a
breakpoint at @var{addr}.

This packet has been replaced by the @samp{Z} and @samp{z} packets
(@pxref{insert breakpoint or watchpoint packet}).

@item @code{c}@var{addr} --- continue
@cindex @code{c} packet

@var{addr} is address to resume.  If @var{addr} is omitted, resume at
current address.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item @code{C}@var{sig}@code{;}@var{addr} --- continue with signal
@cindex @code{C} packet

Continue with signal @var{sig} (hex signal number).  If
@code{;}@var{addr} is omitted, resume at same address.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item @code{d} --- toggle debug @strong{(deprecated)}
@cindex @code{d} packet

Toggle debug flag.

@item @code{D} --- detach
@cindex @code{D} packet

Detach @value{GDBN} from the remote system.  Sent to the remote target
before @value{GDBN} disconnects via the @code{detach} command.

Reply:
@table @samp
@item @emph{no response}
@value{GDBN} does not check for any response after sending this packet.
@end table

@item @code{e} --- reserved

Reserved for future use.

@item @code{E} --- reserved

Reserved for future use.

@item @code{f} --- reserved

Reserved for future use.

@item @code{F}@var{RC}@code{,}@var{EE}@code{,}@var{CF}@code{;}@var{XX} --- Reply to target's F packet.
@cindex @code{F} packet

This packet is send by @value{GDBN} as reply to a @code{F} request 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 @code{g} --- read registers
@anchor{read registers packet}
@cindex @code{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} @var{packet} are
determined by the @value{GDBN} internal macros
@var{DEPRECATED_REGISTER_RAW_SIZE} and @var{REGISTER_NAME} macros.  The
specification of several standard @code{g} packets is specified below.
@item E@var{NN}
for an error.
@end table

@item @code{G}@var{XX@dots{}} --- write regs
@cindex @code{G} packet

@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 @code{h} --- reserved

Reserved for future use.

@item @code{H}@var{c}@var{t@dots{}} --- set thread
@cindex @code{H} packet

Set thread for subsequent operations (@samp{m}, @samp{M}, @samp{g},
@samp{G}, et.al.).  @var{c} depends on the operation to be performed: it
should be @samp{c} for step and continue operations, @samp{g} for other
operations.  The thread designator @var{t@dots{}} may be -1, meaning all
the threads, a thread number, or zero which means pick any thread.

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 @code{i}@var{addr}@code{,}@var{nnn} --- cycle step @strong{(draft)}
@anchor{cycle step packet}
@cindex @code{i} packet

Step the remote target by a single clock cycle.  If @code{,}@var{nnn} is
present, cycle step @var{nnn} cycles.  If @var{addr} is present, cycle
step starting at that address.

@item @code{I} --- signal then cycle step @strong{(reserved)}
@cindex @code{I} packet

@xref{step with signal packet}.  @xref{cycle step packet}.

@item @code{j} --- reserved

Reserved for future use.

@item @code{J} --- reserved

Reserved for future use.

@item @code{k} --- kill request
@cindex @code{k} packet

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 @code{K} --- reserved

Reserved for future use.

@item @code{l} --- reserved

Reserved for future use.

@item @code{L} --- reserved

Reserved for future use.

@item @code{m}@var{addr}@code{,}@var{length} --- read memory
@cindex @code{m} packet

Read @var{length} bytes of memory starting at address @var{addr}.
Neither @value{GDBN} nor the stub assume that sized memory transfers are
assumed using word aligned accesses. FIXME: @emph{A word aligned memory
transfer mechanism is needed.}

Reply:
@table @samp
@item @var{XX@dots{}}
@var{XX@dots{}} is mem contents. Can be fewer bytes than requested if able
to read only part of the data.  Neither @value{GDBN} nor the stub assume
that sized memory transfers are assumed using word aligned
accesses. FIXME: @emph{A word aligned memory transfer mechanism is
needed.}
@item E@var{NN}
@var{NN} is errno
@end table

@item @code{M}@var{addr},@var{length}@code{:}@var{XX@dots{}} --- write mem
@cindex @code{M} packet

Write @var{length} bytes of memory starting at address @var{addr}.
@var{XX@dots{}} is the data.

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 @code{n} --- reserved

Reserved for future use.

@item @code{N} --- reserved

Reserved for future use.

@item @code{o} --- reserved

Reserved for future use.

@item @code{O} --- reserved

Reserved for future use.

@item @code{p}@var{n@dots{}} --- read reg @strong{(reserved)}
@cindex @code{p} packet

@xref{write register packet}.

Reply:
@table @samp
@item @var{r@dots{}.}
The hex encoded value of the register in target byte order.
@end table

@item @code{P}@var{n@dots{}}@code{=}@var{r@dots{}} --- write register
@anchor{write register packet}
@cindex @code{P} packet

Write register @var{n@dots{}} with value @var{r@dots{}}, which 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 @code{q}@var{query} --- general query
@anchor{general query packet}
@cindex @code{q} packet

Request info about @var{query}.  In general @value{GDBN} queries have a
leading upper case letter.  Custom vendor queries should use a company
prefix (in lower case) ex: @samp{qfsf.var}.  @var{query} may optionally
be followed by a @samp{,} or @samp{;} separated list.  Stubs must ensure
that they match the full @var{query} name.

Reply:
@table @samp
@item @var{XX@dots{}}
Hex encoded data from query.  The reply can not be empty.
@item E@var{NN}
error reply
@item
Indicating an unrecognized @var{query}.
@end table

@item @code{Q}@var{var}@code{=}@var{val} --- general set
@cindex @code{Q} packet

Set value of @var{var} to @var{val}.

@xref{general query packet}, for a discussion of naming conventions.

@item @code{r} --- reset @strong{(deprecated)}
@cindex @code{r} packet

Reset the entire system.

@item @code{R}@var{XX} --- remote restart
@cindex @code{R} packet

Restart the program being debugged.  @var{XX}, while needed, is ignored.
This packet is only available in extended mode.

Reply:
@table @samp
@item @emph{no reply}
The @samp{R} packet has no reply.
@end table

@item @code{s}@var{addr} --- step
@cindex @code{s} packet

@var{addr} is address to resume.  If @var{addr} is omitted, resume at
same address.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item @code{S}@var{sig}@code{;}@var{addr} --- step with signal
@anchor{step with signal packet}
@cindex @code{S} packet

Like @samp{C} but step not continue.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item @code{t}@var{addr}@code{:}@var{PP}@code{,}@var{MM} --- search
@cindex @code{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 @code{T}@var{XX} --- thread alive
@cindex @code{T} packet

Find out if the thread XX is alive.

Reply:
@table @samp
@item OK
thread is still alive
@item E@var{NN}
thread is dead
@end table

@item @code{u} --- reserved

Reserved for future use.

@item @code{U} --- reserved

Reserved for future use.

@item @code{v} --- verbose packet prefix

Packets starting with @code{v} are identified by a multi-letter name,
up to the first @code{;} or @code{?} (or the end of the packet).

@item @code{vCont}[;@var{action}[@code{:}@var{tid}]]... --- extended resume
@cindex @code{vCont} packet

Resume the inferior.  Different actions may be specified for each thread.
If an action is specified with no @var{tid}, 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.  Specifying multiple
default actions is an error; specifying no actions is also an error.
Thread IDs are specified in hexadecimal.  Currently supported actions are:

@table @code
@item c
Continue.
@item C@var{sig}
Continue with signal @var{sig}.  @var{sig} should be two hex digits.
@item s
Step.
@item S@var{sig}
Step with signal @var{sig}.  @var{sig} should be two hex digits.
@end table

The optional @var{addr} argument normally associated with these packets is
not supported in @code{vCont}.

Reply:
@xref{Stop Reply Packets}, for the reply specifications.

@item @code{vCont?} --- extended resume query
@cindex @code{vCont?} packet

Query support for the @code{vCont} packet.

Reply:
@table @samp
@item @code{vCont}[;@var{action}]...
The @code{vCont} packet is supported.  Each @var{action} is a supported
command in the @code{vCont} packet.
@item
The @code{vCont} packet is not supported.
@end table

@item @code{V} --- reserved

Reserved for future use.

@item @code{w} --- reserved

Reserved for future use.

@item @code{W} --- reserved

Reserved for future use.

@item @code{x} --- reserved

Reserved for future use.

@item @code{X}@var{addr}@code{,}@var{length}@var{:}@var{XX@dots{}} --- write mem (binary)
@cindex @code{X} packet

@var{addr} is address, @var{length} is number of bytes, @var{XX@dots{}}
is binary data.  The characters @code{$}, @code{#}, and @code{0x7d} are
escaped using @code{0x7d}.

Reply:
@table @samp
@item OK
for success
@item E@var{NN}
for an error
@end table

@item @code{y} --- reserved

Reserved for future use.

@item @code{Y} reserved

Reserved for future use.

@item @code{z}@var{type}@code{,}@var{addr}@code{,}@var{length} --- remove breakpoint or watchpoint @strong{(draft)}
@itemx @code{Z}@var{type}@code{,}@var{addr}@code{,}@var{length} --- insert breakpoint or watchpoint @strong{(draft)}
@anchor{insert breakpoint or watchpoint packet}
@cindex @code{z} packet
@cindex @code{Z} packets

Insert (@code{Z}) or remove (@code{z}) a @var{type} breakpoint or
watchpoint starting at address @var{address} and covering the next
@var{length} bytes.

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
@code{Z}@var{type}@dots{} and @code{z}@var{type}@dots{} packet pair.  To
avoid potential problems with duplicate packets, the operations should
be implemented in an idempotent way.}

@item @code{z}@code{0}@code{,}@var{addr}@code{,}@var{length} --- remove memory breakpoint @strong{(draft)}
@item @code{Z}@code{0}@code{,}@var{addr}@code{,}@var{length} --- insert memory breakpoint @strong{(draft)}
@cindex @code{z0} packet
@cindex @code{Z0} packet

Insert (@code{Z0}) or remove (@code{z0}) a memory breakpoint at address
@code{addr} of size @code{length}.

A memory breakpoint is implemented by replacing the instruction at
@var{addr} with a software breakpoint or trap instruction.  The
@code{length} is used by targets that 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).

@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 @code{z}@code{1}@code{,}@var{addr}@code{,}@var{length} --- remove hardware breakpoint @strong{(draft)}
@item @code{Z}@code{1}@code{,}@var{addr}@code{,}@var{length} --- insert hardware breakpoint @strong{(draft)}
@cindex @code{z1} packet
@cindex @code{Z1} packet

Insert (@code{Z1}) or remove (@code{z1}) a hardware breakpoint at
address @code{addr} of size @code{length}.

A hardware breakpoint is implemented using a mechanism that is not
dependant on being able to modify the target's memory.

@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 @code{z}@code{2}@code{,}@var{addr}@code{,}@var{length} --- remove write watchpoint @strong{(draft)}
@item @code{Z}@code{2}@code{,}@var{addr}@code{,}@var{length} --- insert write watchpoint @strong{(draft)}
@cindex @code{z2} packet
@cindex @code{Z2} packet

Insert (@code{Z2}) or remove (@code{z2}) a write watchpoint.

Reply:
@table @samp
@item OK
success
@item
not supported
@item E@var{NN}
for an error
@end table

@item @code{z}@code{3}@code{,}@var{addr}@code{,}@var{length} --- remove read watchpoint @strong{(draft)}
@item @code{Z}@code{3}@code{,}@var{addr}@code{,}@var{length} --- insert read watchpoint @strong{(draft)}
@cindex @code{z3} packet
@cindex @code{Z3} packet

Insert (@code{Z3}) or remove (@code{z3}) a read watchpoint.

Reply:
@table @samp
@item OK
success
@item
not supported
@item E@var{NN}
for an error
@end table

@item @code{z}@code{4}@code{,}@var{addr}@code{,}@var{length} --- remove access watchpoint @strong{(draft)}
@item @code{Z}@code{4}@code{,}@var{addr}@code{,}@var{length} --- insert access watchpoint @strong{(draft)}
@cindex @code{z4} packet
@cindex @code{Z4} packet

Insert (@code{Z4}) or remove (@code{z4}) an access watchpoint.

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} and @samp{?} packets can
receive any of the below as a reply.  In the case of the @samp{C},
@samp{c}, @samp{S} and @samp{s} packets, that reply is only returned
when the target halts.  In the below the exact meaning of @samp{signal
number} is poorly defined.  In general one of the UNIX signal numbering
conventions is used.

@table @samp

@item S@var{AA}
@var{AA} is the signal number

@item @code{T}@var{AA}@var{n...}@code{:}@var{r...}@code{;}@var{n...}@code{:}@var{r...}@code{;}@var{n...}@code{:}@var{r...}@code{;}
@cindex @code{T} packet reply

@var{AA} = two hex digit signal number; @var{n...} = register number
(hex), @var{r...}  = target byte ordered register contents, size defined
by @code{DEPRECATED_REGISTER_RAW_SIZE}; @var{n...} = @samp{thread},
@var{r...} = thread process ID, this is a hex integer; @var{n...} =
(@samp{watch} | @samp{rwatch} | @samp{awatch}, @var{r...} = data
address, this is a hex integer; @var{n...} = other string not starting
with valid hex digit.  @value{GDBN} should ignore this @var{n...},
@var{r...} pair and go on to the next.  This way we can extend the
protocol.

@item W@var{AA}

The process exited, and @var{AA} is the exit status.  This is only
applicable to certain targets.

@item X@var{AA}

The process terminated with signal @var{AA}.

@item O@var{XX@dots{}}

@var{XX@dots{}} is hex encoding of @sc{ascii} data.  This can happen at
any time while the program is running and the debugger should continue
to wait for @samp{W}, @samp{T}, etc.

@item F@var{call-id}@code{,}@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.

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

The following set and query packets have already been defined.

@table @r

@item @code{q}@code{C} --- current thread

Return the current thread id.

Reply:
@table @samp
@item @code{QC}@var{pid}
Where @var{pid} is a HEX encoded 16 bit process id.
@item *
Any other reply implies the old pid.
@end table

@item @code{q}@code{fThreadInfo} -- all thread ids

@code{q}@code{sThreadInfo}

Obtain a list of 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 @code{qf}@code{ThreadInfo} query; subsequent queries in the
sequence will be the @code{qs}@code{ThreadInfo} query.

NOTE: replaces the @code{qL} query (see below).

Reply:
@table @samp
@item @code{m}@var{id}
A single thread id
@item @code{m}@var{id},@var{id}@dots{}
a comma-separated list of thread ids
@item @code{l}
(lower case 'el') denotes end of list.
@end table

In response to each query, the target will reply with a list of one or
more thread ids, in big-endian hex, separated by commas.  @value{GDBN}
will respond to each reply with a request for more thread ids (using the
@code{qs} form of the query), until the target responds with @code{l}
(lower-case el, for @code{'last'}).

@item @code{q}@code{ThreadExtraInfo}@code{,}@var{id} --- extra thread info

Where @var{id} is a thread-id in big-endian hex.  Obtain a printable
string description of a thread's attributes from the target OS.  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 @samp{info threads} display.  Some examples of
possible thread extra info strings are ``Runnable'', or ``Blocked on
Mutex''.

Reply:
@table @samp
@item @var{XX@dots{}}
Where @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

@item @code{q}@code{L}@var{startflag}@var{threadcount}@var{nextthread} --- query @var{LIST} or @var{threadLIST} @strong{(deprecated)}

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

NOTE: this query is replaced by the @code{q}@code{fThreadInfo} query
(see above).

Reply:
@table @samp
@item @code{q}@code{M}@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 @code{q}@code{CRC:}@var{addr}@code{,}@var{length} --- compute CRC of memory block

Reply:
@table @samp
@item @code{E}@var{NN}
An error (such as memory fault)
@item @code{C}@var{CRC32}
A 32 bit cyclic redundancy check of the specified memory region.
@end table

@item @code{q}@code{Offsets} --- query sect offs

Get section offsets that the target used when re-locating the downloaded
image.  @emph{Note: while a @code{Bss} offset is included in the
response, @value{GDBN} ignores this and instead applies the @code{Data}
offset to the @code{Bss} section.}

Reply:
@table @samp
@item @code{Text=}@var{xxx}@code{;Data=}@var{yyy}@code{;Bss=}@var{zzz}
@end table

@item @code{q}@code{P}@var{mode}@var{threadid} --- thread info request

Returns information on @var{threadid}.  Where: @var{mode} is a hex
encoded 32 bit mode; @var{threadid} is a hex encoded 64 bit thread ID.

Reply:
@table @samp
@item *
@end table

See @code{remote.c:remote_unpack_thread_info_response()}.

@item @code{q}@code{Rcmd,}@var{command} --- remote command

@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 @code{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 @code{E}@var{NN}
Indicate a badly formed request.
@item @samp{}
When @samp{q}@samp{Rcmd} is not recognized.
@end table

@item @code{qSymbol::} --- symbol lookup

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 @code{OK}
The target does not need to look up any (more) symbols.
@item @code{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
@code{qSymbol:}@var{sym_value}:@var{sym_name} message, described below.
@end table

@item @code{qSymbol:}@var{sym_value}:@var{sym_name} --- symbol value

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 @code{OK}
The target does not need to look up any (more) symbols.
@item @code{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

@end table

@node Register Packet Format
@section Register Packet Format

The following @samp{g}/@samp{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 transfered in target
byte order.  The two nibbles within a register byte are transfered
most-significant - least-significant.

@table @r

@item MIPS32

All registers are transfered 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 transfered 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 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::
* Memory transfer::
* The Ctrl-C message::
* Console I/O::
* The isatty call::
* The system call::
* 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 File I/O remote protocol extension (short: File-I/O) allows the
target to use the hosts file system and console I/O when calling 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 with an adequate response packet to the target system.
This simulates file system operations even on targets that lack file systems.

The protocol is defined host- and target-system independent.  It uses
it's own independent representation of datatypes and values.  Both,
@value{GDBN} and the target's @value{GDBN} stub are responsible for
translating the system dependent values into the unified protocol values
when data is transmitted.

The communication is synchronous.  A system call is possible only
when GDB is waiting for 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 interuptible by target signals.  It
is possible to interrupt File-I/O by a user interrupt (Ctrl-C), though.

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
(gdb) continue
  <- target requests 'system call X'
  target is stopped, @value{GDBN} executes system call
  -> GDB returns result
  ... target continues, GDB returns to wait for the target
  <- target hits breakpoint and sends a Txx packet
@end smallexample

The protocol is only used for files on the host file system and
for I/O on the console.  Character or block special devices, pipes,
named pipes or sockets or any other communication method on the host
system are not supported by this protocol.

@node Protocol basics
@subsection Protocol basics
@cindex protocol basics, file-i/o

The File-I/O protocol uses the @code{F} packet, as request as well
as as reply packet.  Since a File-I/O system call can only occur when
@value{GDBN} is waiting for the continuing or stepping target, the
File-I/O request is a reply that @value{GDBN} has to expect as a result
of a former @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 values are given in a protocol specific representation.

@end itemize

At that point @value{GDBN} has to perform the following actions.

@itemize @bullet
@item
If parameter pointer values are given, which point 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 pointer parameters in the request packet point to buffer space in which
a system call is expected to copy data to, 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

@smallexample
@code{F}@var{call-id}@code{,}@var{parameter@dots{}}
@end smallexample

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

@end table

Parameters are hexadecimal integer values, either the real values in case
of scalar datatypes, as pointers to target buffer space in case of compound
datatypes and unspecified memory areas or as pointer/length pairs in case
of string parameters.  These are appended to the call-id, each separated
from its predecessor by a comma.  All values are transmitted in ASCII
string representation, pointer/length pairs separated by a slash.

@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

@smallexample
@code{F}@var{retcode}@code{,}@var{errno}@code{,}@var{Ctrl-C flag}@code{;}@var{call specific attachment}
@end smallexample

@var{retcode} is the return code of the system call as hexadecimal value.

@var{errno} is the 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 send if the user requested a break.  In this
case, @var{errno} must be send as well, even if the call was successful.
The @var{Ctrl-C flag} itself consists of the character 'C':

@smallexample
F0,0,C
@end smallexample

@noindent
or, if the call was interupted 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 Memory transfer
@subsection Memory transfer
@cindex memory transfer, in file-i/o protocol

Structured data which is transferred using a memory read or write as e.g.@:
a @code{struct stat} is expected to be in a protocol specific format with
all scalar multibyte datatypes being big endian.  This should be done by
the target before the @code{F} packet is sent resp.@: 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 The Ctrl-C message
@subsection The Ctrl-C message
@cindex ctrl-c message, in file-i/o protocol

A special case is, if the @var{Ctrl-C flag} is set in the @value{GDBN}
reply packet.  In this case the target should behave, as if it had
gotten a break message.  The meaning for the target is ``system call
interupted by @code{SIGINT}''.  Consequentially, the target should actually stop
(as with a break message) and return to @value{GDBN} with a @code{T02}
packet.  In this case, it's important for the target to know, in which
state the system call was interrupted.  Since this action is by design
not an atomic operation, we have to differ between two 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 --- successful or not --- and should behave
as if the break message arrived right after the system call.

@value{GDBN} must behave reliable.  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 finshed by
@value{GDBN}.  This requires sending @code{M} or @code{X} packets as they fit.
The @code{F} packet may only be send 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 explicitely 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 presses @kbd{Ctrl-C}.  The behaviour is as explained above, the
@code{read}
system call is treated as finished.

@item
The user presses @kbd{Enter}.  This is treated as end of input with a trailing
line feed.

@item
The user presses @kbd{Ctrl-D}.  This is treated as end of input.  No trailing
character, especially no Ctrl-D is appended to the input.

@end itemize

If the user has typed more characters as fit in the buffer given to
the 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 on users request.

@node The isatty call
@subsection The isatty(3) call
@cindex isatty call, file-i/o protocol

A special case in this protocol is the library call @code{isatty} which
is implemented as it's own call inside of this protocol.  It returns
1 to the target if the file descriptor given as parameter 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 The system call
@subsection The system(3) call
@cindex system call, file-i/o protocol

The other special case in this protocol is the @code{system} call which
is implemented as it's own call, too.  @value{GDBN} is taking over the full
task of calling the necessary host calls to perform the @code{system}
call.  The return value of @code{system} is simplified before it's returned
to the target.  Basically, the only signal transmitted back is @code{EINTR}
in case the user pressed @kbd{Ctrl-C}.  Otherwise the return value consists
entirely of the exit status of the called command.

Due to security concerns, the @code{system} call is refused to be called
by @value{GDBN} by default.  The user has to allow this call explicitly by
entering

@table @samp
@kindex set remote system-call-allowed 1
@item @code{set remote system-call-allowed 1}
@end table

Disabling the @code{system} call is done by

@table @samp
@kindex set remote system-call-allowed 0
@item @code{set remote system-call-allowed 0}
@end table

The current setting is shown by typing

@table @samp
@kindex show remote system-call-allowed
@item @code{show remote system-call-allowed}
@end table

@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

@smallexample
@exdent Synopsis:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

@exdent Request:
Fopen,pathptr/len,flags,mode
@end smallexample

@noindent
@code{flags} is the bitwise 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 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 (O_RDWR or O_WRONLY is given) it will be
truncated to length 0.

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

@noindent
Each other bit is silently ignored.

@end table

@noindent
@code{mode} is the bitwise 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.

@noindent
Each other bit is silently ignored.

@end table

@smallexample
@exdent Return value:
open returns the new file descriptor or -1 if an error
occured.

@exdent Errors:
@end smallexample

@table @code
@item EEXIST
pathname already exists and O_CREAT and O_EXCL were used.

@item EISDIR
pathname refers to a directory.

@item EACCES
The requested access is not allowed.

@item ENAMETOOLONG
pathname was too long.

@item ENOENT
A directory component in pathname does not exist.

@item ENODEV
pathname refers to a device, pipe, named pipe or socket.

@item EROFS
pathname refers to a file on a read-only filesystem and
write access was requested.

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

@node close
@unnumberedsubsubsec close
@cindex close, file-i/o system call

@smallexample
@exdent Synopsis:
int close(int fd);

@exdent Request:
Fclose,fd

@exdent Return value:
close returns zero on success, or -1 if an error occurred.

@exdent Errors:
@end smallexample

@table @code
@item EBADF
fd isn't a valid open file descriptor.

@item EINTR
The call was interrupted by the user.
@end table

@node read
@unnumberedsubsubsec read
@cindex read, file-i/o system call

@smallexample
@exdent Synopsis:
int read(int fd, void *buf, unsigned int count);

@exdent Request:
Fread,fd,bufptr,count

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

@exdent Errors:
@end smallexample

@table @code
@item EBADF
fd is not a valid file descriptor or is not open for
reading.

@item EFAULT
buf is an invalid pointer value.

@item EINTR
The call was interrupted by the user.
@end table

@node write
@unnumberedsubsubsec write
@cindex write, file-i/o system call

@smallexample
@exdent Synopsis:
int write(int fd, const void *buf, unsigned int count);

@exdent Request:
Fwrite,fd,bufptr,count

@exdent Return value:
On success, the number of bytes written are returned.
Zero indicates nothing was written.  On error, -1
is returned.

@exdent Errors:
@end smallexample

@table @code
@item EBADF
fd is not a valid file descriptor or is not open for
writing.

@item EFAULT
buf 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

@node lseek
@unnumberedsubsubsec lseek
@cindex lseek, file-i/o system call

@smallexample
@exdent Synopsis:
long lseek (int fd, long offset, int flag);

@exdent Request:
Flseek,fd,offset,flag
@end smallexample

@code{flag} is one of:

@table @code
@item SEEK_SET
The offset is set to offset bytes.

@item SEEK_CUR
The offset is set to its current location plus offset
bytes.

@item SEEK_END
The offset is set to the size of the file plus offset
bytes.
@end table

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

@exdent Errors:
@end smallexample

@table @code
@item EBADF
fd is not a valid open file descriptor.

@item ESPIPE
fd is associated with the @value{GDBN} console.

@item EINVAL
flag is not a proper value.

@item EINTR
The call was interrupted by the user.
@end table

@node rename
@unnumberedsubsubsec rename
@cindex rename, file-i/o system call

@smallexample
@exdent Synopsis:
int rename(const char *oldpath, const char *newpath);

@exdent Request:
Frename,oldpathptr/len,newpathptr/len

@exdent Return value:
On success, zero is returned.  On error, -1 is returned.

@exdent Errors:
@end smallexample

@table @code
@item EISDIR
newpath is an existing directory, but oldpath is not a
directory.

@item EEXIST
newpath is a non-empty directory.

@item EBUSY
oldpath or 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 oldpath or new
path is not a directory.  Or oldpath is a directory
and newpath exists but is not a directory.

@item EFAULT
oldpathptr or newpathptr are invalid pointer values.

@item EACCES
No access to the file or the path of the file.

@item ENAMETOOLONG

oldpath or newpath was too long.

@item ENOENT
A directory component in oldpath or 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

@node unlink
@unnumberedsubsubsec unlink
@cindex unlink, file-i/o system call

@smallexample
@exdent Synopsis:
int unlink(const char *pathname);

@exdent Request:
Funlink,pathnameptr/len

@exdent Return value:
On success, zero is returned.  On error, -1 is returned.

@exdent Errors:
@end smallexample

@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 pathname cannot be unlinked because it's
being used by another process.

@item EFAULT
pathnameptr is an invalid pointer value.

@item ENAMETOOLONG
pathname was too long.

@item ENOENT
A directory component in 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

@node stat/fstat
@unnumberedsubsubsec stat/fstat
@cindex fstat, file-i/o system call
@cindex stat, file-i/o system call

@smallexample
@exdent Synopsis:
int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);

@exdent Request:
Fstat,pathnameptr/len,bufptr
Ffstat,fd,bufptr

@exdent Return value:
On success, zero is returned.  On error, -1 is returned.

@exdent Errors:
@end smallexample

@table @code
@item EBADF
fd is not a valid open file.

@item ENOENT
A directory component in pathname does not exist or the
path is an empty string.

@item ENOTDIR
A component of the path is not a directory.

@item EFAULT
pathnameptr is an invalid pointer value.

@item EACCES
No access to the file or the path of the file.

@item ENAMETOOLONG
pathname was too long.

@item EINTR
The call was interrupted by the user.
@end table

@node gettimeofday
@unnumberedsubsubsec gettimeofday
@cindex gettimeofday, file-i/o system call

@smallexample
@exdent Synopsis:
int gettimeofday(struct timeval *tv, void *tz);

@exdent Request:
Fgettimeofday,tvptr,tzptr

@exdent Return value:
On success, 0 is returned, -1 otherwise.

@exdent Errors:
@end smallexample

@table @code
@item EINVAL
tz is a non-NULL pointer.

@item EFAULT
tvptr and/or tzptr is an invalid pointer value.
@end table

@node isatty
@unnumberedsubsubsec isatty
@cindex isatty, file-i/o system call

@smallexample
@exdent Synopsis:
int isatty(int fd);

@exdent Request:
Fisatty,fd

@exdent Return value:
Returns 1 if fd refers to the @value{GDBN} console, 0 otherwise.

@exdent Errors:
@end smallexample

@table @code
@item EINTR
The call was interrupted by the user.
@end table

@node system
@unnumberedsubsubsec system
@cindex system, file-i/o system call

@smallexample
@exdent Synopsis:
int system(const char *command);

@exdent Request:
Fsystem,commandptr/len

@exdent Return value:
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 hosts
system return value by calling WEXITSTATUS(retval).
In case /bin/sh could not be executed, 127 is returned.

@exdent Errors:
@end smallexample

@table @code
@item EINTR
The call was interrupted by the user.
@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::
* 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

@smallexample
int@r{,} unsigned int@r{,} long@r{,} unsigned long@r{,} mode_t @r{and} time_t
@end smallexample

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

@smallexample
``hello, world'' at address 0x123456
@end smallexample

@noindent
is transmitted as

@smallexample
@code{123456/d}
@end smallexample

@node struct stat
@unnumberedsubsubsec struct stat
@cindex struct stat, in file-i/o protocol

The buffer of type 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 are conforming to the definitions given in the
approriate 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.

@smallexample
st_dev:     0       file
            1       console

st_ino:     No valid meaning for the target.  Transmitted unchanged.

st_mode:    Valid mode bits are described in Appendix C.  Any other
            bits have currently no meaning for the target.

st_uid:     No valid meaning for the target.  Transmitted unchanged.

st_gid:     No valid meaning for the target.  Transmitted unchanged.

st_rdev:    No valid meaning for the target.  Transmitted unchanged.

st_atime, st_mtime, st_ctime:
            These values have a host and file system dependent
            accuracy.  Especially on Windows hosts the file systems
            don't support exact timing values.
@end smallexample

The target gets a struct stat of the above representation and is
responsible to coerce it to the target representation before
continuing.

Note that due to size differences between the host and target
representation of 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 struct timeval used by the target and @value{GDBN}
is defined as follows:

@smallexample
struct timeval @{
    time_t tv_sec;  /* second */
    long   tv_usec; /* microsecond */
@};
@end smallexample

The integral datatypes are conforming to the definitions given in the
approriate 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 resposible to translate 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

  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 (EBADF):

@smallexample
<- @code{Fread,3,1234,6}
-> @code{F-1,9}
@end smallexample

Example sequence of a read call, user presses 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 Ctrl-C after syscall on
host is called:

@smallexample
<- @code{Fread,3,1234,6}
-> @code{X1234,6:XXXXXX}
<- @code{T02}
@end smallexample

@include agentexpr.texi

@include gpl.texi

@include fdl.texi

@node Index
@unnumbered Index

@printindex cp

@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
