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

@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 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, 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 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}
@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}).
Annotation level controls how much information does @value{GDBN} print
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 2 is the
maximum annotation suitable for programs that control @value{GDBN}.

@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 current @dfn{@sc{gdb/mi} interface}
(@pxref{GDB/MI, , The @sc{gdb/mi} Interface}).  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 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 HP-UX (11.x and later only?), @value{GDBN} provides support for
debugging programs that create additional processes using the
@code{fork} or @code{vfork} function.

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.

@item ask
The debugger will ask for one of the above choices.
@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''
@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.
@item What
Where the breakpoint is in the source for your program, as a file and
line number.
@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.

@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 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{++}) 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 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 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-below-main
@kindex show backtrace-below-main

Most programs have a standard 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, then you can
change this behavior.

@table @code
@item set backtrace-below-main off
Backtraces will stop when they encounter the user entry point.  This is the
default.

@item set backtrace-below-main
@itemx set backtrace-below-main on
Backtraces will continue past the user entry point to the top of the stack.

@item show backtrace-below-main
Display the current backtrace policy.
@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
* 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 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
@kindex dump
@kindex append
@kindex restore

The commands @code{dump}, @code{append}, and @code{restore} are used
for copying data between target memory and a file.  Data is written
into a file using @code{dump} or @code{append}, and restored from a 
file into memory by using @code{restore}.  Files may be binary, srec,
intel hex, or tekhex (but only binary files can be appended).

@table @code
@kindex dump binary 
@kindex append binary 
@item dump binary memory @var{filename} @var{start_addr} @var{end_addr}
Dump contents of memory from @var{start_addr} to @var{end_addr} into 
raw binary format file @var{filename}.

@item append binary memory @var{filename} @var{start_addr} @var{end_addr}
Append contents of memory from @var{start_addr} to @var{end_addr} to
raw binary format file @var{filename}.

@item dump binary value @var{filename} @var{expression}
Dump value of @var{expression} into raw binary format file @var{filename}.

@item append binary memory @var{filename} @var{expression}
Append value of @var{expression} to raw binary format file @var{filename}.

@kindex dump ihex 
@item dump ihex memory @var{filename} @var{start_addr} @var{end_addr}
Dump contents of memory from @var{start_addr} to @var{end_addr} into 
intel hex format file @var{filename}.

@item dump ihex value @var{filename} @var{expression}
Dump value of @var{expression} into intel hex format file @var{filename}.

@kindex dump srec 
@item dump srec memory @var{filename} @var{start_addr} @var{end_addr}
Dump contents of memory from @var{start_addr} to @var{end_addr} into 
srec format file @var{filename}.

@item dump srec value @var{filename} @var{expression}
Dump value of @var{expression} into srec format file @var{filename}.

@kindex dump tekhex 
@item dump tekhex memory @var{filename} @var{start_addr} @var{end_addr}
Dump contents of memory from @var{start_addr} to @var{end_addr} into 
tekhex format file @var{filename}.

@item dump tekhex value @var{filename} @var{expression}
Dump value of @var{expression} into tekhex format file @var{filename}.

@item restore @var{filename} [@var{binary}] @var{bias} @var{start} @var{end}
Restore the contents of file @var{filename} into memory.  The @code{restore}
command can automatically recognize any known bfd file format, except for
raw binary.  To restore a raw binary file you must use the optional argument
@var{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 invoke the
@code{set target-charset} command with no argument, @value{GDBN} lists
the 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 invoke the
@code{set host-charset} command with no argument, @value{GDBN} lists the
character sets it supports, placing an asterisk (@samp{*}) after those
it can use as a host character set.

@item set charset @var{charset}
@kindex set charset
Set the current host and target character sets to @var{charset}.  If you
invoke the @code{set charset} command with no argument, it lists the
character sets it supports.  @value{GDBN} can only use certain character
sets as its host character set; it marks those in the list with an
asterisk (@samp{*}).

@item show charset
@itemx show host-charset
@itemx show target-charset
@kindex show charset
@kindex show host-charset
@kindex show target-charset
Show the current host and target charsets.  The @code{show host-charset}
and @code{show target-charset} commands are synonyms for @code{show
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 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} command without an argument,
@value{GDBN} tells us the character sets it supports:

@smallexample
(gdb) set target-charset
Valid character sets are:
  ascii *
  iso-8859-1 *
  ebcdic-us  
  ibm1047  
* - can be used as a host character set
@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 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++, 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
@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 .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{++}, 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{++}
* 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 Modula-2
@subsection Modula-2

@cindex Modula-2, @value{GDBN} support

The extensions made to @value{GDBN} to support Modula-2 only support
output from the @sc{gnu} Modula-2 compiler (which is currently being
developed).  Other Modula-2 compilers are not currently supported, and
attempting to debug executables produced by them is most likely
to give an error as @value{GDBN} reads in the executable's symbol
table.

@cindex expressions in Modula-2
@menu
* M2 Operators::                Built-in operators
* Built-In Func/Proc::          Built-in functions and procedures
* M2 Constants::                Modula-2 constants
* M2 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 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}.

@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 list symtabs
@kindex maint list 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 list symtabs @r{[} @var{regexp} @r{]}
@itemx maint list 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 list 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 list 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 list 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++ 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 Hitachi 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 kernel object
@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.

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

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:

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


@node Remote Debugging
@chapter Debugging remote programs

@menu
* Server::	                Using the gdbserver program
* NetWare::                     Using the gdbserve.nlm program
* Remote configuration::        Remote configuration
* remote stub::                 Implementing a remote stub
@end menu

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

@item On the @value{GDBN} host machine,
you need an unstripped copy of your program, since @value{GDBN} needs
symbols and debugging information.  Start up @value{GDBN} as usual,
using the name of the local copy of your program as the first argument.
(You may also need the @w{@samp{--baud}} option if the serial line is
running at anything other than 9600@dmn{bps}.)  After that, use @code{target
remote} to establish communications with @code{gdbserver}.  Its argument
is either a device name (usually a serial device, like
@file{/dev/ttyb}), or a TCP port descriptor in the form
@code{@var{host}:@var{PORT}}.  For example:

@smallexample
(@value{GDBP}) target remote /dev/ttyb
@end smallexample

@noindent
communicates with the server via serial line @file{/dev/ttyb}, and

@smallexample
(@value{GDBP}) target remote the-target:2345
@end smallexample

@noindent
communicates via a TCP connection to port 2345 on host @w{@file{the-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}.
@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,
you need an unstripped copy of your program, since @value{GDBN} needs
symbols and debugging information.  Start up @value{GDBN} as usual,
using the name of the local copy of your program as the first argument.
(You may also need the @w{@samp{--baud}} option if the serial line is
running at anything other than 9600@dmn{bps}.  After that, use @code{target
remote} to establish communications with @code{gdbserve.nlm}.  Its
argument is a device name (usually a serial device, like
@file{/dev/ttyb}).  For example:

@smallexample
(@value{GDBP}) target remote /dev/ttyb
@end smallexample

@noindent
communications with the server via serial line @file{/dev/ttyb}.
@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 Hitachi
@cindex SH
For Hitachi 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
To start remote debugging, run @value{GDBN} on the host machine, and specify
as an executable file the program that is running in the remote machine.
This tells @value{GDBN} how to find your program's symbols and the contents
of its pure text.

@item
@cindex serial line, @code{target remote}
Establish communication using the @code{target remote} command.
Its argument specifies how to communicate with the target
machine---either via a devicename attached to a direct serial line, or a
TCP or UDP port (usually 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.

@end enumerate

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

To resume the remote program and stop debugging it, use the @code{detach}
command.

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


@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::                      Hitachi H8/300
* H8/500::                      Hitachi H8/500
* M32R/D::                      Mitsubishi M32R/D
* M68K::                        Motorola M68K
* MIPS Embedded::               MIPS Embedded
* OpenRISC 1000::               OpenRisc 1000
* PA::                          HP PA Embedded
* PowerPC:                      PowerPC
* SH::                          Hitachi 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 Hitachi H8/300

@table @code

@kindex target hms@r{, with H8/300}
@item target hms @var{dev}
A Hitachi 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 Hitachi 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}
Hitachi 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 Hitachi SH
@cindex Hitachi SH download
When you select remote debugging to a Hitachi SH, H8/300, or H8/500
board, the @code{load} command downloads your program to the Hitachi
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
Hitachi SH, H8/300, or H8/500:

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

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

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

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

@node Hitachi Boards
@subsubsection Connecting to Hitachi boards

@c only for Unix hosts
@kindex device
@cindex serial device, Hitachi 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, Hitachi 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 Hitachi 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 Hitachi 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 Hitachi 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 Hitachi ICE
@subsubsection Using the E7000 in-circuit emulator

@kindex target e7000@r{, with Hitachi ICE}
You can use the E7000 in-circuit emulator to develop code for either the
Hitachi 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 Hitachi Special
@subsubsection Special @value{GDBN} commands for Hitachi 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 Mitsubishi M32R/D

@table @code

@kindex target m32r
@item target m32r @var{dev}
Mitsubishi M32R/D ROM monitor.

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

@table @code

@kindex target hms@r{, with Hitachi SH}
@item target hms @var{dev}
A Hitachi 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 Hitachi SH}
@item target e7000 @var{dev}
E7000 emulator for Hitachi SH.

@kindex target sh3@r{, with SH}
@kindex target sh3e@r{, with SH}
@item target sh3 @var{dev}
@item target sh3e @var{dev}
Hitachi 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 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 not available for readline.  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.

@quotation
@emph{Warning:} If the directory where your program resides is not your
current directory, it can be easy to confuse Emacs about the location of
the source files, in which case the auxiliary display buffer does not
appear to show your source.  @value{GDBN} can find programs by searching your
environment's @code{PATH} variable, so the @value{GDBN} input and output
session proceeds normally; but Emacs does not get enough information
back from @value{GDBN} to locate the source files in this situation.  To
avoid this problem, either start @value{GDBN} mode from the directory where
your program resides, or specify an absolute file name when prompted for the
@kbd{M-x gdb} argument.

A similar confusion can result if you use the @value{GDBN} @code{file} command to
switch to debugging a program in some other location, from an existing
@value{GDBN} buffer in Emacs.
@end quotation

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 set the
Emacs variable @code{gdb-command-name}; for example,

@smallexample
(setq gdb-command-name "mygdb")
@end smallexample

@noindent
(preceded by @kbd{M-:} or @kbd{ESC :}, or typed in the @code{*scratch*} buffer, or
in your @file{.emacs} file) makes Emacs call the program named
``@code{mygdb}'' instead.

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 M-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 M-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 M-i
Execute one instruction, like the @value{GDBN} @code{stepi} command; update
display window accordingly.

@item M-x gdb-nexti
Execute to next instruction, using the @value{GDBN} @code{nexti} 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 M-c
Continue execution of your program, like the @value{GDBN} @code{continue}
command.

@emph{Warning:} In Emacs v19, this command is @kbd{C-c C-p}.

@item M-u
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.

@emph{Warning:} In Emacs v19, this command is @kbd{C-c C-u}.

@item M-d
Go down the number of frames indicated by the numeric argument, like the
@value{GDBN} @code{down} command.

@emph{Warning:} In Emacs v19, this command is @kbd{C-c C-d}.

@item C-x &
Read the number where the cursor is positioned, and insert it at the end
of the @value{GDBN} I/O buffer.  For example, if you wish to disassemble code
around an address that was displayed earlier, type @kbd{disassemble};
then move the cursor to the address display, and pick up the
argument for @code{disassemble} by typing @kbd{C-x &}.

You can customize this further by defining elements of the list
@code{gdb-print-command}; once it is defined, you can format or
otherwise process numbers picked up by @kbd{C-x &} before they are
inserted.  A numeric argument to @kbd{C-x &} indicates that you
wish special formatting, and also acts as an index to pick an element of the
list.  If the list element is a string, the number to be inserted is
formatted using the Emacs function @code{format}; otherwise the number
is passed as an argument to the corresponding list element.
@end table

In any source file, the Emacs command @kbd{C-x SPC} (@code{gdb-break})
tells @value{GDBN} to set a breakpoint on the source line point is on.

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.

@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 prints only the names of the variables, with argument of 1
prints also their values.

@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 1
^done,locals=[@{name="A",value="1"@},@{name="B",value="2"@},
  @{name="C",value="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} comamnd 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-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-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{name}
@end smallexample

Returns a list of the children of the specified variable object:

@smallexample
 numchild=@var{n},children=[@{name=@var{name},
 numchild=@var{n},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 are
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.

@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.
* Value Annotations::   Values are marked as such.
* Frame Annotations::   Stack frames are annotated.
* Displays::            @value{GDBN} can be told to display something periodically.
* Prompting::           Annotations marking @value{GDBN}'s need for input.
* Errors::              Annotations for error messages.
* Breakpoint Info::     Information on breakpoints.
* 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.
* TODO::                Annotations which might be added in the future.
@end menu

@node Annotations Overview
@section What is an Annotation?
@cindex annotations

To produce annotations, start @value{GDBN} with the @code{--annotate=2} option.

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.

A simple example of starting up @value{GDBN} with annotations is:

@smallexample
$ gdb --annotate=2
GNU GDB 5.0
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 "sparc-sun-sunos4.1.3"

^Z^Zpre-prompt
(gdb) 
^Z^Zprompt
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 Value Annotations
@section Values

@cindex annotations for values
When a value is printed in various contexts, @value{GDBN} uses
annotations to delimit the value from the surrounding text.

@findex value-history-begin
@findex value-history-value
@findex value-history-end
If a value is printed using @code{print} and added to the value history,
the annotation looks like

@smallexample
^Z^Zvalue-history-begin @var{history-number} @var{value-flags}
@var{history-string}
^Z^Zvalue-history-value
@var{the-value}
^Z^Zvalue-history-end
@end smallexample

@noindent
where @var{history-number} is the number it is getting in the value
history, @var{history-string} is a string, such as @samp{$5 = }, which
introduces the value to the user, @var{the-value} is the output
corresponding to the value itself, and @var{value-flags} is @samp{*} for
a value which can be dereferenced and @samp{-} for a value which cannot.

@findex value-begin
@findex value-end
If the value is not added to the value history (it is an invalid float
or it is printed with the @code{output} command), the annotation is similar:

@smallexample
^Z^Zvalue-begin @var{value-flags}
@var{the-value}
^Z^Zvalue-end
@end smallexample

@findex arg-begin
@findex arg-name-end
@findex arg-value
@findex arg-end
When @value{GDBN} prints an argument to a function (for example, in the output
from the @code{backtrace} command), it annotates it as follows:

@smallexample
^Z^Zarg-begin
@var{argument-name}
^Z^Zarg-name-end
@var{separator-string}
^Z^Zarg-value @var{value-flags}
@var{the-value}
^Z^Zarg-end
@end smallexample

@noindent
where @var{argument-name} is the name of the argument,
@var{separator-string} is text which separates the name from the value
for the user's benefit (such as @samp{=}), and @var{value-flags} and
@var{the-value} have the same meanings as in a
@code{value-history-begin} annotation.

@findex field-begin
@findex field-name-end
@findex field-value
@findex field-end
When printing a structure, @value{GDBN} annotates it as follows:

@smallexample
^Z^Zfield-begin @var{value-flags}
@var{field-name}
^Z^Zfield-name-end
@var{separator-string}
^Z^Zfield-value
@var{the-value}
^Z^Zfield-end
@end smallexample

@noindent
where @var{field-name} is the name of the field, @var{separator-string}
is text which separates the name from the value for the user's benefit
(such as @samp{=}), and @var{value-flags} and @var{the-value} have the
same meanings as in a @code{value-history-begin} annotation.

When printing an array, @value{GDBN} annotates it as follows:

@smallexample
^Z^Zarray-section-begin @var{array-index} @var{value-flags}
@end smallexample

@noindent
where @var{array-index} is the index of the first element being
annotated and @var{value-flags} has the same meaning as in a
@code{value-history-begin} annotation.  This is followed by any number
of elements, where is element can be either a single element:

@findex elt
@smallexample
@samp{,} @var{whitespace}         ; @r{omitted for the first element}
@var{the-value}
^Z^Zelt
@end smallexample

or a repeated element

@findex elt-rep
@findex elt-rep-end
@smallexample
@samp{,} @var{whitespace}         ; @r{omitted for the first element}
@var{the-value}
^Z^Zelt-rep @var{number-of-repetitions}
@var{repetition-string}
^Z^Zelt-rep-end
@end smallexample

In both cases, @var{the-value} is the output for the value of the
element and @var{whitespace} can contain spaces, tabs, and newlines.  In
the repeated case, @var{number-of-repetitions} is the number of
consecutive array elements which contain that value, and
@var{repetition-string} is a string which is designed to convey to the
user that repetition is being depicted.

@findex array-section-end
Once all the array elements have been output, the array annotation is
ended with

@smallexample
^Z^Zarray-section-end
@end smallexample

@node Frame Annotations
@section Frames

@cindex annotations for frames
Whenever @value{GDBN} prints a frame, it annotates it.  For example, this applies
to frames printed when @value{GDBN} stops, output from commands such as
@code{backtrace} or @code{up}, etc.

@findex frame-begin
The frame annotation begins with

@smallexample
^Z^Zframe-begin @var{level} @var{address}
@var{level-string}
@end smallexample

@noindent
where @var{level} is the number of the frame (0 is the innermost frame,
and other frames have positive numbers), @var{address} is the address of
the code executing in that frame, and @var{level-string} is a string
designed to convey the level to the user.  @var{address} is in the form
@samp{0x} followed by one or more lowercase hex digits (note that this
does not depend on the language).  The frame ends with

@findex frame-end
@smallexample
^Z^Zframe-end
@end smallexample

Between these annotations is the main body of the frame, which can
consist of

@itemize @bullet
@item
@findex function-call
@smallexample
^Z^Zfunction-call
@var{function-call-string}
@end smallexample

where @var{function-call-string} is text designed to convey to the user
that this frame is associated with a function call made by @value{GDBN} to a
function in the program being debugged.

@item
@findex signal-handler-caller
@smallexample
^Z^Zsignal-handler-caller
@var{signal-handler-caller-string}
@end smallexample

where @var{signal-handler-caller-string} is text designed to convey to
the user that this frame is associated with whatever mechanism is used
by this operating system to call a signal handler (it is the frame which
calls the signal handler, not the frame for the signal handler itself).

@item
A normal frame.

@findex frame-address
@findex frame-address-end
This can optionally (depending on whether this is thought of as
interesting information for the user to see) begin with

@smallexample
^Z^Zframe-address
@var{address}
^Z^Zframe-address-end
@var{separator-string}
@end smallexample

where @var{address} is the address executing in the frame (the same
address as in the @code{frame-begin} annotation, but printed in a form
which is intended for user consumption---in particular, the syntax varies
depending on the language), and @var{separator-string} is a string
intended to separate this address from what follows for the user's
benefit.

@findex frame-function-name
@findex frame-args
Then comes

@smallexample
^Z^Zframe-function-name
@var{function-name}
^Z^Zframe-args
@var{arguments}
@end smallexample

where @var{function-name} is the name of the function executing in the
frame, or @samp{??} if not known, and @var{arguments} are the arguments
to the frame, with parentheses around them (each argument is annotated
individually as well, @pxref{Value Annotations}).

@findex frame-source-begin
@findex frame-source-file
@findex frame-source-file-end
@findex frame-source-line
@findex frame-source-end
If source information is available, a reference to it is then printed:

@smallexample
^Z^Zframe-source-begin
@var{source-intro-string}
^Z^Zframe-source-file
@var{filename}
^Z^Zframe-source-file-end
:
^Z^Zframe-source-line
@var{line-number}
^Z^Zframe-source-end
@end smallexample

where @var{source-intro-string} separates for the user's benefit the
reference from the text which precedes it, @var{filename} is the name of
the source file, and @var{line-number} is the line number within that
file (the first line is line 1).

@findex frame-where
If @value{GDBN} prints some information about where the frame is from (which
library, which load segment, etc.; currently only done on the RS/6000),
it is annotated with

@smallexample
^Z^Zframe-where
@var{information}
@end smallexample

Then, if source is to actually be displayed for this frame (for example,
this is not true for output from the @code{backtrace} command), then a
@code{source} annotation (@pxref{Source Annotations}) is displayed.  Unlike
most annotations, this is output instead of the normal text which would be
output, not in addition.
@end itemize

@node Displays
@section Displays

@findex display-begin
@findex display-number-end
@findex display-format
@findex display-expression
@findex display-expression-end
@findex display-value
@findex display-end
@cindex annotations for display
When @value{GDBN} is told to display something using the @code{display} command,
the results of the display are annotated:

@smallexample
^Z^Zdisplay-begin
@var{number}
^Z^Zdisplay-number-end
@var{number-separator}
^Z^Zdisplay-format
@var{format}
^Z^Zdisplay-expression
@var{expression}
^Z^Zdisplay-expression-end
@var{expression-separator}
^Z^Zdisplay-value
@var{value}
^Z^Zdisplay-end
@end smallexample

@noindent
where @var{number} is the number of the display, @var{number-separator}
is intended to separate the number from what follows for the user,
@var{format} includes information such as the size, format, or other
information about how the value is being displayed, @var{expression} is
the expression being displayed, @var{expression-separator} is intended
to separate the expression from the text that follows for the user,
and @var{value} is the actual value being displayed.

@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 Breakpoint Info
@section Information on Breakpoints

@cindex annotations for breakpoints
The output from the @code{info breakpoints} command is annotated as follows:

@findex breakpoints-headers
@findex breakpoints-table
@smallexample
^Z^Zbreakpoints-headers
@var{header-entry}
^Z^Zbreakpoints-table
@end smallexample

@noindent
where @var{header-entry} has the same syntax as an entry (see below) but
instead of containing data, it contains strings which are intended to
convey the meaning of each field to the user.  This is followed by any
number of entries.  If a field does not apply for this entry, it is
omitted.  Fields may contain trailing whitespace.  Each entry consists
of:

@findex record
@findex field
@smallexample
^Z^Zrecord
^Z^Zfield 0
@var{number}
^Z^Zfield 1
@var{type}
^Z^Zfield 2
@var{disposition}
^Z^Zfield 3
@var{enable}
^Z^Zfield 4
@var{address}
^Z^Zfield 5
@var{what}
^Z^Zfield 6
@var{frame}
^Z^Zfield 7
@var{condition}
^Z^Zfield 8
@var{ignore-count}
^Z^Zfield 9
@var{commands}
@end smallexample

Note that @var{address} is intended for user consumption---the syntax
varies depending on the language.

The output ends with

@findex breakpoints-table-end
@smallexample
^Z^Zbreakpoints-table-end
@end smallexample

@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 TODO
@section Annotations We Might Want in the Future

@format
    - target-invalid
      the target might have changed (registers, heap contents, or
      execution status).  For performance, we might eventually want
      to hit `registers-invalid' and `all-registers-invalid' with
      greater precision

    - systematic annotation for set/show parameters (including
      invalidation notices).

    - similarly, `info' returns a list of candidates for invalidation
      notices.
@end format

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

Some remote systems have used a different run-length encoding mechanism
loosely refered to as the cisco encoding.  Following the @samp{*}
character are two hex digits that indicate the size of the packet.

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.

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

Reserved for future use.

@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{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 N@var{AA};@var{t@dots{}};@var{d@dots{}};@var{b@dots{}} @strong{(obsolete)}

@var{AA} = signal number; @var{t@dots{}} = address of symbol
@code{_start}; @var{d@dots{}} = base of data section; @var{b@dots{}} =
base of bss section.  @emph{Note: only used by Cisco Systems targets.
The difference between this reply and the @samp{qOffsets} query is that
the @samp{N} packet may arrive spontaneously whereas the @samp{qOffsets}
is a query initiated by the host debugger.}

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