This is gdb.info, produced by makeinfo version 4.13 from
/home/gccbuilder-i386/work/mgcc4.6/Release/build/arm-marvell-linux-uclibcgnueabi/gdb-tmp-src/gdb/doc/gdb.texinfo.

INFO-DIR-SECTION Software development
START-INFO-DIR-ENTRY
* Gdb: (gdb).                     The GNU debugger.
END-INFO-DIR-ENTRY

   Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010 Free Software Foundation, Inc.

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

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

   This file documents the GNU debugger GDB.

   This is the Tenth Edition, of `Debugging with GDB: the GNU
Source-Level Debugger' for GDB (Linaro GCC branch-4.6.4. Marvell GCC
release 20141015-c4af733b ) Version 7.4-2012.06-1~bzr.

   Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010 Free Software Foundation, Inc.

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

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


File: gdb.info,  Node: Top,  Next: Summary,  Prev: (dir),  Up: (dir)

Debugging with GDB
******************

This file describes GDB, the GNU symbolic debugger.

   This is the Tenth Edition, for GDB (Linaro GCC branch-4.6.4. Marvell
GCC release 20141015-c4af733b ) Version 7.4-2012.06-1~bzr.

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

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

* Menu:

* Summary::                     Summary of GDB
* Sample Session::              A sample GDB session

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

* Languages::                   Using GDB with different languages

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

* GDB Bugs::                    Reporting bugs in GDB


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


File: gdb.info,  Node: Summary,  Next: Sample Session,  Prev: Top,  Up: Top

Summary of GDB
**************

The purpose of a debugger such as GDB is to allow you to see what is
going on "inside" another program while it executes--or what another
program was doing at the moment it crashed.

   GDB can do four main kinds of things (plus other things in support of
these) to help you catch bugs in the act:

   * Start your program, specifying anything that might affect its
     behavior.

   * Make your program stop on specified conditions.

   * Examine what has happened, when your program has stopped.

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

   You can use GDB to debug programs written in C and C++.  For more
information, see *note Supported Languages: Supported Languages.  For
more information, see *note C and C++: C.

   Support for D is partial.  For information on D, see *note D: D.

   Support for Modula-2 is partial.  For information on Modula-2, see
*note Modula-2: Modula-2.

   Support for OpenCL C is partial.  For information on OpenCL C, see
*note OpenCL C: OpenCL C.

   Debugging Pascal programs which use sets, subranges, file variables,
or nested functions does not currently work.  GDB does not support
entering expressions, printing values, or similar features using Pascal
syntax.

   GDB can be used to debug programs written in Fortran, although it
may be necessary to refer to some variables with a trailing underscore.

   GDB can be used to debug programs written in Objective-C, using
either the Apple/NeXT or the GNU Objective-C runtime.

* Menu:

* Free Software::               Freely redistributable software
* Contributors::                Contributors to GDB


File: gdb.info,  Node: Free Software,  Next: Contributors,  Up: Summary

Free Software
=============

GDB is "free software", protected by the GNU General Public License
(GPL).  The GPL gives you the freedom to copy or adapt a licensed
program--but every person getting a copy also gets with it the freedom
to modify that copy (which means that they must get access to the
source code), and the freedom to distribute further copies.  Typical
software companies use copyrights to limit your freedoms; the Free
Software Foundation uses the GPL to preserve these freedoms.

   Fundamentally, the General Public License is a license which says
that you have these freedoms and that you cannot take these freedoms
away from anyone else.

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 _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 <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
`http://www.fsf.org/doc/other-free-books.html'.


File: gdb.info,  Node: Contributors,  Prev: Free Software,  Up: Summary

Contributors to GDB
===================

Richard Stallman was the original author of GDB, and of many other GNU
programs.  Many others have contributed to its development.  This
section attempts to credit major 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
`ChangeLog' in the GDB distribution approximates a blow-by-blow account.

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

     _Plea:_ Additions to this section are particularly welcome.  If you
     or your friends (or enemies, to be evenhanded) have been unfairly
     omitted from this list, we would like to add your names!

   So that they may not regard their many labors as thankless, we
particularly thank those who shepherded GDB through major releases:
Andrew Cagney (releases 6.3, 6.2, 6.1, 6.0, 5.3, 5.2, 5.1 and 5.0); Jim
Blandy (release 4.18); Jason Molenda (release 4.17); Stan Shebs
(release 4.14); Fred Fish (releases 4.16, 4.15, 4.13, 4.12, 4.11, 4.10,
and 4.9); Stu Grossman and John Gilmore (releases 4.8, 4.7, 4.6, 4.5,
and 4.4); John Gilmore (releases 4.3, 4.2, 4.1, 4.0, and 3.9); Jim
Kingdon (releases 3.5, 3.4, and 3.3); and Randy Smith (releases 3.2,
3.1, and 3.0).

   Richard Stallman, assisted at various times by Peter TerMaat, Chris
Hanson, and Richard Mlynarik, handled releases through 2.8.

   Michael Tiemann is the author of most of the GNU C++ support in GDB,
with significant additional contributions from Per Bothner and Daniel
Berlin.  James Clark wrote the GNU C++ demangler.  Early work on C++
was by Peter TerMaat (who also did much general update work leading to
release 3.0).

   GDB uses the BFD subroutine library to examine multiple object-file
formats; BFD was a joint project of David V.  Henkel-Wallace, Rich
Pixley, Steve Chamberlain, and John Gilmore.

   David Johnson wrote the original COFF support; Pace Willison did the
original support for encapsulated COFF.

   Brent Benson of Harris Computer Systems contributed DWARF 2 support.

   Adam de Boor and Bradley Davis contributed the ISI Optimum V support.
Per Bothner, Noboyuki Hikichi, and Alessandro Forin contributed MIPS
support.  Jean-Daniel Fekete contributed Sun 386i support.  Chris
Hanson improved the HP9000 support.  Noboyuki 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 GNU/Linux support.

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

   Jay Fenlason and Roland McGrath ensured that GDB and GAS agree about
several machine instruction sets.

   Patrick Duval, Ted Goldstein, Vikram Koka and Glenn Engel helped
develop remote debugging.  Intel Corporation, Wind River Systems, AMD,
and ARM contributed remote debugging modules for the i960, VxWorks,
A29K UDI, and RDI targets, respectively.

   Brian Fox is the author of the readline libraries providing
command-line editing and command history.

   Andrew Beers of SUNY Buffalo wrote the language-switching code, the
Modula-2 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++ overloaded symbols.

   Hitachi America (now Renesas America), Ltd. sponsored the support for
H8/300, H8/500, and Super-H processors.

   NEC sponsored the support for the v850, Vr4xxx, and Vr5xxx
processors.

   Mitsubishi (now Renesas) sponsored the support for D10V, D30V, and
M32R/D processors.

   Toshiba sponsored the support for the TX39 Mips processor.

   Matsushita sponsored the support for the MN10200 and MN10300
processors.

   Fujitsu sponsored the support for SPARClite and FR30 processors.

   Kung Hsu, Jeff Law, and Rick Sladkey added support for hardware
watchpoints.

   Michael Snyder added support for tracepoints.

   Stu Grossman wrote gdbserver.

   Jim Kingdon, Peter Schauer, Ian Taylor, and Stu Grossman made nearly
innumerable bug fixes and cleanups throughout GDB.

   The following people at the Hewlett-Packard Company contributed
support for the PA-RISC 2.0 architecture, HP-UX 10.20, 10.30, and 11.0
(narrow mode), HP's implementation of kernel threads, HP's aC++
compiler, and the Text User Interface (nee Terminal User Interface):
Ben Krepp, Richard Title, John Bishop, Susan Macchia, Kathy Mann,
Satish Pai, India Paul, Steve Rehrauer, and Elena Zannoni.  Kim Haase
provided HP-specific information in this manual.

   DJ Delorie ported GDB to MS-DOS, for the DJGPP project.  Robert
Hoehne made significant contributions to the DJGPP port.

   Cygnus Solutions has sponsored GDB maintenance and much of its
development since 1991.  Cygnus engineers who have worked on GDB
fulltime include Mark Alexander, Jim Blandy, Per Bothner, Kevin
Buettner, Edith Epstein, Chris Faylor, Fred Fish, Martin Hunt, Jim
Ingham, John Gilmore, Stu Grossman, Kung Hsu, Jim Kingdon, John Metzler,
Fernando Nasser, Geoffrey Noer, Dawn Perchik, Rich Pixley, Zdenek
Radouch, Keith Seitz, Stan Shebs, David Taylor, and Elena Zannoni.  In
addition, Dave Brolley, Ian Carmichael, Steve Chamberlain, Nick Clifton,
JT Conklin, Stan Cox, DJ Delorie, Ulrich Drepper, Frank Eigler, Doug
Evans, Sean Fagan, David Henkel-Wallace, Richard Henderson, Jeff
Holcomb, Jeff Law, Jim Lemke, Tom Lord, Bob Manson, Michael Meissner,
Jason Merrill, Catherine Moore, Drew Moseley, Ken Raeburn, Gavin
Romig-Koch, Rob Savoye, Jamie Smith, Mike Stump, Ian Taylor, Angela
Thomas, Michael Tiemann, Tom Tromey, Ron Unrau, Jim Wilson, and David
Zuhn have made contributions both large and small.

   Andrew Cagney, Fernando Nasser, and Elena Zannoni, while working for
Cygnus Solutions, implemented the original GDB/MI interface.

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

   Andrew Cagney designed GDB's architecture vector.  Many people
including Andrew Cagney, Stephane Carrez, Randolph Chung, Nick Duffek,
Richard Henderson, Mark Kettenis, Grace Sainsbury, Kei Sakamoto,
Yoshinori Sato, Michael Snyder, Andreas Schwab, Jason Thorpe, Corinna
Vinschen, Ulrich Weigand, and Elena Zannoni, helped with the migration
of old architectures to this new framework.

   Andrew Cagney completely re-designed and re-implemented GDB's
unwinder framework, this consisting of a fresh new design featuring
frame IDs, independent frame sniffers, and the sentinel frame.  Mark
Kettenis implemented the DWARF 2 unwinder, Jeff Johnston the libunwind
unwinder, and Andrew Cagney the dummy, sentinel, tramp, and trad
unwinders.  The architecture-specific changes, each involving a
complete rewrite of the architecture's frame code, were carried out by
Jim Blandy, Joel Brobecker, Kevin Buettner, Andrew Cagney, Stephane
Carrez, Randolph Chung, Orjan Friberg, Richard Henderson, Daniel
Jacobowitz, Jeff Johnston, Mark Kettenis, Theodore A. Roth, Kei
Sakamoto, Yoshinori Sato, Michael Snyder, Corinna Vinschen, and Ulrich
Weigand.

   Christian Zankel, Ross Morley, Bob Wilson, and Maxim Grigoriev from
Tensilica, Inc. contributed support for Xtensa processors.  Others who
have worked on the Xtensa port of GDB in the past include Steve Tjiang,
John Newlin, and Scott Foehner.

   Michael Eager and staff of Xilinx, Inc., contributed support for the
Xilinx MicroBlaze architecture.


File: gdb.info,  Node: Sample Session,  Next: Invocation,  Prev: Summary,  Up: Top

1 A Sample GDB Session
**********************

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

   One of the preliminary versions of GNU `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 `m4'
session, we define a macro `foo' which expands to `0000'; we then use
the `m4' built-in `defn' to define `bar' as the same thing.  However,
when we change the open quote string to `<QUOTE>' and the close quote
string to `<UNQUOTE>', the same procedure fails to define a new synonym
`baz':

     $ cd gnu/m4
     $ ./m4
     define(foo,0000)

     foo
     0000
     define(bar,defn(`foo'))

     bar
     0000
     changequote(<QUOTE>,<UNQUOTE>)

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

Let us use GDB to try to see what is going on.

     $ gdb m4
     GDB is free software and you are welcome to distribute copies
      of it under certain conditions; type "show copying" to see
      the conditions.
     There is absolutely no warranty for GDB; type "show warranty"
      for details.

     GDB 7.4-2012.06-1~bzr, Copyright 1999 Free Software Foundation, Inc...
     (gdb)

GDB 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 GDB to use a narrower display width than usual, so that examples
fit in this manual.

     (gdb) set width 70

We need to see how the `m4' built-in `changequote' works.  Having
looked at the source, we know the relevant subroutine is
`m4_changequote', so we set a breakpoint there with the GDB `break'
command.

     (gdb) break m4_changequote
     Breakpoint 1 at 0x62f4: file builtin.c, line 879.

Using the `run' command, we start `m4' running under GDB control; as
long as control does not reach the `m4_changequote' subroutine, the
program runs as usual:

     (gdb) run
     Starting program: /work/Editorial/gdb/gnu/m4/m4
     define(foo,0000)

     foo
     0000

To trigger the breakpoint, we call `changequote'.  GDB suspends
execution of `m4', displaying information about the context where it
stops.

     changequote(<QUOTE>,<UNQUOTE>)

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

Now we use the command `n' (`next') to advance execution to the next
line of the current function.

     (gdb) n
     882         set_quotes((argc >= 2) ? TOKEN_DATA_TEXT(argv[1])\
      : nil,

`set_quotes' looks like a promising subroutine.  We can go into it by
using the command `s' (`step') instead of `next'.  `step' goes to the
next line to be executed in _any_ subroutine, so it steps into
`set_quotes'.

     (gdb) s
     set_quotes (lq=0x34c78 "<QUOTE>", rq=0x34c88 "<UNQUOTE>")
         at input.c:530
     530         if (lquote != def_lquote)

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

     (gdb) 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

We step through a few more lines to see what happens.  The first two
times, we can use `s'; the next two times we use `n' to avoid falling
into the `xstrdup' subroutine.

     (gdb) s
     0x3b5c  532         if (rquote != def_rquote)
     (gdb) s
     0x3b80  535         lquote = (lq == nil || *lq == '\0') ?  \
     def_lquote : xstrdup(lq);
     (gdb) n
     536         rquote = (rq == nil || *rq == '\0') ? def_rquote\
      : xstrdup(rq);
     (gdb) n
     538         len_lquote = strlen(rquote);

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

     (gdb) p lquote
     $1 = 0x35d40 "<QUOTE>"
     (gdb) p rquote
     $2 = 0x35d50 "<UNQUOTE>"

`lquote' and `rquote' are indeed the new left and right quotes.  To
look at some context, we can display ten lines of source surrounding
the current line with the `l' (`list') command.

     (gdb) l
     533             xfree(rquote);
     534
     535         lquote = (lq == nil || *lq == '\0') ? def_lquote\
      : xstrdup (lq);
     536         rquote = (rq == nil || *rq == '\0') ? def_rquote\
      : xstrdup (rq);
     537
     538         len_lquote = strlen(rquote);
     539         len_rquote = strlen(lquote);
     540     }
     541
     542     void

Let us step past the two lines that set `len_lquote' and `len_rquote',
and then examine the values of those variables.

     (gdb) n
     539         len_rquote = strlen(lquote);
     (gdb) n
     540     }
     (gdb) p len_lquote
     $3 = 9
     (gdb) p len_rquote
     $4 = 7

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

     (gdb) p len_lquote=strlen(lquote)
     $5 = 7
     (gdb) p len_rquote=strlen(rquote)
     $6 = 9

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

     (gdb) c
     Continuing.

     define(baz,defn(<QUOTE>foo<UNQUOTE>))

     baz
     0000

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

     Ctrl-d
     Program exited normally.

The message `Program exited normally.' is from GDB; it indicates `m4'
has finished executing.  We can end our GDB session with the GDB `quit'
command.

     (gdb) quit


File: gdb.info,  Node: Invocation,  Next: Commands,  Prev: Sample Session,  Up: Top

2 Getting In and Out of GDB
***************************

This chapter discusses how to start GDB, and how to get out of it.  The
essentials are:
   * type `gdb' to start GDB.

   * type `quit' or `Ctrl-d' to exit.

* Menu:

* Invoking GDB::                How to start GDB
* Quitting GDB::                How to quit GDB
* Shell Commands::              How to use shell commands inside GDB
* Logging Output::              How to log GDB's output to a file


File: gdb.info,  Node: Invoking GDB,  Next: Quitting GDB,  Up: Invocation

2.1 Invoking GDB
================

Invoke GDB by running the program `gdb'.  Once started, GDB reads
commands from the terminal until you tell it to exit.

   You can also run `gdb' 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 GDB is with one argument, specifying an
executable program:

     gdb PROGRAM

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

     gdb PROGRAM CORE

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

     gdb PROGRAM 1234

would attach GDB to process `1234' (unless you also have a file named
`1234'; GDB does check for a core file first).

   Taking advantage of the second command-line argument requires a
fairly complete operating system; when you use GDB 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.  GDB will warn you if it is
unable to attach or to read core dumps.

   You can optionally have `gdb' pass any arguments after the
executable file to the inferior using `--args'.  This option stops
option processing.
     gdb --args gcc -O2 -c foo.c
   This will cause `gdb' to debug `gcc', and to set `gcc''s
command-line arguments (*note Arguments::) to `-O2 -c foo.c'.

   You can run `gdb' without printing the front material, which
describes GDB's non-warranty, by specifying `-silent':

     gdb -silent

You can further control how GDB starts up by using command-line
options.  GDB itself can remind you of the options available.

Type

     gdb -help

to display all available options and briefly describe their use (`gdb
-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 `-x' option is
used.

* Menu:

* File Options::                Choosing files
* Mode Options::                Choosing modes
* Startup::                     What GDB does during startup


File: gdb.info,  Node: File Options,  Next: Mode Options,  Up: Invoking GDB

2.1.1 Choosing Files
--------------------

When GDB 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 `-se' and `-c' (or
`-p') options respectively.  (GDB reads the first argument that does
not have an associated option flag as equivalent to the `-se' option
followed by that argument; and the second argument that does not have
an associated option flag, if any, as equivalent to the `-c'/`-p'
option followed by that argument.)  If the second argument begins with
a decimal digit, GDB 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 GDB from
treating it as a pid by prefixing it with `./', e.g. `./12345'.

   If GDB 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.  GDB 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 `--' rather than
`-', though we illustrate the more usual convention.)

`-symbols FILE'
`-s FILE'
     Read symbol table from file FILE.

`-exec FILE'
`-e FILE'
     Use file FILE as the executable file to execute when appropriate,
     and for examining pure data in conjunction with a core dump.

`-se FILE'
     Read symbol table from file FILE and use it as the executable file.

`-core FILE'
`-c FILE'
     Use file FILE as a core dump to examine.

`-pid NUMBER'
`-p NUMBER'
     Connect to process ID NUMBER, as with the `attach' command.

`-command FILE'
`-x FILE'
     Execute commands from file FILE.  The contents of this file is
     evaluated exactly as the `source' command would.  *Note Command
     files: Command Files.

`-eval-command COMMAND'
`-ex COMMAND'
     Execute a single GDB command.

     This option may be used multiple times to call multiple commands.
     It may also be interleaved with `-command' as required.

          gdb -ex 'target sim' -ex 'load' \
             -x setbreakpoints -ex 'run' a.out

`-directory DIRECTORY'
`-d DIRECTORY'
     Add DIRECTORY to the path to search for source and script files.

`-r'
`-readnow'
     Read each symbol file's entire symbol table immediately, rather
     than the default, which is to read it incrementally as it is
     needed.  This makes startup slower, but makes future operations
     faster.



File: gdb.info,  Node: Mode Options,  Next: Startup,  Prev: File Options,  Up: Invoking GDB

2.1.2 Choosing Modes
--------------------

You can run GDB in various alternative modes--for example, in batch
mode or quiet mode.

`-nx'
`-n'
     Do not execute commands found in any initialization files.
     Normally, GDB executes the commands in these files after all the
     command options and arguments have been processed.  *Note Command
     Files: Command Files.

`-quiet'
`-silent'
`-q'
     "Quiet".  Do not print the introductory and copyright messages.
     These messages are also suppressed in batch mode.

`-batch'
     Run in batch mode.  Exit with status `0' after processing all the
     command files specified with `-x' (and all commands from
     initialization files, if not inhibited with `-n').  Exit with
     nonzero status if an error occurs in executing the GDB commands in
     the command files.  Batch mode also disables pagination, sets
     unlimited terminal width and height *note Screen Size::, and acts
     as if `set confirm off' were in effect (*note Messages/Warnings::).

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

          Program exited normally.

     (which is ordinarily issued whenever a program running under GDB
     control terminates) is not issued when running in batch mode.

`-batch-silent'
     Run in batch mode exactly like `-batch', but totally silently.  All
     GDB output to `stdout' is prevented (`stderr' is unaffected).
     This is much quieter than `-silent' and would be useless for an
     interactive session.

     This is particularly useful when using targets that give `Loading
     section' messages, for example.

     Note that targets that give their output via GDB, as opposed to
     writing directly to `stdout', will also be made silent.

`-return-child-result'
     The return code from GDB will be the return code from the child
     process (the process being debugged), with the following
     exceptions:

        * GDB exits abnormally.  E.g., due to an incorrect argument or
          an internal error.  In this case the exit code is the same as
          it would have been without `-return-child-result'.

        * The user quits with an explicit value.  E.g., `quit 1'.

        * The child process never runs, or is not allowed to terminate,
          in which case the exit code will be -1.

     This option is useful in conjunction with `-batch' or
     `-batch-silent', when GDB is being used as a remote program loader
     or simulator interface.

`-nowindows'
`-nw'
     "No windows".  If GDB comes with a graphical user interface (GUI)
     built in, then this option tells GDB to only use the command-line
     interface.  If no GUI is available, this option has no effect.

`-windows'
`-w'
     If GDB includes a GUI, then this option requires it to be used if
     possible.

`-cd DIRECTORY'
     Run GDB using DIRECTORY as its working directory, instead of the
     current directory.

`-data-directory DIRECTORY'
     Run GDB using DIRECTORY as its data directory.  The data directory
     is where GDB searches for its auxiliary files.  *Note Data Files::.

`-fullname'
`-f'
     GNU Emacs sets this option when it runs GDB as a subprocess.  It
     tells GDB to output the full file name and line number in a
     standard, recognizable fashion each time a stack frame is
     displayed (which includes each time your program stops).  This
     recognizable format looks like two `\032' characters, followed by
     the file name, line number and character position separated by
     colons, and a newline.  The Emacs-to-GDB interface program uses
     the two `\032' characters as a signal to display the source code
     for the frame.

`-epoch'
     The Epoch Emacs-GDB interface sets this option when it runs GDB as
     a subprocess.  It tells GDB to modify its print routines so as to
     allow Epoch to display values of expressions in a separate window.

`-annotate LEVEL'
     This option sets the "annotation level" inside GDB.  Its effect is
     identical to using `set annotate LEVEL' (*note Annotations::).
     The annotation LEVEL controls how much information GDB prints
     together with its prompt, values of expressions, source lines, and
     other types of output.  Level 0 is the normal, level 1 is for use
     when GDB is run as a subprocess of GNU Emacs, level 3 is the
     maximum annotation suitable for programs that control GDB, and
     level 2 has been deprecated.

     The annotation mechanism has largely been superseded by GDB/MI
     (*note GDB/MI::).

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

`-baud BPS'
`-b BPS'
     Set the line speed (baud rate or bits per second) of any serial
     interface used by GDB for remote debugging.

`-l TIMEOUT'
     Set the timeout (in seconds) of any communication used by GDB for
     remote debugging.

`-tty DEVICE'
`-t DEVICE'
     Run using DEVICE for your program's standard input and output.

`-tui'
     Activate the "Text User Interface" when starting.  The Text User
     Interface manages several text windows on the terminal, showing
     source, assembly, registers and GDB command outputs (*note GDB
     Text User Interface: TUI.).  Alternatively, the Text User
     Interface can be enabled by invoking the program `gdbtui'.  Do not
     use this option if you run GDB from Emacs (*note Using GDB under
     GNU Emacs: Emacs.).

`-interpreter INTERP'
     Use the interpreter INTERP for interface with the controlling
     program or device.  This option is meant to be set by programs
     which communicate with GDB using it as a back end.  *Note Command
     Interpreters: Interpreters.

     `--interpreter=mi' (or `--interpreter=mi2') causes GDB to use the
     "GDB/MI interface" (*note The GDB/MI Interface: GDB/MI.) included
     since GDB version 6.0.  The previous GDB/MI interface, included in
     GDB version 5.3 and selected with `--interpreter=mi1', is
     deprecated.  Earlier GDB/MI interfaces are no longer supported.

`-write'
     Open the executable and core files for both reading and writing.
     This is equivalent to the `set write on' command inside GDB (*note
     Patching::).

`-statistics'
     This option causes GDB to print statistics about time and memory
     usage after it completes each command and returns to the prompt.

`-version'
     This option causes GDB to print its version number and no-warranty
     blurb, and exit.



File: gdb.info,  Node: Startup,  Prev: Mode Options,  Up: Invoking GDB

2.1.3 What GDB Does During Startup
----------------------------------

Here's the description of what GDB does during session startup:

  1. Sets up the command interpreter as specified by the command line
     (*note interpreter: Mode Options.).

  2. Reads the system-wide "init file" (if `--with-system-gdbinit' was
     used when building GDB; *note System-wide configuration and
     settings: System-wide configuration.) and executes all the
     commands in that file.

  3. Reads the init file (if any) in your home directory(1) and
     executes all the commands in that file.

  4. Processes command line options and operands.

  5. Reads and executes the commands from init file (if any) in the
     current working directory.  This is only done if the current
     directory is different from your home directory.  Thus, you can
     have more than one init file, one generic in your home directory,
     and another, specific to the program you are debugging, in the
     directory where you invoke GDB.

  6. If the command line specified a program to debug, or a process to
     attach to, or a core file, GDB loads any auto-loaded scripts
     provided for the program or for its loaded shared libraries.
     *Note Auto-loading::.

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

          $ gdb -ex "set auto-load-scripts off" -ex "file myprogram"

     The following does not work because the auto-loading is turned off
     too late:

          $ gdb -ex "set auto-load-scripts off" myprogram

  7. Reads command files specified by the `-x' option.  *Note Command
     Files::, for more details about GDB command files.

  8. Reads the command history recorded in the "history file".  *Note
     Command History::, for more details about the command history and
     the files where GDB records it.

   Init files use the same syntax as "command files" (*note Command
Files::) and are processed by GDB in the same way.  The init file in
your home directory can set options (such as `set complaints') that
affect subsequent processing of command line options and operands.
Init files are not executed if you use the `-nx' option (*note Choosing
Modes: Mode Options.).

   To display the list of init files loaded by gdb at startup, you can
use `gdb --help'.

   The GDB init files are normally called `.gdbinit'.  The DJGPP port
of GDB uses the name `gdb.ini', due to the limitations of file names
imposed by DOS filesystems.  The Windows ports of GDB use the standard
name, but if they find a `gdb.ini' file, they warn you about that and
suggest to rename the file to the standard name.

   ---------- Footnotes ----------

   (1) On DOS/Windows systems, the home directory is the one pointed to
by the `HOME' environment variable.


File: gdb.info,  Node: Quitting GDB,  Next: Shell Commands,  Prev: Invoking GDB,  Up: Invocation

2.2 Quitting GDB
================

`quit [EXPRESSION]'
`q'
     To exit GDB, use the `quit' command (abbreviated `q'), or type an
     end-of-file character (usually `Ctrl-d').  If you do not supply
     EXPRESSION, GDB will terminate normally; otherwise it will
     terminate using the result of EXPRESSION as the error code.

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

   If you have been using GDB to control an attached process or device,
you can release it with the `detach' command (*note Debugging an
Already-running Process: Attach.).


File: gdb.info,  Node: Shell Commands,  Next: Logging Output,  Prev: Quitting GDB,  Up: Invocation

2.3 Shell Commands
==================

If you need to execute occasional shell commands during your debugging
session, there is no need to leave or suspend GDB; you can just use the
`shell' command.

`shell COMMAND-STRING'
`!COMMAND-STRING'
     Invoke a standard shell to execute COMMAND-STRING.  Note that no
     space is needed between `!' and COMMAND-STRING.  If it exists, the
     environment variable `SHELL' determines which shell to run.
     Otherwise GDB uses the default shell (`/bin/sh' on Unix systems,
     `COMMAND.COM' on MS-DOS, etc.).

   The utility `make' is often needed in development environments.  You
do not have to use the `shell' command for this purpose in GDB:

`make MAKE-ARGS'
     Execute the `make' program with the specified arguments.  This is
     equivalent to `shell make MAKE-ARGS'.


File: gdb.info,  Node: Logging Output,  Prev: Shell Commands,  Up: Invocation

2.4 Logging Output
==================

You may want to save the output of GDB commands to a file.  There are
several commands to control GDB's logging.

`set logging on'
     Enable logging.

`set logging off'
     Disable logging.  

`set logging file FILE'
     Change the name of the current logfile.  The default logfile is
     `gdb.txt'.

`set logging overwrite [on|off]'
     By default, GDB will append to the logfile.  Set `overwrite' if
     you want `set logging on' to overwrite the logfile instead.

`set logging redirect [on|off]'
     By default, GDB output will go to both the terminal and the
     logfile.  Set `redirect' if you want output to go only to the log
     file.  

`show logging'
     Show the current values of the logging settings.


File: gdb.info,  Node: Commands,  Next: Running,  Prev: Invocation,  Up: Top

3 GDB Commands
**************

You can abbreviate a GDB command to the first few letters of the command
name, if that abbreviation is unambiguous; and you can repeat certain
GDB commands by typing just <RET>.  You can also use the <TAB> key to
get GDB to fill out the rest of a word in a command (or to show you the
alternatives available, if there is more than one possibility).

* Menu:

* Command Syntax::              How to give commands to GDB
* Completion::                  Command completion
* Help::                        How to ask GDB for help


File: gdb.info,  Node: Command Syntax,  Next: Completion,  Up: Commands

3.1 Command Syntax
==================

A GDB 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 `step' accepts an argument which is the number of times to
step, as in `step 5'.  You can also use the `step' command with no
arguments.  Some commands do not allow any arguments.

   GDB 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, `s' is specially defined as
equivalent to `step' even though there are other commands whose names
start with `s'.  You can test abbreviations by using them as arguments
to the `help' command.

   A blank line as input to GDB (typing just <RET>) means to repeat the
previous command.  Certain commands (for example, `run') will not
repeat this way; these are commands whose unintentional repetition
might cause trouble and which you are unlikely to want to repeat.
User-defined commands can disable this feature; see *note dont-repeat:
Define.

   The `list' and `x' commands, when you repeat them with <RET>,
construct new arguments rather than repeating exactly as typed.  This
permits easy scanning of source or memory.

   GDB can also use <RET> in another way: to partition lengthy output,
in a way similar to the common utility `more' (*note Screen Size:
Screen Size.).  Since it is easy to press one <RET> too many in this
situation, GDB disables command repetition after any command that
generates this sort of display.

   Any text from a `#' to the end of the line is a comment; it does
nothing.  This is useful mainly in command files (*note Command Files:
Command Files.).

   The `Ctrl-o' binding is useful for repeating a complex sequence of
commands.  This command accepts the current line, like <RET>, and then
fetches the next line relative to the current line from the history for
editing.


File: gdb.info,  Node: Completion,  Next: Help,  Prev: Command Syntax,  Up: Commands

3.2 Command Completion
======================

GDB 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 GDB
commands, GDB subcommands, and the names of symbols in your program.

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

     (gdb) info bre <TAB>

GDB fills in the rest of the word `breakpoints', since that is the only
`info' subcommand beginning with `bre':

     (gdb) info breakpoints

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

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

     (gdb) b make_ <TAB>
GDB sounds bell; press <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
     (gdb) b make_

After displaying the available possibilities, GDB copies your partial
input (`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 `M-?' rather than pressing <TAB> twice.  `M-?' means
`<META> ?'.  You can type this either by holding down a key designated
as the <META> shift on your keyboard (if there is one) while typing
`?', or as <ESC> followed by `?'.

   Sometimes the string you need, while logically a "word", may contain
parentheses or other characters that GDB normally excludes from its
notion of a word.  To permit word completion to work in this situation,
you may enclose words in `'' (single quote marks) in GDB commands.

   The most likely situation where you might need this is in typing the
name of a C++ function.  This is because C++ allows function
overloading (multiple definitions of the same function, distinguished
by argument type).  For example, when you want to set a breakpoint you
may need to distinguish whether you mean the version of `name' that
takes an `int' parameter, `name(int)', or the version that takes a
`float' parameter, `name(float)'.  To use the word-completion
facilities in this situation, type a single quote `'' at the beginning
of the function name.  This alerts GDB that it may need to consider
more information than usual when you press <TAB> or `M-?' to request
word completion:

     (gdb) b 'bubble( M-?
     bubble(double,double)    bubble(int,int)
     (gdb) b 'bubble(

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

     (gdb) b bub <TAB>
GDB alters your input line to the following, and rings a bell:
     (gdb) b 'bubble(

In general, GDB can tell that a quote is needed (and inserts it) if you
have not yet started typing the argument list when you ask for
completion on an overloaded symbol.

   For more information about overloaded functions, see *note C++
Expressions: C Plus Plus Expressions.  You can use the command `set
overload-resolution off' to disable overload resolution; see *note GDB
Features for C++: Debugging C Plus Plus.

   When completing in an expression which looks up a field in a
structure, GDB also tries(1) to limit completions to the field names
available in the type of the left-hand-side:

     (gdb) p gdb_stdout.M-?
     magic                to_fputs             to_rewind
     to_data              to_isatty            to_write
     to_delete            to_put               to_write_async_safe
     to_flush             to_read

This is because the `gdb_stdout' is a variable of the type `struct
ui_file' that is defined in GDB sources as follows:

     struct ui_file
     {
        int *magic;
        ui_file_flush_ftype *to_flush;
        ui_file_write_ftype *to_write;
        ui_file_write_async_safe_ftype *to_write_async_safe;
        ui_file_fputs_ftype *to_fputs;
        ui_file_read_ftype *to_read;
        ui_file_delete_ftype *to_delete;
        ui_file_isatty_ftype *to_isatty;
        ui_file_rewind_ftype *to_rewind;
        ui_file_put_ftype *to_put;
        void *to_data;
     }

   ---------- Footnotes ----------

   (1) The completer can be confused by certain kinds of invalid
expressions.  Also, it only examines the static type of the expression,
not the dynamic type.


File: gdb.info,  Node: Help,  Prev: Completion,  Up: Commands

3.3 Getting Help
================

You can always ask GDB itself for information on its commands, using
the command `help'.

`help'
`h'
     You can use `help' (abbreviated `h') with no arguments to display
     a short list of named classes of commands:

          (gdb) help
          List of classes of commands:

          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.
          (gdb)

`help CLASS'
     Using one of the general help classes as an argument, you can get a
     list of the individual commands in that class.  For example, here
     is the help display for the class `status':

          (gdb) help status
          Status inquiries.

          List of commands:

          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.
          (gdb)

`help COMMAND'
     With a command name as `help' argument, GDB displays a short
     paragraph on how to use that command.

`apropos ARGS'
     The `apropos' command searches through all of the GDB commands,
     and their documentation, for the regular expression specified in
     ARGS.  It prints out all matches found.  For example:

          apropos reload

     results in:

          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

`complete ARGS'
     The `complete ARGS' command lists all the possible completions for
     the beginning of a command.  Use ARGS to specify the beginning of
     the command you want completed.  For example:

          complete i

     results in:

          if
          ignore
          info
          inspect

     This is intended for use by GNU Emacs.

   In addition to `help', you can use the GDB commands `info' and
`show' to inquire about the state of your program, or the state of GDB
itself.  Each command supports many topics of inquiry; this manual
introduces each of them in the appropriate context.  The listings under
`info' and under `show' in the Command, Variable, and Function Index
point to all the sub-commands.  *Note Command and Variable Index::.

`info'
     This command (abbreviated `i') is for describing the state of your
     program.  For example, you can show the arguments passed to a
     function with `info args', list the registers currently in use
     with `info registers', or list the breakpoints you have set with
     `info breakpoints'.  You can get a complete list of the `info'
     sub-commands with `help info'.

`set'
     You can assign the result of an expression to an environment
     variable with `set'.  For example, you can set the GDB prompt to a
     $-sign with `set prompt $'.

`show'
     In contrast to `info', `show' is for describing the state of GDB
     itself.  You can change most of the things you can `show', by
     using the related command `set'; for example, you can control what
     number system is used for displays with `set radix', or simply
     inquire which is currently in use with `show radix'.

     To display all the settable parameters and their current values,
     you can use `show' with no arguments; you may also use `info set'.
     Both commands produce the same display.

   Here are three miscellaneous `show' subcommands, all of which are
exceptional in lacking corresponding `set' commands:

`show version'
     Show what version of GDB is running.  You should include this
     information in GDB bug-reports.  If multiple versions of GDB are
     in use at your site, you may need to determine which version of
     GDB you are running; as GDB evolves, new commands are introduced,
     and old ones may wither away.  Also, many system vendors ship
     variant versions of GDB, and there are variant versions of GDB in
     GNU/Linux distributions as well.  The version number is the same
     as the one announced when you start GDB.

`show copying'
`info copying'
     Display information about permission for copying GDB.

`show warranty'
`info warranty'
     Display the GNU "NO WARRANTY" statement, or a warranty, if your
     version of GDB comes with one.



File: gdb.info,  Node: Running,  Next: Stopping,  Prev: Commands,  Up: Top

4 Running Programs Under GDB
****************************

When you run a program under GDB, you must first generate debugging
information when you compile it.

   You may start GDB with its arguments, if any, in an environment of
your choice.  If you are doing native debugging, you may redirect your
program's input and output, debug an already running process, or kill a
child process.

* Menu:

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

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

* Inferiors and Programs::      Debugging multiple inferiors and programs
* Threads::                     Debugging programs with multiple threads
* Forks::                       Debugging forks
* Checkpoint/Restart::          Setting a _bookmark_ to return to later


File: gdb.info,  Node: Compilation,  Next: Starting,  Up: Running

4.1 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 `-g' option when you
run the compiler.

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

   GCC, the GNU C/C++ compiler, supports `-g' with or without `-O',
making it possible to debug optimized code.  We recommend that you
_always_ use `-g' whenever you compile a program.  You may think your
program is correct, but there is no sense in pushing your luck.  For
more information, see *note Optimized Code::.

   Older versions of the GNU C compiler permitted a variant option
`-gg' for debugging information.  GDB no longer supports this format;
if your GNU C compiler has this option, do not use it.

   GDB knows about preprocessor macros and can show you their expansion
(*note Macros::).  Most compilers do not include information about
preprocessor macros in the debugging information if you specify the
`-g' flag alone.  Version 3.1 and later of GCC, the GNU C compiler,
provides macro information if you are using the DWARF debugging format,
and specify the option `-g3'.

   *Note Options for Debugging Your Program or GCC: (gcc.info)Debugging
Options, for more information on GCC options affecting debug
information.

   You will have the best debugging experience if you use the latest
version of the DWARF debugging format that your compiler supports.
DWARF is currently the most expressive and best supported debugging
format in GDB.


File: gdb.info,  Node: Starting,  Next: Arguments,  Prev: Compilation,  Up: Running

4.2 Starting your Program
=========================

`run'
`r'
     Use the `run' command to start your program under GDB.  You must
     first specify the program name (except on VxWorks) with an
     argument to GDB (*note Getting In and Out of GDB: Invocation.), or
     by using the `file' or `exec-file' command (*note Commands to
     Specify Files: Files.).


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

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

then use `continue' to run your program.  You may need `load' first
(*note load::).

   The execution of a program is affected by certain information it
receives from its superior.  GDB provides ways to specify this
information, which you must do _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:

The _arguments._
     Specify the arguments to give your program as the arguments of the
     `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 `SHELL' environment variable.  *Note
     Your Program's Arguments: Arguments.

The _environment._
     Your program normally inherits its environment from GDB, but you
     can use the GDB commands `set environment' and `unset environment'
     to change parts of the environment that affect your program.
     *Note Your Program's Environment: Environment.

The _working directory._
     Your program inherits its working directory from GDB.  You can set
     the GDB working directory with the `cd' command in GDB.  *Note
     Your Program's Working Directory: Working Directory.

The _standard input and output._
     Your program normally uses the same device for standard input and
     standard output as GDB is using.  You can redirect input and output
     in the `run' command line, or you can use the `tty' command to set
     a different device for your program.  *Note Your Program's Input
     and Output: Input/Output.

     _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, GDB is likely to wind up
     debugging the wrong program.

   When you issue the `run' command, your program begins to execute
immediately.  *Note Stopping and Continuing: Stopping, for discussion
of how to arrange for your program to stop.  Once your program has
stopped, you may call functions in your program, using the `print' or
`call' commands.  *Note Examining Data: Data.

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

`start'
     The name of the main procedure can vary from language to language.
     With C or C++, the main procedure name is always `main', but other
     languages such as Ada do not require a specific name for their
     main procedure.  The debugger provides a convenient way to start
     the execution of the program and to stop at the beginning of the
     main procedure, depending on the language used.

     The `start' command does the equivalent of setting a temporary
     breakpoint at the beginning of the main procedure and then invoking
     the `run' command.

     Some programs contain an "elaboration" phase where some startup
     code is executed before the main procedure is called.  This
     depends on the languages used to write your program.  In C++, for
     instance, constructors for static and global objects are executed
     before `main' is called.  It is therefore possible that the
     debugger stops before reaching the main procedure.  However, the
     temporary breakpoint will remain to halt execution.

     Specify the arguments to give to your program as arguments to the
     `start' command.  These arguments will be given verbatim to the
     underlying `run' command.  Note that the same arguments will be
     reused if no argument is provided during subsequent calls to
     `start' or `run'.

     It is sometimes necessary to debug the program during elaboration.
     In these cases, using the `start' command would stop the execution
     of your program too late, as the program would have already
     completed the elaboration phase.  Under these circumstances,
     insert breakpoints in your elaboration code before running your
     program.

`set exec-wrapper WRAPPER'
`show exec-wrapper'
`unset exec-wrapper'
     When `exec-wrapper' is set, the specified wrapper is used to
     launch programs for debugging.  GDB starts your program with a
     shell command of the form `exec WRAPPER PROGRAM'.  Quoting is
     added to PROGRAM and its arguments, but not to WRAPPER, so you
     should add quotes if appropriate for your shell.  The wrapper runs
     until it executes your program, and then GDB takes control.

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

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

          (gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so'
          (gdb) run

     This command is available when debugging locally on most targets,
     excluding DJGPP, Cygwin, MS Windows, and QNX Neutrino.

`set disable-randomization'
`set disable-randomization on'
     This option (enabled by default in GDB) will turn off the native
     randomization of the virtual address space of the started program.
     This option is useful for multiple debugging sessions to make the
     execution better reproducible and memory addresses reusable across
     debugging sessions.

     This feature is implemented only on certain targets, including
     GNU/Linux.  On GNU/Linux you can get the same behavior using

          (gdb) set exec-wrapper setarch `uname -m` -R

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

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

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

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

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

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



File: gdb.info,  Node: Arguments,  Next: Environment,  Prev: Starting,  Up: Running

4.3 Your Program's Arguments
============================

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

   On non-Unix systems, the program is usually invoked directly by GDB,
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.

   `run' with no arguments uses the same arguments used by the previous
`run', or those set by the `set args' command.

`set args'
     Specify the arguments to be used the next time your program is
     run.  If `set args' has no arguments, `run' executes your program
     with no arguments.  Once you have run your program with arguments,
     using `set args' before the next `run' is the only way to run it
     again without arguments.

`show args'
     Show the arguments to give your program when it is started.


File: gdb.info,  Node: Environment,  Next: Working Directory,  Prev: Arguments,  Up: Running

4.4 Your Program's Environment
==============================

The "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 GDB over again.

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

     You can use the string `$cwd' to refer to whatever is the current
     working directory at the time GDB searches the path.  If you use
     `.' instead, it refers to the directory where you executed the
     `path' command.  GDB replaces `.' in the DIRECTORY argument (with
     the current path) before adding DIRECTORY to the search path.

`show paths'
     Display the list of search paths for executables (the `PATH'
     environment variable).

`show environment [VARNAME]'
     Print the value of environment variable VARNAME to be given to
     your program when it starts.  If you do not supply VARNAME, print
     the names and values of all environment variables to be given to
     your program.  You can abbreviate `environment' as `env'.

`set environment VARNAME [=VALUE]'
     Set environment variable VARNAME to VALUE.  The value changes for
     your program only, not for GDB itself.  VALUE may be any string;
     the values of environment variables are just strings, and any
     interpretation is supplied by your program itself.  The VALUE
     parameter is optional; if it is eliminated, the variable is set to
     a null value.

     For example, this command:

          set env USER = foo

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

`unset environment VARNAME'
     Remove variable VARNAME from the environment to be passed to your
     program.  This is different from `set env VARNAME ='; `unset
     environment' removes the variable from the environment, rather
     than assigning it an empty value.

   _Warning:_ On Unix systems, GDB runs your program using the shell
indicated by your `SHELL' environment variable if it exists (or
`/bin/sh' if not).  If your `SHELL' variable names a shell that runs an
initialization file--such as `.cshrc' for C-shell, or `.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 `.login' or `.profile'.


File: gdb.info,  Node: Working Directory,  Next: Input/Output,  Prev: Environment,  Up: Running

4.5 Your Program's Working Directory
====================================

Each time you start your program with `run', it inherits its working
directory from the current working directory of GDB.  The GDB working
directory is initially whatever it inherited from its parent process
(typically the shell), but you can specify a new working directory in
GDB with the `cd' command.

   The GDB working directory also serves as a default for the commands
that specify files for GDB to operate on.  *Note Commands to Specify
Files: Files.

`cd DIRECTORY'
     Set the GDB working directory to DIRECTORY.

`pwd'
     Print the GDB working directory.

   It is generally impossible to find the current working directory of
the process being debugged (since a program can change its directory
during its run).  If you work on a system where GDB is configured with
the `/proc' support, you can use the `info proc' command (*note SVR4
Process Information::) to find out the current working directory of the
debuggee.


File: gdb.info,  Node: Input/Output,  Next: Attach,  Prev: Working Directory,  Up: Running

4.6 Your Program's Input and Output
===================================

By default, the program you run under GDB does input and output to the
same terminal that GDB uses.  GDB 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.

`info terminal'
     Displays information recorded by GDB about the terminal modes your
     program is using.

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

     run > outfile

starts your program, diverting its output to the file `outfile'.

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

     tty /dev/ttyb

directs that processes started with subsequent `run' commands default
to do input and output on the terminal `/dev/ttyb' and have that as
their controlling terminal.

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

   When you use the `tty' command or redirect input in the `run'
command, only the input _for your program_ is affected.  The input for
GDB still comes from your terminal.  `tty' is an alias for `set
inferior-tty'.

   You can use the `show inferior-tty' command to tell GDB to display
the name of the terminal that will be used for future runs of your
program.

`set inferior-tty /dev/ttyb'
     Set the tty for the program being debugged to /dev/ttyb.

`show inferior-tty'
     Show the current tty for the program being debugged.


File: gdb.info,  Node: Attach,  Next: Kill Process,  Prev: Input/Output,  Up: Running

4.7 Debugging an Already-running Process
========================================

`attach PROCESS-ID'
     This command attaches to a running process--one that was started
     outside GDB.  (`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 `ps' utility, or with
     the `jobs -l' shell command.

     `attach' does not repeat if you press <RET> a second time after
     executing the command.

   To use `attach', your program must be running in an environment
which supports processes; for example, `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 `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 (*note
Specifying Source Directories: Source Path.).  You can also use the
`file' command to load the program.  *Note Commands to Specify Files:
Files.

   The first thing GDB does after arranging to debug the specified
process is to stop it.  You can examine and modify an attached process
with all the GDB commands that are ordinarily available when you start
processes with `run'.  You can insert breakpoints; you can step and
continue; you can modify storage.  If you would rather the process
continue running, you may use the `continue' command after attaching
GDB to the process.

`detach'
     When you have finished debugging the attached process, you can use
     the `detach' command to release it from GDB control.  Detaching
     the process continues its execution.  After the `detach' command,
     that process and GDB become completely independent once more, and
     you are ready to `attach' another process or start one with `run'.
     `detach' does not repeat if you press <RET> again after executing
     the command.

   If you exit GDB while you have an attached process, you detach that
process.  If you use the `run' command, you kill that process.  By
default, GDB asks for confirmation if you try to do either of these
things; you can control whether or not you need to confirm by using the
`set confirm' command (*note Optional Warnings and Messages:
Messages/Warnings.).


File: gdb.info,  Node: Kill Process,  Next: Inferiors and Programs,  Prev: Attach,  Up: Running

4.8 Killing the Child Process
=============================

`kill'
     Kill the child process in which your program is running under GDB.

   This command is useful if you wish to debug a core dump instead of a
running process.  GDB ignores any core dump file while your program is
running.

   On some operating systems, a program cannot be executed outside GDB
while you have breakpoints set on it inside GDB.  You can use the
`kill' command in this situation to permit running your program outside
the debugger.

   The `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 `run', GDB notices that the file has changed, and reads
the symbol table again (while trying to preserve your current
breakpoint settings).


File: gdb.info,  Node: Inferiors and Programs,  Next: Threads,  Prev: Kill Process,  Up: Running

4.9 Debugging Multiple Inferiors and Programs
=============================================

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

   GDB represents the state of each program execution with an object
called an "inferior".  An inferior typically corresponds to a process,
but is more general and applies also to targets that do not have
processes.  Inferiors may be created before a process runs, and may be
retained after a process exits.  Inferiors have unique identifiers that
are different from process ids.  Usually each inferior will also have
its own distinct address space, although some embedded targets may have
several inferiors running in different parts of a single address space.
Each inferior may in turn have multiple threads running in it.

   To find out what inferiors exist at any moment, use `info inferiors':

`info inferiors'
     Print a list of all inferiors currently being managed by GDB.

     GDB displays for each inferior (in this order):

       1. the inferior number assigned by GDB

       2. the target system's inferior identifier

       3. the name of the executable the inferior is running.


     An asterisk `*' preceding the GDB inferior number indicates the
     current inferior.

     For example,

     (gdb) info inferiors
       Num  Description       Executable
       2    process 2307      hello
     * 1    process 3401      goodbye

   To switch focus between inferiors, use the `inferior' command:

`inferior INFNO'
     Make inferior number INFNO the current inferior.  The argument
     INFNO is the inferior number assigned by GDB, as shown in the
     first field of the `info inferiors' display.

   You can get multiple executables into a debugging session via the
`add-inferior' and `clone-inferior' commands.  On some systems GDB can
add inferiors to the debug session automatically by following calls to
`fork' and `exec'.  To remove inferiors from the debugging session use
the `remove-inferiors' command.

`add-inferior [ -copies N ] [ -exec EXECUTABLE ]'
     Adds N inferiors to be run using EXECUTABLE as the executable.  N
     defaults to 1.  If no executable is specified, the inferiors
     begins empty, with no program.  You can still assign or change the
     program assigned to the inferior at any time by using the `file'
     command with the executable name as its argument.

`clone-inferior [ -copies N ] [ INFNO ]'
     Adds N inferiors ready to execute the same program as inferior
     INFNO.  N defaults to 1.  INFNO defaults to the number of the
     current inferior.  This is a convenient command when you want to
     run another instance of the inferior you are debugging.

          (gdb) info inferiors
            Num  Description       Executable
          * 1    process 29964     helloworld
          (gdb) clone-inferior
          Added inferior 2.
          1 inferiors added.
          (gdb) info inferiors
            Num  Description       Executable
            2    <null>            helloworld
          * 1    process 29964     helloworld

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

`remove-inferiors INFNO...'
     Removes the inferior or inferiors INFNO....  It is not possible to
     remove an inferior that is running with this command.  For those,
     use the `kill' or `detach' command first.


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

`detach inferior INFNO...'
     Detach from the inferior or inferiors identified by GDB inferior
     number(s) INFNO....  Note that the inferior's entry still stays on
     the list of inferiors shown by `info inferiors', but its
     Description will show `<null>'.

`kill inferiors INFNO...'
     Kill the inferior or inferiors identified by GDB inferior
     number(s) INFNO....  Note that the inferior's entry still stays on
     the list of inferiors shown by `info inferiors', but its
     Description will show `<null>'.

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

   To be notified when inferiors are started or exit under GDB's
control use `set print inferior-events':

`set print inferior-events'
`set print inferior-events on'
`set print inferior-events off'
     The `set print inferior-events' command allows you to enable or
     disable printing of messages when GDB notices that new inferiors
     have started or that inferiors have exited or have been detached.
     By default, these messages will not be printed.

`show print inferior-events'
     Show whether messages will be printed when GDB detects that
     inferiors have started, exited or have been detached.

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

   Occasionaly, when debugging GDB itself, it may be useful to get more
info about the relationship of inferiors, programs, address spaces in a
debug session.  You can do that with the `maint info program-spaces'
command.

`maint info program-spaces'
     Print a list of all program spaces currently being managed by GDB.

     GDB displays for each program space (in this order):

       1. the program space number assigned by GDB

       2. the name of the executable loaded into the program space,
          with e.g., the `file' command.


     An asterisk `*' preceding the GDB program space number indicates
     the current program space.

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

          (gdb) maint info program-spaces
            Id   Executable
            2    goodbye
                  Bound inferiors: ID 1 (process 21561)
          * 1    hello

     Here we can see that no inferior is running the program `hello',
     while `process 21561' is running the program `goodbye'.  On some
     targets, it is possible that multiple inferiors are bound to the
     same program space.  The most common example is that of debugging
     both the parent and child processes of a `vfork' call.  For
     example,

          (gdb) maint info program-spaces
            Id   Executable
          * 1    vfork-test
                  Bound inferiors: ID 2 (process 18050), ID 1 (process 18045)

     Here, both inferior 2 and inferior 1 are running in the same
     program space as a result of inferior 1 having executed a `vfork'
     call.


File: gdb.info,  Node: Threads,  Next: Forks,  Prev: Inferiors and Programs,  Up: Running

4.10 Debugging Programs with Multiple Threads
=============================================

In some operating systems, such as HP-UX and Solaris, a single program
may have more than one "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.

   GDB provides these facilities for debugging multi-thread programs:

   * automatic notification of new threads

   * `thread THREADNO', a command to switch among threads

   * `info threads', a command to inquire about existing threads

   * `thread apply [THREADNO] [ALL] ARGS', a command to apply a command
     to a list of threads

   * thread-specific breakpoints

   * `set print thread-events', which controls printing of messages on
     thread start and exit.

   * `set libthread-db-search-path PATH', which lets the user specify
     which `libthread_db' to use if the default choice isn't compatible
     with the program.

     _Warning:_ These facilities are not yet available on every GDB
     configuration where the operating system supports threads.  If
     your GDB does not support threads, these commands have no effect.
     For example, a system without thread support shows no output from
     `info threads', and always rejects the `thread' command, like this:

          (gdb) info threads
          (gdb) thread 1
          Thread ID 1 not known.  Use the "info threads" command to
          see the IDs of currently known threads.

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

   Whenever GDB detects a new thread in your program, it displays the
target system's identification for the thread with a message in the
form `[New SYSTAG]'.  SYSTAG is a thread identifier whose form varies
depending on the particular system.  For example, on GNU/Linux, you
might see

     [New Thread 0x41e02940 (LWP 25582)]

when GDB notices a new thread.  In contrast, on an SGI system, the
SYSTAG is simply something like `process 368', with no further
qualifier.

   For debugging purposes, GDB associates its own thread number--always
a single integer--with each thread in your program.

`info threads [ID...]'
     Display a summary of all threads currently in your program.
     Optional argument ID... is one or more thread ids separated by
     spaces, and means to print information only about the specified
     thread or threads.  GDB displays for each thread (in this order):

       1. the thread number assigned by GDB

       2. the target system's thread identifier (SYSTAG)

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

       4. the current stack frame summary for that thread

     An asterisk `*' to the left of the GDB thread number indicates the
     current thread.

     For example,

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

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

`maint info sol-threads'
     Display info on Solaris user threads.

`thread THREADNO'
     Make thread number THREADNO the current thread.  The command
     argument THREADNO is the internal GDB thread number, as shown in
     the first field of the `info threads' display.  GDB responds by
     displaying the system identifier of the thread you selected, and
     its current stack frame summary:

          (gdb) thread 2
          [Switching to thread 2 (Thread 0xb7fdab70 (LWP 12747))]
          #0  some_function (ignore=0x0) at example.c:8
          8	    printf ("hello\n");

     As with the `[New ...]' message, the form of the text after
     `Switching to' depends on your system's conventions for identifying
     threads.

     The debugger convenience variable `$_thread' contains the number
     of the current thread.  You may find this useful in writing
     breakpoint conditional expressions, command scripts, and so forth.
     See *Note Convenience Variables: Convenience Vars, for general
     information on convenience variables.

`thread apply [THREADNO | all] COMMAND'
     The `thread apply' command allows you to apply the named COMMAND
     to one or more threads.  Specify the numbers of the threads that
     you want affected with the command argument THREADNO.  It can be a
     single thread number, one of the numbers shown in the first field
     of the `info threads' display; or it could be a range of thread
     numbers, as in `2-4'.  To apply a command to all threads, type
     `thread apply all COMMAND'.

`thread name [NAME]'
     This command assigns a name to the current thread.  If no argument
     is given, any existing user-specified name is removed.  The thread
     name appears in the `info threads' display.

     On some systems, such as GNU/Linux, GDB is able to determine the
     name of the thread as given by the OS.  On these systems, a name
     specified with `thread name' will override the system-give name,
     and removing the user-specified name will cause GDB to once again
     display the system-specified name.

`thread find [REGEXP]'
     Search for and display thread ids whose name or SYSTAG matches the
     supplied regular expression.

     As well as being the complement to the `thread name' command, this
     command also allows you to identify a thread by its target SYSTAG.
     For instance, on GNU/Linux, the target SYSTAG is the LWP id.

          (GDB) thread find 26688
          Thread 4 has target id 'Thread 0x41e02940 (LWP 26688)'
          (GDB) info thread 4
            Id   Target Id         Frame
            4    Thread 0x41e02940 (LWP 26688) 0x00000031ca6cd372 in select ()

`set print thread-events'
`set print thread-events on'
`set print thread-events off'
     The `set print thread-events' command allows you to enable or
     disable printing of messages when GDB notices that new threads have
     started or that threads have exited.  By default, these messages
     will be printed if detection of these events is supported by the
     target.  Note that these messages cannot be disabled on all
     targets.

`show print thread-events'
     Show whether messages will be printed when GDB detects that threads
     have started and exited.

   *Note Stopping and Starting Multi-thread Programs: Thread Stops, for
more information about how GDB behaves when you stop and start programs
with multiple threads.

   *Note Setting Watchpoints: Set Watchpoints, for information about
watchpoints in programs with multiple threads.

`set libthread-db-search-path [PATH]'
     If this variable is set, PATH is a colon-separated list of
     directories GDB will use to search for `libthread_db'.  If you
     omit PATH, `libthread-db-search-path' will be reset to its default
     value (`$sdir:$pdir' on GNU/Linux and Solaris systems).
     Internally, the default value comes from the
     `LIBTHREAD_DB_SEARCH_PATH' macro.

     On GNU/Linux and Solaris systems, GDB uses a "helper"
     `libthread_db' library to obtain information about threads in the
     inferior process.  GDB will use `libthread-db-search-path' to find
     `libthread_db'.

     A special entry `$sdir' for `libthread-db-search-path' refers to
     the default system directories that are normally searched for
     loading shared libraries.

     A special entry `$pdir' for `libthread-db-search-path' refers to
     the directory from which `libpthread' was loaded in the inferior
     process.

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

     Setting `libthread-db-search-path' is currently implemented only
     on some platforms.

`show libthread-db-search-path'
     Display current libthread_db search path.

`set debug libthread-db'
`show debug libthread-db'
     Turns on or off display of `libthread_db'-related events.  Use `1'
     to enable, `0' to disable.


File: gdb.info,  Node: Forks,  Next: Checkpoint/Restart,  Prev: Threads,  Up: Running

4.11 Debugging Forks
====================

On most systems, GDB has no special support for debugging programs
which create additional processes using the `fork' function.  When a
program forks, GDB 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 `SIGTRAP'
signal which (unless it catches the signal) will cause it to terminate.

   However, if you want to debug the child process there is a workaround
which isn't too painful.  Put a call to `sleep' in the code which the
child process executes after the fork.  It may be useful to sleep only
if a certain environment variable is set, or a certain file exists, so
that the delay need not occur when you don't want to run GDB on the
child.  While the child is sleeping, use the `ps' program to get its
process ID.  Then tell GDB (a new invocation of GDB if you are also
debugging the parent process) to attach to the child process (*note
Attach::).  From that point on you can debug the child process just
like any other process which you attached to.

   On some systems, GDB provides support for debugging programs that
create additional processes using the `fork' or `vfork' functions.
Currently, the only platforms with this feature are HP-UX (11.x and
later only?) and GNU/Linux (kernel version 2.5.60 and later).

   By default, when a program forks, GDB will continue to debug the
parent process and the child process will run unimpeded.

   If you want to follow the child process instead of the parent
process, use the command `set follow-fork-mode'.

`set follow-fork-mode MODE'
     Set the debugger response to a program call of `fork' or `vfork'.
     A call to `fork' or `vfork' creates a new process.  The MODE
     argument can be:

    `parent'
          The original process is debugged after a fork.  The child
          process runs unimpeded.  This is the default.

    `child'
          The new process is debugged after a fork.  The parent process
          runs unimpeded.


`show follow-fork-mode'
     Display the current debugger response to a `fork' or `vfork' call.

   On Linux, if you want to debug both the parent and child processes,
use the command `set detach-on-fork'.

`set detach-on-fork MODE'
     Tells gdb whether to detach one of the processes after a fork, or
     retain debugger control over them both.

    `on'
          The child process (or parent process, depending on the value
          of `follow-fork-mode') will be detached and allowed to run
          independently.  This is the default.

    `off'
          Both processes will be held under the control of GDB.  One
          process (child or parent, depending on the value of
          `follow-fork-mode') is debugged as usual, while the other is
          held suspended.


`show detach-on-fork'
     Show whether detach-on-fork mode is on/off.

   If you choose to set `detach-on-fork' mode off, then GDB will retain
control of all forked processes (including nested forks).  You can list
the forked processes under the control of GDB by using the
`info inferiors' command, and switch from one fork to another by using
the `inferior' command (*note Debugging Multiple Inferiors and
Programs: Inferiors and Programs.).

   To quit debugging one of the forked processes, you can either detach
from it by using the `detach inferiors' command (allowing it to run
independently), or kill it using the `kill inferiors' command.  *Note
Debugging Multiple Inferiors and Programs: Inferiors and Programs.

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

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

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

`set follow-exec-mode MODE'
     Set debugger response to a program call of `exec'.  An `exec' call
     replaces the program image of a process.

     `follow-exec-mode' can be:

    `new'
          GDB creates a new inferior and rebinds the process to this
          new inferior.  The program the process was running before the
          `exec' call can be restarted afterwards by restarting the
          original inferior.

          For example:

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

    `same'
          GDB keeps the process bound to the same inferior.  The new
          executable image replaces the previous executable loaded in
          the inferior.  Restarting the inferior after the `exec' call,
          with e.g., the `run' command, restarts the executable the
          process was running after the `exec' call.  This is the
          default mode.

          For example:

               (gdb) info inferiors
                 Id   Description   Executable
               * 1    <null>        prog1
               (gdb) run
               process 12020 is executing new program: prog2
               Program exited normally.
               (gdb) info inferiors
                 Id   Description   Executable
               * 1    <null>        prog2


   You can use the `catch' command to make GDB stop whenever a `fork',
`vfork', or `exec' call is made.  *Note Setting Catchpoints: Set
Catchpoints.


File: gdb.info,  Node: Checkpoint/Restart,  Prev: Forks,  Up: Running

4.12 Setting a _Bookmark_ to Return to Later
============================================

On certain operating systems(1), GDB is able to save a "snapshot" of a
program's state, called a "checkpoint", and come back to it later.

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

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

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

   To use the `checkpoint'/`restart' method of debugging:

`checkpoint'
     Save a snapshot of the debugged program's current execution state.
     The `checkpoint' command takes no arguments, but each checkpoint
     is assigned a small integer id, similar to a breakpoint id.

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

    `Checkpoint ID'

    `Process ID'

    `Code Address'

    `Source line, or label'

`restart CHECKPOINT-ID'
     Restore the program state that was saved as checkpoint number
     CHECKPOINT-ID.  All program variables, registers, stack frames
     etc.  will be returned to the values that they had when the
     checkpoint was saved.  In essence, gdb will "wind back the clock"
     to the point in time when the checkpoint was saved.

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

`delete checkpoint CHECKPOINT-ID'
     Delete the previously-saved checkpoint identified by CHECKPOINT-ID.


   Returning to a previously saved checkpoint will restore the user
state of the program being debugged, plus a significant subset of the
system (OS) state, including file pointers.  It won't "un-write" data
from a file, but it will rewind the file pointer to the previous
location, so that the previously written data can be overwritten.  For
files opened in read mode, the pointer will also be restored so that the
previously read data can be read again.

   Of course, characters that have been sent to a printer (or other
external device) cannot be "snatched back", and characters received
from eg. a serial device can be removed from internal program buffers,
but they cannot be "pushed back" into the serial pipeline, ready to be
received again.  Similarly, the actual contents of files that have been
changed cannot be restored (at this time).

   However, within those constraints, you actually can "rewind" your
program to a previously saved point in time, and begin debugging it
again -- and you can change the course of events so as to debug a
different execution path this time.

   Finally, there is one bit of internal program state that will be
different when you return to a checkpoint -- the program's process id.
Each checkpoint will have a unique process id (or PID), and each will
be different from the program's original PID.  If your program has
saved a local copy of its process id, this could potentially pose a
problem.

4.12.1 A Non-obvious Benefit of Using Checkpoints
-------------------------------------------------

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

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

   ---------- Footnotes ----------

   (1) Currently, only GNU/Linux.


File: gdb.info,  Node: Stopping,  Next: Reverse Execution,  Prev: Running,  Up: Top

5 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 GDB, your program may stop for any of several reasons, such
as a signal, a breakpoint, or reaching a new line after a GDB command
such as `step'.  You may then examine and change variables, set new
breakpoints or remove old ones, and then continue execution.  Usually,
the messages shown by GDB provide ample explanation of the status of
your program--but you can also explicitly request this information at
any time.

`info program'
     Display information about the status of your program: whether it is
     running or not, what process it is, and why it stopped.

* Menu:

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


File: gdb.info,  Node: Breakpoints,  Next: Continuing and Stepping,  Up: Stopping

5.1 Breakpoints, Watchpoints, and Catchpoints
=============================================

A "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 `break' command and its variants (*note Setting
Breakpoints: Set Breaks.), to specify the place where your program
should stop by line number, function name or exact address in the
program.

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

   A "watchpoint" is a special breakpoint that stops your program when
the value of an expression changes.  The expression may be a value of a
variable, or it could involve values of one or more variables combined
by operators, such as `a + b'.  This is sometimes called "data
breakpoints".  You must use a different command to set watchpoints
(*note Setting Watchpoints: Set 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 GDB stops at a breakpoint.  *Note Automatic
Display: Auto Display.

   A "catchpoint" is another special breakpoint that stops your program
when a certain kind of event occurs, such as the throwing of a C++
exception or the loading of a library.  As with watchpoints, you use a
different command to set a catchpoint (*note Setting Catchpoints: Set
Catchpoints.), but aside from that, you can manage a catchpoint like any
other breakpoint.  (To stop when your program receives a signal, use the
`handle' command; see *note Signals: Signals.)

   GDB 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 "enabled" or "disabled"; if
disabled, it has no effect on your program until you enable it again.

   Some GDB commands accept a range of breakpoints on which to operate.
A breakpoint range is either a single breakpoint number, like `5', or
two such numbers, in increasing order, separated by a hyphen, like
`5-7'.  When a breakpoint range is given to a command, all breakpoints
in that range are operated on.

* Menu:

* Set Breaks::                  Setting breakpoints
* Set Watchpoints::             Setting watchpoints
* Set Catchpoints::             Setting catchpoints
* Delete Breaks::               Deleting breakpoints
* Disabling::                   Disabling breakpoints
* Conditions::                  Break conditions
* Break Commands::              Breakpoint command lists
* Save Breakpoints::            How to save breakpoints in a file
* Error in Breakpoints::        ``Cannot insert breakpoints''
* Breakpoint-related Warnings:: ``Breakpoint address adjusted...''


File: gdb.info,  Node: Set Breaks,  Next: Set Watchpoints,  Up: Breakpoints

5.1.1 Setting Breakpoints
-------------------------

Breakpoints are set with the `break' command (abbreviated `b').  The
debugger convenience variable `$bpnum' records the number of the
breakpoint you've set most recently; see *note Convenience Variables:
Convenience Vars, for a discussion of what you can do with convenience
variables.

`break LOCATION'
     Set a breakpoint at the given LOCATION, which can specify a
     function name, a line number, or an address of an instruction.
     (*Note Specify Location::, for a list of all the possible ways to
     specify a LOCATION.)  The breakpoint will stop your program just
     before it executes any of the code in the specified LOCATION.

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

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

`break'
     When called without any arguments, `break' sets a breakpoint at
     the next instruction to be executed in the selected stack frame
     (*note Examining the Stack: 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 `finish'
     command in the frame inside the selected frame--except that
     `finish' does not leave an active breakpoint.  If you use `break'
     without an argument in the innermost frame, GDB stops the next
     time it reaches the current location; this may be useful inside
     loops.

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

`break ... if COND'
     Set a breakpoint with condition COND; evaluate the expression COND
     each time the breakpoint is reached, and stop only if the value is
     nonzero--that is, if COND evaluates as true.  `...' stands for one
     of the possible arguments described above (or no argument)
     specifying where to break.  *Note Break Conditions: Conditions,
     for more information on breakpoint conditions.

`tbreak ARGS'
     Set a breakpoint enabled only for one stop.  ARGS are the same as
     for the `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.  *Note Disabling Breakpoints:
     Disabling.

`hbreak ARGS'
     Set a hardware-assisted breakpoint.  ARGS are the same as for the
     `break' command and the breakpoint is set in the same way, but the
     breakpoint requires hardware support and some target hardware may
     not have this support.  The main purpose of this is EPROM/ROM code
     debugging, so you can set a breakpoint at an instruction without
     changing the instruction.  This can be used with the new
     trap-generation provided by SPARClite DSU and most x86-based
     targets.  These targets will generate traps when a program
     accesses some data or instruction address that is assigned to the
     debug registers.  However the hardware breakpoint registers can
     take a limited number of breakpoints.  For example, on the DSU,
     only two data breakpoints can be set at a time, and GDB will
     reject this command if more than two are used.  Delete or disable
     unused hardware breakpoints before setting new ones (*note
     Disabling Breakpoints: Disabling.).  *Note Break Conditions:
     Conditions.  For remote targets, you can restrict the number of
     hardware breakpoints GDB will use, see *note set remote
     hardware-breakpoint-limit::.

`thbreak ARGS'
     Set a hardware-assisted breakpoint enabled only for one stop.  ARGS
     are the same as for the `hbreak' command and the breakpoint is set
     in the same way.  However, like the `tbreak' command, the
     breakpoint is automatically deleted after the first time your
     program stops there.  Also, like the `hbreak' command, the
     breakpoint requires hardware support and some target hardware may
     not have this support.  *Note Disabling Breakpoints: Disabling.
     See also *note Break Conditions: Conditions.

`rbreak REGEX'
     Set breakpoints on all functions matching the regular expression
     REGEX.  This command sets an unconditional breakpoint on all
     matches, printing a list of all breakpoints it set.  Once these
     breakpoints are set, they are treated just like the breakpoints
     set with the `break' command.  You can delete them, disable them,
     or make them conditional the same way as any other breakpoint.

     The syntax of the regular expression is the standard one used with
     tools like `grep'.  Note that this is different from the syntax
     used by shells, so for instance `foo*' matches all functions that
     include an `fo' followed by zero or more `o's.  There is an
     implicit `.*' leading and trailing the regular expression you
     supply, so to match only functions that begin with `foo', use
     `^foo'.

     When debugging C++ programs, `rbreak' is useful for setting
     breakpoints on overloaded functions that are not members of any
     special classes.

     The `rbreak' command can be used to set breakpoints in *all* the
     functions in a program, like this:

          (gdb) rbreak .

`rbreak FILE:REGEX'
     If `rbreak' is called with a filename qualification, it limits the
     search for functions matching the given regular expression to the
     specified FILE.  This can be used, for example, to set breakpoints
     on every function in a given file:

          (gdb) rbreak file.c:.

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

`info breakpoints [N...]'
`info break [N...]'
     Print a table of all breakpoints, watchpoints, and catchpoints set
     and not deleted.  Optional argument N means print information only
     about the specified breakpoint(s) (or watchpoint(s) or
     catchpoint(s)).  For each breakpoint, following columns are
     printed:

    _Breakpoint Numbers_

    _Type_
          Breakpoint, watchpoint, or catchpoint.

    _Disposition_
          Whether the breakpoint is marked to be disabled or deleted
          when hit.

    _Enabled or Disabled_
          Enabled breakpoints are marked with `y'.  `n' marks
          breakpoints that are not enabled.

    _Address_
          Where the breakpoint is in your program, as a memory address.
          For a pending breakpoint whose address is not yet known, this
          field will contain `<PENDING>'.  Such breakpoint won't fire
          until a shared library that has the symbol or line referred
          by breakpoint is loaded.  See below for details.  A
          breakpoint with several locations will have `<MULTIPLE>' in
          this field--see below for details.

    _What_
          Where the breakpoint is in the source for your program, as a
          file and line number.  For a pending breakpoint, the original
          string passed to the breakpoint command will be listed as it
          cannot be resolved until the appropriate shared library is
          loaded in the future.

     If a breakpoint is conditional, `info break' shows the condition on
     the line following the affected breakpoint; breakpoint commands,
     if any, are listed after that.  A pending breakpoint is allowed to
     have a condition specified for it.  The condition is not parsed
     for validity until a shared library is loaded that allows the
     pending breakpoint to resolve to a valid location.

     `info break' with a breakpoint number N as argument lists only
     that breakpoint.  The convenience variable `$_' and the default
     examining-address for the `x' command are set to the address of
     the last breakpoint listed (*note Examining Memory: Memory.).

     `info break' displays a count of the number of times the breakpoint
     has been hit.  This is especially useful in conjunction with the
     `ignore' command.  You can ignore a large number of breakpoint
     hits, look at the breakpoint info to see how many times the
     breakpoint was hit, and then run again, ignoring one less than
     that number.  This will get you quickly to the last hit of that
     breakpoint.

   GDB allows you to set any number of breakpoints at the same place in
your program.  There is nothing silly or meaningless about this.  When
the breakpoints are conditional, this is even useful (*note Break
Conditions: Conditions.).

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

   * Multiple functions in the program may have the same name.

   * For a C++ constructor, the GCC compiler generates several
     instances of the function body, used in different cases.

   * For a C++ template function, a given line in the function can
     correspond to any number of instantiations.

   * For an inlined function, a given source line can correspond to
     several places where that function is inlined.

   In all those cases, GDB will insert a breakpoint at all the relevant
locations.

   A breakpoint with multiple locations is displayed in the breakpoint
table using several rows--one header row, followed by one row for each
breakpoint location.  The header row has `<MULTIPLE>' in the address
column.  The rows for individual locations contain the actual addresses
for locations, and show the functions to which those locations belong.
The number column for a location is of the form
BREAKPOINT-NUMBER.LOCATION-NUMBER.

   For example:

     Num     Type           Disp Enb  Address    What
     1       breakpoint     keep y    <MULTIPLE>
             stop only if i==1
             breakpoint already hit 1 time
     1.1                         y    0x080486a2 in void foo<int>() at t.cc:8
     1.2                         y    0x080486ca in void foo<double>() at t.cc:8

   Each location can be individually enabled or disabled by passing
BREAKPOINT-NUMBER.LOCATION-NUMBER as argument to the `enable' and
`disable' commands.  Note that you cannot delete the individual
locations from the list, you can only delete the entire list of
locations that belong to their parent breakpoint (with the `delete NUM'
command, where NUM is the number of the parent breakpoint, 1 in the
above example).  Disabling or enabling the parent breakpoint (*note
Disabling::) affects all of the locations that belong to that
breakpoint.

   It's quite common to have a breakpoint inside a shared library.
Shared libraries can be loaded and unloaded explicitly, and possibly
repeatedly, as the program is executed.  To support this use case, GDB
updates breakpoint locations whenever any shared library is loaded or
unloaded.  Typically, you would set a breakpoint in a shared library at
the beginning of your debugging session, when the library is not
loaded, and when the symbols from the library are not available.  When
you try to set breakpoint, GDB will ask you if you want to set a so
called "pending breakpoint"--breakpoint whose address is not yet
resolved.

   After the program is run, whenever a new shared library is loaded,
GDB reevaluates all the breakpoints.  When a newly loaded shared
library contains the symbol or line referred to by some pending
breakpoint, that breakpoint is resolved and becomes an ordinary
breakpoint.  When a library is unloaded, all breakpoints that refer to
its symbols or source lines become pending again.

   This logic works for breakpoints with multiple locations, too.  For
example, if you have a breakpoint in a C++ template function, and a
newly loaded shared library has an instantiation of that template, a
new location is added to the list of locations for the breakpoint.

   Except for having unresolved address, pending breakpoints do not
differ from regular breakpoints.  You can set conditions or commands,
enable and disable them and perform other breakpoint operations.

   GDB provides some additional commands for controlling what happens
when the `break' command cannot resolve breakpoint address
specification to an address:

`set breakpoint pending auto'
     This is the default behavior.  When GDB cannot find the breakpoint
     location, it queries you whether a pending breakpoint should be
     created.

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

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

`show breakpoint pending'
     Show the current behavior setting for creating pending breakpoints.

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

   For some targets, GDB can automatically decide if hardware or
software breakpoints should be used, depending on whether the
breakpoint address is read-only or read-write.  This applies to
breakpoints set with the `break' command as well as to internal
breakpoints set by commands like `next' and `finish'.  For breakpoints
set with `hbreak', GDB will always use hardware breakpoints.

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

`set breakpoint auto-hw on'
     This is the default behavior.  When GDB sets a breakpoint, it will
     try to use the target memory map to decide if software or hardware
     breakpoint must be used.

`set breakpoint auto-hw off'
     This indicates GDB should not automatically select breakpoint
     type.  If the target provides a memory map, GDB will warn when
     trying to set software breakpoint at a read-only address.

   GDB normally implements breakpoints by replacing the program code at
the breakpoint address with a special instruction, which, when
executed, given control to the debugger.  By default, the program code
is so modified only when the program is resumed.  As soon as the
program stops, GDB restores the original instructions.  This behaviour
guards against leaving breakpoints inserted in the target should gdb
abrubptly disconnect.  However, with slow remote targets, inserting and
removing breakpoint can reduce the performance.  This behavior can be
controlled with the following commands::

`set breakpoint always-inserted off'
     All breakpoints, including newly added by the user, are inserted in
     the target only when the target is resumed.  All breakpoints are
     removed from the target when it stops.

`set breakpoint always-inserted on'
     Causes all breakpoints to be inserted in the target at all times.
     If the user adds a new breakpoint, or changes an existing
     breakpoint, the breakpoints in the target are updated immediately.
     A breakpoint is removed from the target only when breakpoint
     itself is removed.

`set breakpoint always-inserted auto'
     This is the default mode.  If GDB is controlling the inferior in
     non-stop mode (*note Non-Stop Mode::), gdb behaves as if
     `breakpoint always-inserted' mode is on.  If GDB is controlling
     the inferior in all-stop mode, GDB behaves as if `breakpoint
     always-inserted' mode is off.

   GDB itself sometimes sets breakpoints in your program for special
purposes, such as proper handling of `longjmp' (in C programs).  These
internal breakpoints are assigned negative numbers, starting with `-1';
`info breakpoints' does not display them.  You can see these
breakpoints with the GDB maintenance command `maint info breakpoints'
(*note maint info breakpoints::).


File: gdb.info,  Node: Set Watchpoints,  Next: Set Catchpoints,  Prev: Set Breaks,  Up: Breakpoints

5.1.2 Setting Watchpoints
-------------------------

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

   * A reference to the value of a single variable.

   * An address cast to an appropriate data type.  For example, `*(int
     *)0x12345678' will watch a 4-byte region at the specified address
     (assuming an `int' occupies 4 bytes).

   * An arbitrarily complex expression, such as `a*b + c/d'.  The
     expression can use any operators valid in the program's native
     language (*note Languages::).

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

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

   On some systems, such as HP-UX, PowerPC, GNU/Linux and most other
x86-based targets, GDB includes support for hardware watchpoints, which
do not slow down the running of your program.

`watch [-l|-location] EXPR [thread THREADNUM] [mask MASKVALUE]'
     Set a watchpoint for an expression.  GDB will break when the
     expression EXPR is written into by the program and its value
     changes.  The simplest (and the most popular) use of this command
     is to watch the value of a single variable:

          (gdb) watch foo

     If the command includes a `[thread THREADNUM]' argument, GDB
     breaks only when the thread identified by THREADNUM changes the
     value of EXPR.  If any other threads change the value of EXPR, GDB
     will not break.  Note that watchpoints restricted to a single
     thread in this way only work with Hardware Watchpoints.

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

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

          (gdb) watch foo mask 0xffff00ff
          (gdb) watch *0xdeadbeef mask 0xffffff00

`rwatch [-l|-location] EXPR [thread THREADNUM] [mask MASKVALUE]'
     Set a watchpoint that will break when the value of EXPR is read by
     the program.

`awatch [-l|-location] EXPR [thread THREADNUM] [mask MASKVALUE]'
     Set a watchpoint that will break when EXPR is either read from or
     written into by the program.

`info watchpoints [N...]'
     This command prints a list of watchpoints, using the same format as
     `info break' (*note Set Breaks::).

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

     (gdb) watch 0x600850
     Cannot watch constant value 0x600850.
     (gdb) watch *(int *) 0x600850
     Watchpoint 1: *(int *) 6293584

   GDB sets a "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 GDB 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.

   You can force GDB to use only software watchpoints with the `set
can-use-hw-watchpoints 0' command.  With this variable set to zero, GDB
will never try to use hardware watchpoints, even if the underlying
system supports them.  (Note that hardware-assisted watchpoints that
were set _before_ setting `can-use-hw-watchpoints' to zero will still
use the hardware mechanism of watching expression values.)

`set can-use-hw-watchpoints'
     Set whether or not to use hardware watchpoints.

`show can-use-hw-watchpoints'
     Show the current mode of using hardware watchpoints.

   For remote targets, you can restrict the number of hardware
watchpoints GDB will use, see *note set remote
hardware-breakpoint-limit::.

   When you issue the `watch' command, GDB reports

     Hardware watchpoint NUM: EXPR

if it was able to set a hardware watchpoint.

   Currently, the `awatch' and `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 GDB does not do that
currently.  If GDB finds that it is unable to set a hardware breakpoint
with the `awatch' or `rwatch' command, it will print a message like
this:

     Expression cannot be implemented with read/access watchpoint.

   Sometimes, GDB 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, GDB 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, GDB 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:

     Hardware watchpoint NUM: Could not insert watchpoint

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

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

   If you call a function interactively using `print' or `call', any
watchpoints you have set will be inactive until GDB reaches another
kind of breakpoint or the call completes.

   GDB 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, _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 `main'
function and when it breaks, set all the watchpoints.

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

     _Warning:_ In multi-threaded programs, software watchpoints have
     only limited usefulness.  If GDB creates a software watchpoint, it
     can only watch the value of an expression _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, GDB may not notice when a
     non-current thread's activity changes the expression.  (Hardware
     watchpoints, in contrast, watch an expression in all threads.)

   *Note set remote hardware-watchpoint-limit::.


File: gdb.info,  Node: Set Catchpoints,  Next: Delete Breaks,  Prev: Set Watchpoints,  Up: Breakpoints

5.1.3 Setting Catchpoints
-------------------------

You can use "catchpoints" to cause the debugger to stop for certain
kinds of program events, such as C++ exceptions or the loading of a
shared library.  Use the `catch' command to set a catchpoint.

`catch EVENT'
     Stop when EVENT occurs.  EVENT can be any of the following:
    `throw'
          The throwing of a C++ exception.

    `catch'
          The catching of a C++ exception.

    `exception'
          An Ada exception being raised.  If an exception name is
          specified at the end of the command (eg `catch exception
          Program_Error'), the debugger will stop only when this
          specific exception is raised.  Otherwise, the debugger stops
          execution when any Ada exception is raised.

          When inserting an exception catchpoint on a user-defined
          exception whose name is identical to one of the exceptions
          defined by the language, the fully qualified name must be
          used as the exception name.  Otherwise, GDB will assume that
          it should stop on the pre-defined exception rather than the
          user-defined one.  For instance, assuming an exception called
          `Constraint_Error' is defined in package `Pck', then the
          command to use to catch such exceptions is `catch exception
          Pck.Constraint_Error'.

    `exception unhandled'
          An exception that was raised but is not handled by the
          program.

    `assert'
          A failed Ada assertion.

    `exec'
          A call to `exec'.  This is currently only available for HP-UX
          and GNU/Linux.

    `syscall'
    `syscall [NAME | NUMBER] ...'
          A call to or return from a system call, a.k.a. "syscall".  A
          syscall is a mechanism for application programs to request a
          service from the operating system (OS) or one of the OS
          system services.  GDB can catch some or all of the syscalls
          issued by the debuggee, and show the related information for
          each syscall.  If no argument is specified, calls to and
          returns from all system calls will be caught.

          NAME can be any system call name that is valid for the
          underlying OS.  Just what syscalls are valid depends on the
          OS.  On GNU and Unix systems, you can find the full list of
          valid syscall names on `/usr/include/asm/unistd.h'.

          Normally, GDB knows in advance which syscalls are valid for
          each OS, so you can use the GDB command-line completion
          facilities (*note command completion: Completion.) to list the
          available choices.

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

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

               (gdb) catch syscall
               Catchpoint 1 (syscall)
               (gdb) r
               Starting program: /tmp/catch-syscall

               Catchpoint 1 (call to syscall 'close'), \
               	   0xffffe424 in __kernel_vsyscall ()
               (gdb) c
               Continuing.

               Catchpoint 1 (returned from syscall 'close'), \
               	0xffffe424 in __kernel_vsyscall ()
               (gdb)

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

               (gdb) catch syscall chroot
               Catchpoint 1 (syscall 'chroot' [61])
               (gdb) r
               Starting program: /tmp/catch-syscall

               Catchpoint 1 (call to syscall 'chroot'), \
               		   0xffffe424 in __kernel_vsyscall ()
               (gdb) c
               Continuing.

               Catchpoint 1 (returned from syscall 'chroot'), \
               	0xffffe424 in __kernel_vsyscall ()
               (gdb)

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

               (gdb) catch syscall 252
               Catchpoint 1 (syscall(s) 'exit_group')
               (gdb) r
               Starting program: /tmp/catch-syscall

               Catchpoint 1 (call to syscall 'exit_group'), \
               		   0xffffe424 in __kernel_vsyscall ()
               (gdb) c
               Continuing.

               Program exited normally.
               (gdb)

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

               (gdb) catch syscall 764
               warning: The number '764' does not represent a known syscall.
               Catchpoint 2 (syscall 764)
               (gdb)

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

               (gdb) catch syscall
               warning: Could not open "syscalls/i386-linux.xml"
               warning: Could not load the syscall XML file 'syscalls/i386-linux.xml'.
               GDB will not be able to display syscall names.
               Catchpoint 1 (syscall)
               (gdb)

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

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

               (gdb) catch syscall 252
               Catchpoint 1 (syscall(s) 252)

          Again, in this case GDB would not be able to display
          syscall's names.

    `fork'
          A call to `fork'.  This is currently only available for HP-UX
          and GNU/Linux.

    `vfork'
          A call to `vfork'.  This is currently only available for HP-UX
          and GNU/Linux.


`tcatch EVENT'
     Set a catchpoint that is enabled only for one stop.  The
     catchpoint is automatically deleted after the first time the event
     is caught.


   Use the `info break' command to list the current catchpoints.

   There are currently some limitations to C++ exception handling
(`catch throw' and `catch catch') in GDB:

   * If you call a function interactively, GDB 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 GDB 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.

   * You cannot raise an exception interactively.

   * You cannot install an exception handler interactively.

   Sometimes `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 _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 GNU C++, exceptions are
raised by calling a library function named `__raise_exception' which
has the following ANSI C interface:

         /* ADDR is where the exception identifier is stored.
            ID is the exception identifier.  */
         void __raise_exception (void **addr, void *id);

To make the debugger catch all exceptions before any stack unwinding
takes place, set a breakpoint on `__raise_exception' (*note
Breakpoints; Watchpoints; and Exceptions: Breakpoints.).

   With a conditional breakpoint (*note Break Conditions: Conditions.)
that depends on the value of 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.


File: gdb.info,  Node: Delete Breaks,  Next: Disabling,  Prev: Set Catchpoints,  Up: Breakpoints

5.1.4 Deleting Breakpoints
--------------------------

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 "deleting" the breakpoint.  A breakpoint
that has been deleted no longer exists; it is forgotten.

   With the `clear' command you can delete breakpoints according to
where they are in your program.  With the `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.  GDB
automatically ignores breakpoints on the first instruction to be
executed when you continue execution without changing the execution
address.

`clear'
     Delete any breakpoints at the next instruction to be executed in
     the selected stack frame (*note Selecting a Frame: Selection.).
     When the innermost frame is selected, this is a good way to delete
     a breakpoint where your program just stopped.

`clear LOCATION'
     Delete any breakpoints set at the specified LOCATION.  *Note
     Specify Location::, for the various forms of LOCATION; the most
     useful ones are listed below:

    `clear FUNCTION'
    `clear FILENAME:FUNCTION'
          Delete any breakpoints set at entry to the named FUNCTION.

    `clear LINENUM'
    `clear FILENAME:LINENUM'
          Delete any breakpoints set at or within the code of the
          specified LINENUM of the specified FILENAME.

`delete [breakpoints] [RANGE...]'
     Delete the breakpoints, watchpoints, or catchpoints of the
     breakpoint ranges specified as arguments.  If no argument is
     specified, delete all breakpoints (GDB asks confirmation, unless
     you have `set confirm off').  You can abbreviate this command as
     `d'.


File: gdb.info,  Node: Disabling,  Next: Conditions,  Prev: Delete Breaks,  Up: Breakpoints

5.1.5 Disabling Breakpoints
---------------------------

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

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

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

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

   * Enabled.  The breakpoint stops your program.  A breakpoint set
     with the `break' command starts out in this state.

   * Disabled.  The breakpoint has no effect on your program.

   * Enabled once.  The breakpoint stops your program, but then becomes
     disabled.

   * Enabled for deletion.  The breakpoint stops your program, but
     immediately after it does so it is deleted permanently.  A
     breakpoint set with the `tbreak' command starts out in this state.

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

`disable [breakpoints] [RANGE...]'
     Disable the specified breakpoints--or all breakpoints, if none are
     listed.  A disabled breakpoint has no effect but is not forgotten.
     All options such as ignore-counts, conditions and commands are
     remembered in case the breakpoint is enabled again later.  You may
     abbreviate `disable' as `dis'.

`enable [breakpoints] [RANGE...]'
     Enable the specified breakpoints (or all defined breakpoints).
     They become effective once again in stopping your program.

`enable [breakpoints] once RANGE...'
     Enable the specified breakpoints temporarily.  GDB disables any of
     these breakpoints immediately after stopping your program.

`enable [breakpoints] delete RANGE...'
     Enable the specified breakpoints to work once, then die.  GDB
     deletes any of these breakpoints as soon as your program stops
     there.  Breakpoints set by the `tbreak' command start out in this
     state.

   Except for a breakpoint set with `tbreak' (*note Setting
Breakpoints: Set Breaks.), breakpoints that you set are initially
enabled; subsequently, they become disabled or enabled only when you
use one of the commands above.  (The command `until' can set and delete
a breakpoint of its own, but it does not change the state of your other
breakpoints; see *note Continuing and Stepping: Continuing and
Stepping.)


File: gdb.info,  Node: Conditions,  Next: Break Commands,  Prev: Disabling,  Up: Breakpoints

5.1.6 Break Conditions
----------------------

The simplest sort of breakpoint breaks every time your program reaches a
specified place.  You can also specify a "condition" for a breakpoint.
A condition is just a Boolean expression in your programming language
(*note 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 _true_.

   This is the converse of using assertions for program validation; in
that situation, you want to stop when the assertion is violated--that
is, when the condition is false.  In C, if you want to test an
assertion expressed by the condition ASSERT, you should set the
condition `! ASSERT' on the appropriate breakpoint.

   Conditions are also accepted for watchpoints; you may not need them,
since a watchpoint is inspecting the value of an expression anyhow--but
it might be simpler, say, to just set a watchpoint on a variable name,
and specify a condition that tests whether the new value is an
interesting one.

   Break conditions can have side effects, and may even call functions
in your program.  This can be useful, for example, to activate functions
that log program progress, or to use your own print functions to format
special data structures.  The effects are completely predictable unless
there is another enabled breakpoint at the same address.  (In that
case, GDB might see the other breakpoint first and stop your program
without checking the condition of this one.)  Note that breakpoint
commands are usually more convenient and flexible than break conditions
for the purpose of performing side effects when a breakpoint is reached
(*note Breakpoint Command Lists: Break Commands.).

   Break conditions can be specified when a breakpoint is set, by using
`if' in the arguments to the `break' command.  *Note Setting
Breakpoints: Set Breaks.  They can also be changed at any time with the
`condition' command.

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

`condition BNUM EXPRESSION'
     Specify EXPRESSION as the break condition for breakpoint,
     watchpoint, or catchpoint number BNUM.  After you set a condition,
     breakpoint BNUM stops your program only if the value of EXPRESSION
     is true (nonzero, in C).  When you use `condition', GDB checks
     EXPRESSION immediately for syntactic correctness, and to determine
     whether symbols in it have referents in the context of your
     breakpoint.  If EXPRESSION uses symbols not referenced in the
     context of the breakpoint, GDB prints an error message:

          No symbol "foo" in current context.

     GDB does not actually evaluate EXPRESSION at the time the
     `condition' command (or a command that sets a breakpoint with a
     condition, like `break if ...') is given, however.  *Note
     Expressions: Expressions.

`condition BNUM'
     Remove the condition from breakpoint number BNUM.  It becomes an
     ordinary unconditional breakpoint.

   A special case of a breakpoint condition is to stop only when the
breakpoint has been reached a certain number of times.  This is so
useful that there is a special way to do it, using the "ignore count"
of the breakpoint.  Every breakpoint has an ignore count, which is an
integer.  Most of the time, the ignore count is zero, and therefore has
no effect.  But if your program reaches a breakpoint whose ignore count
is positive, then instead of stopping, it just decrements the ignore
count by one and continues.  As a result, if the ignore count value is
N, the breakpoint does not stop the next N times your program reaches
it.

`ignore BNUM COUNT'
     Set the ignore count of breakpoint number BNUM to COUNT.  The next
     COUNT times the breakpoint is reached, your program's execution
     does not stop; other than to decrement the ignore count, GDB takes
     no action.

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

     When you use `continue' to resume execution of your program from a
     breakpoint, you can specify an ignore count directly as an
     argument to `continue', rather than using `ignore'.  *Note
     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, GDB
     resumes checking the condition.

     You could achieve the effect of the ignore count with a condition
     such as `$foo-- <= 0' using a debugger convenience variable that
     is decremented each time.  *Note Convenience Variables:
     Convenience Vars.

   Ignore counts apply to breakpoints, watchpoints, and catchpoints.


File: gdb.info,  Node: Break Commands,  Next: Save Breakpoints,  Prev: Conditions,  Up: Breakpoints

5.1.7 Breakpoint Command Lists
------------------------------

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.

`commands [RANGE...]'
`... COMMAND-LIST ...'
`end'
     Specify a list of commands for the given breakpoints.  The commands
     themselves appear on the following lines.  Type a line containing
     just `end' to terminate the commands.

     To remove all commands from a breakpoint, type `commands' and
     follow it immediately with `end'; that is, give no commands.

     With no argument, `commands' refers to the last breakpoint,
     watchpoint, or catchpoint set (not to the breakpoint most recently
     encountered).  If the most recent breakpoints were set with a
     single command, then the `commands' will apply to all the
     breakpoints set by that command.  This applies to breakpoints set
     by `rbreak', and also applies when a single `break' command
     creates multiple breakpoints (*note Ambiguous Expressions:
     Ambiguous Expressions.).

   Pressing <RET> as a means of repeating the last GDB command is
disabled within a COMMAND-LIST.

   You can use breakpoint commands to start your program up again.
Simply use the `continue' command, or `step', or any other command that
resumes execution.

   Any other commands in the command list, after a command that resumes
execution, are ignored.  This is because any time you resume execution
(even with a simple `next' or `step'), you may encounter another
breakpoint--which could have its own command list, leading to
ambiguities about which list to execute.

   If the first command you specify in a command list is `silent', the
usual message about stopping at a breakpoint is not printed.  This may
be desirable for breakpoints that are to print a specific message and
then continue.  If none of the remaining commands print anything, you
see no sign that the breakpoint was reached.  `silent' is meaningful
only at the beginning of a breakpoint command list.

   The commands `echo', `output', and `printf' allow you to print
precisely controlled output, and are often useful in silent
breakpoints.  *Note Commands for Controlled Output: Output.

   For example, here is how you could use breakpoint commands to print
the value of `x' at entry to `foo' whenever `x' is positive.

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

   One application for breakpoint commands is to compensate for one bug
so you can test for another.  Put a breakpoint just after the erroneous
line of code, give it a condition to detect the case in which something
erroneous has been done, and give it commands to assign correct values
to any variables that need them.  End with the `continue' command so
that your program does not stop, and start with the `silent' command so
that no output is produced.  Here is an example:

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


File: gdb.info,  Node: Save Breakpoints,  Next: Error in Breakpoints,  Prev: Break Commands,  Up: Breakpoints

5.1.8 How to save breakpoints to a file
---------------------------------------

To save breakpoint definitions to a file use the `save breakpoints'
command.

`save breakpoints [FILENAME]'
     This command saves all current breakpoint definitions together with
     their commands and ignore counts, into a file `FILENAME' suitable
     for use in a later debugging session.  This includes all types of
     breakpoints (breakpoints, watchpoints, catchpoints, tracepoints).
     To read the saved breakpoint definitions, use the `source' command
     (*note Command Files::).  Note that watchpoints with expressions
     involving local variables may fail to be recreated because it may
     not be possible to access the context where the watchpoint is
     valid anymore.  Because the saved breakpoint definitions are
     simply a sequence of GDB commands that recreate the breakpoints,
     you can edit the file in your favorite editing program, and remove
     the breakpoint definitions you're not interested in, or that can
     no longer be recreated.


File: gdb.info,  Node: Error in Breakpoints,  Next: Breakpoint-related Warnings,  Prev: Save Breakpoints,  Up: Breakpoints

5.1.9 "Cannot insert breakpoints"
---------------------------------

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

     Stopped; cannot insert breakpoints.
     You may have requested too many hardware breakpoints and watchpoints.

This message is printed when you attempt to resume the program, since
only then GDB knows exactly how many hardware breakpoints and
watchpoints it needs to insert.

   When this message is printed, you need to disable or remove some of
the hardware-assisted breakpoints and watchpoints, and then continue.


File: gdb.info,  Node: Breakpoint-related Warnings,  Prev: Error in Breakpoints,  Up: Breakpoints

5.1.10 "Breakpoint address adjusted..."
---------------------------------------

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

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

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

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

     warning: Breakpoint address adjusted from 0x00010414 to 0x00010410.

   Such warnings are printed both for user settable and GDB's internal
breakpoints.  If you see one of these warnings, you should verify that
a breakpoint set at the adjusted address will have the desired affect.
If not, the breakpoint in question may be removed and other breakpoints
may be set which will have the desired behavior.  E.g., it may be
sufficient to place the breakpoint at a later instruction.  A
conditional breakpoint may also be useful in some cases to prevent the
breakpoint from triggering too often.

   GDB will also issue a warning when stopping at one of these adjusted
breakpoints:

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

   When this warning is encountered, it may be too late to take remedial
action except in cases where the breakpoint is hit earlier or more
frequently than expected.


File: gdb.info,  Node: Continuing and Stepping,  Next: Skipping Over Functions and Files,  Prev: Breakpoints,  Up: Stopping

5.2 Continuing and Stepping
===========================

"Continuing" means resuming program execution until your program
completes normally.  In contrast, "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 `handle', or use `signal 0'
to resume execution.  *Note Signals: Signals.)

`continue [IGNORE-COUNT]'
`c [IGNORE-COUNT]'
`fg [IGNORE-COUNT]'
     Resume program execution, at the address where your program last
     stopped; any breakpoints set at that address are bypassed.  The
     optional argument IGNORE-COUNT allows you to specify a further
     number of times to ignore a breakpoint at this location; its
     effect is like that of `ignore' (*note Break Conditions:
     Conditions.).

     The argument IGNORE-COUNT is meaningful only when your program
     stopped due to a breakpoint.  At other times, the argument to
     `continue' is ignored.

     The synonyms `c' and `fg' (for "foreground", as the debugged
     program is deemed to be the foreground program) are provided
     purely for convenience, and have exactly the same behavior as
     `continue'.

   To resume execution at a different place, you can use `return'
(*note Returning from a Function: Returning.) to go back to the calling
function; or `jump' (*note Continuing at a Different Address: Jumping.)
to go to an arbitrary location in your program.

   A typical technique for using stepping is to set a breakpoint (*note
Breakpoints; Watchpoints; and Catchpoints: Breakpoints.) at the
beginning of the function or the section of your program where a problem
is believed to lie, run your program until it stops at that breakpoint,
and then step through the suspect area, examining the variables that are
interesting, until you see the problem happen.

`step'
     Continue running your program until control reaches a different
     source line, then stop it and return control to GDB.  This command
     is abbreviated `s'.

          _Warning:_ If you use the `step' command while control is
          within a function that was compiled without debugging
          information, 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 `stepi' command, described
          below.

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

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

`step COUNT'
     Continue running as in `step', but do so COUNT times.  If a
     breakpoint is reached, or a signal not related to stepping occurs
     before COUNT steps, stepping stops right away.

`next [COUNT]'
     Continue to the next source line in the current (innermost) stack
     frame.  This is similar to `step', but function calls that appear
     within the line of code are executed without stopping.  Execution
     stops when control reaches a different line of code at the
     original stack level that was executing when you gave the `next'
     command.  This command is abbreviated `n'.

     An argument COUNT is a repeat count, as for `step'.

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

`set step-mode'
`set step-mode on'
     The `set step-mode on' command causes the `step' command to stop
     at the first instruction of a function which contains no debug line
     information rather than stepping over it.

     This is useful in cases where you may be interested in inspecting
     the machine instructions of a function which has no symbolic info
     and do not want GDB to automatically skip over this function.

`set step-mode off'
     Causes the `step' command to step over any functions which
     contains no debug information.  This is the default.

`show step-mode'
     Show whether GDB will stop in or step over functions without
     source line debug information.

`finish'
     Continue running until just after function in the selected stack
     frame returns.  Print the returned value (if any).  This command
     can be abbreviated as `fin'.

     Contrast this with the `return' command (*note Returning from a
     Function: Returning.).

`until'
`u'
     Continue running until a source line past the current line, in the
     current stack frame, is reached.  This command is used to avoid
     single stepping through a loop more than once.  It is like the
     `next' command, except that when `until' 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, `until' makes your program continue execution
     until it exits the loop.  In contrast, a `next' command at the end
     of a loop simply steps back to the beginning of the loop, which
     forces you to step through the next iteration.

     `until' always stops your program if it attempts to exit the
     current stack frame.

     `until' may produce somewhat counterintuitive results if the order
     of machine code does not match the order of the source lines.  For
     example, in the following excerpt from a debugging session, the `f'
     (`frame') command shows that execution is stopped at line `206';
     yet when we use `until', we get to line `195':

          (gdb) f
          #0  main (argc=4, argv=0xf7fffae8) at m4.c:206
          206                 expand_input();
          (gdb) until
          195             for ( ; argc > 0; NEXTARG) {

     This happened because, for execution efficiency, the compiler had
     generated code for the loop closure test at the end, rather than
     the start, of the loop--even though the test in a C `for'-loop is
     written before the body of the loop.  The `until' command appeared
     to step back to the beginning of the loop when it advanced to this
     expression; however, it has not really gone to an earlier
     statement--not in terms of the actual machine code.

     `until' with no argument works by means of single instruction
     stepping, and hence is slower than `until' with an argument.

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

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

`advance LOCATION'
     Continue running the program up to the given LOCATION.  An
     argument is required, which should be of one of the forms
     described in *note Specify Location::.  Execution will also stop
     upon exit from the current stack frame.  This command is similar
     to `until', but `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.

`stepi'
`stepi ARG'
`si'
     Execute one machine instruction, then stop and return to the
     debugger.

     It is often useful to do `display/i $pc' when stepping by machine
     instructions.  This makes GDB automatically display the next
     instruction to be executed, each time your program stops.  *Note
     Automatic Display: Auto Display.

     An argument is a repeat count, as in `step'.

`nexti'
`nexti ARG'
`ni'
     Execute one machine instruction, but if it is a function call,
     proceed until the function returns.

     An argument is a repeat count, as in `next'.


File: gdb.info,  Node: Skipping Over Functions and Files,  Next: Signals,  Prev: Continuing and Stepping,  Up: Stopping

5.3 Skipping Over Functions and Files
=====================================

The program you are debugging may contain some functions which are
uninteresting to debug.  The `skip' comand lets you tell GDB to skip a
function or all functions in a file when stepping.

   For example, consider the following C function:

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

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

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

   A more flexible solution is to execute `skip boring'.  This instructs
GDB never to step into `boring'.  Now when you execute `step' at line
103, you'll step over `boring' and directly into `foo'.

   You can also instruct GDB to skip all functions in a file, with, for
example, `skip file boring.c'.

`skip [LINESPEC]'
`skip function [LINESPEC]'
     After running this command, the function named by LINESPEC or the
     function containing the line named by LINESPEC will be skipped
     over when stepping.  *Note Specify Location::.

     If you do not specify LINESPEC, the function you're currently
     debugging will be skipped.

     (If you have a function called `file' that you want to skip, use
     `skip function file'.)

`skip file [FILENAME]'
     After running this command, any function whose source lives in
     FILENAME will be skipped over when stepping.

     If you do not specify FILENAME, functions whose source lives in
     the file you're currently debugging will be skipped.

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

`info skip [RANGE]'
     Print details about the specified skip(s).  If RANGE is not
     specified, print a table with details about all functions and
     files marked for skipping.  `info skip' prints the following
     information about each skip:

    _Identifier_
          A number identifying this skip.

    _Type_
          The type of this skip, either `function' or `file'.

    _Enabled or Disabled_
          Enabled skips are marked with `y'.  Disabled skips are marked
          with `n'.

    _Address_
          For function skips, this column indicates the address in
          memory of the function being skipped.  If you've set a
          function skip on a function which has not yet been loaded,
          this field will contain `<PENDING>'.  Once a shared library
          which has the function is loaded, `info skip' will show the
          function's address here.

    _What_
          For file skips, this field contains the filename being
          skipped.  For functions skips, this field contains the
          function name and its line number in the file where it is
          defined.

`skip delete [RANGE]'
     Delete the specified skip(s).  If RANGE is not specified, delete
     all skips.

`skip enable [RANGE]'
     Enable the specified skip(s).  If RANGE is not specified, enable
     all skips.

`skip disable [RANGE]'
     Disable the specified skip(s).  If RANGE is not specified, disable
     all skips.



File: gdb.info,  Node: Signals,  Next: Thread Stops,  Prev: Skipping Over Functions and Files,  Up: Stopping

5.4 Signals
===========

A signal is an asynchronous event that can happen in a program.  The
operating system defines the possible kinds of signals, and gives each
kind a name and a number.  For example, in Unix `SIGINT' is the signal
a program gets when you type an interrupt character (often `Ctrl-c');
`SIGSEGV' is the signal a program gets from referencing a place in
memory far away from all the areas in use; `SIGALRM' occurs when the
alarm clock timer goes off (which happens only if your program has
requested an alarm).

   Some signals, including `SIGALRM', are a normal part of the
functioning of your program.  Others, such as `SIGSEGV', indicate
errors; these signals are "fatal" (they kill your program immediately)
if the program has not specified in advance some other way to handle
the signal.  `SIGINT' does not indicate an error in your program, but
it is normally fatal so it can carry out the purpose of the interrupt:
to kill the program.

   GDB has the ability to detect any occurrence of a signal in your
program.  You can tell GDB in advance what to do for each kind of
signal.

   Normally, GDB is set up to let the non-erroneous signals like
`SIGALRM' be silently passed to your program (so as not to interfere
with their role in the program's functioning) but to stop your program
immediately whenever an error signal happens.  You can change these
settings with the `handle' command.

`info signals'
`info handle'
     Print a table of all the kinds of signals and how GDB has been
     told to handle each one.  You can use this to see the signal
     numbers of all the defined types of signals.

`info signals SIG'
     Similar, but print information only about the specified signal
     number.

     `info handle' is an alias for `info signals'.

`handle SIGNAL [KEYWORDS...]'
     Change the way GDB handles signal SIGNAL.  SIGNAL can be the
     number of a signal or its name (with or without the `SIG' at the
     beginning); a list of signal numbers of the form `LOW-HIGH'; or
     the word `all', meaning all the known signals.  Optional arguments
     KEYWORDS, described below, say what change to make.

   The keywords allowed by the `handle' command can be abbreviated.
Their full names are:

`nostop'
     GDB should not stop your program when this signal happens.  It may
     still print a message telling you that the signal has come in.

`stop'
     GDB should stop your program when this signal happens.  This
     implies the `print' keyword as well.

`print'
     GDB should print a message when this signal happens.

`noprint'
     GDB should not mention the occurrence of the signal at all.  This
     implies the `nostop' keyword as well.

`pass'
`noignore'
     GDB should allow your program to see this signal; your program can
     handle the signal, or else it may terminate if the signal is fatal
     and not handled.  `pass' and `noignore' are synonyms.

`nopass'
`ignore'
     GDB should not allow your program to see this signal.  `nopass'
     and `ignore' are synonyms.

   When a signal stops your program, the signal is not visible to the
program until you continue.  Your program sees the signal then, if
`pass' is in effect for the signal in question _at that time_.  In
other words, after GDB reports a signal, you can use the `handle'
command with `pass' or `nopass' to control whether your program sees
that signal when you continue.

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

   You can also use the `signal' command to prevent your program from
seeing a signal, or cause it to see a signal it normally would not see,
or to give it any signal at any time.  For example, if your program
stopped due to some sort of memory reference error, you might store
correct values into the erroneous variables and continue, hoping to see
more execution; but your program would probably terminate immediately as
a result of the fatal signal once it saw the signal.  To prevent this,
you can continue with `signal 0'.  *Note Giving your Program a Signal:
Signaling.

   On some targets, GDB can inspect extra signal information associated
with the intercepted signal, before it is actually delivered to the
program being debugged.  This information is exported by the
convenience variable `$_siginfo', and consists of data that is passed
by the kernel to the signal handler at the time of the receipt of a
signal.  The data type of the information itself is target dependent.
You can see the data type using the `ptype $_siginfo' command.  On Unix
systems, it typically corresponds to the standard `siginfo_t' type, as
defined in the `signal.h' system header.

   Here's an example, on a GNU/Linux system, printing the stray
referenced address that raised a segmentation fault.

     (gdb) continue
     Program received signal SIGSEGV, Segmentation fault.
     0x0000000000400766 in main ()
     69        *(int *)p = 0;
     (gdb) ptype $_siginfo
     type = struct {
         int si_signo;
         int si_errno;
         int si_code;
         union {
             int _pad[28];
             struct {...} _kill;
             struct {...} _timer;
             struct {...} _rt;
             struct {...} _sigchld;
             struct {...} _sigfault;
             struct {...} _sigpoll;
         } _sifields;
     }
     (gdb) ptype $_siginfo._sifields._sigfault
     type = struct {
         void *si_addr;
     }
     (gdb) p $_siginfo._sifields._sigfault.si_addr
     $1 = (void *) 0x7ffff7ff7000

   Depending on target support, `$_siginfo' may also be writable.


File: gdb.info,  Node: Thread Stops,  Prev: Signals,  Up: Stopping

5.5 Stopping and Starting Multi-thread Programs
===============================================

GDB supports debugging programs with multiple threads (*note Debugging
Programs with Multiple Threads: Threads.).  There are two modes of
controlling execution of your program within the debugger.  In the
default mode, referred to as "all-stop mode", when any thread in your
program stops (for example, at a breakpoint or while being stepped),
all other threads in the program are also stopped by GDB.  On some
targets, GDB also supports "non-stop mode", in which other threads can
continue to run freely while you examine the stopped thread in the
debugger.

* Menu:

* All-Stop Mode::		All threads stop when GDB takes control
* Non-Stop Mode::		Other threads continue to execute
* Background Execution::	Running your program asynchronously
* Thread-Specific Breakpoints::	Controlling breakpoints
* Interrupted System Calls::	GDB may interfere with system calls
* Observer Mode::               GDB does not alter program behavior


File: gdb.info,  Node: All-Stop Mode,  Next: Non-Stop Mode,  Up: Thread Stops

5.5.1 All-Stop Mode
-------------------

In all-stop mode, whenever your program stops under GDB for any reason,
_all_ threads of execution stop, not just the current thread.  This
allows you to examine the overall state of the program, including
switching between threads, without worrying that things may change
underfoot.

   Conversely, whenever you restart the program, _all_ threads start
executing.  _This is true even when single-stepping_ with commands like
`step' or `next'.

   In particular, GDB cannot single-step all threads in lockstep.
Since thread scheduling is up to your debugging target's operating
system (not controlled by GDB), 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.

   Whenever GDB stops your program, due to a breakpoint or a signal, it
automatically selects the thread where that breakpoint or signal
happened.  GDB alerts you to the context switch with a message such as
`[Switching to Thread N]' to identify the thread.

   On some OSes, you can modify GDB's default behavior by locking the
OS scheduler to allow only a single thread to run.

`set scheduler-locking MODE'
     Set the scheduler locking mode.  If it is `off', then there is no
     locking and any thread may run at any time.  If `on', then only the
     current thread may run when the inferior is resumed.  The `step'
     mode optimizes for single-stepping; it prevents other threads from
     preempting the current thread while you are stepping, so that the
     focus of debugging does not change unexpectedly.  Other threads
     only rarely (or never) get a chance to run when you step.  They
     are more likely to run when you `next' over a function call, and
     they are completely free to run when you use commands like
     `continue', `until', or `finish'.  However, unless another thread
     hits a breakpoint during its timeslice, GDB does not change the
     current thread away from the thread that you are debugging.

`show scheduler-locking'
     Display the current scheduler locking mode.

   By default, when you issue one of the execution commands such as
`continue', `next' or `step', GDB allows only threads of the current
inferior to run.  For example, if GDB is attached to two inferiors,
each with two threads, the `continue' command resumes only the two
threads of the current inferior.  This is useful, for example, when you
debug a program that forks and you want to hold the parent stopped (so
that, for instance, it doesn't run to exit), while you debug the child.
In other situations, you may not be interested in inspecting the
current state of any of the processes GDB is attached to, and you may
want to resume them all until some breakpoint is hit.  In the latter
case, you can instruct GDB to allow all threads of all the inferiors to
run with the `set schedule-multiple' command.

`set schedule-multiple'
     Set the mode for allowing threads of multiple processes to be
     resumed when an execution command is issued.  When `on', all
     threads of all processes are allowed to run.  When `off', only the
     threads of the current process are resumed.  The default is `off'.
     The `scheduler-locking' mode takes precedence when set to `on', or
     while you are stepping and set to `step'.

`show schedule-multiple'
     Display the current mode for resuming the execution of threads of
     multiple processes.


File: gdb.info,  Node: Non-Stop Mode,  Next: Background Execution,  Prev: All-Stop Mode,  Up: Thread Stops

5.5.2 Non-Stop Mode
-------------------

For some multi-threaded targets, GDB supports an optional mode of
operation in which you can examine stopped program threads in the
debugger while other threads continue to execute freely.  This
minimizes intrusion when debugging live systems, such as programs where
some threads have real-time constraints or must continue to respond to
external events.  This is referred to as "non-stop" mode.

   In non-stop mode, when a thread stops to report a debugging event,
_only_ that thread is stopped; GDB does not stop other threads as well,
in contrast to the all-stop mode behavior.  Additionally, execution
commands such as `continue' and `step' apply by default only to the
current thread in non-stop mode, rather than all threads as in all-stop
mode.  This allows you to control threads explicitly in ways that are
not possible in all-stop mode -- for example, stepping one thread while
allowing others to run freely, stepping one thread while holding all
others stopped, or stepping several threads independently and
simultaneously.

   To enter non-stop mode, use this sequence of commands before you run
or attach to your program:

     # Enable the async interface.
     set target-async 1

     # If using the CLI, pagination breaks non-stop.
     set pagination off

     # Finally, turn it on!
     set non-stop on

   You can use these commands to manipulate the non-stop mode setting:

`set non-stop on'
     Enable selection of non-stop mode.

`set non-stop off'
     Disable selection of non-stop mode.  

`show non-stop'
     Show the current non-stop enablement setting.

   Note these commands only reflect whether non-stop mode is enabled,
not whether the currently-executing program is being run in non-stop
mode.  In particular, the `set non-stop' preference is only consulted
when GDB starts or connects to the target program, and it is generally
not possible to switch modes once debugging has started.  Furthermore,
since not all targets support non-stop mode, even when you have enabled
non-stop mode, GDB may still fall back to all-stop operation by default.

   In non-stop mode, all execution commands apply only to the current
thread by default.  That is, `continue' only continues one thread.  To
continue all threads, issue `continue -a' or `c -a'.

   You can use GDB's background execution commands (*note Background
Execution::) to run some threads in the background while you continue
to examine or step others from GDB.  The MI execution commands (*note
GDB/MI Program Execution::) are always executed asynchronously in
non-stop mode.

   Suspending execution is done with the `interrupt' command when
running in the background, or `Ctrl-c' during foreground execution.  In
all-stop mode, this stops the whole process; but in non-stop mode the
interrupt applies only to the current thread.  To stop the whole
program, use `interrupt -a'.

   Other execution commands do not currently support the `-a' option.

   In non-stop mode, when a thread stops, GDB doesn't automatically make
that thread current, as it does in all-stop mode.  This is because the
thread stop notifications are asynchronous with respect to GDB's
command interpreter, and it would be confusing if GDB unexpectedly
changed to a different thread just as you entered a command to operate
on the previously current thread.


File: gdb.info,  Node: Background Execution,  Next: Thread-Specific Breakpoints,  Prev: Non-Stop Mode,  Up: Thread Stops

5.5.3 Background Execution
--------------------------

GDB's execution commands have two variants:  the normal foreground
(synchronous) behavior, and a background (asynchronous) behavior.  In
foreground execution, GDB waits for the program to report that some
thread has stopped before prompting for another command.  In background
execution, GDB immediately gives a command prompt so that you can issue
other commands while your program runs.

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

`set target-async on'
     Enable asynchronous mode.

`set target-async off'
     Disable asynchronous mode.  

`show target-async'
     Show the current target-async setting.

   If the target doesn't support async mode, GDB issues an error
message if you attempt to use the background execution commands.

   To specify background execution, add a `&' to the command.  For
example, the background form of the `continue' command is `continue&',
or just `c&'.  The execution commands that accept background execution
are:

`run'
     *Note Starting your Program: Starting.

`attach'
     *Note Debugging an Already-running Process: Attach.

`step'
     *Note step: Continuing and Stepping.

`stepi'
     *Note stepi: Continuing and Stepping.

`next'
     *Note next: Continuing and Stepping.

`nexti'
     *Note nexti: Continuing and Stepping.

`continue'
     *Note continue: Continuing and Stepping.

`finish'
     *Note finish: Continuing and Stepping.

`until'
     *Note until: Continuing and Stepping.


   Background execution is especially useful in conjunction with
non-stop mode for debugging programs with multiple threads; see *note
Non-Stop Mode::.  However, you can also use these commands in the
normal all-stop mode with the restriction that you cannot issue another
execution command until the previous one finishes.  Examples of
commands that are valid in all-stop mode while the program is running
include `help' and `info break'.

   You can interrupt your program while it is running in the background
by using the `interrupt' command.

`interrupt'
`interrupt -a'
     Suspend execution of the running program.  In all-stop mode,
     `interrupt' stops the whole process, but in non-stop mode, it stops
     only the current thread.  To stop the whole program in non-stop
     mode, use `interrupt -a'.


File: gdb.info,  Node: Thread-Specific Breakpoints,  Next: Interrupted System Calls,  Prev: Background Execution,  Up: Thread Stops

5.5.4 Thread-Specific Breakpoints
---------------------------------

When your program has multiple threads (*note Debugging Programs with
Multiple Threads: Threads.), you can choose whether to set breakpoints
on all threads, or on a particular thread.

`break LINESPEC thread THREADNO'
`break LINESPEC thread THREADNO if ...'
     LINESPEC specifies source lines; there are several ways of writing
     them (*note Specify Location::), but the effect is always to
     specify some source line.

     Use the qualifier `thread THREADNO' with a breakpoint command to
     specify that you only want GDB to stop the program when a
     particular thread reaches this breakpoint.  THREADNO is one of the
     numeric thread identifiers assigned by GDB, shown in the first
     column of the `info threads' display.

     If you do not specify `thread THREADNO' when you set a breakpoint,
     the breakpoint applies to _all_ threads of your program.

     You can use the `thread' qualifier on conditional breakpoints as
     well; in this case, place `thread THREADNO' before or after the
     breakpoint condition, like this:

          (gdb) break frik.c:13 thread 28 if bartab > lim



File: gdb.info,  Node: Interrupted System Calls,  Next: Observer Mode,  Prev: Thread-Specific Breakpoints,  Up: Thread Stops

5.5.5 Interrupted System Calls
------------------------------

There is an unfortunate side effect when using GDB to debug
multi-threaded programs.  If one thread stops for a breakpoint, or for
some other reason, and another thread is blocked in a system call, then
the system call may return prematurely.  This is a consequence of the
interaction between multiple threads and the signals that GDB uses to
implement breakpoints and other events that stop execution.

   To handle this problem, your program should check the return value of
each system call and react appropriately.  This is good programming
style anyways.

   For example, do not write code like this:

       sleep (10);

   The call to `sleep' will return early if a different thread stops at
a breakpoint or for some other reason.

   Instead, write this:

       int unslept = 10;
       while (unslept > 0)
         unslept = sleep (unslept);

   A system call is allowed to return early, so the system is still
conforming to its specification.  But GDB does cause your
multi-threaded program to behave differently than it would without GDB.

   Also, GDB uses internal breakpoints in the thread library to monitor
certain events such as thread creation and thread destruction.  When
such an event happens, a system call in another thread may return
prematurely, even though your program does not appear to stop.


File: gdb.info,  Node: Observer Mode,  Prev: Interrupted System Calls,  Up: Thread Stops

5.5.6 Observer Mode
-------------------

If you want to build on non-stop mode and observe program behavior
without any chance of disruption by GDB, you can set variables to
disable all of the debugger's attempts to modify state, whether by
writing memory, inserting breakpoints, etc.  These operate at a low
level, intercepting operations from all commands.

   When all of these are set to `off', then GDB is said to be "observer
mode".  As a convenience, the variable `observer' can be set to disable
these, plus enable non-stop mode.

   Note that GDB will not prevent you from making nonsensical
combinations of these settings. For instance, if you have enabled
`may-insert-breakpoints' but disabled `may-write-memory', then
breakpoints that work by writing trap instructions into the code stream
will still not be able to be placed.

`set observer on'
`set observer off'
     When set to `on', this disables all the permission variables below
     (except for `insert-fast-tracepoints'), plus enables non-stop
     debugging.  Setting this to `off' switches back to normal
     debugging, though remaining in non-stop mode.

`show observer'
     Show whether observer mode is on or off.

`set may-write-registers on'
`set may-write-registers off'
     This controls whether GDB will attempt to alter the values of
     registers, such as with assignment expressions in `print', or the
     `jump' command.  It defaults to `on'.

`show may-write-registers'
     Show the current permission to write registers.

`set may-write-memory on'
`set may-write-memory off'
     This controls whether GDB will attempt to alter the contents of
     memory, such as with assignment expressions in `print'.  It
     defaults to `on'.

`show may-write-memory'
     Show the current permission to write memory.

`set may-insert-breakpoints on'
`set may-insert-breakpoints off'
     This controls whether GDB will attempt to insert breakpoints.
     This affects all breakpoints, including internal breakpoints
     defined by GDB.  It defaults to `on'.

`show may-insert-breakpoints'
     Show the current permission to insert breakpoints.

`set may-insert-tracepoints on'
`set may-insert-tracepoints off'
     This controls whether GDB will attempt to insert (regular)
     tracepoints at the beginning of a tracing experiment.  It affects
     only non-fast tracepoints, fast tracepoints being under the
     control of `may-insert-fast-tracepoints'.  It defaults to `on'.

`show may-insert-tracepoints'
     Show the current permission to insert tracepoints.

`set may-insert-fast-tracepoints on'
`set may-insert-fast-tracepoints off'
     This controls whether GDB will attempt to insert fast tracepoints
     at the beginning of a tracing experiment.  It affects only fast
     tracepoints, regular (non-fast) tracepoints being under the
     control of `may-insert-tracepoints'.  It defaults to `on'.

`show may-insert-fast-tracepoints'
     Show the current permission to insert fast tracepoints.

`set may-interrupt on'
`set may-interrupt off'
     This controls whether GDB will attempt to interrupt or stop
     program execution.  When this variable is `off', the `interrupt'
     command will have no effect, nor will `Ctrl-c'. It defaults to
     `on'.

`show may-interrupt'
     Show the current permission to interrupt or stop the program.



File: gdb.info,  Node: Reverse Execution,  Next: Process Record and Replay,  Prev: Stopping,  Up: Top

6 Running programs backward
***************************

When you are debugging a program, it is not unusual to realize that you
have gone too far, and some event of interest has already happened.  If
the target environment supports it, GDB can allow you to "rewind" the
program by running it backward.

   A target environment that supports reverse execution should be able
to "undo" the changes in machine state that have taken place as the
program was executing normally.  Variables, registers etc. should
revert to their previous values.  Obviously this requires a great deal
of sophistication on the part of the target environment; not all target
environments can support reverse execution.

   When a program is executed in reverse, the instructions that have
most recently been executed are "un-executed", in reverse order.  The
program counter runs backward, following the previous thread of
execution in reverse.  As each instruction is "un-executed", the values
of memory and/or registers that were changed by that instruction are
reverted to their previous states.  After executing a piece of source
code in reverse, all side effects of that code should be "undone", and
all variables should be returned to their prior values(1).

   If you are debugging in a target environment that supports reverse
execution, GDB provides the following commands.

`reverse-continue [IGNORE-COUNT]'
`rc [IGNORE-COUNT]'
     Beginning at the point where your program last stopped, start
     executing in reverse.  Reverse execution will stop for breakpoints
     and synchronous exceptions (signals), just like normal execution.
     Behavior of asynchronous signals depends on the target environment.

`reverse-step [COUNT]'
     Run the program backward until control reaches the start of a
     different source line; then stop it, and return control to GDB.

     Like the `step' command, `reverse-step' will only stop at the
     beginning of a source line.  It "un-executes" the previously
     executed source line.  If the previous source line included calls
     to debuggable functions, `reverse-step' will step (backward) into
     the called function, stopping at the beginning of the _last_
     statement in the called function (typically a return statement).

     Also, as with the `step' command, if non-debuggable functions are
     called, `reverse-step' will run thru them backward without
     stopping.

`reverse-stepi [COUNT]'
     Reverse-execute one machine instruction.  Note that the instruction
     to be reverse-executed is _not_ the one pointed to by the program
     counter, but the instruction executed prior to that one.  For
     instance, if the last instruction was a jump, `reverse-stepi' will
     take you back from the destination of the jump to the jump
     instruction itself.

`reverse-next [COUNT]'
     Run backward to the beginning of the previous line executed in the
     current (innermost) stack frame.  If the line contains function
     calls, they will be "un-executed" without stopping.  Starting from
     the first line of a function, `reverse-next' will take you back to
     the caller of that function, _before_ the function was called,
     just as the normal `next' command would take you from the last
     line of a function back to its return to its caller (2).

`reverse-nexti [COUNT]'
     Like `nexti', `reverse-nexti' executes a single instruction in
     reverse, except that called functions are "un-executed" atomically.
     That is, if the previously executed instruction was a return from
     another function, `reverse-nexti' will continue to execute in
     reverse until the call to that function (from the current stack
     frame) is reached.

`reverse-finish'
     Just as the `finish' command takes you to the point where the
     current function returns, `reverse-finish' takes you to the point
     where it was called.  Instead of ending up at the end of the
     current function invocation, you end up at the beginning.

`set exec-direction'
     Set the direction of target execution.

`set exec-direction reverse'
     GDB will perform all execution commands in reverse, until the
     exec-direction mode is changed to "forward".  Affected commands
     include `step, stepi, next, nexti, continue, and finish'.  The
     `return' command cannot be used in reverse mode.

`set exec-direction forward'
     GDB will perform all execution commands in the normal fashion.
     This is the default.

   ---------- Footnotes ----------

   (1) Note that some side effects are easier to undo than others.  For
instance, memory and registers are relatively easy, but device I/O is
hard.  Some targets may be able undo things like device I/O, and some
may not.

   The contract between GDB and the reverse executing target requires
only that the target do something reasonable when GDB tells it to
execute backwards, and then report the results back to GDB.  Whatever
the target reports back to GDB, GDB will report back to the user.  GDB
assumes that the memory and registers that the target reports are in a
consistant state, but GDB accepts whatever it is given.

   (2) Unless the code is too heavily optimized.


File: gdb.info,  Node: Process Record and Replay,  Next: Stack,  Prev: Reverse Execution,  Up: Top

7 Recording Inferior's Execution and Replaying It
*************************************************

On some platforms, GDB provides a special "process record and replay"
target that can record a log of the process execution, and replay it
later with both forward and reverse execution commands.

   When this target is in use, if the execution log includes the record
for the next instruction, GDB will debug in "replay mode".  In the
replay mode, the inferior does not really execute code instructions.
Instead, all the events that normally happen during code execution are
taken from the execution log.  While code is not really executed in
replay mode, the values of registers (including the program counter
register) and the memory of the inferior are still changed as they
normally would.  Their contents are taken from the execution log.

   If the record for the next instruction is not in the execution log,
GDB will debug in "record mode".  In this mode, the inferior executes
normally, and GDB records the execution log for future replay.

   The process record and replay target supports reverse execution
(*note Reverse Execution::), even if the platform on which the inferior
runs does not.  However, the reverse execution is limited in this case
by the range of the instructions recorded in the execution log.  In
other words, reverse execution on platforms that don't support it
directly can only be done in the replay mode.

   When debugging in the reverse direction, GDB will work in replay
mode as long as the execution log includes the record for the previous
instruction; otherwise, it will work in record mode, if the platform
supports reverse execution, or stop if not.

   For architecture environments that support process record and replay,
GDB provides the following commands:

`target record'
     This command starts the process record and replay target.  The
     process record and replay target can only debug a process that is
     already running.  Therefore, you need first to start the process
     with the `run' or `start' commands, and then start the recording
     with the `target record' command.

     Both `record' and `rec' are aliases of `target record'.

     Displaced stepping (*note displaced stepping: Maintenance
     Commands.)  will be automatically disabled when process record and
     replay target is started.  That's because the process record and
     replay target doesn't support displaced stepping.

     If the inferior is in the non-stop mode (*note Non-Stop Mode::) or
     in the asynchronous execution mode (*note Background Execution::),
     the process record and replay target cannot be started because it
     doesn't support these two modes.

`record stop'
     Stop the process record and replay target.  When process record and
     replay target stops, the entire execution log will be deleted and
     the inferior will either be terminated, or will remain in its
     final state.

     When you stop the process record and replay target in record mode
     (at the end of the execution log), the inferior will be stopped at
     the next instruction that would have been recorded.  In other
     words, if you record for a while and then stop recording, the
     inferior process will be left in the same state as if the
     recording never happened.

     On the other hand, if the process record and replay target is
     stopped while in replay mode (that is, not at the end of the
     execution log, but at some earlier point), the inferior process
     will become "live" at that earlier state, and it will then be
     possible to continue the usual "live" debugging of the process
     from that state.

     When the inferior process exits, or GDB detaches from it, process
     record and replay target will automatically stop itself.

`record save FILENAME'
     Save the execution log to a file `FILENAME'.  Default filename is
     `gdb_record.PROCESS_ID', where PROCESS_ID is the process ID of the
     inferior.

`record restore FILENAME'
     Restore the execution log from a file `FILENAME'.  File must have
     been created with `record save'.

`set record insn-number-max LIMIT'
     Set the limit of instructions to be recorded.  Default value is
     200000.

     If LIMIT is a positive number, then GDB will start deleting
     instructions from the log once the number of the record
     instructions becomes greater than LIMIT.  For every new recorded
     instruction, GDB will delete the earliest recorded instruction to
     keep the number of recorded instructions at the limit.  (Since
     deleting recorded instructions loses information, GDB lets you
     control what happens when the limit is reached, by means of the
     `stop-at-limit' option, described below.)

     If LIMIT is zero, GDB will never delete recorded instructions from
     the execution log.  The number of recorded instructions is
     unlimited in this case.

`show record insn-number-max'
     Show the limit of instructions to be recorded.

`set record stop-at-limit'
     Control the behavior when the number of recorded instructions
     reaches the limit.  If ON (the default), GDB will stop when the
     limit is reached for the first time and ask you whether you want
     to stop the inferior or continue running it and recording the
     execution log.  If you decide to continue recording, each new
     recorded instruction will cause the oldest one to be deleted.

     If this option is OFF, GDB will automatically delete the oldest
     record to make room for each new one, without asking.

`show record stop-at-limit'
     Show the current setting of `stop-at-limit'.

`set record memory-query'
     Control the behavior when GDB is unable to record memory changes
     caused by an instruction.  If ON, GDB will query whether to stop
     the inferior in that case.

     If this option is OFF (the default), GDB will automatically ignore
     the effect of such instructions on memory.  Later, when GDB
     replays this execution log, it will mark the log of this
     instruction as not accessible, and it will not affect the replay
     results.

`show record memory-query'
     Show the current setting of `memory-query'.

`info record'
     Show various statistics about the state of process record and its
     in-memory execution log buffer, including:

        * Whether in record mode or replay mode.

        * Lowest recorded instruction number (counting from when the
          current execution log started recording instructions).

        * Highest recorded instruction number.

        * Current instruction about to be replayed (if in replay mode).

        * Number of instructions contained in the execution log.

        * Maximum number of instructions that may be contained in the
          execution log.

`record delete'
     When record target runs in replay mode ("in the past"), delete the
     subsequent execution log and begin to record a new execution log
     starting from the current address.  This means you will abandon
     the previously recorded "future" and begin recording a new
     "future".


File: gdb.info,  Node: Stack,  Next: Source,  Prev: Process Record and Replay,  Up: Top

8 Examining the Stack
*********************

When your program has stopped, the first thing you need to know is
where it stopped and how it got there.

   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 "stack frame".  The stack frames are allocated
in a region of memory called the "call stack".

   When your program stops, the GDB commands for examining the stack
allow you to see all of this information.

   One of the stack frames is "selected" by GDB and many GDB commands
refer implicitly to the selected frame.  In particular, whenever you
ask GDB for the value of a variable in your program, the value is found
in the selected frame.  There are special GDB commands to select
whichever frame you are interested in.  *Note Selecting a Frame:
Selection.

   When your program stops, GDB automatically selects the currently
executing frame and describes it briefly, similar to the `frame'
command (*note Information about a Frame: Frame Info.).

* Menu:

* Frames::                      Stack frames
* Backtrace::                   Backtraces
* Selection::                   Selecting a frame
* Frame Info::                  Information on a frame


File: gdb.info,  Node: Frames,  Next: Backtrace,  Up: Stack

8.1 Stack Frames
================

The call stack is divided up into contiguous pieces called "stack
frames", or "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.

   When your program is started, the stack has only one frame, that of
the function `main'.  This is called the "initial" frame or the
"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 "innermost" frame.  This
is the most recently created of all the stack frames that still exist.

   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 "frame pointer register" (*note $fp:
Registers.) while execution is going on in that frame.

   GDB 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 GDB to give you a way of designating stack frames in GDB
commands.

   Some compilers provide a way to compile functions so that they
operate without stack frames.  (For example, the GCC option
     `-fomit-frame-pointer'
   generates functions without a frame.)  This is occasionally done
with heavily used library functions to save the frame setup time.  GDB
has limited facilities for dealing with these function invocations.  If
the innermost function invocation has no stack frame, GDB nevertheless
regards it as though it had a separate frame, which is numbered zero as
usual, allowing correct tracing of the function call chain.  However,
GDB has no provision for frameless functions elsewhere in the stack.

`frame ARGS'
     The `frame' command allows you to move from one stack frame to
     another, and to print the stack frame you select.  ARGS may be
     either the address of the frame or the stack frame number.
     Without an argument, `frame' prints the current stack frame.

`select-frame'
     The `select-frame' command allows you to move from one stack frame
     to another without printing the frame.  This is the silent version
     of `frame'.


File: gdb.info,  Node: Backtrace,  Next: Selection,  Prev: Frames,  Up: Stack

8.2 Backtraces
==============

A backtrace is a summary of how your program got where it is.  It shows
one line per frame, for many frames, starting with the currently
executing frame (frame zero), followed by its caller (frame one), and
on up the stack.

`backtrace'
`bt'
     Print a backtrace of the entire stack: one line per frame for all
     frames in the stack.

     You can stop the backtrace at any time by typing the system
     interrupt character, normally `Ctrl-c'.

`backtrace N'
`bt N'
     Similar, but print only the innermost N frames.

`backtrace -N'
`bt -N'
     Similar, but print only the outermost N frames.

`backtrace full'
`bt full'
`bt full N'
`bt full -N'
     Print the values of the local variables also.  N specifies the
     number of frames to print, as described above.

   The names `where' and `info stack' (abbreviated `info s') are
additional aliases for `backtrace'.

   In a multi-threaded program, GDB by default shows the backtrace only
for the current thread.  To display the backtrace for several or all of
the threads, use the command `thread apply' (*note thread apply:
Threads.).  For example, if you type `thread apply all backtrace', GDB
will display the backtrace for all the threads; this is handy when you
debug a core dump of a multi-threaded program.

   Each line in the backtrace shows the frame number and the function
name.  The program counter value is also shown--unless you use `set
print address off'.  The backtrace also shows the source file name and
line number, as well as the arguments to the function.  The program
counter value is omitted if it is at the beginning of the code for that
line number.

   Here is an example of a backtrace.  It was made with the command `bt
3', so it shows the innermost three frames.

     #0  m4_traceon (obs=0x24eb0, argc=1, argv=0x2b8c8)
         at builtin.c:993
     #1  0x6e38 in expand_macro (sym=0x2b600, data=...) at macro.c:242
     #2  0x6840 in expand_token (obs=0x0, t=177664, td=0xf7fffb08)
         at macro.c:71
     (More stack frames follow...)

The display for frame zero does not begin with a program counter value,
indicating that your program has stopped at the beginning of the code
for line `993' of `builtin.c'.

The value of parameter `data' in frame 1 has been replaced by `...'.
By default, GDB prints the value of a parameter only if it is a scalar
(integer, pointer, enumeration, etc).  See command `set print
frame-arguments' in *note Print Settings:: for more details on how to
configure the way function parameter values are printed.

   If your program was compiled with optimizations, some compilers will
optimize away arguments passed to functions if those arguments are
never used after the call.  Such optimizations generate code that
passes arguments through registers, but doesn't store those arguments
in the stack frame.  GDB has no way of displaying such arguments in
stack frames other than the innermost one.  Here's what such a
backtrace might look like:

     #0  m4_traceon (obs=0x24eb0, argc=1, argv=0x2b8c8)
         at builtin.c:993
     #1  0x6e38 in expand_macro (sym=<optimized out>) at macro.c:242
     #2  0x6840 in expand_token (obs=0x0, t=<optimized out>, td=0xf7fffb08)
         at macro.c:71
     (More stack frames follow...)

The values of arguments that were not saved in their stack frames are
shown as `<optimized out>'.

   If you need to display the values of such optimized-out arguments,
either deduce that from other variables whose values depend on the one
you are interested in, or recompile without optimizations.

   Most programs have a standard user entry point--a place where system
libraries and startup code transition into user code.  For C this is
`main'(1).  When GDB finds the entry function in a backtrace it will
terminate the backtrace, to avoid tracing into highly system-specific
(and generally uninteresting) code.

   If you need to examine the startup code, or limit the number of
levels in a backtrace, you can change this behavior:

`set backtrace past-main'
`set backtrace past-main on'
     Backtraces will continue past the user entry point.

`set backtrace past-main off'
     Backtraces will stop when they encounter the user entry point.
     This is the default.

`show backtrace past-main'
     Display the current user entry point backtrace policy.

`set backtrace past-entry'
`set backtrace past-entry on'
     Backtraces will continue past the internal entry point of an
     application.  This entry point is encoded by the linker when the
     application is built, and is likely before the user entry point
     `main' (or equivalent) is called.

`set backtrace past-entry off'
     Backtraces will stop when they encounter the internal entry point
     of an application.  This is the default.

`show backtrace past-entry'
     Display the current internal entry point backtrace policy.

`set backtrace limit N'
`set backtrace limit 0'
     Limit the backtrace to N levels.  A value of zero means unlimited.

`show backtrace limit'
     Display the current limit on backtrace levels.

   ---------- Footnotes ----------

   (1) Note that embedded programs (the so-called "free-standing"
environment) are not required to have a `main' function as the entry
point.  They could even have multiple entry points.


File: gdb.info,  Node: Selection,  Next: Frame Info,  Prev: Backtrace,  Up: Stack

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

`frame N'
`f N'
     Select frame number 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 `main'.

`frame ADDR'
`f ADDR'
     Select the frame at address ADDR.  This is useful mainly if the
     chaining of stack frames has been damaged by a bug, making it
     impossible for GDB 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, `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.

`up N'
     Move N frames up the stack.  For positive numbers N, this advances
     toward the outermost frame, to higher frame numbers, to frames
     that have existed longer.  N defaults to one.

`down N'
     Move N frames down the stack.  For positive numbers N, this
     advances toward the innermost frame, to lower frame numbers, to
     frames that were created more recently.  N defaults to one.  You
     may abbreviate `down' as `do'.

   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.

   For example:

     (gdb) up
     #1  0x22f0 in main (argc=1, argv=0xf7fffbf4, env=0xf7fffbfc)
         at env.c:10
     10              read_input_file (argv[i]);

   After such a printout, the `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 `edit'.  *Note Printing Source Lines: List,
for details.

`up-silently N'
`down-silently N'
     These two commands are variants of `up' and `down', respectively;
     they differ in that they do their work silently, without causing
     display of the new frame.  They are intended primarily for use in
     GDB command scripts, where the output might be unnecessary and
     distracting.


File: gdb.info,  Node: Frame Info,  Prev: Selection,  Up: Stack

8.4 Information About a Frame
=============================

There are several other commands to print information about the selected
stack frame.

`frame'
`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 `f'.  With an
     argument, this command is used to select a stack frame.  *Note
     Selecting a Frame: Selection.

`info frame'
`info f'
     This command prints a verbose description of the selected stack
     frame, including:

        * the address of the frame

        * the address of the next frame down (called by this frame)

        * the address of the next frame up (caller of this frame)

        * the language in which the source code corresponding to this
          frame is written

        * the address of the frame's arguments

        * the address of the frame's local variables

        * the program counter saved in it (the address of execution in
          the caller frame)

        * which registers were saved in the frame

     The verbose description is useful when something has gone wrong
     that has made the stack format fail to fit the usual conventions.

`info frame ADDR'
`info f ADDR'
     Print a verbose description of the frame at address 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 `frame' command.
     *Note Selecting a Frame: Selection.

`info args'
     Print the arguments of the selected frame, each on a separate line.

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

`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
     `up', `down', or `frame' commands); then type `info catch'.  *Note
     Setting Catchpoints: Set Catchpoints.



File: gdb.info,  Node: Source,  Next: Data,  Prev: Stack,  Up: Top

9 Examining Source Files
************************

GDB can print parts of your program's source, since the debugging
information recorded in the program tells GDB what source files were
used to build it.  When your program stops, GDB spontaneously prints
the line where it stopped.  Likewise, when you select a stack frame
(*note Selecting a Frame: Selection.), GDB prints the line where
execution in that frame has stopped.  You can print other portions of
source files by explicit command.

   If you use GDB through its GNU Emacs interface, you may prefer to
use Emacs facilities to view source; see *note Using GDB under GNU
Emacs: Emacs.

* Menu:

* List::                        Printing source lines
* Specify Location::            How to specify code locations
* Edit::                        Editing source files
* Search::                      Searching source files
* Source Path::                 Specifying source directories
* Machine Code::                Source and machine code


File: gdb.info,  Node: List,  Next: Specify Location,  Up: Source

9.1 Printing Source Lines
=========================

To print lines from a source file, use the `list' command (abbreviated
`l').  By default, ten lines are printed.  There are several ways to
specify what part of the file you want to print; see *note Specify
Location::, for the full list.

   Here are the forms of the `list' command most commonly used:

`list LINENUM'
     Print lines centered around line number LINENUM in the current
     source file.

`list FUNCTION'
     Print lines centered around the beginning of function FUNCTION.

`list'
     Print more lines.  If the last lines printed were printed with a
     `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 (*note Examining the
     Stack: Stack.), this prints lines centered around that line.

`list -'
     Print lines just before the lines last printed.

   By default, GDB prints ten source lines with any of these forms of
the `list' command.  You can change this using `set listsize':

`set listsize COUNT'
     Make the `list' command display COUNT source lines (unless the
     `list' argument explicitly specifies some other number).

`show listsize'
     Display the number of lines that `list' prints.

   Repeating a `list' command with <RET> discards the argument, so it
is equivalent to typing just `list'.  This is more useful than listing
the same lines again.  An exception is made for an argument of `-';
that argument is preserved in repetition so that each repetition moves
up in the source file.

   In general, the `list' command expects you to supply zero, one or two
"linespecs".  Linespecs specify source lines; there are several ways of
writing them (*note Specify Location::), but the effect is always to
specify some source line.

   Here is a complete description of the possible arguments for `list':

`list LINESPEC'
     Print lines centered around the line specified by LINESPEC.

`list FIRST,LAST'
     Print lines from FIRST to LAST.  Both arguments are linespecs.
     When a `list' command has two linespecs, and the source file of
     the second linespec is omitted, this refers to the same source
     file as the first linespec.

`list ,LAST'
     Print lines ending with LAST.

`list FIRST,'
     Print lines starting with FIRST.

`list +'
     Print lines just after the lines last printed.

`list -'
     Print lines just before the lines last printed.

`list'
     As described in the preceding table.


File: gdb.info,  Node: Specify Location,  Next: Edit,  Prev: List,  Up: Source

9.2 Specifying a Location
=========================

Several GDB commands accept arguments that specify a location of your
program's code.  Since GDB is a source-level debugger, a location
usually specifies some line in the source code; for that reason,
locations are also known as "linespecs".

   Here are all the different ways of specifying a code location that
GDB understands:

`LINENUM'
     Specifies the line number LINENUM of the current source file.

`-OFFSET'
`+OFFSET'
     Specifies the line OFFSET lines before or after the "current
     line".  For the `list' command, the current line is the last one
     printed; for the breakpoint commands, this is the line at which
     execution stopped in the currently selected "stack frame" (*note
     Frames: Frames, for a description of stack frames.)  When used as
     the second of the two linespecs in a `list' command, this
     specifies the line OFFSET lines up or down from the first linespec.

`FILENAME:LINENUM'
     Specifies the line LINENUM in the source file FILENAME.

`FUNCTION'
     Specifies the line that begins the body of the function FUNCTION.
     For example, in C, this is the line with the open brace.

`FUNCTION:LABEL'
     Specifies the line where LABEL appears in FUNCTION.

`FILENAME:FUNCTION'
     Specifies the line that begins the body of the function FUNCTION
     in the file FILENAME.  You only need the file name with a function
     name to avoid ambiguity when there are identically named functions
     in different source files.

`LABEL'
     Specifies the line at which the label named LABEL appears.  GDB
     searches for the label in the function corresponding to the
     currently selected stack frame.  If there is no current selected
     stack frame (for instance, if the inferior is not running), then
     GDB will not search for a label.

`*ADDRESS'
     Specifies the program address ADDRESS.  For line-oriented
     commands, such as `list' and `edit', this specifies a source line
     that contains ADDRESS.  For `break' and other breakpoint oriented
     commands, this can be used to set breakpoints in parts of your
     program which do not have debugging information or source files.

     Here ADDRESS may be any expression valid in the current working
     language (*note working language: Languages.) that specifies a code
     address.  In addition, as a convenience, GDB extends the semantics
     of expressions used in locations to cover the situations that
     frequently happen during debugging.  Here are the various forms of
     ADDRESS:

    `EXPRESSION'
          Any expression valid in the current working language.

    `FUNCADDR'
          An address of a function or procedure derived from its name.
          In C, C++, Java, Objective-C, Fortran, minimal, and assembly,
          this is simply the function's name FUNCTION (and actually a
          special case of a valid expression).  In Pascal and Modula-2,
          this is `&FUNCTION'.  In Ada, this is `FUNCTION'Address'
          (although the Pascal form also works).

          This form specifies the address of the function's first
          instruction, before the stack frame and arguments have been
          set up.

    `'FILENAME'::FUNCADDR'
          Like FUNCADDR above, but also specifies the name of the source
          file explicitly.  This is useful if the name of the function
          does not specify the function unambiguously, e.g., if there
          are several functions with identical names in different
          source files.



File: gdb.info,  Node: Edit,  Next: Search,  Prev: Specify Location,  Up: Source

9.3 Editing Source Files
========================

To edit the lines in a source file, use the `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:

`edit LOCATION'
     Edit the source file specified by `location'.  Editing starts at
     that LOCATION, e.g., at the specified source line of the specified
     file.  *Note Specify Location::, for all the possible forms of the
     LOCATION argument; here are the forms of the `edit' command most
     commonly used:

    `edit NUMBER'
          Edit the current source file with NUMBER as the active line
          number.

    `edit FUNCTION'
          Edit the file containing FUNCTION at the beginning of its
          definition.


9.3.1 Choosing your Editor
--------------------------

You can customize GDB to use any editor you want (1).  By default, it
is `/bin/ex', but you can change this by setting the environment
variable `EDITOR' before using GDB.  For example, to configure GDB to
use the `vi' editor, you could use these commands with the `sh' shell:
     EDITOR=/usr/bin/vi
     export EDITOR
     gdb ...
   or in the `csh' shell,
     setenv EDITOR /usr/bin/vi
     gdb ...

   ---------- Footnotes ----------

   (1) The only restriction is that your editor (say `ex'), recognizes
the following command-line syntax:
     ex +NUMBER file
   The optional numeric value +NUMBER specifies the number of the line
in the file where to start editing.


File: gdb.info,  Node: Search,  Next: Source Path,  Prev: Edit,  Up: Source

9.4 Searching Source Files
==========================

There are two commands for searching through the current source file
for a regular expression.

`forward-search REGEXP'
`search REGEXP'
     The command `forward-search REGEXP' checks each line, starting
     with the one following the last line listed, for a match for
     REGEXP.  It lists the line that is found.  You can use the synonym
     `search REGEXP' or abbreviate the command name as `fo'.

`reverse-search REGEXP'
     The command `reverse-search REGEXP' checks each line, starting
     with the one before the last line listed and going backward, for a
     match for REGEXP.  It lists the line that is found.  You can
     abbreviate this command as `rev'.


File: gdb.info,  Node: Source Path,  Next: Machine Code,  Prev: Search,  Up: Source

9.5 Specifying Source Directories
=================================

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.  GDB has a list of directories to search for
source files; this is called the "source path".  Each time GDB wants a
source file, it tries all the directories in the list, in the order
they are present in the list, until it finds a file with the desired
name.

   For example, suppose an executable references the file
`/usr/src/foo-1.0/lib/foo.c', and our source path is `/mnt/cross'.  The
file is first looked up literally; if this fails,
`/mnt/cross/usr/src/foo-1.0/lib/foo.c' is tried; if this fails,
`/mnt/cross/foo.c' is opened; if this fails, an error message is
printed.  GDB does not look up the parts of the source file name, such
as `/mnt/cross/src/foo-1.0/lib/foo.c'.  Likewise, the subdirectories of
the source path are not searched: if the source path is `/mnt/cross',
and the binary refers to `foo.c', GDB would not find it under
`/mnt/cross/usr/src/foo-1.0/lib'.

   Plain file names, relative file names with leading directories, file
names containing dots, etc. are all treated as described above; for
instance, if the source path is `/mnt/cross', and the source file is
recorded as `../lib/foo.c', GDB would first try `../lib/foo.c', then
`/mnt/cross/../lib/foo.c', and after that--`/mnt/cross/foo.c'.

   Note that the executable search path is _not_ used to locate the
source files.

   Whenever you reset or rearrange the source path, GDB clears out any
information it has cached about where source files are found and where
each line is in the file.

   When you start GDB, its source path includes only `cdir' and `cwd',
in that order.  To add other directories, use the `directory' command.

   The search path is used to find both program source files and GDB
script files (read using the `-command' option and `source' command).

   In addition to the source path, GDB provides a set of commands that
manage a list of source path substitution rules.  A "substitution rule"
specifies how to rewrite source directories stored in the program's
debug information in case the sources were moved to a different
directory between compilation and debugging.  A rule is made of two
strings, the first specifying what needs to be rewritten in the path,
and the second specifying how it should be rewritten.  In *note set
substitute-path::, we name these two parts FROM and TO respectively.
GDB does a simple string replacement of FROM with TO at the start of
the directory part of the source file name, and uses that result
instead of the original file name to look up the sources.

   Using the previous example, suppose the `foo-1.0' tree has been
moved from `/usr/src' to `/mnt/cross', then you can tell GDB to replace
`/usr/src' in all source path names with `/mnt/cross'.  The first
lookup will then be `/mnt/cross/foo-1.0/lib/foo.c' in place of the
original location of `/usr/src/foo-1.0/lib/foo.c'.  To define a source
path substitution rule, use the `set substitute-path' command (*note
set substitute-path::).

   To avoid unexpected substitution results, a rule is applied only if
the FROM part of the directory name ends at a directory separator.  For
instance, a rule substituting  `/usr/source' into `/mnt/cross' will be
applied to `/usr/source/foo-1.0' but not to `/usr/sourceware/foo-2.0'.
And because the substitution is applied only at the beginning of the
directory name, this rule will not be applied to
`/root/usr/source/baz.c' either.

   In many cases, you can achieve the same result using the `directory'
command.  However, `set substitute-path' can be more efficient in the
case where the sources are organized in a complex tree with multiple
subdirectories.  With the `directory' command, you need to add each
subdirectory of your project.  If you moved the entire tree while
preserving its internal organization, then `set substitute-path' allows
you to direct the debugger to all the sources with one single command.

   `set substitute-path' is also more than just a shortcut command.
The source path is only used if the file at the original location no
longer exists.  On the other hand, `set substitute-path' modifies the
debugger behavior to look at the rewritten location instead.  So, if
for any reason a source file that is not relevant to your executable is
located at the original location, a substitution rule is the only
method available to point GDB at the new location.

   You can configure a default source path substitution rule by
configuring GDB with the `--with-relocated-sources=DIR' option.  The DIR
should be the name of a directory under GDB's configured prefix (set
with `--prefix' or `--exec-prefix'), and directory names in debug
information under DIR will be adjusted automatically if the installed
GDB is moved to a new location.  This is useful if GDB, libraries or
executables with debug information and corresponding source code are
being moved together.

`directory DIRNAME ...'

`dir DIRNAME ...'
     Add directory DIRNAME to the front of the source path.  Several
     directory names may be given to this command, separated by `:'
     (`;' on MS-DOS and MS-Windows, where `:' 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 GDB searches it sooner.

     You can use the string `$cdir' to refer to the compilation
     directory (if one is recorded), and `$cwd' to refer to the current
     working directory.  `$cwd' is not the same as `.'--the former
     tracks the current working directory as it changes during your GDB
     session, while the latter is immediately expanded to the current
     directory at the time you add an entry to the source path.

`directory'
     Reset the source path to its default value (`$cdir:$cwd' on Unix
     systems).  This requires confirmation.

`set directories PATH-LIST'
     Set the source path to PATH-LIST.  `$cdir:$cwd' are added if
     missing.

`show directories'
     Print the source path: show which directories it contains.

`set substitute-path FROM TO'
     Define a source path substitution rule, and add it at the end of
     the current list of existing substitution rules.  If a rule with
     the same FROM was already defined, then the old rule is also
     deleted.

     For example, if the file `/foo/bar/baz.c' was moved to
     `/mnt/cross/baz.c', then the command

          (gdb) set substitute-path /usr/src /mnt/cross

     will tell GDB to replace `/usr/src' with `/mnt/cross', which will
     allow GDB to find the file `baz.c' even though it was moved.

     In the case when more than one substitution rule have been defined,
     the rules are evaluated one by one in the order where they have
     been defined.  The first one matching, if any, is selected to
     perform the substitution.

     For instance, if we had entered the following commands:

          (gdb) set substitute-path /usr/src/include /mnt/include
          (gdb) set substitute-path /usr/src /mnt/src

     GDB would then rewrite `/usr/src/include/defs.h' into
     `/mnt/include/defs.h' by using the first rule.  However, it would
     use the second rule to rewrite `/usr/src/lib/foo.c' into
     `/mnt/src/lib/foo.c'.

`unset substitute-path [path]'
     If a path is specified, search the current list of substitution
     rules for a rule that would rewrite that path.  Delete that rule
     if found.  A warning is emitted by the debugger if no rule could
     be found.

     If no path is specified, then all substitution rules are deleted.

`show substitute-path [path]'
     If a path is specified, then print the source path substitution
     rule which would rewrite that path, if any.

     If no path is specified, then print all existing source path
     substitution rules.


   If your source path is cluttered with directories that are no longer
of interest, GDB may sometimes cause confusion by finding the wrong
versions of source.  You can correct the situation as follows:

  1. Use `directory' with no argument to reset the source path to its
     default value.

  2. Use `directory' with suitable arguments to reinstall the
     directories you want in the source path.  You can add all the
     directories in one command.


File: gdb.info,  Node: Machine Code,  Prev: Source Path,  Up: Source

9.6 Source and Machine Code
===========================

You can use the command `info line' to map source lines to program
addresses (and vice versa), and the command `disassemble' to display a
range of addresses as machine instructions.  You can use the command
`set disassemble-next-line' to set whether to disassemble next source
line when execution stops.  When run under GNU Emacs mode, the `info
line' command causes the arrow to point to the line specified.  Also,
`info line' prints addresses in symbolic form as well as hex.

`info line LINESPEC'
     Print the starting and ending addresses of the compiled code for
     source line LINESPEC.  You can specify source lines in any of the
     ways documented in *note Specify Location::.

   For example, we can use `info line' to discover the location of the
object code for the first line of function `m4_changequote':

     (gdb) info line m4_changequote
     Line 895 of "builtin.c" starts at pc 0x634c and ends at 0x6350.

We can also inquire (using `*ADDR' as the form for LINESPEC) what
source line covers a particular address:
     (gdb) info line *0x63ff
     Line 926 of "builtin.c" starts at pc 0x63e4 and ends at 0x6404.

   After `info line', the default address for the `x' command is
changed to the starting address of the line, so that `x/i' is
sufficient to begin examining the machine code (*note Examining Memory:
Memory.).  Also, this address is saved as the value of the convenience
variable `$_' (*note Convenience Variables: Convenience Vars.).

`disassemble'
`disassemble /m'
`disassemble /r'
     This specialized command dumps a range of memory as machine
     instructions.  It can also print mixed source+disassembly by
     specifying the `/m' modifier and print the raw instructions in hex
     as well as in symbolic form by specifying the `/r'.  The default
     memory range is the function surrounding the program counter of
     the selected frame.  A single argument to this command is a
     program counter value; GDB dumps the function surrounding this
     value.  When two arguments are given, they should be separated by
     a comma, possibly surrounded by whitespace.  The arguments specify
     a range of addresses to dump, in one of two forms:

    `START,END'
          the addresses from START (inclusive) to END (exclusive)

    `START,+LENGTH'
          the addresses from START (inclusive) to `START+LENGTH'
          (exclusive).

     When 2 arguments are specified, the name of the function is also
     printed (since there could be several functions in the given
     range).

     The argument(s) can be any expression yielding a numeric value,
     such as `0x32c4', `&main+10' or `$pc - 8'.

     If the range of memory being disassembled contains current program
     counter, the instruction at that location is shown with a `=>'
     marker.

   The following example shows the disassembly of a range of addresses
of HP PA-RISC 2.0 code:

     (gdb) 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.

   Here is an example showing mixed source+assembly for Intel x86, when
the program is stopped just after function prologue:

     (gdb) disas /m main
     Dump of assembler code for function main:
     5       {
        0x08048330 <+0>:    push   %ebp
        0x08048331 <+1>:    mov    %esp,%ebp
        0x08048333 <+3>:    sub    $0x8,%esp
        0x08048336 <+6>:    and    $0xfffffff0,%esp
        0x08048339 <+9>:    sub    $0x10,%esp

     6         printf ("Hello.\n");
     => 0x0804833c <+12>:   movl   $0x8048440,(%esp)
        0x08048343 <+19>:   call   0x8048284 <puts@plt>

     7         return 0;
     8       }
        0x08048348 <+24>:   mov    $0x0,%eax
        0x0804834d <+29>:   leave
        0x0804834e <+30>:   ret

     End of assembler dump.

   Here is another example showing raw instructions in hex for AMD
x86-64,

     (gdb) disas /r 0x400281,+10
     Dump of assembler code from 0x400281 to 0x40028b:
        0x0000000000400281:  38 36  cmp    %dh,(%rsi)
        0x0000000000400283:  2d 36 34 2e 73 sub    $0x732e3436,%eax
        0x0000000000400288:  6f     outsl  %ds:(%rsi),(%dx)
        0x0000000000400289:  2e 32 00       xor    %cs:(%rax),%al
     End of assembler dump.

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

   For programs that were dynamically linked and use shared libraries,
instructions that call functions or branch to locations in the shared
libraries might show a seemingly bogus location--it's actually a
location of the relocation table.  On some architectures, GDB might be
able to resolve these to actual function names.

`set disassembly-flavor INSTRUCTION-SET'
     Select the instruction set to use when disassembling the program
     via the `disassemble' or `x/i' commands.

     Currently this command is only defined for the Intel x86 family.
     You can set INSTRUCTION-SET to either `intel' or `att'.  The
     default is `att', the AT&T flavor used by default by Unix
     assemblers for x86-based targets.

`show disassembly-flavor'
     Show the current setting of the disassembly flavor.

`set disassemble-next-line'
`show disassemble-next-line'
     Control whether or not GDB will disassemble the next source line
     or instruction when execution stops.  If ON, GDB will display
     disassembly of the next source line when execution of the program
     being debugged stops.  This is _in addition_ to displaying the
     source line itself, which GDB always does if possible.  If the
     next source line cannot be displayed for some reason (e.g., if GDB
     cannot find the source file, or there's no line info in the debug
     info), GDB will display disassembly of the next _instruction_
     instead of showing the next source line.  If AUTO, GDB will
     display disassembly of next instruction only if the source line
     cannot be displayed.  This setting causes GDB to display some
     feedback when you step through a function with no line info or
     whose source file is unavailable.  The default is OFF, which means
     never display the disassembly of the next line or instruction.


File: gdb.info,  Node: Data,  Next: Optimized Code,  Prev: Source,  Up: Top

10 Examining Data
*****************

The usual way to examine data in your program is with the `print'
command (abbreviated `p'), or its synonym `inspect'.  It evaluates and
prints the value of an expression of the language your program is
written in (*note Using GDB with Different Languages: Languages.).  It
may also print the expression using a Python-based pretty-printer
(*note Pretty Printing::).

`print EXPR'
`print /F EXPR'
     EXPR is an expression (in the source language).  By default the
     value of EXPR is printed in a format appropriate to its data type;
     you can choose a different format by specifying `/F', where F is a
     letter specifying the format; see *note Output Formats: Output
     Formats.

`print'
`print /F'
     If you omit EXPR, GDB displays the last value again (from the
     "value history"; *note Value History: Value History.).  This
     allows you to conveniently inspect the same value in an
     alternative format.

   A more low-level way of examining data is with the `x' command.  It
examines data in memory at a specified address and prints it in a
specified format.  *Note Examining Memory: Memory.

   If you are interested in information about types, or about how the
fields of a struct or a class are declared, use the `ptype EXP' command
rather than `print'.  *Note Examining the Symbol Table: Symbols.

* Menu:

* Expressions::                 Expressions
* Ambiguous Expressions::       Ambiguous Expressions
* Variables::                   Program variables
* Arrays::                      Artificial arrays
* Output Formats::              Output formats
* Memory::                      Examining memory
* Auto Display::                Automatic display
* Print Settings::              Print settings
* Pretty Printing::             Python pretty printing
* Value History::               Value history
* Convenience Vars::            Convenience variables
* Registers::                   Registers
* Floating Point Hardware::     Floating point hardware
* Vector Unit::                 Vector Unit
* OS Information::              Auxiliary data provided by operating system
* Memory Region Attributes::    Memory region attributes
* Dump/Restore Files::          Copy between memory and a file
* Core File Generation::        Cause a program dump its core
* Character Sets::              Debugging programs that use a different
                                character set than GDB does
* Caching Remote Data::         Data caching for remote targets
* Searching Memory::            Searching memory for a sequence of bytes


File: gdb.info,  Node: Expressions,  Next: Ambiguous Expressions,  Up: Data

10.1 Expressions
================

`print' and many other GDB commands accept an expression and compute
its value.  Any kind of constant, variable or operator defined by the
programming language you are using is valid in an expression in GDB.
This includes conditional expressions, function calls, casts, and
string constants.  It also includes preprocessor macros, if you
compiled your program to include this information; see *note
Compilation::.

   GDB supports array constants in expressions input by the user.  The
syntax is {ELEMENT, ELEMENT...}.  For example, you can use the command
`print {1, 2, 3}' to create an array of three integers.  If you pass an
array to a function or assign it to a program variable, GDB copies the
array to memory that is `malloc'ed in the target program.

   Because C is so widespread, most of the expressions shown in
examples in this manual are in C.  *Note Using GDB with Different
Languages: Languages, for information on how to use expressions in other
languages.

   In this section, we discuss operators that you can use in GDB
expressions regardless of your programming language.

   Casts are supported in all languages, not just in C, because it is so
useful to cast a number into a pointer in order to examine a structure
at that address in memory.

   GDB supports these operators, in addition to those common to
programming languages:

`@'
     `@' is a binary operator for treating parts of memory as arrays.
     *Note Artificial Arrays: Arrays, for more information.

`::'
     `::' allows you to specify a variable in terms of the file or
     function where it is defined.  *Note Program Variables: Variables.

`{TYPE} ADDR'
     Refers to an object of type TYPE stored at address ADDR in memory.
     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 ADDR.


File: gdb.info,  Node: Ambiguous Expressions,  Next: Variables,  Prev: Expressions,  Up: Data

10.2 Ambiguous Expressions
==========================

Expressions can sometimes contain some ambiguous elements.  For
instance, some programming languages (notably Ada, C++ and Objective-C)
permit a single function name to be defined several times, for
application in different contexts.  This is called "overloading".
Another example involving Ada is generics.  A "generic package" is
similar to C++ templates and is typically instantiated several times,
resulting in the same function name being defined in different contexts.

   In some cases and depending on the language, it is possible to adjust
the expression to remove the ambiguity.  For instance in C++, you can
specify the signature of the function you want to break on, as in
`break FUNCTION(TYPES)'.  In Ada, using the fully qualified name of
your function often makes the expression unambiguous as well.

   When an ambiguity that needs to be resolved is detected, the debugger
has the capability to display a menu of numbered choices for each
possibility, and then waits for the selection with the prompt `>'.  The
first option is always `[0] cancel', and typing `0 <RET>' aborts the
current command.  If the command in which the expression was used
allows more than one choice to be selected, the next option in the menu
is `[1] all', and typing `1 <RET>' selects all possible choices.

   For example, the following session excerpt shows an attempt to set a
breakpoint at the overloaded symbol `String::after'.  We choose three
particular definitions of that function name:

     (gdb) 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.
     (gdb)

`set multiple-symbols MODE'
     This option allows you to adjust the debugger behavior when an
     expression is ambiguous.

     By default, MODE is set to `all'.  If the command with which the
     expression is used allows more than one choice, then GDB
     automatically selects all possible choices.  For instance,
     inserting a breakpoint on a function using an ambiguous name
     results in a breakpoint inserted on each possible match.  However,
     if a unique choice must be made, then GDB uses the menu to help
     you disambiguate the expression.  For instance, printing the
     address of an overloaded function will result in the use of the
     menu.

     When MODE is set to `ask', the debugger always uses the menu when
     an ambiguity is detected.

     Finally, when MODE is set to `cancel', the debugger reports an
     error due to the ambiguity and the command is aborted.

`show multiple-symbols'
     Show the current value of the `multiple-symbols' setting.


File: gdb.info,  Node: Variables,  Next: Arrays,  Prev: Ambiguous Expressions,  Up: Data

10.3 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
(*note Selecting a Frame: Selection.); they must be either:

   * global (or file-static)

or

   * visible according to the scope rules of the programming language
     from the point of execution in that frame

This means that in the function

     foo (a)
          int a;
     {
       bar (a);
       {
         int b = test ();
         bar (b);
       }
     }

you can examine and use the variable `a' whenever your program is
executing within the function `foo', but you can only use or examine
the variable `b' while your program is executing inside the block where
`b' is declared.

   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:

     FILE::VARIABLE
     FUNCTION::VARIABLE

Here FILE or FUNCTION is the name of the context for the static
VARIABLE.  In the case of file names, you can use quotes to make sure
GDB parses the file name as a single word--for example, to print a
global value of `x' defined in `f2.c':

     (gdb) p 'f2.c'::x

   This use of `::' is very rarely in conflict with the very similar
use of the same notation in C++.  GDB also supports use of the C++
scope resolution operator in GDB expressions.

     _Warning:_ Occasionally, a local variable may appear to have the
     wrong value at certain points in a function--just after entry to a
     new scope, and just before exit.
   You may see this problem when you are stepping by machine
instructions.  This is because, on most machines, it takes more than
one instruction to set up a stack frame (including local variable
definitions); if you are stepping by machine instructions, variables
may appear to have the wrong values until the stack frame is completely
built.  On exit, it usually also takes more than one machine
instruction to destroy a stack frame; after you begin stepping through
that group of instructions, local variable definitions may be gone.

   This may also happen when the compiler does significant
optimizations.  To be sure of always seeing accurate values, turn off
all optimization when compiling.

   Another possible effect of compiler optimizations is to optimize
unused variables out of existence, or assign variables to registers (as
opposed to memory addresses).  Depending on the support for such cases
offered by the debug info format used by the compiler, GDB might not be
able to display values for such local variables.  If that happens, GDB
will print a message like this:

     No symbol "foo" in current context.

   To solve such problems, either recompile without optimizations, or
use a different debug info format, if the compiler supports several such
formats.  *Note Compilation::, for more information on choosing compiler
options.  *Note C and C++: C, for more information about debug info
formats that are best suited to C++ programs.

   If you ask to print an object whose contents are unknown to GDB,
e.g., because its data type is not completely specified by the debug
information, GDB will say `<incomplete type>'.  *Note incomplete type:
Symbols, for more about this.

   If you append `@entry' string to a function parameter name you get
its value at the time the function got called.  If the value is not
available an error message is printed.  Entry values are available only
with some compilers.  Entry values are normally also printed at the
function parameter list according to *note set print entry-values::.

     Breakpoint 1, d (i=30) at gdb.base/entry-value.c:29
     29	  i++;
     (gdb) next
     30	  e (i);
     (gdb) print i
     $1 = 31
     (gdb) print i@entry
     $2 = 30

   Strings are identified as arrays of `char' values without specified
signedness.  Arrays of either `signed char' or `unsigned char' get
printed as arrays of 1 byte sized integers.  `-fsigned-char' or
`-funsigned-char' GCC options have no effect as GDB defines literal
string type `"char"' as `char' without a sign.  For program code

     char var0[] = "A";
     signed char var1[] = "A";

   You get during debugging
     (gdb) print var0
     $1 = "A"
     (gdb) print var1
     $2 = {65 'A', 0 '\0'}


File: gdb.info,  Node: Arrays,  Next: Output Formats,  Prev: Variables,  Up: Data

10.4 Artificial Arrays
======================

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
"artificial array", using the binary operator `@'.  The left operand of
`@' 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

     int *array = (int *) malloc (len * sizeof (int));

you can print the contents of `array' with

     p *array@len

   The left operand of `@' must reside in memory.  Array values made
with `@' 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
(*note 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:
     (gdb) p/x (short[2])0x12345678
     $1 = {0x1234, 0x5678}

   As a convenience, if you leave the array length out (as in
`(TYPE[])VALUE') GDB calculates the size to fill the value (as
`sizeof(VALUE)/sizeof(TYPE)':
     (gdb) p/x (short[])0x12345678
     $2 = {0x1234, 0x5678}

   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 (*note Convenience Variables: Convenience
Vars.) as a counter in an expression that prints the first interesting
value, and then repeat that expression via <RET>.  For instance,
suppose you have an array `dtab' of pointers to structures, and you are
interested in the values of a field `fv' in each structure.  Here is an
example of what you might type:

     set $i = 0
     p dtab[$i++]->fv
     <RET>
     <RET>
     ...


File: gdb.info,  Node: Output Formats,  Next: Memory,  Prev: Arrays,  Up: Data

10.5 Output Formats
===================

By default, GDB 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 "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
`print' command with a slash and a format letter.  The format letters
supported are:

`x'
     Regard the bits of the value as an integer, and print the integer
     in hexadecimal.

`d'
     Print as integer in signed decimal.

`u'
     Print as integer in unsigned decimal.

`o'
     Print as integer in octal.

`t'
     Print as integer in binary.  The letter `t' stands for "two".  (1)

`a'
     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:

          (gdb) p/a 0x54320
          $3 = 0x54320 <_initialize_vx+396>

     The command `info symbol 0x54320' yields similar results.  *Note
     info symbol: Symbols.

`c'
     Regard as an integer and print it as a character constant.  This
     prints both the numerical value and its character representation.
     The character representation is replaced with the octal escape
     `\nnn' for characters outside the 7-bit ASCII range.

     Without this format, GDB displays `char', `unsigned char', and
     `signed char' data as character constants.  Single-byte members of
     vectors are displayed as integer data.

`f'
     Regard the bits of the value as a floating point number and print
     using typical floating point syntax.

`s'
     Regard as a string, if possible.  With this format, pointers to
     single-byte data are displayed as null-terminated strings and
     arrays of single-byte data are displayed as fixed-length strings.
     Other values are displayed in their natural types.

     Without this format, GDB displays pointers to and arrays of
     `char', `unsigned char', and `signed char' as strings.
     Single-byte members of a vector are displayed as an integer array.

`r'
     Print using the `raw' formatting.  By default, GDB will use a
     Python-based pretty-printer, if one is available (*note Pretty
     Printing::).  This typically results in a higher-level display of
     the value's contents.  The `r' format bypasses any Python
     pretty-printer which might exist.

   For example, to print the program counter in hex (*note
Registers::), type

     p/x $pc

Note that no space is required before the slash; this is because command
names in GDB cannot contain a slash.

   To reprint the last value in the value history with a different
format, you can use the `print' command with just a format and no
expression.  For example, `p/x' reprints the last value in hex.

   ---------- Footnotes ----------

   (1) `b' cannot be used because these format letters are also used
with the `x' command, where `b' stands for "byte"; see *note Examining
Memory: Memory.


File: gdb.info,  Node: Memory,  Next: Auto Display,  Prev: Output Formats,  Up: Data

10.6 Examining Memory
=====================

You can use the command `x' (for "examine") to examine memory in any of
several formats, independently of your program's data types.

`x/NFU ADDR'
`x ADDR'
`x'
     Use the `x' command to examine memory.

   N, F, and U are all optional parameters that specify how much memory
to display and how to format it; ADDR is an expression giving the
address where you want to start displaying memory.  If you use defaults
for NFU, you need not type the slash `/'.  Several commands set
convenient defaults for ADDR.

N, the repeat count
     The repeat count is a decimal integer; the default is 1.  It
     specifies how much memory (counting by units U) to display.

F, the display format
     The display format is one of the formats used by `print' (`x',
     `d', `u', `o', `t', `a', `c', `f', `s'), and in addition `i' (for
     machine instructions).  The default is `x' (hexadecimal)
     initially.  The default changes each time you use either `x' or
     `print'.

U, the unit size
     The unit size is any of

    `b'
          Bytes.

    `h'
          Halfwords (two bytes).

    `w'
          Words (four bytes).  This is the initial default.

    `g'
          Giant words (eight bytes).

     Each time you specify a unit size with `x', that size becomes the
     default unit the next time you use `x'.  For the `i' format, the
     unit size is ignored and is normally not written.  For the `s'
     format, the unit size defaults to `b', unless it is explicitly
     given.  Use `x /hs' to display 16-bit char strings and `x /ws' to
     display 32-bit strings.  The next use of `x /s' will again display
     8-bit strings.  Note that the results depend on the programming
     language of the current compilation unit.  If the language is C,
     the `s' modifier will use the UTF-16 encoding while `w' will use
     UTF-32.  The encoding is set by the programming language and cannot
     be altered.

ADDR, starting display address
     ADDR is the address where you want GDB to begin displaying memory.
     The expression need not have a pointer value (though it may); it
     is always interpreted as an integer address of a byte of memory.
     *Note Expressions: Expressions, for more information on
     expressions.  The default for ADDR is usually just after the last
     address examined--but several other commands also set the default
     address: `info breakpoints' (to the address of the last breakpoint
     listed), `info line' (to the starting address of a line), and
     `print' (if you use it to display a value from memory).

   For example, `x/3uh 0x54320' is a request to display three halfwords
(`h') of memory, formatted as unsigned decimal integers (`u'), starting
at address `0x54320'.  `x/4xw $sp' prints the four words (`w') of
memory above the stack pointer (here, `$sp'; *note Registers:
Registers.) in hexadecimal (`x').

   Since the letters indicating unit sizes are all distinct from the
letters specifying output formats, you do not have to remember whether
unit size or format comes first; either order works.  The output
specifications `4xw' and `4wx' mean exactly the same thing.  (However,
the count N must come first; `wx4' does not work.)

   Even though the unit size U is ignored for the formats `s' and `i',
you might still want to use a count N; for example, `3i' specifies that
you want to see three machine instructions, including any operands.
For convenience, especially when used with the `display' command, the
`i' format also prints branch delay slot instructions, if any, beyond
the count specified, which immediately follow the last instruction that
is within the count.  The command `disassemble' gives an alternative
way of inspecting machine instructions; see *note Source and Machine
Code: Machine Code.

   All the defaults for the arguments to `x' are designed to make it
easy to continue scanning memory with minimal specifications each time
you use `x'.  For example, after you have inspected three machine
instructions with `x/3i ADDR', you can inspect the next seven with just
`x/7'.  If you use <RET> to repeat the `x' command, the repeat count N
is used again; the other arguments default as for successive uses of
`x'.

   When examining machine instructions, the instruction at current
program counter is shown with a `=>' marker. For example:

     (gdb) x/5i $pc-6
        0x804837f <main+11>: mov    %esp,%ebp
        0x8048381 <main+13>: push   %ecx
        0x8048382 <main+14>: sub    $0x4,%esp
     => 0x8048385 <main+17>: movl   $0x8048460,(%esp)
        0x804838c <main+24>: call   0x80482d4 <puts@plt>

   The addresses and contents printed by the `x' command are not saved
in the value history because there is often too much of them and they
would get in the way.  Instead, GDB makes these values available for
subsequent use in expressions as values of the convenience variables
`$_' and `$__'.  After an `x' command, the last address examined is
available for use in expressions in the convenience variable `$_'.  The
contents of that address, as examined, are available in the convenience
variable `$__'.

   If the `x' command has a repeat count, the address and contents saved
are from the last memory unit printed; this is not the same as the last
address printed if several units were printed on the last line of
output.

   When you are debugging a program running on a remote target machine
(*note Remote Debugging::), you may wish to verify the program's image
in the remote machine's memory against the executable file you
downloaded to the target.  The `compare-sections' command is provided
for such situations.

`compare-sections [SECTION-NAME]'
     Compare the data of a loadable section SECTION-NAME in the
     executable file of the program being debugged with the same
     section in the remote machine's memory, and report any mismatches.
     With no arguments, compares all loadable sections.  This command's
     availability depends on the target's support for the `"qCRC"'
     remote request.


File: gdb.info,  Node: Auto Display,  Next: Print Settings,  Prev: Memory,  Up: Data

10.7 Automatic Display
======================

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 "automatic
display list" so that GDB 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:

     2: foo = 38
     3: bar[5] = (struct hack *) 0x3804

This display shows item numbers, expressions and their current values.
As with displays you request manually using `x' or `print', you can
specify the output format you prefer; in fact, `display' decides
whether to use `print' or `x' depending your format specification--it
uses `x' if you specify either the `i' or `s' format, or a unit size;
otherwise it uses `print'.

`display EXPR'
     Add the expression EXPR to the list of expressions to display each
     time your program stops.  *Note Expressions: Expressions.

     `display' does not repeat if you press <RET> again after using it.

`display/FMT EXPR'
     For FMT specifying only a display format and not a size or count,
     add the expression EXPR to the auto-display list but arrange to
     display it each time in the specified format FMT.  *Note Output
     Formats: Output Formats.

`display/FMT ADDR'
     For FMT `i' or `s', or including a unit-size or a number of units,
     add the expression ADDR as a memory address to be examined each
     time your program stops.  Examining means in effect doing `x/FMT
     ADDR'.  *Note Examining Memory: Memory.

   For example, `display/i $pc' can be helpful, to see the machine
instruction about to be executed each time execution stops (`$pc' is a
common name for the program counter; *note Registers: Registers.).

`undisplay DNUMS...'
`delete display DNUMS...'
     Remove items from the list of expressions to display.  Specify the
     numbers of the displays that you want affected with the command
     argument DNUMS.  It can be a single display number, one of the
     numbers shown in the first field of the `info display' display; or
     it could be a range of display numbers, as in `2-4'.

     `undisplay' does not repeat if you press <RET> after using it.
     (Otherwise you would just get the error `No display number ...'.)

`disable display DNUMS...'
     Disable the display of item numbers DNUMS.  A disabled display
     item is not printed automatically, but is not forgotten.  It may be
     enabled again later.  Specify the numbers of the displays that you
     want affected with the command argument DNUMS.  It can be a single
     display number, one of the numbers shown in the first field of the
     `info display' display; or it could be a range of display numbers,
     as in `2-4'.

`enable display DNUMS...'
     Enable display of item numbers DNUMS.  It becomes effective once
     again in auto display of its expression, until you specify
     otherwise.  Specify the numbers of the displays that you want
     affected with the command argument DNUMS.  It can be a single
     display number, one of the numbers shown in the first field of the
     `info display' display; or it could be a range of display numbers,
     as in `2-4'.

`display'
     Display the current values of the expressions on the list, just as
     is done when your program stops.

`info display'
     Print the list of expressions previously set up to display
     automatically, each one with its item number, but without showing
     the values.  This includes 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.

   If a display expression refers to local variables, then it does not
make sense outside the lexical context for which it was set up.  Such an
expression is disabled when execution enters a context where one of its
variables is not defined.  For example, if you give the command
`display last_char' while inside a function with an argument
`last_char', GDB displays this argument while your program continues to
stop inside that function.  When it stops elsewhere--where there is no
variable `last_char'--the display is disabled automatically.  The next
time your program stops where `last_char' is meaningful, you can enable
the display expression once again.


File: gdb.info,  Node: Print Settings,  Next: Pretty Printing,  Prev: Auto Display,  Up: Data

10.8 Print Settings
===================

GDB provides the following ways to control how arrays, structures, and
symbols are printed.

These settings are useful for debugging programs in any language:

`set print address'
`set print address on'
     GDB 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 `on'.  For example, this is what a stack frame display looks
     like with `set print address on':

          (gdb) f
          #0  set_quotes (lq=0x34c78 "<<", rq=0x34c88 ">>")
              at input.c:530
          530         if (lquote != def_lquote)

`set print address off'
     Do not print addresses when displaying their contents.  For
     example, this is the same stack frame displayed with `set print
     address off':

          (gdb) set print addr off
          (gdb) f
          #0  set_quotes (lq="<<", rq=">>") at input.c:530
          530         if (lquote != def_lquote)

     You can use `set print address off' to eliminate all machine
     dependent displays from the GDB interface.  For example, with
     `print address off', you should get the same text for backtraces on
     all machines--whether or not they involve pointer arguments.

`show print address'
     Show whether or not addresses are to be printed.

   When GDB 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
`info line', for example `info line *0x4537'.  Alternately, you can set
GDB to print the source file and line number when it prints a symbolic
address:

`set print symbol-filename on'
     Tell GDB to print the source file name and line number of a symbol
     in the symbolic form of an address.

`set print symbol-filename off'
     Do not print source file name and line number of a symbol.  This
     is the default.

`show print symbol-filename'
     Show whether or not GDB will print the source file name and line
     number of a symbol in the symbolic form of an address.

   Another situation where it is helpful to show symbol filenames and
line numbers is when disassembling code; GDB 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:

`set print max-symbolic-offset MAX-OFFSET'
     Tell GDB to only display the symbolic form of an address if the
     offset between the closest earlier symbol and the address is less
     than MAX-OFFSET.  The default is 0, which tells GDB to always
     print the symbolic form of an address if any symbol precedes it.

`show print max-symbolic-offset'
     Ask how large the maximum offset is that GDB prints in a symbolic
     address.

   If you have a pointer and you are not sure where it points, try `set
print symbol-filename on'.  Then you can determine the name and source
file location of the variable where it points, using `p/a POINTER'.
This interprets the address in symbolic form.  For example, here GDB
shows that a variable `ptt' points at another variable `t', defined in
`hi2.c':

     (gdb) set print symbol-filename on
     (gdb) p/a ptt
     $4 = 0xe008 <t in hi2.c>

     _Warning:_ For pointers that point to a local variable, `p/a' does
     not show the symbol name and filename of the referent, even with
     the appropriate `set print' options turned on.

   Other settings control how different kinds of objects are printed:

`set print array'
`set print array on'
     Pretty print arrays.  This format is more convenient to read, but
     uses more space.  The default is off.

`set print array off'
     Return to compressed format for arrays.

`show print array'
     Show whether compressed or pretty format is selected for displaying
     arrays.

`set print array-indexes'
`set print array-indexes on'
     Print the index of each element when displaying arrays.  May be
     more convenient to locate a given element in the array or quickly
     find the index of a given element in that printed array.  The
     default is off.

`set print array-indexes off'
     Stop printing element indexes when displaying arrays.

`show print array-indexes'
     Show whether the index of each element is printed when displaying
     arrays.

`set print elements NUMBER-OF-ELEMENTS'
     Set a limit on how many elements of an array GDB will print.  If
     GDB is printing a large array, it stops printing after it has
     printed the number of elements set by the `set print elements'
     command.  This limit also applies to the display of strings.  When
     GDB starts, this limit is set to 200.  Setting  NUMBER-OF-ELEMENTS
     to zero means that the printing is unlimited.

`show print elements'
     Display the number of elements of a large array that GDB will
     print.  If the number is 0, then the printing is unlimited.

`set print frame-arguments VALUE'
     This command allows to control how the values of arguments are
     printed when the debugger prints a frame (*note Frames::).  The
     possible values are:

    `all'
          The values of all arguments are printed.

    `scalars'
          Print the value of an argument only if it is a scalar.  The
          value of more complex arguments such as arrays, structures,
          unions, etc, is replaced by `...'.  This is the default.
          Here is an example where only scalar arguments are shown:

               #1  0x08048361 in call_me (i=3, s=..., ss=0xbf8d508c, u=..., e=green)
                 at frame-args.c:23

    `none'
          None of the argument values are printed.  Instead, the value
          of each argument is replaced by `...'.  In this case, the
          example above now becomes:

               #1  0x08048361 in call_me (i=..., s=..., ss=..., u=..., e=...)
                 at frame-args.c:23

     By default, only scalar arguments are printed.  This command can
     be used to configure the debugger to print the value of all
     arguments, regardless of their type.  However, it is often
     advantageous to not print the value of more complex parameters.
     For instance, it reduces the amount of information printed in each
     frame, making the backtrace more readable.  Also, it improves
     performance when displaying Ada frames, because the computation of
     large arguments can sometimes be CPU-intensive, especially in
     large applications.  Setting `print frame-arguments' to `scalars'
     (the default) or `none' avoids this computation, thus speeding up
     the display of each Ada frame.

`show print frame-arguments'
     Show how the value of arguments should be displayed when printing
     a frame.

`set print entry-values VALUE'
     Set printing of frame argument values at function entry.  In some
     cases GDB can determine the value of function argument which was
     passed by the function caller, even if the value was modified
     inside the called function and therefore is different.  With
     optimized code, the current value could be unavailable, but the
     entry value may still be known.

     The default value is `default' (see below for its description).
     Older GDB behaved as with the setting `no'.  Compilers not
     supporting this feature will behave in the `default' setting the
     same way as with the `no' setting.

     This functionality is currently supported only by DWARF 2
     debugging format and the compiler has to produce
     `DW_TAG_GNU_call_site' tags.  With GCC, you need to specify `-O
     -g' during compilation, to get this information.

     The VALUE parameter can be one of the following:

    `no'
          Print only actual parameter values, never print values from
          function entry point.
               #0  equal (val=5)
               #0  different (val=6)
               #0  lost (val=<optimized out>)
               #0  born (val=10)
               #0  invalid (val=<optimized out>)

    `only'
          Print only parameter values from function entry point.  The
          actual parameter values are never printed.
               #0  equal (val@entry=5)
               #0  different (val@entry=5)
               #0  lost (val@entry=5)
               #0  born (val@entry=<optimized out>)
               #0  invalid (val@entry=<optimized out>)

    `preferred'
          Print only parameter values from function entry point.  If
          value from function entry point is not known while the actual
          value is known, print the actual value for such parameter.
               #0  equal (val@entry=5)
               #0  different (val@entry=5)
               #0  lost (val@entry=5)
               #0  born (val=10)
               #0  invalid (val@entry=<optimized out>)

    `if-needed'
          Print actual parameter values.  If actual parameter value is
          not known while value from function entry point is known,
          print the entry point value for such parameter.
               #0  equal (val=5)
               #0  different (val=6)
               #0  lost (val@entry=5)
               #0  born (val=10)
               #0  invalid (val=<optimized out>)

    `both'
          Always print both the actual parameter value and its value
          from function entry point, even if values of one or both are
          not available due to compiler optimizations.
               #0  equal (val=5, val@entry=5)
               #0  different (val=6, val@entry=5)
               #0  lost (val=<optimized out>, val@entry=5)
               #0  born (val=10, val@entry=<optimized out>)
               #0  invalid (val=<optimized out>, val@entry=<optimized out>)

    `compact'
          Print the actual parameter value if it is known and also its
          value from function entry point if it is known.  If neither
          is known, print for the actual value `<optimized out>'.  If
          not in MI mode (*note GDB/MI::) and if both values are known
          and identical, print the shortened `param=param@entry=VALUE'
          notation.
               #0  equal (val=val@entry=5)
               #0  different (val=6, val@entry=5)
               #0  lost (val@entry=5)
               #0  born (val=10)
               #0  invalid (val=<optimized out>)

    `default'
          Always print the actual parameter value.  Print also its
          value from function entry point, but only if it is known.  If
          not in MI mode (*note GDB/MI::) and if both values are known
          and identical, print the shortened `param=param@entry=VALUE'
          notation.
               #0  equal (val=val@entry=5)
               #0  different (val=6, val@entry=5)
               #0  lost (val=<optimized out>, val@entry=5)
               #0  born (val=10)
               #0  invalid (val=<optimized out>)

     For analysis messages on possible failures of frame argument
     values at function entry resolution see *note set debug
     entry-values::.

`show print entry-values'
     Show the method being used for printing of frame argument values
     at function entry.

`set print repeats'
     Set the threshold for suppressing display of repeated array
     elements.  When the number of consecutive identical elements of an
     array exceeds the threshold, GDB prints the string `"<repeats N
     times>"', where N is the number of identical repetitions, instead
     of displaying the identical elements themselves.  Setting the
     threshold to zero will cause all elements to be individually
     printed.  The default threshold is 10.

`show print repeats'
     Display the current threshold for printing repeated identical
     elements.

`set print null-stop'
     Cause GDB to stop printing the characters of an array when the
     first NULL is encountered.  This is useful when large arrays
     actually contain only short strings.  The default is off.

`show print null-stop'
     Show whether GDB stops printing an array on the first NULL
     character.

`set print pretty on'
     Cause GDB to print structures in an indented format with one member
     per line, like this:

          $1 = {
            next = 0x0,
            flags = {
              sweet = 1,
              sour = 1
            },
            meat = 0x54 "Pork"
          }

`set print pretty off'
     Cause GDB to print structures in a compact format, like this:

          $1 = {next = 0x0, flags = {sweet = 1, sour = 1}, \
          meat = 0x54 "Pork"}

     This is the default format.

`show print pretty'
     Show which format GDB is using to print structures.

`set print sevenbit-strings on'
     Print using only seven-bit characters; if this option is set, GDB
     displays any eight-bit characters (in strings or character values)
     using the notation `\'NNN.  This setting is best if you are
     working in English (ASCII) and you use the high-order bit of
     characters as a marker or "meta" bit.

`set print sevenbit-strings off'
     Print full eight-bit characters.  This allows the use of more
     international character sets, and is the default.

`show print sevenbit-strings'
     Show whether or not GDB is printing only seven-bit characters.

`set print union on'
     Tell GDB to print unions which are contained in structures and
     other unions.  This is the default setting.

`set print union off'
     Tell GDB not to print unions which are contained in structures and
     other unions.  GDB will print `"{...}"' instead.

`show print union'
     Ask GDB whether or not it will print unions which are contained in
     structures and other unions.

     For example, given the declarations

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

     with `set print union on' in effect `p foo' would print

          $1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}}

     and with `set print union off' in effect it would print

          $1 = {it = Tree, form = {...}}

     `set print union' affects programs written in C-like languages and
     in Pascal.

These settings are of interest when debugging C++ programs:

`set print demangle'
`set print demangle on'
     Print C++ 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.

`show print demangle'
     Show whether C++ names are printed in mangled or demangled form.

`set print asm-demangle'
`set print asm-demangle on'
     Print C++ names in their source form rather than their mangled
     form, even in assembler code printouts such as instruction
     disassemblies.  The default is off.

`show print asm-demangle'
     Show whether C++ names in assembly listings are printed in mangled
     or demangled form.

`set demangle-style STYLE'
     Choose among several encoding schemes used by different compilers
     to represent C++ names.  The choices for STYLE are currently:

    `auto'
          Allow GDB to choose a decoding style by inspecting your
          program.

    `gnu'
          Decode based on the GNU C++ compiler (`g++') encoding
          algorithm.  This is the default.

    `hp'
          Decode based on the HP ANSI C++ (`aCC') encoding algorithm.

    `lucid'
          Decode based on the Lucid C++ compiler (`lcc') encoding
          algorithm.

    `arm'
          Decode using the algorithm in the `C++ Annotated Reference
          Manual'.  *Warning:* this setting alone is not sufficient to
          allow debugging `cfront'-generated executables.  GDB would
          require further enhancement to permit that.

     If you omit STYLE, you will see a list of possible formats.

`show demangle-style'
     Display the encoding style currently in use for decoding C++
     symbols.

`set print object'
`set print object on'
     When displaying a pointer to an object, identify the _actual_
     (derived) type of the object rather than the _declared_ type, using
     the virtual function table.  Note that the virtual function table
     is required--this feature can only work for objects that have
     run-time type identification; a single virtual method in the
     object's declared type is sufficient.

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

`show print object'
     Show whether actual, or declared, object types are displayed.

`set print static-members'
`set print static-members on'
     Print static members when displaying a C++ object.  The default is
     on.

`set print static-members off'
     Do not print static members when displaying a C++ object.

`show print static-members'
     Show whether C++ static members are printed or not.

`set print pascal_static-members'
`set print pascal_static-members on'
     Print static members when displaying a Pascal object.  The default
     is on.

`set print pascal_static-members off'
     Do not print static members when displaying a Pascal object.

`show print pascal_static-members'
     Show whether Pascal static members are printed or not.

`set print vtbl'
`set print vtbl on'
     Pretty print C++ virtual function tables.  The default is off.
     (The `vtbl' commands do not work on programs compiled with the HP
     ANSI C++ compiler (`aCC').)

`set print vtbl off'
     Do not pretty print C++ virtual function tables.

`show print vtbl'
     Show whether C++ virtual function tables are pretty printed, or
     not.


File: gdb.info,  Node: Pretty Printing,  Next: Value History,  Prev: Print Settings,  Up: Data

10.9 Pretty Printing
====================

GDB provides a mechanism to allow pretty-printing of values using
Python code.  It greatly simplifies the display of complex objects.
This mechanism works for both MI and the CLI.

* Menu:

* Pretty-Printer Introduction::  Introduction to pretty-printers
* Pretty-Printer Example::       An example pretty-printer
* Pretty-Printer Commands::      Pretty-printer commands


File: gdb.info,  Node: Pretty-Printer Introduction,  Next: Pretty-Printer Example,  Up: Pretty Printing

10.9.1 Pretty-Printer Introduction
----------------------------------

When GDB prints a value, it first sees if there is a pretty-printer
registered for the value.  If there is then GDB invokes the
pretty-printer to print the value.  Otherwise the value is printed
normally.

   Pretty-printers are normally named.  This makes them easy to manage.
The `info pretty-printer' command will list all the installed
pretty-printers with their names.  If a pretty-printer can handle
multiple data types, then its "subprinters" are the printers for the
individual data types.  Each such subprinter has its own name.  The
format of the name is PRINTER-NAME;SUBPRINTER-NAME.

   Pretty-printers are installed by "registering" them with GDB.
Typically they are automatically loaded and registered when the
corresponding debug information is loaded, thus making them available
without having to do anything special.

   There are three places where a pretty-printer can be registered.

   * Pretty-printers registered globally are available when debugging
     all inferiors.

   * Pretty-printers registered with a program space are available only
     when debugging that program.  *Note Progspaces In Python::, for
     more details on program spaces in Python.

   * Pretty-printers registered with an objfile are loaded and unloaded
     with the corresponding objfile (e.g., shared library).  *Note
     Objfiles In Python::, for more details on objfiles in Python.

   *Note Selecting Pretty-Printers::, for further information on how
pretty-printers are selected,

   *Note Writing a Pretty-Printer::, for implementing pretty printers
for new types.


File: gdb.info,  Node: Pretty-Printer Example,  Next: Pretty-Printer Commands,  Prev: Pretty-Printer Introduction,  Up: Pretty Printing

10.9.2 Pretty-Printer Example
-----------------------------

Here is how a C++ `std::string' looks without a pretty-printer:

     (gdb) print s
     $1 = {
       static npos = 4294967295,
       _M_dataplus = {
         <std::allocator<char>> = {
           <__gnu_cxx::new_allocator<char>> = {
             <No data fields>}, <No data fields>
           },
         members of std::basic_string<char, std::char_traits<char>,
           std::allocator<char> >::_Alloc_hider:
         _M_p = 0x804a014 "abcd"
       }
     }

   With a pretty-printer for `std::string' only the contents are
printed:

     (gdb) print s
     $2 = "abcd"


File: gdb.info,  Node: Pretty-Printer Commands,  Prev: Pretty-Printer Example,  Up: Pretty Printing

10.9.3 Pretty-Printer Commands
------------------------------

`info pretty-printer [OBJECT-REGEXP [NAME-REGEXP]]'
     Print the list of installed pretty-printers.  This includes
     disabled pretty-printers, which are marked as such.

     OBJECT-REGEXP is a regular expression matching the objects whose
     pretty-printers to list.  Objects can be `global', the program
     space's file (*note Progspaces In Python::), and the object files
     within that program space (*note Objfiles In Python::).  *Note
     Selecting Pretty-Printers::, for details on how GDB looks up a
     printer from these three objects.

     NAME-REGEXP is a regular expression matching the name of the
     printers to list.

`disable pretty-printer [OBJECT-REGEXP [NAME-REGEXP]]'
     Disable pretty-printers matching OBJECT-REGEXP and NAME-REGEXP.  A
     disabled pretty-printer is not forgotten, it may be enabled again
     later.

`enable pretty-printer [OBJECT-REGEXP [NAME-REGEXP]]'
     Enable pretty-printers matching OBJECT-REGEXP and NAME-REGEXP.

   Example:

   Suppose we have three pretty-printers installed: one from library1.so
named `foo' that prints objects of type `foo', and another from
library2.so named `bar' that prints two types of objects, `bar1' and
`bar2'.

     (gdb) info pretty-printer
     library1.so:
       foo
     library2.so:
       bar
         bar1
         bar2
     (gdb) info pretty-printer library2
     library2.so:
       bar
         bar1
         bar2
     (gdb) disable pretty-printer library1
     1 printer disabled
     2 of 3 printers enabled
     (gdb) info pretty-printer
     library1.so:
       foo [disabled]
     library2.so:
       bar
         bar1
         bar2
     (gdb) disable pretty-printer library2 bar:bar1
     1 printer disabled
     1 of 3 printers enabled
     (gdb) info pretty-printer library2
     library1.so:
       foo [disabled]
     library2.so:
       bar
         bar1 [disabled]
         bar2
     (gdb) disable pretty-printer library2 bar
     1 printer disabled
     0 of 3 printers enabled
     (gdb) info pretty-printer library2
     library1.so:
       foo [disabled]
     library2.so:
       bar [disabled]
         bar1 [disabled]
         bar2

   Note that for `bar' the entire printer can be disabled, as can each
individual subprinter.


File: gdb.info,  Node: Value History,  Next: Convenience Vars,  Prev: Pretty Printing,  Up: Data

10.10 Value History
===================

Values printed by the `print' command are saved in the GDB "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 `file' or `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.

   The values printed are given "history numbers" by which you can
refer to them.  These are successive integers starting with one.
`print' shows you the history number assigned to a value by printing
`$NUM = ' before the value; here NUM is the history number.

   To refer to any previous value, use `$' followed by the value's
history number.  The way `print' labels its output is designed to
remind you of this.  Just `$' refers to the most recent value in the
history, and `$$' refers to the value before that.  `$$N' refers to the
Nth value from the end; `$$2' is the value just prior to `$$', `$$1' is
equivalent to `$$', and `$$0' is equivalent to `$'.

   For example, suppose you have just printed a pointer to a structure
and want to see the contents of the structure.  It suffices to type

     p *$

   If you have a chain of structures where the component `next' points
to the next one, you can print the contents of the next one with this:

     p *$.next

You can print successive links in the chain by repeating this
command--which you can do by just typing <RET>.

   Note that the history records values, not expressions.  If the value
of `x' is 4 and you type these commands:

     print x
     set x=5

then the value recorded in the value history by the `print' command
remains 4 even though the value of `x' has changed.

`show values'
     Print the last ten values in the value history, with their item
     numbers.  This is like `p $$9' repeated ten times, except that
     `show values' does not change the history.

`show values N'
     Print ten history values centered on history item number N.

`show values +'
     Print ten history values just after the values last printed.  If
     no more values are available, `show values +' produces no display.

   Pressing <RET> to repeat `show values N' has exactly the same effect
as `show values +'.


File: gdb.info,  Node: Convenience Vars,  Next: Registers,  Prev: Value History,  Up: Data

10.11 Convenience Variables
===========================

GDB provides "convenience variables" that you can use within GDB to
hold on to a value and refer to it later.  These variables exist
entirely within GDB; 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 `$'.  Any name preceded by
`$' can be used for a convenience variable, unless it is one of the
predefined machine-specific register names (*note Registers:
Registers.).  (Value history references, in contrast, are _numbers_
preceded by `$'.  *Note 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:

     set $foo = *object_ptr

would save in `$foo' the value contained in the object pointed to by
`object_ptr'.

   Using a convenience variable for the first time creates it, but its
value is `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.

`show convenience'
     Print a list of convenience variables used so far, and their
     values.  Abbreviated `show conv'.

`init-if-undefined $VARIABLE = EXPRESSION'
     Set a convenience variable if it has not already been set.  This
     is useful for user-defined commands that keep some state.  It is
     similar, in concept, to using local static variables with
     initializers in C (except that convenience variables are global).
     It can also be used to allow users to override default values used
     in a command script.

     If the variable is already defined then the expression is not
     evaluated so any side-effects do not occur.

   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:

     set $i = 0
     print bar[$i++]->contents

Repeat that command by typing <RET>.

   Some convenience variables are created automatically by GDB and given
values likely to be useful.

`$_'
     The variable `$_' is automatically set by the `x' command to the
     last address examined (*note Examining Memory: Memory.).  Other
     commands which provide a default address for `x' to examine also
     set `$_' to that address; these commands include `info line' and
     `info breakpoint'.  The type of `$_' is `void *' except when set
     by the `x' command, in which case it is a pointer to the type of
     `$__'.

`$__'
     The variable `$__' is automatically set by the `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.

`$_exitcode'
     The variable `$_exitcode' is automatically set to the exit code
     when the program being debugged terminates.

`$_sdata'
     The variable `$_sdata' contains extra collected static tracepoint
     data.  *Note Tracepoint Action Lists: Tracepoint Actions.  Note
     that `$_sdata' could be empty, if not inspecting a trace buffer, or
     if extra static tracepoint data has not been collected.

`$_siginfo'
     The variable `$_siginfo' contains extra signal information (*note
     extra signal information::).  Note that `$_siginfo' could be
     empty, if the application has not yet received any signals.  For
     example, it will be empty before you execute the `run' command.

`$_tlb'
     The variable `$_tlb' is automatically set when debugging
     applications running on MS-Windows in native mode or connected to
     gdbserver that supports the `qGetTIBAddr' request.  *Note General
     Query Packets::.  This variable contains the address of the thread
     information block.


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

   GDB also supplies some "convenience functions".  These have a syntax
similar to convenience variables.  A convenience function can be used
in an expression just like an ordinary function; however, a convenience
function is implemented internally to GDB.

`help function'
     Print a list of all convenience functions.


File: gdb.info,  Node: Registers,  Next: Floating Point Hardware,  Prev: Convenience Vars,  Up: Data

10.12 Registers
===============

You can refer to machine register contents, in expressions, as variables
with names starting with `$'.  The names of registers are different for
each machine; use `info registers' to see the names used on your
machine.

`info registers'
     Print the names and values of all registers except floating-point
     and vector registers (in the selected stack frame).

`info all-registers'
     Print the names and values of all registers, including
     floating-point and vector registers (in the selected stack frame).

`info registers REGNAME ...'
     Print the "relativized" value of each specified register REGNAME.
     As discussed in detail below, register values are normally
     relative to the selected stack frame.  REGNAME may be any register
     name valid on the machine you are using, with or without the
     initial `$'.

   GDB has four "standard" register names that are available (in
expressions) on most machines--whenever they do not conflict with an
architecture's canonical mnemonics for registers.  The register names
`$pc' and `$sp' are used for the program counter register and the stack
pointer.  `$fp' is used for a register that contains a pointer to the
current stack frame, and `$ps' is used for a register that contains the
processor status.  For example, you could print the program counter in
hex with

     p/x $pc

or print the instruction to be executed next with

     x/i $pc

or add four to the stack pointer(1) with

     set $sp += 4

   Whenever possible, these four standard register names are available
on your machine even though the machine has different canonical
mnemonics, so long as there is no conflict.  The `info registers'
command shows the canonical names.  For example, on the SPARC, `info
registers' displays the processor status register as `$psr' but you can
also refer to it as `$ps'; and on x86-based machines `$ps' is an alias
for the EFLAGS register.

   GDB always considers the contents of an ordinary register as an
integer when the register is examined in this way.  Some machines have
special registers which can hold nothing but floating point; these
registers are considered to have floating point values.  There is no way
to refer to the contents of an ordinary register as floating point value
(although you can _print_ it as a floating point value with `print/f
$REGNAME').

   Some registers have distinct "raw" and "virtual" data formats.  This
means that the data format in which the register contents are saved by
the operating system is not the same one that your program normally
sees.  For example, the registers of the 68881 floating point
coprocessor are always saved in "extended" (raw) format, but all C
programs expect to work with "double" (virtual) format.  In such cases,
GDB normally works with the virtual format only (the format that makes
sense for your program), but the `info registers' command prints the
data in both formats.

   Some machines have special registers whose contents can be
interpreted in several different ways.  For example, modern x86-based
machines have SSE and MMX registers that can hold several values packed
together in several different formats.  GDB refers to such registers in
`struct' notation:

     (gdb) print $xmm1
     $1 = {
       v4_float = {0, 3.43859137e-038, 1.54142831e-044, 1.821688e-044},
       v2_double = {9.92129282474342e-303, 2.7585945287983262e-313},
       v16_int8 = "\000\000\000\000\3706;\001\v\000\000\000\r\000\000",
       v8_int16 = {0, 0, 14072, 315, 11, 0, 13, 0},
       v4_int32 = {0, 20657912, 11, 13},
       v2_int64 = {88725056443645952, 55834574859},
       uint128 = 0x0000000d0000000b013b36f800000000
     }

To set values of such registers, you need to tell GDB which view of the
register you wish to change, as if you were assigning value to a
`struct' member:

      (gdb) set $xmm1.uint128 = 0x000000000000000000000000FFFFFFFF

   Normally, register values are relative to the selected stack frame
(*note Selecting a Frame: Selection.).  This means that you get the
value that the register would contain if all stack frames farther in
were exited and their saved registers restored.  In order to see the
true contents of hardware registers, you must select the innermost
frame (with `frame 0').

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

   ---------- Footnotes ----------

   (1) This is a way of removing one word from the stack, on machines
where stacks grow downward in memory (most machines, nowadays).  This
assumes that the innermost stack frame is selected; setting `$sp' is
not allowed when other stack frames are selected.  To pop entire frames
off the stack, regardless of machine architecture, use `return'; see
*note Returning from a Function: Returning.


File: gdb.info,  Node: Floating Point Hardware,  Next: Vector Unit,  Prev: Registers,  Up: Data

10.13 Floating Point Hardware
=============================

Depending on the configuration, GDB may be able to give you more
information about the status of the floating point hardware.

`info float'
     Display hardware-dependent information about the floating point
     unit.  The exact contents and layout vary depending on the
     floating point chip.  Currently, `info float' is supported on the
     ARM and x86 machines.


File: gdb.info,  Node: Vector Unit,  Next: OS Information,  Prev: Floating Point Hardware,  Up: Data

10.14 Vector Unit
=================

Depending on the configuration, GDB may be able to give you more
information about the status of the vector unit.

`info vector'
     Display information about the vector unit.  The exact contents and
     layout vary depending on the hardware.


File: gdb.info,  Node: OS Information,  Next: Memory Region Attributes,  Prev: Vector Unit,  Up: Data

10.15 Operating System Auxiliary Information
============================================

GDB provides interfaces to useful OS facilities that can help you debug
your program.

   When GDB runs on a "Posix system" (such as GNU or Unix machines), it
interfaces with the inferior via the `ptrace' system call.  The
operating system creates a special sata structure, called `struct
user', for this interface.  You can use the command `info udot' to
display the contents of this data structure.

`info udot'
     Display the contents of the `struct user' maintained by the OS
     kernel for the program being debugged.  GDB displays the contents
     of `struct user' as a list of hex numbers, similar to the
     `examine' command.

   Some operating systems supply an "auxiliary vector" to programs at
startup.  This is akin to the arguments and environment that you
specify for a program, but contains a system-dependent variety of
binary values that tell system libraries important details about the
hardware, operating system, and process.  Each value's purpose is
identified by an integer tag; the meanings are well-known but
system-specific.  Depending on the configuration and operating system
facilities, GDB may be able to show you this information.  For remote
targets, this functionality may further depend on the remote stub's
support of the `qXfer:auxv:read' packet, see *note qXfer auxiliary
vector read::.

`info auxv'
     Display the auxiliary vector of the inferior, which can be either a
     live process or a core dump file.  GDB prints each tag value
     numerically, and also shows names and text descriptions for
     recognized tags.  Some values in the vector are numbers, some bit
     masks, and some pointers to strings or other data.  GDB displays
     each value in the most appropriate form for a recognized tag, and
     in hexadecimal for an unrecognized tag.

   On some targets, GDB can access operating-system-specific information
and display it to user, without interpretation.  For remote targets,
this functionality depends on the remote stub's support of the
`qXfer:osdata:read' packet, see *note qXfer osdata read::.

`info os'
     List the types of OS information available for the target.  If the
     target does not return a list of possible types, this command will
     report an error.

`info os processes'
     Display the list of processes on the target.  For each process,
     GDB prints the process identifier, the name of the user, and the
     command corresponding to the process.


File: gdb.info,  Node: Memory Region Attributes,  Next: Dump/Restore Files,  Prev: OS Information,  Up: Data

10.16 Memory Region Attributes
==============================

"Memory region attributes" allow you to describe special handling
required by regions of your target's memory.  GDB uses attributes to
determine whether to allow certain types of memory accesses; whether to
use specific width accesses; and whether to cache target memory.  By
default the description of memory regions is fetched from the target
(if the current target supports this), but the user can override the
fetched regions.

   Defined memory regions can be individually enabled and disabled.
When a memory region is disabled, GDB uses the default attributes when
accessing memory in that region.  Similarly, if no memory regions have
been defined, GDB 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.

`mem LOWER UPPER ATTRIBUTES...'
     Define a memory region bounded by LOWER and UPPER with attributes
     ATTRIBUTES..., and add it to the list of regions monitored by GDB.
     Note that UPPER == 0 is a special case: it is treated as the
     target's maximum memory address.  (0xffff on 16 bit targets,
     0xffffffff on 32 bit targets, etc.)

`mem auto'
     Discard any user changes to the memory regions and use
     target-supplied regions, if available, or no regions if the target
     does not support.

`delete mem NUMS...'
     Remove memory regions NUMS... from the list of regions monitored
     by GDB.

`disable mem NUMS...'
     Disable monitoring of memory regions NUMS....  A disabled memory
     region is not forgotten.  It may be enabled again later.

`enable mem NUMS...'
     Enable monitoring of memory regions NUMS....

`info mem'
     Print a table of all defined memory regions, with the following
     columns for each region:

    _Memory Region Number_

    _Enabled or Disabled._
          Enabled memory regions are marked with `y'.  Disabled memory
          regions are marked with `n'.

    _Lo Address_
          The address defining the inclusive lower bound of the memory
          region.

    _Hi Address_
          The address defining the exclusive upper bound of the memory
          region.

    _Attributes_
          The list of attributes set for this memory region.

10.16.1 Attributes
------------------

10.16.1.1 Memory Access Mode
............................

The access mode attributes set whether GDB may make read or write
accesses to a memory region.

   While these attributes prevent GDB from performing invalid memory
accesses, they do nothing to prevent the target system, I/O DMA, etc.
from accessing memory.

`ro'
     Memory is read only.

`wo'
     Memory is write only.

`rw'
     Memory is read/write.  This is the default.

10.16.1.2 Memory Access Size
............................

The access size attribute tells GDB 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, GDB
may use accesses of any size.

`8'
     Use 8 bit memory accesses.

`16'
     Use 16 bit memory accesses.

`32'
     Use 32 bit memory accesses.

`64'
     Use 64 bit memory accesses.

10.16.1.3 Data Cache
....................

The data cache attributes set whether GDB will cache target memory.
While this generally improves performance by reducing debug protocol
overhead, it can lead to incorrect results because GDB does not know
about volatile variables or memory mapped device registers.

`cache'
     Enable GDB to cache target memory.

`nocache'
     Disable GDB from caching target memory.  This is the default.

10.16.2 Memory Access Checking
------------------------------

GDB can be instructed to refuse accesses to memory that is not
explicitly described.  This can be useful if accessing such regions has
undesired effects for a specific target, or to provide better error
checking.  The following commands control this behaviour.

`set mem inaccessible-by-default [on|off]'
     If `on' is specified, make  GDB treat memory not explicitly
     described by the memory ranges as non-existent and refuse accesses
     to such memory.  The checks are only performed if there's at least
     one memory range defined.  If `off' is specified, make GDB treat
     the memory not explicitly described by the memory ranges as RAM.
     The default value is `on'.  

`show mem inaccessible-by-default'
     Show the current handling of accesses to unknown memory.


File: gdb.info,  Node: Dump/Restore Files,  Next: Core File Generation,  Prev: Memory Region Attributes,  Up: Data

10.17 Copy Between Memory and a File
====================================

You can use the commands `dump', `append', and `restore' to copy data
between target memory and a file.  The `dump' and `append' commands
write data to a file, and the `restore' command reads data from a file
back into the inferior's memory.  Files may be in binary, Motorola
S-record, Intel hex, or Tektronix Hex format; however, GDB can only
append to binary files.

`dump [FORMAT] memory FILENAME START_ADDR END_ADDR'
`dump [FORMAT] value FILENAME EXPR'
     Dump the contents of memory from START_ADDR to END_ADDR, or the
     value of EXPR, to FILENAME in the given format.

     The FORMAT parameter may be any one of:
    `binary'
          Raw binary form.

    `ihex'
          Intel hex format.

    `srec'
          Motorola S-record format.

    `tekhex'
          Tektronix Hex format.

     GDB uses the same definitions of these formats as the GNU binary
     utilities, like `objdump' and `objcopy'.  If FORMAT is omitted,
     GDB dumps the data in raw binary form.

`append [binary] memory FILENAME START_ADDR END_ADDR'
`append [binary] value FILENAME EXPR'
     Append the contents of memory from START_ADDR to END_ADDR, or the
     value of EXPR, to the file FILENAME, in raw binary form.  (GDB can
     only append data to files in raw binary form.)

`restore FILENAME [binary] BIAS START END'
     Restore the contents of file FILENAME into memory.  The `restore'
     command can automatically recognize any known BFD file format,
     except for raw binary.  To restore a raw binary file you must
     specify the optional keyword `binary' after the filename.

     If 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 BIAS.  Other bfd files have a
     built-in location; they will be restored at offset BIAS from that
     location.

     If START and/or END are non-zero, then only data between file
     offset START and file offset END will be restored.  These offsets
     are relative to the addresses in the file, before the BIAS
     argument is applied.



File: gdb.info,  Node: Core File Generation,  Next: Character Sets,  Prev: Dump/Restore Files,  Up: Data

10.18 How to Produce a Core File from Your Program
==================================================

A "core file" or "core dump" is a file that records the memory image of
a running process and its process status (register values etc.).  Its
primary use is post-mortem debugging of a program that crashed while it
ran outside a debugger.  A program that crashes automatically produces
a core file, unless this feature is disabled by the user.  *Note
Files::, for information on invoking GDB in the post-mortem debugging
mode.

   Occasionally, you may wish to produce a core file of the program you
are debugging in order to preserve a snapshot of its state.  GDB has a
special command for that.

`generate-core-file [FILE]'
`gcore [FILE]'
     Produce a core dump of the inferior process.  The optional argument
     FILE specifies the file name where to put the core dump.  If not
     specified, the file name defaults to `core.PID', where PID is the
     inferior process ID.

     Note that this command is implemented only for some systems (as of
     this writing, GNU/Linux, FreeBSD, Solaris, Unixware, and S390).


File: gdb.info,  Node: Character Sets,  Next: Caching Remote Data,  Prev: Core File Generation,  Up: Data

10.19 Character Sets
====================

If the program you are debugging uses a different character set to
represent characters and strings than the one GDB uses itself, GDB can
automatically translate between the character sets for you.  The
character set GDB uses we call the "host character set"; the one the
inferior program uses we call the "target character set".

   For example, if you are running GDB on a GNU/Linux system, which
uses the ISO Latin 1 character set, but you are using GDB's remote
protocol (*note Remote Debugging::) to debug a program running on an
IBM mainframe, which uses the EBCDIC character set, then the host
character set is Latin-1, and the target character set is EBCDIC.  If
you give GDB the command `set target-charset EBCDIC-US', then GDB
translates between EBCDIC and Latin 1 as you print character or string
values, or use character and string literals in expressions.

   GDB has no way to automatically recognize which character set the
inferior program uses; you must tell it, using the `set target-charset'
command, described below.

   Here are the commands for controlling GDB's character set support:

`set target-charset CHARSET'
     Set the current target character set to CHARSET.  To display the
     list of supported target character sets, type
     `set target-charset <TAB><TAB>'.

`set host-charset CHARSET'
     Set the current host character set to CHARSET.

     By default, GDB uses a host character set appropriate to the
     system it is running on; you can override that default using the
     `set host-charset' command.  On some systems, GDB cannot
     automatically determine the appropriate host character set.  In
     this case, GDB uses `UTF-8'.

     GDB can only use certain character sets as its host character set.
     If you type `set host-charset <TAB><TAB>', GDB will list the host
     character sets it supports.

`set charset CHARSET'
     Set the current host and target character sets to CHARSET.  As
     above, if you type `set charset <TAB><TAB>', GDB will list the
     names of the character sets that can be used for both host and
     target.

`show charset'
     Show the names of the current host and target character sets.

`show host-charset'
     Show the name of the current host character set.

`show target-charset'
     Show the name of the current target character set.

`set target-wide-charset CHARSET'
     Set the current target's wide character set to CHARSET.  This is
     the character set used by the target's `wchar_t' type.  To display
     the list of supported wide character sets, type
     `set target-wide-charset <TAB><TAB>'.

`show target-wide-charset'
     Show the name of the current target's wide character set.

   Here is an example of GDB's character set support in action.  Assume
that the following source code has been placed in the file
`charset-test.c':

     #include <stdio.h>

     char ascii_hello[]
       = {72, 101, 108, 108, 111, 44, 32, 119,
          111, 114, 108, 100, 33, 10, 0};
     char ibm1047_hello[]
       = {200, 133, 147, 147, 150, 107, 64, 166,
          150, 153, 147, 132, 90, 37, 0};

     main ()
     {
       printf ("Hello, world!\n");
     }

   In this program, `ascii_hello' and `ibm1047_hello' are arrays
containing the string `Hello, world!' followed by a newline, encoded in
the ASCII and IBM1047 character sets.

   We compile the program, and invoke the debugger on it:

     $ gcc -g charset-test.c -o charset-test
     $ gdb -nw charset-test
     GNU gdb 2001-12-19-cvs
     Copyright 2001 Free Software Foundation, Inc.
     ...
     (gdb)

   We can use the `show charset' command to see what character sets GDB
is currently using to interpret and display characters and strings:

     (gdb) show charset
     The current host and target character set is `ISO-8859-1'.
     (gdb)

   For the sake of printing this manual, let's use ASCII as our initial
character set:
     (gdb) set charset ASCII
     (gdb) show charset
     The current host and target character set is `ASCII'.
     (gdb)

   Let's assume that ASCII is indeed the correct character set for our
host system -- in other words, let's assume that if GDB prints
characters using the ASCII character set, our terminal will display
them properly.  Since our current target character set is also ASCII,
the contents of `ascii_hello' print legibly:

     (gdb) print ascii_hello
     $1 = 0x401698 "Hello, world!\n"
     (gdb) print ascii_hello[0]
     $2 = 72 'H'
     (gdb)

   GDB uses the target character set for character and string literals
you use in expressions:

     (gdb) print '+'
     $3 = 43 '+'
     (gdb)

   The ASCII character set uses the number 43 to encode the `+'
character.

   GDB relies on the user to tell it which character set the target
program uses.  If we print `ibm1047_hello' while our target character
set is still ASCII, we get jibberish:

     (gdb) print ibm1047_hello
     $4 = 0x4016a8 "\310\205\223\223\226k@\246\226\231\223\204Z%"
     (gdb) print ibm1047_hello[0]
     $5 = 200 '\310'
     (gdb)

   If we invoke the `set target-charset' followed by <TAB><TAB>, GDB
tells us the character sets it supports:

     (gdb) set target-charset
     ASCII       EBCDIC-US   IBM1047     ISO-8859-1
     (gdb) set target-charset

   We can select IBM1047 as our target character set, and examine the
program's strings again.  Now the ASCII string is wrong, but GDB
translates the contents of `ibm1047_hello' from the target character
set, IBM1047, to the host character set, ASCII, and they display
correctly:

     (gdb) set target-charset IBM1047
     (gdb) show charset
     The current host character set is `ASCII'.
     The current target character set is `IBM1047'.
     (gdb) print ascii_hello
     $6 = 0x401698 "\110\145%%?\054\040\167?\162%\144\041\012"
     (gdb) print ascii_hello[0]
     $7 = 72 '\110'
     (gdb) print ibm1047_hello
     $8 = 0x4016a8 "Hello, world!\n"
     (gdb) print ibm1047_hello[0]
     $9 = 200 'H'
     (gdb)

   As above, GDB uses the target character set for character and string
literals you use in expressions:

     (gdb) print '+'
     $10 = 78 '+'
     (gdb)

   The IBM1047 character set uses the number 78 to encode the `+'
character.


File: gdb.info,  Node: Caching Remote Data,  Next: Searching Memory,  Prev: Character Sets,  Up: Data

10.20 Caching Data of Remote Targets
====================================

GDB caches data exchanged between the debugger and a remote target
(*note Remote Debugging::).  Such caching generally improves
performance, because it reduces the overhead of the remote protocol by
bundling memory reads and writes into large chunks.  Unfortunately,
simply caching everything would lead to incorrect results, since GDB
does not necessarily know anything about volatile values, memory-mapped
I/O addresses, etc.  Furthermore, in non-stop mode (*note Non-Stop
Mode::) memory can be changed _while_ a gdb command is executing.
Therefore, by default, GDB only caches data known to be on the stack(1).
Other regions of memory can be explicitly marked as cacheable; see
*note Memory Region Attributes::.

`set remotecache on'
`set remotecache off'
     This option no longer does anything; it exists for compatibility
     with old scripts.

`show remotecache'
     Show the current state of the obsolete remotecache flag.

`set stack-cache on'
`set stack-cache off'
     Enable or disable caching of stack accesses.  When `ON', use
     caching.  By default, this option is `ON'.

`show stack-cache'
     Show the current state of data caching for memory accesses.

`info dcache [line]'
     Print the information about the data cache performance.  The
     information displayed includes the dcache width and depth, and for
     each cache line, its number, address, and how many times it was
     referenced.  This command is useful for debugging the data cache
     operation.

     If a line number is specified, the contents of that line will be
     printed in hex.

`set dcache size SIZE'
     Set maximum number of entries in dcache (dcache depth above).

`set dcache line-size LINE-SIZE'
     Set number of bytes each dcache entry caches (dcache width above).
     Must be a power of 2.

`show dcache size'
     Show maximum number of dcache entries.  See also *note info
     dcache: Caching Remote Data.

`show dcache line-size'
     Show default size of dcache lines.  See also *note info dcache:
     Caching Remote Data.


   ---------- Footnotes ----------

   (1) In non-stop mode, it is moderately rare for a running thread to
modify the stack of a stopped thread in a way that would interfere with
a backtrace, and caching of stack reads provides a significant speed up
of remote backtraces.


File: gdb.info,  Node: Searching Memory,  Prev: Caching Remote Data,  Up: Data

10.21 Search Memory
===================

Memory can be searched for a particular sequence of bytes with the
`find' command.

`find [/SN] START_ADDR, +LEN, VAL1 [, VAL2, ...]'
`find [/SN] START_ADDR, END_ADDR, VAL1 [, VAL2, ...]'
     Search memory for the sequence of bytes specified by VAL1, VAL2,
     etc.  The search begins at address START_ADDR and continues for
     either LEN bytes or through to END_ADDR inclusive.

   S and N are optional parameters.  They may be specified in either
order, apart or together.

S, search query size
     The size of each search query value.

    `b'
          bytes

    `h'
          halfwords (two bytes)

    `w'
          words (four bytes)

    `g'
          giant words (eight bytes)

     All values are interpreted in the current language.  This means,
     for example, that if the current source language is C/C++ then
     searching for the string "hello" includes the trailing '\0'.

     If the value size is not specified, it is taken from the value's
     type in the current language.  This is useful when one wants to
     specify the search pattern as a mixture of types.  Note that this
     means, for example, that in the case of C-like languages a search
     for an untyped 0x42 will search for `(int) 0x42' which is
     typically four bytes.

N, maximum number of finds
     The maximum number of matches to print.  The default is to print
     all finds.

   You can use strings as search values.  Quote them with double-quotes
(`"').  The string value is copied into the search pattern byte by byte,
regardless of the endianness of the target and the size specification.

   The address of each match found is printed as well as a count of the
number of matches found.

   The address of the last value found is stored in convenience variable
`$_'.  A count of the number of matches is stored in `$numfound'.

   For example, if stopped at the `printf' in this function:

     void
     hello ()
     {
       static char hello[] = "hello-hello";
       static struct { char c; short s; int i; }
         __attribute__ ((packed)) mixed
         = { 'c', 0x1234, 0x87654321 };
       printf ("%s\n", hello);
     }

you get during debugging:

     (gdb) find &hello[0], +sizeof(hello), "hello"
     0x804956d <hello.1620+6>
     1 pattern found
     (gdb) find &hello[0], +sizeof(hello), 'h', 'e', 'l', 'l', 'o'
     0x8049567 <hello.1620>
     0x804956d <hello.1620+6>
     2 patterns found
     (gdb) find /b1 &hello[0], +sizeof(hello), 'h', 0x65, 'l'
     0x8049567 <hello.1620>
     1 pattern found
     (gdb) find &mixed, +sizeof(mixed), (char) 'c', (short) 0x1234, (int) 0x87654321
     0x8049560 <mixed.1625>
     1 pattern found
     (gdb) print $numfound
     $1 = 1
     (gdb) print $_
     $2 = (void *) 0x8049560


File: gdb.info,  Node: Optimized Code,  Next: Macros,  Prev: Data,  Up: Top

11 Debugging Optimized Code
***************************

Almost all compilers support optimization.  With optimization disabled,
the compiler generates assembly code that corresponds directly to your
source code, in a simplistic way.  As the compiler applies more
powerful optimizations, the generated assembly code diverges from your
original source code.  With help from debugging information generated
by the compiler, GDB can map from the running program back to
constructs from your original source.

   GDB is more accurate with optimization disabled.  If you can
recompile without optimization, it is easier to follow the progress of
your program during debugging.  But, there are many cases where you may
need to debug an optimized version.

   When you debug a program compiled with `-g -O', remember that the
optimizer has rearranged your code; the debugger shows you what is
really there.  Do not be too surprised when the execution path does not
exactly match your source file!  An extreme example: if you define a
variable, but never use it, GDB never sees that variable--because the
compiler optimizes it out of existence.

   Some things do not work as well with `-g -O' as with just `-g',
particularly on machines with instruction scheduling.  If in doubt,
recompile with `-g' alone, and if this fixes the problem, please report
it to us as a bug (including a test case!).  *Note Variables::, for
more information about debugging optimized code.

* Menu:

* Inline Functions::            How GDB presents inlining
* Tail Call Frames::            GDB analysis of jumps to functions


File: gdb.info,  Node: Inline Functions,  Next: Tail Call Frames,  Up: Optimized Code

11.1 Inline Functions
=====================

"Inlining" is an optimization that inserts a copy of the function body
directly at each call site, instead of jumping to a shared routine.
GDB displays inlined functions just like non-inlined functions.  They
appear in backtraces.  You can view their arguments and local
variables, step into them with `step', skip them with `next', and
escape from them with `finish'.  You can check whether a function was
inlined by using the `info frame' command.

   For GDB to support inlined functions, the compiler must record
information about inlining in the debug information -- GCC using the
DWARF 2 format does this, and several other compilers do also.  GDB
only supports inlined functions when using DWARF 2.  Versions of GCC
before 4.1 do not emit two required attributes (`DW_AT_call_file' and
`DW_AT_call_line'); GDB does not display inlined function calls with
earlier versions of GCC.  It instead displays the arguments and local
variables of inlined functions as local variables in the caller.

   The body of an inlined function is directly included at its call
site; unlike a non-inlined function, there are no instructions devoted
to the call.  GDB still pretends that the call site and the start of
the inlined function are different instructions.  Stepping to the call
site shows the call site, and then stepping again shows the first line
of the inlined function, even though no additional instructions are
executed.

   This makes source-level debugging much clearer; you can see both the
context of the call and then the effect of the call.  Only stepping by
a single instruction using `stepi' or `nexti' does not do this; single
instruction steps always show the inlined body.

   There are some ways that GDB does not pretend that inlined function
calls are the same as normal calls:

   * You cannot set breakpoints on inlined functions.  GDB either
     reports that there is no symbol with that name, or else sets the
     breakpoint only on non-inlined copies of the function.  This
     limitation will be removed in a future version of GDB; until then,
     set a breakpoint by line number on the first line of the inlined
     function instead.

   * Setting breakpoints at the call site of an inlined function may not
     work, because the call site does not contain any code.  GDB may
     incorrectly move the breakpoint to the next line of the enclosing
     function, after the call.  This limitation will be removed in a
     future version of GDB; until then, set a breakpoint on an earlier
     line or inside the inlined function instead.

   * GDB cannot locate the return value of inlined calls after using
     the `finish' command.  This is a limitation of compiler-generated
     debugging information; after `finish', you can step to the next
     line and print a variable where your program stored the return
     value.



File: gdb.info,  Node: Tail Call Frames,  Prev: Inline Functions,  Up: Optimized Code

11.2 Tail Call Frames
=====================

Function `B' can call function `C' in its very last statement.  In
unoptimized compilation the call of `C' is immediately followed by
return instruction at the end of `B' code.  Optimizing compiler may
replace the call and return in function `B' into one jump to function
`C' instead.  Such use of a jump instruction is called "tail call".

   During execution of function `C', there will be no indication in the
function call stack frames that it was tail-called from `B'.  If
function `A' regularly calls function `B' which tail-calls function `C',
then GDB will see `A' as the caller of `C'.  However, in some cases GDB
can determine that `C' was tail-called from `B', and it will then
create fictitious call frame for that, with the return address set up
as if `B' called `C' normally.

   This functionality is currently supported only by DWARF 2 debugging
format and the compiler has to produce `DW_TAG_GNU_call_site' tags.
With GCC, you need to specify `-O -g' during compilation, to get this
information.

   `info frame' command (*note Frame Info::) will indicate the tail
call frame kind by text `tail call frame' such as in this sample GDB
output:

     (gdb) x/i $pc - 2
        0x40066b <b(int, double)+11>: jmp 0x400640 <c(int, double)>
     (gdb) info frame
     Stack level 1, frame at 0x7fffffffda30:
      rip = 0x40066d in b (amd64-entry-value.cc:59); saved rip 0x4004c5
      tail call frame, caller of frame at 0x7fffffffda30
      source language c++.
      Arglist at unknown address.
      Locals at unknown address, Previous frame's sp is 0x7fffffffda30

   The detection of all the possible code path executions can find them
ambiguous.  There is no execution history stored (possible *note
Reverse Execution:: is never used for this purpose) and the last known
caller could have reached the known callee by multiple different jump
sequences.  In such case GDB still tries to show at least all the
unambiguous top tail callers and all the unambiguous bottom tail
calees, if any.

`set debug entry-values'
     When set to on, enables printing of analysis messages for both
     frame argument values at function entry and tail calls.  It will
     show all the possible valid tail calls code paths it has
     considered.  It will also print the intersection of them with the
     final unambiguous (possibly partial or even empty) code path
     result.

`show debug entry-values'
     Show the current state of analysis messages printing for both
     frame argument values at function entry and tail calls.

   The analysis messages for tail calls can for example show why the
virtual tail call frame for function `c' has not been recognized (due
to the indirect reference by variable `x'):

     static void __attribute__((noinline, noclone)) c (void);
     void (*x) (void) = c;
     static void __attribute__((noinline, noclone)) a (void) { x++; }
     static void __attribute__((noinline, noclone)) c (void) { a (); }
     int main (void) { x (); return 0; }

     Breakpoint 1, DW_OP_GNU_entry_value resolving cannot find
     DW_TAG_GNU_call_site 0x40039a in main
     a () at t.c:3
     3	static void __attribute__((noinline, noclone)) a (void) { x++; }
     (gdb) bt
     #0  a () at t.c:3
     #1  0x000000000040039a in main () at t.c:5

   Another possibility is an ambiguous virtual tail call frames
resolution:

     int i;
     static void __attribute__((noinline, noclone)) f (void) { i++; }
     static void __attribute__((noinline, noclone)) e (void) { f (); }
     static void __attribute__((noinline, noclone)) d (void) { f (); }
     static void __attribute__((noinline, noclone)) c (void) { d (); }
     static void __attribute__((noinline, noclone)) b (void)
     { if (i) c (); else e (); }
     static void __attribute__((noinline, noclone)) a (void) { b (); }
     int main (void) { a (); return 0; }

     tailcall: initial: 0x4004d2(a) 0x4004ce(b) 0x4004b2(c) 0x4004a2(d)
     tailcall: compare: 0x4004d2(a) 0x4004cc(b) 0x400492(e)
     tailcall: reduced: 0x4004d2(a) |
     (gdb) bt
     #0  f () at t.c:2
     #1  0x00000000004004d2 in a () at t.c:8
     #2  0x0000000000400395 in main () at t.c:9

   Frames #0 and #2 are real, #1 is a virtual tail call frame.  The
code can have possible execution paths `main->a->b->c->d->f' or
`main->a->b->e->f', GDB cannot find which one from the inferior state.

   `initial:' state shows some random possible calling sequence GDB has
found.  It then finds another possible calling sequcen - that one is
prefixed by `compare:'.  The non-ambiguous intersection of these two is
printed as the `reduced:' calling sequence.  That one could have many
futher `compare:' and `reduced:' statements as long as there remain any
non-ambiguous sequence entries.

   For the frame of function `b' in both cases there are different
possible `$pc' values (`0x4004cc' or `0x4004ce'), therefore this frame
is also ambigous.  The only non-ambiguous frame is the one for function
`a', therefore this one is displayed to the user while the ambiguous
frames are omitted.

   There can be also reasons why printing of frame argument values at
function entry may fail:

     int v;
     static void __attribute__((noinline, noclone)) c (int i) { v++; }
     static void __attribute__((noinline, noclone)) a (int i);
     static void __attribute__((noinline, noclone)) b (int i) { a (i); }
     static void __attribute__((noinline, noclone)) a (int i)
     { if (i) b (i - 1); else c (0); }
     int main (void) { a (5); return 0; }

     (gdb) bt
     #0  c (i=i@entry=0) at t.c:2
     #1  0x0000000000400428 in a (DW_OP_GNU_entry_value resolving has found
     function "a" at 0x400420 can call itself via tail calls
     i=<optimized out>) at t.c:6
     #2  0x000000000040036e in main () at t.c:7

   GDB cannot find out from the inferior state if and how many times did
function `a' call itself (via function `b') as these calls would be
tail calls.  Such tail calls would modify thue `i' variable, therefore
GDB cannot be sure the value it knows would be right - GDB prints
`<optimized out>' instead.


File: gdb.info,  Node: Macros,  Next: Tracepoints,  Prev: Optimized Code,  Up: Top

12 C Preprocessor Macros
************************

Some languages, such as C and C++, provide a way to define and invoke
"preprocessor macros" which expand into strings of tokens.  GDB can
evaluate expressions containing macro invocations, show the result of
macro expansion, and show a macro's definition, including where it was
defined.

   You may need to compile your program specially to provide GDB with
information about preprocessor macros.  Most compilers do not include
macros in their debugging information, even when you compile with the
`-g' flag.  *Note 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, GDB uses the macros in scope at that frame's source code line.
Otherwise, GDB uses the macros in scope at the current listing location;
see *note List::.

   Whenever GDB evaluates an expression, it always expands any macro
invocations present in the expression.  GDB also provides the following
commands for working with macros explicitly.

`macro expand EXPRESSION'
`macro exp EXPRESSION'
     Show the results of expanding all preprocessor macro invocations in
     EXPRESSION.  Since GDB simply expands macros, but does not parse
     the result, EXPRESSION need not be a valid expression; it can be
     any string of tokens.

`macro expand-once EXPRESSION'
`macro exp1 EXPRESSION'
     (This command is not yet implemented.)  Show the results of
     expanding those preprocessor macro invocations that appear
     explicitly in EXPRESSION.  Macro invocations appearing in that
     expansion are left unchanged.  This command allows you to see the
     effect of a particular macro more clearly, without being confused
     by further expansions.  Since GDB simply expands macros, but does
     not parse the result, EXPRESSION need not be a valid expression; it
     can be any string of tokens.

`info macro [-a|-all] [--] MACRO'
     Show the current definition or all definitions of the named MACRO,
     and describe the source location or compiler command-line where
     that definition was established.  The optional double dash is to
     signify the end of argument processing and the beginning of MACRO
     for non C-like macros where the macro may begin with a hyphen.

`info macros LINESPEC'
     Show all macro definitions that are in effect at the location
     specified by LINESPEC,  and describe the source location or
     compiler command-line where those definitions were established.

`macro define MACRO REPLACEMENT-LIST'
`macro define MACRO(ARGLIST) REPLACEMENT-LIST'
     Introduce a definition for a preprocessor macro named MACRO,
     invocations of which are replaced by the tokens given in
     REPLACEMENT-LIST.  The first form of 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
     ARGLIST.

     A definition introduced by this command is in scope in every
     expression evaluated in GDB, until it is removed with the `macro
     undef' command, described below.  The definition overrides all
     definitions for MACRO present in the program being debugged, as
     well as any previous user-supplied definition.

`macro undef MACRO'
     Remove any user-supplied definition for the macro named MACRO.
     This command only affects definitions provided with the `macro
     define' command, described above; it cannot remove definitions
     present in the program being debugged.

`macro list'
     List all the macros defined using the `macro define' command.

   Here is a transcript showing the above commands in action.  First, we
show our source files:

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

   Now, we compile the program using the GNU C compiler, GCC.  We pass
the `-gdwarf-2'(1) _and_ `-g3' flags to ensure the compiler includes
information about preprocessor macros in the debugging information.

     $ gcc -gdwarf-2 -g3 sample.c -o sample
     $

   Now, we start GDB on our sample program:

     $ gdb -nw sample
     GNU gdb 2002-05-06-cvs
     Copyright 2002 Free Software Foundation, Inc.
     GDB is free software, ...
     (gdb)

   We can expand macros and examine their definitions, even when the
program is not running.  GDB uses the current listing position to
decide which macro definitions are in scope:

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

   In the example above, note that `macro expand-once' expands only the
macro invocation explicit in the original text -- the invocation of
`ADD' -- but does not expand the invocation of the macro `M', which was
introduced by `ADD'.

   Once the program is running, GDB uses the macro definitions in force
at the source line of the current stack frame:

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

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

   At line 10, the definition of the macro `N' at line 9 is in force:

     (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)

   As we step over directives that remove `N''s definition, and then
give it a new definition, GDB finds the definition (or lack thereof) in
force at each point:

     (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)

   In addition to source files, macros can be defined on the
compilation command line using the `-DNAME=VALUE' syntax.  For macros
defined in such a way, GDB displays the location of their definition as
line zero of the source file submitted to the compiler.

     (gdb) info macro __STDC__
     Defined at /home/jimb/gdb/macros/play/sample.c:0
     -D__STDC__=1
     (gdb)

   ---------- Footnotes ----------

   (1) This is the minimum.  Recent versions of GCC support `-gdwarf-3'
and `-gdwarf-4'; we recommend always choosing the most recent version
of DWARF.


File: gdb.info,  Node: Tracepoints,  Next: Overlays,  Prev: Macros,  Up: Top

13 Tracepoints
**************

In some applications, it is not feasible for the debugger to interrupt
the program's execution long enough for the developer to learn anything
helpful about its behavior.  If the program's correctness depends on
its real-time behavior, delays introduced by a debugger might cause the
program to change its behavior drastically, or perhaps fail, even when
the code itself is correct.  It is useful to be able to observe the
program's behavior without interrupting it.

   Using GDB's `trace' and `collect' commands, you can specify
locations in the program, called "tracepoints", and arbitrary
expressions to evaluate when those tracepoints are reached.  Later,
using the `tfind' command, you can examine the values those expressions
had when the program hit the tracepoints.  The expressions may also
denote objects in memory--structures or arrays, for example--whose
values GDB should record; while visiting a particular tracepoint, you
may inspect those objects as if they were in memory at that moment.
However, because GDB records these values without interacting with you,
it can do so quickly and unobtrusively, hopefully not disturbing the
program's behavior.

   The tracepoint facility is currently available only for remote
targets.  *Note 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 GDB support
tracepoints as of this writing.  The format of the remote packets used
to implement tracepoints are described in *note Tracepoint Packets::.

   It is also possible to get trace data from a file, in a manner
reminiscent of corefiles; you specify the filename, and use `tfind' to
search through the file.  *Note Trace Files::, for more details.

   This chapter describes the tracepoint commands and features.

* Menu:

* Set Tracepoints::
* Analyze Collected Data::
* Tracepoint Variables::
* Trace Files::


File: gdb.info,  Node: Set Tracepoints,  Next: Analyze Collected Data,  Up: Tracepoints

13.1 Commands to Set Tracepoints
================================

Before running such a "trace experiment", an arbitrary number of
tracepoints can be set.  A tracepoint is actually a special type of
breakpoint (*note Set Breaks::), so you can manipulate it using
standard breakpoint commands.  For instance, as with breakpoints,
tracepoint numbers are successive integers starting from one, and many
of the commands associated with tracepoints take the tracepoint number
as their argument, to identify which tracepoint to work on.

   For each tracepoint, you can specify, in advance, some arbitrary set
of data that you want the target to collect in the trace buffer when it
hits that tracepoint.  The collected data can include registers, local
variables, or global data.  Later, you can use GDB commands to examine
the values these data had at the time the tracepoint was hit.

   Tracepoints do not support every breakpoint feature.  Ignore counts
on tracepoints have no effect, and tracepoints cannot run GDB commands
when they are hit.  Tracepoints may not be thread-specific either.

   Some targets may support "fast tracepoints", which are inserted in a
different way (such as with a jump instead of a trap), that is faster
but possibly restricted in where they may be installed.

   Regular and fast tracepoints are dynamic tracing facilities, meaning
that they can be used to insert tracepoints at (almost) any location in
the target.  Some targets may also support controlling "static
tracepoints" from GDB.  With static tracing, a set of instrumentation
points, also known as "markers", are embedded in the target program,
and can be activated or deactivated by name or address.  These are
usually placed at locations which facilitate investigating what the
target is actually doing.  GDB's support for static tracing includes
being able to list instrumentation points, and attach them with GDB
defined high level tracepoints that expose the whole range of
convenience of GDB's tracepoints support.  Namely, support for
collecting registers values and values of global or local (to the
instrumentation point) variables; tracepoint conditions and trace state
variables.  The act of installing a GDB static tracepoint on an
instrumentation point, or marker, is referred to as "probing" a static
tracepoint marker.

   `gdbserver' supports tracepoints on some target systems.  *Note
Tracepoints support in `gdbserver': Server.

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

* Menu:

* Create and Delete Tracepoints::
* Enable and Disable Tracepoints::
* Tracepoint Passcounts::
* Tracepoint Conditions::
* Trace State Variables::
* Tracepoint Actions::
* Listing Tracepoints::
* Listing Static Tracepoint Markers::
* Starting and Stopping Trace Experiments::
* Tracepoint Restrictions::


File: gdb.info,  Node: Create and Delete Tracepoints,  Next: Enable and Disable Tracepoints,  Up: Set Tracepoints

13.1.1 Create and Delete Tracepoints
------------------------------------

`trace LOCATION'
     The `trace' command is very similar to the `break' command.  Its
     argument LOCATION can be a source line, a function name, or an
     address in the target program.  *Note Specify Location::.  The
     `trace' command defines a tracepoint, which is a point in the
     target program where the debugger will briefly stop, collect some
     data, and then allow the program to continue.  Setting a
     tracepoint or changing its actions takes effect immediately if the
     remote stub supports the `InstallInTrace' feature (*note install
     tracepoint in tracing::).  If remote stub doesn't support the
     `InstallInTrace' feature, all these changes don't take effect
     until the next `tstart' command, and once a trace experiment is
     running, further changes will not have any effect until the next
     trace experiment starts.  In addition, GDB supports "pending
     tracepoints"--tracepoints whose address is not yet resolved.
     (This is similar to pending breakpoints.)  Pending tracepoints are
     not downloaded to the target and not installed until they are
     resolved.  The resolution of pending tracepoints requires GDB
     support--when debugging with the remote target, and GDB
     disconnects from the remote stub (*note disconnected tracing::),
     pending tracepoints can not be resolved (and downloaded to the
     remote stub) while GDB is disconnected.

     Here are some examples of using the `trace' command:

          (gdb) trace foo.c:121    // a source file and line number

          (gdb) trace +2           // 2 lines forward

          (gdb) trace my_function  // first source line of function

          (gdb) trace *my_function // EXACT start address of function

          (gdb) trace *0x2117c4    // an address

     You can abbreviate `trace' as `tr'.

`trace LOCATION if COND'
     Set a tracepoint with condition COND; evaluate the expression COND
     each time the tracepoint is reached, and collect data only if the
     value is nonzero--that is, if COND evaluates as true.  *Note
     Tracepoint Conditions: Tracepoint Conditions, for more information
     on tracepoint conditions.

`ftrace LOCATION [ if COND ]'
     The `ftrace' command sets a fast tracepoint.  For targets that
     support them, fast tracepoints will use a more efficient but
     possibly less general technique to trigger data collection, such
     as a jump instruction instead of a trap, or some sort of hardware
     support.  It may not be possible to create a fast tracepoint at
     the desired location, in which case the command will exit with an
     explanatory message.

     GDB handles arguments to `ftrace' exactly as for `trace'.

     On 32-bit x86-architecture systems, fast tracepoints normally need
     to be placed at an instruction that is 5 bytes or longer, but can
     be placed at 4-byte instructions if the low 64K of memory of the
     target program is available to install trampolines.  Some
     Unix-type systems, such as GNU/Linux, exclude low addresses from
     the program's address space; but for instance with the Linux
     kernel it is possible to let GDB use this area by doing a `sysctl'
     command to set the `mmap_min_addr' kernel parameter, as in

          sudo sysctl -w vm.mmap_min_addr=32768

     which sets the low address to 32K, which leaves plenty of room for
     trampolines.  The minimum address should be set to a page boundary.

`strace LOCATION [ if COND ]'
     The `strace' command sets a static tracepoint.  For targets that
     support it, setting a static tracepoint probes a static
     instrumentation point, or marker, found at LOCATION.  It may not
     be possible to set a static tracepoint at the desired location, in
     which case the command will exit with an explanatory message.

     GDB handles arguments to `strace' exactly as for `trace', with the
     addition that the user can also specify `-m MARKER' as LOCATION.
     This probes the marker identified by the MARKER string identifier.
     This identifier depends on the static tracepoint backend library
     your program is using.  You can find all the marker identifiers in
     the `ID' field of the `info static-tracepoint-markers' command
     output.  *Note Listing Static Tracepoint Markers: Listing Static
     Tracepoint Markers.  For example, in the following small program
     using the UST tracing engine:

          main ()
          {
            trace_mark(ust, bar33, "str %s", "FOOBAZ");
          }

     the marker id is composed of joining the first two arguments to the
     `trace_mark' call with a slash, which translates to:

          (gdb) info static-tracepoint-markers
          Cnt Enb ID         Address            What
          1   n   ust/bar33  0x0000000000400ddc in main at stexample.c:22
                   Data: "str %s"
          [etc...]

     so you may probe the marker above with:

          (gdb) strace -m ust/bar33

     Static tracepoints accept an extra collect action -- `collect
     $_sdata'.  This collects arbitrary user data passed in the probe
     point call to the tracing library.  In the UST example above,
     you'll see that the third argument to `trace_mark' is a
     printf-like format string.  The user data is then the result of
     running that formating string against the following arguments.
     Note that `info static-tracepoint-markers' command output lists
     that format string in the `Data:' field.

     You can inspect this data when analyzing the trace buffer, by
     printing the $_sdata variable like any other variable available to
     GDB.  *Note Tracepoint Action Lists: Tracepoint Actions.

     The convenience variable `$tpnum' records the tracepoint number of
     the most recently set tracepoint.

`delete tracepoint [NUM]'
     Permanently delete one or more tracepoints.  With no argument, the
     default is to delete all tracepoints.  Note that the regular
     `delete' command can remove tracepoints also.

     Examples:

          (gdb) delete trace 1 2 3 // remove three tracepoints

          (gdb) delete trace       // remove all tracepoints

     You can abbreviate this command as `del tr'.


File: gdb.info,  Node: Enable and Disable Tracepoints,  Next: Tracepoint Passcounts,  Prev: Create and Delete Tracepoints,  Up: Set Tracepoints

13.1.2 Enable and Disable Tracepoints
-------------------------------------

These commands are deprecated; they are equivalent to plain `disable'
and `enable'.

`disable tracepoint [NUM]'
     Disable tracepoint NUM, or all tracepoints if no argument NUM is
     given.  A disabled tracepoint will have no effect during a trace
     experiment, but it is not forgotten.  You can re-enable a disabled
     tracepoint using the `enable tracepoint' command.  If the command
     is issued during a trace experiment and the debug target has
     support for disabling tracepoints during a trace experiment, then
     the change will be effective immediately.  Otherwise, it will be
     applied to the next trace experiment.

`enable tracepoint [NUM]'
     Enable tracepoint NUM, or all tracepoints.  If this command is
     issued during a trace experiment and the debug target supports
     enabling tracepoints during a trace experiment, then the enabled
     tracepoints will become effective immediately.  Otherwise, they
     will become effective the next time a trace experiment is run.


File: gdb.info,  Node: Tracepoint Passcounts,  Next: Tracepoint Conditions,  Prev: Enable and Disable Tracepoints,  Up: Set Tracepoints

13.1.3 Tracepoint Passcounts
----------------------------

`passcount [N [NUM]]'
     Set the "passcount" of a tracepoint.  The passcount is a way to
     automatically stop a trace experiment.  If a tracepoint's
     passcount is N, then the trace experiment will be automatically
     stopped on the N'th time that tracepoint is hit.  If the
     tracepoint number NUM is not specified, the `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:

          (gdb) passcount 5 2 // Stop on the 5th execution of
                                        `// tracepoint 2'

          (gdb) passcount 12  // Stop on the 12th execution of the
                                        `// most recently defined tracepoint.'
          (gdb) trace foo
          (gdb) pass 3
          (gdb) trace bar
          (gdb) pass 2
          (gdb) trace baz
          (gdb) pass 1        // Stop tracing when foo has been
                                         `// executed 3 times OR when bar has'
                                         `// been executed 2 times'
                                         `// OR when baz has been executed 1 time.'



File: gdb.info,  Node: Tracepoint Conditions,  Next: Trace State Variables,  Prev: Tracepoint Passcounts,  Up: Set Tracepoints

13.1.4 Tracepoint Conditions
----------------------------

The simplest sort of tracepoint collects data every time your program
reaches a specified place.  You can also specify a "condition" for a
tracepoint.  A condition is just a Boolean expression in your
programming language (*note Expressions: Expressions.).  A tracepoint
with a condition evaluates the expression each time your program
reaches it, and data collection happens only if the condition is true.

   Tracepoint conditions can be specified when a tracepoint is set, by
using `if' in the arguments to the `trace' command.  *Note Setting
Tracepoints: Create and Delete Tracepoints.  They can also be set or
changed at any time with the `condition' command, just as with
breakpoints.

   Unlike breakpoint conditions, GDB does not actually evaluate the
conditional expression itself.  Instead, GDB encodes the expression
into an agent expression (*note Agent Expressions::) suitable for
execution on the target, independently of GDB.  Global variables become
raw memory locations, locals become stack accesses, and so forth.

   For instance, suppose you have a function that is usually called
frequently, but should not be called after an error has occurred.  You
could use the following tracepoint command to collect data about calls
of that function that happen while the error code is propagating
through the program; an unconditional tracepoint could end up
collecting thousands of useless trace frames that you would have to
search through.

     (gdb) trace normal_operation if errcode > 0


File: gdb.info,  Node: Trace State Variables,  Next: Tracepoint Actions,  Prev: Tracepoint Conditions,  Up: Set Tracepoints

13.1.5 Trace State Variables
----------------------------

A "trace state variable" is a special type of variable that is created
and managed by target-side code.  The syntax is the same as that for
GDB's convenience variables (a string prefixed with "$"), but they are
stored on the target.  They must be created explicitly, using a
`tvariable' command.  They are always 64-bit signed integers.

   Trace state variables are remembered by GDB, and downloaded to the
target along with tracepoint information when the trace experiment
starts.  There are no intrinsic limits on the number of trace state
variables, beyond memory limitations of the target.

   Although trace state variables are managed by the target, you can use
them in print commands and expressions as if they were convenience
variables; GDB will get the current value from the target while the
trace experiment is running.  Trace state variables share the same
namespace as other "$" variables, which means that you cannot have
trace state variables with names like `$23' or `$pc', nor can you have
a trace state variable and a convenience variable with the same name.

`tvariable $NAME [ = EXPRESSION ]'
     The `tvariable' command creates a new trace state variable named
     `$NAME', and optionally gives it an initial value of EXPRESSION.
     EXPRESSION is evaluated when this command is entered; the result
     will be converted to an integer if possible, otherwise GDB will
     report an error. A subsequent `tvariable' command specifying the
     same name does not create a variable, but instead assigns the
     supplied initial value to the existing variable of that name,
     overwriting any previous initial value. The default initial value
     is 0.

`info tvariables'
     List all the trace state variables along with their initial values.
     Their current values may also be displayed, if the trace
     experiment is currently running.

`delete tvariable [ $NAME ... ]'
     Delete the given trace state variables, or all of them if no
     arguments are specified.



File: gdb.info,  Node: Tracepoint Actions,  Next: Listing Tracepoints,  Prev: Trace State Variables,  Up: Set Tracepoints

13.1.6 Tracepoint Action Lists
------------------------------

`actions [NUM]'
     This command will prompt for a list of actions to be taken when the
     tracepoint is hit.  If the tracepoint number 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
     `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 `end'.
     So far, the only defined actions are `collect', `teval', and
     `while-stepping'.

     `actions' is actually equivalent to `commands' (*note Breakpoint
     Command Lists: Break Commands.), except that only the defined
     actions are allowed; any other GDB command is rejected.

     To remove all actions from a tracepoint, type `actions NUM' and
     follow it immediately with `end'.

          (gdb) collect DATA // collect some data

          (gdb) while-stepping 5 // single-step 5 times, collect data

          (gdb) end              // signals the end of actions.

     In the following example, the action list begins with `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 `while-stepping' command is used,
     followed by the list of things to be collected after each step in a
     sequence of single steps.  The `while-stepping' command is
     terminated by its own separate `end' command.  Lastly, the action
     list is terminated by an `end' command.

          (gdb) trace foo
          (gdb) actions
          Enter actions for tracepoint 1, one per line:
          > collect bar,baz
          > collect $regs
          > while-stepping 12
            > collect $pc, arr[i]
            > end
          end

`collect[/MODS] EXPR1, EXPR2, ...'
     Collect values of the given expressions when the tracepoint is hit.
     This command accepts a comma-separated list of any valid
     expressions.  In addition to global, static, or local variables,
     the following special arguments are supported:

    `$regs'
          Collect all registers.

    `$args'
          Collect all function arguments.

    `$locals'
          Collect all local variables.

    `$_ret'
          Collect the return address.  This is helpful if you want to
          see more of a backtrace.

    `$_sdata'
          Collect static tracepoint marker specific data.  Only
          available for static tracepoints.  *Note Tracepoint Action
          Lists: Tracepoint Actions.  On the UST static tracepoints
          library backend, an instrumentation point resembles a
          `printf' function call.  The tracing library is able to
          collect user specified data formatted to a character string
          using the format provided by the programmer that instrumented
          the program.  Other backends have similar mechanisms.  Here's
          an example of a UST marker call:

                const char master_name[] = "$your_name";
                trace_mark(channel1, marker1, "hello %s", master_name)

          In this case, collecting `$_sdata' collects the string `hello
          $yourname'.  When analyzing the trace buffer, you can inspect
          `$_sdata' like any other variable available to GDB.

     You can give several consecutive `collect' commands, each one with
     a single argument, or one `collect' command with several arguments
     separated by commas; the effect is the same.

     The optional MODS changes the usual handling of the arguments.
     `s' requests that pointers to chars be handled as strings, in
     particular collecting the contents of the memory being pointed at,
     up to the first zero.  The upper bound is by default the value of
     the `print elements' variable; if `s' is followed by a decimal
     number, that is the upper bound instead.  So for instance
     `collect/s25 mystr' collects as many as 25 characters at `mystr'.

     The command `info scope' (*note info scope: Symbols.) is
     particularly useful for figuring out what data to collect.

`teval EXPR1, EXPR2, ...'
     Evaluate the given expressions when the tracepoint is hit.  This
     command accepts a comma-separated list of expressions.  The results
     are discarded, so this is mainly useful for assigning values to
     trace state variables (*note Trace State Variables::) without
     adding those values to the trace buffer, as would be the case if
     the `collect' action were used.

`while-stepping N'
     Perform N single-step instruction traces after the tracepoint,
     collecting new data after each step.  The `while-stepping' command
     is followed by the list of what to collect while stepping
     (followed by its own `end' command):

          > while-stepping 12
            > collect $regs, myglobal
            > end
          >

     Note that `$pc' is not automatically collected by
     `while-stepping'; you need to explicitly collect that register if
     you need it.  You may abbreviate `while-stepping' as `ws' or
     `stepping'.

`set default-collect EXPR1, EXPR2, ...'
     This variable is a list of expressions to collect at each
     tracepoint hit.  It is effectively an additional `collect' action
     prepended to every tracepoint action list.  The expressions are
     parsed individually for each tracepoint, so for instance a
     variable named `xyz' may be interpreted as a global for one
     tracepoint, and a local for another, as appropriate to the
     tracepoint's location.

`show default-collect'
     Show the list of expressions that are collected by default at each
     tracepoint hit.



File: gdb.info,  Node: Listing Tracepoints,  Next: Listing Static Tracepoint Markers,  Prev: Tracepoint Actions,  Up: Set Tracepoints

13.1.7 Listing Tracepoints
--------------------------

`info tracepoints [NUM...]'
     Display information about the tracepoint NUM.  If you don't
     specify a tracepoint number, displays information about all the
     tracepoints defined so far.  The format is similar to that used for
     `info breakpoints'; in fact, `info tracepoints' is the same
     command, simply restricting itself to tracepoints.

     A tracepoint's listing may include additional information specific
     to tracing:

        * its passcount as given by the `passcount N' command

          (gdb) info trace
          Num     Type           Disp Enb Address    What
          1       tracepoint     keep y   0x0804ab57 in foo() at main.cxx:7
                  while-stepping 20
                    collect globfoo, $regs
                  end
                  collect globfoo2
                  end
                  pass count 1200
          (gdb)

     This command can be abbreviated `info tp'.


File: gdb.info,  Node: Listing Static Tracepoint Markers,  Next: Starting and Stopping Trace Experiments,  Prev: Listing Tracepoints,  Up: Set Tracepoints

13.1.8 Listing Static Tracepoint Markers
----------------------------------------

`info static-tracepoint-markers'
     Display information about all static tracepoint markers defined in
     the program.

     For each marker, the following columns are printed:

    _Count_
          An incrementing counter, output to help readability.  This is
          not a stable identifier.

    _ID_
          The marker ID, as reported by the target.

    _Enabled or Disabled_
          Probed markers are tagged with `y'.  `n' identifies marks
          that are not enabled.

    _Address_
          Where the marker is in your program, as a memory address.

    _What_
          Where the marker is in the source for your program, as a file
          and line number.  If the debug information included in the
          program does not allow GDB to locate the source of the
          marker, this column will be left blank.

     In addition, the following information may be printed for each
     marker:

    _Data_
          User data passed to the tracing library by the marker call.
          In the UST backend, this is the format string passed as
          argument to the marker call.

    _Static tracepoints probing the marker_
          The list of static tracepoints attached to the marker.

          (gdb) info static-tracepoint-markers
          Cnt ID         Enb Address            What
          1   ust/bar2   y   0x0000000000400e1a in main at stexample.c:25
               Data: number1 %d number2 %d
               Probed by static tracepoints: #2
          2   ust/bar33  n   0x0000000000400c87 in main at stexample.c:24
               Data: str %s
          (gdb)


File: gdb.info,  Node: Starting and Stopping Trace Experiments,  Next: Tracepoint Restrictions,  Prev: Listing Static Tracepoint Markers,  Up: Set Tracepoints

13.1.9 Starting and Stopping Trace Experiments
----------------------------------------------

`tstart'
     This command starts the trace experiment, and begins collecting
     data.  It has the side effect of discarding all the data collected
     in the trace buffer during the previous trace experiment.  If any
     arguments are supplied, they are taken as a note and stored with
     the trace experiment's state.  The notes may be arbitrary text,
     and are especially useful with disconnected tracing in a
     multi-user context; the notes can explain what the trace is doing,
     supply user contact information, and so forth.

`tstop'
     This command stops the trace experiment.  If any arguments are
     supplied, they are recorded with the experiment as a note.  This is
     useful if you are stopping a trace started by someone else, for
     instance if the trace is interfering with the system's behavior and
     needs to be stopped quickly.

     *Note*: a trace experiment and data collection may stop
     automatically if any tracepoint's passcount is reached (*note
     Tracepoint Passcounts::), or if the trace buffer becomes full.

`tstatus'
     This command displays the status of the current trace data
     collection.

   Here is an example of the commands we described so far:

     (gdb) trace gdb_c_test
     (gdb) actions
     Enter actions for tracepoint #1, one per line.
     > collect $regs,$locals,$args
     > while-stepping 11
       > collect $regs
       > end
     > end
     (gdb) tstart
     	[time passes ...]
     (gdb) tstop

   You can choose to continue running the trace experiment even if GDB
disconnects from the target, voluntarily or involuntarily.  For
commands such as `detach', the debugger will ask what you want to do
with the trace.  But for unexpected terminations (GDB crash, network
outage), it would be unfortunate to lose hard-won trace data, so the
variable `disconnected-tracing' lets you decide whether the trace should
continue running without GDB.

`set disconnected-tracing on'
`set disconnected-tracing off'
     Choose whether a tracing run should continue to run if GDB has
     disconnected from the target.  Note that `detach' or `quit' will
     ask you directly what to do about a running trace no matter what
     this variable's setting, so the variable is mainly useful for
     handling unexpected situations, such as loss of the network.

`show disconnected-tracing'
     Show the current choice for disconnected tracing.


   When you reconnect to the target, the trace experiment may or may not
still be running; it might have filled the trace buffer in the
meantime, or stopped for one of the other reasons.  If it is running,
it will continue after reconnection.

   Upon reconnection, the target will upload information about the
tracepoints in effect.  GDB will then compare that information to the
set of tracepoints currently defined, and attempt to match them up,
allowing for the possibility that the numbers may have changed due to
creation and deletion in the meantime.  If one of the target's
tracepoints does not match any in GDB, the debugger will create a new
tracepoint, so that you have a number with which to specify that
tracepoint.  This matching-up process is necessarily heuristic, and it
may result in useless tracepoints being created; you may simply delete
them if they are of no use.

   If your target agent supports a "circular trace buffer", then you
can run a trace experiment indefinitely without filling the trace
buffer; when space runs out, the agent deletes already-collected trace
frames, oldest first, until there is enough room to continue
collecting.  This is especially useful if your tracepoints are being
hit too often, and your trace gets terminated prematurely because the
buffer is full.  To ask for a circular trace buffer, simply set
`circular-trace-buffer' to on.  You can set this at any time, including
during tracing; if the agent can do it, it will change buffer handling
on the fly, otherwise it will not take effect until the next run.

`set circular-trace-buffer on'
`set circular-trace-buffer off'
     Choose whether a tracing run should use a linear or circular buffer
     for trace data.  A linear buffer will not lose any trace data, but
     may fill up prematurely, while a circular buffer will discard old
     trace data, but it will have always room for the latest tracepoint
     hits.

`show circular-trace-buffer'
     Show the current choice for the trace buffer.  Note that this may
     not match the agent's current buffer handling, nor is it
     guaranteed to match the setting that might have been in effect
     during a past run, for instance if you are looking at frames from
     a trace file.


`set trace-user TEXT'

`show trace-user'

`set trace-notes TEXT'
     Set the trace run's notes.

`show trace-notes'
     Show the trace run's notes.

`set trace-stop-notes TEXT'
     Set the trace run's stop notes.  The handling of the note is as for
     `tstop' arguments; the set command is convenient way to fix a stop
     note that is mistaken or incomplete.

`show trace-stop-notes'
     Show the trace run's stop notes.



File: gdb.info,  Node: Tracepoint Restrictions,  Prev: Starting and Stopping Trace Experiments,  Up: Set Tracepoints

13.1.10 Tracepoint Restrictions
-------------------------------

There are a number of restrictions on the use of tracepoints.  As
described above, tracepoint data gathering occurs on the target without
interaction from GDB.  Thus the full capabilities of the debugger are
not available during data gathering, and then at data examination time,
you will be limited by only having what was collected.  The following
items describe some common problems, but it is not exhaustive, and you
may run into additional difficulties not mentioned here.

   * Tracepoint expressions are intended to gather objects (lvalues).
     Thus the full flexibility of GDB's expression evaluator is not
     available.  You cannot call functions, cast objects to aggregate
     types, access convenience variables or modify values (except by
     assignment to trace state variables).  Some language features may
     implicitly call functions (for instance Objective-C fields with
     accessors), and therefore cannot be collected either.

   * Collection of local variables, either individually or in bulk with
     `$locals' or `$args', during `while-stepping' may behave
     erratically.  The stepping action may enter a new scope (for
     instance by stepping into a function), or the location of the
     variable may change (for instance it is loaded into a register).
     The tracepoint data recorded uses the location information for the
     variables that is correct for the tracepoint location.  When the
     tracepoint is created, it is not possible, in general, to determine
     where the steps of a `while-stepping' sequence will advance the
     program--particularly if a conditional branch is stepped.

   * Collection of an incompletely-initialized or partially-destroyed
     object may result in something that GDB cannot display, or displays
     in a misleading way.

   * When GDB displays a pointer to character it automatically
     dereferences the pointer to also display characters of the string
     being pointed to.  However, collecting the pointer during tracing
     does not automatically collect the string.  You need to explicitly
     dereference the pointer and provide size information if you want to
     collect not only the pointer, but the memory pointed to.  For
     example, `*ptr@50' can be used to collect the 50 element array
     pointed to by `ptr'.

   * It is not possible to collect a complete stack backtrace at a
     tracepoint.  Instead, you may collect the registers and a few
     hundred bytes from the stack pointer with something like
     `*(unsigned char *)$esp@300' (adjust to use the name of the actual
     stack pointer register on your target architecture, and the amount
     of stack you wish to capture).  Then the `backtrace' command will
     show a partial backtrace when using a trace frame.  The number of
     stack frames that can be examined depends on the sizes of the
     frames in the collected stack.  Note that if you ask for a block
     so large that it goes past the bottom of the stack, the target
     agent may report an error trying to read from an invalid address.

   * If you do not collect registers at a tracepoint, GDB can infer
     that the value of `$pc' must be the same as the address of the
     tracepoint and use that when you are looking at a trace frame for
     that tracepoint.  However, this cannot work if the tracepoint has
     multiple locations (for instance if it was set in a function that
     was inlined), or if it has a `while-stepping' loop.  In those cases
     GDB will warn you that it can't infer `$pc', and default it to
     zero.



File: gdb.info,  Node: Analyze Collected Data,  Next: Tracepoint Variables,  Prev: Set Tracepoints,  Up: Tracepoints

13.2 Using the Collected Data
=============================

After the tracepoint experiment ends, you use GDB commands for
examining the trace data.  The basic idea is that each tracepoint
collects a trace "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 "focus" on a specific trace
snapshot.  When the remote stub is focused on a trace snapshot, it will
respond to all GDB requests for memory and registers by reading from
the buffer which belongs to that snapshot, rather than from _real_
memory or registers of the program being debugged.  This means that
*all* GDB commands (`print', `info registers', `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


File: gdb.info,  Node: tfind,  Next: tdump,  Up: Analyze Collected Data

13.2.1 `tfind N'
----------------

The basic command for selecting a trace snapshot from the buffer is
`tfind N', which finds trace snapshot number N, counting from zero.  If
no argument N is given, the next snapshot is selected.

   Here are the various forms of using the `tfind' command.

`tfind start'
     Find the first snapshot in the buffer.  This is a synonym for
     `tfind 0' (since 0 is the number of the first snapshot).

`tfind none'
     Stop debugging trace snapshots, resume _live_ debugging.

`tfind end'
     Same as `tfind none'.

`tfind'
     No argument means find the next trace snapshot.

`tfind -'
     Find the previous trace snapshot before the current one.  This
     permits retracing earlier steps.

`tfind tracepoint NUM'
     Find the next snapshot associated with tracepoint NUM.  Search
     proceeds forward from the last examined trace snapshot.  If no
     argument NUM is given, it means find the next snapshot collected
     for the same tracepoint as the current snapshot.

`tfind pc ADDR'
     Find the next snapshot associated with the value ADDR of the
     program counter.  Search proceeds forward from the last examined
     trace snapshot.  If no argument ADDR is given, it means find the
     next snapshot with the same value of PC as the current snapshot.

`tfind outside ADDR1, ADDR2'
     Find the next snapshot whose PC is outside the given range of
     addresses (exclusive).

`tfind range ADDR1, ADDR2'
     Find the next snapshot whose PC is between ADDR1 and ADDR2
     (inclusive).

`tfind line [FILE:]N'
     Find the next snapshot associated with the source line N.  If the
     optional argument FILE is given, refer to line N in that source
     file.  Search proceeds forward from the last examined trace
     snapshot.  If no argument N is given, it means find the next line
     other than the one currently being examined; thus saying `tfind
     line' repeatedly can appear to have the same effect as stepping
     from line to line in a _live_ debugging session.

   The default arguments for the `tfind' commands are specifically
designed to make it easy to scan through the trace buffer.  For
instance, `tfind' with no argument selects the next trace snapshot, and
`tfind -' with no argument selects the previous trace snapshot.  So, by
giving one `tfind' command, and then simply hitting <RET> repeatedly
you can examine all the trace snapshots in order.  Or, by saying `tfind
-' and then hitting <RET> repeatedly you can examine the snapshots in
reverse order.  The `tfind line' command with no argument selects the
snapshot for the next source line executed.  The `tfind pc' command with
no argument selects the next snapshot with the same program counter
(PC) as the current frame.  The `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 GDB 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:

     (gdb) tfind start
     (gdb) 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

   Or, if we want to examine the variable `X' at each source line in
the buffer:

     (gdb) tfind start
     (gdb) 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


File: gdb.info,  Node: tdump,  Next: save tracepoints,  Prev: tfind,  Up: Analyze Collected Data

13.2.2 `tdump'
--------------

This command takes no arguments.  It prints all the data collected at
the current trace snapshot.

     (gdb) trace 444
     (gdb) actions
     Enter actions for tracepoint #2, one per line:
     > collect $regs, $locals, $args, gdb_long_test
     > end

     (gdb) tstart

     (gdb) 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", )

     (gdb) 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'

     (gdb)

   `tdump' works by scanning the tracepoint's current collection
actions and printing the value of each expression listed.  So `tdump'
can fail, if after a run, you change the tracepoint's actions to
mention variables that were not collected during the run.

   Also, for tracepoints with `while-stepping' loops, `tdump' uses the
collected value of `$pc' to distinguish between trace frames that were
collected at the tracepoint hit, and frames that were collected while
stepping.  This allows it to correctly choose whether to display the
basic list of collections, or the collections from the body of the
while-stepping loop.  However, if `$pc' was not collected, then `tdump'
will always attempt to dump using the basic collection list, and may
fail if a while-stepping frame does not include all the same data that
is collected at the tracepoint hit.


File: gdb.info,  Node: save tracepoints,  Prev: tdump,  Up: Analyze Collected Data

13.2.3 `save tracepoints FILENAME'
----------------------------------

This command saves all current tracepoint definitions together with
their actions and passcounts, into a file `FILENAME' suitable for use
in a later debugging session.  To read the saved tracepoint
definitions, use the `source' command (*note Command Files::).  The
`save-tracepoints' command is a deprecated alias for `save tracepoints'


File: gdb.info,  Node: Tracepoint Variables,  Next: Trace Files,  Prev: Analyze Collected Data,  Up: Tracepoints

13.3 Convenience Variables for Tracepoints
==========================================

`(int) $trace_frame'
     The current trace snapshot (a.k.a. "frame") number, or -1 if no
     snapshot is selected.

`(int) $tracepoint'
     The tracepoint for the current trace snapshot.

`(int) $trace_line'
     The line number for the current trace snapshot.

`(char []) $trace_file'
     The source file for the current trace snapshot.

`(char []) $trace_func'
     The name of the function containing `$tracepoint'.

   Note: `$trace_file' is not suitable for use in `printf', use
`output' instead.

   Here's a simple example of using these convenience variables for
stepping through all the trace snapshots and printing some of their
data.  Note that these are not the same as trace state variables, which
are managed by the target.

     (gdb) tfind start

     (gdb) while $trace_frame != -1
     > output $trace_file
     > printf ", line %d (tracepoint #%d)\n", $trace_line, $tracepoint
     > tfind
     > end


File: gdb.info,  Node: Trace Files,  Prev: Tracepoint Variables,  Up: Tracepoints

13.4 Using Trace Files
======================

In some situations, the target running a trace experiment may no longer
be available; perhaps it crashed, or the hardware was needed for a
different activity.  To handle these cases, you can arrange to dump the
trace data into a file, and later use that file as a source of trace
data, via the `target tfile' command.

`tsave [ -r ] FILENAME'
     Save the trace data to FILENAME.  By default, this command assumes
     that FILENAME refers to the host filesystem, so if necessary GDB
     will copy raw trace data up from the target and then save it.  If
     the target supports it, you can also supply the optional argument
     `-r' ("remote") to direct the target to save the data directly
     into FILENAME in its own filesystem, which may be more efficient
     if the trace buffer is very large.  (Note, however, that `target
     tfile' can only read from files accessible to the host.)

`target tfile FILENAME'
     Use the file named FILENAME as a source of trace data.  Commands
     that examine data work as they do with a live target, but it is not
     possible to run any new trace experiments.  `tstatus' will report
     the state of the trace run at the moment the data was saved, as
     well as the current trace frame you are examining.  FILENAME must
     be on a filesystem accessible to the host.



File: gdb.info,  Node: Overlays,  Next: Languages,  Prev: Tracepoints,  Up: Top

14 Debugging Programs That Use Overlays
***************************************

If your program is too large to fit completely in your target system's
memory, you can sometimes use "overlays" to work around this problem.
GDB provides some support for debugging programs that use overlays.

* Menu:

* How Overlays Work::              A general explanation of overlays.
* Overlay Commands::               Managing overlays in GDB.
* Automatic Overlay Debugging::    GDB can find out which overlays are
                                   mapped by asking the inferior.
* Overlay Sample Program::         A sample program using overlays.


File: gdb.info,  Node: How Overlays Work,  Next: Overlay Commands,  Up: Overlays

14.1 How Overlays Work
======================

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

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

                         A code overlay

   The diagram (*note 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 "mapped" overlay; its "mapped address" is its address in the
instruction memory.  An overlay not present (or only partially present)
in instruction memory is called "unmapped"; its "load address" is its
address in the larger memory.  The mapped address is also called the
"virtual memory address", or "VMA"; the load address is also called the
"load memory address", or "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:

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

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

   * 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 *note Overlay Description: (ld.info)Overlay
     Description.

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


   The overlay system described above is rather simple, and could be
improved in many ways:

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

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

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



File: gdb.info,  Node: Overlay Commands,  Next: Automatic Overlay Debugging,  Prev: How Overlays Work,  Up: Overlays

14.2 Overlay Commands
=====================

To use GDB'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
GDB to determine the appropriate address of a function or variable,
depending on whether the overlay is mapped or not.

   GDB's overlay commands all start with the word `overlay'; you can
abbreviate this as `ov' or `ovly'.  The commands are:

`overlay off'
     Disable GDB's overlay support.  When overlay support is disabled,
     GDB assumes that all functions and variables are always present at
     their mapped addresses.  By default, GDB's overlay support is
     disabled.

`overlay manual'
     Enable "manual" overlay debugging.  In this mode, GDB relies on
     you to tell it which overlays are mapped, and which are not, using
     the `overlay map-overlay' and `overlay unmap-overlay' commands
     described below.

`overlay map-overlay OVERLAY'
`overlay map OVERLAY'
     Tell GDB that OVERLAY is now mapped; OVERLAY must be the name of
     the object file section containing the overlay.  When an overlay
     is mapped, GDB assumes it can find the overlay's functions and
     variables at their mapped addresses.  GDB assumes that any other
     overlays whose mapped ranges overlap that of OVERLAY are now
     unmapped.

`overlay unmap-overlay OVERLAY'
`overlay unmap OVERLAY'
     Tell GDB that OVERLAY is no longer mapped; OVERLAY must be the
     name of the object file section containing the overlay.  When an
     overlay is unmapped, GDB assumes it can find the overlay's
     functions and variables at their load addresses.

`overlay auto'
     Enable "automatic" overlay debugging.  In this mode, GDB consults
     a data structure the overlay manager maintains in the inferior to
     see which overlays are mapped.  For details, see *note Automatic
     Overlay Debugging::.

`overlay load-target'
`overlay load'
     Re-read the overlay table from the inferior.  Normally, GDB
     re-reads the table GDB automatically each time the inferior stops,
     so this command should only be necessary if you have changed the
     overlay mapping yourself using GDB.  This command is only useful
     when using automatic overlay debugging.

`overlay list-overlays'
`overlay list'
     Display a list of the overlays currently mapped, along with their
     mapped addresses, load addresses, and sizes.


   Normally, when GDB prints a code address, it includes the name of
the function the address falls in:

     (gdb) print main
     $3 = {int ()} 0x11a0 <main>
   When overlay debugging is enabled, GDB recognizes code in unmapped
overlays, and prints the names of unmapped functions with asterisks
around them.  For example, if `foo' is a function in an unmapped
overlay, GDB prints it this way:

     (gdb) overlay list
     No sections are mapped.
     (gdb) print foo
     $5 = {int (int)} 0x100000 <*foo*>
   When `foo''s overlay is mapped, GDB prints the function's name
normally:

     (gdb) overlay list
     Section .ov.foo.text, loaded at 0x100000 - 0x100034,
             mapped at 0x1016 - 0x104a
     (gdb) print foo
     $6 = {int (int)} 0x1016 <foo>

   When overlay debugging is enabled, GDB can find the correct address
for functions and variables in an overlay, whether or not the overlay
is mapped.  This allows most GDB commands, like `break' and
`disassemble', to work normally, even on unmapped code.  However, GDB's
breakpoint support has some limitations:

   * You can set breakpoints in functions in unmapped overlays, as long
     as GDB can write to the overlay at its load address.

   * GDB 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 GDB which overlays are now mapped,
     if you are using manual overlay management), GDB will re-set its
     breakpoints properly.


File: gdb.info,  Node: Automatic Overlay Debugging,  Next: Overlay Sample Program,  Prev: Overlay Commands,  Up: Overlays

14.3 Automatic Overlay Debugging
================================

GDB 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 `overlay
auto' command (*note Overlay Commands::), GDB 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
GDB's automatic overlay debugging:

`_ovly_table':
     This variable must be an array of the following structures:

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

`_novlys':
     This variable must be a four-byte signed integer, holding the total
     number of elements in `_ovly_table'.


   To decide whether a particular overlay is mapped or not, GDB looks
for an entry in `_ovly_table' whose `vma' and `lma' members equal the
VMA and LMA of the overlay's section in the executable file.  When GDB
finds a matching entry, it consults the entry's `mapped' member to
determine whether the overlay is currently mapped.

   In addition, your overlay manager may define a function called
`_ovly_debug_event'.  If this function is defined, GDB will silently
set a breakpoint there.  If the overlay manager then calls this
function whenever it has changed the overlay table, this will enable
GDB 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.


File: gdb.info,  Node: Overlay Sample Program,  Prev: Automatic Overlay Debugging,  Up: Overlays

14.4 Overlay Sample 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 (*note Overlay
Description: (ld.info)Overlay Description.).  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 GDB's overlay support.

   However, the GDB 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
`gdb/testsuite/gdb.base':

`overlays.c'
     The main program file.

`ovlymgr.c'
     A simple overlay manager, used by `overlays.c'.

`foo.c'
`bar.c'
`baz.c'
`grbx.c'
     Overlay modules, loaded and used by `overlays.c'.

`d10v.ld'
`m32r.ld'
     Linker scripts for linking the test program on the `d10v-elf' and
     `m32r-elf' targets.

   You can build the test program using the `d10v-elf' GCC
cross-compiler like this:

     $ 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

   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 `d10v-elf-gcc' and `d10v.ld'.


File: gdb.info,  Node: Languages,  Next: Symbols,  Prev: Overlays,  Up: Top

15 Using GDB with Different Languages
*************************************

Although programming languages generally have common aspects, they are
rarely expressed in the same manner.  For instance, in ANSI C,
dereferencing a pointer `p' is accomplished by `*p', but in Modula-2,
it is accomplished by `p^'.  Values can also be represented (and
displayed) differently.  Hex numbers in C appear as `0x1ae', while in
Modula-2 they appear as `1AEH'.

   Language-specific information is built into GDB for some languages,
allowing you to express operations like the above in your program's
native language, and allowing GDB 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 "working language".

* Menu:

* Setting::                     Switching between source languages
* Show::                        Displaying the language
* Checks::                      Type and range checks
* Supported Languages::         Supported languages
* Unsupported Languages::       Unsupported languages


File: gdb.info,  Node: Setting,  Next: Show,  Up: Languages

15.1 Switching Between Source Languages
=======================================

There are two ways to control the working language--either have GDB set
it automatically, or select it manually yourself.  You can use the `set
language' command for either purpose.  On startup, GDB 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 GDB
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 GDB infers the language from the
name of the file.  The language of a source file controls whether C++
names are demangled--this way `backtrace' can show each frame
appropriately for its own language.  There is no way to set the
language of a source file from within GDB, but you can set the language
associated with a filename extension.  *Note Displaying the Language:
Show.

   This is most commonly a problem when you use a program, such as
`cfront' or `f2c', that generates C but is written in another language.
In that case, make the program use `#line' directives in its C output;
that way GDB 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 GDB infer the source language


File: gdb.info,  Node: Filenames,  Next: Manually,  Up: Setting

15.1.1 List of Filename Extensions and Languages
------------------------------------------------

If a source file name ends in one of the following extensions, then GDB
infers that its language is the one indicated.

`.ada'
`.ads'
`.adb'
`.a'
     Ada source file.

`.c'
     C source file

`.C'
`.cc'
`.cp'
`.cpp'
`.cxx'
`.c++'
     C++ source file

`.d'
     D source file

`.m'
     Objective-C source file

`.f'
`.F'
     Fortran source file

`.mod'
     Modula-2 source file

`.s'
`.S'
     Assembler source file.  This actually behaves almost like C, but
     GDB does not skip over function prologues when stepping.

   In addition, you may set the language associated with a filename
extension.  *Note Displaying the Language: Show.


File: gdb.info,  Node: Manually,  Next: Automatically,  Prev: Filenames,  Up: Setting

15.1.2 Setting the Working Language
-----------------------------------

If you allow GDB to set the language automatically, expressions are
interpreted the same way in your debugging session and your program.

   If you wish, you may set the language manually.  To do this, issue
the command `set language LANG', where LANG is the name of a language,
such as `c' or `modula-2'.  For a list of the supported languages, type
`set language'.

   Setting the language manually prevents GDB 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 GDB was parsing Modula-2, a command such as:

     print a = b + c

might not have the effect you intended.  In C, this means to add `b'
and `c' and place the result in `a'.  The result printed would be the
value of `a'.  In Modula-2, this means to compare `a' to the result of
`b+c', yielding a `BOOLEAN' value.


File: gdb.info,  Node: Automatically,  Prev: Manually,  Up: Setting

15.1.3 Having GDB Infer the Source Language
-------------------------------------------

To have GDB set the working language automatically, use `set language
local' or `set language auto'.  GDB then infers the working language.
That is, when your program stops in a frame (usually by encountering a
breakpoint), GDB 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 GDB 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 `set language auto' in this case
frees you from having to set the working language manually.


File: gdb.info,  Node: Show,  Next: Checks,  Prev: Setting,  Up: Languages

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

`show language'
     Display the current working language.  This is the language you
     can use with commands such as `print' to build and compute
     expressions that may involve variables in your program.

`info frame'
     Display the source language for this frame.  This language becomes
     the working language if you use an identifier from this frame.
     *Note Information about a Frame: Frame Info, to identify the other
     information listed here.

`info source'
     Display the source language of this source file.  *Note Examining
     the Symbol Table: Symbols, to identify the other information
     listed here.

   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:

`set extension-language EXT LANGUAGE'
     Tell GDB that source files with extension EXT are to be assumed as
     written in the source language LANGUAGE.

`info extensions'
     List all the filename extensions and the associated languages.


File: gdb.info,  Node: Checks,  Next: Supported Languages,  Prev: Show,  Up: Languages

15.3 Type and Range Checking
============================

     _Warning:_ In this release, the GDB commands for type and range
     checking are included, but they do not yet have any effect.  This
     section documents the intended facilities.

   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.

   GDB can check for conditions like the above if you wish.  Although
GDB does not check the statements in your program, it can check
expressions entered directly into GDB for evaluation via the `print'
command, for example.  As with the working language, GDB can also
decide whether or not to check automatically based on your program's
source language.  *Note Supported Languages: Supported Languages, for
the default settings of supported languages.

* Menu:

* Type Checking::               An overview of type checking
* Range Checking::              An overview of range checking


File: gdb.info,  Node: Type Checking,  Next: Range Checking,  Up: Checks

15.3.1 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,

     1 + 2 => 3
but
     error--> 1 + 2.3

   The second example fails because the `CARDINAL' 1 is not
type-compatible with the `REAL' 2.3.

   For the expressions you use in GDB commands, you can tell the GDB
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, GDB 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 GDB from evaluating an expression.  For
instance, GDB does not know how to add an `int' and a `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.  *Note Supported Languages: Supported Languages, for further
details on specific languages.

   GDB provides some additional commands for controlling the type
checker:

`set check type auto'
     Set type checking on or off based on the current working language.
     *Note Supported Languages: Supported Languages, for the default
     settings for each language.

`set check type on'
`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, GDB prints a
     message and aborts evaluation of the expression.

`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, GDB cannot add numbers
     and structures.

`show type'
     Show the current setting of the type checker, and whether or not
     GDB is setting it automatically.


File: gdb.info,  Node: Range Checking,  Prev: Type Checking,  Up: Checks

15.3.2 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 GDB commands, you can tell GDB 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 M is the largest
integer value, and S is the smallest, then

     M + 1 => S

   This, too, is specific to individual languages, and in some cases
specific to individual compilers or machines.  *Note Supported
Languages: Supported Languages, for further details on specific
languages.

   GDB provides some additional commands for controlling the range
checker:

`set check range auto'
     Set range checking on or off based on the current working language.
     *Note Supported Languages: Supported Languages, for the default
     settings for each language.

`set check range on'
`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.

`set check range warn'
     Output messages when the GDB 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).

`show range'
     Show the current setting of the range checker, and whether or not
     it is being set automatically by GDB.


File: gdb.info,  Node: Supported Languages,  Next: Unsupported Languages,  Prev: Checks,  Up: Languages

15.4 Supported Languages
========================

GDB supports C, C++, D, Objective-C, Fortran, Java, OpenCL C, Pascal,
assembly, Modula-2, and Ada.  Some GDB features may be used in
expressions regardless of the language you use: the GDB `@' and `::'
operators, and the `{type}addr' construct (*note 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 GDB.  These sections are not meant to be language
tutorials or references, but serve only as a reference guide to what the
GDB 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++
* D::                           D
* Objective-C::                 Objective-C
* OpenCL C::                    OpenCL C
* Fortran::                     Fortran
* Pascal::                      Pascal
* Modula-2::                    Modula-2
* Ada::                         Ada


File: gdb.info,  Node: C,  Next: D,  Up: Supported Languages

15.4.1 C and C++
----------------

Since C and C++ are so closely related, many features of GDB apply to
both languages.  Whenever this is the case, we discuss those languages
together.

   The C++ debugging facilities are jointly implemented by the C++
compiler and GDB.  Therefore, to debug your C++ code effectively, you
must compile your C++ programs with a supported C++ compiler, such as
GNU `g++', or the HP ANSI C++ compiler (`aCC').

* Menu:

* C Operators::                 C and C++ operators
* C Constants::                 C and C++ constants
* C Plus Plus Expressions::     C++ expressions
* C Defaults::                  Default settings for C and C++
* C Checks::                    C and C++ type and range checks
* Debugging C::                 GDB and C
* Debugging C Plus Plus::       GDB features for C++
* Decimal Floating Point::      Numbers in Decimal Floating Point format


File: gdb.info,  Node: C Operators,  Next: C Constants,  Up: C

15.4.1.1 C and C++ Operators
............................

Operators must be defined on values of specific types.  For instance,
`+' is defined on numbers, but not on structures.  Operators are often
defined on groups of types.

   For the purposes of C and C++, the following definitions hold:

   * _Integral types_ include `int' with any of its storage-class
     specifiers; `char'; `enum'; and, for C++, `bool'.

   * _Floating-point types_ include `float', `double', and `long
     double' (if supported by the target platform).

   * _Pointer types_ include all types defined as `(TYPE *)'.

   * _Scalar types_ include all of the above.


The following operators are supported.  They are listed here in order
of increasing precedence:

`,'
     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.

`='
     Assignment.  The value of an assignment expression is the value
     assigned.  Defined on scalar types.

`OP='
     Used in an expression of the form `A OP= B', and translated to
     `A = A OP B'.  `OP=' and `=' have the same precedence.  OP is any
     one of the operators `|', `^', `&', `<<', `>>', `+', `-', `*',
     `/', `%'.

`?:'
     The ternary operator.  `A ? B : C' can be thought of as:  if A
     then B else C.  A should be of an integral type.

`||'
     Logical OR.  Defined on integral types.

`&&'
     Logical AND.  Defined on integral types.

`|'
     Bitwise OR.  Defined on integral types.

`^'
     Bitwise exclusive-OR.  Defined on integral types.

`&'
     Bitwise AND.  Defined on integral types.

`==, !='
     Equality and inequality.  Defined on scalar types.  The value of
     these expressions is 0 for false and non-zero for true.

`<, >, <=, >='
     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.

`<<, >>'
     left shift, and right shift.  Defined on integral types.

`@'
     The GDB "artificial array" operator (*note Expressions:
     Expressions.).

`+, -'
     Addition and subtraction.  Defined on integral types,
     floating-point types and pointer types.

`*, /, %'
     Multiplication, division, and modulus.  Multiplication and
     division are defined on integral and floating-point types.
     Modulus is defined on integral types.

`++, --'
     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.

`*'
     Pointer dereferencing.  Defined on pointer types.  Same precedence
     as `++'.

`&'
     Address operator.  Defined on variables.  Same precedence as `++'.

     For debugging C++, GDB implements a use of `&' beyond what is
     allowed in the C++ language itself: you can use `&(&REF)' to
     examine the address where a C++ reference variable (declared with
     `&REF') is stored.

`-'
     Negative.  Defined on integral and floating-point types.  Same
     precedence as `++'.

`!'
     Logical negation.  Defined on integral types.  Same precedence as
     `++'.

`~'
     Bitwise complement operator.  Defined on integral types.  Same
     precedence as `++'.

`., ->'
     Structure member, and pointer-to-structure member.  For
     convenience, GDB regards the two as equivalent, choosing whether
     to dereference a pointer based on the stored type information.
     Defined on `struct' and `union' data.

`.*, ->*'
     Dereferences of pointers to members.

`[]'
     Array indexing.  `A[I]' is defined as `*(A+I)'.  Same precedence
     as `->'.

`()'
     Function parameter list.  Same precedence as `->'.

`::'
     C++ scope resolution operator.  Defined on `struct', `union', and
     `class' types.

`::'
     Doubled colons also represent the GDB scope operator (*note
     Expressions: Expressions.).  Same precedence as `::', above.

   If an operator is redefined in the user code, GDB usually attempts
to invoke the redefined version instead of using the operator's
predefined meaning.


File: gdb.info,  Node: C Constants,  Next: C Plus Plus Expressions,  Prev: C Operators,  Up: C

15.4.1.2 C and C++ Constants
............................

GDB allows you to express the constants of C and C++ in the following
ways:

   * Integer constants are a sequence of digits.  Octal constants are
     specified by a leading `0' (i.e. zero), and hexadecimal constants
     by a leading `0x' or `0X'.  Constants may also end with a letter
     `l', specifying that the constant should be treated as a `long'
     value.

   * 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:
     `e[[+]|-]NNN', where NNN is another sequence of digits.  The `+'
     is optional for positive exponents.  A floating-point constant may
     also end with a letter `f' or `F', specifying that the constant
     should be treated as being of the `float' (as opposed to the
     default `double') type; or with a letter `l' or `L', which
     specifies a `long double' constant.

   * Enumerated constants consist of enumerated identifiers, or their
     integral equivalents.

   * Character constants are a single character surrounded by single
     quotes (`''), or a number--the ordinal value of the corresponding
     character (usually its ASCII value).  Within quotes, the single
     character may be represented by a letter or by "escape sequences",
     which are of the form `\NNN', where NNN is the octal representation
     of the character's ordinal value; or of the form `\X', where `X'
     is a predefined special character--for example, `\n' for newline.

     Wide character constants can be written by prefixing a character
     constant with `L', as in C.  For example, `L'x'' is the wide form
     of `x'.  The target wide character set is used when computing the
     value of this constant (*note Character Sets::).

   * String constants are a sequence of character constants surrounded
     by double quotes (`"').  Any valid character constant (as described
     above) may appear.  Double quotes within the string must be
     preceded by a backslash, so for instance `"a\"b'c"' is a string of
     five characters.

     Wide string constants can be written by prefixing a string constant
     with `L', as in C.  The target wide character set is used when
     computing the value of this constant (*note Character Sets::).

   * Pointer constants are an integral value.  You can also write
     pointers to constants using the C operator `&'.

   * Array constants are comma-separated lists surrounded by braces `{'
     and `}'; for example, `{1,2,3}' is a three-element array of
     integers, `{{1,2}, {3,4}, {5,6}}' is a three-by-two array, and
     `{&"hi", &"there", &"fred"}' is a three-element array of pointers.


File: gdb.info,  Node: C Plus Plus Expressions,  Next: C Defaults,  Prev: C Constants,  Up: C

15.4.1.3 C++ Expressions
........................

GDB expression handling can interpret most C++ expressions.

     _Warning:_ GDB can only debug C++ code if you use the proper
     compiler and the proper debug format.  Currently, GDB works best
     when debugging C++ code that is compiled with the most recent
     version of GCC possible.  The DWARF debugging format is preferred;
     GCC defaults to this on most popular platforms.  Other compilers
     and/or debug formats are likely to work badly or not at all when
     using GDB to debug C++ code.  *Note Compilation::.

  1. Member function calls are allowed; you can use expressions like

          count = aml->GetOriginal(x, y)

  2. While a member function is active (in the selected stack frame),
     your expressions have the same namespace available as the member
     function; that is, GDB allows implicit references to the class
     instance pointer `this' following the same rules as C++.  `using'
     declarations in the current scope are also respected by GDB.

  3. You can call overloaded functions; GDB resolves the function call
     to the right definition, with some restrictions.  GDB 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
     `set overload-resolution off'.  *Note GDB Features for C++:
     Debugging C Plus Plus.

     You must specify `set overload-resolution off' in order to use an
     explicit function signature to call an overloaded function, as in
          p 'foo(char,int)'('x', 13)

     The GDB command-completion facility can simplify this; see *note
     Command Completion: Completion.

  4. GDB understands variables declared as C++ references; you can use
     them in expressions just as you do in C++ source--they are
     automatically dereferenced.

     In the parameter list shown when GDB 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 _address_ of a reference variable is always
     shown, unless you have specified `set print address off'.

  5. GDB supports the C++ name resolution operator `::'--your
     expressions can use it just as expressions in your program do.
     Since one scope may be defined in another, you can use `::'
     repeatedly if necessary, for example in an expression like
     `SCOPE1::SCOPE2::NAME'.  GDB also allows resolving name scope by
     reference to source files, in both C and C++ debugging (*note
     Program Variables: Variables.).

  6. GDB performs argument-dependent lookup, following the C++
     specification.


File: gdb.info,  Node: C Defaults,  Next: C Checks,  Prev: C Plus Plus Expressions,  Up: C

15.4.1.4 C and C++ Defaults
...........................

If you allow GDB to set type and range checking automatically, they
both default to `off' whenever the working language changes to C or
C++.  This happens regardless of whether you or GDB selects the working
language.

   If you allow GDB to set the language automatically, it recognizes
source files whose names end with `.c', `.C', or `.cc', etc, and when
GDB enters code compiled from one of these files, it sets the working
language to C or C++.  *Note Having GDB Infer the Source Language:
Automatically, for further details.


File: gdb.info,  Node: C Checks,  Next: Debugging C,  Prev: C Defaults,  Up: C

15.4.1.5 C and C++ Type and Range Checks
........................................

By default, when GDB parses C or C++ expressions, type checking is not
used.  However, if you turn type checking on, GDB considers two
variables type equivalent if:

   * The two variables are structured and have the same structure,
     union, or enumerated tag.

   * The two variables have the same type name, or types that have been
     declared equivalent through `typedef'.


   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.


File: gdb.info,  Node: Debugging C,  Next: Debugging C Plus Plus,  Prev: C Checks,  Up: C

15.4.1.6 GDB and C
..................

The `set print union' and `show print union' commands apply to the
`union' type.  When set to `on', any `union' that is inside a `struct'
or `class' is also printed.  Otherwise, it appears as `{...}'.

   The `@' operator aids in the debugging of dynamic arrays, formed
with pointers and a memory allocation function.  *Note Expressions:
Expressions.


File: gdb.info,  Node: Debugging C Plus Plus,  Next: Decimal Floating Point,  Prev: Debugging C,  Up: C

15.4.1.7 GDB Features for C++
.............................

Some GDB commands are particularly useful with C++, and some are
designed specifically for use with C++.  Here is a summary:

`breakpoint menus'
     When you want a breakpoint in a function whose name is overloaded,
     GDB has the capability to display a menu of possible breakpoint
     locations to help you specify which function definition you want.
     *Note Ambiguous Expressions: Ambiguous Expressions.

`rbreak REGEX'
     Setting breakpoints using regular expressions is helpful for
     setting breakpoints on overloaded functions that are not members
     of any special classes.  *Note Setting Breakpoints: Set Breaks.

`catch throw'
`catch catch'
     Debug C++ exception handling using these commands.  *Note Setting
     Catchpoints: Set Catchpoints.

`ptype TYPENAME'
     Print inheritance relationships as well as other information for
     type TYPENAME.  *Note Examining the Symbol Table: Symbols.

`set print demangle'
`show print demangle'
`set print asm-demangle'
`show print asm-demangle'
     Control whether C++ symbols display in their source form, both when
     displaying code as C++ source and when displaying disassemblies.
     *Note Print Settings: Print Settings.

`set print object'
`show print object'
     Choose whether to print derived (actual) or declared types of
     objects.  *Note Print Settings: Print Settings.

`set print vtbl'
`show print vtbl'
     Control the format for printing virtual function tables.  *Note
     Print Settings: Print Settings.  (The `vtbl' commands do not work
     on programs compiled with the HP ANSI C++ compiler (`aCC').)

`set overload-resolution on'
     Enable overload resolution for C++ expression evaluation.  The
     default is on.  For overloaded functions, GDB evaluates the
     arguments and searches for a function whose signature matches the
     argument types, using the standard C++ conversion rules (see *note
     C++ Expressions: C Plus Plus Expressions, for details).  If it
     cannot find a match, it emits a message.

`set overload-resolution off'
     Disable overload resolution for C++ expression evaluation.  For
     overloaded functions that are not class member functions, GDB
     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,
     GDB searches for a function whose signature _exactly_ matches the
     argument types.

`show overload-resolution'
     Show the current setting of overload resolution.

`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++: type `SYMBOL(TYPES)' rather than just SYMBOL.  You can also
     use the GDB command-line word completion facilities to list the
     available choices, or to finish the type list for you.  *Note
     Command Completion: Completion, for details on how to do this.


File: gdb.info,  Node: Decimal Floating Point,  Prev: Debugging C Plus Plus,  Up: C

15.4.1.8 Decimal Floating Point format
......................................

GDB can examine, set and perform computations with numbers in decimal
floating point format, which in the C language correspond to the
`_Decimal32', `_Decimal64' and `_Decimal128' types as specified by the
extension to support decimal floating-point arithmetic.

   There are two encodings in use, depending on the architecture: BID
(Binary Integer Decimal) for x86 and x86-64, and DPD (Densely Packed
Decimal) for PowerPC.  GDB will use the appropriate encoding for the
configured target.

   Because of a limitation in `libdecnumber', the library used by GDB
to manipulate decimal floating point numbers, it is not possible to
convert (using a cast, for example) integers wider than 32-bit to
decimal float.

   In addition, in order to imitate GDB's behaviour with binary floating
point computations, error checking in decimal float operations ignores
underflow, overflow and divide by zero exceptions.

   In the PowerPC architecture, GDB provides a set of pseudo-registers
to inspect `_Decimal128' values stored in floating point registers.
See *note PowerPC: PowerPC. for more details.


File: gdb.info,  Node: D,  Next: Objective-C,  Prev: C,  Up: Supported Languages

15.4.2 D
--------

GDB can be used to debug programs written in D and compiled with GDC,
LDC or DMD compilers. Currently GDB supports only one D specific
feature -- dynamic arrays.


File: gdb.info,  Node: Objective-C,  Next: OpenCL C,  Prev: D,  Up: Supported Languages

15.4.3 Objective-C
------------------

This section provides information about some commands and command
options that are useful for debugging Objective-C code.  See also *note
info classes: Symbols, and *note info selectors: Symbols, for a few
more commands specific to Objective-C support.

* Menu:

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


File: gdb.info,  Node: Method Names in Commands,  Next: The Print Command with Objective-C,  Up: Objective-C

15.4.3.1 Method Names in Commands
.................................

The following commands have been extended to accept Objective-C method
names as line specifications:

   * `clear'

   * `break'

   * `info line'

   * `jump'

   * `list'

   A fully qualified Objective-C method name is specified as

     -[CLASS METHODNAME]

   where the minus sign is used to indicate an instance method and a
plus sign (not shown) is used to indicate a class method.  The class
name CLASS and method name METHODNAME are enclosed in brackets, similar
to the way messages are specified in Objective-C source code.  For
example, to set a breakpoint at the `create' instance method of class
`Fruit' in the program currently being debugged, enter:

     break -[Fruit create]

   To list ten program lines around the `initialize' class method,
enter:

     list +[NSText initialize]

   In the current version of GDB, the plus or minus sign is required.
In future versions of GDB, the plus or minus sign will be optional, but
you can use it to narrow the search.  It is also possible to specify
just a method name:

     break create

   You must specify the complete method name, including any colons.  If
your program's source files contain more than one `create' method,
you'll be presented with a numbered list of classes that implement that
method.  Indicate your choice by number, or type `0' to exit if none
apply.

   As another example, to clear a breakpoint established at the
`makeKeyAndOrderFront:' method of the `NSWindow' class, enter:

     clear -[NSWindow makeKeyAndOrderFront:]


File: gdb.info,  Node: The Print Command with Objective-C,  Prev: Method Names in Commands,  Up: Objective-C

15.4.3.2 The Print Command With Objective-C
...........................................

The print command has also been extended to accept methods.  For
example:

     print -[OBJECT hash]

will tell GDB to send the `hash' message to OBJECT and print the
result.  Also, an additional command has been added, `print-object' or
`po' for short, which is meant to print the description of an object.
However, this command may only work with certain Objective-C libraries
that have a particular hook function, `_NSPrintForDebugger', defined.


File: gdb.info,  Node: OpenCL C,  Next: Fortran,  Prev: Objective-C,  Up: Supported Languages

15.4.4 OpenCL C
---------------

This section provides information about GDBs OpenCL C support.

* Menu:

* OpenCL C Datatypes::
* OpenCL C Expressions::
* OpenCL C Operators::


File: gdb.info,  Node: OpenCL C Datatypes,  Next: OpenCL C Expressions,  Up: OpenCL C

15.4.4.1 OpenCL C Datatypes
...........................

GDB supports the builtin scalar and vector datatypes specified by
OpenCL 1.1.  In addition the half- and double-precision floating point
data types of the `cl_khr_fp16' and `cl_khr_fp64' OpenCL extensions are
also known to GDB.


File: gdb.info,  Node: OpenCL C Expressions,  Next: OpenCL C Operators,  Prev: OpenCL C Datatypes,  Up: OpenCL C

15.4.4.2 OpenCL C Expressions
.............................

GDB supports accesses to vector components including the access as
lvalue where possible.  Since OpenCL C is based on C99 most C
expressions supported by GDB can be used as well.


File: gdb.info,  Node: OpenCL C Operators,  Prev: OpenCL C Expressions,  Up: OpenCL C

15.4.4.3 OpenCL C Operators
...........................

GDB supports the operators specified by OpenCL 1.1 for scalar and
vector data types.


File: gdb.info,  Node: Fortran,  Next: Pascal,  Prev: OpenCL C,  Up: Supported Languages

15.4.5 Fortran
--------------

GDB can be used to debug programs written in Fortran, but it currently
supports only the features of Fortran 77 language.

   Some Fortran compilers (GNU Fortran 77 and Fortran 95 compilers
among them) append an underscore to the names of variables and
functions.  When you debug programs compiled by those compilers, you
will need to refer to variables and functions with a trailing
underscore.

* Menu:

* Fortran Operators::           Fortran operators and expressions
* Fortran Defaults::            Default settings for Fortran
* Special Fortran Commands::    Special GDB commands for Fortran


File: gdb.info,  Node: Fortran Operators,  Next: Fortran Defaults,  Up: Fortran

15.4.5.1 Fortran Operators and Expressions
..........................................

Operators must be defined on values of specific types.  For instance,
`+' is defined on numbers, but not on characters or other non-
arithmetic types.  Operators are often defined on groups of types.

`**'
     The exponentiation operator.  It raises the first operand to the
     power of the second one.

`:'
     The range operator.  Normally used in the form of array(low:high)
     to represent a section of array.

`%'
     The access component operator.  Normally used to access elements
     in derived types.  Also suitable for unions.  As unions aren't
     part of regular Fortran, this can only happen when accessing a
     register that uses a gdbarch-defined union type.


File: gdb.info,  Node: Fortran Defaults,  Next: Special Fortran Commands,  Prev: Fortran Operators,  Up: Fortran

15.4.5.2 Fortran Defaults
.........................

Fortran symbols are usually case-insensitive, so GDB by default uses
case-insensitive matches for Fortran symbols.  You can change that with
the `set case-insensitive' command, see *note Symbols::, for the
details.


File: gdb.info,  Node: Special Fortran Commands,  Prev: Fortran Defaults,  Up: Fortran

15.4.5.3 Special Fortran Commands
.................................

GDB has some commands to support Fortran-specific features, such as
displaying common blocks.

`info common [COMMON-NAME]'
     This command prints the values contained in the Fortran `COMMON'
     block whose name is COMMON-NAME.  With no argument, the names of
     all `COMMON' blocks visible at the current program location are
     printed.


File: gdb.info,  Node: Pascal,  Next: Modula-2,  Prev: Fortran,  Up: Supported Languages

15.4.6 Pascal
-------------

Debugging Pascal programs which use sets, subranges, file variables, or
nested functions does not currently work.  GDB does not support
entering expressions, printing values, or similar features using Pascal
syntax.

   The Pascal-specific command `set print pascal_static-members'
controls whether static members of Pascal objects are displayed.  *Note
pascal_static-members: Print Settings.


File: gdb.info,  Node: Modula-2,  Next: Ada,  Prev: Pascal,  Up: Supported Languages

15.4.7 Modula-2
---------------

The extensions made to GDB to support Modula-2 only support output from
the 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 GDB
reads in the executable's symbol table.

* Menu:

* M2 Operators::                Built-in operators
* Built-In Func/Proc::          Built-in functions and procedures
* M2 Constants::                Modula-2 constants
* M2 Types::                    Modula-2 types
* M2 Defaults::                 Default settings for Modula-2
* Deviations::                  Deviations from standard Modula-2
* M2 Checks::                   Modula-2 type and range checks
* M2 Scope::                    The scope operators `::' and `.'
* GDB/M2::                      GDB and Modula-2


File: gdb.info,  Node: M2 Operators,  Next: Built-In Func/Proc,  Up: Modula-2

15.4.7.1 Operators
..................

Operators must be defined on values of specific types.  For instance,
`+' 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:

   * _Integral types_ consist of `INTEGER', `CARDINAL', and their
     subranges.

   * _Character types_ consist of `CHAR' and its subranges.

   * _Floating-point types_ consist of `REAL'.

   * _Pointer types_ consist of anything declared as `POINTER TO TYPE'.

   * _Scalar types_ consist of all of the above.

   * _Set types_ consist of `SET' and `BITSET' types.

   * _Boolean types_ consist of `BOOLEAN'.

The following operators are supported, and appear in order of
increasing precedence:

`,'
     Function argument or array index separator.

`:='
     Assignment.  The value of VAR `:=' VALUE is VALUE.

`<, >'
     Less than, greater than on integral, floating-point, or enumerated
     types.

`<=, >='
     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 `<'.

`=, <>, #'
     Equality and two ways of expressing inequality, valid on scalar
     types.  Same precedence as `<'.  In GDB scripts, only `<>' is
     available for inequality, since `#' conflicts with the script
     comment character.

`IN'
     Set membership.  Defined on set types and the types of their
     members.  Same precedence as `<'.

`OR'
     Boolean disjunction.  Defined on boolean types.

`AND, &'
     Boolean conjunction.  Defined on boolean types.

`@'
     The GDB "artificial array" operator (*note Expressions:
     Expressions.).

`+, -'
     Addition and subtraction on integral and floating-point types, or
     union and difference on set types.

`*'
     Multiplication on integral and floating-point types, or set
     intersection on set types.

`/'
     Division on floating-point types, or symmetric set difference on
     set types.  Same precedence as `*'.

`DIV, MOD'
     Integer division and remainder.  Defined on integral types.  Same
     precedence as `*'.

`-'
     Negative.  Defined on `INTEGER' and `REAL' data.

`^'
     Pointer dereferencing.  Defined on pointer types.

`NOT'
     Boolean negation.  Defined on boolean types.  Same precedence as
     `^'.

`.'
     `RECORD' field selector.  Defined on `RECORD' data.  Same
     precedence as `^'.

`[]'
     Array indexing.  Defined on `ARRAY' data.  Same precedence as `^'.

`()'
     Procedure argument list.  Defined on `PROCEDURE' objects.  Same
     precedence as `^'.

`::, .'
     GDB and Modula-2 scope operators.

     _Warning:_ Set expressions and their operations are not yet
     supported, so GDB treats the use of the operator `IN', or the use
     of operators `+', `-', `*', `/', `=', , `<>', `#', `<=', and `>='
     on sets as an error.


File: gdb.info,  Node: Built-In Func/Proc,  Next: M2 Constants,  Prev: M2 Operators,  Up: Modula-2

15.4.7.2 Built-in Functions and Procedures
..........................................

Modula-2 also makes available several built-in procedures and functions.
In describing these, the following metavariables are used:

A
     represents an `ARRAY' variable.

C
     represents a `CHAR' constant or variable.

I
     represents a variable or constant of integral type.

M
     represents an identifier that belongs to a set.  Generally used in
     the same function with the metavariable S.  The type of S should
     be `SET OF MTYPE' (where MTYPE is the type of M).

N
     represents a variable or constant of integral or floating-point
     type.

R
     represents a variable or constant of floating-point type.

T
     represents a type.

V
     represents a variable.

X
     represents a variable or constant of one of many types.  See the
     explanation of the function for details.

   All Modula-2 built-in procedures also return a result, described
below.

`ABS(N)'
     Returns the absolute value of N.

`CAP(C)'
     If C is a lower case letter, it returns its upper case equivalent,
     otherwise it returns its argument.

`CHR(I)'
     Returns the character whose ordinal value is I.

`DEC(V)'
     Decrements the value in the variable V by one.  Returns the new
     value.

`DEC(V,I)'
     Decrements the value in the variable V by I.  Returns the new
     value.

`EXCL(M,S)'
     Removes the element M from the set S.  Returns the new set.

`FLOAT(I)'
     Returns the floating point equivalent of the integer I.

`HIGH(A)'
     Returns the index of the last member of A.

`INC(V)'
     Increments the value in the variable V by one.  Returns the new
     value.

`INC(V,I)'
     Increments the value in the variable V by I.  Returns the new
     value.

`INCL(M,S)'
     Adds the element M to the set S if it is not already there.
     Returns the new set.

`MAX(T)'
     Returns the maximum value of the type T.

`MIN(T)'
     Returns the minimum value of the type T.

`ODD(I)'
     Returns boolean TRUE if I is an odd number.

`ORD(X)'
     Returns the ordinal value of its argument.  For example, the
     ordinal value of a character is its ASCII value (on machines
     supporting the ASCII character set).  X must be of an ordered
     type, which include integral, character and enumerated types.

`SIZE(X)'
     Returns the size of its argument.  X can be a variable or a type.

`TRUNC(R)'
     Returns the integral part of R.

`TSIZE(X)'
     Returns the size of its argument.  X can be a variable or a type.

`VAL(T,I)'
     Returns the member of the type T whose ordinal value is I.

     _Warning:_  Sets and their operations are not yet supported, so
     GDB treats the use of procedures `INCL' and `EXCL' as an error.


File: gdb.info,  Node: M2 Constants,  Next: M2 Types,  Prev: Built-In Func/Proc,  Up: Modula-2

15.4.7.3 Constants
..................

GDB allows you to express the constants of Modula-2 in the following
ways:

   * 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 `H', and octal integers by a trailing `B'.

   * 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 `E[+|-]NNN', where
     `[+|-]NNN' is the desired exponent.  All of the digits of the
     floating point constant must be valid decimal (base 10) digits.

   * Character constants consist of a single character enclosed by a
     pair of like quotes, either single (`'') or double (`"').  They may
     also be expressed by their ordinal value (their ASCII value,
     usually) followed by a `C'.

   * String constants consist of a sequence of characters enclosed by a
     pair of like quotes, either single (`'') or double (`"').  Escape
     sequences in the style of C are also allowed.  *Note C and C++
     Constants: C Constants, for a brief explanation of escape
     sequences.

   * Enumerated constants consist of an enumerated identifier.

   * Boolean constants consist of the identifiers `TRUE' and `FALSE'.

   * Pointer constants consist of integral values only.

   * Set constants are not yet supported.


File: gdb.info,  Node: M2 Types,  Next: M2 Defaults,  Prev: M2 Constants,  Up: Modula-2

15.4.7.4 Modula-2 Types
.......................

Currently GDB can print the following data types in Modula-2 syntax:
array types, record types, set types, pointer types, procedure types,
enumerated types, subrange types and base types.  You can also print
the contents of variables declared using these type.  This section
gives a number of simple source code examples together with sample GDB
sessions.

   The first example contains the following section of code:

     VAR
        s: SET OF CHAR ;
        r: [20..40] ;

and you can request GDB to interrogate the type and value of `r' and
`s'.

     (gdb) print s
     {'A'..'C', 'Z'}
     (gdb) ptype s
     SET OF CHAR
     (gdb) print r
     21
     (gdb) ptype r
     [20..40]

Likewise if your source code declares `s' as:

     VAR
        s: SET ['A'..'Z'] ;

then you may query the type of `s' by:

     (gdb) ptype s
     type = SET ['A'..'Z']

Note that at present you cannot interactively manipulate set
expressions using the debugger.

   The following example shows how you might declare an array in
Modula-2 and how you can interact with GDB to print its type and
contents:

     VAR
        s: ARRAY [-10..10] OF CHAR ;

     (gdb) ptype s
     ARRAY [-10..10] OF CHAR

   Note that the array handling is not yet complete and although the
type is printed correctly, expression handling still assumes that all
arrays have a lower bound of zero and not `-10' as in the example above.

   Here are some more type related Modula-2 examples:

     TYPE
        colour = (blue, red, yellow, green) ;
        t = [blue..yellow] ;
     VAR
        s: t ;
     BEGIN
        s := blue ;

The GDB interaction shows how you can query the data type and value of
a variable.

     (gdb) print s
     $1 = blue
     (gdb) ptype t
     type = [blue..yellow]

In this example a Modula-2 array is declared and its contents
displayed.  Observe that the contents are written in the same way as
their `C' counterparts.

     VAR
        s: ARRAY [1..5] OF CARDINAL ;
     BEGIN
        s[1] := 1 ;

     (gdb) print s
     $1 = {1, 0, 0, 0, 0}
     (gdb) ptype s
     type = ARRAY [1..5] OF CARDINAL

   The Modula-2 language interface to GDB also understands pointer
types as shown in this example:

     VAR
        s: POINTER TO ARRAY [1..5] OF CARDINAL ;
     BEGIN
        NEW(s) ;
        s^[1] := 1 ;

and you can request that GDB describes the type of `s'.

     (gdb) ptype s
     type = POINTER TO ARRAY [1..5] OF CARDINAL

   GDB handles compound types as we can see in this example.  Here we
combine array types, record types, pointer types and subrange types:

     TYPE
        foo = RECORD
                 f1: CARDINAL ;
                 f2: CHAR ;
                 f3: myarray ;
              END ;

        myarray = ARRAY myrange OF CARDINAL ;
        myrange = [-2..2] ;
     VAR
        s: POINTER TO ARRAY myrange OF foo ;

and you can ask GDB to describe the type of `s' as shown below.

     (gdb) ptype s
     type = POINTER TO ARRAY [-2..2] OF foo = RECORD
         f1 : CARDINAL;
         f2 : CHAR;
         f3 : ARRAY [-2..2] OF CARDINAL;
     END


File: gdb.info,  Node: M2 Defaults,  Next: Deviations,  Prev: M2 Types,  Up: Modula-2

15.4.7.5 Modula-2 Defaults
..........................

If type and range checking are set automatically by GDB, they both
default to `on' whenever the working language changes to Modula-2.
This happens regardless of whether you or GDB selected the working
language.

   If you allow GDB to set the language automatically, then entering
code compiled from a file whose name ends with `.mod' sets the working
language to Modula-2.  *Note Having GDB Infer the Source Language:
Automatically, for further details.


File: gdb.info,  Node: Deviations,  Next: M2 Checks,  Prev: M2 Defaults,  Up: Modula-2

15.4.7.6 Deviations from Standard Modula-2
..........................................

A few changes have been made to make Modula-2 programs easier to debug.
This is done primarily via loosening its type strictness:

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

   * C escape sequences can be used in strings and characters to
     represent non-printable characters.  GDB prints out strings with
     these escape sequences embedded.  Single non-printable characters
     are printed using the `CHR(NNN)' format.

   * The assignment operator (`:=') returns the value of its right-hand
     argument.

   * All built-in procedures both modify _and_ return their argument.


File: gdb.info,  Node: M2 Checks,  Next: M2 Scope,  Prev: Deviations,  Up: Modula-2

15.4.7.7 Modula-2 Type and Range Checks
.......................................

     _Warning:_ in this release, GDB does not yet perform type or range
     checking.

   GDB considers two Modula-2 variables type equivalent if:

   * They are of types that have been declared equivalent via a `TYPE
     T1 = T2' statement

   * They have been declared on the same line.  (Note:  This is true of
     the GNU Modula-2 compiler, but it may not be true of other
     compilers.)

   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.


File: gdb.info,  Node: M2 Scope,  Next: GDB/M2,  Prev: M2 Checks,  Up: Modula-2

15.4.7.8 The Scope Operators `::' and `.'
.........................................

There are a few subtle differences between the Modula-2 scope operator
(`.') and the GDB scope operator (`::').  The two have similar syntax:


     MODULE . ID
     SCOPE :: ID

where SCOPE is the name of a module or a procedure, MODULE the name of
a module, and ID is any declared identifier within your program, except
another module.

   Using the `::' operator makes GDB search the scope specified by
SCOPE for the identifier ID.  If it is not found in the specified
scope, then GDB searches all scopes enclosing the one specified by
SCOPE.

   Using the `.' operator makes GDB search the current scope for the
identifier specified by ID that was imported from the definition module
specified by MODULE.  With this operator, it is an error if the
identifier ID was not imported from definition module MODULE, or if ID
is not an identifier in MODULE.


File: gdb.info,  Node: GDB/M2,  Prev: M2 Scope,  Up: Modula-2

15.4.7.9 GDB and Modula-2
.........................

Some GDB commands have little use when debugging Modula-2 programs.
Five subcommands of `set print' and `show print' apply specifically to
C and C++: `vtbl', `demangle', `asm-demangle', `object', and `union'.
The first four apply to C++, and the last to the C `union' type, which
has no direct analogue in Modula-2.

   The `@' operator (*note Expressions: Expressions.), while available
with any language, is not useful with Modula-2.  Its intent is to aid
the debugging of "dynamic arrays", which cannot be created in Modula-2
as they can in C or C++.  However, because an address can be specified
by an integral constant, the construct `{TYPE}ADREXP' is still useful.

   In GDB scripts, the Modula-2 inequality operator `#' is interpreted
as the beginning of a comment.  Use `<>' instead.


File: gdb.info,  Node: Ada,  Prev: Modula-2,  Up: Supported Languages

15.4.8 Ada
----------

The extensions made to GDB for Ada only support output from the GNU Ada
(GNAT) compiler.  Other Ada compilers are not currently supported, and
attempting to debug executables produced by them is most likely to be
difficult.

* Menu:

* Ada Mode Intro::              General remarks on the Ada syntax
                                   and semantics supported by Ada mode
                                   in GDB.
* Omissions from Ada::          Restrictions on the Ada expression syntax.
* Additions to Ada::            Extensions of the Ada expression syntax.
* Stopping Before Main Program:: Debugging the program during elaboration.
* Ada Tasks::                   Listing and setting breakpoints in tasks.
* Ada Tasks and Core Files::    Tasking Support when Debugging Core Files
* Ravenscar Profile::           Tasking Support when using the Ravenscar
                                   Profile
* Ada Glitches::                Known peculiarities of Ada mode.


File: gdb.info,  Node: Ada Mode Intro,  Next: Omissions from Ada,  Up: Ada

15.4.8.1 Introduction
.....................

The Ada mode of GDB supports a fairly large subset of Ada expression
syntax, with some extensions.  The philosophy behind the design of this
subset is

   * That GDB should provide basic literals and access to operations for
     arithmetic, dereferencing, field selection, indexing, and
     subprogram calls, leaving more sophisticated computations to
     subprograms written into the program (which therefore may be
     called from GDB).

   * That type safety and strict adherence to Ada language restrictions
     are not particularly important to the GDB user.

   * That brevity is important to the GDB user.

   Thus, for brevity, the debugger acts as if all names declared in
user-written packages are directly visible, even if they are not visible
according to Ada rules, thus making it unnecessary to fully qualify most
names with their packages, regardless of context.  Where this causes
ambiguity, GDB asks the user's intent.

   The debugger will start in Ada mode if it detects an Ada main
program.  As for other languages, it will enter Ada mode when stopped
in a program that was translated from an Ada source file.

   While in Ada mode, you may use `-' for comments.  This is useful
mostly for documenting command files.  The standard GDB comment (`#')
still works at the beginning of a line in Ada mode, but not in the
middle (to allow based literals).

   The debugger supports limited overloading.  Given a subprogram call
in which the function symbol has multiple definitions, it will use the
number of actual parameters and some information about their types to
attempt to narrow the set of definitions.  It also makes very limited
use of context, preferring procedures to functions in the context of
the `call' command, and functions to procedures elsewhere.


File: gdb.info,  Node: Omissions from Ada,  Next: Additions to Ada,  Prev: Ada Mode Intro,  Up: Ada

15.4.8.2 Omissions from Ada
...........................

Here are the notable omissions from the subset:

   * Only a subset of the attributes are supported:

        - 'First, 'Last, and 'Length  on array objects (not on types
          and subtypes).

        - 'Min and 'Max.

        - 'Pos and 'Val.

        - 'Tag.

        - 'Range on array objects (not subtypes), but only as the right
          operand of the membership (`in') operator.

        - 'Access, 'Unchecked_Access, and 'Unrestricted_Access (a GNAT
          extension).

        - 'Address.

   * The names in `Characters.Latin_1' are not available and
     concatenation is not implemented.  Thus, escape characters in
     strings are not currently available.

   * Equality tests (`=' and `/=') on arrays test for bitwise equality
     of representations.  They will generally work correctly for
     strings and arrays whose elements have integer or enumeration
     types.  They may not work correctly for arrays whose element types
     have user-defined equality, for arrays of real values (in
     particular, IEEE-conformant floating point, because of negative
     zeroes and NaNs), and for arrays whose elements contain unused
     bits with indeterminate values.

   * The other component-by-component array operations (`and', `or',
     `xor', `not', and relational tests other than equality) are not
     implemented.

   * There is limited support for array and record aggregates.  They are
     permitted only on the right sides of assignments, as in these
     examples:

          (gdb) set An_Array := (1, 2, 3, 4, 5, 6)
          (gdb) set An_Array := (1, others => 0)
          (gdb) set An_Array := (0|4 => 1, 1..3 => 2, 5 => 6)
          (gdb) set A_2D_Array := ((1, 2, 3), (4, 5, 6), (7, 8, 9))
          (gdb) set A_Record := (1, "Peter", True);
          (gdb) set A_Record := (Name => "Peter", Id => 1, Alive => True)

     Changing a discriminant's value by assigning an aggregate has an
     undefined effect if that discriminant is used within the record.
     However, you can first modify discriminants by directly assigning
     to them (which normally would not be allowed in Ada), and then
     performing an aggregate assignment.  For example, given a variable
     `A_Rec' declared to have a type such as:

          type Rec (Len : Small_Integer := 0) is record
              Id : Integer;
              Vals : IntArray (1 .. Len);
          end record;

     you can assign a value with a different size of `Vals' with two
     assignments:

          (gdb) set A_Rec.Len := 4
          (gdb) set A_Rec := (Id => 42, Vals => (1, 2, 3, 4))

     As this example also illustrates, GDB is very loose about the usual
     rules concerning aggregates.  You may leave out some of the
     components of an array or record aggregate (such as the `Len'
     component in the assignment to `A_Rec' above); they will retain
     their original values upon assignment.  You may freely use dynamic
     values as indices in component associations.  You may even use
     overlapping or redundant component associations, although which
     component values are assigned in such cases is not defined.

   * Calls to dispatching subprograms are not implemented.

   * The overloading algorithm is much more limited (i.e., less
     selective) than that of real Ada.  It makes only limited use of
     the context in which a subexpression appears to resolve its
     meaning, and it is much looser in its rules for allowing type
     matches.  As a result, some function calls will be ambiguous, and
     the user will be asked to choose the proper resolution.

   * The `new' operator is not implemented.

   * Entry calls are not implemented.

   * Aside from printing, arithmetic operations on the native VAX
     floating-point formats are not supported.

   * It is not possible to slice a packed array.

   * The names `True' and `False', when not part of a qualified name,
     are interpreted as if implicitly prefixed by `Standard',
     regardless of context.  Should your program redefine these names
     in a package or procedure (at best a dubious practice), you will
     have to use fully qualified names to access their new definitions.


File: gdb.info,  Node: Additions to Ada,  Next: Stopping Before Main Program,  Prev: Omissions from Ada,  Up: Ada

15.4.8.3 Additions to Ada
.........................

As it does for other languages, GDB makes certain generic extensions to
Ada (*note Expressions::):

   * If the expression E is a variable residing in memory (typically a
     local variable or array element) and N is a positive integer, then
     `E@N' displays the values of E and the N-1 adjacent variables
     following it in memory as an array.  In Ada, this operator is
     generally not necessary, since its prime use is in displaying
     parts of an array, and slicing will usually do this in Ada.
     However, there are occasional uses when debugging programs in
     which certain debugging information has been optimized away.

   * `B::VAR' means "the variable named VAR that appears in function or
     file B."  When B is a file name, you must typically surround it in
     single quotes.

   * The expression `{TYPE} ADDR' means "the variable of type TYPE that
     appears at address ADDR."

   * A name starting with `$' is a convenience variable (*note
     Convenience Vars::) or a machine register (*note Registers::).

   In addition, GDB provides a few other shortcuts and outright
additions specific to Ada:

   * The assignment statement is allowed as an expression, returning
     its right-hand operand as its value.  Thus, you may enter

          (gdb) set x := y + 3
          (gdb) print A(tmp := y + 1)

   * The semicolon is allowed as an "operator,"  returning as its value
     the value of its right-hand operand.  This allows, for example,
     complex conditional breaks:

          (gdb) break f
          (gdb) condition 1 (report(i); k += 1; A(k) > 100)

   * Rather than use catenation and symbolic character names to
     introduce special characters into strings, one may instead use a
     special bracket notation, which is also used to print strings.  A
     sequence of characters of the form `["XX"]' within a string or
     character literal denotes the (single) character whose numeric
     encoding is XX in hexadecimal.  The sequence of characters `["""]'
     also denotes a single quotation mark in strings.   For example,
             "One line.["0a"]Next line.["0a"]"
     contains an ASCII newline character (`Ada.Characters.Latin_1.LF')
     after each period.

   * The subtype used as a prefix for the attributes 'Pos, 'Min, and
     'Max is optional (and is ignored in any case).  For example, it is
     valid to write

          (gdb) print 'max(x, y)

   * When printing arrays, GDB uses positional notation when the array
     has a lower bound of 1, and uses a modified named notation
     otherwise.  For example, a one-dimensional array of three integers
     with a lower bound of 3 might print as

          (3 => 10, 17, 1)

     That is, in contrast to valid Ada, only the first component has a
     `=>' clause.

   * You may abbreviate attributes in expressions with any unique,
     multi-character subsequence of their names (an exact match gets
     preference).  For example, you may use a'len, a'gth, or a'lh in
     place of  a'length.

   * Since Ada is case-insensitive, the debugger normally maps
     identifiers you type to lower case.  The GNAT compiler uses
     upper-case characters for some of its internal identifiers, which
     are normally of no interest to users.  For the rare occasions when
     you actually have to look at them, enclose them in angle brackets
     to avoid the lower-case mapping.  For example,
          (gdb) print <JMPBUF_SAVE>[0]

   * Printing an object of class-wide type or dereferencing an
     access-to-class-wide value will display all the components of the
     object's specific type (as indicated by its run-time tag).
     Likewise, component selection on such a value will operate on the
     specific type of the object.



File: gdb.info,  Node: Stopping Before Main Program,  Next: Ada Tasks,  Prev: Additions to Ada,  Up: Ada

15.4.8.4 Stopping at the Very Beginning
.......................................

It is sometimes necessary to debug the program during elaboration, and
before reaching the main procedure.  As defined in the Ada Reference
Manual, the elaboration code is invoked from a procedure called
`adainit'.  To run your program up to the beginning of elaboration,
simply use the following two commands: `tbreak adainit' and `run'.


File: gdb.info,  Node: Ada Tasks,  Next: Ada Tasks and Core Files,  Prev: Stopping Before Main Program,  Up: Ada

15.4.8.5 Extensions for Ada Tasks
.................................

Support for Ada tasks is analogous to that for threads (*note
Threads::).  GDB provides the following task-related commands:

`info tasks'
     This command shows a list of current Ada tasks, as in the
     following example:

          (gdb) info tasks
            ID       TID P-ID Pri State                 Name
             1   8088000   0   15 Child Activation Wait main_task
             2   80a4000   1   15 Accept Statement      b
             3   809a800   1   15 Child Activation Wait a
          *  4   80ae800   3   15 Runnable              c

     In this listing, the asterisk before the last task indicates it to
     be the task currently being inspected.

    ID
          Represents GDB's internal task number.

    TID
          The Ada task ID.

    P-ID
          The parent's task ID (GDB's internal task number).

    Pri
          The base priority of the task.

    State
          Current state of the task.

         `Unactivated'
               The task has been created but has not been activated.
               It cannot be executing.

         `Runnable'
               The task is not blocked for any reason known to Ada.
               (It may be waiting for a mutex, though.) It is
               conceptually "executing" in normal mode.

         `Terminated'
               The task is terminated, in the sense of ARM 9.3 (5).
               Any dependents that were waiting on terminate
               alternatives have been awakened and have terminated
               themselves.

         `Child Activation Wait'
               The task is waiting for created tasks to complete
               activation.

         `Accept Statement'
               The task is waiting on an accept or selective wait
               statement.

         `Waiting on entry call'
               The task is waiting on an entry call.

         `Async Select Wait'
               The task is waiting to start the abortable part of an
               asynchronous select statement.

         `Delay Sleep'
               The task is waiting on a select statement with only a
               delay alternative open.

         `Child Termination Wait'
               The task is sleeping having completed a master within
               itself, and is waiting for the tasks dependent on that
               master to become terminated or waiting on a terminate
               Phase.

         `Wait Child in Term Alt'
               The task is sleeping waiting for tasks on terminate
               alternatives to finish terminating.

         `Accepting RV with TASKNO'
               The task is accepting a rendez-vous with the task TASKNO.

    Name
          Name of the task in the program.


`info task TASKNO'
     This command shows detailled informations on the specified task,
     as in the following example:
          (gdb) info tasks
            ID       TID P-ID Pri State                  Name
             1   8077880    0  15 Child Activation Wait  main_task
          *  2   807c468    1  15 Runnable               task_1
          (gdb) info task 2
          Ada Task: 0x807c468
          Name: task_1
          Thread: 0x807f378
          Parent: 1 (main_task)
          Base Priority: 15
          State: Runnable

`task'
     This command prints the ID of the current task.

          (gdb) info tasks
            ID       TID P-ID Pri State                  Name
             1   8077870    0  15 Child Activation Wait  main_task
          *  2   807c458    1  15 Runnable               t
          (gdb) task
          [Current task is 2]

`task TASKNO'
     This command is like the `thread THREADNO' command (*note
     Threads::).  It switches the context of debugging from the current
     task to the given task.

          (gdb) info tasks
            ID       TID P-ID Pri State                  Name
             1   8077870    0  15 Child Activation Wait  main_task
          *  2   807c458    1  15 Runnable               t
          (gdb) task 1
          [Switching to task 1]
          #0  0x8067726 in pthread_cond_wait ()
          (gdb) bt
          #0  0x8067726 in pthread_cond_wait ()
          #1  0x8056714 in system.os_interface.pthread_cond_wait ()
          #2  0x805cb63 in system.task_primitives.operations.sleep ()
          #3  0x806153e in system.tasking.stages.activate_tasks ()
          #4  0x804aacc in un () at un.adb:5

`break LINESPEC task TASKNO'
`break LINESPEC task TASKNO if ...'
     These commands are like the `break ... thread ...' command (*note
     Thread Stops::).  LINESPEC specifies source lines, as described in
     *note Specify Location::.

     Use the qualifier `task TASKNO' with a breakpoint command to
     specify that you only want GDB to stop the program when a
     particular Ada task reaches this breakpoint.  TASKNO is one of the
     numeric task identifiers assigned by GDB, shown in the first
     column of the `info tasks' display.

     If you do not specify `task TASKNO' when you set a breakpoint, the
     breakpoint applies to _all_ tasks of your program.

     You can use the `task' qualifier on conditional breakpoints as
     well; in this case, place `task TASKNO' before the breakpoint
     condition (before the `if').

     For example,

          (gdb) info tasks
            ID       TID P-ID Pri State                 Name
             1 140022020   0   15 Child Activation Wait main_task
             2 140045060   1   15 Accept/Select Wait    t2
             3 140044840   1   15 Runnable              t1
          *  4 140056040   1   15 Runnable              t3
          (gdb) b 15 task 2
          Breakpoint 5 at 0x120044cb0: file test_task_debug.adb, line 15.
          (gdb) cont
          Continuing.
          task # 1 running
          task # 2 running

          Breakpoint 5, test_task_debug () at test_task_debug.adb:15
          15               flush;
          (gdb) info tasks
            ID       TID P-ID Pri State                 Name
             1 140022020   0   15 Child Activation Wait main_task
          *  2 140045060   1   15 Runnable              t2
             3 140044840   1   15 Runnable              t1
             4 140056040   1   15 Delay Sleep           t3


File: gdb.info,  Node: Ada Tasks and Core Files,  Next: Ravenscar Profile,  Prev: Ada Tasks,  Up: Ada

15.4.8.6 Tasking Support when Debugging Core Files
..................................................

When inspecting a core file, as opposed to debugging a live program,
tasking support may be limited or even unavailable, depending on the
platform being used.  For instance, on x86-linux, the list of tasks is
available, but task switching is not supported.  On Tru64, however,
task switching will work as usual.

   On certain platforms, including Tru64, the debugger needs to perform
some memory writes in order to provide Ada tasking support.  When
inspecting a core file, this means that the core file must be opened
with read-write privileges, using the command `"set write on"' (*note
Patching::).  Under these circumstances, you should make a backup copy
of the core file before inspecting it with GDB.


File: gdb.info,  Node: Ravenscar Profile,  Next: Ada Glitches,  Prev: Ada Tasks and Core Files,  Up: Ada

15.4.8.7 Tasking Support when using the Ravenscar Profile
.........................................................

The "Ravenscar Profile" is a subset of the Ada tasking features,
specifically designed for systems with safety-critical real-time
requirements.

`set ravenscar task-switching on'
     Allows task switching when debugging a program that uses the
     Ravenscar Profile.  This is the default.

`set ravenscar task-switching off'
     Turn off task switching when debugging a program that uses the
     Ravenscar Profile.  This is mostly intended to disable the code
     that adds support for the Ravenscar Profile, in case a bug in
     either GDB or in the Ravenscar runtime is preventing GDB from
     working properly.  To be effective, this command should be run
     before the program is started.

`show ravenscar task-switching'
     Show whether it is possible to switch from task to task in a
     program using the Ravenscar Profile.



File: gdb.info,  Node: Ada Glitches,  Prev: Ravenscar Profile,  Up: Ada

15.4.8.8 Known Peculiarities of Ada Mode
........................................

Besides the omissions listed previously (*note Omissions from Ada::),
we know of several problems with and limitations of Ada mode in GDB,
some of which will be fixed with planned future releases of the debugger
and the GNU Ada compiler.

   * Static constants that the compiler chooses not to materialize as
     objects in storage are invisible to the debugger.

   * Named parameter associations in function argument lists are
     ignored (the argument lists are treated as positional).

   * Many useful library packages are currently invisible to the
     debugger.

   * Fixed-point arithmetic, conversions, input, and output is carried
     out using floating-point arithmetic, and may give results that
     only approximate those on the host machine.

   * The GNAT compiler never generates the prefix `Standard' for any of
     the standard symbols defined by the Ada language.  GDB knows about
     this: it will strip the prefix from names when you use it, and
     will never look for a name you have so qualified among local
     symbols, nor match against symbols in other packages or
     subprograms.  If you have defined entities anywhere in your
     program other than parameters and local variables whose simple
     names match names in `Standard', GNAT's lack of qualification here
     can cause confusion.  When this happens, you can usually resolve
     the confusion by qualifying the problematic names with package
     `Standard' explicitly.

   Older versions of the compiler sometimes generate erroneous debugging
information, resulting in the debugger incorrectly printing the value
of affected entities.  In some cases, the debugger is able to work
around an issue automatically. In other cases, the debugger is able to
work around the issue, but the work-around has to be specifically
enabled.

`set ada trust-PAD-over-XVS on'
     Configure GDB to strictly follow the GNAT encoding when computing
     the value of Ada entities, particularly when `PAD' and `PAD___XVS'
     types are involved (see `ada/exp_dbug.ads' in the GCC sources for
     a complete description of the encoding used by the GNAT compiler).
     This is the default.

`set ada trust-PAD-over-XVS off'
     This is related to the encoding using by the GNAT compiler.  If
     GDB sometimes prints the wrong value for certain entities,
     changing `ada trust-PAD-over-XVS' to `off' activates a work-around
     which may fix the issue.  It is always safe to set `ada
     trust-PAD-over-XVS' to `off', but this incurs a slight performance
     penalty, so it is recommended to leave this setting to `on' unless
     necessary.



File: gdb.info,  Node: Unsupported Languages,  Prev: Supported Languages,  Up: Languages

15.5 Unsupported Languages
==========================

In addition to the other fully-supported programming languages, GDB
also provides a pseudo-language, called `minimal'.  It does not
represent a real programming language, but provides a set of
capabilities close to what the C or assembly languages provide.  This
should allow most simple operations to be performed while debugging an
application that uses a language currently not supported by GDB.

   If the language is set to `auto', GDB will automatically select this
language if the current frame corresponds to an unsupported language.


File: gdb.info,  Node: Symbols,  Next: Altering,  Prev: Languages,  Up: Top

16 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.  GDB finds it in your
program's symbol table, in the file indicated when you started GDB
(*note Choosing Files: File Options.), or by one of the file-management
commands (*note Commands to Specify Files: Files.).

   Occasionally, you may need to refer to symbols that contain unusual
characters, which GDB ordinarily treats as word delimiters.  The most
frequent case is in referring to static variables in other source files
(*note Program Variables: Variables.).  File names are recorded in
object files as debugging symbols, but GDB would ordinarily parse a
typical file name, like `foo.c', as the three words `foo' `.' `c'.  To
allow GDB to recognize `foo.c' as a single symbol, enclose it in single
quotes; for example,

     p 'foo.c'::x

looks up the value of `x' in the scope of the file `foo.c'.

`set case-sensitive on'
`set case-sensitive off'
`set case-sensitive auto'
     Normally, when GDB looks up symbols, it matches their names with
     case sensitivity determined by the current source language.
     Occasionally, you may wish to control that.  The command `set
     case-sensitive' lets you do that by specifying `on' for
     case-sensitive matches or `off' for case-insensitive ones.  If you
     specify `auto', case sensitivity is reset to the default suitable
     for the source language.  The default is case-sensitive matches
     for all languages except for Fortran, for which the default is
     case-insensitive matches.

`show case-sensitive'
     This command shows the current setting of case sensitivity for
     symbols lookups.

`info address SYMBOL'
     Describe where the data for 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 `print &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.

`info symbol ADDR'
     Print the name of a symbol which is stored at the address ADDR.
     If no symbol is stored exactly at ADDR, GDB prints the nearest
     symbol and an offset from it:

          (gdb) info symbol 0x54320
          _initialize_vx + 396 in section .text

     This is the opposite of the `info address' command.  You can use
     it to find out the name of a variable or a function given its
     address.

     For dynamically linked executables, the name of executable or
     shared library containing the symbol is also printed:

          (gdb) info symbol 0x400225
          _start + 5 in section .text of /tmp/a.out
          (gdb) info symbol 0x2aaaac2811cf
          __read_nocancel + 6 in section .text of /usr/lib64/libc.so.6

`whatis [ARG]'
     Print the data type of ARG, which can be either an expression or a
     name of a data type.  With no argument, print the data type of
     `$', the last value in the value history.

     If ARG is an expression (*note Expressions: Expressions.), it is
     not actually evaluated, and any side-effecting operations (such as
     assignments or function calls) inside it do not take place.

     If ARG is a variable or an expression, `whatis' prints its literal
     type as it is used in the source code.  If the type was defined
     using a `typedef', `whatis' will _not_ print the data type
     underlying the `typedef'.  If the type of the variable or the
     expression is a compound data type, such as `struct' or  `class',
     `whatis' never prints their fields or methods.  It just prints the
     `struct'/`class' name (a.k.a. its "tag").  If you want to see the
     members of such a compound data type, use `ptype'.

     If ARG is a type name that was defined using `typedef', `whatis'
     "unrolls" only one level of that `typedef'.  Unrolling means that
     `whatis' will show the underlying type used in the `typedef'
     declaration of ARG.  However, if that underlying type is also a
     `typedef', `whatis' will not unroll it.

     For C code, the type names may also have the form `class
     CLASS-NAME', `struct STRUCT-TAG', `union UNION-TAG' or `enum
     ENUM-TAG'.

`ptype [ARG]'
     `ptype' accepts the same arguments as `whatis', but prints a
     detailed description of the type, instead of just the name of the
     type.  *Note Expressions: Expressions.

     Contrary to `whatis', `ptype' always unrolls any `typedef's in its
     argument declaration, whether the argument is a variable,
     expression, or a data type.  This means that `ptype' of a variable
     or an expression will not print literally its type as present in
     the source code--use `whatis' for that.  `typedef's at the pointer
     or reference targets are also unrolled.  Only `typedef's of
     fields, methods and inner `class typedef's of `struct's, `class'es
     and `union's are not unrolled even with `ptype'.

     For example, for this variable declaration:

          typedef double real_t;
          struct complex { real_t real; double imag; };
          typedef struct complex complex_t;
          complex_t var;
          real_t *real_pointer_var;

     the two commands give this output:

          (gdb) whatis var
          type = complex_t
          (gdb) ptype var
          type = struct complex {
              real_t real;
              double imag;
          }
          (gdb) whatis complex_t
          type = struct complex
          (gdb) whatis struct complex
          type = struct complex
          (gdb) ptype struct complex
          type = struct complex {
              real_t real;
              double imag;
          }
          (gdb) whatis real_pointer_var
          type = real_t *
          (gdb) ptype real_pointer_var
          type = double *

     As with `whatis', using `ptype' without an argument refers to the
     type of `$', the last value in the value history.

     Sometimes, programs use opaque data types or incomplete
     specifications of complex data structure.  If the debug
     information included in the program does not allow GDB to display
     a full declaration of the data type, it will say `<incomplete
     type>'.  For example, given these declarations:

              struct foo;
              struct foo *fooptr;

     but no definition for `struct foo' itself, GDB will say:

            (gdb) ptype foo
            $1 = <incomplete type>

     "Incomplete type" is C terminology for data types that are not
     completely specified.

`info types REGEXP'
`info types'
     Print a brief description of all types whose names match the
     regular expression 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, `i type value' gives information on
     all types in your program whose names include the string `value',
     but `i type ^value$' gives information only on types whose complete
     name is `value'.

     This command differs from `ptype' in two ways: first, like
     `whatis', it does not print a detailed description; second, it
     lists all source files where a type is defined.

`info scope LOCATION'
     List all the variables local to a particular scope.  This command
     accepts a LOCATION argument--a function name, a source line, or an
     address preceded by a `*', and prints all the variables local to
     the scope defined by that location.  (*Note Specify Location::, for
     details about supported forms of LOCATION.)  For example:

          (gdb) 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.

     This command is especially useful for determining what data to
     collect during a "trace experiment", see *note collect: Tracepoint
     Actions.

`info source'
     Show information about the current source file--that is, the
     source file for the function containing the current point of
     execution:
        * the name of the source file, and the directory containing it,

        * the directory it was compiled in,

        * its length, in lines,

        * which programming language it is written in,

        * 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

        * whether the debugging information includes information about
          preprocessor macros.

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

`info functions'
     Print the names and data types of all defined functions.

`info functions REGEXP'
     Print the names and data types of all defined functions whose
     names contain a match for regular expression REGEXP.  Thus, `info
     fun step' finds all functions whose names include `step'; `info
     fun ^step' finds those whose names start with `step'.  If a
     function name contains characters that conflict with the regular
     expression language (e.g.  `operator*()'), they may be quoted with
     a backslash.

`info variables'
     Print the names and data types of all variables that are defined
     outside of functions (i.e. excluding local variables).

`info variables REGEXP'
     Print the names and data types of all variables (except for local
     variables) whose names contain a match for regular expression
     REGEXP.

`info classes'
`info classes REGEXP'
     Display all Objective-C classes in your program, or (with the
     REGEXP argument) all those matching a particular regular
     expression.

`info selectors'
`info selectors REGEXP'
     Display all Objective-C selectors in your program, or (with the
     REGEXP argument) all those matching a particular regular
     expression.

     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 GDB to reload the symbols for
     automatically relinked modules:

    `set symbol-reloading on'
          Replace symbol definitions for the corresponding source file
          when an object file with a particular name is seen again.

    `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
          `symbol-reloading' off, since otherwise GDB may discard
          symbols when linking large programs, that may contain several
          modules (from different directories or libraries) with the
          same name.

    `show symbol-reloading'
          Show the current `on' or `off' setting.

`set opaque-type-resolution on'
     Tell GDB to resolve opaque types.  An opaque type is a type
     declared as a pointer to a `struct', `class', or `union'--for
     example, `struct MyType *'--that is used in one source file
     although the full declaration of `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.

`set opaque-type-resolution off'
     Tell GDB not to resolve opaque types.  In this case, the type is
     printed as follows:
          {<no data fields>}

`show opaque-type-resolution'
     Show whether opaque types are resolved or not.

`maint print symbols FILENAME'
`maint print psymbols FILENAME'
`maint print msymbols FILENAME'
     Write a dump of debugging symbol data into the file FILENAME.
     These commands are used to debug the GDB symbol-reading code.  Only
     symbols with debugging data are included.  If you use `maint print
     symbols', GDB includes all the symbols for which it has already
     collected full details: that is, FILENAME reflects symbols for
     only those files whose symbols GDB has read.  You can use the
     command `info sources' to find out which files these are.  If you
     use `maint print psymbols' instead, the dump shows information
     about symbols that GDB only knows partially--that is, symbols
     defined in files that GDB has skimmed, but not yet read
     completely.  Finally, `maint print msymbols' dumps just the
     minimal symbol information required for each object file from
     which GDB has read some symbols.  *Note Commands to Specify Files:
     Files, for a discussion of how GDB reads symbols (in the
     description of `symbol-file').

`maint info symtabs [ REGEXP ]'
`maint info psymtabs [ REGEXP ]'
     List the `struct symtab' or `struct partial_symtab' structures
     whose names match REGEXP.  If REGEXP is not given, list them all.
     The output includes expressions which you can copy into a GDB
     debugging this one to examine a particular structure in more
     detail.  For example:

          (gdb) maint info psymtabs dwarf2read
          { objfile /home/gnu/build/gdb/gdb
            ((struct objfile *) 0x82e69d0)
            { psymtab /home/gnu/src/gdb/dwarf2read.c
              ((struct partial_symtab *) 0x8474b10)
              readin no
              fullname (null)
              text addresses 0x814d3c8 -- 0x8158074
              globals (* (struct partial_symbol **) 0x8507a08 @ 9)
              statics (* (struct partial_symbol **) 0x40e95b78 @ 2882)
              dependencies (none)
            }
          }
          (gdb) maint info symtabs
          (gdb)
     We see that there is one partial symbol table whose filename
     contains the string `dwarf2read', belonging to the `gdb'
     executable; and we see that GDB has not read in any symtabs yet at
     all.  If we set a breakpoint on a function, that will cause GDB to
     read the symtab for the compilation unit containing that function:

          (gdb) break dwarf2_psymtab_to_symtab
          Breakpoint 1 at 0x814e5da: file /home/gnu/src/gdb/dwarf2read.c,
          line 1574.
          (gdb) maint info symtabs
          { objfile /home/gnu/build/gdb/gdb
            ((struct objfile *) 0x82e69d0)
            { symtab /home/gnu/src/gdb/dwarf2read.c
              ((struct symtab *) 0x86c1f38)
              dirname (null)
              fullname (null)
              blockvector ((struct blockvector *) 0x86c1bd0) (primary)
              linetable ((struct linetable *) 0x8370fa0)
              debugformat DWARF 2
            }
          }
          (gdb)


File: gdb.info,  Node: Altering,  Next: GDB Files,  Prev: Symbols,  Up: Top

17 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 GDB 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


File: gdb.info,  Node: Assignment,  Next: Jumping,  Up: Altering

17.1 Assignment to Variables
============================

To alter the value of a variable, evaluate an assignment expression.
*Note Expressions: Expressions.  For example,

     print x=4

stores the value 4 into the variable `x', and then prints the value of
the assignment expression (which is 4).  *Note Using GDB with Different
Languages: Languages, for more information on operators in supported
languages.

   If you are not interested in seeing the value of the assignment, use
the `set' command instead of the `print' command.  `set' is really the
same as `print' except that the expression's value is not printed and
is not put in the value history (*note Value History: Value History.).
The expression is evaluated only for its effects.

   If the beginning of the argument string of the `set' command appears
identical to a `set' subcommand, use the `set variable' command instead
of just `set'.  This command is identical to `set' except for its lack
of subcommands.  For example, if your program has a variable `width',
you get an error if you try to set a new value with just `set
width=13', because GDB has the command `set width':

     (gdb) whatis width
     type = double
     (gdb) p width
     $4 = 13
     (gdb) set width=47
     Invalid syntax in expression.

The invalid expression, of course, is `=47'.  In order to actually set
the program's variable `width', use

     (gdb) set var width=47

   Because the `set' command has many subcommands that can conflict
with the names of program variables, it is a good idea to use the `set
variable' command instead of just `set'.  For example, if your program
has a variable `g', you run into problems if you try to set a new value
with just `set g=4', because GDB has the command `set gnutarget',
abbreviated `set g':

     (gdb) whatis g
     type = double
     (gdb) p g
     $1 = 1
     (gdb) set g=4
     (gdb) p g
     $2 = 1
     (gdb) 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.
     (gdb) show g
     The current BFD target is "=4".

The program variable `g' did not change, and you silently set the
`gnutarget' to an invalid value.  In order to set the variable `g', use

     (gdb) set var g=4

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

   To store values into arbitrary places in memory, use the `{...}'
construct to generate a value of specified type at a specified address
(*note Expressions: Expressions.).  For example, `{int}0x83040' refers
to memory location `0x83040' as an integer (which implies a certain size
and representation in memory), and

     set {int}0x83040 = 4

stores the value 4 into that memory location.


File: gdb.info,  Node: Jumping,  Next: Signaling,  Prev: Assignment,  Up: Altering

17.2 Continuing at a Different Address
======================================

Ordinarily, when you continue your program, you do so at the place where
it stopped, with the `continue' command.  You can instead continue at
an address of your own choosing, with the following commands:

`jump LINESPEC'
`jump LOCATION'
     Resume execution at line LINESPEC or at address given by LOCATION.
     Execution stops again immediately if there is a breakpoint there.
     *Note Specify Location::, for a description of the different forms
     of LINESPEC and LOCATION.  It is common practice to use the
     `tbreak' command in conjunction with `jump'.  *Note Setting
     Breakpoints: Set Breaks.

     The `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 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 `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.

   On many systems, you can get much the same effect as the `jump'
command by storing a new value into the register `$pc'.  The difference
is that this does not start your program running; it only changes the
address of where it _will_ run when you continue.  For example,

     set $pc = 0x485

makes the next `continue' command or stepping command execute at
address `0x485', rather than at the address where your program stopped.
*Note Continuing and Stepping: Continuing and Stepping.

   The most common occasion to use the `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.


File: gdb.info,  Node: Signaling,  Next: Returning,  Prev: Jumping,  Up: Altering

17.3 Giving your Program a Signal
=================================

`signal SIGNAL'
     Resume execution where your program stopped, but immediately give
     it the signal SIGNAL.  SIGNAL can be the name or the number of a
     signal.  For example, on many systems `signal 2' and `signal
     SIGINT' are both ways of sending an interrupt signal.

     Alternatively, if 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 `continue' command; `signal 0' causes it to resume
     without a signal.

     `signal' does not repeat when you press <RET> a second time after
     executing the command.

   Invoking the `signal' command is not the same as invoking the `kill'
utility from the shell.  Sending a signal with `kill' causes GDB to
decide what to do with the signal depending on the signal handling
tables (*note Signals::).  The `signal' command passes the signal
directly to your program.


File: gdb.info,  Node: Returning,  Next: Calling,  Prev: Signaling,  Up: Altering

17.4 Returning from a Function
==============================

`return'
`return EXPRESSION'
     You can cancel execution of a function call with the `return'
     command.  If you give an EXPRESSION argument, its value is used as
     the function's return value.

   When you use `return', GDB 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 `return'.

   This pops the selected stack frame (*note Selecting a Frame:
Selection.), 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 `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 `finish' command (*note Continuing and
Stepping: Continuing and Stepping.) resumes execution until the
selected stack frame returns naturally.

   GDB needs to know how the EXPRESSION argument should be set for the
inferior.  The concrete registers assignment depends on the OS ABI and
the type being returned by the selected stack frame.  For example it is
common for OS ABI to return floating point values in FPU registers
while integer values in CPU registers.  Still some ABIs return even
floating point values in CPU registers.  Larger integer widths (such as
`long long int') also have specific placement rules.  GDB already knows
the OS ABI from its current target so it needs to find out also the
type being returned to make the assignment into the right register(s).

   Normally, the selected stack frame has debug info.  GDB will always
use the debug info instead of the implicit type of EXPRESSION when the
debug info is available.  For example, if you type `return -1', and the
function in the current stack frame is declared to return a `long long
int', GDB transparently converts the implicit `int' value of -1 into a
`long long int':

     Breakpoint 1, func () at gdb.base/return-nodebug.c:29
     29        return 31;
     (gdb) return -1
     Make func return now? (y or n) y
     #0  0x004004f6 in main () at gdb.base/return-nodebug.c:43
     43        printf ("result=%lld\n", func ());
     (gdb)

   However, if the selected stack frame does not have a debug info,
e.g., if the function was compiled without debug info, GDB has to find
out the type to return from user.  Specifying a different type by
mistake may set the value in different inferior registers than the
caller code expects.  For example, typing `return -1' with its implicit
type `int' would set only a part of a `long long int' result for a
debug info less function (on 32-bit architectures).  Therefore the user
is required to specify the return type by an appropriate cast
explicitly:

     Breakpoint 2, 0x0040050b in func ()
     (gdb) return -1
     Return value type not available for selected stack frame.
     Please use an explicit cast of the value to return.
     (gdb) return (long long int) -1
     Make selected stack frame return now? (y or n) y
     #0  0x00400526 in main ()
     (gdb)


File: gdb.info,  Node: Calling,  Next: Patching,  Prev: Returning,  Up: Altering

17.5 Calling Program Functions
==============================

`print EXPR'
     Evaluate the expression EXPR and display the resulting value.
     EXPR may include calls to functions in the program being debugged.

`call EXPR'
     Evaluate the expression EXPR without displaying `void' returned
     values.

     You can use this variant of the `print' command if you want to
     execute a function from your program that does not return anything
     (a.k.a. "a void function"), but without cluttering the output with
     `void' returned values that GDB will otherwise print.  If the
     result is not void, it is printed and saved in the value history.

   It is possible for the function you call via the `print' or `call'
command to generate a signal (e.g., if there's a bug in the function,
or if you passed it incorrect arguments).  What happens in that case is
controlled by the `set unwindonsignal' command.

   Similarly, with a C++ program it is possible for the function you
call via the `print' or `call' command to generate an exception that is
not handled due to the constraints of the dummy frame.  In this case,
any exception that is raised in the frame, but has an out-of-frame
exception handler will not be found.  GDB builds a dummy-frame for the
inferior function call, and the unwinder cannot seek for exception
handlers outside of this dummy-frame.  What happens in that case is
controlled by the `set unwind-on-terminating-exception' command.

`set unwindonsignal'
     Set unwinding of the stack if a signal is received while in a
     function that GDB called in the program being debugged.  If set to
     on, GDB unwinds the stack it created for the call and restores the
     context to what it was before the call.  If set to off (the
     default), GDB stops in the frame where the signal was received.

`show unwindonsignal'
     Show the current setting of stack unwinding in the functions
     called by GDB.

`set unwind-on-terminating-exception'
     Set unwinding of the stack if a C++ exception is raised, but left
     unhandled while in a function that GDB called in the program being
     debugged.  If set to on (the default), GDB unwinds the stack it
     created for the call and restores the context to what it was before
     the call.  If set to off, GDB the exception is delivered to the
     default C++ exception handler and the inferior terminated.

`show unwind-on-terminating-exception'
     Show the current setting of stack unwinding in the functions
     called by GDB.


   Sometimes, a function you wish to call is actually a "weak alias"
for another function.  In such case, GDB might not pick up the type
information, including the types of the function arguments, which
causes GDB to call the inferior function incorrectly.  As a result, the
called function will function erroneously and may even crash.  A
solution to that is to use the name of the aliased function instead.


File: gdb.info,  Node: Patching,  Prev: Calling,  Up: Altering

17.6 Patching Programs
======================

By default, GDB 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 `set write' command.  For example, you might want
to turn on internal debugging flags, or even to make emergency repairs.

`set write on'
`set write off'
     If you specify `set write on', GDB opens executable and core files
     for both reading and writing; if you specify `set write off' (the
     default), GDB opens them read-only.

     If you have already loaded a file, you must load it again (using
     the `exec-file' or `core-file' command) after changing `set
     write', for your new setting to take effect.

`show write'
     Display whether executable files and core files are opened for
     writing as well as reading.


File: gdb.info,  Node: GDB Files,  Next: Targets,  Prev: Altering,  Up: Top

18 GDB Files
************

GDB 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 GDB the name of
the core dump file.

* Menu:

* Files::                       Commands to specify files
* Separate Debug Files::        Debugging information in separate files
* Index Files::                 Index files speed up GDB
* Symbol Errors::               Errors reading symbol files
* Data Files::                  GDB data files


File: gdb.info,  Node: Files,  Next: Separate Debug Files,  Up: GDB Files

18.1 Commands to Specify Files
==============================

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 GDB's
start-up commands (*note Getting In and Out of GDB: Invocation.).

   Occasionally it is necessary to change to a different file during a
GDB session.  Or you may run GDB and forget to specify a file you want
to use.  Or you are debugging a remote target via `gdbserver' (*note
file: Server.).  In these situations the GDB commands to specify new
files are useful.

`file FILENAME'
     Use 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 `run' command.  If you do not
     specify a directory and the file is not found in the GDB working
     directory, GDB uses the environment variable `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 GDB and your program, using the `path' command.

     You can load unlinked object `.o' files into GDB using the `file'
     command.  You will not be able to "run" an object file, but you
     can disassemble functions and inspect variables.  Also, if the
     underlying BFD functionality supports it, you could use `gdb
     -write' to patch object files using this technique.  Note that GDB
     can neither interpret nor modify relocations in this case, so
     branches and some initialized variables will appear to go to the
     wrong place.  But this feature is still handy from time to time.

`file'
     `file' with no argument makes GDB discard any information it has
     on both executable file and the symbol table.

`exec-file [ FILENAME ]'
     Specify that the program to be run (but not the symbol table) is
     found in FILENAME.  GDB searches the environment variable `PATH'
     if necessary to locate your program.  Omitting FILENAME means to
     discard information on the executable file.

`symbol-file [ FILENAME ]'
     Read symbol table information from file FILENAME.  `PATH' is
     searched when necessary.  Use the `file' command to get both symbol
     table and program to run from the same file.

     `symbol-file' with no argument clears out GDB information on your
     program's symbol table.

     The `symbol-file' command causes GDB to forget the contents of
     some breakpoints and auto-display expressions.  This is because
     they may contain pointers to the internal data recording symbols
     and data types, which are part of the old symbol table data being
     discarded inside GDB.

     `symbol-file' does not repeat if you press <RET> again after
     executing it once.

     When GDB 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 GNU
     compiler, or other compilers that adhere to the local conventions.
     Best results are usually obtained from GNU compilers; for example,
     using `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 `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 GDB
     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 `set verbose' command can turn
     these pauses into messages if desired.  *Note Optional Warnings
     and Messages: Messages/Warnings.)

     We have not implemented the two-stage strategy for COFF yet.  When
     the symbol table is stored in COFF format, `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.

`symbol-file [ -readnow ] FILENAME'
`file [ -readnow ] FILENAME'
     You can override the GDB two-stage strategy for reading symbol
     tables by using the `-readnow' option with any of the commands that
     load symbol table information, if you want to be sure GDB has the
     entire symbol table available.

`core-file [FILENAME]'
`core'
     Specify the whereabouts of a core dump file to be used as the
     "contents of memory".  Traditionally, core files contain only some
     parts of the address space of the process that generated them; GDB
     can access the executable file itself for other parts.

     `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 GDB.  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
     `kill' command (*note Killing the Child Process: Kill Process.).

`add-symbol-file FILENAME ADDRESS'
`add-symbol-file FILENAME ADDRESS [ -readnow ]'
`add-symbol-file FILENAME ADDRESS -s SECTION ADDRESS ...'
     The `add-symbol-file' command reads additional symbol table
     information from the file FILENAME.  You would use this command
     when FILENAME has been dynamically loaded (by some other means)
     into the program that is running.  ADDRESS should be the memory
     address at which the file has been loaded; GDB cannot figure this
     out for itself.  You can additionally specify an arbitrary number
     of `-s SECTION ADDRESS' pairs, to give an explicit section name
     and base address for that section.  You can specify any ADDRESS as
     an expression.

     The symbol table of the file FILENAME is added to the symbol table
     originally read with the `symbol-file' command.  You can use the
     `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 `symbol-file' command without any arguments.

     Although 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 `.o' files, as long as:

        * the file's symbolic information refers only to linker symbols
          defined in that file, not to symbols defined by other object
          files,

        * every section the file's symbolic information refers to has
          actually been loaded into the inferior, as it appears in the
          file, and

        * you can determine the address at which every section was
          loaded, and provide these to the `add-symbol-file' command.

     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 (`.linkonce' section factoring and C++
     constructor table assembly, for example) that make the
     requirements difficult to meet.  In general, one cannot assume
     that using `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.

     `add-symbol-file' does not repeat if you press <RET> after using
     it.

`add-symbol-file-from-memory ADDRESS'
     Load symbols from the given ADDRESS in a dynamically loaded object
     file whose image is mapped directly into the inferior's memory.
     For example, the Linux kernel maps a `syscall DSO' into each
     process's address space; this DSO provides kernel-specific code for
     some system calls.  The argument can be any expression whose
     evaluation yields the address of the file's shared object file
     header.  For this command to work, you must have used
     `symbol-file' or `exec-file' commands in advance.

`add-shared-symbol-files LIBRARY-FILE'
`assf LIBRARY-FILE'
     The `add-shared-symbol-files' command can currently be used only
     in the Cygwin build of GDB on MS-Windows OS, where it is an alias
     for the `dll-symbols' command (*note Cygwin Native::).  GDB
     automatically looks for shared libraries, however if GDB does not
     find yours, you can invoke `add-shared-symbol-files'.  It takes
     one argument: the shared library's file name.  `assf' is a
     shorthand alias for `add-shared-symbol-files'.

`section SECTION ADDR'
     The `section' command changes the base address of the named
     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 `info files'
     command, described below, lists all the sections and their
     addresses.

`info files'
`info target'
     `info files' and `info target' are synonymous; both print the
     current target (*note Specifying a Debugging Target: Targets.),
     including the names of the executable and core dump files
     currently in use by GDB, and the files from which symbols were
     loaded.  The command `help target' lists all possible targets
     rather than current ones.

`maint info sections'
     Another command that can give you extra information about program
     sections is `maint info sections'.  In addition to the section
     information displayed by `info files', this command displays the
     flags and file offset of each section in the executable and core
     dump files.  In addition, `maint info sections' provides the
     following command options (which may be arbitrarily combined):

    `ALLOBJ'
          Display sections for all loaded object files, including
          shared libraries.

    `SECTIONS'
          Display info only for named SECTIONS.

    `SECTION-FLAGS'
          Display info only for sections for which SECTION-FLAGS are
          true.  The section flags that GDB currently knows about are:
         `ALLOC'
               Section will have space allocated in the process when
               loaded.  Set for all sections except those containing
               debug information.

         `LOAD'
               Section will be loaded from the file into the child
               process memory.  Set for pre-initialized code and data,
               clear for `.bss' sections.

         `RELOC'
               Section needs to be relocated before loading.

         `READONLY'
               Section cannot be modified by the child process.

         `CODE'
               Section contains executable code only.

         `DATA'
               Section contains data only (no executable code).

         `ROM'
               Section will reside in ROM.

         `CONSTRUCTOR'
               Section contains data for constructor/destructor lists.

         `HAS_CONTENTS'
               Section is not empty.

         `NEVER_LOAD'
               An instruction to the linker to not output the section.

         `COFF_SHARED_LIBRARY'
               A notification to the linker that the section contains
               COFF shared library information.

         `IS_COMMON'
               Section contains common symbols.
     
`set trust-readonly-sections on'
     Tell GDB that readonly sections in your object file really are
     read-only (i.e. that their contents will not change).  In that
     case, GDB 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.

`set trust-readonly-sections off'
     Tell GDB 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.

`show trust-readonly-sections'
     Show the current setting of trusting readonly sections.

   All file-specifying commands allow both absolute and relative file
names as arguments.  GDB always converts the file name to an absolute
file name and remembers it that way.

   GDB supports GNU/Linux, MS-Windows, HP-UX, SunOS, SVr4, Irix, and
IBM RS/6000 AIX shared libraries.

   On MS-Windows GDB must be linked with the Expat library to support
shared libraries.  *Note Expat::.

   GDB automatically loads symbol definitions from shared libraries
when you use the `run' command, or when you examine a core file.
(Before you issue the `run' command, GDB 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, GDB
automatically loads the symbols at the time of the `shl_load' call.

   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:

`set auto-solib-add MODE'
     If MODE is `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 GDB that a new library has been loaded.  If MODE is
     `off', symbols must be loaded manually, using the `sharedlibrary'
     command.  The default value is `on'.

     If your program uses lots of shared libraries with debug info that
     takes large amounts of memory, you can decrease the GDB memory
     footprint by preventing it from automatically loading the symbols
     from shared libraries.  To that end, type `set auto-solib-add off'
     before running the inferior, then load each library whose debug
     symbols you do need with `sharedlibrary REGEXP', where REGEXP is a
     regular expression that matches the libraries whose symbols you
     want to be loaded.

`show auto-solib-add'
     Display the current autoloading mode.

   To explicitly load shared library symbols, use the `sharedlibrary'
command:

`info share REGEX'
`info sharedlibrary REGEX'
     Print the names of the shared libraries which are currently loaded
     that match REGEX.  If REGEX is omitted then print all shared
     libraries that are loaded.

`sharedlibrary REGEX'
`share 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 `run'.  If REGEX is omitted all shared libraries
     required by your program are loaded.

`nosharedlibrary'
     Unload all shared object library symbols.  This discards all
     symbols that have been loaded from all shared libraries.  Symbols
     from shared libraries that were loaded by explicit user requests
     are not discarded.

   Sometimes you may wish that GDB stops and gives you control when any
of shared library events happen.  Use the `set stop-on-solib-events'
command for this:

`set stop-on-solib-events'
     This command controls whether GDB should give you control when the
     dynamic linker notifies it about some shared library event.  The
     most common event of interest is loading or unloading of a new
     shared library.

`show stop-on-solib-events'
     Show whether GDB stops and gives you control when shared library
     events happen.

   Shared libraries are also supported in many cross or remote debugging
configurations.  GDB needs to have access to the target's libraries;
this can be accomplished either by providing copies of the libraries on
the host system, or by asking GDB to automatically retrieve the
libraries from the target.  If copies of the target libraries are
provided, they need to be the same as the target libraries, although the
copies on the target can be stripped as long as the copies on the host
are not.

   For remote debugging, you need to tell GDB where the target
libraries are, so that it can load the correct copies--otherwise, it
may try to load the host's libraries.  GDB has two variables to specify
the search directories for target libraries.

`set sysroot PATH'
     Use PATH as the system root for the program being debugged.  Any
     absolute shared library paths will be prefixed with PATH; many
     runtime loaders store the absolute paths to the shared library in
     the target program's memory.  If you use `set sysroot' to find
     shared libraries, they need to be laid out in the same way that
     they are on the target, with e.g. a `/lib' and `/usr/lib' hierarchy
     under PATH.

     If PATH starts with the sequence `remote:', GDB will retrieve the
     target libraries from the remote system.  This is only supported
     when using a remote target that supports the `remote get' command
     (*note Sending files to a remote system: File Transfer.).  The
     part of PATH following the initial `remote:' (if present) is used
     as system root prefix on the remote file system.  (1)

     For targets with an MS-DOS based filesystem, such as MS-Windows and
     SymbianOS, GDB tries prefixing a few variants of the target
     absolute file name with PATH.  But first, on Unix hosts, GDB
     converts all backslash directory separators into forward slashes,
     because the backslash is not a directory separator on Unix:

            c:\foo\bar.dll => c:/foo/bar.dll

     Then, GDB attempts prefixing the target file name with PATH, and
     looks for the resulting file name in the host file system:

            c:/foo/bar.dll => /path/to/sysroot/c:/foo/bar.dll

     If that does not find the shared library, GDB tries removing the
     `:' character from the drive spec, both for convenience, and, for
     the case of the host file system not supporting file names with
     colons:

            c:/foo/bar.dll => /path/to/sysroot/c/foo/bar.dll

     This makes it possible to have a system root that mirrors a target
     with more than one drive.  E.g., you may want to setup your local
     copies of the target system shared libraries like so (note `c' vs
     `z'):

           `/path/to/sysroot/c/sys/bin/foo.dll'
           `/path/to/sysroot/c/sys/bin/bar.dll'
           `/path/to/sysroot/z/sys/bin/bar.dll'

     and point the system root at `/path/to/sysroot', so that GDB can
     find the correct copies of both `c:\sys\bin\foo.dll', and
     `z:\sys\bin\bar.dll'.

     If that still does not find the shared library, GDB tries removing
     the whole drive spec from the target file name:

            c:/foo/bar.dll => /path/to/sysroot/foo/bar.dll

     This last lookup makes it possible to not care about the drive
     name, if you don't want or need to.

     The `set solib-absolute-prefix' command is an alias for `set
     sysroot'.

     You can set the default system root by using the configure-time
     `--with-sysroot' option.  If the system root is inside GDB's
     configured binary prefix (set with `--prefix' or `--exec-prefix'),
     then the default system root will be updated automatically if the
     installed GDB is moved to a new location.

`show sysroot'
     Display the current shared library prefix.

`set solib-search-path PATH'
     If this variable is set, PATH is a colon-separated list of
     directories to search for shared libraries.  `solib-search-path'
     is used after `sysroot' fails to locate the library, or if the
     path to the library is relative instead of absolute.  If you want
     to use `solib-search-path' instead of `sysroot', be sure to set
     `sysroot' to a nonexistent directory to prevent GDB from finding
     your host's libraries.  `sysroot' is preferred; setting it to a
     nonexistent directory may interfere with automatic loading of
     shared library symbols.

`show solib-search-path'
     Display the current shared library search path.

`set target-file-system-kind KIND'
     Set assumed file system kind for target reported file names.

     Shared library file names as reported by the target system may not
     make sense as is on the system GDB is running on.  For example,
     when remote debugging a target that has MS-DOS based file system
     semantics, from a Unix host, the target may be reporting to GDB a
     list of loaded shared libraries with file names such as
     `c:\Windows\kernel32.dll'.  On Unix hosts, there's no concept of
     drive letters, so the `c:\' prefix is not normally understood as
     indicating an absolute file name, and neither is the backslash
     normally considered a directory separator character.  In that case,
     the native file system would interpret this whole absolute file
     name as a relative file name with no directory components.  This
     would make it impossible to point GDB at a copy of the remote
     target's shared libraries on the host using `set sysroot', and
     impractical with `set solib-search-path'.  Setting
     `target-file-system-kind' to `dos-based' tells GDB to interpret
     such file names similarly to how the target would, and to map them
     to file names valid on GDB's native file system semantics.  The
     value of KIND can be `"auto"', in addition to one of the supported
     file system kinds.  In that case, GDB tries to determine the
     appropriate file system variant based on the current target's
     operating system (*note Configuring the Current ABI: ABI.).  The
     supported file system settings are:

    `unix'
          Instruct GDB to assume the target file system is of Unix
          kind.  Only file names starting the forward slash (`/')
          character are considered absolute, and the directory
          separator character is also the forward slash.

    `dos-based'
          Instruct GDB to assume the target file system is DOS based.
          File names starting with either a forward slash, or a drive
          letter followed by a colon (e.g., `c:'), are considered
          absolute, and both the slash (`/') and the backslash (`\\')
          characters are considered directory separators.

    `auto'
          Instruct GDB to use the file system kind associated with the
          target operating system (*note Configuring the Current ABI:
          ABI.).  This is the default.

   When processing file names provided by the user, GDB frequently
needs to compare them to the file names recorded in the program's debug
info.  Normally, GDB compares just the "base names" of the files as
strings, which is reasonably fast even for very large programs.  (The
base name of a file is the last portion of its name, after stripping
all the leading directories.)  This shortcut in comparison is based
upon the assumption that files cannot have more than one base name.
This is usually true, but references to files that use symlinks or
similar filesystem facilities violate that assumption.  If your program
records files using such facilities, or if you provide file names to
GDB using symlinks etc., you can set `basenames-may-differ' to `true'
to instruct GDB to completely canonicalize each pair of file names it
needs to compare.  This will make file-name comparisons accurate, but
at a price of a significant slowdown.

`set basenames-may-differ'
     Set whether a source file may have multiple base names.

`show basenames-may-differ'
     Show whether a source file may have multiple base names.

   ---------- Footnotes ----------

   (1) If you want to specify a local system root using a directory
that happens to be named `remote:', you need to use some equivalent
variant of the name like `./remote:'.


File: gdb.info,  Node: Separate Debug Files,  Next: Index Files,  Prev: Files,  Up: GDB Files

18.2 Debugging Information in Separate Files
============================================

GDB allows you to put a program's debugging information in a file
separate from the executable itself, in a way that allows GDB 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.

   GDB supports two ways of specifying the separate debug info file:

   * The executable contains a "debug link" that specifies the name of
     the separate debug info file.  The separate debug file's name is
     usually `EXECUTABLE.debug', where EXECUTABLE is the name of the
     corresponding executable file without leading directories (e.g.,
     `ls.debug' for `/usr/bin/ls').  In addition, the debug link
     specifies a 32-bit "Cyclic Redundancy Check" (CRC) checksum for
     the debug file, which GDB uses to validate that the executable and
     the debug file came from the same build.

   * The executable contains a "build ID", a unique bit string that is
     also present in the corresponding debug info file.  (This is
     supported only on some operating systems, notably those which use
     the ELF format for binary files and the GNU Binutils.)  For more
     details about this feature, see the description of the `--build-id'
     command-line option in *note Command Line Options:
     (ld.info)Options.  The debug info file's name is not specified
     explicitly by the build ID, but can be computed from the build ID,
     see below.

   Depending on the way the debug info file is specified, GDB uses two
different methods of looking for the debug file:

   * For the "debug link" method, GDB looks up the named file in the
     directory of the executable file, then in a subdirectory of that
     directory named `.debug', and finally under the global debug
     directory, in a subdirectory whose name is identical to the leading
     directories of the executable's absolute file name.

   * For the "build ID" method, GDB looks in the `.build-id'
     subdirectory of the global debug directory for a file named
     `NN/NNNNNNNN.debug', where NN are the first 2 hex characters of
     the build ID bit string, and NNNNNNNN are the rest of the bit
     string.  (Real build ID strings are 32 or more hex characters, not
     10.)

   So, for example, suppose you ask GDB to debug `/usr/bin/ls', which
has a debug link that specifies the file `ls.debug', and a build ID
whose value in hex is `abcdef1234'.  If the global debug directory is
`/usr/lib/debug', then GDB will look for the following debug
information files, in the indicated order:

   - `/usr/lib/debug/.build-id/ab/cdef1234.debug'

   - `/usr/bin/ls.debug'

   - `/usr/bin/.debug/ls.debug'

   - `/usr/lib/debug/usr/bin/ls.debug'.

   You can set the global debugging info directory's name, and view the
name GDB is currently using.

`set debug-file-directory DIRECTORIES'
     Set the directories which GDB searches for separate debugging
     information files to DIRECTORY.  Multiple directory components can
     be set concatenating them by a directory separator.

`show debug-file-directory'
     Show the directories GDB searches for separate debugging
     information files.


   A debug link is a special section of the executable file named
`.gnu_debuglink'.  The section must contain:

   * A filename, with any leading directory components removed,
     followed by a zero byte,

   * zero to three bytes of padding, as needed to reach the next
     four-byte boundary within the section, and

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

   Any executable file format can carry a debug link, as long as it can
contain a section named `.gnu_debuglink' with the contents described
above.

   The build ID is a special section in the executable file (and in
other ELF binary files that GDB may consider).  This section is often
named `.note.gnu.build-id', but that name is not mandatory.  It
contains unique identification for the built files--the ID remains the
same across multiple builds of the same build tree.  The default
algorithm SHA1 produces 160 bits (40 hexadecimal characters) of the
content for the build ID string.  The same section with an identical
value is present in the original built binary with symbols, in its
stripped variant, and in the separate debugging information file.

   The debugging information file itself should be an ordinary
executable, containing a full set of linker symbols, sections, and
debugging information.  The sections of the debugging information file
should have the same names, addresses, and sizes as the original file,
but they need not contain any data--much like a `.bss' section in an
ordinary executable.

   The GNU binary utilities (Binutils) package includes the `objcopy'
utility that can produce the separated executable / debugging
information file pairs using the following commands:

     objcopy --only-keep-debug foo foo.debug
     strip -g foo

These commands remove the debugging information from the executable
file `foo' and place it in the file `foo.debug'.  You can use the
first, second or both methods to link the two files:

   * The debug link method needs the following additional command to
     also leave behind a debug link in `foo':

          objcopy --add-gnu-debuglink=foo.debug foo

     Ulrich Drepper's `elfutils' package, starting with version 0.53,
     contains a version of the `strip' command such that the command
     `strip foo -f foo.debug' has the same functionality as the two
     `objcopy' commands and the `ln -s' command above, together.

   * Build ID gets embedded into the main executable using `ld
     --build-id' or the GCC counterpart `gcc -Wl,--build-id'.  Build ID
     support plus compatibility fixes for debug files separation are
     present in GNU binary utilities (Binutils) package since version
     2.18.

The CRC used in `.gnu_debuglink' is the CRC-32 defined in IEEE 802.3
using the polynomial:

      x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11
      + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1

   The function is computed byte at a time, taking the least
significant bit of each byte first.  The initial pattern `0xffffffff'
is used, to ensure leading zeros affect the CRC and the final result is
inverted to ensure trailing zeros also affect the CRC.

   _Note:_ This is the same CRC polynomial as used in handling the
"Remote Serial Protocol" `qCRC' packet (*note GDB Remote Serial
Protocol: Remote Protocol.).  However in the case of the Remote Serial
Protocol, the CRC is computed _most_ significant bit first, and the
result is not inverted, so trailing zeros have no effect on the CRC
value.

   To complete the description, we show below the code of the function
which produces the CRC used in `.gnu_debuglink'.  Inverting the
initially supplied `crc' argument means that an initial call to this
function passing in zero will start computing the CRC using
`0xffffffff'.

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

This computation does not apply to the "build ID" method.


File: gdb.info,  Node: Index Files,  Next: Symbol Errors,  Prev: Separate Debug Files,  Up: GDB Files

18.3 Index Files Speed Up GDB
=============================

When GDB finds a symbol file, it scans the symbols in the file in order
to construct an internal symbol table.  This lets most GDB operations
work quickly--at the cost of a delay early on.  For large programs,
this delay can be quite lengthy, so GDB provides a way to build an
index, which speeds up startup.

   The index is stored as a section in the symbol file.  GDB can write
the index to a file, then you can put it into the symbol file using
`objcopy'.

   To create an index file, use the `save gdb-index' command:

`save gdb-index DIRECTORY'
     Create an index file for each symbol file currently known by GDB.
     Each file is named after its corresponding symbol file, with
     `.gdb-index' appended, and is written into the given DIRECTORY.

   Once you have created an index file you can merge it into your symbol
file, here named `symfile', using `objcopy':

     $ objcopy --add-section .gdb_index=symfile.gdb-index \
         --set-section-flags .gdb_index=readonly symfile symfile

   There are currently some limitation on indices.  They only work when
for DWARF debugging information, not stabs.  And, they do not currently
work for programs using Ada.


File: gdb.info,  Node: Symbol Errors,  Next: Data Files,  Prev: Index Files,  Up: GDB Files

18.4 Errors Reading Symbol Files
================================

While reading a symbol file, GDB occasionally encounters problems, such
as symbol types it does not recognize, or known bugs in compiler
output.  By default, GDB 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 GDB to print only one
message about each such type of problem, no matter how many times the
problem occurs; or you can ask GDB to print more messages, to see how
many times the problems occur, with the `set complaints' command (*note
Optional Warnings and Messages: Messages/Warnings.).

   The messages currently printed, and their meanings, include:

`inner block not inside outer block in 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.

     GDB circumvents the problem by treating the inner block as if it
     had the same scope as the outer block.  In the error message,
     SYMBOL may be shown as "`(don't know)'" if the outer block is not a
     function.

`block at 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.

     GDB 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 `set
     verbose on'.  *Note Optional Warnings and Messages:
     Messages/Warnings.)

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

     GDB circumvents the problem by treating the symbol scope block as
     starting on the previous source line.

`bad string table offset in symbol N'
     Symbol number N contains a pointer into the string table which is
     larger than the size of the string table.

     GDB circumvents the problem by considering the symbol to have the
     name `foo', which may cause other problems if many symbols end up
     with this name.

`unknown symbol type `0xNN''
     The symbol information contains new data types that GDB does not
     yet know how to read.  `0xNN' is the symbol type of the
     uncomprehended information, in hexadecimal.

     GDB 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 `gdb' with itself, breakpoint
     on `complain', then go up to the function `read_dbx_symtab' and
     examine `*bufp' to see the symbol.

`stub type has NULL name'
     GDB could not find the full definition for a struct or class.

`const/volatile indicator missing (ok if using g++ v1.x), got...'
     The symbol information for a C++ member function is missing some
     information that recent versions of the compiler should have
     output for it.

`info mismatch between compiler and debugger'
     GDB could not parse a type specification output by the compiler.



File: gdb.info,  Node: Data Files,  Prev: Symbol Errors,  Up: GDB Files

18.5 GDB Data Files
===================

GDB will sometimes read an auxiliary data file.  These files are kept
in a directory known as the "data directory".

   You can set the data directory's name, and view the name GDB is
currently using.

`set data-directory DIRECTORY'
     Set the directory which GDB searches for auxiliary data files to
     DIRECTORY.

`show data-directory'
     Show the directory GDB searches for auxiliary data files.

   You can set the default data directory by using the configure-time
`--with-gdb-datadir' option.  If the data directory is inside GDB's
configured binary prefix (set with `--prefix' or `--exec-prefix'), then
the default data directory will be updated automatically if the
installed GDB is moved to a new location.

   The data directory may also be specified with the `--data-directory'
command line option.  *Note Mode Options::.


File: gdb.info,  Node: Targets,  Next: Remote Debugging,  Prev: GDB Files,  Up: Top

19 Specifying a Debugging Target
********************************

A "target" is the execution environment occupied by your program.

   Often, GDB 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 `file' or `core' commands.  When you need more flexibility--for
example, running GDB 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 `target' command to specify one of the
target types configured for GDB (*note Commands for Managing Targets:
Target Commands.).

   It is possible to build GDB for several different "target
architectures".  When GDB is built like that, you can choose one of the
available architectures with the `set architecture' command.

`set architecture ARCH'
     This command sets the current target architecture to ARCH.  The
     value of ARCH can be `"auto"', in addition to one of the supported
     architectures.

`show architecture'
     Show the current target architecture.

`set processor'
`processor'
     These are alias commands for, respectively, `set architecture' and
     `show architecture'.

* Menu:

* Active Targets::              Active targets
* Target Commands::             Commands for managing targets
* Byte Order::                  Choosing target byte order


File: gdb.info,  Node: Active Targets,  Next: Target Commands,  Up: Targets

19.1 Active Targets
===================

There are multiple classes of targets such as: processes, executable
files or recording sessions.  Core files belong to the process class,
making core file and process mutually exclusive.  Otherwise, GDB can
work concurrently on multiple active targets, one in each class.  This
allows you to (for example) start a process and inspect its activity,
while still having access to the executable file after the process
finishes.  Or if you start process recording (*note Reverse
Execution::) and `reverse-step' there, you are presented a virtual
layer of the recording target, while the process target remains stopped
at the chronologically last point of the process execution.

   Use the `core-file' and `exec-file' commands to select a new core
file or executable target (*note Commands to Specify Files: Files.).  To
specify as a target a process that is already running, use the `attach'
command (*note Debugging an Already-running Process: Attach.).


File: gdb.info,  Node: Target Commands,  Next: Byte Order,  Prev: Active Targets,  Up: Targets

19.2 Commands for Managing Targets
==================================

`target TYPE PARAMETERS'
     Connects the GDB host environment to a target machine or process.
     A target is typically a protocol for talking to debugging
     facilities.  You use the argument TYPE to specify the type or
     protocol of the target machine.

     Further 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 `target' command does not repeat if you press <RET> again
     after executing the command.

`help target'
     Displays the names of all targets available.  To display targets
     currently selected, use either `info target' or `info files'
     (*note Commands to Specify Files: Files.).

`help target NAME'
     Describe a particular target, including any parameters necessary to
     select it.

`set gnutarget ARGS'
     GDB uses its own library BFD to read your files.  GDB knows
     whether it is reading an "executable", a "core", or a ".o" file;
     however, you can specify the file format with the `set gnutarget'
     command.  Unlike most `target' commands, with `gnutarget' the
     `target' refers to a program, not a machine.

          _Warning:_ To specify a file format with `set gnutarget', you
          must know the actual BFD name.

     *Note Commands to Specify Files: Files.

`show gnutarget'
     Use the `show gnutarget' command to display what file format
     `gnutarget' is set to read.  If you have not set `gnutarget', GDB
     will determine the file format for each file automatically, and
     `show gnutarget' displays `The current BDF target is "auto"'.

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

`target exec PROGRAM'
     An executable file.  `target exec PROGRAM' is the same as
     `exec-file PROGRAM'.

`target core FILENAME'
     A core dump file.  `target core FILENAME' is the same as
     `core-file FILENAME'.

`target remote MEDIUM'
     A remote system connected to GDB via a serial line or network
     connection.  This command tells GDB to use its own remote protocol
     over MEDIUM for debugging.  *Note Remote Debugging::.

     For example, if you have a board connected to `/dev/ttya' on the
     machine running GDB, you could say:

          target remote /dev/ttya

     `target remote' supports the `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.

`target sim [SIMARGS] ...'
     Builtin CPU simulator.  GDB includes simulators for most
     architectures.  In general,
                  target sim
                  load
                  run
     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 *note Embedded Processors: Embedded Processors.


   Some configurations may include these targets as well:

`target nrom DEV'
     NetROM ROM emulator.  This target only supports downloading.


   Different targets are available on different configurations of GDB;
your configuration may have more or fewer targets.

   Many remote targets require you to download the executable's code
once you've successfully established a connection.  You may wish to
control various aspects of this process.

`set hash'
     This command controls whether a hash mark `#' is displayed while
     downloading a file to the remote monitor.  If on, a hash mark is
     displayed after each S-record is successfully downloaded to the
     monitor.

`show hash'
     Show the current status of displaying the hash mark.

`set debug monitor'
     Enable or disable display of communications messages between GDB
     and the remote monitor.

`show debug monitor'
     Show the current status of displaying communications between GDB
     and the remote monitor.

`load FILENAME'
     Depending on what remote debugging facilities are configured into
     GDB, the `load' command may be available.  Where it exists, it is
     meant to make FILENAME (an executable) available for debugging on
     the remote system--by downloading, or dynamic linking, for example.
     `load' also records the FILENAME symbol table in GDB, like the
     `add-symbol-file' command.

     If your GDB does not have a `load' command, attempting to execute
     it gets the error message "`You can't do that when your target is
     ...'"

     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.

     Depending on the remote side capabilities, GDB may be able to load
     programs into flash memory.

     `load' does not repeat if you press <RET> again after using it.


File: gdb.info,  Node: Byte Order,  Prev: Target Commands,  Up: Targets

19.3 Choosing Target Byte Order
===============================

Some types of processors, such as the MIPS, PowerPC, and Renesas SH,
offer the ability to run either big-endian or little-endian byte
orders.  Usually the executable or symbol will include a bit to
designate the endian-ness, and you will not need to worry about which
to use.  However, you may still find it useful to adjust GDB's idea of
processor endian-ness manually.

`set endian big'
     Instruct GDB to assume the target is big-endian.

`set endian little'
     Instruct GDB to assume the target is little-endian.

`set endian auto'
     Instruct GDB to use the byte order associated with the executable.

`show endian'
     Display GDB's current idea of the target byte order.


   Note that these commands merely adjust interpretation of symbolic
data on the host, and that they have absolutely no effect on the target
system.


File: gdb.info,  Node: Remote Debugging,  Next: Configurations,  Prev: Targets,  Up: Top

20 Debugging Remote Programs
****************************

If you are trying to debug a program running on a machine that cannot
run GDB 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 GDB have special serial or TCP/IP interfaces
to make this work with particular debugging targets.  In addition, GDB
comes with a generic serial protocol (specific to GDB, 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 GDB.

   Other remote targets may be available in your configuration of GDB;
use `help target' to list them.

* Menu:

* Connecting::                  Connecting to a remote target
* File Transfer::               Sending files to a remote system
* Server::	                Using the gdbserver program
* Remote Configuration::        Remote configuration
* Remote Stub::                 Implementing a remote stub


File: gdb.info,  Node: Connecting,  Next: File Transfer,  Up: Remote Debugging

20.1 Connecting to a Remote Target
==================================

On the GDB host machine, you will need an unstripped copy of your
program, since GDB needs symbol and debugging information.  Start up
GDB as usual, using the name of the local copy of your program as the
first argument.

   GDB can communicate with the target over a serial line, or over an
IP network using TCP or UDP.  In each case, GDB uses the same protocol
for debugging your program; only the medium carrying the debugging
packets varies.  The `target remote' command establishes a connection
to the target.  Its arguments indicate which medium to use:

`target remote SERIAL-DEVICE'
     Use SERIAL-DEVICE to communicate with the target.  For example, to
     use a serial line connected to the device named `/dev/ttyb':

          target remote /dev/ttyb

     If you're using a serial line, you may want to give GDB the
     `--baud' option, or use the `set remotebaud' command (*note set
     remotebaud: Remote Configuration.) before the `target' command.

`target remote `HOST:PORT''
`target remote `tcp:HOST:PORT''
     Debug using a TCP connection to PORT on HOST.  The HOST may be
     either a host name or a numeric IP address; PORT must be a decimal
     number.  The HOST could be the target machine itself, if it is
     directly connected to the net, or it might be a terminal server
     which in turn has a serial line to the target.

     For example, to connect to port 2828 on a terminal server named
     `manyfarms':

          target remote manyfarms:2828

     If your remote target is actually running on the same machine as
     your debugger session (e.g. a simulator for your target running on
     the same host), you can omit the hostname.  For example, to
     connect to port 1234 on your local machine:

          target remote :1234
     Note that the colon is still required here.

`target remote `udp:HOST:PORT''
     Debug using UDP packets to PORT on HOST.  For example, to connect
     to UDP port 2828 on a terminal server named `manyfarms':

          target remote udp:manyfarms:2828

     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.

`target remote | COMMAND'
     Run COMMAND in the background and communicate with it using a
     pipe.  The COMMAND is a shell command, to be parsed and expanded
     by the system's command shell, `/bin/sh'; it should expect remote
     protocol packets on its standard input, and send replies on its
     standard output.  You could use this to run a stand-alone simulator
     that speaks the remote debugging protocol, to make net connections
     using programs like `ssh', or for other similar tricks.

     If COMMAND closes its standard output (perhaps by exiting), GDB
     will try to send it a `SIGTERM' signal.  (If the program has
     already exited, this will have no effect.)


   Once the connection has been established, you can use all the usual
commands to examine and change data.  The remote program is already
running; you can use `step' and `continue', and you do not need to use
`run'.

   Whenever GDB is waiting for the remote program, if you type the
interrupt character (often `Ctrl-c'), GDB 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, GDB displays this prompt:

     Interrupted while waiting for the program.
     Give up (and stop debugging it)?  (y or n)

   If you type `y', GDB abandons the remote debugging session.  (If you
decide you want to try again later, you can use `target remote' again
to connect once more.)  If you type `n', GDB goes back to waiting.

`detach'
     When you have finished debugging the remote program, you can use
     the `detach' command to release it from GDB control.  Detaching
     from the target normally resumes its execution, but the results
     will depend on your particular remote stub.  After the `detach'
     command, GDB is free to connect to another target.

`disconnect'
     The `disconnect' command behaves like `detach', except that the
     target is generally not resumed.  It will wait for GDB (this
     instance or another one) to connect and continue debugging.  After
     the `disconnect' command, GDB is again free to connect to another
     target.

`monitor CMD'
     This command allows you to send arbitrary commands directly to the
     remote monitor.  Since GDB doesn't care about the commands it
     sends like this, this command is the way to extend GDB--you can
     add new commands that only the external monitor will understand
     and implement.


File: gdb.info,  Node: File Transfer,  Next: Server,  Prev: Connecting,  Up: Remote Debugging

20.2 Sending files to a remote system
=====================================

Some remote targets offer the ability to transfer files over the same
connection used to communicate with GDB.  This is convenient for
targets accessible through other means, e.g. GNU/Linux systems running
`gdbserver' over a network interface.  For other targets, e.g. embedded
devices with only a single serial port, this may be the only way to
upload or download files.

   Not all remote targets support these commands.

`remote put HOSTFILE TARGETFILE'
     Copy file HOSTFILE from the host system (the machine running GDB)
     to TARGETFILE on the target system.

`remote get TARGETFILE HOSTFILE'
     Copy file TARGETFILE from the target system to HOSTFILE on the
     host system.

`remote delete TARGETFILE'
     Delete TARGETFILE from the target system.



File: gdb.info,  Node: Server,  Next: Remote Configuration,  Prev: File Transfer,  Up: Remote Debugging

20.3 Using the `gdbserver' Program
==================================

`gdbserver' is a control program for Unix-like systems, which allows
you to connect your program with a remote GDB via `target remote'--but
without linking in the usual debugging stub.

   `gdbserver' is not a complete replacement for the debugging stubs,
because it requires essentially the same operating-system facilities
that GDB itself does.  In fact, a system that can run `gdbserver' to
connect to a remote GDB could also run GDB locally!  `gdbserver' is
sometimes useful nevertheless, because it is a much smaller program
than GDB itself.  It is also easier to port than all of GDB, so you may
be able to get started more quickly on a new system by using
`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 `gdbserver' to
make a similar choice for debugging.

   GDB and `gdbserver' communicate via either a serial line or a TCP
connection, using the standard GDB remote serial protocol.

     _Warning:_ `gdbserver' does not have any built-in security.  Do
     not run `gdbserver' connected to any public network; a GDB
     connection to `gdbserver' provides access to the target system
     with the same privileges as the user running `gdbserver'.

20.3.1 Running `gdbserver'
--------------------------

Run `gdbserver' on the target system.  You need a copy of the program
you want to debug, including any libraries it requires.  `gdbserver'
does not need your program's symbol table, so you can strip the program
if necessary to save space.  GDB on the host system does all the symbol
handling.

   To use the server, you must tell it how to communicate with GDB; the
name of your program; and the arguments for your program.  The usual
syntax is:

     target> gdbserver COMM PROGRAM [ ARGS ... ]

   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
`foo.txt' and communicate with GDB over the serial port `/dev/com1':

     target> gdbserver /dev/com1 emacs foo.txt

   `gdbserver' waits passively for the host GDB to communicate with it.

   To use a TCP connection instead of a serial line:

     target> gdbserver host:2345 emacs foo.txt

   The only difference from the previous example is the first argument,
specifying that you are communicating with the host GDB via TCP.  The
`host:2345' argument means that `gdbserver' is to expect a TCP
connection from machine `host' to local TCP port 2345.  (Currently, the
`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, `23' is reserved for
`telnet').(1)  You must use the same port number with the host GDB
`target remote' command.

20.3.1.1 Attaching to a Running Program
.......................................

On some targets, `gdbserver' can also attach to running programs.  This
is accomplished via the `--attach' argument.  The syntax is:

     target> gdbserver --attach COMM PID

   PID is the process ID of a currently running process.  It isn't
necessary to point `gdbserver' at a binary for the running process.

   You can debug processes by name instead of process ID if your target
has the `pidof' utility:

     target> gdbserver --attach COMM `pidof PROGRAM`

   In case more than one copy of PROGRAM is running, or PROGRAM has
multiple threads, most versions of `pidof' support the `-s' option to
only return the first process ID.

20.3.1.2 Multi-Process Mode for `gdbserver'
...........................................

When you connect to `gdbserver' using `target remote', `gdbserver'
debugs the specified program only once.  When the program exits, or you
detach from it, GDB closes the connection and `gdbserver' exits.

   If you connect using `target extended-remote', `gdbserver' enters
multi-process mode.  When the debugged program exits, or you detach
from it, GDB stays connected to `gdbserver' even though no program is
running.  The `run' and `attach' commands instruct `gdbserver' to run
or attach to a new program.  The `run' command uses `set remote
exec-file' (*note set remote exec-file::) to select the program to run.
Command line arguments are supported, except for wildcard expansion and
I/O redirection (*note Arguments::).

   To start `gdbserver' without supplying an initial command to run or
process ID to attach, use the `--multi' command line option.  Then you
can connect using `target extended-remote' and start the program you
want to debug.

   In multi-process mode `gdbserver' does not automatically exit unless
you use the option `--once'.  You can terminate it by using `monitor
exit' (*note Monitor Commands for gdbserver::).  Note that the
conditions under which `gdbserver' terminates depend on how GDB
connects to it (`target remote' or `target extended-remote').  The
`--multi' option to `gdbserver' has no influence on that.

20.3.1.3 TCP port allocation lifecycle of `gdbserver'
.....................................................

This section applies only when `gdbserver' is run to listen on a TCP
port.

   `gdbserver' normally terminates after all of its debugged processes
have terminated in `target remote' mode.  On the other hand, for `target
extended-remote', `gdbserver' stays running even with no processes left.
GDB normally terminates the spawned debugged process on its exit, which
normally also terminates `gdbserver' in the `target remote' mode.
Therefore, when the connection drops unexpectedly, and GDB cannot ask
`gdbserver' to kill its debugged processes, `gdbserver' stays running
even in the `target remote' mode.

   When `gdbserver' stays running, GDB can connect to it again later.
Such reconnecting is useful for features like *note disconnected
tracing::.  For completeness, at most one GDB can be connected at a
time.

   By default, `gdbserver' keeps the listening TCP port open, so that
additional connections are possible.  However, if you start `gdbserver'
with the `--once' option, it will stop listening for any further
connection attempts after connecting to the first GDB session.  This
means no further connections to `gdbserver' will be possible after the
first one.  It also means `gdbserver' will terminate after the first
connection with remote GDB has closed, even for unexpectedly closed
connections and even in the `target extended-remote' mode.  The
`--once' option allows reusing the same port number for connecting to
multiple instances of `gdbserver' running on the same host, since each
instance closes its port after the first connection.

20.3.1.4 Other Command-Line Arguments for `gdbserver'
.....................................................

The `--debug' option tells `gdbserver' to display extra status
information about the debugging process.  The `--remote-debug' option
tells `gdbserver' to display remote protocol debug output.  These
options are intended for `gdbserver' development and for bug reports to
the developers.

   The `--wrapper' option specifies a wrapper to launch programs for
debugging.  The option should be followed by the name of the wrapper,
then any command-line arguments to pass to the wrapper, then `--'
indicating the end of the wrapper arguments.

   `gdbserver' runs the specified wrapper program with a combined
command line including the wrapper arguments, then the name of the
program to debug, then any arguments to the program.  The wrapper runs
until it executes your program, and then GDB gains control.

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

   For example, you can use `env' to pass an environment variable to
the debugged program, without setting the variable in `gdbserver''s
environment:

     $ gdbserver --wrapper env LD_PRELOAD=libtest.so -- :2222 ./testprog

20.3.2 Connecting to `gdbserver'
--------------------------------

Run GDB on the host system.

   First make sure you have the necessary symbol files.  Load symbols
for your application using the `file' command before you connect.  Use
`set sysroot' to locate target libraries (unless your GDB was compiled
with the correct sysroot using `--with-sysroot').

   The symbol file and target libraries must exactly match the
executable and libraries on the target, with one exception: the files
on the host system should not be stripped, even if the files on the
target system are.  Mismatched or missing files will lead to confusing
results during debugging.  On GNU/Linux targets, mismatched or missing
files may also prevent `gdbserver' from debugging multi-threaded
programs.

   Connect to your target (*note Connecting to a Remote Target:
Connecting.).  For TCP connections, you must start up `gdbserver' prior
to using the `target remote' command.  Otherwise you may get an error
whose text depends on the host system, but which usually looks
something like `Connection refused'.  Don't use the `load' command in
GDB when using `gdbserver', since the program is already on the target.

20.3.3 Monitor Commands for `gdbserver'
---------------------------------------

During a GDB session using `gdbserver', you can use the `monitor'
command to send special requests to `gdbserver'.  Here are the
available commands.

`monitor help'
     List the available monitor commands.

`monitor set debug 0'
`monitor set debug 1'
     Disable or enable general debugging messages.

`monitor set remote-debug 0'
`monitor set remote-debug 1'
     Disable or enable specific debugging messages associated with the
     remote protocol (*note Remote Protocol::).

`monitor set libthread-db-search-path [PATH]'
     When this command is issued, PATH is a colon-separated list of
     directories to search for `libthread_db' (*note set
     libthread-db-search-path: Threads.).  If you omit PATH,
     `libthread-db-search-path' will be reset to its default value.

     The special entry `$pdir' for `libthread-db-search-path' is not
     supported in `gdbserver'.

`monitor exit'
     Tell gdbserver to exit immediately.  This command should be
     followed by `disconnect' to close the debugging session.
     `gdbserver' will detach from any attached processes and kill any
     processes it created.  Use `monitor exit' to terminate `gdbserver'
     at the end of a multi-process mode debug session.


20.3.4 Tracepoints support in `gdbserver'
-----------------------------------------

On some targets, `gdbserver' supports tracepoints, fast tracepoints and
static tracepoints.

   For fast or static tracepoints to work, a special library called the
"in-process agent" (IPA), must be loaded in the inferior process.  This
library is built and distributed as an integral part of `gdbserver'.
In addition, support for static tracepoints requires building the
in-process agent library with static tracepoints support.  At present,
the UST (LTTng Userspace Tracer, `http://lttng.org/ust') tracing engine
is supported.  This support is automatically available if UST
development headers are found in the standard include path when
`gdbserver' is built, or if `gdbserver' was explicitly configured using
`--with-ust' to point at such headers.  You can explicitly disable the
support using `--with-ust=no'.

   There are several ways to load the in-process agent in your program:

`Specifying it as dependency at link time'
     You can link your program dynamically with the in-process agent
     library.  On most systems, this is accomplished by adding
     `-linproctrace' to the link command.

`Using the system's preloading mechanisms'
     You can force loading the in-process agent at startup time by using
     your system's support for preloading shared libraries.  Many Unixes
     support the concept of preloading user defined libraries.  In most
     cases, you do that by specifying `LD_PRELOAD=libinproctrace.so' in
     the environment.  See also the description of `gdbserver''s
     `--wrapper' command line option.

`Using GDB to force loading the agent at run time'
     On some systems, you can force the inferior to load a shared
     library, by calling a dynamic loader function in the inferior that
     takes care of dynamically looking up and loading a shared library.
     On most Unix systems, the function is `dlopen'.  You'll use the
     `call' command for that.  For example:

          (gdb) call dlopen ("libinproctrace.so", ...)

     Note that on most Unix systems, for the `dlopen' function to be
     available, the program needs to be linked with `-ldl'.

   On systems that have a userspace dynamic loader, like most Unix
systems, when you connect to `gdbserver' using `target remote', you'll
find that the program is stopped at the dynamic loader's entry point,
and no shared library has been loaded in the program's address space
yet, including the in-process agent.  In that case, before being able
to use any of the fast or static tracepoints features, you need to let
the loader run and load the shared libraries.  The simplest way to do
that is to run the program to the main procedure.  E.g., if debugging a
C or C++ program, start `gdbserver' like so:

     $ gdbserver :9999 myprogram

   Start GDB and connect to `gdbserver' like so, and run to main:

     $ gdb myprogram
     (gdb) target remote myhost:9999
     0x00007f215893ba60 in ?? () from /lib64/ld-linux-x86-64.so.2
     (gdb) b main
     (gdb) continue

   The in-process tracing agent library should now be loaded into the
process; you can confirm it with the `info sharedlibrary' command,
which will list `libinproctrace.so' as loaded in the process.  You are
now ready to install fast tracepoints, list static tracepoint markers,
probe static tracepoints markers, and start tracing.

   ---------- Footnotes ----------

   (1) If you choose a port number that conflicts with another service,
`gdbserver' prints an error message and exits.


File: gdb.info,  Node: Remote Configuration,  Next: Remote Stub,  Prev: Server,  Up: Remote Debugging

20.4 Remote Configuration
=========================

This section documents the configuration options available when
debugging remote programs.  For the options related to the File I/O
extensions of the remote protocol, see *note system-call-allowed:
system.

`set remoteaddresssize BITS'
     Set the maximum size of address in a memory packet to the specified
     number of bits.  GDB will mask off the address bits above that
     number, when it passes addresses to the remote target.  The
     default value is the number of bits in the target's address.

`show remoteaddresssize'
     Show the current value of remote address size in bits.

`set remotebaud N'
     Set the baud rate for the remote serial I/O to N baud.  The value
     is used to set the speed of the serial port used for debugging
     remote targets.

`show remotebaud'
     Show the current speed of the remote connection.

`set remotebreak'
     If set to on, GDB sends a `BREAK' signal to the remote when you
     type `Ctrl-c' to interrupt the program running on the remote.  If
     set to off, GDB sends the `Ctrl-C' character instead.  The default
     is off, since most remote systems expect to see `Ctrl-C' as the
     interrupt signal.

`show remotebreak'
     Show whether GDB sends `BREAK' or `Ctrl-C' to interrupt the remote
     program.

`set remoteflow on'
`set remoteflow off'
     Enable or disable hardware flow control (`RTS'/`CTS') on the
     serial port used to communicate to the remote target.

`show remoteflow'
     Show the current setting of hardware flow control.

`set remotelogbase BASE'
     Set the base (a.k.a. radix) of logging serial protocol
     communications to BASE.  Supported values of BASE are: `ascii',
     `octal', and `hex'.  The default is `ascii'.

`show remotelogbase'
     Show the current setting of the radix for logging remote serial
     protocol.

`set remotelogfile FILE'
     Record remote serial communications on the named FILE.  The
     default is not to record at all.

`show remotelogfile.'
     Show the current setting  of the file name on which to record the
     serial communications.

`set remotetimeout NUM'
     Set the timeout limit to wait for the remote target to respond to
     NUM seconds.  The default is 2 seconds.

`show remotetimeout'
     Show the current number of seconds to wait for the remote target
     responses.

`set remote hardware-watchpoint-limit LIMIT'
`set remote hardware-breakpoint-limit LIMIT'
     Restrict GDB to using LIMIT remote hardware breakpoint or
     watchpoints.  A limit of -1, the default, is treated as unlimited.

`set remote hardware-watchpoint-length-limit LIMIT'
     Restrict GDB to using LIMIT bytes for the maximum length of a
     remote hardware watchpoint.  A limit of -1, the default, is treated
     as unlimited.

`show remote hardware-watchpoint-length-limit'
     Show the current limit (in bytes) of the maximum length of a
     remote hardware watchpoint.

`set remote exec-file FILENAME'
`show remote exec-file'
     Select the file used for `run' with `target extended-remote'.
     This should be set to a filename valid on the target system.  If
     it is not set, the target will use a default filename (e.g. the
     last program run).

`set remote interrupt-sequence'
     Allow the user to select one of `Ctrl-C', a `BREAK' or `BREAK-g'
     as the sequence to the remote target in order to interrupt the
     execution.  `Ctrl-C' is a default.  Some system prefers `BREAK'
     which is high level of serial line for some certain time.  Linux
     kernel prefers `BREAK-g', a.k.a Magic SysRq g.  It is `BREAK'
     signal followed by character `g'.

`show interrupt-sequence'
     Show which of `Ctrl-C', `BREAK' or `BREAK-g' is sent by GDB to
     interrupt the remote program.  `BREAK-g' is BREAK signal followed
     by `g' and also known as Magic SysRq g.

`set remote interrupt-on-connect'
     Specify whether interrupt-sequence is sent to remote target when
     GDB connects to it.  This is mostly needed when you debug Linux
     kernel.  Linux kernel expects `BREAK' followed by `g' which is
     known as Magic SysRq g in order to connect GDB.

`show interrupt-on-connect'
     Show whether interrupt-sequence is sent to remote target when GDB
     connects to it.

`set tcp auto-retry on'
     Enable auto-retry for remote TCP connections.  This is useful if
     the remote debugging agent is launched in parallel with GDB; there
     is a race condition because the agent may not become ready to
     accept the connection before GDB attempts to connect.  When
     auto-retry is enabled, if the initial attempt to connect fails,
     GDB reattempts to establish the connection using the timeout
     specified by `set tcp connect-timeout'.

`set tcp auto-retry off'
     Do not auto-retry failed TCP connections.

`show tcp auto-retry'
     Show the current auto-retry setting.

`set tcp connect-timeout SECONDS'
     Set the timeout for establishing a TCP connection to the remote
     target to SECONDS.  The timeout affects both polling to retry
     failed connections (enabled by `set tcp auto-retry on') and
     waiting for connections that are merely slow to complete, and
     represents an approximate cumulative value.

`show tcp connect-timeout'
     Show the current connection timeout setting.

   The GDB remote protocol autodetects the packets supported by your
debugging stub.  If you need to override the autodetection, you can use
these commands to enable or disable individual packets.  Each packet
can be set to `on' (the remote target supports this packet), `off' (the
remote target does not support this packet), or `auto' (detect remote
target support for this packet).  They all default to `auto'.  For more
information about each packet, see *note Remote Protocol::.

   During normal use, you should not have to use any of these commands.
If you do, that may be a bug in your remote debugging stub, or a bug in
GDB.  You may want to report the problem to the GDB developers.

   For each packet NAME, the command to enable or disable the packet is
`set remote NAME-packet'.  The available settings are:

Command Name         Remote Packet           Related Features
`fetch-register'     `p'                     `info registers'
`set-register'       `P'                     `set'
`binary-download'    `X'                     `load', `set'
`read-aux-vector'    `qXfer:auxv:read'       `info auxv'
`symbol-lookup'      `qSymbol'               Detecting
                                             multiple threads
`attach'             `vAttach'               `attach'
`verbose-resume'     `vCont'                 Stepping or
                                             resuming multiple
                                             threads
`run'                `vRun'                  `run'
`software-breakpoint'`Z0'                    `break'
`hardware-breakpoint'`Z1'                    `hbreak'
`write-watchpoint'   `Z2'                    `watch'
`read-watchpoint'    `Z3'                    `rwatch'
`access-watchpoint'  `Z4'                    `awatch'
`target-features'    `qXfer:features:read'   `set architecture'
`library-info'       `qXfer:libraries:read'  `info
                                             sharedlibrary'
`memory-map'         `qXfer:memory-map:read' `info mem'
`read-sdata-object'  `qXfer:sdata:read'      `print $_sdata'
`read-spu-object'    `qXfer:spu:read'        `info spu'
`write-spu-object'   `qXfer:spu:write'       `info spu'
`read-siginfo-object'`qXfer:siginfo:read'    `print $_siginfo'
`write-siginfo-object'`qXfer:siginfo:write'   `set $_siginfo'
`threads'            `qXfer:threads:read'    `info threads'
`get-thread-local-   `qGetTLSAddr'           Displaying
storage-address'                             `__thread'
                                             variables
`get-thread-information-block-address'`qGetTIBAddr'           Display
                                             MS-Windows Thread
                                             Information Block.
`search-memory'      `qSearch:memory'        `find'
`supported-packets'  `qSupported'            Remote
                                             communications
                                             parameters
`pass-signals'       `QPassSignals'          `handle SIGNAL'
`hostio-close-packet'`vFile:close'           `remote get',
                                             `remote put'
`hostio-open-packet' `vFile:open'            `remote get',
                                             `remote put'
`hostio-pread-packet'`vFile:pread'           `remote get',
                                             `remote put'
`hostio-pwrite-packet'`vFile:pwrite'          `remote get',
                                             `remote put'
`hostio-unlink-packet'`vFile:unlink'          `remote delete'
`hostio-readlink-packet'`vFile:readlink'        Host I/O
`noack-packet'       `QStartNoAckMode'       Packet
                                             acknowledgment
`osdata'             `qXfer:osdata:read'     `info os'
`query-attached'     `qAttached'             Querying remote
                                             process attach
                                             state.
`traceframe-info'    `qXfer:traceframe-info:read'Traceframe info
`install-in-trace'   `InstallInTrace'        Install
                                             tracepoint in
                                             tracing
`disable-randomization'`QDisableRandomization' `set
                                             disable-randomization'


File: gdb.info,  Node: Remote Stub,  Prev: Remote Configuration,  Up: Remote Debugging

20.5 Implementing a Remote Stub
===============================

The stub files provided with GDB implement the target side of the
communication protocol, and the GDB side is implemented in the GDB
source 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.  `sparc-stub.c' is the best
organized, and therefore the easiest to read.)

   To debug a program running on another machine (the debugging
"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:

  1. A startup routine to set up the C runtime environment; these
     usually have a name like `crt0'.  The startup routine may be
     supplied by your hardware supplier, or you may have to write your
     own.

  2. A C subroutine library to support your program's subroutine calls,
     notably managing input and output.

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

   The next step is to arrange for your program to use a serial port to
communicate with the machine where GDB is running (the "host" machine).
In general terms, the scheme looks like this:

_On the host,_
     GDB already understands how to use this protocol; when everything
     else is set up, you can simply use the `target remote' command
     (*note Specifying a Debugging Target: Targets.).

_On the target,_
     you must link with your program a few special-purpose subroutines
     that implement the GDB remote serial protocol.  The file
     containing these subroutines is called  a "debugging stub".

     On certain remote targets, you can use an auxiliary program
     `gdbserver' instead of linking a stub into your program.  *Note
     Using the `gdbserver' Program: Server, for details.

   The debugging stub is specific to the architecture of the remote
machine; for example, use `sparc-stub.c' to debug programs on SPARC
boards.

   These working remote stubs are distributed with GDB:

`i386-stub.c'
     For Intel 386 and compatible architectures.

`m68k-stub.c'
     For Motorola 680x0 architectures.

`sh-stub.c'
     For Renesas SH architectures.

`sparc-stub.c'
     For SPARC architectures.

`sparcl-stub.c'
     For Fujitsu SPARCLITE architectures.


   The `README' file in the GDB 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


File: gdb.info,  Node: Stub Contents,  Next: Bootstrapping,  Up: Remote Stub

20.5.1 What the Stub Can Do for You
-----------------------------------

The debugging stub for your architecture supplies these three
subroutines:

`set_debug_traps'
     This routine arranges for `handle_exception' to run when your
     program stops.  You must call this subroutine explicitly near the
     beginning of your program.

`handle_exception'
     This is the central workhorse, but your program never calls it
     explicitly--the setup code arranges for `handle_exception' to run
     when a trap is triggered.

     `handle_exception' takes control when your program stops during
     execution (for example, on a breakpoint), and mediates
     communications with GDB on the host machine.  This is where the
     communications protocol is implemented; `handle_exception' acts as
     the GDB 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
     GDB needs, until you execute a GDB command that makes your program
     resume; at that point, `handle_exception' returns control to your
     own code on the target machine.

`breakpoint'
     Use this auxiliary subroutine to make your program contain a
     breakpoint.  Depending on the particular situation, this may be
     the only way for GDB 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
     `handle_exception'--in effect, to GDB.  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 `breakpoint' from
     your own program--simply running `target remote' from the host GDB
     session gets control.

     Call `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.


File: gdb.info,  Node: Bootstrapping,  Next: Debug Session,  Prev: Stub Contents,  Up: Remote Stub

20.5.2 What You Must Do for the Stub
------------------------------------

The debugging stubs that come with GDB 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.

`int getDebugChar()'
     Write this subroutine to read a single character from the serial
     port.  It may be identical to `getchar' for your target system; a
     different name is used to allow you to distinguish the two if you
     wish.

`void putDebugChar(int)'
     Write this subroutine to write a single character to the serial
     port.  It may be identical to `putchar' for your target system; a
     different name is used to allow you to distinguish the two if you
     wish.

   If you want GDB 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 `^C' (`\003', the control-C character).
That is the character which GDB uses to tell the remote system to stop.

   Getting the debugging target to return the proper status to GDB
probably requires changes to the standard stub; one quick and dirty way
is to just execute a breakpoint instruction (the "dirty" part is that
GDB reports a `SIGTRAP' instead of a `SIGINT').

   Other routines you need to supply are:

`void exceptionHandler (int EXCEPTION_NUMBER, void *EXCEPTION_ADDRESS)'
     Write this function to install 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 ROM, containing entries which point to a table in RAM).
     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 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
     EXCEPTION_ADDRESS, it should be a simple jump, not a jump to
     subroutine.

     For the 386, 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 SPARC and 68k stubs are able to mask interrupts themselves
     without help from `exceptionHandler'.

`void flush_i_cache()'
     On SPARC and 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, GDB requires this
     function to make certain that the state of your program is stable.

You must also make sure this library routine is available:

`void *memset(void *, int, int)'
     This is the standard library function `memset' that sets an area of
     memory to a known value.  If you have one of the free versions of
     `libc.a', `memset' can be found there; otherwise, you must either
     obtain it from your hardware manufacturer, or write your own.

   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 `GCC' generates as inline code.


File: gdb.info,  Node: Debug Session,  Prev: Bootstrapping,  Up: Remote Stub

20.5.3 Putting it All Together
------------------------------

In summary, when your program is ready to debug, you must follow these
steps.

  1. Make sure you have defined the supporting low-level routines
     (*note What You Must Do for the Stub: Bootstrapping.):
          `getDebugChar', `putDebugChar',
          `flush_i_cache', `memset', `exceptionHandler'.

  2. Insert these lines near the top of your program:

          set_debug_traps();
          breakpoint();

  3. For the 680x0 stub only, you need to provide a variable called
     `exceptionHook'.  Normally you just use:

          void (*exceptionHook)() = 0;

     but if before calling `set_debug_traps', you set it to point to a
     function in your program, that function is called when `GDB'
     continues after stopping on a trap (for example, bus error).  The
     function indicated by `exceptionHook' is called with one
     parameter: an `int' which is the exception number.

  4. Compile and link together: your program, the GDB debugging stub for
     your target architecture, and the supporting subroutines.

  5. Make sure you have a serial connection between your target machine
     and the GDB host, and identify the serial port on the host.

  6. Download your program to your target machine (or get it there by
     whatever means the manufacturer provides), and start it.

  7. Start GDB on the host, and connect to the target (*note Connecting
     to a Remote Target: Connecting.).



File: gdb.info,  Node: Configurations,  Next: Controlling GDB,  Prev: Remote Debugging,  Up: Top

21 Configuration-Specific Information
*************************************

While nearly all GDB 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::


File: gdb.info,  Node: Native,  Next: Embedded OS,  Up: Configurations

21.1 Native
===========

This section describes details specific to particular native
configurations.

* Menu:

* HP-UX::                       HP-UX
* BSD libkvm Interface::	Debugging BSD kernel memory images
* SVR4 Process Information::    SVR4 process information
* DJGPP Native::                Features specific to the DJGPP port
* Cygwin Native::		Features specific to the Cygwin port
* Hurd Native::                 Features specific to GNU Hurd
* Neutrino::                    Features specific to QNX Neutrino
* Darwin::			Features specific to Darwin


File: gdb.info,  Node: HP-UX,  Next: BSD libkvm Interface,  Up: Native

21.1.1 HP-UX
------------

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


File: gdb.info,  Node: BSD libkvm Interface,  Next: SVR4 Process Information,  Prev: HP-UX,  Up: Native

21.1.2 BSD libkvm Interface
---------------------------

BSD-derived systems (FreeBSD/NetBSD/OpenBSD) have a kernel memory
interface that provides a uniform interface for accessing kernel virtual
memory images, including live systems and crash dumps.  GDB uses this
interface to allow you to debug live kernels and kernel crash dumps on
many native BSD configurations.  This is implemented as a special `kvm'
debugging target.  For debugging a live system, load the currently
running kernel into GDB and connect to the `kvm' target:

     (gdb) target kvm

   For debugging crash dumps, provide the file name of the crash dump
as an argument:

     (gdb) target kvm /var/crash/bsd.0

   Once connected to the `kvm' target, the following commands are
available:

`kvm pcb'
     Set current context from the "Process Control Block" (PCB) address.

`kvm proc'
     Set current context from proc address.  This command isn't
     available on modern FreeBSD systems.


File: gdb.info,  Node: SVR4 Process Information,  Next: DJGPP Native,  Prev: BSD libkvm Interface,  Up: Native

21.1.3 SVR4 Process Information
-------------------------------

Many versions of SVR4 and compatible systems provide a facility called
`/proc' that can be used to examine the image of a running process
using file-system subroutines.  If GDB is configured for an operating
system with this facility, the command `info proc' is available to
report information about the process running your program, or about any
process running on your system.  `info proc' works only on SVR4 systems
that include the `procfs' code.  This includes, as of this writing,
GNU/Linux, OSF/1 (Digital Unix), Solaris, Irix, and Unixware, but not
HP-UX, for example.

`info proc'
`info proc PROCESS-ID'
     Summarize available information about any running process.  If a
     process ID is specified by PROCESS-ID, display information about
     that process; otherwise display information about the program being
     debugged.  The summary includes the debugged process ID, the
     command line used to invoke it, its current working directory, and
     its executable file's absolute file name.

     On some systems, PROCESS-ID can be of the form `[PID]/TID' which
     specifies a certain thread ID within a process.  If the optional
     PID part is missing, it means a thread from the process being
     debugged (the leading `/' still needs to be present, or else GDB
     will interpret the number as a process ID rather than a thread ID).

`info proc mappings'
     Report the memory address space ranges accessible in the program,
     with information on whether the process has read, write, or
     execute access rights to each range.  On GNU/Linux systems, each
     memory range includes the object file which is mapped to that
     range, instead of the memory access rights to that range.

`info proc stat'
`info proc status'
     These subcommands are specific to GNU/Linux systems.  They show
     the process-related information, including the user ID and group
     ID; how many threads are there in the process; its virtual memory
     usage; the signals that are pending, blocked, and ignored; its
     TTY; its consumption of system and user time; its stack size; its
     `nice' value; etc.  For more information, see the `proc' man page
     (type `man 5 proc' from your shell prompt).

`info proc all'
     Show all the information about the process described under all of
     the above `info proc' subcommands.

`set procfs-trace'
     This command enables and disables tracing of `procfs' API calls.

`show procfs-trace'
     Show the current state of `procfs' API call tracing.

`set procfs-file FILE'
     Tell GDB to write `procfs' API trace to the named FILE.  GDB
     appends the trace info to the previous contents of the file.  The
     default is to display the trace on the standard output.

`show procfs-file'
     Show the file to which `procfs' API trace is written.

`proc-trace-entry'
`proc-trace-exit'
`proc-untrace-entry'
`proc-untrace-exit'
     These commands enable and disable tracing of entries into and exits
     from the `syscall' interface.

`info pidlist'
     For QNX Neutrino only, this command displays the list of all the
     processes and all the threads within each process.

`info meminfo'
     For QNX Neutrino only, this command displays the list of all
     mapinfos.


File: gdb.info,  Node: DJGPP Native,  Next: Cygwin Native,  Prev: SVR4 Process Information,  Up: Native

21.1.4 Features for Debugging DJGPP Programs
--------------------------------------------

DJGPP is a port of the GNU development tools to MS-DOS and MS-Windows.
DJGPP programs are 32-bit protected-mode programs that use the "DPMI"
(DOS Protected-Mode Interface) API to run on top of real-mode DOS
systems and their emulations.

   GDB supports native debugging of DJGPP programs, and defines a few
commands specific to the DJGPP port.  This subsection describes those
commands.

`info dos'
     This is a prefix of DJGPP-specific commands which print
     information about the target system and important OS structures.

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

`info dos gdt'
`info dos ldt'
`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 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.

     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:

     `(gdb) info dos ldt $ds'
     `0x13f: base=0x11970000 limit=0x0009ffff 32-Bit Data (Read/Write, Exp-up)'


     This comes in handy when you want to see whether a pointer is
     outside the data segment's limit (i.e. "garbled").

`info dos pde'
`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, `info dos pde' displays the entire Page
     Directory, and `info dos pte' displays all the entries in all of
     the Page Tables.  An argument, an integer expression, given to the
     `info dos pde' command means display only that entry from the Page
     Directory table.  An argument given to the `info dos pte' command
     means display entries from a single Page Table, the one pointed to
     by the specified entry in the Page Directory.

     These commands are useful when your program uses "DMA" (Direct
     Memory Access), which needs physical addresses to program the DMA
     controller.

     These commands are supported only with some DPMI servers.

`info dos address-pte ADDR'
     This command displays the Page Table entry for a specified linear
     address.  The argument ADDR is a linear address which should
     already have the appropriate segment's base address added to it,
     because this command accepts addresses which may belong to _any_
     segment.  For example, here's how to display the Page Table entry
     for the page where a variable `i' is stored:

     `(gdb) info dos address-pte __djgpp_base_address + (char *)&i'
     `Page Table entry for address 0x11a00d30:'
     `Base=0x02698000 Dirty Acc. Not-Cached Write-Back Usr Read-Write +0xd30'


     This says that `i' is stored at offset `0xd30' from the page whose
     physical base address is `0x02698000', and shows all the
     attributes of that page.

     Note that you must cast the addresses of variables to a `char *',
     since otherwise the value of `__djgpp_base_address', the base
     address of all variables and functions in a DJGPP program, will be
     added using the rules of C pointer arithmetics: if `i' is declared
     an `int', GDB will add 4 times the value of `__djgpp_base_address'
     to the address of `i'.

     Here's another example, it displays the Page Table entry for the
     transfer buffer:

     `(gdb) info dos address-pte *((unsigned *)&_go32_info_block + 3)'
     `Page Table entry for address 0x29110:'
     `Base=0x00029000 Dirty Acc. Not-Cached Write-Back Usr Read-Write +0x110'


     (The `+ 3' offset is because the transfer buffer's address is the
     3rd member of the `_go32_info_block' structure.)  The output
     clearly shows that this DPMI server maps the addresses in
     conventional memory 1:1, i.e. the physical (`0x00029000' +
     `0x110') and linear (`0x29110') addresses are identical.

     This command is supported only with some DPMI servers.

   In addition to native debugging, the DJGPP port supports remote
debugging via a serial data link.  The following commands are specific
to remote serial debugging in the DJGPP port of GDB.

`set com1base ADDR'
     This command sets the base I/O port address of the `COM1' serial
     port.

`set com1irq IRQ'
     This command sets the "Interrupt Request" (`IRQ') line to use for
     the `COM1' serial port.

     There are similar commands `set com2base', `set com3irq', etc. for
     setting the port address and the `IRQ' lines for the other 3 COM
     ports.

     The related commands `show com1base', `show com1irq' etc.  display
     the current settings of the base address and the `IRQ' lines used
     by the COM ports.

`info serial'
     This command prints the status of the 4 DOS serial ports.  For each
     port, it prints whether it's active or not, its I/O base address
     and IRQ number, whether it uses a 16550-style FIFO, its baudrate,
     and the counts of various errors encountered so far.


File: gdb.info,  Node: Cygwin Native,  Next: Hurd Native,  Prev: DJGPP Native,  Up: Native

21.1.5 Features for Debugging MS Windows PE Executables
-------------------------------------------------------

GDB supports native debugging of MS Windows programs, including DLLs
with and without symbolic debugging information.

   MS-Windows programs that call `SetConsoleMode' to switch off the
special meaning of the `Ctrl-C' keystroke cannot be interrupted by
typing `C-c'.  For this reason, GDB on MS-Windows supports `C-<BREAK>'
as an alternative interrupt key sequence, which can be used to
interrupt the debuggee even if it ignores `C-c'.

   There are various additional Cygwin-specific commands, described in
this section.  Working with DLLs that have no debugging symbols is
described in *note Non-debug DLL Symbols::.

`info w32'
     This is a prefix of MS Windows-specific commands which print
     information about the target system and important OS structures.

`info w32 selector'
     This command displays information returned by the Win32 API
     `GetThreadSelectorEntry' function.  It takes an optional argument
     that is evaluated to a long value to give the information about
     this given selector.  Without argument, this command displays
     information about the six segment registers.

`info w32 thread-information-block'
     This command displays thread specific information stored in the
     Thread Information Block (readable on the X86 CPU family using
     `$fs' selector for 32-bit programs and `$gs' for 64-bit programs).

`info dll'
     This is a Cygwin-specific alias of `info shared'.

`dll-symbols'
     This command loads symbols from a dll similarly to add-sym command
     but without the need to specify a base address.

`set cygwin-exceptions MODE'
     If MODE is `on', GDB will break on exceptions that happen inside
     the Cygwin DLL.  If MODE is `off', GDB will delay recognition of
     exceptions, and may ignore some exceptions which seem to be caused
     by internal Cygwin DLL "bookkeeping".  This option is meant
     primarily for debugging the Cygwin DLL itself; the default value
     is `off' to avoid annoying GDB users with false `SIGSEGV' signals.

`show cygwin-exceptions'
     Displays whether GDB will break on exceptions that happen inside
     the Cygwin DLL itself.

`set new-console MODE'
     If MODE is `on' the debuggee will be started in a new console on
     next start.  If MODE is `off', the debuggee will be started in the
     same console as the debugger.

`show new-console'
     Displays whether a new console is used when the debuggee is
     started.

`set new-group 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'.

`show new-group'
     Displays current value of new-group boolean.

`set debugevents'
     This boolean value adds debug output concerning kernel events
     related to the debuggee seen by the debugger.  This includes
     events that signal thread and process creation and exit, DLL
     loading and unloading, console interrupts, and debugging messages
     produced by the Windows `OutputDebugString' API call.

`set debugexec'
     This boolean value adds debug output concerning execute events
     (such as resume thread) seen by the debugger.

`set debugexceptions'
     This boolean value adds debug output concerning exceptions in the
     debuggee seen by the debugger.

`set debugmemory'
     This boolean value adds debug output concerning debuggee memory
     reads and writes by the debugger.

`set shell'
     This boolean values specifies whether the debuggee is called via a
     shell or directly (default value is on).

`show shell'
     Displays if the debuggee will be started with a shell.


* Menu:

* Non-debug DLL Symbols::  Support for DLLs without debugging symbols


File: gdb.info,  Node: Non-debug DLL Symbols,  Up: Cygwin Native

21.1.5.1 Support for DLLs without Debugging Symbols
...................................................

Very often on windows, some of the DLLs that your program relies on do
not include symbolic debugging information (for example,
`kernel32.dll').  When GDB doesn't recognize any debugging symbols in a
DLL, it relies on the minimal amount of symbolic information contained
in the DLL's export table.  This section describes working with such
symbols, known internally to GDB 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 GDB to
load a particular DLL before starting the executable -- see the shared
library information in *note Files::, or the `dll-symbols' command in
*note Cygwin Native::.  Currently, explicitly loading symbols from a
DLL with no debugging information will cause the symbol names to be
duplicated in GDB's lookup table, which may adversely affect symbol
lookup performance.

21.1.5.2 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 `KERNEL32!CreateFileA'.  The plain name is also
entered into the symbol table, so `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 GDB are _case-sensitive_ this may cause some confusion.
If in doubt, try the `info functions' and `info variables' commands or
even `maint print msymbols' (*note Symbols::). Here's an example:

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

     Non-debugging symbols:
     0x77e885f4  CreateFileA
     0x77e885f4  KERNEL32!CreateFileA

     (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...]

21.1.5.3 Working with Minimal Symbols
.....................................

Symbols extracted from a DLL's export table do not contain very much
type information. All that GDB 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:

     (gdb) print 'cygwin1!__argv'
     $1 = 268572168

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

   And two possible solutions:

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

     (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"

   Setting a break point within a DLL is possible even before the
program starts execution. However, under these circumstances, GDB 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:

     (gdb) break *&'python22!PyOS_Readline'
     Breakpoint 1 at 0x1e04eff0

   The author of these extensions is not entirely convinced that
setting a break point within a shared DLL like `kernel32.dll' is
completely safe.


File: gdb.info,  Node: Hurd Native,  Next: Neutrino,  Prev: Cygwin Native,  Up: Native

21.1.6 Commands Specific to GNU Hurd Systems
--------------------------------------------

This subsection describes GDB commands specific to the GNU Hurd native
debugging.

`set signals'
`set sigs'
     This command toggles the state of inferior signal interception by
     GDB.  Mach exceptions, such as breakpoint traps, are not affected
     by this command.  `sigs' is a shorthand alias for `signals'.

`show signals'
`show sigs'
     Show the current state of intercepting inferior's signals.

`set signal-thread'
`set sigthread'
     This command tells GDB which thread is the `libc' signal thread.
     That thread is run when a signal is delivered to a running
     process.  `set sigthread' is the shorthand alias of `set
     signal-thread'.

`show signal-thread'
`show sigthread'
     These two commands show which thread will run when the inferior is
     delivered a signal.

`set stopped'
     This commands tells GDB that the inferior process is stopped, as
     with the `SIGSTOP' signal.  The stopped process can be continued
     by delivering a signal to it.

`show stopped'
     This command shows whether GDB thinks the debuggee is stopped.

`set exceptions'
     Use this command to turn off trapping of exceptions in the
     inferior.  When exception trapping is off, neither breakpoints nor
     single-stepping will work.  To restore the default, set exception
     trapping on.

`show exceptions'
     Show the current state of trapping exceptions in the inferior.

`set task pause'
     This command toggles task suspension when GDB has control.
     Setting it to on takes effect immediately, and the task is
     suspended whenever GDB gets control.  Setting it to off will take
     effect the next time the inferior is continued.  If this option is
     set to off, you can use `set thread default pause on' or `set
     thread pause on' (see below) to pause individual threads.

`show task pause'
     Show the current state of task suspension.

`set task detach-suspend-count'
     This command sets the suspend count the task will be left with when
     GDB detaches from it.

`show task detach-suspend-count'
     Show the suspend count the task will be left with when detaching.

`set task exception-port'
`set task excp'
     This command sets the task exception port to which GDB will
     forward exceptions.  The argument should be the value of the "send
     rights" of the task.  `set task excp' is a shorthand alias.

`set noninvasive'
     This command switches GDB to a mode that is the least invasive as
     far as interfering with the inferior is concerned.  This is the
     same as using `set task pause', `set exceptions', and `set
     signals' to values opposite to the defaults.

`info send-rights'
`info receive-rights'
`info port-rights'
`info port-sets'
`info dead-names'
`info ports'
`info psets'
     These commands display information about, respectively, send
     rights, receive rights, port rights, port sets, and dead names of
     a task.  There are also shorthand aliases: `info ports' for `info
     port-rights' and `info psets' for `info port-sets'.

`set thread pause'
     This command toggles current thread suspension when GDB has
     control.  Setting it to on takes effect immediately, and the
     current thread is suspended whenever GDB gets control.  Setting it
     to off will take effect the next time the inferior is continued.
     Normally, this command has no effect, since when GDB has control,
     the whole task is suspended.  However, if you used `set task pause
     off' (see above), this command comes in handy to suspend only the
     current thread.

`show thread pause'
     This command shows the state of current thread suspension.

`set thread run'
     This command sets whether the current thread is allowed to run.

`show thread run'
     Show whether the current thread is allowed to run.

`set thread detach-suspend-count'
     This command sets the suspend count GDB will leave on a thread
     when detaching.  This number is relative to the suspend count
     found by GDB when it notices the thread; use `set thread
     takeover-suspend-count' to force it to an absolute value.

`show thread detach-suspend-count'
     Show the suspend count GDB will leave on the thread when detaching.

`set thread exception-port'
`set thread excp'
     Set the thread exception port to which to forward exceptions.  This
     overrides the port set by `set task exception-port' (see above).
     `set thread excp' is the shorthand alias.

`set thread takeover-suspend-count'
     Normally, GDB's thread suspend counts are relative to the value
     GDB finds when it notices each thread.  This command changes the
     suspend counts to be absolute instead.

`set thread default'
`show thread default'
     Each of the above `set thread' commands has a `set thread default'
     counterpart (e.g., `set thread default pause', `set thread default
     exception-port', etc.).  The `thread default' variety of commands
     sets the default thread properties for all threads; you can then
     change the properties of individual threads with the non-default
     commands.


File: gdb.info,  Node: Neutrino,  Next: Darwin,  Prev: Hurd Native,  Up: Native

21.1.7 QNX Neutrino
-------------------

GDB provides the following commands specific to the QNX Neutrino target:

`set debug nto-debug'
     When set to on, enables debugging messages specific to the QNX
     Neutrino support.

`show debug nto-debug'
     Show the current state of QNX Neutrino messages.


File: gdb.info,  Node: Darwin,  Prev: Neutrino,  Up: Native

21.1.8 Darwin
-------------

GDB provides the following commands specific to the Darwin target:

`set debug darwin NUM'
     When set to a non zero value, enables debugging messages specific
     to the Darwin support.  Higher values produce more verbose output.

`show debug darwin'
     Show the current state of Darwin messages.

`set debug mach-o NUM'
     When set to a non zero value, enables debugging messages while GDB
     is reading Darwin object files.  ("Mach-O" is the file format used
     on Darwin for object and executable files.)  Higher values produce
     more verbose output.  This is a command to diagnose problems
     internal to GDB and should not be needed in normal usage.

`show debug mach-o'
     Show the current state of Mach-O file messages.

`set mach-exceptions on'
`set mach-exceptions off'
     On Darwin, faults are first reported as a Mach exception and are
     then mapped to a Posix signal.  Use this command to turn on
     trapping of Mach exceptions in the inferior.  This might be
     sometimes useful to better understand the cause of a fault.  The
     default is off.

`show mach-exceptions'
     Show the current state of exceptions trapping.


File: gdb.info,  Node: Embedded OS,  Next: Embedded Processors,  Prev: Native,  Up: Configurations

21.2 Embedded Operating Systems
===============================

This section describes configurations involving the debugging of
embedded operating systems that are available for several different
architectures.

* Menu:

* VxWorks::                     Using GDB with VxWorks

   GDB includes the ability to debug programs running on various
real-time operating systems.


File: gdb.info,  Node: VxWorks,  Up: Embedded OS

21.2.1 Using GDB with VxWorks
-----------------------------

`target vxworks MACHINENAME'
     A VxWorks system, attached via TCP/IP.  The argument MACHINENAME
     is the target system's machine name or IP address.


   On VxWorks, `load' links FILENAME dynamically on the current target
system as well as adding its symbols in GDB.

   GDB 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.  GDB uses code that runs on
both the Unix host and on the VxWorks target.  The program `gdb' is
installed and executed on the Unix host.  (It may be installed with the
name `vxgdb', to distinguish it from a GDB for debugging programs on
the host itself.)

`VxWorks-timeout ARGS'
     All VxWorks-based targets now support the option `vxworks-timeout'.
     This option is set by the user, and  ARGS represents the number of
     seconds GDB 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.

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

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

   Once you have included `rdb.a' in your VxWorks system image and set
your Unix execution search path to find GDB, you are ready to run GDB.
From your Unix host, run `gdb' (or `vxgdb', depending on your
installation).

   GDB comes up showing the prompt:

     (vxgdb)

* Menu:

* VxWorks Connection::          Connecting to VxWorks
* VxWorks Download::            VxWorks download
* VxWorks Attach::              Running tasks


File: gdb.info,  Node: VxWorks Connection,  Next: VxWorks Download,  Up: VxWorks

21.2.1.1 Connecting to VxWorks
..............................

The GDB command `target' lets you connect to a VxWorks target on the
network.  To connect to a target whose host name is "`tt'", type:

     (vxgdb) target vxworks tt

   GDB displays messages like these:

     Attaching remote machine across net...
     Connected to tt.

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

     prog.o: No such file or directory.

   When this happens, add the appropriate directory to the search path
with the GDB command `path', and execute the `target' command again.


File: gdb.info,  Node: VxWorks Download,  Next: VxWorks Attach,  Prev: VxWorks Connection,  Up: VxWorks

21.2.1.2 VxWorks Download
.........................

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 GDB `load' command
to download a file from Unix to VxWorks incrementally.  The object file
given as an argument to the `load' command is actually opened twice:
first by the VxWorks target in order to download the code, then by GDB
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 `prog.o' may reside in `VXPATH/vw/demo/rdb' in
VxWorks and in `HOSTPATH/vw/demo/rdb' on the host.  To load this
program, type this on VxWorks:

     -> cd "VXPATH/vw/demo/rdb"

Then, in GDB, type:

     (vxgdb) cd HOSTPATH/vw/demo/rdb
     (vxgdb) load prog.o

   GDB displays a response similar to this:

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

   You can also use the `load' command to reload an object module after
editing and recompiling the corresponding source file.  Note that this
makes GDB 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.)


File: gdb.info,  Node: VxWorks Attach,  Prev: VxWorks Download,  Up: VxWorks

21.2.1.3 Running Tasks
......................

You can also attach to an existing task using the `attach' command as
follows:

     (vxgdb) attach TASK

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


File: gdb.info,  Node: Embedded Processors,  Next: Architectures,  Prev: Embedded OS,  Up: Configurations

21.3 Embedded Processors
========================

This section goes into details specific to particular embedded
configurations.

   Whenever a specific embedded processor has a simulator, GDB allows
to send an arbitrary command to the simulator.

`sim COMMAND'
     Send an arbitrary COMMAND string to the simulator.  Consult the
     documentation for the specific simulator in use for information
     about acceptable commands.

* Menu:

* ARM::                         ARM RDI
* M32R/D::                      Renesas M32R/D
* M68K::                        Motorola M68K
* MicroBlaze::			Xilinx MicroBlaze
* MIPS Embedded::               MIPS Embedded
* OpenRISC 1000::               OpenRisc 1000
* PA::                          HP PA Embedded
* PowerPC Embedded::            PowerPC Embedded
* Sparclet::                    Tsqware Sparclet
* Sparclite::                   Fujitsu Sparclite
* Z8000::                       Zilog Z8000
* AVR::                         Atmel AVR
* CRIS::                        CRIS
* Super-H::                     Renesas Super-H


File: gdb.info,  Node: ARM,  Next: M32R/D,  Up: Embedded Processors

21.3.1 ARM
----------

`target rdi 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.

`target rdp DEV'
     ARM Demon monitor.


   GDB provides the following ARM-specific commands:

`set arm disassembler'
     This commands selects from a list of disassembly styles.  The
     `"std"' style is the standard style.

`show arm disassembler'
     Show the current disassembly style.

`set arm apcs32'
     This command toggles ARM operation mode between 32-bit and 26-bit.

`show arm apcs32'
     Display the current usage of the ARM 32-bit mode.

`set arm fpu FPUTYPE'
     This command sets the ARM floating-point unit (FPU) type.  The
     argument FPUTYPE can be one of these:

    `auto'
          Determine the FPU type by querying the OS ABI.

    `softfpa'
          Software FPU, with mixed-endian doubles on little-endian ARM
          processors.

    `fpa'
          GCC-compiled FPA co-processor.

    `softvfp'
          Software FPU with pure-endian doubles.

    `vfp'
          VFP co-processor.

`show arm fpu'
     Show the current type of the FPU.

`set arm abi'
     This command forces GDB to use the specified ABI.

`show arm abi'
     Show the currently used ABI.

`set arm fallback-mode (arm|thumb|auto)'
     GDB uses the symbol table, when available, to determine whether
     instructions are ARM or Thumb.  This command controls GDB's
     default behavior when the symbol table is not available.  The
     default is `auto', which causes GDB to use the current execution
     mode (from the `T' bit in the `CPSR' register).

`show arm fallback-mode'
     Show the current fallback instruction mode.

`set arm force-mode (arm|thumb|auto)'
     This command overrides use of the symbol table to determine whether
     instructions are ARM or Thumb.  The default is `auto', which
     causes GDB to use the symbol table and then the setting of `set
     arm fallback-mode'.

`show arm force-mode'
     Show the current forced instruction mode.

`set debug arm'
     Toggle whether to display ARM-specific debugging messages from the
     ARM target support subsystem.

`show debug arm'
     Show whether ARM-specific debugging messages are enabled.

   The following commands are available when an ARM target is debugged
using the RDI interface:

`rdilogfile [FILE]'
     Set the filename for the ADP (Angel Debugger Protocol) packet log.
     With an argument, sets the log file to the specified FILE.  With
     no argument, show the current log file name.  The default log file
     is `rdi.log'.

`rdilogenable [ARG]'
     Control logging of ADP packets.  With an argument of 1 or `"yes"'
     enables logging, with an argument 0 or `"no"' disables it.  With
     no arguments displays the current setting.  When logging is
     enabled, ADP packets exchanged between GDB and the RDI target
     device are logged to a file.

`set rdiromatzero'
     Tell GDB whether the target has ROM at address 0.  If on, vector
     catching is disabled, so that zero address can be used.  If off
     (the default), vector catching is enabled.  For this command to
     take effect, it needs to be invoked prior to the `target rdi'
     command.

`show rdiromatzero'
     Show the current setting of ROM at zero address.

`set rdiheartbeat'
     Enable or disable RDI heartbeat packets.  It is not recommended to
     turn on this option, since it confuses ARM and EPI JTAG interface,
     as well as the Angel monitor.

`show rdiheartbeat'
     Show the setting of RDI heartbeat packets.

`target sim [SIMARGS] ...'
     The GDB ARM simulator accepts the following optional arguments.

    `--swi-support=TYPE'
          Tell the simulator which SWI interfaces to support.  TYPE may
          be a comma separated list of the following values.  The
          default value is `all'.

         `none'

         `demon'

         `angel'

         `redboot'

         `all'


File: gdb.info,  Node: M32R/D,  Next: M68K,  Prev: ARM,  Up: Embedded Processors

21.3.2 Renesas M32R/D and M32R/SDI
----------------------------------

`target m32r DEV'
     Renesas M32R/D ROM monitor.

`target m32rsdi DEV'
     Renesas M32R SDI server, connected via parallel port to the board.

   The following GDB commands are specific to the M32R monitor:

`set download-path PATH'
     Set the default path for finding downloadable SREC files.

`show download-path'
     Show the default path for downloadable SREC files.

`set board-address ADDR'
     Set the IP address for the M32R-EVA target board.

`show board-address'
     Show the current IP address of the target board.

`set server-address ADDR'
     Set the IP address for the download server, which is the GDB's
     host machine.

`show server-address'
     Display the IP address of the download server.

`upload [FILE]'
     Upload the specified SREC FILE via the monitor's Ethernet upload
     capability.  If no FILE argument is given, the current executable
     file is uploaded.

`tload [FILE]'
     Test the `upload' command.

   The following commands are available for M32R/SDI:

`sdireset'
     This command resets the SDI connection.

`sdistatus'
     This command shows the SDI connection status.

`debug_chaos'
     Instructs the remote that M32R/Chaos debugging is to be used.

`use_debug_dma'
     Instructs the remote to use the DEBUG_DMA method of accessing
     memory.

`use_mon_code'
     Instructs the remote to use the MON_CODE method of accessing
     memory.

`use_ib_break'
     Instructs the remote to set breakpoints by IB break.

`use_dbt_break'
     Instructs the remote to set breakpoints by DBT.


File: gdb.info,  Node: M68K,  Next: MicroBlaze,  Prev: M32R/D,  Up: Embedded Processors

21.3.3 M68k
-----------

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

`target dbug DEV'
     dBUG ROM monitor for Motorola ColdFire.



File: gdb.info,  Node: MicroBlaze,  Next: MIPS Embedded,  Prev: M68K,  Up: Embedded Processors

21.3.4 MicroBlaze
-----------------

The MicroBlaze is a soft-core processor supported on various Xilinx
FPGAs, such as Spartan or Virtex series.  Boards with these processors
usually have JTAG ports which connect to a host system running the
Xilinx Embedded Development Kit (EDK) or Software Development Kit (SDK).
This host system is used to download the configuration bitstream to the
target FPGA.  The Xilinx Microprocessor Debugger (XMD) program
communicates with the target board using the JTAG interface and
presents a `gdbserver' interface to the board.  By default `xmd' uses
port `1234'.  (While it is possible to change this default port, it
requires the use of undocumented `xmd' commands.  Contact Xilinx
support if you need to do this.)

   Use these GDB commands to connect to the MicroBlaze target processor.

`target remote :1234'
     Use this command to connect to the target if you are running GDB
     on the same system as `xmd'.

`target remote XMD-HOST:1234'
     Use this command to connect to the target if it is connected to
     `xmd' running on a different system named XMD-HOST.

`load'
     Use this command to download a program to the MicroBlaze target.

`set debug microblaze N'
     Enable MicroBlaze-specific debugging messages if non-zero.

`show debug microblaze N'
     Show MicroBlaze-specific debugging level.


File: gdb.info,  Node: MIPS Embedded,  Next: OpenRISC 1000,  Prev: MicroBlaze,  Up: Embedded Processors

21.3.5 MIPS Embedded
--------------------

GDB can use the MIPS remote debugging protocol to talk to a MIPS board
attached to a serial line.  This is available when you configure GDB
with `--target=mips-idt-ecoff'.

   Use these GDB commands to specify the connection to your target
board:

`target mips PORT'
     To run a program on the board, start up `gdb' with the name of
     your program as the argument.  To connect to the board, use the
     command `target mips PORT', where 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 `load' command to
     download it.  You can then use all the usual GDB commands.

     For example, this sequence connects to the target board through a
     serial port, and loads and runs a program called PROG through the
     debugger:

          host$ gdb PROG
          GDB is free software and ...
          (gdb) target mips /dev/ttyb
          (gdb) load PROG
          (gdb) run

`target mips HOSTNAME:PORTNUMBER'
     On some GDB 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
     `HOSTNAME:PORTNUMBER'.

`target pmon PORT'
     PMON ROM monitor.

`target ddb PORT'
     NEC's DDB variant of PMON for Vr4300.

`target lsi PORT'
     LSI variant of PMON.

`target r3900 DEV'
     Densan DVE-R3900 ROM monitor for Toshiba R3900 Mips.

`target array DEV'
     Array Tech LSI33K RAID controller board.


GDB also supports these special commands for MIPS targets:

`set mipsfpu double'
`set mipsfpu single'
`set mipsfpu none'
`set mipsfpu auto'
`show mipsfpu'
     If your target board does not support the MIPS floating point
     coprocessor, you should use the command `set mipsfpu none' (if you
     need this, you may wish to put the command in your GDB init file).
     This tells GDB how to find the return value of functions which
     return floating point values.  It also allows GDB 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 R4650 processor, use
     the command `set mipsfpu single'.  The default double precision
     floating point coprocessor may be selected using `set mipsfpu
     double'.

     In previous versions the only choices were double precision or no
     floating point, so `set mipsfpu on' will select double precision
     and `set mipsfpu off' will select no floating point.

     As usual, you can inquire about the `mipsfpu' variable with `show
     mipsfpu'.

`set timeout SECONDS'
`set retransmit-timeout SECONDS'
`show timeout'
`show retransmit-timeout'
     You can control the timeout used while waiting for a packet, in
     the MIPS remote protocol, with the `set timeout SECONDS' command.
     The default is 5 seconds.  Similarly, you can control the timeout
     used while waiting for an acknowledgment of a packet with the `set
     retransmit-timeout SECONDS' command.  The default is 3 seconds.
     You can inspect both values with `show timeout' and `show
     retransmit-timeout'.  (These commands are _only_ available when
     GDB is configured for `--target=mips-idt-ecoff'.)

     The timeout set by `set timeout' does not apply when GDB is
     waiting for your program to stop.  In that case, GDB waits forever
     because it has no way of knowing how long the program is going to
     run before stopping.

`set syn-garbage-limit NUM'
     Limit the maximum number of characters GDB should ignore when it
     tries to synchronize with the remote target.  The default is 10
     characters.  Setting the limit to -1 means there's no limit.

`show syn-garbage-limit'
     Show the current limit on the number of characters to ignore when
     trying to synchronize with the remote system.

`set monitor-prompt PROMPT'
     Tell GDB to expect the specified PROMPT string from the remote
     monitor.  The default depends on the target:
    pmon target
          `PMON'

    ddb target
          `NEC010'

    lsi target
          `PMON>'

`show monitor-prompt'
     Show the current strings GDB expects as the prompt from the remote
     monitor.

`set monitor-warnings'
     Enable or disable monitor warnings about hardware breakpoints.
     This has effect only for the `lsi' target.  When on, GDB will
     display warning messages whose codes are returned by the `lsi'
     PMON monitor for breakpoint commands.

`show monitor-warnings'
     Show the current setting of printing monitor warnings.

`pmon COMMAND'
     This command allows sending an arbitrary COMMAND string to the
     monitor.  The monitor must be in debug mode for this to work.


File: gdb.info,  Node: OpenRISC 1000,  Next: PA,  Prev: MIPS Embedded,  Up: Embedded Processors

21.3.6 OpenRISC 1000
--------------------

See OR1k Architecture document (`www.opencores.org') for more
information about platform and commands.

`target jtag jtag://HOST: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: `target jtag jtag://localhost:9999'

`or1ksim COMMAND'
     If connected to `or1ksim' OpenRISC 1000 Architectural Simulator,
     proprietary commands can be executed.

`info or1k spr'
     Displays spr groups.

`info or1k spr GROUP'
`info or1k spr GROUPNO'
     Displays register names in selected group.

`info or1k spr GROUP REGISTER'
`info or1k spr REGISTER'
`info or1k spr GROUPNO REGISTERNO'
`info or1k spr REGISTERNO'
     Shows information about specified spr register.

`spr GROUP REGISTER VALUE'
`spr REGISTER VALUE'
`spr GROUPNO REGISTERNO VALUE'
`spr REGISTERNO VALUE'
     Writes VALUE to specified spr register.

   Some implementations of OpenRISC 1000 Architecture also have
hardware trace.  It is very similar to GDB trace, except it does not
interfere with normal program execution and is thus much faster.
Hardware breakpoints/watchpoint triggers can be set using:
`$LEA/$LDATA'
     Load effective address/data

`$SEA/$SDATA'
     Store effective address/data

`$AEA/$ADATA'
     Access effective address ($SEA or $LEA) or data ($SDATA/$LDATA)

`$FETCH'
     Fetch data

   When triggered, it can capture low level data, like: `PC', `LSEA',
`LDATA', `SDATA', `READSPR', `WRITESPR', `INSTR'.

   `htrace' commands: 
`hwatch CONDITIONAL'
     Set hardware watchpoint on combination of Load/Store Effective
     Address(es) or Data.  For example:

     `hwatch ($LEA == my_var) && ($LDATA < 50) || ($SEA == my_var) &&
     ($SDATA >= 50)'

     `hwatch ($LEA == my_var) && ($LDATA < 50) || ($SEA == my_var) &&
     ($SDATA >= 50)'

`htrace info'
     Display information about current HW trace configuration.

`htrace trigger CONDITIONAL'
     Set starting criteria for HW trace.

`htrace qualifier CONDITIONAL'
     Set acquisition qualifier for HW trace.

`htrace stop CONDITIONAL'
     Set HW trace stopping criteria.

`htrace record [DATA]*'
     Selects the data to be recorded, when qualifier is met and HW
     trace was triggered.

`htrace enable'
`htrace disable'
     Enables/disables the HW trace.

`htrace rewind [FILENAME]'
     Clears currently recorded trace data.

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

`htrace print [START [LEN]]'
     Prints trace buffer, using current record configuration.

`htrace mode continuous'
     Set continuous trace mode.

`htrace mode suspend'
     Set suspend trace mode.



File: gdb.info,  Node: PowerPC Embedded,  Next: Sparclet,  Prev: PA,  Up: Embedded Processors

21.3.7 PowerPC Embedded
-----------------------

GDB supports using the DVC (Data Value Compare) register to implement
in hardware simple hardware watchpoint conditions of the form:

     (gdb) watch ADDRESS|VARIABLE \
       if  ADDRESS|VARIABLE == CONSTANT EXPRESSION

   The DVC register will be automatically used when GDB detects such
pattern in a condition expression, and the created watchpoint uses one
debug register (either the `exact-watchpoints' option is on and the
variable is scalar, or the variable has a length of one byte).  This
feature is available in native GDB running on a Linux kernel version
2.6.34 or newer.

   When running on PowerPC embedded processors, GDB automatically uses
ranged hardware watchpoints, unless the `exact-watchpoints' option is
on, in which case watchpoints using only one debug register are created
when watching variables of scalar types.

   You can create an artificial array to watch an arbitrary memory
region using one of the following commands (*note Expressions::):

     (gdb) watch *((char *) ADDRESS)@LENGTH
     (gdb) watch {char[LENGTH]} ADDRESS

   PowerPC embedded processors support masked watchpoints.  See the
discussion about the `mask' argument in *note Set Watchpoints::.

   PowerPC embedded processors support hardware accelerated "ranged
breakpoints".  A ranged breakpoint stops execution of the inferior
whenever it executes an instruction at any address within the range it
specifies.  To set a ranged breakpoint in GDB, use the `break-range'
command.

   GDB provides the following PowerPC-specific commands:

`break-range START-LOCATION, END-LOCATION'
     Set a breakpoint for an address range.  START-LOCATION and
     END-LOCATION can specify a function name, a line number, an offset
     of lines from the current line or from the start location, or an
     address of an instruction (see *note Specify Location::, for a
     list of all the possible ways to specify a LOCATION.)  The
     breakpoint will stop execution of the inferior whenever it
     executes an instruction at any address within the specified range,
     (including START-LOCATION and END-LOCATION.)

`set powerpc soft-float'
`show powerpc soft-float'
     Force GDB to use (or not use) a software floating point calling
     convention.  By default, GDB selects the calling convention based
     on the selected architecture and the provided executable file.

`set powerpc vector-abi'
`show powerpc vector-abi'
     Force GDB to use the specified calling convention for vector
     arguments and return values.  The valid options are `auto';
     `generic', to avoid vector registers even if they are present;
     `altivec', to use AltiVec registers; and `spe' to use SPE
     registers.  By default, GDB selects the calling convention based
     on the selected architecture and the provided executable file.

`set powerpc exact-watchpoints'
`show powerpc exact-watchpoints'
     Allow GDB to use only one debug register when watching a variable
     of scalar type, thus assuming that the variable is accessed
     through the address of its first byte.

`target dink32 DEV'
     DINK32 ROM monitor.

`target ppcbug DEV'

`target ppcbug1 DEV'
     PPCBUG ROM monitor for PowerPC.

`target sds DEV'
     SDS monitor, running on a PowerPC board (such as Motorola's ADS).

   The following commands specific to the SDS protocol are supported by
GDB:

`set sdstimeout NSEC'
     Set the timeout for SDS protocol reads to be NSEC seconds.  The
     default is 2 seconds.

`show sdstimeout'
     Show the current value of the SDS timeout.

`sds COMMAND'
     Send the specified COMMAND string to the SDS monitor.


File: gdb.info,  Node: PA,  Next: PowerPC Embedded,  Prev: OpenRISC 1000,  Up: Embedded Processors

21.3.8 HP PA Embedded
---------------------

`target op50n DEV'
     OP50N monitor, running on an OKI HPPA board.

`target w89k DEV'
     W89K monitor, running on a Winbond HPPA board.



File: gdb.info,  Node: Sparclet,  Next: Sparclite,  Prev: PowerPC Embedded,  Up: Embedded Processors

21.3.9 Tsqware Sparclet
-----------------------

GDB enables developers to debug tasks running on Sparclet targets from
a Unix host.  GDB uses code that runs on both the Unix host and on the
Sparclet target.  The program `gdb' is installed and executed on the
Unix host.

`remotetimeout ARGS'
     GDB supports the option `remotetimeout'.  This option is set by
     the user, and  ARGS represents the number of seconds GDB waits for
     responses.

   When compiling for debugging, include the options `-g' to get debug
information and `-Ttext' to relocate the program to where you wish to
load it on the target.  You may also want to add the options `-n' or
`-N' in order to reduce the size of the sections.  Example:

     sparclet-aout-gcc prog.c -Ttext 0x12010000 -g -o prog -N

   You can use `objdump' to verify that the addresses are what you
intended:

     sparclet-aout-objdump --headers --syms prog

   Once you have set your Unix execution search path to find GDB, you
are ready to run GDB.  From your Unix host, run `gdb' (or
`sparclet-aout-gdb', depending on your installation).

   GDB comes up showing the prompt:

     (gdbslet)

* Menu:

* Sparclet File::                Setting the file to debug
* Sparclet Connection::          Connecting to Sparclet
* Sparclet Download::            Sparclet download
* Sparclet Execution::           Running and debugging


File: gdb.info,  Node: Sparclet File,  Next: Sparclet Connection,  Up: Sparclet

21.3.9.1 Setting File to Debug
..............................

The GDB command `file' lets you choose with program to debug.

     (gdbslet) file prog

   GDB then attempts to read the symbol table of `prog'.  GDB 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.  GDB locates the source files by
searching the directories listed in the directory search path (*note
Your Program's Environment: Environment.).  If it fails to find a file,
it displays a message such as:

     prog: No such file or directory.

   When this happens, add the appropriate directories to the search
paths with the GDB commands `path' and `dir', and execute the `target'
command again.


File: gdb.info,  Node: Sparclet Connection,  Next: Sparclet Download,  Prev: Sparclet File,  Up: Sparclet

21.3.9.2 Connecting to Sparclet
...............................

The GDB command `target' lets you connect to a Sparclet target.  To
connect to a target on serial port "`ttya'", type:

     (gdbslet) target sparclet /dev/ttya
     Remote target sparclet connected to /dev/ttya
     main () at ../prog.c:3

   GDB displays messages like these:

     Connected to ttya.


File: gdb.info,  Node: Sparclet Download,  Next: Sparclet Execution,  Prev: Sparclet Connection,  Up: Sparclet

21.3.9.3 Sparclet Download
..........................

Once connected to the Sparclet target, you can use the GDB `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 `load' command.
Since the file format is aout, the program must be loaded to the
starting address.  You can use `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 `prog' was linked to text address 0x1201000, with data at
0x12010160 and bss at 0x12010170, in GDB, type:

     (gdbslet) load prog 0x12010000
     Loading section .text, size 0xdb0 vma 0x12010000

   If the code is loaded at a different address then what the program
was linked to, you may need to use the `section' and `add-symbol-file'
commands to tell GDB where to map the symbol table.


File: gdb.info,  Node: Sparclet Execution,  Prev: Sparclet Download,  Up: Sparclet

21.3.9.4 Running and Debugging
..............................

You can now begin debugging the task using GDB's execution control
commands, `b', `step', `run', etc.  See the GDB manual for the list of
commands.

     (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)


File: gdb.info,  Node: Sparclite,  Next: Z8000,  Prev: Sparclet,  Up: Embedded Processors

21.3.10 Fujitsu Sparclite
-------------------------

`target sparclite 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 DEV using GDB standard remote protocol.



File: gdb.info,  Node: Z8000,  Next: AVR,  Prev: Sparclite,  Up: Embedded Processors

21.3.11 Zilog Z8000
-------------------

When configured for debugging Zilog Z8000 targets, GDB includes a Z8000
simulator.

   For the Z8000 family, `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.

`target sim ARGS'
     Debug programs on a simulated CPU.  If the simulator supports setup
     options, specify them via ARGS.

After specifying this target, you can debug programs for the simulated
CPU in the same style as programs for your host computer; use the
`file' command to load a new program image, the `run' command to run
your program, and so on.

   As well as making available all the usual machine registers (*note
Registers: Registers.), the Z8000 simulator provides three additional
items of information as specially named registers:

`cycles'
     Counts clock-ticks in the simulator.

`insts'
     Counts instructions run in the simulator.

`time'
     Execution time in 60ths of a second.


   You can refer to these values in GDB expressions with the usual
conventions; for example, `b fputc if $cycles>5000' sets a conditional
breakpoint that suspends only after at least 5000 simulated clock ticks.


File: gdb.info,  Node: AVR,  Next: CRIS,  Prev: Z8000,  Up: Embedded Processors

21.3.12 Atmel AVR
-----------------

When configured for debugging the Atmel AVR, GDB supports the following
AVR-specific commands:

`info io_registers'
     This command displays information about the AVR I/O registers.  For
     each register, GDB prints its number and value.


File: gdb.info,  Node: CRIS,  Next: Super-H,  Prev: AVR,  Up: Embedded Processors

21.3.13 CRIS
------------

When configured for debugging CRIS, GDB provides the following
CRIS-specific commands:

`set cris-version VER'
     Set the current CRIS version to VER, either `10' or `32'.  The
     CRIS version affects register names and sizes.  This command is
     useful in case autodetection of the CRIS version fails.

`show cris-version'
     Show the current CRIS version.

`set cris-dwarf2-cfi'
     Set the usage of DWARF-2 CFI for CRIS debugging.  The default is
     `on'.  Change to `off' when using `gcc-cris' whose version is below
     `R59'.

`show cris-dwarf2-cfi'
     Show the current state of using DWARF-2 CFI.

`set cris-mode MODE'
     Set the current CRIS mode to MODE.  It should only be changed when
     debugging in guru mode, in which case it should be set to `guru'
     (the default is `normal').

`show cris-mode'
     Show the current CRIS mode.


File: gdb.info,  Node: Super-H,  Prev: CRIS,  Up: Embedded Processors

21.3.14 Renesas Super-H
-----------------------

For the Renesas Super-H processor, GDB provides these commands:

`regs'
     Show the values of all Super-H registers.

`set sh calling-convention CONVENTION'
     Set the calling-convention used when calling functions from GDB.
     Allowed values are `gcc', which is the default setting, and
     `renesas'.  With the `gcc' setting, functions are called using the
     GCC calling convention.  If the DWARF-2 information of the called
     function specifies that the function follows the Renesas calling
     convention, the function is called using the Renesas calling
     convention.  If the calling convention is set to `renesas', the
     Renesas calling convention is always used, regardless of the
     DWARF-2 information.  This can be used to override the default of
     `gcc' if debug information is missing, or the compiler does not
     emit the DWARF-2 calling convention entry for a function.

`show sh calling-convention'
     Show the current calling convention setting.



File: gdb.info,  Node: Architectures,  Prev: Embedded Processors,  Up: Configurations

21.4 Architectures
==================

This section describes characteristics of architectures that affect all
uses of GDB with the architecture, both native and cross.

* Menu:

* i386::
* A29K::
* Alpha::
* MIPS::
* HPPA::               HP PA architecture
* SPU::                Cell Broadband Engine SPU architecture
* PowerPC::


File: gdb.info,  Node: i386,  Next: A29K,  Up: Architectures

21.4.1 x86 Architecture-specific Issues
---------------------------------------

`set struct-convention MODE'
     Set the convention used by the inferior to return `struct's and
     `union's from functions to MODE.  Possible values of MODE are
     `"pcc"', `"reg"', and `"default"' (the default).  `"default"' or
     `"pcc"' means that `struct's are returned on the stack, while
     `"reg"' means that a `struct' or a `union' whose size is 1, 2, 4,
     or 8 bytes will be returned in a register.

`show struct-convention'
     Show the current setting of the convention to return `struct's
     from functions.


File: gdb.info,  Node: A29K,  Next: Alpha,  Prev: i386,  Up: Architectures

21.4.2 A29K
-----------

`set rstack_high_address ADDRESS'
     On AMD 29000 family processors, registers are saved in a separate
     "register stack".  There is no way for GDB to determine the extent
     of this stack.  Normally, GDB just assumes that the stack is
     "large enough".  This may result in GDB 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 `set rstack_high_address' command.  The argument
     should be an address, which you probably want to precede with `0x'
     to specify in hexadecimal.

`show rstack_high_address'
     Display the current limit of the register stack, on AMD 29000
     family processors.



File: gdb.info,  Node: Alpha,  Next: MIPS,  Prev: A29K,  Up: Architectures

21.4.3 Alpha
------------

See the following section.


File: gdb.info,  Node: MIPS,  Next: HPPA,  Prev: Alpha,  Up: Architectures

21.4.4 MIPS
-----------

Alpha- and MIPS-based computers use an unusual stack frame, which
sometimes requires GDB to search backward in the object code to find
the beginning of a function.

   To improve response time (especially for embedded applications, where
GDB 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:

`set heuristic-fence-post LIMIT'
     Restrict GDB to examining at most LIMIT bytes in its search for
     the beginning of a function.  A value of 0 (the default) means
     there is no limit.  However, except for 0, the larger the limit
     the more bytes `heuristic-fence-post' must search and therefore
     the longer it takes to run.  You should only need to use this
     command when debugging a stripped executable.

`show heuristic-fence-post'
     Display the current limit.

These commands are available _only_ when GDB is configured for
debugging programs on Alpha or MIPS processors.

   Several MIPS-specific commands are available when debugging MIPS
programs:

`set mips abi ARG'
     Tell GDB which MIPS ABI is used by the inferior.  Possible values
     of ARG are:

    `auto'
          The default ABI associated with the current binary (this is
          the default).

    `o32'

    `o64'

    `n32'

    `n64'

    `eabi32'

    `eabi64'

`show mips abi'
     Show the MIPS ABI used by GDB to debug the inferior.

`set mipsfpu'
`show mipsfpu'
     *Note set mipsfpu: MIPS Embedded.

`set mips mask-address ARG'
     This command determines whether the most-significant 32 bits of
     64-bit MIPS addresses are masked off.  The argument ARG can be
     `on', `off', or `auto'.  The latter is the default setting, which
     lets GDB determine the correct value.

`show mips mask-address'
     Show whether the upper 32 bits of MIPS addresses are masked off or
     not.

`set remote-mips64-transfers-32bit-regs'
     This command controls compatibility with 64-bit MIPS targets that
     transfer data in 32-bit quantities.  If you have an old MIPS 64
     target that transfers 32 bits for some registers, like SR and FSR,
     and 64 bits for other registers, set this option to `on'.

`show remote-mips64-transfers-32bit-regs'
     Show the current setting of compatibility with older MIPS 64
     targets.

`set debug mips'
     This command turns on and off debugging messages for the
     MIPS-specific target code in GDB.

`show debug mips'
     Show the current setting of MIPS debugging messages.


File: gdb.info,  Node: HPPA,  Next: SPU,  Prev: MIPS,  Up: Architectures

21.4.5 HPPA
-----------

When GDB is debugging the HP PA architecture, it provides the following
special commands:

`set debug hppa'
     This command determines whether HPPA architecture-specific
     debugging messages are to be displayed.

`show debug hppa'
     Show whether HPPA debugging messages are displayed.

`maint print unwind ADDRESS'
     This command displays the contents of the unwind table entry at the
     given ADDRESS.



File: gdb.info,  Node: SPU,  Next: PowerPC,  Prev: HPPA,  Up: Architectures

21.4.6 Cell Broadband Engine SPU architecture
---------------------------------------------

When GDB is debugging the Cell Broadband Engine SPU architecture, it
provides the following special commands:

`info spu event'
     Display SPU event facility status.  Shows current event mask and
     pending event status.

`info spu signal'
     Display SPU signal notification facility status.  Shows pending
     signal-control word and signal notification mode of both signal
     notification channels.

`info spu mailbox'
     Display SPU mailbox facility status.  Shows all pending entries,
     in order of processing, in each of the SPU Write Outbound, SPU
     Write Outbound Interrupt, and SPU Read Inbound mailboxes.

`info spu dma'
     Display MFC DMA status.  Shows all pending commands in the MFC DMA
     queue.  For each entry, opcode, tag, class IDs, effective and
     local store addresses and transfer size are shown.

`info spu proxydma'
     Display MFC Proxy-DMA status.  Shows all pending commands in the
     MFC Proxy-DMA queue.  For each entry, opcode, tag, class IDs,
     effective and local store addresses and transfer size are shown.


   When GDB is debugging a combined PowerPC/SPU application on the Cell
Broadband Engine, it provides in addition the following special
commands:

`set spu stop-on-load ARG'
     Set whether to stop for new SPE threads.  When set to `on', GDB
     will give control to the user when a new SPE thread enters its
     `main' function.  The default is `off'.

`show spu stop-on-load'
     Show whether to stop for new SPE threads.

`set spu auto-flush-cache ARG'
     Set whether to automatically flush the software-managed cache.
     When set to `on', GDB will automatically cause the SPE
     software-managed cache to be flushed whenever SPE execution stops.
     This provides a consistent view of PowerPC memory that is accessed
     via the cache.  If an application does not use the
     software-managed cache, this option has no effect.

`show spu auto-flush-cache'
     Show whether to automatically flush the software-managed cache.



File: gdb.info,  Node: PowerPC,  Prev: SPU,  Up: Architectures

21.4.7 PowerPC
--------------

When GDB is debugging the PowerPC architecture, it provides a set of
pseudo-registers to enable inspection of 128-bit wide Decimal Floating
Point numbers stored in the floating point registers. These values must
be stored in two consecutive registers, always starting at an even
register like `f0' or `f2'.

   The pseudo-registers go from `$dl0' through `$dl15', and are formed
by joining the even/odd register pairs `f0' and `f1' for `$dl0', `f2'
and `f3' for `$dl1' and so on.

   For POWER7 processors, GDB provides a set of pseudo-registers, the
64-bit wide Extended Floating Point Registers (`f32' through `f63').


File: gdb.info,  Node: Controlling GDB,  Next: Extending GDB,  Prev: Configurations,  Up: Top

22 Controlling GDB
******************

You can alter the way GDB interacts with you by using the `set'
command.  For commands controlling how GDB displays data, see *note
Print Settings: Print Settings.  Other settings are described here.

* Menu:

* Prompt::                      Prompt
* Editing::                     Command editing
* Command History::             Command history
* Screen Size::                 Screen size
* Numbers::                     Numbers
* ABI::                         Configuring the current ABI
* Messages/Warnings::           Optional warnings and messages
* Debugging Output::            Optional messages about internal happenings
* Other Misc Settings::         Other Miscellaneous Settings


File: gdb.info,  Node: Prompt,  Next: Editing,  Up: Controlling GDB

22.1 Prompt
===========

GDB indicates its readiness to read a command by printing a string
called the "prompt".  This string is normally `(gdb)'.  You can change
the prompt string with the `set prompt' command.  For instance, when
debugging GDB with GDB, it is useful to change the prompt in one of the
GDB sessions so that you can always tell which one you are talking to.

   _Note:_  `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.

`set prompt NEWPROMPT'
     Directs GDB to use NEWPROMPT as its prompt string henceforth.

`show prompt'
     Prints a line of the form: `Gdb's prompt is: YOUR-PROMPT'

   Versions of GDB that ship with Python scripting enabled have prompt
extensions.  The commands for interacting with these extensions are:

`set extended-prompt PROMPT'
     Set an extended prompt that allows for substitutions.  *Note
     gdb.prompt::, for a list of escape sequences that can be used for
     substitution.  Any escape sequences specified as part of the prompt
     string are replaced with the corresponding strings each time the
     prompt is displayed.

     For example:

          set extended-prompt Current working directory: \w (gdb)

     Note that when an extended-prompt is set, it takes control of the
     PROMPT_HOOK hook.  *Note prompt_hook::, for further information.

`show extended-prompt'
     Prints the extended prompt.  Any escape sequences specified as
     part of the prompt string with `set extended-prompt', are replaced
     with the corresponding strings each time the prompt is displayed.


File: gdb.info,  Node: Editing,  Next: Command History,  Prev: Prompt,  Up: Controlling GDB

22.2 Command Editing
====================

GDB reads its input commands via the "Readline" interface.  This GNU
library provides consistent behavior for programs which provide a
command line interface to the user.  Advantages are GNU Emacs-style or
"vi"-style inline editing of commands, `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 GDB with the
command `set'.

`set editing'
`set editing on'
     Enable command line editing (enabled by default).

`set editing off'
     Disable command line editing.

`show editing'
     Show whether command line editing is enabled.

   *Note Command Line Editing::, for more details about the Readline
interface.  Users unfamiliar with GNU Emacs or `vi' are encouraged to
read that chapter.


File: gdb.info,  Node: Command History,  Next: Screen Size,  Prev: Editing,  Up: Controlling GDB

22.3 Command History
====================

GDB 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 GDB command history facility.

   GDB uses the GNU History library, a part of the Readline package, to
provide the history facility.  *Note Using History Interactively::, for
the detailed description of the History library.

   To issue a command to GDB without affecting certain aspects of the
state which is seen by users, prefix it with `server ' (*note Server
Prefix::).  This means that this command will not affect the command
history, nor will it affect GDB's notion of which command to repeat if
<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 `output' command instead of the `print' command.

   Here is the description of GDB commands related to command history.

`set history filename FNAME'
     Set the name of the GDB command history file to FNAME.  This is
     the file where GDB 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
     `GDBHISTFILE', or to `./.gdb_history' (`./_gdb_history' on MS-DOS)
     if this variable is not set.

`set history save'
`set history save on'
     Record command history in a file, whose name may be specified with
     the `set history filename' command.  By default, this option is
     disabled.

`set history save off'
     Stop recording command history in a file.

`set history size SIZE'
     Set the number of commands which GDB keeps in its history list.
     This defaults to the value of the environment variable `HISTSIZE',
     or to 256 if this variable is not set.

   History expansion assigns special meaning to the character `!'.
*Note Event Designators::, for more details.

   Since `!' is also the logical not operator in C, history expansion
is off by default. If you decide to enable history expansion with the
`set history expansion on' command, you may sometimes need to follow
`!' (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 `!=' and `!(',
even when history expansion is enabled.

   The commands to control history expansion are:

`set history expansion on'
`set history expansion'
     Enable history expansion.  History expansion is off by default.

`set history expansion off'
     Disable history expansion.

`show history'
`show history filename'
`show history save'
`show history size'
`show history expansion'
     These commands display the state of the GDB history parameters.
     `show history' by itself displays all four states.

`show commands'
     Display the last ten commands in the command history.

`show commands N'
     Print ten commands centered on command number N.

`show commands +'
     Print ten commands just after the commands last printed.


File: gdb.info,  Node: Screen Size,  Next: Numbers,  Prev: Command History,  Up: Controlling GDB

22.4 Screen Size
================

Certain commands to GDB may produce large amounts of information output
to the screen.  To help you read all of it, GDB pauses and asks you for
input at the end of each page of output.  Type <RET> when you want to
continue the output, or `q' to discard the remaining output.  Also, the
screen width setting determines when to wrap lines of output.
Depending on what is being printed, GDB tries to break the line at a
readable place, rather than simply letting it overflow onto the
following line.

   Normally GDB knows the size of the screen from the terminal driver
software.  For example, on Unix GDB uses the termcap data base together
with the value of the `TERM' environment variable and the `stty rows'
and `stty cols' settings.  If this is not correct, you can override it
with the `set height' and `set width' commands:

`set height LPP'
`show height'
`set width CPL'
`show width'
     These `set' commands specify a screen height of LPP lines and a
     screen width of CPL characters.  The associated `show' commands
     display the current settings.

     If you specify a height of zero lines, GDB 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 `set width 0' to prevent GDB from
     wrapping its output.

`set pagination on'
`set pagination off'
     Turn the output pagination on or off; the default is on.  Turning
     pagination off is the alternative to `set height 0'.  Note that
     running GDB with the `--batch' option (*note -batch: Mode
     Options.) also automatically disables pagination.

`show pagination'
     Show the current pagination mode.


File: gdb.info,  Node: Numbers,  Next: ABI,  Prev: Screen Size,  Up: Controlling GDB

22.5 Numbers
============

You can always enter numbers in octal, decimal, or hexadecimal in GDB
by the usual conventions: octal numbers begin with `0', decimal numbers
end with `.', and hexadecimal numbers begin with `0x'.  Numbers that
neither begin with `0' or `0x', nor end with a `.' are, by default,
entered in base 10; likewise, the default display for numbers--when no
particular format is specified--is base 10.  You can change the default
base for both input and output with the commands described below.

`set input-radix BASE'
     Set the default base for numeric input.  Supported choices for
     BASE are decimal 8, 10, or 16.  BASE must itself be specified
     either unambiguously or using the current input radix; for
     example, any of

          set input-radix 012
          set input-radix 10.
          set input-radix 0xa

     sets the input base to decimal.  On the other hand, `set
     input-radix 10' leaves the input radix unchanged, no matter what
     it was, since `10', being without any leading or trailing signs of
     its base, is interpreted in the current radix.  Thus, if the
     current radix is 16, `10' is interpreted in hex, i.e. as 16
     decimal, which doesn't change the radix.

`set output-radix BASE'
     Set the default base for numeric display.  Supported choices for
     BASE are decimal 8, 10, or 16.  BASE must itself be specified
     either unambiguously or using the current input radix.

`show input-radix'
     Display the current default base for numeric input.

`show output-radix'
     Display the current default base for numeric display.

`set radix [BASE]'
`show radix'
     These commands set and show the default base for both input and
     output of numbers.  `set radix' sets the radix of input and output
     to the same base; without an argument, it resets the radix back to
     its default value of 10.



File: gdb.info,  Node: ABI,  Next: Messages/Warnings,  Prev: Numbers,  Up: Controlling GDB

22.6 Configuring the Current ABI
================================

GDB can determine the "ABI" (Application Binary Interface) of your
application automatically.  However, sometimes you need to override its
conclusions.  Use these commands to manage GDB's view of the current
ABI.

   One GDB configuration can debug binaries for multiple operating
system targets, either via remote debugging or native emulation.  GDB
will autodetect the "OS ABI" (Operating System ABI) in use, but you can
override its conclusion using the `set osabi' command.  One example
where this is useful is in debugging of binaries which use an alternate
C library (e.g. UCLIBC for GNU/Linux) which does not have the same
identifying marks that the standard C library for your platform
provides.

`show osabi'
     Show the OS ABI currently in use.

`set osabi'
     With no argument, show the list of registered available OS ABI's.

`set osabi ABI'
     Set the current OS ABI to ABI.

   Generally, the way that an argument of type `float' is passed to a
function depends on whether the function is prototyped.  For a
prototyped (i.e. ANSI/ISO style) function, `float' arguments are passed
unchanged, according to the architecture's convention for `float'.  For
unprototyped (i.e. K&R style) functions, `float' arguments are first
promoted to type `double' and then passed.

   Unfortunately, some forms of debug information do not reliably
indicate whether a function is prototyped.  If GDB calls a function
that is not marked as prototyped, it consults `set
coerce-float-to-double'.

`set coerce-float-to-double'
`set coerce-float-to-double on'
     Arguments of type `float' will be promoted to `double' when passed
     to an unprototyped function.  This is the default setting.

`set coerce-float-to-double off'
     Arguments of type `float' will be passed directly to unprototyped
     functions.

`show coerce-float-to-double'
     Show the current setting of promoting `float' to `double'.

   GDB needs to know the ABI used for your program's C++ objects.  The
correct C++ ABI depends on which C++ compiler was used to build your
application.  GDB only fully supports programs with a single C++ ABI;
if your program contains code using multiple C++ ABI's or if GDB can
not identify your program's ABI correctly, you can tell GDB which ABI
to use.  Currently supported ABI's include "gnu-v2", for `g++' versions
before 3.0, "gnu-v3", for `g++' versions 3.0 and later, and "hpaCC" for
the HP ANSI C++ compiler.  Other C++ compilers may use the "gnu-v2" or
"gnu-v3" ABI's as well.  The default setting is "auto".

`show cp-abi'
     Show the C++ ABI currently in use.

`set cp-abi'
     With no argument, show the list of supported C++ ABI's.

`set cp-abi ABI'
`set cp-abi auto'
     Set the current C++ ABI to ABI, or return to automatic detection.


File: gdb.info,  Node: Messages/Warnings,  Next: Debugging Output,  Prev: ABI,  Up: Controlling GDB

22.7 Optional Warnings and Messages
===================================

By default, GDB is silent about its inner workings.  If you are running
on a slow machine, you may want to use the `set verbose' command.  This
makes GDB tell you when it does a lengthy internal operation, so you
will not think it has crashed.

   Currently, the messages controlled by `set verbose' are those which
announce that the symbol table for a source file is being read; see
`symbol-file' in *note Commands to Specify Files: Files.

`set verbose on'
     Enables GDB output of certain informational messages.

`set verbose off'
     Disables GDB output of certain informational messages.

`show verbose'
     Displays whether `set verbose' is on or off.

   By default, if GDB 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 (*note Errors Reading Symbol Files: Symbol
Errors.).

`set complaints LIMIT'
     Permits GDB to output LIMIT complaints about each type of unusual
     symbols before becoming silent about the problem.  Set LIMIT to
     zero to suppress all complaints; set it to a large number to
     prevent complaints from being suppressed.

`show complaints'
     Displays how many symbol complaints GDB is permitted to produce.


   By default, GDB 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:

     (gdb) run
     The program being debugged has been started already.
     Start it from the beginning? (y or n)

   If you are willing to unflinchingly face the consequences of your own
commands, you can disable this "feature":

`set confirm off'
     Disables confirmation requests.  Note that running GDB with the
     `--batch' option (*note -batch: Mode Options.) also automatically
     disables confirmation requests.

`set confirm on'
     Enables confirmation requests (the default).

`show confirm'
     Displays state of confirmation requests.


   If you need to debug user-defined commands or sourced files you may
find it useful to enable "command tracing".  In this mode each command
will be printed as it is executed, prefixed with one or more `+'
symbols, the quantity denoting the call depth of each command.

`set trace-commands on'
     Enable command tracing.

`set trace-commands off'
     Disable command tracing.

`show trace-commands'
     Display the current state of command tracing.


File: gdb.info,  Node: Debugging Output,  Next: Other Misc Settings,  Prev: Messages/Warnings,  Up: Controlling GDB

22.8 Optional Messages about Internal Happenings
================================================

GDB has commands that enable optional debugging messages from various
GDB subsystems; normally these commands are of interest to GDB
maintainers, or when reporting a bug.  This section documents those
commands.

`set exec-done-display'
     Turns on or off the notification of asynchronous commands'
     completion.  When on, GDB will print a message when an
     asynchronous command finishes its execution.  The default is off.  

`show exec-done-display'
     Displays the current setting of asynchronous command completion
     notification.  

`set debug arch'
     Turns on or off display of gdbarch debugging info.  The default is
     off 

`show debug arch'
     Displays the current state of displaying gdbarch debugging info.

`set debug aix-thread'
     Display debugging messages about inner workings of the AIX thread
     module.

`show debug aix-thread'
     Show the current state of AIX thread debugging info display.

`set debug check-physname'
     Check the results of the "physname" computation.  When reading
     DWARF debugging information for C++, GDB attempts to compute each
     entity's name.  GDB can do this computation in two different ways,
     depending on exactly what information is present.  When enabled,
     this setting causes GDB to compute the names both ways and display
     any discrepancies.

`show debug check-physname'
     Show the current state of "physname" checking.

`set debug dwarf2-die'
     Dump DWARF2 DIEs after they are read in.  The value is the number
     of nesting levels to print.  A value of zero turns off the display.

`show debug dwarf2-die'
     Show the current state of DWARF2 DIE debugging.

`set debug displaced'
     Turns on or off display of GDB debugging info for the displaced
     stepping support.  The default is off.

`show debug displaced'
     Displays the current state of displaying GDB debugging info
     related to displaced stepping.

`set debug event'
     Turns on or off display of GDB event debugging info.  The default
     is off.

`show debug event'
     Displays the current state of displaying GDB event debugging info.

`set debug expression'
     Turns on or off display of debugging info about GDB expression
     parsing.  The default is off.

`show debug expression'
     Displays the current state of displaying debugging info about GDB
     expression parsing.

`set debug frame'
     Turns on or off display of GDB frame debugging info.  The default
     is off.

`show debug frame'
     Displays the current state of displaying GDB frame debugging info.

`set debug gnu-nat'
     Turns on or off debugging messages from the GNU/Hurd debug support.

`show debug gnu-nat'
     Show the current state of GNU/Hurd debugging messages.

`set debug infrun'
     Turns on or off display of GDB debugging info for running the
     inferior.  The default is off.  `infrun.c' contains GDB's runtime
     state machine used for implementing operations such as
     single-stepping the inferior.

`show debug infrun'
     Displays the current state of GDB inferior debugging.

`set debug jit'
     Turns on or off debugging messages from JIT debug support.

`show debug jit'
     Displays the current state of GDB JIT debugging.

`set debug lin-lwp'
     Turns on or off debugging messages from the Linux LWP debug
     support.

`show debug lin-lwp'
     Show the current state of Linux LWP debugging messages.

`set debug observer'
     Turns on or off display of GDB observer debugging.  This includes
     info such as the notification of observable events.

`show debug observer'
     Displays the current state of observer debugging.

`set debug overload'
     Turns on or off display of GDB C++ overload debugging info. This
     includes info such as ranking of functions, etc.  The default is
     off.

`show debug overload'
     Displays the current state of displaying GDB C++ overload
     debugging info.  

`set debug parser'
     Turns on or off the display of expression parser debugging output.
     Internally, this sets the `yydebug' variable in the expression
     parser.  *Note Tracing Your Parser: (bison)Tracing, for details.
     The default is off.

`show debug parser'
     Show the current state of expression parser debugging.  

`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 GDB standard output stream. The default is off.

`show debug remote'
     Displays the state of display of remote packets.

`set debug serial'
     Turns on or off display of GDB serial debugging info. The default
     is off.

`show debug serial'
     Displays the current state of displaying GDB serial debugging info.

`set debug solib-frv'
     Turns on or off debugging messages for FR-V shared-library code.

`show debug solib-frv'
     Display the current state of FR-V shared-library code debugging
     messages.

`set debug target'
     Turns on or off display of GDB target debugging info. This info
     includes what is going on at the target level of GDB, as it
     happens. The default is 0.  Set it to 1 to track events, and to 2
     to also track the value of large memory transfers.  Changes to
     this flag do not take effect until the next time you connect to a
     target or use the `run' command.

`show debug target'
     Displays the current state of displaying GDB target debugging info.

`set debug timestamp'
     Turns on or off display of timestamps with GDB debugging info.
     When enabled, seconds and microseconds are displayed before each
     debugging message.

`show debug timestamp'
     Displays the current state of displaying timestamps with GDB
     debugging info.

`set debugvarobj'
     Turns on or off display of GDB variable object debugging info. The
     default is off.

`show debugvarobj'
     Displays the current state of displaying GDB variable object
     debugging info.

`set debug xml'
     Turns on or off debugging messages for built-in XML parsers.

`show debug xml'
     Displays the current state of XML debugging messages.


File: gdb.info,  Node: Other Misc Settings,  Prev: Debugging Output,  Up: Controlling GDB

22.9 Other Miscellaneous Settings
=================================

`set interactive-mode'
     If `on', forces GDB to assume that GDB was started in a terminal.
     In practice, this means that GDB should wait for the user to
     answer queries generated by commands entered at the command
     prompt.  If `off', forces GDB to operate in the opposite mode, and
     it uses the default answers to all queries.  If `auto' (the
     default), GDB tries to determine whether its standard input is a
     terminal, and works in interactive-mode if it is,
     non-interactively otherwise.

     In the vast majority of cases, the debugger should be able to guess
     correctly which mode should be used.  But this setting can be
     useful in certain specific cases, such as running a MinGW GDB
     inside a cygwin window.

`show interactive-mode'
     Displays whether the debugger is operating in interactive mode or
     not.


File: gdb.info,  Node: Extending GDB,  Next: Interpreters,  Prev: Controlling GDB,  Up: Top

23 Extending GDB
****************

GDB provides three mechanisms for extension.  The first is based on
composition of GDB commands, the second is based on the Python
scripting language, and the third is for defining new aliases of
existing commands.

   To facilitate the use of the first two extensions, GDB is capable of
evaluating the contents of a file.  When doing so, GDB can recognize
which scripting language is being used by looking at the filename
extension.  Files with an unrecognized filename extension are always
treated as a GDB Command Files.  *Note Command files: Command Files.

   You can control how GDB evaluates these files with the following
setting:

`set script-extension off'
     All scripts are always evaluated as GDB Command Files.

`set script-extension soft'
     The debugger determines the scripting language based on filename
     extension.  If this scripting language is supported, GDB evaluates
     the script using that language.  Otherwise, it evaluates the file
     as a GDB Command File.

`set script-extension strict'
     The debugger determines the scripting language based on filename
     extension, and evaluates the script using that language.  If the
     language is not supported, then the evaluation fails.

`show script-extension'
     Display the current value of the `script-extension' option.


* Menu:

* Sequences::          Canned Sequences of Commands
* Python::             Scripting GDB using Python
* Aliases::            Creating new spellings of existing commands


File: gdb.info,  Node: Sequences,  Next: Python,  Up: Extending GDB

23.1 Canned Sequences of Commands
=================================

Aside from breakpoint commands (*note Breakpoint Command Lists: Break
Commands.), GDB provides two ways to store sequences of commands for
execution as a unit: user-defined commands and command files.

* Menu:

* Define::             How to define your own commands
* Hooks::              Hooks for user-defined commands
* Command Files::      How to write scripts of commands to be stored in a file
* Output::             Commands for controlled output


File: gdb.info,  Node: Define,  Next: Hooks,  Up: Sequences

23.1.1 User-defined Commands
----------------------------

A "user-defined command" is a sequence of GDB commands to which you
assign a new name as a command.  This is done with the `define'
command.  User commands may accept up to 10 arguments separated by
whitespace.  Arguments are accessed within the user command via
`$arg0...$arg9'.  A trivial example:

     define adder
       print $arg0 + $arg1 + $arg2
     end

To execute the command use:

     adder 1 2 3

This defines the command `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.

   In addition, `$argc' may be used to find out how many arguments have
been passed.  This expands to a number in the range 0...10.

     define adder
       if $argc == 2
         print $arg0 + $arg1
       end
       if $argc == 3
         print $arg0 + $arg1 + $arg2
       end
     end

`define COMMANDNAME'
     Define a command named COMMANDNAME.  If there is already a command
     by that name, you are asked to confirm that you want to redefine
     it.  COMMANDNAME may be a bare command name consisting of letters,
     numbers, dashes, and underscores.  It may also start with any
     predefined prefix command.  For example, `define target my-target'
     creates a user-defined `target my-target' command.

     The definition of the command is made up of other GDB command
     lines, which are given following the `define' command.  The end of
     these commands is marked by a line containing `end'.

`document COMMANDNAME'
     Document the user-defined command COMMANDNAME, so that it can be
     accessed by `help'.  The command COMMANDNAME must already be
     defined.  This command reads lines of documentation just as
     `define' reads the lines of the command definition, ending with
     `end'.  After the `document' command is finished, `help' on command
     COMMANDNAME displays the documentation you have written.

     You may use the `document' command again to change the
     documentation of a command.  Redefining the command with `define'
     does not change the documentation.

`dont-repeat'
     Used inside a user-defined command, this tells GDB that this
     command should not be repeated when the user hits <RET> (*note
     repeat last command: Command Syntax.).

`help user-defined'
     List all user-defined commands, with the first line of the
     documentation (if any) for each.

`show user'
`show user COMMANDNAME'
     Display the GDB commands used to define COMMANDNAME (but not its
     documentation).  If no COMMANDNAME is given, display the
     definitions for all user-defined commands.

`show max-user-call-depth'
`set max-user-call-depth'
     The value of `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.

   In addition to the above commands, user-defined commands frequently
use control flow commands, described in *note Command Files::.

   When user-defined commands are executed, the commands of the
definition are not printed.  An error in any command stops execution of
the user-defined command.

   If used interactively, commands that would ask for confirmation
proceed without asking when used inside a user-defined command.  Many
GDB commands that normally print messages to say what they are doing
omit the messages when used in a user-defined command.


File: gdb.info,  Node: Hooks,  Next: Command Files,  Prev: Define,  Up: Sequences

23.1.2 User-defined Command Hooks
---------------------------------

You may define "hooks", which are a special kind of user-defined
command.  Whenever you run the command `foo', if the user-defined
command `hook-foo' exists, it is executed (with no arguments) before
that command.

   A hook may also be defined which is run after the command you
executed.  Whenever you run the command `foo', if the user-defined
command `hookpost-foo' exists, it is executed (with no arguments) after
that command.  Post-execution hooks may exist simultaneously with
pre-execution hooks, for the same command.

   It is valid for a hook to call the command which it hooks.  If this
occurs, the hook is not re-executed, thereby avoiding infinite
recursion.

   In addition, a pseudo-command, `stop' exists.  Defining
(`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 `SIGALRM' signals while single-stepping, but
treat them normally during normal execution, you could define:

     define hook-stop
     handle SIGALRM nopass
     end

     define hook-run
     handle SIGALRM pass
     end

     define hook-continue
     handle SIGALRM pass
     end

   As a further example, to hook at the beginning and end of the `echo'
command, and to add extra text to the beginning and end of the message,
you could define:

     define hook-echo
     echo <<<---
     end

     define hookpost-echo
     echo --->>>\n
     end

     (gdb) echo Hello World
     <<<---Hello World--->>>
     (gdb)

   You can define a hook for any single-word command in GDB, but not
for command aliases; you should define a hook for the basic command
name, e.g.  `backtrace' rather than `bt'.  You can hook a multi-word
command by adding `hook-' or `hookpost-' to the last word of the
command, e.g.  `define target hook-remote' to add a hook to `target
remote'.

   If an error occurs during the execution of your hook, execution of
GDB commands stops and GDB 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 `define' command.


File: gdb.info,  Node: Command Files,  Next: Output,  Prev: Hooks,  Up: Sequences

23.1.3 Command Files
--------------------

A command file for GDB is a text file made of lines that are GDB
commands.  Comments (lines starting with `#') may also be included.  An
empty line in a command file does nothing; it does not mean to repeat
the last command, as it would from the terminal.

   You can request the execution of a command file with the `source'
command.  Note that the `source' command is also used to evaluate
scripts that are not Command Files.  The exact behavior can be
configured using the `script-extension' setting.  *Note Extending GDB:
Extending GDB.

`source [-s] [-v] FILENAME'
     Execute the command file FILENAME.

   The lines in a command file are generally executed sequentially,
unless the order of execution is changed by one of the _flow-control
commands_ described below.  The commands are not printed as they are
executed.  An error in any command terminates execution of the command
file and control is returned to the console.

   GDB first searches for FILENAME in the current directory.  If the
file is not found there, and FILENAME does not specify a directory,
then GDB also looks for the file on the source search path (specified
with the `directory' command); except that `$cdir' is not searched
because the compilation directory is not relevant to scripts.

   If `-s' is specified, then GDB searches for FILENAME on the search
path even if FILENAME specifies a directory.  The search is done by
appending FILENAME to each element of the search path.  So, for
example, if FILENAME is `mylib/myscript' and the search path contains
`/home/user' then GDB will look for the script
`/home/user/mylib/myscript'.  The search is also done if FILENAME is an
absolute path.  For example, if FILENAME is `/tmp/myscript' and the
search path contains `/home/user' then GDB will look for the script
`/home/user/tmp/myscript'.  For DOS-like systems, if FILENAME contains
a drive specification, it is stripped before concatenation.  For
example, if FILENAME is `d:myscript' and the search path contains
`c:/tmp' then GDB will look for the script `c:/tmp/myscript'.

   If `-v', for verbose mode, is given then GDB displays each command
as it is executed.  The option must be given before FILENAME, and is
interpreted as part of the filename anywhere else.

   Commands that would ask for confirmation if used interactively
proceed without asking when used in a command file.  Many GDB commands
that normally print messages to say what they are doing omit the
messages when called from command files.

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

     gdb < cmds > log 2>&1

   (The syntax above will vary depending on the shell used.) This
example will execute commands from the file `cmds'. All output and
errors would be directed to `log'.

   Since commands stored on command files tend to be more general than
commands typed interactively, they frequently need to deal with
complicated situations, such as different or unexpected values of
variables and symbols, changes in how the program being debugged is
built, etc.  GDB provides a set of flow-control commands to deal with
these complexities.  Using these commands, you can write complex
scripts that loop over data structures, execute commands conditionally,
etc.

`if'
`else'
     This command allows to include in your script conditionally
     executed commands. The `if' command takes a single argument, which
     is an expression to evaluate.  It is followed by a series of
     commands that are executed only if the expression is true (its
     value is nonzero).  There can then optionally be an `else' line,
     followed by a series of commands that are only executed if the
     expression was false.  The end of the list is marked by a line
     containing `end'.

`while'
     This command allows to write loops.  Its syntax is similar to
     `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 `end'.  These commands are called the
     "body" of the loop.  The commands in the body of `while' are
     executed repeatedly as long as the expression evaluates to true.

`loop_break'
     This command exits the `while' loop in whose body it is included.
     Execution of the script continues after that `while's `end' line.

`loop_continue'
     This command skips the execution of the rest of the body of
     commands in the `while' loop in whose body it is included.
     Execution branches to the beginning of the `while' loop, where it
     evaluates the controlling expression.

`end'
     Terminate the block of commands that are the body of `if', `else',
     or `while' flow-control commands.


File: gdb.info,  Node: Output,  Prev: Command Files,  Up: Sequences

23.1.4 Commands for Controlled Output
-------------------------------------

During the execution of a command file or a user-defined command, normal
GDB 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.

`echo TEXT'
     Print TEXT.  Nonprinting characters can be included in TEXT using
     C escape sequences, such as `\n' to print a newline.  *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 ` and foo = ', use
     the command `echo \ and foo = \ '.

     A backslash at the end of TEXT can be used, as in C, to continue
     the command onto subsequent lines.  For example,

          echo This is some text\n\
          which is continued\n\
          onto several lines.\n

     produces the same output as

          echo This is some text\n
          echo which is continued\n
          echo onto several lines.\n

`output EXPRESSION'
     Print the value of EXPRESSION and nothing but that value: no
     newlines, no `$NN = '.  The value is not entered in the value
     history either.  *Note Expressions: Expressions, for more
     information on expressions.

`output/FMT EXPRESSION'
     Print the value of EXPRESSION in format FMT.  You can use the same
     formats as for `print'.  *Note Output Formats: Output Formats, for
     more information.

`printf TEMPLATE, EXPRESSIONS...'
     Print the values of one or more EXPRESSIONS under the control of
     the string TEMPLATE.  To print several values, make EXPRESSIONS be
     a comma-separated list of individual expressions, which may be
     either numbers or pointers.  Their values are printed as specified
     by TEMPLATE, exactly as a C program would do by executing the code
     below:

          printf (TEMPLATE, EXPRESSIONS...);

     As in `C' `printf', ordinary characters in TEMPLATE are printed
     verbatim, while "conversion specification" introduced by the `%'
     character cause subsequent EXPRESSIONS to be evaluated, their
     values converted and formatted according to type and style
     information encoded in the conversion specifications, and then
     printed.

     For example, you can print two values in hex like this:

          printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-foo

     `printf' supports all the standard `C' conversion specifications,
     including the flags and modifiers between the `%' character and
     the conversion letter, with the following exceptions:

        * The argument-ordering modifiers, such as `2$', are not
          supported.

        * The modifier `*' is not supported for specifying precision or
          width.

        * The `'' flag (for separation of digits into groups according
          to `LC_NUMERIC'') is not supported.

        * The type modifiers `hh', `j', `t', and `z' are not supported.

        * The conversion letter `n' (as in `%n') is not supported.

        * The conversion letters `a' and `A' are not supported.

     Note that the `ll' type modifier is supported only if the
     underlying `C' implementation used to build GDB supports the `long
     long int' type, and the `L' type modifier is supported only if
     `long double' type is available.

     As in `C', `printf' supports simple backslash-escape sequences,
     such as `\n', `\t', `\\', `\"', `\a', and `\f', that consist of
     backslash followed by a single character.  Octal and hexadecimal
     escape sequences are not supported.

     Additionally, `printf' supports conversion specifications for DFP
     ("Decimal Floating Point") types using the following length
     modifiers together with a floating point specifier.  letters:

        * `H' for printing `Decimal32' types.

        * `D' for printing `Decimal64' types.

        * `DD' for printing `Decimal128' types.

     If the underlying `C' implementation used to build GDB has support
     for the three length modifiers for DFP types, other modifiers such
     as width and precision will also be available for GDB to use.

     In case there is no such `C' support, no additional modifiers will
     be available and the value will be printed in the standard way.

     Here's an example of printing DFP types using the above conversion
     letters:
          printf "D32: %Hf - D64: %Df - D128: %DDf\n",1.2345df,1.2E10dd,1.2E1dl

`eval TEMPLATE, EXPRESSIONS...'
     Convert the values of one or more EXPRESSIONS under the control of
     the string TEMPLATE to a command line, and call it.



File: gdb.info,  Node: Python,  Next: Aliases,  Prev: Sequences,  Up: Extending GDB

23.2 Scripting GDB using Python
===============================

You can script GDB using the Python programming language
(http://www.python.org/).  This feature is available only if GDB was
configured using `--with-python'.

   Python scripts used by GDB should be installed in
`DATA-DIRECTORY/python', where DATA-DIRECTORY is the data directory as
determined at GDB startup (*note Data Files::).  This directory, known
as the "python directory", is automatically added to the Python Search
Path in order to allow the Python interpreter to locate all scripts
installed at this location.

   Additionally, GDB commands and convenience functions which are
written in Python and are located in the
`DATA-DIRECTORY/python/gdb/command' or
`DATA-DIRECTORY/python/gdb/function' directories are automatically
imported when GDB starts.

* Menu:

* Python Commands::             Accessing Python from GDB.
* Python API::                  Accessing GDB from Python.
* Auto-loading::                Automatically loading Python code.
* Python modules::              Python modules provided by GDB.


File: gdb.info,  Node: Python Commands,  Next: Python API,  Up: Python

23.2.1 Python Commands
----------------------

GDB provides one command for accessing the Python interpreter, and one
related setting:

`python [CODE]'
     The `python' command can be used to evaluate Python code.

     If given an argument, the `python' command will evaluate the
     argument as a Python command.  For example:

          (gdb) python print 23
          23

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

          (gdb) python
          Type python script
          End with a line saying just "end".
          >print 23
          >end
          23

`set python print-stack'
     By default, GDB will print only the message component of a Python
     exception when an error occurs in a Python script.  This can be
     controlled using `set python print-stack': if `full', then full
     Python stack printing is enabled; if `none', then Python stack and
     message printing is disabled; if `message', the default, only the
     message component of the error is printed.

   It is also possible to execute a Python script from the GDB
interpreter:

`source `script-name''
     The script name must end with `.py' and GDB must be configured to
     recognize the script language based on filename extension using
     the `script-extension' setting.  *Note Extending GDB: Extending
     GDB.

`python execfile ("script-name")'
     This method is based on the `execfile' Python built-in function,
     and thus is always available.


File: gdb.info,  Node: Python API,  Next: Auto-loading,  Prev: Python Commands,  Up: Python

23.2.2 Python API
-----------------

At startup, GDB overrides Python's `sys.stdout' and `sys.stderr' to
print using GDB's output-paging streams.  A Python program which
outputs to one of these streams may have its output interrupted by the
user (*note Screen Size::).  In this situation, a Python
`KeyboardInterrupt' exception is thrown.

* Menu:

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


File: gdb.info,  Node: Basic Python,  Next: Exception Handling,  Up: Python API

23.2.2.1 Basic Python
.....................

GDB introduces a new Python module, named `gdb'.  All methods and
classes added by GDB are placed in this module.  GDB automatically
`import's the `gdb' module for use in all scripts evaluated by the
`python' command.

 -- Variable: gdb.PYTHONDIR
     A string containing the python directory (*note Python::).

 -- Function: gdb.execute (command [, from_tty [, to_string]])
     Evaluate COMMAND, a string, as a GDB CLI command.  If a GDB
     exception happens while COMMAND runs, it is translated as
     described in *note Exception Handling: Exception Handling.

     FROM_TTY specifies whether GDB ought to consider this command as
     having originated from the user invoking it interactively.  It
     must be a boolean value.  If omitted, it defaults to `False'.

     By default, any output produced by COMMAND is sent to GDB's
     standard output.  If the TO_STRING parameter is `True', then
     output will be collected by `gdb.execute' and returned as a
     string.  The default is `False', in which case the return value is
     `None'.  If TO_STRING is `True', the GDB virtual terminal will be
     temporarily set to unlimited width and height, and its pagination
     will be disabled; *note Screen Size::.

 -- Function: gdb.breakpoints ()
     Return a sequence holding all of GDB's breakpoints.  *Note
     Breakpoints In Python::, for more information.

 -- Function: gdb.parameter (parameter)
     Return the value of a GDB parameter.  PARAMETER is a string naming
     the parameter to look up; PARAMETER may contain spaces if the
     parameter has a multi-part name.  For example, `print object' is a
     valid parameter name.

     If the named parameter does not exist, this function throws a
     `gdb.error' (*note Exception Handling::).  Otherwise, the
     parameter's value is converted to a Python value of the appropriate
     type, and returned.

 -- Function: gdb.history (number)
     Return a value from GDB's value history (*note Value History::).
     NUMBER indicates which history element to return.  If NUMBER is
     negative, then GDB will take its absolute value and count backward
     from the last element (i.e., the most recent element) to find the
     value to return.  If NUMBER is zero, then GDB will return the most
     recent element.  If the element specified by NUMBER doesn't exist
     in the value history, a `gdb.error' exception will be raised.

     If no exception is raised, the return value is always an instance
     of `gdb.Value' (*note Values From Inferior::).

 -- Function: gdb.parse_and_eval (expression)
     Parse EXPRESSION as an expression in the current language,
     evaluate it, and return the result as a `gdb.Value'.  EXPRESSION
     must be a string.

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

 -- Function: gdb.post_event (event)
     Put EVENT, a callable object taking no arguments, into GDB's
     internal event queue.  This callable will be invoked at some later
     point, during GDB's event processing.  Events posted using
     `post_event' will be run in the order in which they were posted;
     however, there is no way to know when they will be processed
     relative to other events inside GDB.

     GDB is not thread-safe.  If your Python program uses multiple
     threads, you must be careful to only call GDB-specific functions
     in the main GDB thread.  `post_event' ensures this.  For example:

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

 -- Function: gdb.write (string [, stream])
     Print a string to GDB's paginated output stream.  The optional
     STREAM determines the stream to print to.  The default stream is
     GDB's standard output stream.  Possible stream values are:

    `gdb.STDOUT'
          GDB's standard output stream.

    `gdb.STDERR'
          GDB's standard error stream.

    `gdb.STDLOG'
          GDB's log stream (*note Logging Output::).

     Writing to `sys.stdout' or `sys.stderr' will automatically call
     this function and will automatically direct the output to the
     relevant stream.

 -- Function: gdb.flush ()
     Flush the buffer of a GDB paginated stream so that the contents
     are displayed immediately.  GDB will flush the contents of a
     stream automatically when it encounters a newline in the buffer.
     The optional STREAM determines the stream to flush.  The default
     stream is GDB's standard output stream.  Possible stream values
     are:

    `gdb.STDOUT'
          GDB's standard output stream.

    `gdb.STDERR'
          GDB's standard error stream.

    `gdb.STDLOG'
          GDB's log stream (*note Logging Output::).


     Flushing `sys.stdout' or `sys.stderr' will automatically call this
     function for the relevant stream.

 -- Function: gdb.target_charset ()
     Return the name of the current target character set (*note
     Character Sets::).  This differs from
     `gdb.parameter('target-charset')' in that `auto' is never returned.

 -- Function: gdb.target_wide_charset ()
     Return the name of the current target wide character set (*note
     Character Sets::).  This differs from
     `gdb.parameter('target-wide-charset')' in that `auto' is never
     returned.

 -- Function: gdb.solib_name (address)
     Return the name of the shared library holding the given ADDRESS as
     a string, or `None'.

 -- Function: gdb.decode_line [expression]
     Return locations of the line specified by EXPRESSION, or of the
     current line if no argument was given.  This function returns a
     Python tuple containing two elements.  The first element contains
     a string holding any unparsed section of EXPRESSION (or `None' if
     the expression has been fully parsed).  The second element contains
     either `None' or another tuple that contains all the locations
     that match the expression represented as `gdb.Symtab_and_line'
     objects (*note Symbol Tables In Python::).  If EXPRESSION is
     provided, it is decoded the way that GDB's inbuilt `break' or
     `edit' commands do (*note Specify Location::).

 -- Function: gdb.prompt_hook (current_prompt)
     If PROMPT_HOOK is callable, GDB will call the method assigned to
     this operation before a prompt is displayed by GDB.

     The parameter `current_prompt' contains the current GDB prompt.
     This method must return a Python string, or `None'.  If a string
     is returned, the GDB prompt will be set to that string.  If `None'
     is returned, GDB will continue to use the current prompt.

     Some prompts cannot be substituted in GDB.  Secondary prompts such
     as those used by readline for command input, and annotation
     related prompts are prohibited from being changed.


File: gdb.info,  Node: Exception Handling,  Next: Values From Inferior,  Prev: Basic Python,  Up: Python API

23.2.2.2 Exception Handling
...........................

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

     (gdb) python print foo
     Traceback (most recent call last):
       File "<string>", line 1, in <module>
     NameError: name 'foo' is not defined

   GDB errors that happen in GDB commands invoked by Python code are
converted to Python exceptions.  The type of the Python exception
depends on the error.

`gdb.error'
     This is the base class for most exceptions generated by GDB.  It
     is derived from `RuntimeError', for compatibility with earlier
     versions of GDB.

     If an error occurring in GDB does not fit into some more specific
     category, then the generated exception will have this type.

`gdb.MemoryError'
     This is a subclass of `gdb.error' which is thrown when an
     operation tried to access invalid memory in the inferior.

`KeyboardInterrupt'
     User interrupt (via `C-c' or by typing `q' at a pagination prompt)
     is translated to a Python `KeyboardInterrupt' exception.

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

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

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


File: gdb.info,  Node: Values From Inferior,  Next: Types In Python,  Prev: Exception Handling,  Up: Python API

23.2.2.3 Values From Inferior
.............................

GDB provides values it obtains from the inferior program in an object
of type `gdb.Value'.  GDB uses this object for its internal bookkeeping
of the inferior's values, and for fetching values when necessary.

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

     bar = some_val + 2

As result of this, `bar' will also be a `gdb.Value' object whose values
are of the same type as those of `some_val'.

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

     bar = some_val['foo']

   Again, `bar' will also be a `gdb.Value' object.

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

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

     result = some_val (10,20)

   Any values returned from a function call will be stored as a
`gdb.Value'.

   The following attributes are provided:

      -- Variable: Value.address
          If this object is addressable, this read-only attribute holds
          a `gdb.Value' object representing the address.  Otherwise,
          this attribute holds `None'.

      -- Variable: Value.is_optimized_out
          This read-only boolean attribute is true if the compiler
          optimized out this value, thus it is not available for
          fetching from the inferior.

      -- Variable: Value.type
          The type of this `gdb.Value'.  The value of this attribute is
          a `gdb.Type' object (*note Types In Python::).

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

          Note that this feature will only work when debugging a C++
          program that includes RTTI for the object in question.
          Otherwise, it will just return the static type of the value
          as in `ptype foo' (*note ptype: Symbols.).

      -- Variable: Value.is_lazy
          The value of this read-only boolean attribute is `True' if
          this `gdb.Value' has not yet been fetched from the inferior.
          GDB does not fetch values until necessary, for efficiency.
          For example:

               myval = gdb.parse_and_eval ('somevar')

          The value of `somevar' is not fetched at this time.  It will
          be fetched when the value is needed, or when the `fetch_lazy'
          method is invoked.

   The following methods are provided:

      -- Function: Value.__init__ (VAL)
          Many Python values can be converted directly to a `gdb.Value'
          via this object initializer.  Specifically:

         Python boolean
               A Python boolean is converted to the boolean type from
               the current language.

         Python integer
               A Python integer is converted to the C `long' type for
               the current architecture.

         Python long
               A Python long is converted to the C `long long' type for
               the current architecture.

         Python float
               A Python float is converted to the C `double' type for
               the current architecture.

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

         `gdb.Value'
               If `val' is a `gdb.Value', then a copy of the value is
               made.

         `gdb.LazyString'
               If `val' is a `gdb.LazyString' (*note Lazy Strings In
               Python::), then the lazy string's `value' method is
               called, and its result is used.

      -- Function: Value.cast (type)
          Return a new instance of `gdb.Value' that is the result of
          casting this instance to the type described by TYPE, which
          must be a `gdb.Type' object.  If the cast cannot be performed
          for some reason, this method throws an exception.

      -- Function: Value.dereference ()
          For pointer data types, this method returns a new `gdb.Value'
          object whose contents is the object pointed to by the
          pointer.  For example, if `foo' is a C pointer to an `int',
          declared in your C program as

               int *foo;

          then you can use the corresponding `gdb.Value' to access what
          `foo' points to like this:

               bar = foo.dereference ()

          The result `bar' will be a `gdb.Value' object holding the
          value pointed to by `foo'.

      -- Function: Value.dynamic_cast (type)
          Like `Value.cast', but works as if the C++ `dynamic_cast'
          operator were used.  Consult a C++ reference for details.

      -- Function: Value.reinterpret_cast (type)
          Like `Value.cast', but works as if the C++ `reinterpret_cast'
          operator were used.  Consult a C++ reference for details.

      -- Function: Value.string ([encoding[, errors[, length]]])
          If this `gdb.Value' represents a string, then this method
          converts the contents to a Python string.  Otherwise, this
          method will throw an exception.

          Strings are recognized in a language-specific way; whether a
          given `gdb.Value' represents a string is determined by the
          current language.

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

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

          The optional ERRORS argument is the same as the corresponding
          argument to Python's `string.decode' method.

          If the optional LENGTH argument is given, the string will be
          fetched and converted to the given length.

      -- Function: Value.lazy_string ([encoding [, length]])
          If this `gdb.Value' represents a string, then this method
          converts the contents to a `gdb.LazyString' (*note Lazy
          Strings In Python::).  Otherwise, this method will throw an
          exception.

          If the optional ENCODING argument is given, it must be a
          string naming the encoding of the `gdb.LazyString'.  Some
          examples are: `ascii', `iso-8859-6' or `utf-8'.  If the
          ENCODING argument is an encoding that GDB does recognize, GDB
          will raise an error.

          When a lazy string is printed, the GDB encoding machinery is
          used to convert the string during printing.  If the optional
          ENCODING argument is not provided, or is an empty string, GDB
          will automatically select the encoding most suitable for the
          string type.  For further information on encoding in GDB
          please see *note Character Sets::.

          If the optional LENGTH argument is given, the string will be
          fetched and encoded to the length of characters specified.  If
          the LENGTH argument is not provided, the string will be
          fetched and encoded until a null of appropriate width is
          found.

      -- Function: Value.fetch_lazy ()
          If the `gdb.Value' object is currently a lazy value
          (`gdb.Value.is_lazy' is `True'), then the value is fetched
          from the inferior.  Any errors that occur in the process will
          produce a Python exception.

          If the `gdb.Value' object is not a lazy value, this method
          has no effect.

          This method does not return a value.



File: gdb.info,  Node: Types In Python,  Next: Pretty Printing API,  Prev: Values From Inferior,  Up: Python API

23.2.2.4 Types In Python
........................

GDB represents types from the inferior using the class `gdb.Type'.

   The following type-related functions are available in the `gdb'
module:

 -- Function: gdb.lookup_type (name [, block])
     This function looks up a type by name.  NAME is the name of the
     type to look up.  It must be a string.

     If BLOCK is given, then NAME is looked up in that scope.
     Otherwise, it is searched for globally.

     Ordinarily, this function will return an instance of `gdb.Type'.
     If the named type cannot be found, it will throw an exception.

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

     bar = some_type['foo']

   `bar' will be a `gdb.Field' object; see below under the description
of the `Type.fields' method for a description of the `gdb.Field' class.

   An instance of `Type' has the following attributes:

      -- Variable: Type.code
          The type code for this type.  The type code will be one of the
          `TYPE_CODE_' constants defined below.

      -- Variable: Type.sizeof
          The size of this type, in target `char' units.  Usually, a
          target's `char' type will be an 8-bit byte.  However, on some
          unusual platforms, this type may have a different size.

      -- Variable: Type.tag
          The tag name for this type.  The tag name is the name after
          `struct', `union', or `enum' in C and C++; not all languages
          have this concept.  If this type has no tag name, then `None'
          is returned.

   The following methods are provided:

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

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

         `name'
               The name of the field, or `None' for anonymous fields.

         `artificial'
               This is `True' if the field is artificial, usually
               meaning that it was provided by the compiler and not the
               user.  This attribute is always provided, and is `False'
               if the field is not artificial.

         `is_base_class'
               This is `True' if the field represents a base class of a
               C++ structure.  This attribute is always provided, and
               is `False' if the field is not a base class of the type
               that is the argument of `fields', or if that type was
               not a C++ class.

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

         `type'
               The type of the field.  This is usually an instance of
               `Type', but it can be `None' in some situations.

      -- Function: Type.array (N1 [, N2])
          Return a new `gdb.Type' object which represents an array of
          this type.  If one argument is given, it is the inclusive
          upper bound of the array; in this case the lower bound is
          zero.  If two arguments are given, the first argument is the
          lower bound of the array, and the second argument is the
          upper bound of the array.  An array's length must not be
          negative, but the bounds can be.

      -- Function: Type.const ()
          Return a new `gdb.Type' object which represents a
          `const'-qualified variant of this type.

      -- Function: Type.volatile ()
          Return a new `gdb.Type' object which represents a
          `volatile'-qualified variant of this type.

      -- Function: Type.unqualified ()
          Return a new `gdb.Type' object which represents an unqualified
          variant of this type.  That is, the result is neither `const'
          nor `volatile'.

      -- Function: Type.range ()
          Return a Python `Tuple' object that contains two elements: the
          low bound of the argument type and the high bound of that
          type.  If the type does not have a range, GDB will raise a
          `gdb.error' exception (*note Exception Handling::).

      -- Function: Type.reference ()
          Return a new `gdb.Type' object which represents a reference
          to this type.

      -- Function: Type.pointer ()
          Return a new `gdb.Type' object which represents a pointer to
          this type.

      -- Function: Type.strip_typedefs ()
          Return a new `gdb.Type' that represents the real type, after
          removing all layers of typedefs.

      -- Function: Type.target ()
          Return a new `gdb.Type' object which represents the target
          type of this type.

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

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

      -- Function: Type.template_argument (n [, block])
          If this `gdb.Type' is an instantiation of a template, this
          will return a new `gdb.Type' which represents the type of the
          Nth template argument.

          If this `gdb.Type' is not a template type, this will throw an
          exception.  Ordinarily, only C++ code will have template
          types.

          If BLOCK is given, then NAME is looked up in that scope.
          Otherwise, it is searched for globally.

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

`gdb.TYPE_CODE_PTR'
     The type is a pointer.

`gdb.TYPE_CODE_ARRAY'
     The type is an array.

`gdb.TYPE_CODE_STRUCT'
     The type is a structure.

`gdb.TYPE_CODE_UNION'
     The type is a union.

`gdb.TYPE_CODE_ENUM'
     The type is an enum.

`gdb.TYPE_CODE_FLAGS'
     A bit flags type, used for things such as status registers.

`gdb.TYPE_CODE_FUNC'
     The type is a function.

`gdb.TYPE_CODE_INT'
     The type is an integer type.

`gdb.TYPE_CODE_FLT'
     A floating point type.

`gdb.TYPE_CODE_VOID'
     The special type `void'.

`gdb.TYPE_CODE_SET'
     A Pascal set type.

`gdb.TYPE_CODE_RANGE'
     A range type, that is, an integer type with bounds.

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

`gdb.TYPE_CODE_BITSTRING'
     A string of bits.

`gdb.TYPE_CODE_ERROR'
     An unknown or erroneous type.

`gdb.TYPE_CODE_METHOD'
     A method type, as found in C++ or Java.

`gdb.TYPE_CODE_METHODPTR'
     A pointer-to-member-function.

`gdb.TYPE_CODE_MEMBERPTR'
     A pointer-to-member.

`gdb.TYPE_CODE_REF'
     A reference type.

`gdb.TYPE_CODE_CHAR'
     A character type.

`gdb.TYPE_CODE_BOOL'
     A boolean type.

`gdb.TYPE_CODE_COMPLEX'
     A complex float type.

`gdb.TYPE_CODE_TYPEDEF'
     A typedef to some other type.

`gdb.TYPE_CODE_NAMESPACE'
     A C++ namespace.

`gdb.TYPE_CODE_DECFLOAT'
     A decimal floating point type.

`gdb.TYPE_CODE_INTERNAL_FUNCTION'
     A function internal to GDB.  This is the type used to represent
     convenience functions.

   Further support for types is provided in the `gdb.types' Python
module (*note gdb.types::).


File: gdb.info,  Node: Pretty Printing API,  Next: Selecting Pretty-Printers,  Prev: Types In Python,  Up: Python API

23.2.2.5 Pretty Printing API
............................

An example output is provided (*note Pretty Printing::).

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

 -- Function: pretty_printer.children (self)
     GDB will call this method on a pretty-printer to compute the
     children of the pretty-printer's value.

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

     This method is optional.  If it does not exist, GDB will act as
     though the value has no children.

 -- Function: pretty_printer.display_hint (self)
     The CLI may call this method and use its result to change the
     formatting of a value.  The result will also be supplied to an MI
     consumer as a `displayhint' attribute of the variable being
     printed.

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

     Some display hints are predefined by GDB:

    `array'
          Indicate that the object being printed is "array-like".  The
          CLI uses this to respect parameters such as `set print
          elements' and `set print array'.

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

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

 -- Function: pretty_printer.to_string (self)
     GDB will call this method to display the string representation of
     the value passed to the object's constructor.

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

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

     Otherwise, if this method returns an instance of `gdb.Value', then
     GDB prints this value.  This may result in a call to another
     pretty-printer.

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

     Finally, if this method returns `None' then no further operations
     are peformed in this method and nothing is printed.

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

   GDB provides a function which can be used to look up the default
pretty-printer for a `gdb.Value':

 -- Function: gdb.default_visualizer (value)
     This function takes a `gdb.Value' object as an argument.  If a
     pretty-printer for this value exists, then it is returned.  If no
     such printer exists, then this returns `None'.


File: gdb.info,  Node: Selecting Pretty-Printers,  Next: Writing a Pretty-Printer,  Prev: Pretty Printing API,  Up: Python API

23.2.2.6 Selecting Pretty-Printers
..................................

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

   Each function on these lists is passed a single `gdb.Value' argument
and should return a pretty-printer object conforming to the interface
definition above (*note Pretty Printing API::).  If a function cannot
create a pretty-printer for the value, it should return `None'.

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

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

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

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

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


File: gdb.info,  Node: Writing a Pretty-Printer,  Next: Inferiors In Python,  Prev: Selecting Pretty-Printers,  Up: Python API

23.2.2.7 Writing a Pretty-Printer
.................................

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

   Here is an example showing how a `std::string' printer might be
written.  *Note Pretty Printing API::, for details on the API this class
must provide.

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

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

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

         def display_hint(self):
             return 'string'

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

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

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

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

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

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

   To continue the `std::string' example (*note Pretty Printing API::),
this code might appear in `gdb.libstdcxx.v6':

     def register_printers(objfile):
         objfile.pretty_printers.append(str_lookup_function)

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

     import gdb.libstdcxx.v6
     gdb.libstdcxx.v6.register_printers(gdb.current_objfile())

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

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

   The `gdb.printing' module provides a formal way of solving these
problems (*note gdb.printing::).  Here is another example that handles
multiple types.

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

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

   Here are the printers:

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

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

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

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

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

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

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

     import gdb.printing

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

   And here is the autoload support:

     import gdb.printing
     import my_library
     gdb.printing.register_pretty_printer(
         gdb.current_objfile(),
         my_library.build_pretty_printer())

   Finally, when this printer is loaded into GDB, here is the
corresponding output of `info pretty-printer':

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


File: gdb.info,  Node: Inferiors In Python,  Next: Events In Python,  Prev: Writing a Pretty-Printer,  Up: Python API

23.2.2.8 Inferiors In Python
............................

Programs which are being run under GDB are called inferiors (*note
Inferiors and Programs::).  Python scripts can access information about
and manipulate inferiors controlled by GDB via objects of the
`gdb.Inferior' class.

   The following inferior-related functions are available in the `gdb'
module:

 -- Function: gdb.inferiors ()
     Return a tuple containing all inferior objects.

 -- Function: gdb.selected_inferior ()
     Return an object representing the current inferior.

   A `gdb.Inferior' object has the following attributes:

      -- Variable: Inferior.num
          ID of inferior, as assigned by GDB.

      -- Variable: Inferior.pid
          Process ID of the inferior, as assigned by the underlying
          operating system.

      -- Variable: Inferior.was_attached
          Boolean signaling whether the inferior was created using
          `attach', or started by GDB itself.

   A `gdb.Inferior' object has the following methods:

      -- Function: Inferior.is_valid ()
          Returns `True' if the `gdb.Inferior' object is valid, `False'
          if not.  A `gdb.Inferior' object will become invalid if the
          inferior no longer exists within GDB.  All other
          `gdb.Inferior' methods will throw an exception if it is
          invalid at the time the method is called.

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

      -- Function: Inferior.read_memory (address, length)
          Read LENGTH bytes of memory from the inferior, starting at
          ADDRESS.  Returns a buffer object, which behaves much like an
          array or a string.  It can be modified and given to the
          `gdb.write_memory' function.

      -- Function: Inferior.write_memory (address, buffer [, length])
          Write the contents of BUFFER to the inferior, starting at
          ADDRESS.  The BUFFER parameter must be a Python object which
          supports the buffer protocol, i.e., a string, an array or the
          object returned from `gdb.read_memory'.  If given, LENGTH
          determines the number of bytes from BUFFER to be written.

      -- Function: Inferior.search_memory (address, length, pattern)
          Search a region of the inferior memory starting at ADDRESS
          with the given LENGTH using the search pattern supplied in
          PATTERN.  The PATTERN parameter must be a Python object which
          supports the buffer protocol, i.e., a string, an array or the
          object returned from `gdb.read_memory'.  Returns a Python
          `Long' containing the address where the pattern was found, or
          `None' if the pattern could not be found.


File: gdb.info,  Node: Events In Python,  Next: Threads In Python,  Prev: Inferiors In Python,  Up: Python API

23.2.2.9 Events In Python
.........................

GDB provides a general event facility so that Python code can be
notified of various state changes, particularly changes that occur in
the inferior.

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

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

      -- Function: EventRegistry.connect (object)
          Add the given callable OBJECT to the registry.  This object
          will be called when an event corresponding to this registry
          occurs.

      -- Function: EventRegistry.disconnect (object)
          Remove the given OBJECT from the registry.  Once removed, the
          object will no longer receive notifications of events.

   Here is an example:

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

     gdb.events.exited.connect (exit_handler)

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

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

`events.cont'
     Emits `gdb.ThreadEvent'.

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

           -- Variable: ThreadEvent.inferior_thread
               In non-stop mode this attribute will be set to the
               specific thread which was involved in the emitted event.
               Otherwise, it will be set to `None'.

     Emits `gdb.ContinueEvent' which extends `gdb.ThreadEvent'.

     This event indicates that the inferior has been continued after a
     stop. For inherited attribute refer to `gdb.ThreadEvent' above.

`events.exited'
     Emits `events.ExitedEvent' which indicates that the inferior has
     exited.  `events.ExitedEvent' has two attributes:
           -- Variable: ExitedEvent.exit_code
               An integer representing the exit code, if available,
               which the inferior has returned.  (The exit code could
               be unavailable if, for example, GDB detaches from the
               inferior.) If the exit code is unavailable, the
               attribute does not exist.

           -- Variable: ExitedEvent inferior
               A reference to the inferior which triggered the `exited'
               event.

`events.stop'
     Emits `gdb.StopEvent' which extends `gdb.ThreadEvent'.

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

     Emits `gdb.SignalEvent' which extends `gdb.StopEvent'.

     This event indicates that the inferior or one of its threads has
     received as signal.  `gdb.SignalEvent' has the following
     attributes:

           -- Variable: SignalEvent.stop_signal
               A string representing the signal received by the
               inferior.  A list of possible signal values can be
               obtained by running the command `info signals' in the
               GDB command prompt.

     Also emits  `gdb.BreakpointEvent' which extends `gdb.StopEvent'.

     `gdb.BreakpointEvent' event indicates that one or more breakpoints
     have been hit, and has the following attributes:

           -- Variable: BreakpointEvent.breakpoints
               A sequence containing references to all the breakpoints
               (type `gdb.Breakpoint') that were hit.  *Note
               Breakpoints In Python::, for details of the
               `gdb.Breakpoint' object.

           -- Variable: BreakpointEvent.breakpoint
               A reference to the first breakpoint that was hit.  This
               function is maintained for backward compatibility and is
               now deprecated in favor of the
               `gdb.BreakpointEvent.breakpoints' attribute.

`events.new_objfile'
     Emits `gdb.NewObjFileEvent' which indicates that a new object file
     has been loaded by GDB.  `gdb.NewObjFileEvent' has one attribute:

           -- Variable: NewObjFileEvent.new_objfile
               A reference to the object file (`gdb.Objfile') which has
               been loaded.  *Note Objfiles In Python::, for details of
               the `gdb.Objfile' object.



File: gdb.info,  Node: Threads In Python,  Next: Commands In Python,  Prev: Events In Python,  Up: Python API

23.2.2.10 Threads In Python
...........................

Python scripts can access information about, and manipulate inferior
threads controlled by GDB, via objects of the `gdb.InferiorThread'
class.

   The following thread-related functions are available in the `gdb'
module:

 -- Function: gdb.selected_thread ()
     This function returns the thread object for the selected thread.
     If there is no selected thread, this will return `None'.

   A `gdb.InferiorThread' object has the following attributes:

      -- Variable: InferiorThread.name
          The name of the thread.  If the user specified a name using
          `thread name', then this returns that name.  Otherwise, if an
          OS-supplied name is available, then it is returned.
          Otherwise, this returns `None'.

          This attribute can be assigned to.  The new value must be a
          string object, which sets the new name, or `None', which
          removes any user-specified thread name.

      -- Variable: InferiorThread.num
          ID of the thread, as assigned by GDB.

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

   A `gdb.InferiorThread' object has the following methods:

      -- Function: InferiorThread.is_valid ()
          Returns `True' if the `gdb.InferiorThread' object is valid,
          `False' if not.  A `gdb.InferiorThread' object will become
          invalid if the thread exits, or the inferior that the thread
          belongs is deleted.  All other `gdb.InferiorThread' methods
          will throw an exception if it is invalid at the time the
          method is called.

      -- Function: InferiorThread.switch ()
          This changes GDB's currently selected thread to the one
          represented by this object.

      -- Function: InferiorThread.is_stopped ()
          Return a Boolean indicating whether the thread is stopped.

      -- Function: InferiorThread.is_running ()
          Return a Boolean indicating whether the thread is running.

      -- Function: InferiorThread.is_exited ()
          Return a Boolean indicating whether the thread is exited.


File: gdb.info,  Node: Commands In Python,  Next: Parameters In Python,  Prev: Threads In Python,  Up: Python API

23.2.2.11 Commands In Python
............................

You can implement new GDB CLI commands in Python.  A CLI command is
implemented using an instance of the `gdb.Command' class, most commonly
using a subclass.

 -- Function: Command.__init__ (name, COMMAND_CLASS [, COMPLETER_CLASS
          [, PREFIX]])
     The object initializer for `Command' registers the new command
     with GDB.  This initializer is normally invoked from the subclass'
     own `__init__' method.

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

     There is no support for multi-line commands.

     COMMAND_CLASS should be one of the `COMMAND_' constants defined
     below.  This argument tells GDB how to categorize the new command
     in the help system.

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

     PREFIX is an optional argument.  If `True', then the new command
     is a prefix command; sub-commands of this command may be
     registered.

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

 -- Function: Command.dont_repeat ()
     By default, a GDB command is repeated when the user enters a blank
     line at the command prompt.  A command can suppress this behavior
     by invoking the `dont_repeat' method.  This is similar to the user
     command `dont-repeat', see *note dont-repeat: Define.

 -- Function: Command.invoke (argument, from_tty)
     This method is called by GDB when this command is invoked.

     ARGUMENT is a string.  It is the argument to the command, after
     leading and trailing whitespace has been stripped.

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

     If this method throws an exception, it is turned into a GDB
     `error' call.  Otherwise, the return value is ignored.

     To break ARGUMENT up into an argv-like string use
     `gdb.string_to_argv'.  This function behaves identically to GDB's
     internal argument lexer `buildargv'.  It is recommended to use
     this for consistency.  Arguments are separated by spaces and may
     be quoted.  Example:

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


 -- Function: Command.complete (text, word)
     This method is called by GDB when the user attempts completion on
     this command.  All forms of completion are handled by this method,
     that is, the <TAB> and <M-?> key bindings (*note Completion::),
     and the `complete' command (*note complete: Help.).

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

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

        * If the return value is one of the `COMPLETE_' constants
          defined below, then the corresponding GDB-internal completion
          function is invoked, and its result is used.

        * All other results are treated as though there were no
          available completions.

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

`gdb.COMMAND_NONE'
     The command does not belong to any particular class.  A command in
     this category will not be displayed in any of the help categories.

`gdb.COMMAND_RUNNING'
     The command is related to running the inferior.  For example,
     `start', `step', and `continue' are in this category.  Type `help
     running' at the GDB prompt to see a list of commands in this
     category.

`gdb.COMMAND_DATA'
     The command is related to data or variables.  For example, `call',
     `find', and `print' are in this category.  Type `help data' at the
     GDB prompt to see a list of commands in this category.

`gdb.COMMAND_STACK'
     The command has to do with manipulation of the stack.  For example,
     `backtrace', `frame', and `return' are in this category.  Type
     `help stack' at the GDB prompt to see a list of commands in this
     category.

`gdb.COMMAND_FILES'
     This class is used for file-related commands.  For example,
     `file', `list' and `section' are in this category.  Type `help
     files' at the GDB prompt to see a list of commands in this
     category.

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

`gdb.COMMAND_STATUS'
     The command is an `info'-related command, that is, related to the
     state of GDB itself.  For example, `info', `macro', and `show' are
     in this category.  Type `help status' at the GDB prompt to see a
     list of commands in this category.

`gdb.COMMAND_BREAKPOINTS'
     The command has to do with breakpoints.  For example, `break',
     `clear', and `delete' are in this category.  Type `help
     breakpoints' at the GDB prompt to see a list of commands in this
     category.

`gdb.COMMAND_TRACEPOINTS'
     The command has to do with tracepoints.  For example, `trace',
     `actions', and `tfind' are in this category.  Type `help
     tracepoints' at the GDB prompt to see a list of commands in this
     category.

`gdb.COMMAND_OBSCURE'
     The command is only used in unusual circumstances, or is not of
     general interest to users.  For example, `checkpoint', `fork', and
     `stop' are in this category.  Type `help obscure' at the GDB
     prompt to see a list of commands in this category.

`gdb.COMMAND_MAINTENANCE'
     The command is only useful to GDB maintainers.  The `maintenance'
     and `flushregs' commands are in this category.  Type `help
     internals' at the GDB prompt to see a list of commands in this
     category.

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

`gdb.COMPLETE_NONE'
     This constant means that no completion should be done.

`gdb.COMPLETE_FILENAME'
     This constant means that filename completion should be performed.

`gdb.COMPLETE_LOCATION'
     This constant means that location completion should be done.
     *Note Specify Location::.

`gdb.COMPLETE_COMMAND'
     This constant means that completion should examine GDB command
     names.

`gdb.COMPLETE_SYMBOL'
     This constant means that completion should be done using symbol
     names as the source.

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

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

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

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

     HelloWorld ()

   The last line instantiates the class, and is necessary to trigger the
registration of the command with GDB.  Depending on how the Python code
is read into GDB, you may need to import the `gdb' module explicitly.


File: gdb.info,  Node: Parameters In Python,  Next: Functions In Python,  Prev: Commands In Python,  Up: Python API

23.2.2.12 Parameters In Python
..............................

You can implement new GDB parameters using Python.  A new parameter is
implemented as an instance of the `gdb.Parameter' class.

   Parameters are exposed to the user via the `set' and `show'
commands.  *Note Help::.

   There are many parameters that already exist and can be set in GDB.
Two examples are: `set follow fork' and `set charset'.  Setting these
parameters influences certain behavior in GDB.  Similarly, you can
define parameters that can be used to influence behavior in custom
Python scripts and commands.

 -- Function: Parameter.__init__ (name, COMMAND-CLASS, PARAMETER-CLASS
          [, ENUM-SEQUENCE])
     The object initializer for `Parameter' registers the new parameter
     with GDB.  This initializer is normally invoked from the subclass'
     own `__init__' method.

     NAME is the name of the new parameter.  If NAME consists of
     multiple words, then the initial words are looked for as prefix
     parameters.  An example of this can be illustrated with the `set
     print' set of parameters.  If NAME is `print foo', then `print'
     will be searched as the prefix parameter.  In this case the
     parameter can subsequently be accessed in GDB as `set print foo'.

     If NAME consists of multiple words, and no prefix parameter group
     can be found, an exception is raised.

     COMMAND-CLASS should be one of the `COMMAND_' constants (*note
     Commands In Python::).  This argument tells GDB how to categorize
     the new parameter in the help system.

     PARAMETER-CLASS should be one of the `PARAM_' constants defined
     below.  This argument tells GDB the type of the new parameter;
     this information is used for input validation and completion.

     If PARAMETER-CLASS is `PARAM_ENUM', then ENUM-SEQUENCE must be a
     sequence of strings.  These strings represent the possible values
     for the parameter.

     If PARAMETER-CLASS is not `PARAM_ENUM', then the presence of a
     fourth argument will cause an exception to be thrown.

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

 -- Variable: Parameter.set_doc
     If this attribute exists, and is a string, then its value is used
     as the help text for this parameter's `set' command.  The value is
     examined when `Parameter.__init__' is invoked; subsequent changes
     have no effect.

 -- Variable: Parameter.show_doc
     If this attribute exists, and is a string, then its value is used
     as the help text for this parameter's `show' command.  The value is
     examined when `Parameter.__init__' is invoked; subsequent changes
     have no effect.

 -- Variable: Parameter.value
     The `value' attribute holds the underlying value of the parameter.
     It can be read and assigned to just as any other attribute.  GDB
     does validation when assignments are made.

   There are two methods that should be implemented in any `Parameter'
class.  These are:

 -- Function: Parameter.get_set_string (self)
     GDB will call this method when a PARAMETER's value has been
     changed via the `set' API (for example, `set foo off').  The
     `value' attribute has already been populated with the new value
     and may be used in output.  This method must return a string.

 -- Function: Parameter.get_show_string (self, svalue)
     GDB will call this method when a PARAMETER's `show' API has been
     invoked (for example, `show foo').  The argument `svalue' receives
     the string representation of the current value.  This method must
     return a string.

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

`gdb.PARAM_BOOLEAN'
     The value is a plain boolean.  The Python boolean values, `True'
     and `False' are the only valid values.

`gdb.PARAM_AUTO_BOOLEAN'
     The value has three possible states: true, false, and `auto'.  In
     Python, true and false are represented using boolean constants, and
     `auto' is represented using `None'.

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

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

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

`gdb.PARAM_STRING_NOESCAPE'
     The value is a string.  When the user modifies the string, escapes
     are passed through untranslated.

`gdb.PARAM_OPTIONAL_FILENAME'
     The value is a either a filename (a string), or `None'.

`gdb.PARAM_FILENAME'
     The value is a filename.  This is just like
     `PARAM_STRING_NOESCAPE', but uses file names for completion.

`gdb.PARAM_ZINTEGER'
     The value is an integer.  This is like `PARAM_INTEGER', except 0
     is interpreted as itself.

`gdb.PARAM_ENUM'
     The value is a string, which must be one of a collection string
     constants provided when the parameter is created.


File: gdb.info,  Node: Functions In Python,  Next: Progspaces In Python,  Prev: Parameters In Python,  Up: Python API

23.2.2.13 Writing new convenience functions
...........................................

You can implement new convenience functions (*note Convenience Vars::)
in Python.  A convenience function is an instance of a subclass of the
class `gdb.Function'.

 -- Function: Function.__init__ (name)
     The initializer for `Function' registers the new function with
     GDB.  The argument NAME is the name of the function, a string.
     The function will be visible to the user as a convenience variable
     of type `internal function', whose name is the same as the given
     NAME.

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

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

     The return value of this method is used as its value in the
     enclosing expression.  If an ordinary Python value is returned, it
     is converted to a `gdb.Value' following the usual rules.

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

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

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

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

     Greet ()

   The last line instantiates the class, and is necessary to trigger the
registration of the function with GDB.  Depending on how the Python
code is read into GDB, you may need to import the `gdb' module
explicitly.


File: gdb.info,  Node: Progspaces In Python,  Next: Objfiles In Python,  Prev: Functions In Python,  Up: Python API

23.2.2.14 Program Spaces In Python
..................................

A program space, or "progspace", represents a symbolic view of an
address space.  It consists of all of the objfiles of the program.
*Note Objfiles In Python::.  *Note program spaces: Inferiors and
Programs, for more details about program spaces.

   The following progspace-related functions are available in the `gdb'
module:

 -- Function: gdb.current_progspace ()
     This function returns the program space of the currently selected
     inferior.  *Note Inferiors and Programs::.

 -- Function: gdb.progspaces ()
     Return a sequence of all the progspaces currently known to GDB.

   Each progspace is represented by an instance of the `gdb.Progspace'
class.

 -- Variable: Progspace.filename
     The file name of the progspace as a string.

 -- Variable: Progspace.pretty_printers
     The `pretty_printers' attribute is a list of functions.  It is
     used to look up pretty-printers.  A `Value' is passed to each
     function in order; if the function returns `None', then the search
     continues.  Otherwise, the return value should be an object which
     is used to format the value.  *Note Pretty Printing API::, for more
     information.


File: gdb.info,  Node: Objfiles In Python,  Next: Frames In Python,  Prev: Progspaces In Python,  Up: Python API

23.2.2.15 Objfiles In Python
............................

GDB loads symbols for an inferior from various symbol-containing files
(*note Files::).  These include the primary executable file, any shared
libraries used by the inferior, and any separate debug info files
(*note Separate Debug Files::).  GDB calls these symbol-containing
files "objfiles".

   The following objfile-related functions are available in the `gdb'
module:

 -- Function: gdb.current_objfile ()
     When auto-loading a Python script (*note Auto-loading::), GDB sets
     the "current objfile" to the corresponding objfile.  This function
     returns the current objfile.  If there is no current objfile, this
     function returns `None'.

 -- Function: gdb.objfiles ()
     Return a sequence of all the objfiles current known to GDB.  *Note
     Objfiles In Python::.

   Each objfile is represented by an instance of the `gdb.Objfile'
class.

 -- Variable: Objfile.filename
     The file name of the objfile as a string.

 -- Variable: Objfile.pretty_printers
     The `pretty_printers' attribute is a list of functions.  It is
     used to look up pretty-printers.  A `Value' is passed to each
     function in order; if the function returns `None', then the search
     continues.  Otherwise, the return value should be an object which
     is used to format the value.  *Note Pretty Printing API::, for more
     information.

   A `gdb.Objfile' object has the following methods:

 -- Function: Objfile.is_valid ()
     Returns `True' if the `gdb.Objfile' object is valid, `False' if
     not.  A `gdb.Objfile' object can become invalid if the object file
     it refers to is not loaded in GDB any longer.  All other
     `gdb.Objfile' methods will throw an exception if it is invalid at
     the time the method is called.


File: gdb.info,  Node: Frames In Python,  Next: Blocks In Python,  Prev: Objfiles In Python,  Up: Python API

23.2.2.16 Accessing inferior stack frames from Python.
......................................................

When the debugged program stops, GDB is able to analyze its call stack
(*note Stack frames: Frames.).  The `gdb.Frame' class represents a
frame in the stack.  A `gdb.Frame' object is only valid while its
corresponding frame exists in the inferior's stack.  If you try to use
an invalid frame object, GDB will throw a `gdb.error' exception (*note
Exception Handling::).

   Two `gdb.Frame' objects can be compared for equality with the `=='
operator, like:

     (gdb) python print gdb.newest_frame() == gdb.selected_frame ()
     True

   The following frame-related functions are available in the `gdb'
module:

 -- Function: gdb.selected_frame ()
     Return the selected frame object.  (*note Selecting a Frame:
     Selection.).

 -- Function: gdb.newest_frame ()
     Return the newest frame object for the selected thread.

 -- Function: gdb.frame_stop_reason_string (reason)
     Return a string explaining the reason why GDB stopped unwinding
     frames, as expressed by the given REASON code (an integer, see the
     `unwind_stop_reason' method further down in this section).

   A `gdb.Frame' object has the following methods:

      -- Function: Frame.is_valid ()
          Returns true if the `gdb.Frame' object is valid, false if not.
          A frame object can become invalid if the frame it refers to
          doesn't exist anymore in the inferior.  All `gdb.Frame'
          methods will throw an exception if it is invalid at the time
          the method is called.

      -- Function: Frame.name ()
          Returns the function name of the frame, or `None' if it can't
          be obtained.

      -- Function: Frame.type ()
          Returns the type of the frame.  The value can be one of:
         `gdb.NORMAL_FRAME'
               An ordinary stack frame.

         `gdb.DUMMY_FRAME'
               A fake stack frame that was created by GDB when
               performing an inferior function call.

         `gdb.INLINE_FRAME'
               A frame representing an inlined function.  The function
               was inlined into a `gdb.NORMAL_FRAME' that is older than
               this one.

         `gdb.TAILCALL_FRAME'
               A frame representing a tail call.  *Note Tail Call
               Frames::.

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

         `gdb.ARCH_FRAME'
               A fake stack frame representing a cross-architecture
               call.

         `gdb.SENTINEL_FRAME'
               This is like `gdb.NORMAL_FRAME', but it is only used for
               the newest frame.

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

         `gdb.FRAME_UNWIND_NO_REASON'
               No particular reason (older frames should be available).

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

         `gdb.FRAME_UNWIND_OUTERMOST'
               This frame is the outermost.

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

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

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

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

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


      -- Function: Frame.pc ()
          Returns the frame's resume address.

      -- Function: Frame.block ()
          Return the frame's code block.  *Note Blocks In Python::.

      -- Function: Frame.function ()
          Return the symbol for the function corresponding to this
          frame.  *Note Symbols In Python::.

      -- Function: Frame.older ()
          Return the frame that called this frame.

      -- Function: Frame.newer ()
          Return the frame called by this frame.

      -- Function: Frame.find_sal ()
          Return the frame's symtab and line object.  *Note Symbol
          Tables In Python::.

      -- Function: Frame.read_var (variable [, block])
          Return the value of VARIABLE in this frame.  If the optional
          argument BLOCK is provided, search for the variable from that
          block; otherwise start at the frame's current block (which is
          determined by the frame's current program counter).  VARIABLE
          must be a string or a `gdb.Symbol' object.  BLOCK must be a
          `gdb.Block' object.

      -- Function: Frame.select ()
          Set this frame to be the selected frame.  *Note Examining the
          Stack: Stack.


File: gdb.info,  Node: Blocks In Python,  Next: Symbols In Python,  Prev: Frames In Python,  Up: Python API

23.2.2.17 Accessing frame blocks from Python.
.............................................

Within each frame, GDB maintains information on each block stored in
that frame.  These blocks are organized hierarchically, and are
represented individually in Python as a `gdb.Block'.  Please see *note
Frames In Python::, for a more in-depth discussion on frames.
Furthermore, see *note Examining the Stack: Stack, for more detailed
technical information on GDB's book-keeping of the stack.

   The following block-related functions are available in the `gdb'
module:

 -- Function: gdb.block_for_pc (pc)
     Return the `gdb.Block' containing the given PC value.  If the
     block cannot be found for the PC value specified, the function
     will return `None'.

   A `gdb.Block' object has the following methods:

      -- Function: Block.is_valid ()
          Returns `True' if the `gdb.Block' object is valid, `False' if
          not.  A block object can become invalid if the block it
          refers to doesn't exist anymore in the inferior.  All other
          `gdb.Block' methods will throw an exception if it is invalid
          at the time the method is called.  This method is also made
          available to the Python iterator object that `gdb.Block'
          provides in an iteration context and via the Python `iter'
          built-in function.

   A `gdb.Block' object has the following attributes:

      -- Variable: Block.start
          The start address of the block.  This attribute is not
          writable.

      -- Variable: Block.end
          The end address of the block.  This attribute is not writable.

      -- Variable: Block.function
          The name of the block represented as a `gdb.Symbol'.  If the
          block is not named, then this attribute holds `None'.  This
          attribute is not writable.

      -- Variable: Block.superblock
          The block containing this block.  If this parent block does
          not exist, this attribute holds `None'.  This attribute is
          not writable.

      -- Variable: Block.global_block
          The global block associated with this block.  This attribute
          is not writable.

      -- Variable: Block.static_block
          The static block associated with this block.  This attribute
          is not writable.

      -- Variable: Block.is_global
          `True' if the `gdb.Block' object is a global block, `False'
          if not.  This attribute is not writable.

      -- Variable: Block.is_static
          `True' if the `gdb.Block' object is a static block, `False'
          if not.  This attribute is not writable.


File: gdb.info,  Node: Symbols In Python,  Next: Symbol Tables In Python,  Prev: Blocks In Python,  Up: Python API

23.2.2.18 Python representation of Symbols.
...........................................

GDB represents every variable, function and type as an entry in a
symbol table.  *Note Examining the Symbol Table: Symbols.  Similarly,
Python represents these symbols in GDB with the `gdb.Symbol' object.

   The following symbol-related functions are available in the `gdb'
module:

 -- Function: gdb.lookup_symbol (name [, block [, domain]])
     This function searches for a symbol by name.  The search scope can
     be restricted to the parameters defined in the optional domain and
     block arguments.

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

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

 -- Function: gdb.lookup_global_symbol (name [, domain])
     This function searches for a global symbol by name.  The search
     scope can be restricted to by the domain argument.

     NAME is the name of the symbol.  It must be a string.  The
     optional DOMAIN argument restricts the search to the domain type.
     The DOMAIN argument must be a domain constant defined in the `gdb'
     module and described later in this chapter.

     The result is a `gdb.Symbol' object or `None' if the symbol is not
     found.

   A `gdb.Symbol' object has the following attributes:

      -- Variable: Symbol.type
          The type of the symbol or `None' if no type is recorded.
          This attribute is represented as a `gdb.Type' object.  *Note
          Types In Python::.  This attribute is not writable.

      -- Variable: Symbol.symtab
          The symbol table in which the symbol appears.  This attribute
          is represented as a `gdb.Symtab' object.  *Note Symbol Tables
          In Python::.  This attribute is not writable.

      -- Variable: Symbol.name
          The name of the symbol as a string.  This attribute is not
          writable.

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

      -- Variable: Symbol.print_name
          The name of the symbol in a form suitable for output.  This
          is either `name' or `linkage_name', depending on whether the
          user asked GDB to display demangled or mangled names.

      -- Variable: Symbol.addr_class
          The address class of the symbol.  This classifies how to find
          the value of a symbol.  Each address class is a constant
          defined in the `gdb' module and described later in this
          chapter.

      -- Variable: Symbol.is_argument
          `True' if the symbol is an argument of a function.

      -- Variable: Symbol.is_constant
          `True' if the symbol is a constant.

      -- Variable: Symbol.is_function
          `True' if the symbol is a function or a method.

      -- Variable: Symbol.is_variable
          `True' if the symbol is a variable.

   A `gdb.Symbol' object has the following methods:

      -- Function: Symbol.is_valid ()
          Returns `True' if the `gdb.Symbol' object is valid, `False'
          if not.  A `gdb.Symbol' object can become invalid if the
          symbol it refers to does not exist in GDB any longer.  All
          other `gdb.Symbol' methods will throw an exception if it is
          invalid at the time the method is called.

   The available domain categories in `gdb.Symbol' are represented as
constants in the `gdb' module:

`gdb.SYMBOL_UNDEF_DOMAIN'
     This is used when a domain has not been discovered or none of the
     following domains apply.  This usually indicates an error either
     in the symbol information or in GDB's handling of symbols.  

`gdb.SYMBOL_VAR_DOMAIN'
     This domain contains variables, function names, typedef names and
     enum type values.  

`gdb.SYMBOL_STRUCT_DOMAIN'
     This domain holds struct, union and enum type names.  

`gdb.SYMBOL_LABEL_DOMAIN'
     This domain contains names of labels (for gotos).  

`gdb.SYMBOL_VARIABLES_DOMAIN'
     This domain holds a subset of the `SYMBOLS_VAR_DOMAIN'; it
     contains everything minus functions and types.  

`gdb.SYMBOL_FUNCTION_DOMAIN'
     This domain contains all functions.  

`gdb.SYMBOL_TYPES_DOMAIN'
     This domain contains all types.

   The available address class categories in `gdb.Symbol' are
represented as constants in the `gdb' module:

`gdb.SYMBOL_LOC_UNDEF'
     If this is returned by address class, it indicates an error either
     in the symbol information or in GDB's handling of symbols.  

`gdb.SYMBOL_LOC_CONST'
     Value is constant int.  

`gdb.SYMBOL_LOC_STATIC'
     Value is at a fixed address.  

`gdb.SYMBOL_LOC_REGISTER'
     Value is in a register.  

`gdb.SYMBOL_LOC_ARG'
     Value is an argument.  This value is at the offset stored within
     the symbol inside the frame's argument list.  

`gdb.SYMBOL_LOC_REF_ARG'
     Value address is stored in the frame's argument list.  Just like
     `LOC_ARG' except that the value's address is stored at the offset,
     not the value itself.  

`gdb.SYMBOL_LOC_REGPARM_ADDR'
     Value is a specified register.  Just like `LOC_REGISTER' except
     the register holds the address of the argument instead of the
     argument itself.  

`gdb.SYMBOL_LOC_LOCAL'
     Value is a local variable.  

`gdb.SYMBOL_LOC_TYPEDEF'
     Value not used.  Symbols in the domain `SYMBOL_STRUCT_DOMAIN' all
     have this class.  

`gdb.SYMBOL_LOC_BLOCK'
     Value is a block.  

`gdb.SYMBOL_LOC_CONST_BYTES'
     Value is a byte-sequence.  

`gdb.SYMBOL_LOC_UNRESOLVED'
     Value is at a fixed address, but the address of the variable has
     to be determined from the minimal symbol table whenever the
     variable is referenced.  

`gdb.SYMBOL_LOC_OPTIMIZED_OUT'
     The value does not actually exist in the program.  

`gdb.SYMBOL_LOC_COMPUTED'
     The value's address is a computed location.


File: gdb.info,  Node: Symbol Tables In Python,  Next: Lazy Strings In Python,  Prev: Symbols In Python,  Up: Python API

23.2.2.19 Symbol table representation in Python.
................................................

Access to symbol table data maintained by GDB on the inferior is
exposed to Python via two objects: `gdb.Symtab_and_line' and
`gdb.Symtab'.  Symbol table and line data for a frame is returned from
the `find_sal' method in `gdb.Frame' object.  *Note Frames In Python::.

   For more information on GDB's symbol table management, see *note
Examining the Symbol Table: Symbols, for more information.

   A `gdb.Symtab_and_line' object has the following attributes:

      -- Variable: Symtab_and_line.symtab
          The symbol table object (`gdb.Symtab') for this frame.  This
          attribute is not writable.

      -- Variable: Symtab_and_line.pc
          Indicates the current program counter address.  This
          attribute is not writable.

      -- Variable: Symtab_and_line.line
          Indicates the current line number for this object.  This
          attribute is not writable.

   A `gdb.Symtab_and_line' object has the following methods:

      -- Function: Symtab_and_line.is_valid ()
          Returns `True' if the `gdb.Symtab_and_line' object is valid,
          `False' if not.  A `gdb.Symtab_and_line' object can become
          invalid if the Symbol table and line object it refers to does
          not exist in GDB any longer.  All other `gdb.Symtab_and_line'
          methods will throw an exception if it is invalid at the time
          the method is called.

   A `gdb.Symtab' object has the following attributes:

      -- Variable: Symtab.filename
          The symbol table's source filename.  This attribute is not
          writable.

      -- Variable: Symtab.objfile
          The symbol table's backing object file.  *Note Objfiles In
          Python::.  This attribute is not writable.

   A `gdb.Symtab' object has the following methods:

      -- Function: Symtab.is_valid ()
          Returns `True' if the `gdb.Symtab' object is valid, `False'
          if not.  A `gdb.Symtab' object can become invalid if the
          symbol table it refers to does not exist in GDB any longer.
          All other `gdb.Symtab' methods will throw an exception if it
          is invalid at the time the method is called.

      -- Function: Symtab.fullname ()
          Return the symbol table's source absolute file name.


File: gdb.info,  Node: Breakpoints In Python,  Next: Finish Breakpoints in Python,  Prev: Lazy Strings In Python,  Up: Python API

23.2.2.20 Manipulating breakpoints using Python
...............................................

Python code can manipulate breakpoints via the `gdb.Breakpoint' class.

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

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

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

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

     Example `stop' implementation:

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

   The available watchpoint types represented by constants are defined
in the `gdb' module:

`gdb.WP_READ'
     Read only watchpoint.

`gdb.WP_WRITE'
     Write only watchpoint.

`gdb.WP_ACCESS'
     Read/Write watchpoint.

 -- Function: Breakpoint.is_valid ()
     Return `True' if this `Breakpoint' object is valid, `False'
     otherwise.  A `Breakpoint' object can become invalid if the user
     deletes the breakpoint.  In this case, the object still exists,
     but the underlying breakpoint does not.  In the cases of
     watchpoint scope, the watchpoint remains valid even if execution
     of the inferior leaves the scope of that watchpoint.

 -- Function: Breakpoint.delete
     Permanently deletes the GDB breakpoint.  This also invalidates the
     Python `Breakpoint' object.  Any further access to this object's
     attributes or methods will raise an error.

 -- Variable: Breakpoint.enabled
     This attribute is `True' if the breakpoint is enabled, and `False'
     otherwise.  This attribute is writable.

 -- Variable: Breakpoint.silent
     This attribute is `True' if the breakpoint is silent, and `False'
     otherwise.  This attribute is writable.

     Note that a breakpoint can also be silent if it has commands and
     the first command is `silent'.  This is not reported by the
     `silent' attribute.

 -- Variable: Breakpoint.thread
     If the breakpoint is thread-specific, this attribute holds the
     thread id.  If the breakpoint is not thread-specific, this
     attribute is `None'.  This attribute is writable.

 -- Variable: Breakpoint.task
     If the breakpoint is Ada task-specific, this attribute holds the
     Ada task id.  If the breakpoint is not task-specific (or the
     underlying language is not Ada), this attribute is `None'.  This
     attribute is writable.

 -- Variable: Breakpoint.ignore_count
     This attribute holds the ignore count for the breakpoint, an
     integer.  This attribute is writable.

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

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

 -- Variable: Breakpoint.visible
     This attribute tells whether the breakpoint is visible to the user
     when set, or when the `info breakpoints' command is run.  This
     attribute is not writable.

   The available types are represented by constants defined in the `gdb'
module:

`gdb.BP_BREAKPOINT'
     Normal code breakpoint.

`gdb.BP_WATCHPOINT'
     Watchpoint breakpoint.

`gdb.BP_HARDWARE_WATCHPOINT'
     Hardware assisted watchpoint.

`gdb.BP_READ_WATCHPOINT'
     Hardware assisted read watchpoint.

`gdb.BP_ACCESS_WATCHPOINT'
     Hardware assisted access watchpoint.

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

 -- Variable: Breakpoint.location
     This attribute holds the location of the breakpoint, as specified
     by the user.  It is a string.  If the breakpoint does not have a
     location (that is, it is a watchpoint) the attribute's value is
     `None'.  This attribute is not writable.

 -- Variable: Breakpoint.expression
     This attribute holds a breakpoint expression, as specified by the
     user.  It is a string.  If the breakpoint does not have an
     expression (the breakpoint is not a watchpoint) the attribute's
     value is `None'.  This attribute is not writable.

 -- Variable: Breakpoint.condition
     This attribute holds the condition of the breakpoint, as specified
     by the user.  It is a string.  If there is no condition, this
     attribute's value is `None'.  This attribute is writable.

 -- Variable: Breakpoint.commands
     This attribute holds the commands attached to the breakpoint.  If
     there are commands, this attribute's value is a string holding all
     the commands, separated by newlines.  If there are no commands,
     this attribute is `None'.  This attribute is not writable.


File: gdb.info,  Node: Finish Breakpoints in Python,  Prev: Breakpoints In Python,  Up: Python API

23.2.2.21 Finish Breakpoints
............................

A finish breakpoint is a temporary breakpoint set at the return address
of a frame, based on the `finish' command.  `gdb.FinishBreakpoint'
extends `gdb.Breakpoint'.  The underlying breakpoint will be disabled
and deleted when the execution will run out of the breakpoint scope
(i.e.  `Breakpoint.stop' or `FinishBreakpoint.out_of_scope' triggered).
Finish breakpoints are thread specific and must be create with the right
thread selected.

 -- Function: FinishBreakpoint.__init__ ([frame] [, internal])
     Create a finish breakpoint at the return address of the `gdb.Frame'
     object FRAME.  If FRAME is not provided, this defaults to the
     newest frame.  The optional INTERNAL argument allows the
     breakpoint to become invisible to the user.  *Note Breakpoints In
     Python::, for further details about this argument.

 -- Function: FinishBreakpoint.out_of_scope (self)
     In some circumstances (e.g. `longjmp', C++ exceptions, GDB
     `return' command, ...), a function may not properly terminate, and
     thus never hit the finish breakpoint.  When GDB notices such a
     situation, the `out_of_scope' callback will be triggered.

     You may want to sub-class `gdb.FinishBreakpoint' and override this
     method:

          class MyFinishBreakpoint (gdb.FinishBreakpoint)
              def stop (self):
                  print "normal finish"
                  return True

              def out_of_scope ():
                  print "abnormal finish"

 -- Variable: FinishBreakpoint.return_value
     When GDB is stopped at a finish breakpoint and the frame used to
     build the `gdb.FinishBreakpoint' object had debug symbols, this
     attribute will contain a `gdb.Value' object corresponding to the
     return value of the function.  The value will be `None' if the
     function return type is `void' or if the return value was not
     computable.  This attribute is not writable.


File: gdb.info,  Node: Lazy Strings In Python,  Next: Breakpoints In Python,  Prev: Symbol Tables In Python,  Up: Python API

23.2.2.22 Python representation of lazy strings.
................................................

A "lazy string" is a string whose contents is not retrieved or encoded
until it is needed.

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

   A `gdb.LazyString' object has the following functions:

 -- Function: LazyString.value ()
     Convert the `gdb.LazyString' to a `gdb.Value'.  This value will
     point to the string in memory, but will lose all the delayed
     retrieval, encoding and handling that GDB applies to a
     `gdb.LazyString'.

 -- Variable: LazyString.address
     This attribute holds the address of the string.  This attribute is
     not writable.

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

 -- Variable: LazyString.encoding
     This attribute holds the encoding that will be applied to the
     string when the string is printed by GDB.  If the encoding is not
     set, or contains an empty string,  then GDB will select the most
     appropriate encoding when the string is printed.  This attribute
     is not writable.

 -- Variable: LazyString.type
     This attribute holds the type that is represented by the lazy
     string's type.  For a lazy string this will always be a pointer
     type.  To resolve this to the lazy string's character type, use
     the type's `target' method.  *Note Types In Python::.  This
     attribute is not writable.


File: gdb.info,  Node: Auto-loading,  Next: Python modules,  Prev: Python API,  Up: Python

23.2.3 Auto-loading
-------------------

When a new object file is read (for example, due to the `file' command,
or because the inferior has loaded a shared library), GDB will look for
Python support scripts in several ways: `OBJFILE-gdb.py' and
`.debug_gdb_scripts' section.

* Menu:

* objfile-gdb.py file::         The `OBJFILE-gdb.py' file
* .debug_gdb_scripts section::  The `.debug_gdb_scripts' section
* Which flavor to choose?::

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

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

`set auto-load-scripts [yes|no]'
     Enable or disable the auto-loading of Python scripts.

`show auto-load-scripts'
     Show whether auto-loading of Python scripts is enabled or disabled.

`info auto-load-scripts [REGEXP]'
     Print the list of all scripts that GDB auto-loaded.

     Also printed is the list of scripts that were mentioned in the
     `.debug_gdb_scripts' section and were not found (*note
     .debug_gdb_scripts section::).  This is useful because their names
     are not printed when GDB tries to load them and fails.  There may
     be many of them, and printing an error message for each one is
     problematic.

     If REGEXP is supplied only scripts with matching names are printed.

     Example:

          (gdb) info auto-load-scripts
          Loaded  Script
          Yes     py-section-script.py
                  full name: /tmp/py-section-script.py
          Missing my-foo-pretty-printers.py

   When reading an auto-loaded file, GDB sets the "current objfile".
This is available via the `gdb.current_objfile' function (*note
Objfiles In Python::).  This can be useful for registering
objfile-specific pretty-printers.


File: gdb.info,  Node: objfile-gdb.py file,  Next: .debug_gdb_scripts section,  Up: Auto-loading

23.2.3.1 The `OBJFILE-gdb.py' file
..................................

When a new object file is read, GDB looks for a file named
`OBJFILE-gdb.py', where OBJFILE is the object file's real name, formed
by ensuring that the file name is absolute, following all symlinks, and
resolving `.' and `..' components.  If this file exists and is
readable, GDB will evaluate it as a Python script.

   If this file does not exist, and if the parameter
`debug-file-directory' is set (*note Separate Debug Files::), then GDB
will look for REAL-NAME in all of the directories mentioned in the
value of `debug-file-directory'.

   Finally, if this file does not exist, then GDB will look for a file
named `DATA-DIRECTORY/python/auto-load/REAL-NAME', where DATA-DIRECTORY
is GDB's data directory (available via `show data-directory', *note
Data Files::), and REAL-NAME is the object file's real name, as
described above.

   GDB does not track which files it has already auto-loaded this way.
GDB will load the associated script every time the corresponding
OBJFILE is opened.  So your `-gdb.py' file should be careful to avoid
errors if it is evaluated more than once.


File: gdb.info,  Node: .debug_gdb_scripts section,  Next: Which flavor to choose?,  Prev: objfile-gdb.py file,  Up: Auto-loading

23.2.3.2 The `.debug_gdb_scripts' section
.........................................

For systems using file formats like ELF and COFF, when GDB loads a new
object file it will look for a special section named
`.debug_gdb_scripts'.  If this section exists, its contents is a list
of names of scripts to load.

   GDB will look for each specified script file first in the current
directory and then along the source search path (*note Specifying
Source Directories: Source Path.), except that `$cdir' is not searched,
since the compilation directory is not relevant to scripts.

   Entries can be placed in section `.debug_gdb_scripts' with, for
example, this GCC macro:

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

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

     DEFINE_GDB_SCRIPT ("my-app-scripts.py")

   The script name may include directories if desired.

   If the macro is put in a header, any application or library using
this header will get a reference to the specified script.


File: gdb.info,  Node: Which flavor to choose?,  Prev: .debug_gdb_scripts section,  Up: Auto-loading

23.2.3.3 Which flavor to choose?
................................

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

   Benefits of the `-gdb.py' way:

   * Can be used with file formats that don't support multiple sections.

   * Ease of finding scripts for public libraries.

     Scripts specified in the `.debug_gdb_scripts' section are searched
     for in the source search path.  For publicly installed libraries,
     e.g., `libstdc++', there typically isn't a source directory in
     which to find the script.

   * Doesn't require source code additions.

   Benefits of the `.debug_gdb_scripts' way:

   * Works with static linking.

     Scripts for libraries done the `-gdb.py' way require an objfile to
     trigger their loading.  When an application is statically linked
     the only objfile available is the executable, and it is cumbersome
     to attach all the scripts from all the input libraries to the
     executable's `-gdb.py' script.

   * Works with classes that are entirely inlined.

     Some classes can be entirely inlined, and thus there may not be an
     associated shared library to attach a `-gdb.py' script to.

   * Scripts needn't be copied out of the source tree.

     In some circumstances, apps can be built out of large collections
     of internal libraries, and the build infrastructure necessary to
     install the `-gdb.py' scripts in a place where GDB can find them is
     cumbersome.  It may be easier to specify the scripts in the
     `.debug_gdb_scripts' section as relative paths, and add a path to
     the top of the source tree to the source search path.


File: gdb.info,  Node: Python modules,  Prev: Auto-loading,  Up: Python

23.2.4 Python modules
---------------------

GDB comes with several modules to assist writing Python code.

* Menu:

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


File: gdb.info,  Node: gdb.printing,  Next: gdb.types,  Up: Python modules

23.2.4.1 gdb.printing
.....................

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

`PrettyPrinter (NAME, SUBPRINTERS=None)'
     This class specifies the API that makes `info pretty-printer',
     `enable pretty-printer' and `disable pretty-printer' work.
     Pretty-printers should generally inherit from this class.

`SubPrettyPrinter (NAME)'
     For printers that handle multiple types, this class specifies the
     corresponding API for the subprinters.

`RegexpCollectionPrettyPrinter (NAME)'
     Utility class for handling multiple printers, all recognized via
     regular expressions.  *Note Writing a Pretty-Printer::, for an
     example.

`register_pretty_printer (OBJ, PRINTER, REPLACE=False)'
     Register PRINTER with the pretty-printer list of OBJ.  If REPLACE
     is `True' then any existing copy of the printer is replaced.
     Otherwise a `RuntimeError' exception is raised if a printer with
     the same name already exists.


File: gdb.info,  Node: gdb.types,  Next: gdb.prompt,  Prev: gdb.printing,  Up: Python modules

23.2.4.2 gdb.types
..................

This module provides a collection of utilities for working with
`gdb.Types' objects.

`get_basic_type (TYPE)'
     Return TYPE with const and volatile qualifiers stripped, and with
     typedefs and C++ references converted to the underlying type.

     C++ example:

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

     Then in gdb:

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

`has_field (TYPE, FIELD)'
     Return `True' if TYPE, assumed to be a type with fields (e.g., a
     structure or union), has field FIELD.

`make_enum_dict (ENUM_TYPE)'
     Return a Python `dictionary' type produced from ENUM_TYPE.

`deep_items (TYPE)'
     Returns a Python iterator similar to the standard
     `gdb.Type.iteritems' method, except that the iterator returned by
     `deep_items' will recursively traverse anonymous struct or union
     fields.  For example:

          struct A
          {
              int a;
              union {
                  int b0;
                  int b1;
              };
          };

     Then in GDB:
          (gdb) python import gdb.types
          (gdb) python struct_a = gdb.lookup_type("struct A")
          (gdb) python print struct_a.keys ()
          {['a', '']}
          (gdb) python print [k for k,v in gdb.types.deep_items(struct_a)]
          {['a', 'b0', 'b1']}



File: gdb.info,  Node: gdb.prompt,  Prev: gdb.types,  Up: Python modules

23.2.4.3 gdb.prompt
...................

This module provides a method for prompt value-substitution.

`substitute_prompt (STRING)'
     Return STRING with escape sequences substituted by values.  Some
     escape sequences take arguments.  You can specify arguments inside
     "{}" immediately following the escape sequence.

     The escape sequences you can pass to this function are:

    `\\'
          Substitute a backslash.

    `\e'
          Substitute an ESC character.

    `\f'
          Substitute the selected frame; an argument names a frame
          parameter.

    `\n'
          Substitute a newline.

    `\p'
          Substitute a parameter's value; the argument names the
          parameter.

    `\r'
          Substitute a carriage return.

    `\t'
          Substitute the selected thread; an argument names a thread
          parameter.

    `\v'
          Substitute the version of GDB.

    `\w'
          Substitute the current working directory.

    `\['
          Begin a sequence of non-printing characters.  These sequences
          are typically used with the ESC character, and are not
          counted in the string length.  Example:
          "\[\e[0;34m\](gdb)\[\e[0m\]" will return a blue-colored
          "(gdb)" prompt where the length is five.

    `\]'
          End a sequence of non-printing characters.

     For example:

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

will return the string:


          "frame: main, print arguments: scalars"


File: gdb.info,  Node: Aliases,  Prev: Python,  Up: Extending GDB

23.3 Creating new spellings of existing commands
================================================

It is often useful to define alternate spellings of existing commands.
For example, if a new GDB command defined in Python has a long name to
type, it is handy to have an abbreviated version of it that involves
less typing.

   GDB itself uses aliases.  For example `s' is an alias of the `step'
command even though it is otherwise an ambiguous abbreviation of other
commands like `set' and `show'.

   Aliases are also used to provide shortened or more common versions
of multi-word commands.  For example, GDB provides the `tty' alias of
the `set inferior-tty' command.

   You can define a new alias with the `alias' command.

`alias [-a] [--] ALIAS = COMMAND'

   ALIAS specifies the name of the new alias.  Each word of ALIAS must
consist of letters, numbers, dashes and underscores.

   COMMAND specifies the name of an existing command that is being
aliased.

   The `-a' option specifies that the new alias is an abbreviation of
the command.  Abbreviations are not shown in command lists displayed by
the `help' command.

   The `--' option specifies the end of options, and is useful when
ALIAS begins with a dash.

   Here is a simple example showing how to make an abbreviation of a
command so that there is less to type.  Suppose you were tired of
typing `disas', the current shortest unambiguous abbreviation of the
`disassemble' command and you wanted an even shorter version named `di'.
The following will accomplish this.

     (gdb) alias -a di = disas

   Note that aliases are different from user-defined commands.  With a
user-defined command, you also need to write documentation for it with
the `document' command.  An alias automatically picks up the
documentation of the existing command.

   Here is an example where we make `elms' an abbreviation of
`elements' in the `set print elements' command.  This is to show that
you can make an abbreviation of any part of a command.

     (gdb) alias -a set print elms = set print elements
     (gdb) alias -a show print elms = show print elements
     (gdb) set p elms 20
     (gdb) show p elms
     Limit on string chars or array elements to print is 200.

   Note that if you are defining an alias of a `set' command, and you
want to have an alias for the corresponding `show' command, then you
need to define the latter separately.

   Unambiguously abbreviated commands are allowed in COMMAND and ALIAS,
just as they are normally.

     (gdb) alias -a set pr elms = set p ele

   Finally, here is an example showing the creation of a one word alias
for a more complex command.  This creates alias `spe' of the command
`set print elements'.

     (gdb) alias spe = set print elements
     (gdb) spe 20


File: gdb.info,  Node: Interpreters,  Next: TUI,  Prev: Extending GDB,  Up: Top

24 Command Interpreters
***********************

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

   GDB currently supports two command interpreters, the console
interpreter (sometimes called the command-line interpreter or CLI) and
the machine interface interpreter (or GDB/MI).  This manual describes
both of these interfaces in great detail.

   By default, GDB will start with the console interpreter.  However,
the user may choose to start GDB with another interpreter by specifying
the `-i' or `--interpreter' startup options.  Defined interpreters
include:

`console'
     The traditional console or command-line interpreter.  This is the
     most often used interpreter with GDB. With no interpreter
     specified at runtime, GDB will use this interpreter.

`mi'
     The newest GDB/MI interface (currently `mi2').  Used primarily by
     programs wishing to use GDB as a backend for a debugger GUI or an
     IDE.  For more information, see *note The GDB/MI Interface: GDB/MI.

`mi2'
     The current GDB/MI interface.

`mi1'
     The GDB/MI interface included in GDB 5.1, 5.2, and 5.3.


   The interpreter being used by GDB may not be dynamically switched at
runtime.  Although possible, this could lead to a very precarious
situation.  Consider an IDE using GDB/MI.  If a user enters the command
"interpreter-set console" in a console view, GDB would switch to using
the console interpreter, rendering the IDE inoperable!

   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 `interpreter-exec' command:

     interpreter-exec mi "-data-list-register-names"

   GDB/MI has a similar command, although it is only available in
versions of GDB which support GDB/MI version 2 (or greater).


File: gdb.info,  Node: TUI,  Next: Emacs,  Prev: Interpreters,  Up: Top

25 GDB Text User Interface
**************************

* Menu:

* TUI Overview::                TUI overview
* TUI Keys::                    TUI key bindings
* TUI Single Key Mode::         TUI single key mode
* TUI Commands::                TUI-specific commands
* TUI Configuration::           TUI configuration variables

   The GDB Text User Interface (TUI) is a terminal interface which uses
the `curses' library to show the source file, the assembly output, the
program registers and GDB commands in separate text windows.  The TUI
mode is supported only on platforms where a suitable version of the
`curses' library is available.

   The TUI mode is enabled by default when you invoke GDB as either
`gdbtui' or `gdb -tui'.  You can also switch in and out of TUI mode
while GDB runs by using various TUI commands and key bindings, such as
`C-x C-a'.  *Note TUI Key Bindings: TUI Keys.


File: gdb.info,  Node: TUI Overview,  Next: TUI Keys,  Up: TUI

25.1 TUI Overview
=================

In TUI mode, GDB can display several text windows:

_command_
     This window is the GDB command window with the GDB prompt and the
     GDB output.  The GDB input is still managed using readline.

_source_
     The source window shows the source file of the program.  The
     current line and active breakpoints are displayed in this window.

_assembly_
     The assembly window shows the disassembly output of the program.

_register_
     This window shows the processor registers.  Registers are
     highlighted when their values change.

   The source and assembly windows show the current program position by
highlighting the current line and marking it with a `>' marker.
Breakpoints are indicated with two markers.  The first marker indicates
the breakpoint type:

`B'
     Breakpoint which was hit at least once.

`b'
     Breakpoint which was never hit.

`H'
     Hardware breakpoint which was hit at least once.

`h'
     Hardware breakpoint which was never hit.

   The second marker indicates whether the breakpoint is enabled or not:

`+'
     Breakpoint is enabled.

`-'
     Breakpoint is disabled.

   The source, assembly and register windows are updated when the
current thread changes, when the frame changes, or when the program
counter changes.

   These windows are not all visible at the same time.  The command
window is always visible.  The others can be arranged in several
layouts:

   * source only,

   * assembly only,

   * source and assembly,

   * source and registers, or

   * assembly and registers.

   A status line above the command window shows the following
information:

_target_
     Indicates the current GDB target.  (*note Specifying a Debugging
     Target: Targets.).

_process_
     Gives the current process or thread number.  When no process is
     being debugged, this field is set to `No process'.

_function_
     Gives the current function name for the selected frame.  The name
     is demangled if demangling is turned on (*note Print Settings::).
     When there is no symbol corresponding to the current program
     counter, the string `??' is displayed.

_line_
     Indicates the current line number for the selected frame.  When
     the current line number is not known, the string `??' is displayed.

_pc_
     Indicates the current program counter address.


File: gdb.info,  Node: TUI Keys,  Next: TUI Single Key Mode,  Prev: TUI Overview,  Up: TUI

25.2 TUI Key Bindings
=====================

The TUI installs several key bindings in the readline keymaps (*note
Command Line Editing::).  The following key bindings are installed for
both TUI mode and the GDB standard mode.

`C-x C-a'
`C-x a'
`C-x A'
     Enter or leave the TUI mode.  When leaving the TUI mode, the
     curses window management stops and GDB operates using its standard
     mode, writing on the terminal directly.  When reentering the TUI
     mode, control is given back to the curses windows.  The screen is
     then refreshed.

`C-x 1'
     Use a TUI layout with only one window.  The layout will either be
     `source' or `assembly'.  When the TUI mode is not active, it will
     switch to the TUI mode.

     Think of this key binding as the Emacs `C-x 1' binding.

`C-x 2'
     Use a TUI layout with at least two windows.  When the current
     layout already has two windows, the next layout with two windows
     is used.  When a new layout is chosen, one window will always be
     common to the previous layout and the new one.

     Think of it as the Emacs `C-x 2' binding.

`C-x o'
     Change the active window.  The TUI associates several key bindings
     (like scrolling and arrow keys) with the active window.  This
     command gives the focus to the next TUI window.

     Think of it as the Emacs `C-x o' binding.

`C-x s'
     Switch in and out of the TUI SingleKey mode that binds single keys
     to GDB commands (*note TUI Single Key Mode::).

   The following key bindings only work in the TUI mode:

<PgUp>
     Scroll the active window one page up.

<PgDn>
     Scroll the active window one page down.

<Up>
     Scroll the active window one line up.

<Down>
     Scroll the active window one line down.

<Left>
     Scroll the active window one column left.

<Right>
     Scroll the active window one column right.

`C-L'
     Refresh the screen.

   Because the arrow keys scroll the active window in the TUI mode, they
are not available for their normal use by readline unless the command
window has the focus.  When another window is active, you must use
other readline key bindings such as `C-p', `C-n', `C-b' and `C-f' to
control the command window.


File: gdb.info,  Node: TUI Single Key Mode,  Next: TUI Commands,  Prev: TUI Keys,  Up: TUI

25.3 TUI Single Key Mode
========================

The TUI also provides a "SingleKey" mode, which binds several
frequently used GDB commands to single keys.  Type `C-x s' to switch
into this mode, where the following key bindings are used:

`c'
     continue

`d'
     down

`f'
     finish

`n'
     next

`q'
     exit the SingleKey mode.

`r'
     run

`s'
     step

`u'
     up

`v'
     info locals

`w'
     where

   Other keys temporarily switch to the GDB command prompt.  The key
that was pressed is inserted in the editing buffer so that it is
possible to type most GDB commands without interaction with the TUI
SingleKey mode.  Once the command is entered the TUI SingleKey mode is
restored.  The only way to permanently leave this mode is by typing `q'
or `C-x s'.


File: gdb.info,  Node: TUI Commands,  Next: TUI Configuration,  Prev: TUI Single Key Mode,  Up: TUI

25.4 TUI-specific Commands
==========================

The TUI has specific commands to control the text windows.  These
commands are always available, even when GDB is not in the TUI mode.
When GDB is in the standard mode, most of these commands will
automatically switch to the TUI mode.

   Note that if GDB's `stdout' is not connected to a terminal, or GDB
has been started with the machine interface interpreter (*note The
GDB/MI Interface: GDB/MI.), most of these commands will fail with an
error, because it would not be possible or desirable to enable curses
window management.

`info win'
     List and give the size of all displayed windows.

`layout next'
     Display the next layout.

`layout prev'
     Display the previous layout.

`layout src'
     Display the source window only.

`layout asm'
     Display the assembly window only.

`layout split'
     Display the source and assembly window.

`layout regs'
     Display the register window together with the source or assembly
     window.

`focus next'
     Make the next window active for scrolling.

`focus prev'
     Make the previous window active for scrolling.

`focus src'
     Make the source window active for scrolling.

`focus asm'
     Make the assembly window active for scrolling.

`focus regs'
     Make the register window active for scrolling.

`focus cmd'
     Make the command window active for scrolling.

`refresh'
     Refresh the screen.  This is similar to typing `C-L'.

`tui reg float'
     Show the floating point registers in the register window.

`tui reg general'
     Show the general registers in the register window.

`tui reg next'
     Show the next register group.  The list of register groups as well
     as their order is target specific.  The predefined register groups
     are the following: `general', `float', `system', `vector', `all',
     `save', `restore'.

`tui reg system'
     Show the system registers in the register window.

`update'
     Update the source window and the current execution point.

`winheight NAME +COUNT'
`winheight NAME -COUNT'
     Change the height of the window NAME by COUNT lines.  Positive
     counts increase the height, while negative counts decrease it.

`tabset NCHARS'
     Set the width of tab stops to be NCHARS characters.


File: gdb.info,  Node: TUI Configuration,  Prev: TUI Commands,  Up: TUI

25.5 TUI Configuration Variables
================================

Several configuration variables control the appearance of TUI windows.

`set tui border-kind KIND'
     Select the border appearance for the source, assembly and register
     windows.  The possible values are the following:
    `space'
          Use a space character to draw the border.

    `ascii'
          Use ASCII characters `+', `-' and `|' to draw the border.

    `acs'
          Use the Alternate Character Set to draw the border.  The
          border is drawn using character line graphics if the terminal
          supports them.

`set tui border-mode MODE'
`set tui active-border-mode MODE'
     Select the display attributes for the borders of the inactive
     windows or the active window.  The MODE can be one of the
     following:
    `normal'
          Use normal attributes to display the border.

    `standout'
          Use standout mode.

    `reverse'
          Use reverse video mode.

    `half'
          Use half bright mode.

    `half-standout'
          Use half bright and standout mode.

    `bold'
          Use extra bright or bold mode.

    `bold-standout'
          Use extra bright or bold and standout mode.


File: gdb.info,  Node: Emacs,  Next: GDB/MI,  Prev: TUI,  Up: Top

26 Using GDB under GNU Emacs
****************************

A special interface allows you to use GNU Emacs to view (and edit) the
source files for the program you are debugging with GDB.

   To use this interface, use the command `M-x gdb' in Emacs.  Give the
executable file you want to debug as an argument.  This command starts
GDB as a subprocess of Emacs, with input and output through a newly
created Emacs buffer.

   Running GDB under Emacs can be just like running GDB normally except
for two things:

   * All "terminal" input and output goes through an Emacs buffer,
     called the GUD buffer.

     This applies both to GDB 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, `C-c C-c' for an interrupt,
     `C-c C-z' for a stop.

   * GDB displays source code through Emacs.

     Each time GDB displays a stack frame, Emacs automatically finds the
     source file for that frame and puts an arrow (`=>') at the left
     margin of the current line.  Emacs uses a separate buffer for
     source display, and splits the screen to show both your GDB session
     and the source.

     Explicit GDB `list' or search commands still produce output as
     usual, but you probably have no reason to use them from Emacs.

   We call this "text command mode".  Emacs 22.1, and later, also uses
a graphical mode, enabled by default, which provides further buffers
that can control the execution and describe the state of your program.
*Note GDB Graphical Interface: (Emacs)GDB Graphical Interface.

   If you specify an absolute file name when prompted for the `M-x gdb'
argument, then Emacs sets your current working directory to where your
program resides.  If you only specify the file name, then Emacs sets
your current working directory to the directory associated with the
previous buffer.  In this case, GDB may find your program by searching
your environment's `PATH' variable, but on some operating systems it
might not find the source.  So, although the GDB input and output
session proceeds normally, the auxiliary buffer does not display the
current source and line of execution.

   The initial working directory of GDB is printed on the top line of
the GUD buffer and this serves as a default for the commands that
specify files for GDB to operate on.  *Note Commands to Specify Files:
Files.

   By default, `M-x gdb' calls the program called `gdb'.  If you need
to call GDB by a different name (for example, if you keep several
configurations around, with different names) you can customize the
Emacs variable `gud-gdb-command-name' to run the one you want.

   In the GUD buffer, you can use these special Emacs commands in
addition to the standard Shell mode commands:

`C-h m'
     Describe the features of Emacs' GUD Mode.

`C-c C-s'
     Execute to another source line, like the GDB `step' command; also
     update the display window to show the current file and location.

`C-c C-n'
     Execute to next source line in this function, skipping all function
     calls, like the GDB `next' command.  Then update the display window
     to show the current file and location.

`C-c C-i'
     Execute one instruction, like the GDB `stepi' command; update
     display window accordingly.

`C-c C-f'
     Execute until exit from the selected stack frame, like the GDB
     `finish' command.

`C-c C-r'
     Continue execution of your program, like the GDB `continue'
     command.

`C-c <'
     Go up the number of frames indicated by the numeric argument
     (*note Numeric Arguments: (Emacs)Arguments.), like the GDB `up'
     command.

`C-c >'
     Go down the number of frames indicated by the numeric argument,
     like the GDB `down' command.

   In any source file, the Emacs command `C-x <SPC>' (`gud-break')
tells GDB to set a breakpoint on the source line point is on.

   In text command mode, if you type `M-x speedbar', Emacs displays a
separate frame which shows a backtrace when the GUD buffer is current.
Move point to any frame in the stack and type <RET> to make it become
the current frame and display the associated source in the source
buffer.  Alternatively, click `Mouse-2' to make the selected frame
become the current one.  In graphical mode, the speedbar displays watch
expressions.

   If you accidentally delete the source-display buffer, an easy way to
get it back is to type the command `f' in the GDB 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 GDB
communicates with Emacs in terms of line numbers.  If you add or delete
lines from the text, the line numbers that GDB knows cease to
correspond properly with the code.

   A more detailed description of Emacs' interaction with GDB is given
in the Emacs manual (*note Debuggers: (Emacs)Debuggers.).


File: gdb.info,  Node: GDB/MI,  Next: Annotations,  Prev: Emacs,  Up: Top

27 The GDB/MI Interface
***********************

Function and Purpose
====================

GDB/MI is a line based machine oriented text interface to GDB and is
activated by specifying using the `--interpreter' command line option
(*note Mode Options::).  It is specifically intended to support the
development of systems which use the debugger as just one small
component of a larger system.

   This chapter is a specification of the GDB/MI interface.  It is
written in the form of a reference manual.

   Note that GDB/MI is still under construction, so some of the
features described below are incomplete and subject to change (*note
GDB/MI Development and Front Ends: GDB/MI Development and Front Ends.).

Notation and Terminology
========================

This chapter uses the following notation:

   * `|' separates two alternatives.

   * `[ SOMETHING ]' indicates that SOMETHING is optional: it may or
     may not be given.

   * `( GROUP )*' means that GROUP inside the parentheses may repeat
     zero or more times.

   * `( GROUP )+' means that GROUP inside the parentheses may repeat
     one or more times.

   * `"STRING"' means a literal STRING.

* Menu:

* GDB/MI General Design::
* GDB/MI Command Syntax::
* GDB/MI Compatibility with CLI::
* GDB/MI Development and Front Ends::
* GDB/MI Output Records::
* GDB/MI Simple Examples::
* GDB/MI Command Description Format::
* GDB/MI Breakpoint Commands::
* GDB/MI Program Context::
* GDB/MI Thread Commands::
* GDB/MI Ada Tasking Commands::
* GDB/MI Program Execution::
* GDB/MI Stack Manipulation::
* GDB/MI Variable Objects::
* GDB/MI Data Manipulation::
* GDB/MI Tracepoint Commands::
* GDB/MI Symbol Query::
* GDB/MI File Commands::
* GDB/MI Target Manipulation::
* GDB/MI File Transfer Commands::
* GDB/MI Miscellaneous Commands::


File: gdb.info,  Node: GDB/MI General Design,  Next: GDB/MI Command Syntax,  Up: GDB/MI

27.1 GDB/MI General Design
==========================

Interaction of a GDB/MI frontend with GDB involves three
parts--commands sent to GDB, responses to those commands and
notifications.  Each command results in exactly one response,
indicating either successful completion of the command, or an error.
For the commands that do not resume the target, the response contains
the requested information.  For the commands that resume the target, the
response only indicates whether the target was successfully resumed.
Notifications is the mechanism for reporting changes in the state of the
target, or in GDB state, that cannot conveniently be associated with a
command and reported as part of that command response.

   The important examples of notifications are:
   * Exec notifications.  These are used to report changes in target
     state--when a target is resumed, or stopped.  It would not be
     feasible to include this information in response of resuming
     commands, because one resume commands can result in multiple
     events in different threads.  Also, quite some time may pass
     before any event happens in the target, while a frontend needs to
     know whether the resuming command itself was successfully executed.

   * Console output, and status notifications.  Console output
     notifications are used to report output of CLI commands, as well as
     diagnostics for other commands.  Status notifications are used to
     report the progress of a long-running operation.  Naturally,
     including this information in command response would mean no
     output is produced until the command is finished, which is
     undesirable.

   * General notifications.  Commands may have various side effects on
     the GDB or target state beyond their official purpose.  For
     example, a command may change the selected thread.  Although such
     changes can be included in command response, using notification
     allows for more orthogonal frontend design.


   There's no guarantee that whenever an MI command reports an error,
GDB or the target are in any specific state, and especially, the state
is not reverted to the state before the MI command was processed.
Therefore, whenever an MI command results in an error, we recommend
that the frontend refreshes all the information shown in the user
interface.

* Menu:

* Context management::
* Asynchronous and non-stop modes::
* Thread groups::


File: gdb.info,  Node: Context management,  Next: Asynchronous and non-stop modes,  Up: GDB/MI General Design

27.1.1 Context management
-------------------------

In most cases when GDB accesses the target, this access is done in
context of a specific thread and frame (*note Frames::).  Often, even
when accessing global data, the target requires that a thread be
specified.  The CLI interface maintains the selected thread and frame,
and supplies them to target on each command.  This is convenient,
because a command line user would not want to specify that information
explicitly on each command, and because user interacts with GDB via a
single terminal, so no confusion is possible as to what thread and
frame are the current ones.

   In the case of MI, the concept of selected thread and frame is less
useful.  First, a frontend can easily remember this information itself.
Second, a graphical frontend can have more than one window, each one
used for debugging a different thread, and the frontend might want to
access additional threads for internal purposes.  This increases the
risk that by relying on implicitly selected thread, the frontend may be
operating on a wrong one.  Therefore, each MI command should explicitly
specify which thread and frame to operate on.  To make it possible,
each MI command accepts the `--thread' and `--frame' options, the value
to each is GDB identifier for thread and frame to operate on.

   Usually, each top-level window in a frontend allows the user to
select a thread and a frame, and remembers the user selection for
further operations.  However, in some cases GDB may suggest that the
current thread be changed.  For example, when stopping on a breakpoint
it is reasonable to switch to the thread where breakpoint is hit.  For
another example, if the user issues the CLI `thread' command via the
frontend, it is desirable to change the frontend's selected thread to
the one specified by user.  GDB communicates the suggestion to change
current thread using the `=thread-selected' notification.  No such
notification is available for the selected frame at the moment.

   Note that historically, MI shares the selected thread with CLI, so
frontends used the `-thread-select' to execute commands in the right
context.  However, getting this to work right is cumbersome.  The
simplest way is for frontend to emit `-thread-select' command before
every command.  This doubles the number of commands that need to be
sent.  The alternative approach is to suppress `-thread-select' if the
selected thread in GDB is supposed to be identical to the thread the
frontend wants to operate on.  However, getting this optimization right
can be tricky.  In particular, if the frontend sends several commands
to GDB, and one of the commands changes the selected thread, then the
behaviour of subsequent commands will change.  So, a frontend should
either wait for response from such problematic commands, or explicitly
add `-thread-select' for all subsequent commands.  No frontend is known
to do this exactly right, so it is suggested to just always pass the
`--thread' and `--frame' options.


File: gdb.info,  Node: Asynchronous and non-stop modes,  Next: Thread groups,  Prev: Context management,  Up: GDB/MI General Design

27.1.2 Asynchronous command execution and non-stop mode
-------------------------------------------------------

On some targets, GDB is capable of processing MI commands even while
the target is running.  This is called "asynchronous command execution"
(*note Background Execution::).  The frontend may specify a preferrence
for asynchronous execution using the `-gdb-set target-async 1' command,
which should be emitted before either running the executable or
attaching to the target.  After the frontend has started the executable
or attached to the target, it can find if asynchronous execution is
enabled using the `-list-target-features' command.

   Even if GDB can accept a command while target is running, many
commands that access the target do not work when the target is running.
Therefore, asynchronous command execution is most useful when combined
with non-stop mode (*note Non-Stop Mode::).  Then, it is possible to
examine the state of one thread, while other threads are running.

   When a given thread is running, MI commands that try to access the
target in the context of that thread may not work, or may work only on
some targets.  In particular, commands that try to operate on thread's
stack will not work, on any target.  Commands that read memory, or
modify breakpoints, may work or not work, depending on the target.  Note
that even commands that operate on global state, such as `print',
`set', and breakpoint commands, still access the target in the context
of a specific thread,  so frontend should try to find a stopped thread
and perform the operation on that thread (using the `--thread' option).

   Which commands will work in the context of a running thread is
highly target dependent.  However, the two commands `-exec-interrupt',
to stop a thread, and `-thread-info', to find the state of a thread,
will always work.


File: gdb.info,  Node: Thread groups,  Prev: Asynchronous and non-stop modes,  Up: GDB/MI General Design

27.1.3 Thread groups
--------------------

GDB may be used to debug several processes at the same time.  On some
platfroms, GDB may support debugging of several hardware systems, each
one having several cores with several different processes running on
each core.  This section describes the MI mechanism to support such
debugging scenarios.

   The key observation is that regardless of the structure of the
target, MI can have a global list of threads, because most commands that
accept the `--thread' option do not need to know what process that
thread belongs to.  Therefore, it is not necessary to introduce neither
additional `--process' option, nor an notion of the current process in
the MI interface.  The only strictly new feature that is required is
the ability to find how the threads are grouped into processes.

   To allow the user to discover such grouping, and to support arbitrary
hierarchy of machines/cores/processes, MI introduces the concept of a
"thread group".  Thread group is a collection of threads and other
thread groups.  A thread group always has a string identifier, a type,
and may have additional attributes specific to the type.  A new
command, `-list-thread-groups', returns the list of top-level thread
groups, which correspond to processes that GDB is debugging at the
moment.  By passing an identifier of a thread group to the
`-list-thread-groups' command, it is possible to obtain the members of
specific thread group.

   To allow the user to easily discover processes, and other objects, he
wishes to debug, a concept of "available thread group" is introduced.
Available thread group is an thread group that GDB is not debugging,
but that can be attached to, using the `-target-attach' command.  The
list of available top-level thread groups can be obtained using
`-list-thread-groups --available'.  In general, the content of a thread
group may be only retrieved only after attaching to that thread group.

   Thread groups are related to inferiors (*note Inferiors and
Programs::).  Each inferior corresponds to a thread group of a special
type `process', and some additional operations are permitted on such
thread groups.


File: gdb.info,  Node: GDB/MI Command Syntax,  Next: GDB/MI Compatibility with CLI,  Prev: GDB/MI General Design,  Up: GDB/MI

27.2 GDB/MI Command Syntax
==========================

* Menu:

* GDB/MI Input Syntax::
* GDB/MI Output Syntax::


File: gdb.info,  Node: GDB/MI Input Syntax,  Next: GDB/MI Output Syntax,  Up: GDB/MI Command Syntax

27.2.1 GDB/MI Input Syntax
--------------------------

`COMMAND ==>'
     `CLI-COMMAND | MI-COMMAND'

`CLI-COMMAND ==>'
     `[ TOKEN ] CLI-COMMAND NL', where CLI-COMMAND is any existing GDB
     CLI command.

`MI-COMMAND ==>'
     `[ TOKEN ] "-" OPERATION ( " " OPTION )* `[' " --" `]' ( " "
     PARAMETER )* NL'

`TOKEN ==>'
     "any sequence of digits"

`OPTION ==>'
     `"-" PARAMETER [ " " PARAMETER ]'

`PARAMETER ==>'
     `NON-BLANK-SEQUENCE | C-STRING'

`OPERATION ==>'
     _any of the operations described in this chapter_

`NON-BLANK-SEQUENCE ==>'
     _anything, provided it doesn't contain special characters such as
     "-", NL, """ and of course " "_

`C-STRING ==>'
     `""" SEVEN-BIT-ISO-C-STRING-CONTENT """'

`NL ==>'
     `CR | CR-LF'

Notes:

   * The CLI commands are still handled by the MI interpreter; their
     output is described below.

   * The `TOKEN', when present, is passed back when the command
     finishes.

   * Some MI commands accept optional arguments as part of the parameter
     list.  Each option is identified by a leading `-' (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 `--' (this is useful when some parameters begin with a dash).

   Pragmatics:

   * We want easy access to the existing CLI syntax (for debugging).

   * We want it to be easy to spot a MI operation.


File: gdb.info,  Node: GDB/MI Output Syntax,  Prev: GDB/MI Input Syntax,  Up: GDB/MI Command Syntax

27.2.2 GDB/MI Output Syntax
---------------------------

The output from 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 `(gdb)'.

   If an input command was prefixed with a `TOKEN' then the
corresponding output for that command will also be prefixed by that same
TOKEN.

`OUTPUT ==>'
     `( OUT-OF-BAND-RECORD )* [ RESULT-RECORD ] "(gdb)" NL'

`RESULT-RECORD ==>'
     ` [ TOKEN ] "^" RESULT-CLASS ( "," RESULT )* NL'

`OUT-OF-BAND-RECORD ==>'
     `ASYNC-RECORD | STREAM-RECORD'

`ASYNC-RECORD ==>'
     `EXEC-ASYNC-OUTPUT | STATUS-ASYNC-OUTPUT | NOTIFY-ASYNC-OUTPUT'

`EXEC-ASYNC-OUTPUT ==>'
     `[ TOKEN ] "*" ASYNC-OUTPUT'

`STATUS-ASYNC-OUTPUT ==>'
     `[ TOKEN ] "+" ASYNC-OUTPUT'

`NOTIFY-ASYNC-OUTPUT ==>'
     `[ TOKEN ] "=" ASYNC-OUTPUT'

`ASYNC-OUTPUT ==>'
     `ASYNC-CLASS ( "," RESULT )* NL'

`RESULT-CLASS ==>'
     `"done" | "running" | "connected" | "error" | "exit"'

`ASYNC-CLASS ==>'
     `"stopped" | OTHERS' (where OTHERS will be added depending on the
     needs--this is still in development).

`RESULT ==>'
     ` VARIABLE "=" VALUE'

`VARIABLE ==>'
     ` STRING '

`VALUE ==>'
     ` CONST | TUPLE | LIST '

`CONST ==>'
     `C-STRING'

`TUPLE ==>'
     ` "{}" | "{" RESULT ( "," RESULT )* "}" '

`LIST ==>'
     ` "[]" | "[" VALUE ( "," VALUE )* "]" | "[" RESULT ( "," RESULT )*
     "]" '

`STREAM-RECORD ==>'
     `CONSOLE-STREAM-OUTPUT | TARGET-STREAM-OUTPUT | LOG-STREAM-OUTPUT'

`CONSOLE-STREAM-OUTPUT ==>'
     `"~" C-STRING'

`TARGET-STREAM-OUTPUT ==>'
     `"@" C-STRING'

`LOG-STREAM-OUTPUT ==>'
     `"&" C-STRING'

`NL ==>'
     `CR | CR-LF'

`TOKEN ==>'
     _any sequence of digits_.

Notes:

   * All output sequences end in a single line containing a period.

   * The `TOKEN' is from the corresponding request.  Note that for all
     async output, while the token is allowed by the grammar and may be
     output by future versions of GDB for select async output messages,
     it is generally omitted.  Frontends should treat all async output
     as reporting general changes in the state of the target and there
     should be no need to associate async output to any prior command.

   * 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 `+'.

   * EXEC-ASYNC-OUTPUT contains asynchronous state change on the target
     (stopped, started, disappeared).  All async output is prefixed by
     `*'.

   * NOTIFY-ASYNC-OUTPUT contains supplementary information that the
     client should handle (e.g., a new breakpoint information).  All
     notify output is prefixed by `='.

   * 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 `~'.

   * TARGET-STREAM-OUTPUT is the output produced by the target program.
     All the target output is prefixed by `@'.

   * LOG-STREAM-OUTPUT is output text coming from GDB's internals, for
     instance messages that should be displayed as part of an error
     log.  All the log output is prefixed by `&'.

   * New GDB/MI commands should only output LISTS containing VALUES.


   *Note GDB/MI Stream Records: GDB/MI Stream Records, for more details
about the various output records.


File: gdb.info,  Node: GDB/MI Compatibility with CLI,  Next: GDB/MI Development and Front Ends,  Prev: GDB/MI Command Syntax,  Up: GDB/MI

27.3 GDB/MI Compatibility with CLI
==================================

For the developers convenience CLI commands can be entered directly,
but there may be some unexpected behaviour.  For example, commands that
query the user will behave as if the user replied yes, breakpoint
command lists are not executed and some CLI commands, such as `if',
`when' and `define', prompt for further input with `>', which is not
valid MI output.

   This feature may be removed at some stage in the future and it is
recommended that front ends use the `-interpreter-exec' command (*note
-interpreter-exec::).


File: gdb.info,  Node: GDB/MI Development and Front Ends,  Next: GDB/MI Output Records,  Prev: GDB/MI Compatibility with CLI,  Up: GDB/MI

27.4 GDB/MI Development and Front Ends
======================================

The application which takes the MI output and presents the state of the
program being debugged to the user is called a "front end".

   Although GDB/MI is still incomplete, it is currently being used by a
variety of front ends to GDB.  This makes it difficult to introduce new
functionality without breaking existing usage.  This section tries to
minimize the problems by describing how the protocol might change.

   Some changes in MI need not break a carefully designed front end, and
for these the MI version will remain unchanged.  The following is a
list of changes that may occur within one level, so front ends should
parse MI output in a way that can handle them:

   * New MI commands may be added.

   * New fields may be added to the output of any MI command.

   * The range of values for fields with specified values, e.g.,
     `in_scope' (*note -var-update::) may be extended.


   If the changes are likely to break front ends, the MI version level
will be increased by one.  This will allow the front end to parse the
output according to the MI version.  Apart from mi0, new versions of
GDB will not support old versions of MI and it will be the
responsibility of the front end to work with the new one.

   The best way to avoid unexpected changes in MI that might break your
front end is to make your project known to GDB developers and follow
development on <gdb@sourceware.org> and <gdb-patches@sourceware.org>.  


File: gdb.info,  Node: GDB/MI Output Records,  Next: GDB/MI Simple Examples,  Prev: GDB/MI Development and Front Ends,  Up: GDB/MI

27.5 GDB/MI Output Records
==========================

* Menu:

* GDB/MI Result Records::
* GDB/MI Stream Records::
* GDB/MI Async Records::
* GDB/MI Frame Information::
* GDB/MI Thread Information::
* GDB/MI Ada Exception Information::


File: gdb.info,  Node: GDB/MI Result Records,  Next: GDB/MI Stream Records,  Up: GDB/MI Output Records

27.5.1 GDB/MI Result Records
----------------------------

In addition to a number of out-of-band notifications, the response to a
GDB/MI command includes one of the following result indications:

`"^done" [ "," RESULTS ]'
     The synchronous operation was successful, `RESULTS' are the return
     values.

`"^running"'
     This result record is equivalent to `^done'.  Historically, it was
     output instead of `^done' if the command has resumed the target.
     This behaviour is maintained for backward compatibility, but all
     frontends should treat `^done' and `^running' identically and rely
     on the `*running' output record to determine which threads are
     resumed.

`"^connected"'
     GDB has connected to a remote target.

`"^error" "," C-STRING'
     The operation failed.  The `C-STRING' contains the corresponding
     error message.

`"^exit"'
     GDB has terminated.



File: gdb.info,  Node: GDB/MI Stream Records,  Next: GDB/MI Async Records,  Prev: GDB/MI Result Records,  Up: GDB/MI Output Records

27.5.2 GDB/MI Stream Records
----------------------------

GDB 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 GDB/MI interface using "stream records".

   Each stream record begins with a unique "prefix character" which
identifies its stream (*note GDB/MI Output Syntax: GDB/MI Output
Syntax.).  In addition to the prefix, each stream record contains a
`STRING-OUTPUT'.  This is either raw text (with an implicit new line)
or a quoted C string (which does not contain an implicit newline).

`"~" 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.

`"@" STRING-OUTPUT'
     The target output stream contains any textual output from the
     running target.  This is only present when GDB's event loop is
     truly asynchronous, which is currently only the case for remote
     targets.

`"&" STRING-OUTPUT'
     The log stream contains debugging messages being produced by GDB's
     internals.


File: gdb.info,  Node: GDB/MI Async Records,  Next: GDB/MI Frame Information,  Prev: GDB/MI Stream Records,  Up: GDB/MI Output Records

27.5.3 GDB/MI Async Records
---------------------------

"Async" records are used to notify the GDB/MI client of additional
changes that have occurred.  Those changes can either be a consequence
of GDB/MI commands (e.g., a breakpoint modified) or a result of target
activity (e.g., target stopped).

   The following is the list of possible async records:

`*running,thread-id="THREAD"'
     The target is now running.  The THREAD field tells which specific
     thread is now running, and can be `all' if all threads are
     running.  The frontend should assume that no interaction with a
     running thread is possible after this notification is produced.
     The frontend should not assume that this notification is output
     only once for any command.  GDB may emit this notification several
     times, either for different threads, because it cannot resume all
     threads together, or even for a single thread, if the thread must
     be stepped though some code before letting it run freely.

`*stopped,reason="REASON",thread-id="ID",stopped-threads="STOPPED",core="CORE"'
     The target has stopped.  The REASON field can have one of the
     following values:

    `breakpoint-hit'
          A breakpoint was reached.

    `watchpoint-trigger'
          A watchpoint was triggered.

    `read-watchpoint-trigger'
          A read watchpoint was triggered.

    `access-watchpoint-trigger'
          An access watchpoint was triggered.

    `function-finished'
          An -exec-finish or similar CLI command was accomplished.

    `location-reached'
          An -exec-until or similar CLI command was accomplished.

    `watchpoint-scope'
          A watchpoint has gone out of scope.

    `end-stepping-range'
          An -exec-next, -exec-next-instruction, -exec-step,
          -exec-step-instruction or similar CLI command was
          accomplished.

    `exited-signalled'
          The inferior exited because of a signal.

    `exited'
          The inferior exited.

    `exited-normally'
          The inferior exited normally.

    `signal-received'
          A signal was received by the inferior.

    `solib-event'
          The inferior has stopped due to a library being loaded or
          unloaded.  This can only happen when `stop-on-solib-events'
          (*note Files::) is set.

    `fork'
          The inferior has forked.  This is reported when `catch fork'
          (*note Set Catchpoints::) has been used.

    `vfork'
          The inferior has vforked.  This is reported in when `catch
          vfork' (*note Set Catchpoints::) has been used.

    `syscall-entry'
          The inferior entered a system call.  This is reported when
          `catch syscall' (*note Set Catchpoints::) has been used.

    `syscall-entry'
          The inferior returned from a system call.  This is reported
          when `catch syscall' (*note Set Catchpoints::) has been used.

    `exec'
          The inferior called `exec'.  This is reported when `catch
          exec' (*note Set Catchpoints::) has been used.

     The ID field identifies the thread that directly caused the stop -
     for example by hitting a breakpoint.  Depending on whether all-stop
     mode is in effect (*note All-Stop Mode::), GDB may either stop all
     threads, or only the thread that directly triggered the stop.  If
     all threads are stopped, the STOPPED field will have the value of
     `"all"'.  Otherwise, the value of the STOPPED field will be a list
     of thread identifiers.  Presently, this list will always include a
     single thread, but frontend should be prepared to see several
     threads in the list.  The CORE field reports the processor core on
     which the stop event has happened.  This field may be absent if
     such information is not available.

`=thread-group-added,id="ID"'
`=thread-group-removed,id="ID"'
     A thread group was either added or removed.  The ID field contains
     the GDB identifier of the thread group.  When a thread group is
     added, it generally might not be associated with a running
     process.  When a thread group is removed, its id becomes invalid
     and cannot be used in any way.

`=thread-group-started,id="ID",pid="PID"'
     A thread group became associated with a running program, either
     because the program was just started or the thread group was
     attached to a program.  The ID field contains the GDB identifier
     of the thread group.  The PID field contains process identifier,
     specific to the operating system.

`=thread-group-exited,id="ID"[,exit-code="CODE"]'
     A thread group is no longer associated with a running program,
     either because the program has exited, or because it was detached
     from.  The ID field contains the GDB identifier of the thread
     group.  CODE is the exit code of the inferior; it exists only when
     the inferior exited with some code.

`=thread-created,id="ID",group-id="GID"'
`=thread-exited,id="ID",group-id="GID"'
     A thread either was created, or has exited.  The ID field contains
     the GDB identifier of the thread.  The GID field identifies the
     thread group this thread belongs to.

`=thread-selected,id="ID"'
     Informs that the selected thread was changed as result of the last
     command.  This notification is not emitted as result of
     `-thread-select' command but is emitted whenever an MI command
     that is not documented to change the selected thread actually
     changes it.  In particular, invoking, directly or indirectly (via
     user-defined command), the CLI `thread' command, will generate
     this notification.

     We suggest that in response to this notification, front ends
     highlight the selected thread and cause subsequent commands to
     apply to that thread.

`=library-loaded,...'
     Reports that a new library file was loaded by the program.  This
     notification has 4 fields--ID, TARGET-NAME, HOST-NAME, and
     SYMBOLS-LOADED.  The ID field is an opaque identifier of the
     library.  For remote debugging case, TARGET-NAME and HOST-NAME
     fields give the name of the library file on the target, and on the
     host respectively.  For native debugging, both those fields have
     the same value.  The SYMBOLS-LOADED field is emitted only for
     backward compatibility and should not be relied on to convey any
     useful information.  The THREAD-GROUP field, if present, specifies
     the id of the thread group in whose context the library was
     loaded.  If the field is absent, it means the library was loaded
     in the context of all present thread groups.

`=library-unloaded,...'
     Reports that a library was unloaded by the program.  This
     notification has 3 fields--ID, TARGET-NAME and HOST-NAME with the
     same meaning as for the `=library-loaded' notification.  The
     THREAD-GROUP field, if present, specifies the id of the thread
     group in whose context the library was unloaded.  If the field is
     absent, it means the library was unloaded in the context of all
     present thread groups.

`=breakpoint-created,bkpt={...}'
`=breakpoint-modified,bkpt={...}'
`=breakpoint-deleted,bkpt={...}'
     Reports that a breakpoint was created, modified, or deleted,
     respectively.  Only user-visible breakpoints are reported to the MI
     user.

     The BKPT argument is of the same form as returned by the various
     breakpoint commands; *Note GDB/MI Breakpoint Commands::.

     Note that if a breakpoint is emitted in the result record of a
     command, then it will not also be emitted in an async record.



File: gdb.info,  Node: GDB/MI Frame Information,  Next: GDB/MI Thread Information,  Prev: GDB/MI Async Records,  Up: GDB/MI Output Records

27.5.4 GDB/MI Frame Information
-------------------------------

Response from many MI commands includes an information about stack
frame.  This information is a tuple that may have the following fields:

`level'
     The level of the stack frame.  The innermost frame has the level of
     zero.  This field is always present.

`func'
     The name of the function corresponding to the frame.  This field
     may be absent if GDB is unable to determine the function name.

`addr'
     The code address for the frame.  This field is always present.

`file'
     The name of the source files that correspond to the frame's code
     address.  This field may be absent.

`line'
     The source line corresponding to the frames' code address.  This
     field may be absent.

`from'
     The name of the binary file (either executable or shared library)
     the corresponds to the frame's code address.  This field may be
     absent.



File: gdb.info,  Node: GDB/MI Thread Information,  Next: GDB/MI Ada Exception Information,  Prev: GDB/MI Frame Information,  Up: GDB/MI Output Records

27.5.5 GDB/MI Thread Information
--------------------------------

Whenever GDB has to report an information about a thread, it uses a
tuple with the following fields:

`id'
     The numeric id assigned to the thread by GDB.  This field is
     always present.

`target-id'
     Target-specific string identifying the thread.  This field is
     always present.

`details'
     Additional information about the thread provided by the target.
     It is supposed to be human-readable and not interpreted by the
     frontend.  This field is optional.

`state'
     Either `stopped' or `running', depending on whether the thread is
     presently running.  This field is always present.

`core'
     The value of this field is an integer number of the processor core
     the thread was last seen on.  This field is optional.


File: gdb.info,  Node: GDB/MI Ada Exception Information,  Prev: GDB/MI Thread Information,  Up: GDB/MI Output Records

27.5.6 GDB/MI Ada Exception Information
---------------------------------------

Whenever a `*stopped' record is emitted because the program stopped
after hitting an exception catchpoint (*note Set Catchpoints::), GDB
provides the name of the exception that was raised via the
`exception-name' field.


File: gdb.info,  Node: GDB/MI Simple Examples,  Next: GDB/MI Command Description Format,  Prev: GDB/MI Output Records,  Up: GDB/MI

27.6 Simple Examples of GDB/MI Interaction
==========================================

This subsection presents several simple examples of interaction using
the GDB/MI interface.  In these examples, `->' means that the following
line is passed to GDB/MI as input, while `<-' means the output received
from GDB/MI.

   Note the line breaks shown in the examples are here only for
readability, they don't appear in the real output.

Setting a Breakpoint
--------------------

Setting a breakpoint generates synchronous output which contains
detailed information of the breakpoint.

     -> -break-insert main
     <- ^done,bkpt={number="1",type="breakpoint",disp="keep",
         enabled="y",addr="0x08048564",func="main",file="myprog.c",
         fullname="/home/nickrob/myprog.c",line="68",times="0"}
     <- (gdb)

Program Execution
-----------------

Program execution generates asynchronous records and MI gives the
reason that execution stopped.

     -> -exec-run
     <- ^running
     <- (gdb)
     <- *stopped,reason="breakpoint-hit",disp="keep",bkptno="1",thread-id="0",
        frame={addr="0x08048564",func="main",
        args=[{name="argc",value="1"},{name="argv",value="0xbfc4d4d4"}],
        file="myprog.c",fullname="/home/nickrob/myprog.c",line="68"}
     <- (gdb)
     -> -exec-continue
     <- ^running
     <- (gdb)
     <- *stopped,reason="exited-normally"
     <- (gdb)

Quitting GDB
------------

Quitting GDB just prints the result class `^exit'.

     -> (gdb)
     <- -gdb-exit
     <- ^exit

   Please note that `^exit' is printed immediately, but it might take
some time for GDB to actually exit.  During that time, GDB performs
necessary cleanups, including killing programs being debugged or
disconnecting from debug hardware, so the frontend should wait till GDB
exits and should only forcibly kill GDB if it fails to exit in
reasonable time.

A Bad Command
-------------

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

     -> -rubbish
     <- ^error,msg="Undefined MI command: rubbish"
     <- (gdb)


File: gdb.info,  Node: GDB/MI Command Description Format,  Next: GDB/MI Breakpoint Commands,  Prev: GDB/MI Simple Examples,  Up: GDB/MI

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

Motivation
----------

The motivation for this collection of commands.

Introduction
------------

A brief introduction to this collection of commands as a whole.

Commands
--------

For each command in the block, the following is described:

Synopsis
........

      -command ARGS...

Result
......

GDB Command
...........

The corresponding GDB CLI command(s), if any.

Example
.......

Example(s) formatted for readability.  Some of the described commands
have not been implemented yet and these are labeled N.A. (not
available).


File: gdb.info,  Node: GDB/MI Breakpoint Commands,  Next: GDB/MI Program Context,  Prev: GDB/MI Command Description Format,  Up: GDB/MI

27.8 GDB/MI Breakpoint Commands
===============================

This section documents GDB/MI commands for manipulating breakpoints.

The `-break-after' Command
--------------------------

Synopsis
........

      -break-after NUMBER COUNT

   The breakpoint number NUMBER is not in effect until it has been hit
COUNT times.  To see how this is reflected in the output of the
`-break-list' command, see the description of the `-break-list' command
below.

GDB Command
...........

The corresponding GDB command is `ignore'.

Example
.......

     (gdb)
     -break-insert main
     ^done,bkpt={number="1",type="breakpoint",disp="keep",
     enabled="y",addr="0x000100d0",func="main",file="hello.c",
     fullname="/home/foo/hello.c",line="5",times="0"}
     (gdb)
     -break-after 1 3
     ~
     ^done
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="1",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x000100d0",func="main",file="hello.c",fullname="/home/foo/hello.c",
     line="5",times="0",ignore="3"}]}
     (gdb)

The `-break-commands' Command
-----------------------------

Synopsis
........

      -break-commands NUMBER [ COMMAND1 ... COMMANDN ]

   Specifies the CLI commands that should be executed when breakpoint
NUMBER is hit.  The parameters COMMAND1 to COMMANDN are the commands.
If no command is specified, any previously-set commands are cleared.
*Note Break Commands::.  Typical use of this functionality is tracing a
program, that is, printing of values of some variables whenever
breakpoint is hit and then continuing.

GDB Command
...........

The corresponding GDB command is `commands'.

Example
.......

     (gdb)
     -break-insert main
     ^done,bkpt={number="1",type="breakpoint",disp="keep",
     enabled="y",addr="0x000100d0",func="main",file="hello.c",
     fullname="/home/foo/hello.c",line="5",times="0"}
     (gdb)
     -break-commands 1 "print v" "continue"
     ^done
     (gdb)

The `-break-condition' Command
------------------------------

Synopsis
........

      -break-condition NUMBER EXPR

   Breakpoint NUMBER will stop the program only if the condition in
EXPR is true.  The condition becomes part of the `-break-list' output
(see the description of the `-break-list' command below).

GDB Command
...........

The corresponding GDB command is `condition'.

Example
.......

     (gdb)
     -break-condition 1 1
     ^done
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="1",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x000100d0",func="main",file="hello.c",fullname="/home/foo/hello.c",
     line="5",cond="1",times="0",ignore="3"}]}
     (gdb)

The `-break-delete' Command
---------------------------

Synopsis
........

      -break-delete ( BREAKPOINT )+

   Delete the breakpoint(s) whose number(s) are specified in the
argument list.  This is obviously reflected in the breakpoint list.

GDB Command
...........

The corresponding GDB command is `delete'.

Example
.......

     (gdb)
     -break-delete 1
     ^done
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="0",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[]}
     (gdb)

The `-break-disable' Command
----------------------------

Synopsis
........

      -break-disable ( BREAKPOINT )+

   Disable the named BREAKPOINT(s).  The field `enabled' in the break
list is now set to `n' for the named BREAKPOINT(s).

GDB Command
...........

The corresponding GDB command is `disable'.

Example
.......

     (gdb)
     -break-disable 2
     ^done
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="1",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="2",type="breakpoint",disp="keep",enabled="n",
     addr="0x000100d0",func="main",file="hello.c",fullname="/home/foo/hello.c",
     line="5",times="0"}]}
     (gdb)

The `-break-enable' Command
---------------------------

Synopsis
........

      -break-enable ( BREAKPOINT )+

   Enable (previously disabled) BREAKPOINT(s).

GDB Command
...........

The corresponding GDB command is `enable'.

Example
.......

     (gdb)
     -break-enable 2
     ^done
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="1",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="2",type="breakpoint",disp="keep",enabled="y",
     addr="0x000100d0",func="main",file="hello.c",fullname="/home/foo/hello.c",
     line="5",times="0"}]}
     (gdb)

The `-break-info' Command
-------------------------

Synopsis
........

      -break-info BREAKPOINT

   Get information about a single breakpoint.

GDB Command
...........

The corresponding GDB command is `info break BREAKPOINT'.

Example
.......

N.A.

The `-break-insert' Command
---------------------------

Synopsis
........

      -break-insert [ -t ] [ -h ] [ -f ] [ -d ] [ -a ]
         [ -c CONDITION ] [ -i IGNORE-COUNT ]
         [ -p THREAD ] [ LOCATION ]

If specified, LOCATION, can be one of:

   * function

   * filename:linenum

   * filename:function

   * *address

   The possible optional parameters of this command are:

`-t'
     Insert a temporary breakpoint.

`-h'
     Insert a hardware breakpoint.

`-c CONDITION'
     Make the breakpoint conditional on CONDITION.

`-i IGNORE-COUNT'
     Initialize the IGNORE-COUNT.

`-f'
     If LOCATION cannot be parsed (for example if it refers to unknown
     files or functions), create a pending breakpoint. Without this
     flag, GDB will report an error, and won't create a breakpoint, if
     LOCATION cannot be parsed.

`-d'
     Create a disabled breakpoint.

`-a'
     Create a tracepoint.  *Note Tracepoints::.  When this parameter is
     used together with `-h', a fast tracepoint is created.

Result
......

The result is in the form:

     ^done,bkpt={number="NUMBER",type="TYPE",disp="del"|"keep",
     enabled="y"|"n",addr="HEX",func="FUNCNAME",file="FILENAME",
     fullname="FULL_FILENAME",line="LINENO",[thread="THREADNO,]
     times="TIMES"}

where NUMBER is the GDB number for this breakpoint, FUNCNAME is the
name of the function where the breakpoint was inserted, FILENAME is the
name of the source file which contains this function, LINENO is the
source line number within that file and TIMES the number of times that
the breakpoint has been hit (always 0 for -break-insert but may be
greater for -break-info or -break-list which use the same output).

   Note: this format is open to change.

GDB Command
...........

The corresponding GDB commands are `break', `tbreak', `hbreak',
`thbreak', and `rbreak'.

Example
.......

     (gdb)
     -break-insert main
     ^done,bkpt={number="1",addr="0x0001072c",file="recursive2.c",
     fullname="/home/foo/recursive2.c,line="4",times="0"}
     (gdb)
     -break-insert -t foo
     ^done,bkpt={number="2",addr="0x00010774",file="recursive2.c",
     fullname="/home/foo/recursive2.c,line="11",times="0"}
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="2",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x0001072c", func="main",file="recursive2.c",
     fullname="/home/foo/recursive2.c,"line="4",times="0"},
     bkpt={number="2",type="breakpoint",disp="del",enabled="y",
     addr="0x00010774",func="foo",file="recursive2.c",
     fullname="/home/foo/recursive2.c",line="11",times="0"}]}
     (gdb)
     -break-insert -r foo.*
     ~int foo(int, int);
     ^done,bkpt={number="3",addr="0x00010774",file="recursive2.c,
     "fullname="/home/foo/recursive2.c",line="11",times="0"}
     (gdb)

The `-break-list' Command
-------------------------

Synopsis
........

      -break-list

   Displays the list of inserted breakpoints, showing the following
fields:

`Number'
     number of the breakpoint

`Type'
     type of the breakpoint: `breakpoint' or `watchpoint'

`Disposition'
     should the breakpoint be deleted or disabled when it is hit: `keep'
     or `nokeep'

`Enabled'
     is the breakpoint enabled or no: `y' or `n'

`Address'
     memory location at which the breakpoint is set

`What'
     logical location of the breakpoint, expressed by function name,
     file name, line number

`Times'
     number of times the breakpoint has been hit

   If there are no breakpoints or watchpoints, the `BreakpointTable'
`body' field is an empty list.

GDB Command
...........

The corresponding GDB command is `info break'.

Example
.......

     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="2",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x000100d0",func="main",file="hello.c",line="5",times="0"},
     bkpt={number="2",type="breakpoint",disp="keep",enabled="y",
     addr="0x00010114",func="foo",file="hello.c",fullname="/home/foo/hello.c",
     line="13",times="0"}]}
     (gdb)

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

     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="0",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[]}
     (gdb)

The `-break-passcount' Command
------------------------------

Synopsis
........

      -break-passcount TRACEPOINT-NUMBER PASSCOUNT

   Set the passcount for tracepoint TRACEPOINT-NUMBER to PASSCOUNT.  If
the breakpoint referred to by TRACEPOINT-NUMBER is not a tracepoint,
error is emitted.  This corresponds to CLI command `passcount'.

The `-break-watch' Command
--------------------------

Synopsis
........

      -break-watch [ -a | -r ]

   Create a watchpoint.  With the `-a' option it will create an
"access" watchpoint, i.e., a watchpoint that triggers either on a read
from or on a write to the memory location.  With the `-r' option, the
watchpoint created is a "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.  *Note
Setting Watchpoints: Set Watchpoints.

   Note that `-break-list' will report a single list of watchpoints and
breakpoints inserted.

GDB Command
...........

The corresponding GDB commands are `watch', `awatch', and `rwatch'.

Example
.......

Setting a watchpoint on a variable in the `main' function:

     (gdb)
     -break-watch x
     ^done,wpt={number="2",exp="x"}
     (gdb)
     -exec-continue
     ^running
     (gdb)
     *stopped,reason="watchpoint-trigger",wpt={number="2",exp="x"},
     value={old="-268439212",new="55"},
     frame={func="main",args=[],file="recursive2.c",
     fullname="/home/foo/bar/recursive2.c",line="5"}
     (gdb)

   Setting a watchpoint on a variable local to a function.  GDB will
stop the program execution twice: first for the variable changing
value, then for the watchpoint going out of scope.

     (gdb)
     -break-watch C
     ^done,wpt={number="5",exp="C"}
     (gdb)
     -exec-continue
     ^running
     (gdb)
     *stopped,reason="watchpoint-trigger",
     wpt={number="5",exp="C"},value={old="-276895068",new="3"},
     frame={func="callee4",args=[],
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="13"}
     (gdb)
     -exec-continue
     ^running
     (gdb)
     *stopped,reason="watchpoint-scope",wpnum="5",
     frame={func="callee3",args=[{name="strarg",
     value="0x11940 \"A string argument.\""}],
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="18"}
     (gdb)

   Listing breakpoints and watchpoints, at different points in the
program execution.  Note that once the watchpoint goes out of scope, it
is deleted.

     (gdb)
     -break-watch C
     ^done,wpt={number="2",exp="C"}
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="2",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x00010734",func="callee4",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/devo/gdb/testsuite/gdb.mi/basics.c"line="8",times="1"},
     bkpt={number="2",type="watchpoint",disp="keep",
     enabled="y",addr="",what="C",times="0"}]}
     (gdb)
     -exec-continue
     ^running
     (gdb)
     *stopped,reason="watchpoint-trigger",wpt={number="2",exp="C"},
     value={old="-276895068",new="3"},
     frame={func="callee4",args=[],
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="13"}
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="2",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x00010734",func="callee4",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/devo/gdb/testsuite/gdb.mi/basics.c",line="8",times="1"},
     bkpt={number="2",type="watchpoint",disp="keep",
     enabled="y",addr="",what="C",times="-5"}]}
     (gdb)
     -exec-continue
     ^running
     ^done,reason="watchpoint-scope",wpnum="2",
     frame={func="callee3",args=[{name="strarg",
     value="0x11940 \"A string argument.\""}],
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="18"}
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="1",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x00010734",func="callee4",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/devo/gdb/testsuite/gdb.mi/basics.c",line="8",
     times="1"}]}
     (gdb)


File: gdb.info,  Node: GDB/MI Program Context,  Next: GDB/MI Thread Commands,  Prev: GDB/MI Breakpoint Commands,  Up: GDB/MI

27.9 GDB/MI  Program Context
============================

The `-exec-arguments' Command
-----------------------------

Synopsis
........

      -exec-arguments ARGS

   Set the inferior program arguments, to be used in the next
`-exec-run'.

GDB Command
...........

The corresponding GDB command is `set args'.

Example
.......

     (gdb)
     -exec-arguments -v word
     ^done
     (gdb)

The `-environment-cd' Command
-----------------------------

Synopsis
........

      -environment-cd PATHDIR

   Set GDB's working directory.

GDB Command
...........

The corresponding GDB command is `cd'.

Example
.......

     (gdb)
     -environment-cd /kwikemart/marge/ezannoni/flathead-dev/devo/gdb
     ^done
     (gdb)

The `-environment-directory' Command
------------------------------------

Synopsis
........

      -environment-directory [ -r ] [ PATHDIR ]+

   Add directories PATHDIR to beginning of search path for source files.
If the `-r' option is used, the search path is reset to the default
search path.  If directories PATHDIR are supplied in addition to the
`-r' option, the search path is first reset and then addition occurs as
normal.  Multiple directories may be specified, separated by blanks.
Specifying multiple directories in a single command results in the
directories added to the beginning of the search path in the same order
they were presented in the command.  If blanks are needed as part of a
directory name, double-quotes should be used around the name.  In the
command output, the path will show up separated by the system
directory-separator character.  The directory-separator character must
not be used in any directory name.  If no directories are specified,
the current search path is displayed.

GDB Command
...........

The corresponding GDB command is `dir'.

Example
.......

     (gdb)
     -environment-directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb
     ^done,source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd"
     (gdb)
     -environment-directory ""
     ^done,source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd"
     (gdb)
     -environment-directory -r /home/jjohnstn/src/gdb /usr/src
     ^done,source-path="/home/jjohnstn/src/gdb:/usr/src:$cdir:$cwd"
     (gdb)
     -environment-directory -r
     ^done,source-path="$cdir:$cwd"
     (gdb)

The `-environment-path' Command
-------------------------------

Synopsis
........

      -environment-path [ -r ] [ PATHDIR ]+

   Add directories PATHDIR to beginning of search path for object files.
If the `-r' option is used, the search path is reset to the original
search path that existed at gdb start-up.  If directories PATHDIR are
supplied in addition to the `-r' option, the search path is first reset
and then addition occurs as normal.  Multiple directories may be
specified, separated by blanks.  Specifying multiple directories in a
single command results in the directories added to the beginning of the
search path in the same order they were presented in the command.  If
blanks are needed as part of a directory name, double-quotes should be
used around the name.  In the command output, the path will show up
separated by the system directory-separator character.  The
directory-separator character must not be used in any directory name.
If no directories are specified, the current path is displayed.

GDB Command
...........

The corresponding GDB command is `path'.

Example
.......

     (gdb)
     -environment-path
     ^done,path="/usr/bin"
     (gdb)
     -environment-path /kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb /bin
     ^done,path="/kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb:/bin:/usr/bin"
     (gdb)
     -environment-path -r /usr/local/bin
     ^done,path="/usr/local/bin:/usr/bin"
     (gdb)

The `-environment-pwd' Command
------------------------------

Synopsis
........

      -environment-pwd

   Show the current working directory.

GDB Command
...........

The corresponding GDB command is `pwd'.

Example
.......

     (gdb)
     -environment-pwd
     ^done,cwd="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb"
     (gdb)


File: gdb.info,  Node: GDB/MI Thread Commands,  Next: GDB/MI Ada Tasking Commands,  Prev: GDB/MI Program Context,  Up: GDB/MI

27.10 GDB/MI Thread Commands
============================

The `-thread-info' Command
--------------------------

Synopsis
........

      -thread-info [ THREAD-ID ]

   Reports information about either a specific thread, if the THREAD-ID
parameter is present, or about all threads.  When printing information
about all threads, also reports the current thread.

GDB Command
...........

The `info thread' command prints the same information about all threads.

Result
......

The result is a list of threads.  The following attributes are defined
for a given thread:

`current'
     This field exists only for the current thread.  It has the value
     `*'.

`id'
     The identifier that GDB uses to refer to the thread.

`target-id'
     The identifier that the target uses to refer to the thread.

`details'
     Extra information about the thread, in a target-specific format.
     This field is optional.

`name'
     The name of the thread.  If the user specified a name using the
     `thread name' command, then this name is given.  Otherwise, if GDB
     can extract the thread name from the target, then that name is
     given.  If GDB cannot find the thread name, then this field is
     omitted.

`frame'
     The stack frame currently executing in the thread.

`state'
     The thread's state.  The `state' field may have the following
     values:

    `stopped'
          The thread is stopped.  Frame information is available for
          stopped threads.

    `running'
          The thread is running.  There's no frame information for
          running threads.


`core'
     If GDB can find the CPU core on which this thread is running, then
     this field is the core identifier.  This field is optional.


Example
.......

     -thread-info
     ^done,threads=[
     {id="2",target-id="Thread 0xb7e14b90 (LWP 21257)",
        frame={level="0",addr="0xffffe410",func="__kernel_vsyscall",
                args=[]},state="running"},
     {id="1",target-id="Thread 0xb7e156b0 (LWP 21254)",
        frame={level="0",addr="0x0804891f",func="foo",
                args=[{name="i",value="10"}],
                file="/tmp/a.c",fullname="/tmp/a.c",line="158"},
                state="running"}],
     current-thread-id="1"
     (gdb)

The `-thread-list-ids' Command
------------------------------

Synopsis
........

      -thread-list-ids

   Produces a list of the currently known GDB thread ids.  At the end
of the list it also prints the total number of such threads.

   This command is retained for historical reasons, the `-thread-info'
command should be used instead.

GDB Command
...........

Part of `info threads' supplies the same information.

Example
.......

     (gdb)
     -thread-list-ids
     ^done,thread-ids={thread-id="3",thread-id="2",thread-id="1"},
     current-thread-id="1",number-of-threads="3"
     (gdb)

The `-thread-select' Command
----------------------------

Synopsis
........

      -thread-select THREADNUM

   Make THREADNUM the current thread.  It prints the number of the new
current thread, and the topmost frame for that thread.

   This command is deprecated in favor of explicitly using the
`--thread' option to each command.

GDB Command
...........

The corresponding GDB command is `thread'.

Example
.......

     (gdb)
     -exec-next
     ^running
     (gdb)
     *stopped,reason="end-stepping-range",thread-id="2",line="187",
     file="../../../devo/gdb/testsuite/gdb.threads/linux-dp.c"
     (gdb)
     -thread-list-ids
     ^done,
     thread-ids={thread-id="3",thread-id="2",thread-id="1"},
     number-of-threads="3"
     (gdb)
     -thread-select 3
     ^done,new-thread-id="3",
     frame={level="0",func="vprintf",
     args=[{name="format",value="0x8048e9c \"%*s%c %d %c\\n\""},
     {name="arg",value="0x2"}],file="vprintf.c",line="31"}
     (gdb)


File: gdb.info,  Node: GDB/MI Ada Tasking Commands,  Next: GDB/MI Program Execution,  Prev: GDB/MI Thread Commands,  Up: GDB/MI

27.11 GDB/MI Ada Tasking Commands
=================================

The `-ada-task-info' Command
----------------------------

Synopsis
........

      -ada-task-info [ TASK-ID ]

   Reports information about either a specific Ada task, if the TASK-ID
parameter is present, or about all Ada tasks.

GDB Command
...........

The `info tasks' command prints the same information about all Ada
tasks (*note Ada Tasks::).

Result
......

The result is a table of Ada tasks.  The following columns are defined
for each Ada task:

`current'
     This field exists only for the current thread.  It has the value
     `*'.

`id'
     The identifier that GDB uses to refer to the Ada task.

`task-id'
     The identifier that the target uses to refer to the Ada task.

`thread-id'
     The identifier of the thread corresponding to the Ada task.

     This field should always exist, as Ada tasks are always implemented
     on top of a thread.  But if GDB cannot find this corresponding
     thread for any reason, the field is omitted.

`parent-id'
     This field exists only when the task was created by another task.
     In this case, it provides the ID of the parent task.

`priority'
     The base priority of the task.

`state'
     The current state of the task.  For a detailed description of the
     possible states, see *note Ada Tasks::.

`name'
     The name of the task.


Example
.......

     -ada-task-info
     ^done,tasks={nr_rows="3",nr_cols="8",
     hdr=[{width="1",alignment="-1",col_name="current",colhdr=""},
     {width="3",alignment="1",col_name="id",colhdr="ID"},
     {width="9",alignment="1",col_name="task-id",colhdr="TID"},
     {width="4",alignment="1",col_name="thread-id",colhdr=""},
     {width="4",alignment="1",col_name="parent-id",colhdr="P-ID"},
     {width="3",alignment="1",col_name="priority",colhdr="Pri"},
     {width="22",alignment="-1",col_name="state",colhdr="State"},
     {width="1",alignment="2",col_name="name",colhdr="Name"}],
     body=[{current="*",id="1",task-id="   644010",thread-id="1",priority="48",
     state="Child Termination Wait",name="main_task"}]}
     (gdb)


File: gdb.info,  Node: GDB/MI Program Execution,  Next: GDB/MI Stack Manipulation,  Prev: GDB/MI Ada Tasking Commands,  Up: GDB/MI

27.12 GDB/MI Program Execution
==============================

These are the asynchronous commands which generate the out-of-band
record `*stopped'.  Currently GDB only really executes asynchronously
with remote targets and this interaction is mimicked in other cases.

The `-exec-continue' Command
----------------------------

Synopsis
........

      -exec-continue [--reverse] [--all|--thread-group N]

   Resumes the execution of the inferior program, which will continue
to execute until it reaches a debugger stop event.  If the `--reverse'
option is specified, execution resumes in reverse until it reaches a
stop event.  Stop events may include
   * breakpoints or watchpoints

   * signals or exceptions

   * the end of the process (or its beginning under `--reverse')

   * the end or beginning of a replay log if one is being used.
   In all-stop mode (*note All-Stop Mode::), may resume only one
thread, or all threads, depending on the value of the
`scheduler-locking' variable.  If `--all' is specified, all threads (in
all inferiors) will be resumed.  The `--all' option is ignored in
all-stop mode.  If the `--thread-group' options is specified, then all
threads in that thread group are resumed.

GDB Command
...........

The corresponding GDB corresponding is `continue'.

Example
.......

     -exec-continue
     ^running
     (gdb)
     @Hello world
     *stopped,reason="breakpoint-hit",disp="keep",bkptno="2",frame={
     func="foo",args=[],file="hello.c",fullname="/home/foo/bar/hello.c",
     line="13"}
     (gdb)

The `-exec-finish' Command
--------------------------

Synopsis
........

      -exec-finish [--reverse]

   Resumes the execution of the inferior program until the current
function is exited.  Displays the results returned by the function.  If
the `--reverse' option is specified, resumes the reverse execution of
the inferior program until the point where current function was called.

GDB Command
...........

The corresponding GDB command is `finish'.

Example
.......

Function returning `void'.

     -exec-finish
     ^running
     (gdb)
     @hello from foo
     *stopped,reason="function-finished",frame={func="main",args=[],
     file="hello.c",fullname="/home/foo/bar/hello.c",line="7"}
     (gdb)

   Function returning other than `void'.  The name of the internal GDB
variable storing the result is printed, together with the value itself.

     -exec-finish
     ^running
     (gdb)
     *stopped,reason="function-finished",frame={addr="0x000107b0",func="foo",
     args=[{name="a",value="1"],{name="b",value="9"}},
     file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"},
     gdb-result-var="$1",return-value="0"
     (gdb)

The `-exec-interrupt' Command
-----------------------------

Synopsis
........

      -exec-interrupt [--all|--thread-group N]

   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 `^done' output.  If the user is trying to interrupt
a non-running program, an error message will be printed.

   Note that when asynchronous execution is enabled, this command is
asynchronous just like other execution commands.  That is, first the
`^done' response will be printed, and the target stop will be reported
after that using the `*stopped' notification.

   In non-stop mode, only the context thread is interrupted by default.
All threads (in all inferiors) will be interrupted if the `--all'
option is specified.  If the `--thread-group' option is specified, all
threads in that group will be interrupted.

GDB Command
...........

The corresponding GDB command is `interrupt'.

Example
.......

     (gdb)
     111-exec-continue
     111^running

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

     (gdb)
     -exec-interrupt
     ^error,msg="mi_cmd_exec_interrupt: Inferior not executing."
     (gdb)

The `-exec-jump' Command
------------------------

Synopsis
........

      -exec-jump LOCATION

   Resumes execution of the inferior program at the location specified
by parameter.  *Note Specify Location::, for a description of the
different forms of LOCATION.

GDB Command
...........

The corresponding GDB command is `jump'.

Example
.......

     -exec-jump foo.c:10
     *running,thread-id="all"
     ^running

The `-exec-next' Command
------------------------

Synopsis
........

      -exec-next [--reverse]

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

   If the `--reverse' option is specified, resumes reverse execution of
the inferior program, stopping at the beginning of the previous source
line.  If you issue this command on the first line of a function, it
will take you back to the caller of that function, to the source line
where the function was called.

GDB Command
...........

The corresponding GDB command is `next'.

Example
.......

     -exec-next
     ^running
     (gdb)
     *stopped,reason="end-stepping-range",line="8",file="hello.c"
     (gdb)

The `-exec-next-instruction' Command
------------------------------------

Synopsis
........

      -exec-next-instruction [--reverse]

   Executes one machine instruction.  If the instruction is a function
call, continues until the function returns.  If the program stops at an
instruction in the middle of a source line, the address will be printed
as well.

   If the `--reverse' option is specified, resumes reverse execution of
the inferior program, stopping at the previous instruction.  If the
previously executed instruction was a return from another function, it
will continue to execute in reverse until the call to that function
(from the current stack frame) is reached.

GDB Command
...........

The corresponding GDB command is `nexti'.

Example
.......

     (gdb)
     -exec-next-instruction
     ^running

     (gdb)
     *stopped,reason="end-stepping-range",
     addr="0x000100d4",line="5",file="hello.c"
     (gdb)

The `-exec-return' Command
--------------------------

Synopsis
........

      -exec-return

   Makes current function return immediately.  Doesn't execute the
inferior.  Displays the new current frame.

GDB Command
...........

The corresponding GDB command is `return'.

Example
.......

     (gdb)
     200-break-insert callee4
     200^done,bkpt={number="1",addr="0x00010734",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",line="8"}
     (gdb)
     000-exec-run
     000^running
     (gdb)
     000*stopped,reason="breakpoint-hit",disp="keep",bkptno="1",
     frame={func="callee4",args=[],
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="8"}
     (gdb)
     205-break-delete
     205^done
     (gdb)
     111-exec-return
     111^done,frame={level="0",func="callee3",
     args=[{name="strarg",
     value="0x11940 \"A string argument.\""}],
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="18"}
     (gdb)

The `-exec-run' Command
-----------------------

Synopsis
........

      -exec-run [--all | --thread-group N]

   Starts execution of the inferior from the beginning.  The inferior
executes until either a breakpoint is encountered or the program exits.
In the latter case the output will include an exit code, if the program
has exited exceptionally.

   When no option is specified, the current inferior is started.  If the
`--thread-group' option is specified, it should refer to a thread group
of type `process', and that thread group will be started.  If the
`--all' option is specified, then all inferiors will be started.

GDB Command
...........

The corresponding GDB command is `run'.

Examples
........

     (gdb)
     -break-insert main
     ^done,bkpt={number="1",addr="0x0001072c",file="recursive2.c",line="4"}
     (gdb)
     -exec-run
     ^running
     (gdb)
     *stopped,reason="breakpoint-hit",disp="keep",bkptno="1",
     frame={func="main",args=[],file="recursive2.c",
     fullname="/home/foo/bar/recursive2.c",line="4"}
     (gdb)

Program exited normally:

     (gdb)
     -exec-run
     ^running
     (gdb)
     x = 55
     *stopped,reason="exited-normally"
     (gdb)

Program exited exceptionally:

     (gdb)
     -exec-run
     ^running
     (gdb)
     x = 55
     *stopped,reason="exited",exit-code="01"
     (gdb)

   Another way the program can terminate is if it receives a signal
such as `SIGINT'.  In this case, GDB/MI displays this:

     (gdb)
     *stopped,reason="exited-signalled",signal-name="SIGINT",
     signal-meaning="Interrupt"

The `-exec-step' Command
------------------------

Synopsis
........

      -exec-step [--reverse]

   Resumes execution of the inferior program, stopping when the
beginning of the next source line is reached, if the next source line
is not a function call.  If it is, stop at the first instruction of the
called function.  If the `--reverse' option is specified, resumes
reverse execution of the inferior program, stopping at the beginning of
the previously executed source line.

GDB Command
...........

The corresponding GDB command is `step'.

Example
.......

Stepping into a function:

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

   Regular stepping:

     -exec-step
     ^running
     (gdb)
     *stopped,reason="end-stepping-range",line="14",file="recursive2.c"
     (gdb)

The `-exec-step-instruction' Command
------------------------------------

Synopsis
........

      -exec-step-instruction [--reverse]

   Resumes the inferior which executes one machine instruction.  If the
`--reverse' option is specified, resumes reverse execution of the
inferior program, stopping at the previously executed instruction.  The
output, once GDB 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.

GDB Command
...........

The corresponding GDB command is `stepi'.

Example
.......

     (gdb)
     -exec-step-instruction
     ^running

     (gdb)
     *stopped,reason="end-stepping-range",
     frame={func="foo",args=[],file="try.c",
     fullname="/home/foo/bar/try.c",line="10"}
     (gdb)
     -exec-step-instruction
     ^running

     (gdb)
     *stopped,reason="end-stepping-range",
     frame={addr="0x000100f4",func="foo",args=[],file="try.c",
     fullname="/home/foo/bar/try.c",line="10"}
     (gdb)

The `-exec-until' Command
-------------------------

Synopsis
........

      -exec-until [ LOCATION ]

   Executes the inferior until the 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 `location-reached'.

GDB Command
...........

The corresponding GDB command is `until'.

Example
.......

     (gdb)
     -exec-until recursive2.c:6
     ^running
     (gdb)
     x = 55
     *stopped,reason="location-reached",frame={func="main",args=[],
     file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="6"}
     (gdb)


File: gdb.info,  Node: GDB/MI Stack Manipulation,  Next: GDB/MI Variable Objects,  Prev: GDB/MI Program Execution,  Up: GDB/MI

27.13 GDB/MI Stack Manipulation Commands
========================================

The `-stack-info-frame' Command
-------------------------------

Synopsis
........

      -stack-info-frame

   Get info on the selected frame.

GDB Command
...........

The corresponding GDB command is `info frame' or `frame' (without
arguments).

Example
.......

     (gdb)
     -stack-info-frame
     ^done,frame={level="1",addr="0x0001076c",func="callee3",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="17"}
     (gdb)

The `-stack-info-depth' Command
-------------------------------

Synopsis
........

      -stack-info-depth [ MAX-DEPTH ]

   Return the depth of the stack.  If the integer argument MAX-DEPTH is
specified, do not count beyond MAX-DEPTH frames.

GDB Command
...........

There's no equivalent GDB command.

Example
.......

For a stack with frame levels 0 through 11:

     (gdb)
     -stack-info-depth
     ^done,depth="12"
     (gdb)
     -stack-info-depth 4
     ^done,depth="4"
     (gdb)
     -stack-info-depth 12
     ^done,depth="12"
     (gdb)
     -stack-info-depth 11
     ^done,depth="11"
     (gdb)
     -stack-info-depth 13
     ^done,depth="12"
     (gdb)

The `-stack-list-arguments' Command
-----------------------------------

Synopsis
........

      -stack-list-arguments PRINT-VALUES
         [ LOW-FRAME HIGH-FRAME ]

   Display a list of the arguments for the frames between LOW-FRAME and
HIGH-FRAME (inclusive).  If LOW-FRAME and HIGH-FRAME are not provided,
list the arguments for the whole call stack.  If the two arguments are
equal, show the single frame at the corresponding level.  It is an
error if LOW-FRAME is larger than the actual number of frames.  On the
other hand, HIGH-FRAME may be larger than the actual number of frames,
in which case only existing frames will be returned.

   If PRINT-VALUES is 0 or `--no-values', print only the names of the
variables; if it is 1 or `--all-values', print also their values; and
if it is 2 or `--simple-values', print the name, type and value for
simple data types, and the name and type for arrays, structures and
unions.

   Use of this command to obtain arguments in a single frame is
deprecated in favor of the `-stack-list-variables' command.

GDB Command
...........

GDB does not have an equivalent command.  `gdbtk' has a `gdb_get_args'
command which partially overlaps with the functionality of
`-stack-list-arguments'.

Example
.......

     (gdb)
     -stack-list-frames
     ^done,
     stack=[
     frame={level="0",addr="0x00010734",func="callee4",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="8"},
     frame={level="1",addr="0x0001076c",func="callee3",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="17"},
     frame={level="2",addr="0x0001078c",func="callee2",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="22"},
     frame={level="3",addr="0x000107b4",func="callee1",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="27"},
     frame={level="4",addr="0x000107e0",func="main",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="32"}]
     (gdb)
     -stack-list-arguments 0
     ^done,
     stack-args=[
     frame={level="0",args=[]},
     frame={level="1",args=[name="strarg"]},
     frame={level="2",args=[name="intarg",name="strarg"]},
     frame={level="3",args=[name="intarg",name="strarg",name="fltarg"]},
     frame={level="4",args=[]}]
     (gdb)
     -stack-list-arguments 1
     ^done,
     stack-args=[
     frame={level="0",args=[]},
     frame={level="1",
      args=[{name="strarg",value="0x11940 \"A string argument.\""}]},
     frame={level="2",args=[
     {name="intarg",value="2"},
     {name="strarg",value="0x11940 \"A string argument.\""}]},
     {frame={level="3",args=[
     {name="intarg",value="2"},
     {name="strarg",value="0x11940 \"A string argument.\""},
     {name="fltarg",value="3.5"}]},
     frame={level="4",args=[]}]
     (gdb)
     -stack-list-arguments 0 2 2
     ^done,stack-args=[frame={level="2",args=[name="intarg",name="strarg"]}]
     (gdb)
     -stack-list-arguments 1 2 2
     ^done,stack-args=[frame={level="2",
     args=[{name="intarg",value="2"},
     {name="strarg",value="0x11940 \"A string argument.\""}]}]
     (gdb)

The `-stack-list-frames' Command
--------------------------------

Synopsis
........

      -stack-list-frames [ LOW-FRAME HIGH-FRAME ]

   List the frames currently on the stack.  For each frame it displays
the following info:

`LEVEL'
     The frame number, 0 being the topmost frame, i.e., the innermost
     function.

`ADDR'
     The `$pc' value for that frame.

`FUNC'
     Function name.

`FILE'
     File name of the source file where the function lives.

`FULLNAME'
     The full file name of the source file where the function lives.

`LINE'
     Line number corresponding to the `$pc'.

`FROM'
     The shared library where this function is defined.  This is only
     given if the frame's function is not known.

   If invoked without arguments, this command prints a backtrace for the
whole stack.  If given two integer arguments, it shows the frames whose
levels are between the two arguments (inclusive).  If the two arguments
are equal, it shows the single frame at the corresponding level.  It is
an error if LOW-FRAME is larger than the actual number of frames.  On
the other hand, HIGH-FRAME may be larger than the actual number of
frames, in which case only existing frames will be returned.

GDB Command
...........

The corresponding GDB commands are `backtrace' and `where'.

Example
.......

Full stack backtrace:

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

   Show frames between LOW_FRAME and HIGH_FRAME:

     (gdb)
     -stack-list-frames 3 5
     ^done,stack=
     [frame={level="3",addr="0x000107a4",func="foo",
       file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"},
     frame={level="4",addr="0x000107a4",func="foo",
       file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"},
     frame={level="5",addr="0x000107a4",func="foo",
       file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"}]
     (gdb)

   Show a single frame:

     (gdb)
     -stack-list-frames 3 3
     ^done,stack=
     [frame={level="3",addr="0x000107a4",func="foo",
       file="recursive2.c",fullname="/home/foo/bar/recursive2.c",line="14"}]
     (gdb)

The `-stack-list-locals' Command
--------------------------------

Synopsis
........

      -stack-list-locals PRINT-VALUES

   Display the local variable names for the selected frame.  If
PRINT-VALUES is 0 or `--no-values', print only the names of the
variables; if it is 1 or `--all-values', print also their values; and
if it is 2 or `--simple-values', print the name, type and value for
simple data types, and the name and type for arrays, structures and
unions.  In this last case, a frontend can immediately display the
value of simple data types and create variable objects for other data
types when the user wishes to explore their values in more detail.

   This command is deprecated in favor of the `-stack-list-variables'
command.

GDB Command
...........

`info locals' in GDB, `gdb_get_locals' in `gdbtk'.

Example
.......

     (gdb)
     -stack-list-locals 0
     ^done,locals=[name="A",name="B",name="C"]
     (gdb)
     -stack-list-locals --all-values
     ^done,locals=[{name="A",value="1"},{name="B",value="2"},
       {name="C",value="{1, 2, 3}"}]
     -stack-list-locals --simple-values
     ^done,locals=[{name="A",type="int",value="1"},
       {name="B",type="int",value="2"},{name="C",type="int [3]"}]
     (gdb)

The `-stack-list-variables' Command
-----------------------------------

Synopsis
........

      -stack-list-variables PRINT-VALUES

   Display the names of local variables and function arguments for the
selected frame.  If PRINT-VALUES is 0 or `--no-values', print only the
names of the variables; if it is 1 or `--all-values', print also their
values; and if it is 2 or `--simple-values', print the name, type and
value for simple data types, and the name and type for arrays,
structures and unions.

Example
.......

     (gdb)
     -stack-list-variables --thread 1 --frame 0 --all-values
     ^done,variables=[{name="x",value="11"},{name="s",value="{a = 1, b = 2}"}]
     (gdb)

The `-stack-select-frame' Command
---------------------------------

Synopsis
........

      -stack-select-frame FRAMENUM

   Change the selected frame.  Select a different frame FRAMENUM on the
stack.

   This command in deprecated in favor of passing the `--frame' option
to every command.

GDB Command
...........

The corresponding GDB commands are `frame', `up', `down',
`select-frame', `up-silent', and `down-silent'.

Example
.......

     (gdb)
     -stack-select-frame 2
     ^done
     (gdb)


File: gdb.info,  Node: GDB/MI Variable Objects,  Next: GDB/MI Data Manipulation,  Prev: GDB/MI Stack Manipulation,  Up: GDB/MI

27.14 GDB/MI Variable Objects
=============================

Introduction to Variable Objects
--------------------------------

Variable objects are "object-oriented" MI interface for examining and
changing values of expressions.  Unlike some other MI interfaces that
work with expressions, variable objects are specifically designed for
simple and efficient presentation in the frontend.  A variable object
is identified by string name.  When a variable object is created, the
frontend specifies the expression for that variable object.  The
expression can be a simple variable, or it can be an arbitrary complex
expression, and can even involve CPU registers.  After creating a
variable object, the frontend can invoke other variable object
operations--for example to obtain or change the value of a variable
object, or to change display format.

   Variable objects have hierarchical tree structure.  Any variable
object that corresponds to a composite type, such as structure in C, has
a number of child variable objects, for example corresponding to each
element of a structure.  A child variable object can itself have
children, recursively.  Recursion ends when we reach leaf variable
objects, which always have built-in types.  Child variable objects are
created only by explicit request, so if a frontend is not interested in
the children of a particular variable object, no child will be created.

   For a leaf variable object it is possible to obtain its value as a
string, or set the value from a string.  String value can be also
obtained for a non-leaf variable object, but it's generally a string
that only indicates the type of the object, and does not list its
contents.  Assignment to a non-leaf variable object is not allowed.

   A frontend does not need to read the values of all variable objects
each time the program stops.  Instead, MI provides an update command
that lists all variable objects whose values has changed since the last
update operation.  This considerably reduces the amount of data that
must be transferred to the frontend.  As noted above, children variable
objects are created on demand, and only leaf variable objects have a
real value.  As result, gdb will read target memory only for leaf
variables that frontend has created.

   The automatic update is not always desirable.  For example, a
frontend might want to keep a value of some expression for future
reference, and never update it.  For another example,  fetching memory
is relatively slow for embedded targets, so a frontend might want to
disable automatic update for the variables that are either not visible
on the screen, or "closed".  This is possible using so called "frozen
variable objects".  Such variable objects are never implicitly updated.

   Variable objects can be either "fixed" or "floating".  For the fixed
variable object, the expression is parsed when the variable object is
created, including associating identifiers to specific variables.  The
meaning of expression never changes.  For a floating variable object
the values of variables whose names appear in the expressions are
re-evaluated every time in the context of the current frame.  Consider
this example:

     void do_work(...)
     {
             struct work_state state;

             if (...)
                do_work(...);
     }

   If a fixed variable object for the `state' variable is created in
this function, and we enter the recursive call, the variable object
will report the value of `state' in the top-level `do_work' invocation.
On the other hand, a floating variable object will report the value of
`state' in the current frame.

   If an expression specified when creating a fixed variable object
refers to a local variable, the variable object becomes bound to the
thread and frame in which the variable object is created.  When such
variable object is updated, GDB makes sure that the thread/frame
combination the variable object is bound to still exists, and
re-evaluates the variable object in context of that thread/frame.

   The following is the complete set of GDB/MI operations defined to
access this functionality:

*Operation*                   *Description*
`-enable-pretty-printing'     enable Python-based pretty-printing
`-var-create'                 create a variable object
`-var-delete'                 delete the variable object and/or its
                              children
`-var-set-format'             set the display format of this variable
`-var-show-format'            show the display format of this variable
`-var-info-num-children'      tells how many children this object has
`-var-list-children'          return a list of the object's children
`-var-info-type'              show the type of this variable object
`-var-info-expression'        print parent-relative expression that this
                              variable object represents
`-var-info-path-expression'   print full expression that this variable
                              object represents
`-var-show-attributes'        is this variable editable? does it exist
                              here?
`-var-evaluate-expression'    get the value of this variable
`-var-assign'                 set the value of this variable
`-var-update'                 update the variable and its children
`-var-set-frozen'             set frozeness attribute
`-var-set-update-range'       set range of children to display on update

   In the next subsection we describe each operation in detail and
suggest how it can be used.

Description And Use of Operations on Variable Objects
-----------------------------------------------------

The `-enable-pretty-printing' Command
-------------------------------------

     -enable-pretty-printing

   GDB allows Python-based visualizers to affect the output of the MI
variable object commands.  However, because there was no way to
implement this in a fully backward-compatible way, a front end must
request that this functionality be enabled.

   Once enabled, this feature cannot be disabled.

   Note that if Python support has not been compiled into GDB, this
command will still succeed (and do nothing).

   This feature is currently (as of GDB 7.0) experimental, and may work
differently in future versions of GDB.

The `-var-create' Command
-------------------------

Synopsis
........

      -var-create {NAME | "-"}
         {FRAME-ADDR | "*" | "@"} EXPRESSION

   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 NAME parameter is the string by which the object can be
referenced.  It must be unique.  If `-' is specified, the varobj system
will generate a string "varNNNNNN" automatically.  It will be unique
provided that one does not specify NAME of that format.  The command
fails if a duplicate name is found.

   The frame under which the expression should be evaluated can be
specified by FRAME-ADDR.  A `*' indicates that the current frame should
be used.  A `@' indicates that a floating variable object must be
created.

   EXPRESSION is any expression valid on the current language set (must
not begin with a `*'), or one of the following:

   * `*ADDR', where ADDR is the address of a memory cell

   * `*ADDR-ADDR' -- a memory address range (TBD)

   * `$REGNAME' -- a CPU register name

   A varobj's contents may be provided by a Python-based
pretty-printer.  In this case the varobj is known as a "dynamic
varobj".  Dynamic varobjs have slightly different semantics in some
cases.  If the `-enable-pretty-printing' command is not sent, then GDB
will never create a dynamic varobj.  This ensures backward
compatibility for existing clients.

Result
......

This operation returns attributes of the newly-created varobj.  These
are:

`name'
     The name of the varobj.

`numchild'
     The number of children of the varobj.  This number is not
     necessarily reliable for a dynamic varobj.  Instead, you must
     examine the `has_more' attribute.

`value'
     The varobj's scalar value.  For a varobj whose type is some sort of
     aggregate (e.g., a `struct'), or for a dynamic varobj, this value
     will not be interesting.

`type'
     The varobj's type.  This is a string representation of the type, as
     would be printed by the GDB CLI.

`thread-id'
     If a variable object is bound to a specific thread, then this is
     the thread's identifier.

`has_more'
     For a dynamic varobj, this indicates whether there appear to be any
     children available.  For a non-dynamic varobj, this will be 0.

`dynamic'
     This attribute will be present and have the value `1' if the
     varobj is a dynamic varobj.  If the varobj is not a dynamic varobj,
     then this attribute will not be present.

`displayhint'
     A dynamic varobj can supply a display hint to the front end.  The
     value comes directly from the Python pretty-printer object's
     `display_hint' method.  *Note Pretty Printing API::.

   Typical output will look like this:

      name="NAME",numchild="N",type="TYPE",thread-id="M",
       has_more="HAS_MORE"

The `-var-delete' Command
-------------------------

Synopsis
........

      -var-delete [ -c ] NAME

   Deletes a previously created variable object and all of its children.
With the `-c' option, just deletes the children.

   Returns an error if the object NAME is not found.

The `-var-set-format' Command
-----------------------------

Synopsis
........

      -var-set-format NAME FORMAT-SPEC

   Sets the output format for the value of the object NAME to be
FORMAT-SPEC.

   The syntax for the FORMAT-SPEC is as follows:

      FORMAT-SPEC ==>
      {binary | decimal | hexadecimal | octal | natural}

   The natural format is the default format choosen automatically based
on the variable type (like decimal for an `int', hex for pointers,
etc.).

   For a variable with children, the format is set only on the variable
itself, and the children are not affected.

The `-var-show-format' Command
------------------------------

Synopsis
........

      -var-show-format NAME

   Returns the format used to display the value of the object NAME.

      FORMAT ==>
      FORMAT-SPEC

The `-var-info-num-children' Command
------------------------------------

Synopsis
........

      -var-info-num-children NAME

   Returns the number of children of a variable object NAME:

      numchild=N

   Note that this number is not completely reliable for a dynamic
varobj.  It will return the current number of children, but more
children may be available.

The `-var-list-children' Command
--------------------------------

Synopsis
........

      -var-list-children [PRINT-VALUES] NAME [FROM TO]
Return a list of the children of the specified variable object and
create variable objects for them, if they do not already exist.  With a
single argument or if PRINT-VALUES has a value of 0 or `--no-values',
print only the names of the variables; if PRINT-VALUES is 1 or
`--all-values', also print their values; and if it is 2 or
`--simple-values' print the name and value for simple data types and
just the name for arrays, structures and unions.

   FROM and TO, if specified, indicate the range of children to report.
If FROM or TO is less than zero, the range is reset and all children
will be reported.  Otherwise, children starting at FROM (zero-based)
and up to and excluding TO will be reported.

   If a child range is requested, it will only affect the current call
to `-var-list-children', but not future calls to `-var-update'.  For
this, you must instead use `-var-set-update-range'.  The intent of this
approach is to enable a front end to implement any update approach it
likes; for example, scrolling a view may cause the front end to request
more children with `-var-list-children', and then the front end could
call `-var-set-update-range' with a different range to ensure that
future updates are restricted to just the visible items.

   For each child the following results are returned:

NAME
     Name of the variable object created for this child.

EXP
     The expression to be shown to the user by the front end to
     designate this child.  For example this may be the name of a
     structure member.

     For a dynamic varobj, this value cannot be used to form an
     expression.  There is no way to do this at all with a dynamic
     varobj.

     For C/C++ structures there are several pseudo children returned to
     designate access qualifiers.  For these pseudo children EXP is
     `public', `private', or `protected'.  In this case the type and
     value are not present.

     A dynamic varobj will not report the access qualifying
     pseudo-children, regardless of the language.  This information is
     not available at all with a dynamic varobj.

NUMCHILD
     Number of children this child has.  For a dynamic varobj, this
     will be 0.

TYPE
     The type of the child.

VALUE
     If values were requested, this is the value.

THREAD-ID
     If this variable object is associated with a thread, this is the
     thread id.  Otherwise this result is not present.

FROZEN
     If the variable object is frozen, this variable will be present
     with a value of 1.

   The result may have its own attributes:

`displayhint'
     A dynamic varobj can supply a display hint to the front end.  The
     value comes directly from the Python pretty-printer object's
     `display_hint' method.  *Note Pretty Printing API::.

`has_more'
     This is an integer attribute which is nonzero if there are children
     remaining after the end of the selected range.

Example
.......

     (gdb)
      -var-list-children n
      ^done,numchild=N,children=[child={name=NAME,exp=EXP,
      numchild=N,type=TYPE},(repeats N times)]
     (gdb)
      -var-list-children --all-values n
      ^done,numchild=N,children=[child={name=NAME,exp=EXP,
      numchild=N,value=VALUE,type=TYPE},(repeats N times)]

The `-var-info-type' Command
----------------------------

Synopsis
........

      -var-info-type NAME

   Returns the type of the specified variable NAME.  The type is
returned as a string in the same format as it is output by the GDB CLI:

      type=TYPENAME

The `-var-info-expression' Command
----------------------------------

Synopsis
........

      -var-info-expression NAME

   Returns a string that is suitable for presenting this variable
object in user interface.  The string is generally not valid expression
in the current language, and cannot be evaluated.

   For example, if `a' is an array, and variable object `A' was created
for `a', then we'll get this output:

     (gdb) -var-info-expression A.1
     ^done,lang="C",exp="1"

Here, the values of `lang' can be `{"C" | "C++" | "Java"}'.

   Note that the output of the `-var-list-children' command also
includes those expressions, so the `-var-info-expression' command is of
limited use.

The `-var-info-path-expression' Command
---------------------------------------

Synopsis
........

      -var-info-path-expression NAME

   Returns an expression that can be evaluated in the current context
and will yield the same value that a variable object has.  Compare this
with the `-var-info-expression' command, which result can be used only
for UI presentation.  Typical use of the `-var-info-path-expression'
command is creating a watchpoint from a variable object.

   This command is currently not valid for children of a dynamic varobj,
and will give an error when invoked on one.

   For example, suppose `C' is a C++ class, derived from class `Base',
and that the `Base' class has a member called `m_size'.  Assume a
variable `c' is has the type of `C' and a variable object `C' was
created for variable `c'.  Then, we'll get this output:
     (gdb) -var-info-path-expression C.Base.public.m_size
     ^done,path_expr=((Base)c).m_size)

The `-var-show-attributes' Command
----------------------------------

Synopsis
........

      -var-show-attributes NAME

   List attributes of the specified variable object NAME:

      status=ATTR [ ( ,ATTR )* ]

where ATTR is `{ { editable | noneditable } | TBD }'.

The `-var-evaluate-expression' Command
--------------------------------------

Synopsis
........

      -var-evaluate-expression [-f FORMAT-SPEC] NAME

   Evaluates the expression that is represented by the specified
variable object and returns its value as a string.  The format of the
string can be specified with the `-f' option.  The possible values of
this option are the same as for `-var-set-format' (*note
-var-set-format::).  If the `-f' option is not specified, the current
display format will be used.  The current display format can be changed
using the `-var-set-format' command.

      value=VALUE

   Note that one must invoke `-var-list-children' for a variable before
the value of a child variable can be evaluated.

The `-var-assign' Command
-------------------------

Synopsis
........

      -var-assign NAME EXPRESSION

   Assigns the value of EXPRESSION to the variable object specified by
NAME.  The object must be `editable'.  If the variable's value is
altered by the assign, the variable will show up in any subsequent
`-var-update' list.

Example
.......

     (gdb)
     -var-assign var1 3
     ^done,value="3"
     (gdb)
     -var-update *
     ^done,changelist=[{name="var1",in_scope="true",type_changed="false"}]
     (gdb)

The `-var-update' Command
-------------------------

Synopsis
........

      -var-update [PRINT-VALUES] {NAME | "*"}

   Reevaluate the expressions corresponding to the variable object NAME
and all its direct and indirect children, and return the list of
variable objects whose values have changed; NAME must be a root
variable object.  Here, "changed" means that the result of
`-var-evaluate-expression' before and after the `-var-update' is
different.  If `*' is used as the variable object names, all existing
variable objects are updated, except for frozen ones (*note
-var-set-frozen::).  The option PRINT-VALUES determines whether both
names and values, or just names are printed.  The possible values of
this option are the same as for `-var-list-children' (*note
-var-list-children::).  It is recommended to use the `--all-values'
option, to reduce the number of MI commands needed on each program stop.

   With the `*' parameter, if a variable object is bound to a currently
running thread, it will not be updated, without any diagnostic.

   If `-var-set-update-range' was previously used on a varobj, then
only the selected range of children will be reported.

   `-var-update' reports all the changed varobjs in a tuple named
`changelist'.

   Each item in the change list is itself a tuple holding:

`name'
     The name of the varobj.

`value'
     If values were requested for this update, then this field will be
     present and will hold the value of the varobj.

`in_scope'
     This field is a string which may take one of three values:

    `"true"'
          The variable object's current value is valid.

    `"false"'
          The variable object does not currently hold a valid value but
          it may hold one in the future if its associated expression
          comes back into scope.

    `"invalid"'
          The variable object no longer holds a valid value.  This can
          occur when the executable file being debugged has changed,
          either through recompilation or by using the GDB `file'
          command.  The front end should normally choose to delete
          these variable objects.

     In the future new values may be added to this list so the front
     should be prepared for this possibility.  *Note GDB/MI Development
     and Front Ends: GDB/MI Development and Front Ends.

`type_changed'
     This is only present if the varobj is still valid.  If the type
     changed, then this will be the string `true'; otherwise it will be
     `false'.

`new_type'
     If the varobj's type changed, then this field will be present and
     will hold the new type.

`new_num_children'
     For a dynamic varobj, if the number of children changed, or if the
     type changed, this will be the new number of children.

     The `numchild' field in other varobj responses is generally not
     valid for a dynamic varobj - it will show the number of children
     that GDB knows about, but because dynamic varobjs lazily
     instantiate their children, this will not reflect the number of
     children which may be available.

     The `new_num_children' attribute only reports changes to the
     number of children known by GDB.  This is the only way to detect
     whether an update has removed children (which necessarily can only
     happen at the end of the update range).

`displayhint'
     The display hint, if any.

`has_more'
     This is an integer value, which will be 1 if there are more
     children available outside the varobj's update range.

`dynamic'
     This attribute will be present and have the value `1' if the
     varobj is a dynamic varobj.  If the varobj is not a dynamic varobj,
     then this attribute will not be present.

`new_children'
     If new children were added to a dynamic varobj within the selected
     update range (as set by `-var-set-update-range'), then they will
     be listed in this attribute.

Example
.......

     (gdb)
     -var-assign var1 3
     ^done,value="3"
     (gdb)
     -var-update --all-values var1
     ^done,changelist=[{name="var1",value="3",in_scope="true",
     type_changed="false"}]
     (gdb)

The `-var-set-frozen' Command
-----------------------------

Synopsis
........

      -var-set-frozen NAME FLAG

   Set the frozenness flag on the variable object NAME.  The FLAG
parameter should be either `1' to make the variable frozen or `0' to
make it unfrozen.  If a variable object is frozen, then neither itself,
nor any of its children, are implicitly updated by `-var-update' of a
parent variable or by `-var-update *'.  Only `-var-update' of the
variable itself will update its value and values of its children.
After a variable object is unfrozen, it is implicitly updated by all
subsequent `-var-update' operations.  Unfreezing a variable does not
update it, only subsequent `-var-update' does.

Example
.......

     (gdb)
     -var-set-frozen V 1
     ^done
     (gdb)

The `-var-set-update-range' command
-----------------------------------

Synopsis
........

      -var-set-update-range NAME FROM TO

   Set the range of children to be returned by future invocations of
`-var-update'.

   FROM and TO indicate the range of children to report.  If FROM or TO
is less than zero, the range is reset and all children will be
reported.  Otherwise, children starting at FROM (zero-based) and up to
and excluding TO will be reported.

Example
.......

     (gdb)
     -var-set-update-range V 1 2
     ^done

The `-var-set-visualizer' command
---------------------------------

Synopsis
........

      -var-set-visualizer NAME VISUALIZER

   Set a visualizer for the variable object NAME.

   VISUALIZER is the visualizer to use.  The special value `None' means
to disable any visualizer in use.

   If not `None', VISUALIZER must be a Python expression.  This
expression must evaluate to a callable object which accepts a single
argument.  GDB will call this object with the value of the varobj NAME
as an argument (this is done so that the same Python pretty-printing
code can be used for both the CLI and MI).  When called, this object
must return an object which conforms to the pretty-printing interface
(*note Pretty Printing API::).

   The pre-defined function `gdb.default_visualizer' may be used to
select a visualizer by following the built-in process (*note Selecting
Pretty-Printers::).  This is done automatically when a varobj is
created, and so ordinarily is not needed.

   This feature is only available if Python support is enabled.  The MI
command `-list-features' (*note GDB/MI Miscellaneous Commands::) can be
used to check this.

Example
.......

Resetting the visualizer:

     (gdb)
     -var-set-visualizer V None
     ^done

   Reselecting the default (type-based) visualizer:

     (gdb)
     -var-set-visualizer V gdb.default_visualizer
     ^done

   Suppose `SomeClass' is a visualizer class.  A lambda expression can
be used to instantiate this class for a varobj:

     (gdb)
     -var-set-visualizer V "lambda val: SomeClass()"
     ^done


File: gdb.info,  Node: GDB/MI Data Manipulation,  Next: GDB/MI Tracepoint Commands,  Prev: GDB/MI Variable Objects,  Up: GDB/MI

27.15 GDB/MI Data Manipulation
==============================

This section describes the GDB/MI commands that manipulate data:
examine memory and registers, evaluate expressions, etc.

The `-data-disassemble' Command
-------------------------------

Synopsis
........

      -data-disassemble
         [ -s START-ADDR -e END-ADDR ]
       | [ -f FILENAME -l LINENUM [ -n LINES ] ]
       -- MODE

Where:

`START-ADDR'
     is the beginning address (or `$pc')

`END-ADDR'
     is the end address

`FILENAME'
     is the name of the file to disassemble

`LINENUM'
     is the line number to disassemble around

`LINES'
     is the number of disassembly lines to be produced.  If it is -1,
     the whole function will be disassembled, in case no END-ADDR is
     specified.  If END-ADDR is specified as a non-zero value, and
     LINES is lower than the number of disassembly lines between
     START-ADDR and END-ADDR, only LINES lines are displayed; if LINES
     is higher than the number of lines between START-ADDR and
     END-ADDR, only the lines up to END-ADDR are displayed.

`MODE'
     is either 0 (meaning only disassembly), 1 (meaning mixed source and
     disassembly), 2 (meaning disassembly with raw opcodes), or 3
     (meaning mixed source and disassembly with raw opcodes).

Result
......

The output for each instruction is composed of four fields:

   * Address

   * Func-name

   * Offset

   * Instruction

   Note that whatever included in the instruction field, is not
manipulated directly by GDB/MI, i.e., it is not possible to adjust its
format.

GDB Command
...........

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

Example
.......

Disassemble from the current value of `$pc' to `$pc + 20':

     (gdb)
     -data-disassemble -s $pc -e "$pc + 20" -- 0
     ^done,
     asm_insns=[
     {address="0x000107c0",func-name="main",offset="4",
     inst="mov  2, %o0"},
     {address="0x000107c4",func-name="main",offset="8",
     inst="sethi  %hi(0x11800), %o2"},
     {address="0x000107c8",func-name="main",offset="12",
     inst="or  %o2, 0x140, %o1\t! 0x11940 <_lib_version+8>"},
     {address="0x000107cc",func-name="main",offset="16",
     inst="sethi  %hi(0x11800), %o2"},
     {address="0x000107d0",func-name="main",offset="20",
     inst="or  %o2, 0x168, %o4\t! 0x11968 <_lib_version+48>"}]
     (gdb)

   Disassemble the whole `main' function.  Line 32 is part of `main'.

     -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"},
     [...]
     {address="0x0001081c",func-name="main",offset="96",inst="ret "},
     {address="0x00010820",func-name="main",offset="100",inst="restore "}]
     (gdb)

   Disassemble 3 instructions from the start of `main':

     (gdb)
     -data-disassemble -f basics.c -l 32 -n 3 -- 0
     ^done,asm_insns=[
     {address="0x000107bc",func-name="main",offset="0",
     inst="save  %sp, -112, %sp"},
     {address="0x000107c0",func-name="main",offset="4",
     inst="mov  2, %o0"},
     {address="0x000107c4",func-name="main",offset="8",
     inst="sethi  %hi(0x11800), %o2"}]
     (gdb)

   Disassemble 3 instructions from the start of `main' in mixed mode:

     (gdb)
     -data-disassemble -f basics.c -l 32 -n 3 -- 1
     ^done,asm_insns=[
     src_and_asm_line={line="31",
     file="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb/ \
       testsuite/gdb.mi/basics.c",line_asm_insn=[
     {address="0x000107bc",func-name="main",offset="0",
     inst="save  %sp, -112, %sp"}]},
     src_and_asm_line={line="32",
     file="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb/ \
       testsuite/gdb.mi/basics.c",line_asm_insn=[
     {address="0x000107c0",func-name="main",offset="4",
     inst="mov  2, %o0"},
     {address="0x000107c4",func-name="main",offset="8",
     inst="sethi  %hi(0x11800), %o2"}]}]
     (gdb)

The `-data-evaluate-expression' Command
---------------------------------------

Synopsis
........

      -data-evaluate-expression EXPR

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

GDB Command
...........

The corresponding GDB commands are `print', `output', and `call'.  In
`gdbtk' only, there's a corresponding `gdb_eval' command.

Example
.......

In the following example, the numbers that precede the commands are the
"tokens" described in *note GDB/MI Command Syntax: GDB/MI Command
Syntax.  Notice how GDB/MI returns the same tokens in its output.

     211-data-evaluate-expression A
     211^done,value="1"
     (gdb)
     311-data-evaluate-expression &A
     311^done,value="0xefffeb7c"
     (gdb)
     411-data-evaluate-expression A+3
     411^done,value="4"
     (gdb)
     511-data-evaluate-expression "A + 3"
     511^done,value="4"
     (gdb)

The `-data-list-changed-registers' Command
------------------------------------------

Synopsis
........

      -data-list-changed-registers

   Display a list of the registers that have changed.

GDB Command
...........

GDB doesn't have a direct analog for this command; `gdbtk' has the
corresponding command `gdb_changed_register_list'.

Example
.......

On a PPC MBX board:

     (gdb)
     -exec-continue
     ^running

     (gdb)
     *stopped,reason="breakpoint-hit",disp="keep",bkptno="1",frame={
     func="main",args=[],file="try.c",fullname="/home/foo/bar/try.c",
     line="5"}
     (gdb)
     -data-list-changed-registers
     ^done,changed-registers=["0","1","2","4","5","6","7","8","9",
     "10","11","13","14","15","16","17","18","19","20","21","22","23",
     "24","25","26","27","28","30","31","64","65","66","67","69"]
     (gdb)

The `-data-list-register-names' Command
---------------------------------------

Synopsis
........

      -data-list-register-names [ ( REGNO )+ ]

   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.

GDB Command
...........

GDB does not have a command which corresponds to
`-data-list-register-names'.  In `gdbtk' there is a corresponding
command `gdb_regnames'.

Example
.......

For the PPC MBX board:
     (gdb)
     -data-list-register-names
     ^done,register-names=["r0","r1","r2","r3","r4","r5","r6","r7",
     "r8","r9","r10","r11","r12","r13","r14","r15","r16","r17","r18",
     "r19","r20","r21","r22","r23","r24","r25","r26","r27","r28","r29",
     "r30","r31","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9",
     "f10","f11","f12","f13","f14","f15","f16","f17","f18","f19","f20",
     "f21","f22","f23","f24","f25","f26","f27","f28","f29","f30","f31",
     "", "pc","ps","cr","lr","ctr","xer"]
     (gdb)
     -data-list-register-names 1 2 3
     ^done,register-names=["r1","r2","r3"]
     (gdb)

The `-data-list-register-values' Command
----------------------------------------

Synopsis
........

      -data-list-register-values FMT [ ( REGNO )*]

   Display the registers' contents.  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 FMT are:

`x'
     Hexadecimal

`o'
     Octal

`t'
     Binary

`d'
     Decimal

`r'
     Raw

`N'
     Natural

GDB Command
...........

The corresponding GDB commands are `info reg', `info all-reg', and (in
`gdbtk') `gdb_fetch_registers'.

Example
.......

For a PPC MBX board (note: line breaks are for readability only, they
don't appear in the actual output):

     (gdb)
     -data-list-register-values r 64 65
     ^done,register-values=[{number="64",value="0xfe00a300"},
     {number="65",value="0x00029002"}]
     (gdb)
     -data-list-register-values x
     ^done,register-values=[{number="0",value="0xfe0043c8"},
     {number="1",value="0x3fff88"},{number="2",value="0xfffffffe"},
     {number="3",value="0x0"},{number="4",value="0xa"},
     {number="5",value="0x3fff68"},{number="6",value="0x3fff58"},
     {number="7",value="0xfe011e98"},{number="8",value="0x2"},
     {number="9",value="0xfa202820"},{number="10",value="0xfa202808"},
     {number="11",value="0x1"},{number="12",value="0x0"},
     {number="13",value="0x4544"},{number="14",value="0xffdfffff"},
     {number="15",value="0xffffffff"},{number="16",value="0xfffffeff"},
     {number="17",value="0xefffffed"},{number="18",value="0xfffffffe"},
     {number="19",value="0xffffffff"},{number="20",value="0xffffffff"},
     {number="21",value="0xffffffff"},{number="22",value="0xfffffff7"},
     {number="23",value="0xffffffff"},{number="24",value="0xffffffff"},
     {number="25",value="0xffffffff"},{number="26",value="0xfffffffb"},
     {number="27",value="0xffffffff"},{number="28",value="0xf7bfffff"},
     {number="29",value="0x0"},{number="30",value="0xfe010000"},
     {number="31",value="0x0"},{number="32",value="0x0"},
     {number="33",value="0x0"},{number="34",value="0x0"},
     {number="35",value="0x0"},{number="36",value="0x0"},
     {number="37",value="0x0"},{number="38",value="0x0"},
     {number="39",value="0x0"},{number="40",value="0x0"},
     {number="41",value="0x0"},{number="42",value="0x0"},
     {number="43",value="0x0"},{number="44",value="0x0"},
     {number="45",value="0x0"},{number="46",value="0x0"},
     {number="47",value="0x0"},{number="48",value="0x0"},
     {number="49",value="0x0"},{number="50",value="0x0"},
     {number="51",value="0x0"},{number="52",value="0x0"},
     {number="53",value="0x0"},{number="54",value="0x0"},
     {number="55",value="0x0"},{number="56",value="0x0"},
     {number="57",value="0x0"},{number="58",value="0x0"},
     {number="59",value="0x0"},{number="60",value="0x0"},
     {number="61",value="0x0"},{number="62",value="0x0"},
     {number="63",value="0x0"},{number="64",value="0xfe00a300"},
     {number="65",value="0x29002"},{number="66",value="0x202f04b5"},
     {number="67",value="0xfe0043b0"},{number="68",value="0xfe00b3e4"},
     {number="69",value="0x20002b03"}]
     (gdb)

The `-data-read-memory' Command
-------------------------------

This command is deprecated, use `-data-read-memory-bytes' instead.

Synopsis
........

      -data-read-memory [ -o BYTE-OFFSET ]
        ADDRESS WORD-FORMAT WORD-SIZE
        NR-ROWS NR-COLS [ ASCHAR ]

where:

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

`WORD-FORMAT'
     The format to be used to print the memory words.  The notation is
     the same as for GDB's `print' command (*note Output Formats:
     Output Formats.).

`WORD-SIZE'
     The size of each memory word in bytes.

`NR-ROWS'
     The number of rows in the output table.

`NR-COLS'
     The number of columns in the output table.

`ASCHAR'
     If present, indicates that each row should include an ASCII dump.
     The value of ASCHAR is used as a padding character when a byte is
     not a member of the printable ASCII character set (printable ASCII
     characters are those whose code is between 32 and 126,
     inclusively).

`BYTE-OFFSET'
     An offset to add to the ADDRESS before fetching memory.

   This command displays memory contents as a table of NR-ROWS by
NR-COLS words, each word being WORD-SIZE bytes.  In total, `NR-ROWS *
NR-COLS * WORD-SIZE' bytes are read (returned as `total-bytes').
Should less than the requested number of bytes be returned by the
target, the missing words are identified using `N/A'.  The number of
bytes read from the target is returned in `nr-bytes' and the starting
address used to read memory in `addr'.

   The address of the next/previous row or page is available in
`next-row' and `prev-row', `next-page' and `prev-page'.

GDB Command
...........

The corresponding GDB command is `x'.  `gdbtk' has `gdb_get_mem' memory
read command.

Example
.......

Read six bytes of memory starting at `bytes+6' but then offset by `-6'
bytes.  Format as three rows of two columns.  One byte per word.
Display each word in hex.

     (gdb)
     9-data-read-memory -o -6 -- bytes+6 x 1 3 2
     9^done,addr="0x00001390",nr-bytes="6",total-bytes="6",
     next-row="0x00001396",prev-row="0x0000138e",next-page="0x00001396",
     prev-page="0x0000138a",memory=[
     {addr="0x00001390",data=["0x00","0x01"]},
     {addr="0x00001392",data=["0x02","0x03"]},
     {addr="0x00001394",data=["0x04","0x05"]}]
     (gdb)

   Read two bytes of memory starting at address `shorts + 64' and
display as a single word formatted in decimal.

     (gdb)
     5-data-read-memory shorts+64 d 2 1 1
     5^done,addr="0x00001510",nr-bytes="2",total-bytes="2",
     next-row="0x00001512",prev-row="0x0000150e",
     next-page="0x00001512",prev-page="0x0000150e",memory=[
     {addr="0x00001510",data=["128"]}]
     (gdb)

   Read thirty two bytes of memory starting at `bytes+16' and format as
eight rows of four columns.  Include a string encoding with `x' used as
the non-printable character.

     (gdb)
     4-data-read-memory bytes+16 x 1 8 4 x
     4^done,addr="0x000013a0",nr-bytes="32",total-bytes="32",
     next-row="0x000013c0",prev-row="0x0000139c",
     next-page="0x000013c0",prev-page="0x00001380",memory=[
     {addr="0x000013a0",data=["0x10","0x11","0x12","0x13"],ascii="xxxx"},
     {addr="0x000013a4",data=["0x14","0x15","0x16","0x17"],ascii="xxxx"},
     {addr="0x000013a8",data=["0x18","0x19","0x1a","0x1b"],ascii="xxxx"},
     {addr="0x000013ac",data=["0x1c","0x1d","0x1e","0x1f"],ascii="xxxx"},
     {addr="0x000013b0",data=["0x20","0x21","0x22","0x23"],ascii=" !\"#"},
     {addr="0x000013b4",data=["0x24","0x25","0x26","0x27"],ascii="$%&'"},
     {addr="0x000013b8",data=["0x28","0x29","0x2a","0x2b"],ascii="()*+"},
     {addr="0x000013bc",data=["0x2c","0x2d","0x2e","0x2f"],ascii=",-./"}]
     (gdb)

The `-data-read-memory-bytes' Command
-------------------------------------

Synopsis
........

      -data-read-memory-bytes [ -o BYTE-OFFSET ]
        ADDRESS COUNT

where:

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

`COUNT'
     The number of bytes to read.  This should be an integer literal.

`BYTE-OFFSET'
     The offsets in bytes relative to ADDRESS at which to start
     reading.  This should be an integer literal.  This option is
     provided so that a frontend is not required to first evaluate
     address and then perform address arithmetics itself.


   This command attempts to read all accessible memory regions in the
specified range.  First, all regions marked as unreadable in the memory
map (if one is defined) will be skipped.  *Note Memory Region
Attributes::.  Second, GDB will attempt to read the remaining regions.
For each one, if reading full region results in an errors, GDB will try
to read a subset of the region.

   In general, every single byte in the region may be readable or not,
and the only way to read every readable byte is to try a read at every
address, which is not practical.   Therefore, GDB will attempt to read
all accessible bytes at either beginning or the end of the region,
using a binary division scheme.  This heuristic works well for reading
accross a memory map boundary.  Note that if a region has a readable
range that is neither at the beginning or the end, GDB will not read it.

   The result record (*note GDB/MI Result Records::) that is output of
the command includes a field named `memory' whose content is a list of
tuples.  Each tuple represent a successfully read memory block and has
the following fields:

`begin'
     The start address of the memory block, as hexadecimal literal.

`end'
     The end address of the memory block, as hexadecimal literal.

`offset'
     The offset of the memory block, as hexadecimal literal, relative to
     the start address passed to `-data-read-memory-bytes'.

`contents'
     The contents of the memory block, in hex.


GDB Command
...........

The corresponding GDB command is `x'.

Example
.......

     (gdb)
     -data-read-memory-bytes &a 10
     ^done,memory=[{begin="0xbffff154",offset="0x00000000",
                   end="0xbffff15e",
                   contents="01000000020000000300"}]
     (gdb)

The `-data-write-memory-bytes' Command
--------------------------------------

Synopsis
........

      -data-write-memory-bytes ADDRESS CONTENTS

where:

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

`CONTENTS'
     The hex-encoded bytes to write.


GDB Command
...........

There's no corresponding GDB command.

Example
.......

     (gdb)
     -data-write-memory-bytes &a "aabbccdd"
     ^done
     (gdb)


File: gdb.info,  Node: GDB/MI Tracepoint Commands,  Next: GDB/MI Symbol Query,  Prev: GDB/MI Data Manipulation,  Up: GDB/MI

27.16 GDB/MI Tracepoint Commands
================================

The commands defined in this section implement MI support for
tracepoints.  For detailed introduction, see *note Tracepoints::.

The `-trace-find' Command
-------------------------

Synopsis
........

      -trace-find MODE [PARAMETERS...]

   Find a trace frame using criteria defined by MODE and PARAMETERS.
The following table lists permissible modes and their parameters.  For
details of operation, see *note tfind::.

`none'
     No parameters are required.  Stops examining trace frames.

`frame-number'
     An integer is required as parameter.  Selects tracepoint frame with
     that index.

`tracepoint-number'
     An integer is required as parameter.  Finds next trace frame that
     corresponds to tracepoint with the specified number.

`pc'
     An address is required as parameter.  Finds next trace frame that
     corresponds to any tracepoint at the specified address.

`pc-inside-range'
     Two addresses are required as parameters.  Finds next trace frame
     that corresponds to a tracepoint at an address inside the
     specified range.  Both bounds are considered to be inside the
     range.

`pc-outside-range'
     Two addresses are required as parameters.  Finds next trace frame
     that corresponds to a tracepoint at an address outside the
     specified range.  Both bounds are considered to be inside the
     range.

`line'
     Line specification is required as parameter.  *Note Specify
     Location::.  Finds next trace frame that corresponds to a
     tracepoint at the specified location.


   If `none' was passed as MODE, the response does not have fields.
Otherwise, the response may have the following fields:

`found'
     This field has either `0' or `1' as the value, depending on
     whether a matching tracepoint was found.

`traceframe'
     The index of the found traceframe.  This field is present iff the
     `found' field has value of `1'.

`tracepoint'
     The index of the found tracepoint.  This field is present iff the
     `found' field has value of `1'.

`frame'
     The information about the frame corresponding to the found trace
     frame.  This field is present only if a trace frame was found.
     *Note GDB/MI Frame Information::, for description of this field.


GDB Command
...........

The corresponding GDB command is `tfind'.

-trace-define-variable
----------------------

Synopsis
........

      -trace-define-variable NAME [ VALUE ]

   Create trace variable NAME if it does not exist.  If VALUE is
specified, sets the initial value of the specified trace variable to
that value.  Note that the NAME should start with the `$' character.

GDB Command
...........

The corresponding GDB command is `tvariable'.

-trace-list-variables
---------------------

Synopsis
........

      -trace-list-variables

   Return a table of all defined trace variables.  Each element of the
table has the following fields:

`name'
     The name of the trace variable.  This field is always present.

`initial'
     The initial value.  This is a 64-bit signed integer.  This field
     is always present.

`current'
     The value the trace variable has at the moment.  This is a 64-bit
     signed integer.  This field is absent iff current value is not
     defined, for example if the trace was never run, or is presently
     running.


GDB Command
...........

The corresponding GDB command is `tvariables'.

Example
.......

     (gdb)
     -trace-list-variables
     ^done,trace-variables={nr_rows="1",nr_cols="3",
     hdr=[{width="15",alignment="-1",col_name="name",colhdr="Name"},
          {width="11",alignment="-1",col_name="initial",colhdr="Initial"},
          {width="11",alignment="-1",col_name="current",colhdr="Current"}],
     body=[variable={name="$trace_timestamp",initial="0"}
           variable={name="$foo",initial="10",current="15"}]}
     (gdb)

-trace-save
-----------

Synopsis
........

      -trace-save [-r ] FILENAME

   Saves the collected trace data to FILENAME.  Without the `-r'
option, the data is downloaded from the target and saved in a local
file.  With the `-r' option the target is asked to perform the save.

GDB Command
...........

The corresponding GDB command is `tsave'.

-trace-start
------------

Synopsis
........

      -trace-start

   Starts a tracing experiments.  The result of this command does not
have any fields.

GDB Command
...........

The corresponding GDB command is `tstart'.

-trace-status
-------------

Synopsis
........

      -trace-status

   Obtains the status of a tracing experiment.  The result may include
the following fields:

`supported'
     May have a value of either `0', when no tracing operations are
     supported, `1', when all tracing operations are supported, or
     `file' when examining trace file.  In the latter case, examining
     of trace frame is possible but new tracing experiement cannot be
     started.  This field is always present.

`running'
     May have a value of either `0' or `1' depending on whether tracing
     experiement is in progress on target.  This field is present if
     `supported' field is not `0'.

`stop-reason'
     Report the reason why the tracing was stopped last time.  This
     field may be absent iff tracing was never stopped on target yet.
     The value of `request' means the tracing was stopped as result of
     the `-trace-stop' command.  The value of `overflow' means the
     tracing buffer is full.  The value of `disconnection' means
     tracing was automatically stopped when GDB has disconnected.  The
     value of `passcount' means tracing was stopped when a tracepoint
     was passed a maximal number of times for that tracepoint.  This
     field is present if `supported' field is not `0'.

`stopping-tracepoint'
     The number of tracepoint whose passcount as exceeded.  This field
     is present iff the `stop-reason' field has the value of
     `passcount'.

`frames'
`frames-created'
     The `frames' field is a count of the total number of trace frames
     in the trace buffer, while `frames-created' is the total created
     during the run, including ones that were discarded, such as when a
     circular trace buffer filled up.  Both fields are optional.

`buffer-size'
`buffer-free'
     These fields tell the current size of the tracing buffer and the
     remaining space.  These fields are optional.

`circular'
     The value of the circular trace buffer flag.  `1' means that the
     trace buffer is circular and old trace frames will be discarded if
     necessary to make room, `0' means that the trace buffer is linear
     and may fill up.

`disconnected'
     The value of the disconnected tracing flag.  `1' means that
     tracing will continue after GDB disconnects, `0' means that the
     trace run will stop.


GDB Command
...........

The corresponding GDB command is `tstatus'.

-trace-stop
-----------

Synopsis
........

      -trace-stop

   Stops a tracing experiment.  The result of this command has the same
fields as `-trace-status', except that the `supported' and `running'
fields are not output.

GDB Command
...........

The corresponding GDB command is `tstop'.


File: gdb.info,  Node: GDB/MI Symbol Query,  Next: GDB/MI File Commands,  Prev: GDB/MI Tracepoint Commands,  Up: GDB/MI

27.17 GDB/MI Symbol Query Commands
==================================

The `-symbol-list-lines' Command
--------------------------------

Synopsis
........

      -symbol-list-lines FILENAME

   Print the list of lines that contain code and their associated
program addresses for the given source filename.  The entries are
sorted in ascending PC order.

GDB Command
...........

There is no corresponding GDB command.

Example
.......

     (gdb)
     -symbol-list-lines basics.c
     ^done,lines=[{pc="0x08048554",line="7"},{pc="0x0804855a",line="8"}]
     (gdb)


File: gdb.info,  Node: GDB/MI File Commands,  Next: GDB/MI Target Manipulation,  Prev: GDB/MI Symbol Query,  Up: GDB/MI

27.18 GDB/MI File Commands
==========================

This section describes the GDB/MI commands to specify executable file
names and to read in and obtain symbol table information.

The `-file-exec-and-symbols' Command
------------------------------------

Synopsis
........

      -file-exec-and-symbols FILE

   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, GDB will produce
error messages.  Otherwise, no output is produced, except a completion
notification.

GDB Command
...........

The corresponding GDB command is `file'.

Example
.......

     (gdb)
     -file-exec-and-symbols /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
     ^done
     (gdb)

The `-file-exec-file' Command
-----------------------------

Synopsis
........

      -file-exec-file FILE

   Specify the executable file to be debugged.  Unlike
`-file-exec-and-symbols', the symbol table is _not_ read from this
file.  If used without argument, GDB clears the information about the
executable file.  No output is produced, except a completion
notification.

GDB Command
...........

The corresponding GDB command is `exec-file'.

Example
.......

     (gdb)
     -file-exec-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
     ^done
     (gdb)

The `-file-list-exec-source-file' Command
-----------------------------------------

Synopsis
........

      -file-list-exec-source-file

   List the line number, the current source file, and the absolute path
to the current source file for the current executable.  The macro
information field has a value of `1' or `0' depending on whether or not
the file includes preprocessor macro information.

GDB Command
...........

The GDB equivalent is `info source'

Example
.......

     (gdb)
     123-file-list-exec-source-file
     123^done,line="1",file="foo.c",fullname="/home/bar/foo.c,macro-info="1"
     (gdb)

The `-file-list-exec-source-files' Command
------------------------------------------

Synopsis
........

      -file-list-exec-source-files

   List the source files for the current executable.

   It will always output the filename, but only when GDB can find the
absolute file name of a source file, will it output the fullname.

GDB Command
...........

The GDB equivalent is `info sources'.  `gdbtk' has an analogous command
`gdb_listfiles'.

Example
.......

     (gdb)
     -file-list-exec-source-files
     ^done,files=[
     {file=foo.c,fullname=/home/foo.c},
     {file=/home/bar.c,fullname=/home/bar.c},
     {file=gdb_could_not_find_fullpath.c}]
     (gdb)

The `-file-symbol-file' Command
-------------------------------

Synopsis
........

      -file-symbol-file FILE

   Read symbol table info from the specified FILE argument.  When used
without arguments, clears GDB's symbol table info.  No output is
produced, except for a completion notification.

GDB Command
...........

The corresponding GDB command is `symbol-file'.

Example
.......

     (gdb)
     -file-symbol-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
     ^done
     (gdb)


File: gdb.info,  Node: GDB/MI Target Manipulation,  Next: GDB/MI File Transfer Commands,  Prev: GDB/MI File Commands,  Up: GDB/MI

27.19 GDB/MI Target Manipulation Commands
=========================================

The `-target-attach' Command
----------------------------

Synopsis
........

      -target-attach PID | GID | FILE

   Attach to a process PID or a file FILE outside of GDB, or a thread
group GID.  If attaching to a thread group, the id previously returned
by `-list-thread-groups --available' must be used.

GDB Command
...........

The corresponding GDB command is `attach'.

Example
.......

     (gdb)
     -target-attach 34
     =thread-created,id="1"
     *stopped,thread-id="1",frame={addr="0xb7f7e410",func="bar",args=[]}
     ^done
     (gdb)

The `-target-detach' Command
----------------------------

Synopsis
........

      -target-detach [ PID | GID ]

   Detach from the remote target which normally resumes its execution.
If either PID or GID is specified, detaches from either the specified
process, or specified thread group.  There's no output.

GDB Command
...........

The corresponding GDB command is `detach'.

Example
.......

     (gdb)
     -target-detach
     ^done
     (gdb)

The `-target-disconnect' Command
--------------------------------

Synopsis
........

      -target-disconnect

   Disconnect from the remote target.  There's no output and the target
is generally not resumed.

GDB Command
...........

The corresponding GDB command is `disconnect'.

Example
.......

     (gdb)
     -target-disconnect
     ^done
     (gdb)

The `-target-download' Command
------------------------------

Synopsis
........

      -target-download

   Loads the executable onto the remote target.  It prints out an
update message every half second, which includes the fields:

`section'
     The name of the section.

`section-sent'
     The size of what has been sent so far for that section.

`section-size'
     The size of the section.

`total-sent'
     The total size of what was sent so far (the current and the
     previous sections).

`total-size'
     The size of the overall executable to download.

Each message is sent as status record (*note GDB/MI Output Syntax:
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:

`section'
     The name of the section.

`section-size'
     The size of the section.

`total-size'
     The size of the overall executable to download.

At the end, a summary is printed.

GDB Command
...........

The corresponding GDB command is `load'.

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.

     (gdb)
     -target-download
     +download,{section=".text",section-size="6668",total-size="9880"}
     +download,{section=".text",section-sent="512",section-size="6668",
     total-sent="512",total-size="9880"}
     +download,{section=".text",section-sent="1024",section-size="6668",
     total-sent="1024",total-size="9880"}
     +download,{section=".text",section-sent="1536",section-size="6668",
     total-sent="1536",total-size="9880"}
     +download,{section=".text",section-sent="2048",section-size="6668",
     total-sent="2048",total-size="9880"}
     +download,{section=".text",section-sent="2560",section-size="6668",
     total-sent="2560",total-size="9880"}
     +download,{section=".text",section-sent="3072",section-size="6668",
     total-sent="3072",total-size="9880"}
     +download,{section=".text",section-sent="3584",section-size="6668",
     total-sent="3584",total-size="9880"}
     +download,{section=".text",section-sent="4096",section-size="6668",
     total-sent="4096",total-size="9880"}
     +download,{section=".text",section-sent="4608",section-size="6668",
     total-sent="4608",total-size="9880"}
     +download,{section=".text",section-sent="5120",section-size="6668",
     total-sent="5120",total-size="9880"}
     +download,{section=".text",section-sent="5632",section-size="6668",
     total-sent="5632",total-size="9880"}
     +download,{section=".text",section-sent="6144",section-size="6668",
     total-sent="6144",total-size="9880"}
     +download,{section=".text",section-sent="6656",section-size="6668",
     total-sent="6656",total-size="9880"}
     +download,{section=".init",section-size="28",total-size="9880"}
     +download,{section=".fini",section-size="28",total-size="9880"}
     +download,{section=".data",section-size="3156",total-size="9880"}
     +download,{section=".data",section-sent="512",section-size="3156",
     total-sent="7236",total-size="9880"}
     +download,{section=".data",section-sent="1024",section-size="3156",
     total-sent="7748",total-size="9880"}
     +download,{section=".data",section-sent="1536",section-size="3156",
     total-sent="8260",total-size="9880"}
     +download,{section=".data",section-sent="2048",section-size="3156",
     total-sent="8772",total-size="9880"}
     +download,{section=".data",section-sent="2560",section-size="3156",
     total-sent="9284",total-size="9880"}
     +download,{section=".data",section-sent="3072",section-size="3156",
     total-sent="9796",total-size="9880"}
     ^done,address="0x10004",load-size="9880",transfer-rate="6586",
     write-rate="429"
     (gdb)

GDB Command
...........

No equivalent.

Example
.......

N.A.

The `-target-select' Command
----------------------------

Synopsis
........

      -target-select TYPE PARAMETERS ...

   Connect GDB to the remote target.  This command takes two args:

`TYPE'
     The type of target, for instance `remote', etc.

`PARAMETERS'
     Device names, host names and the like.  *Note Commands for
     Managing Targets: Target Commands, for more details.

   The output is a connection notification, followed by the address at
which the target program is, in the following form:

     ^connected,addr="ADDRESS",func="FUNCTION NAME",
       args=[ARG LIST]

GDB Command
...........

The corresponding GDB command is `target'.

Example
.......

     (gdb)
     -target-select remote /dev/ttya
     ^connected,addr="0xfe00a300",func="??",args=[]
     (gdb)


File: gdb.info,  Node: GDB/MI File Transfer Commands,  Next: GDB/MI Miscellaneous Commands,  Prev: GDB/MI Target Manipulation,  Up: GDB/MI

27.20 GDB/MI File Transfer Commands
===================================

The `-target-file-put' Command
------------------------------

Synopsis
........

      -target-file-put HOSTFILE TARGETFILE

   Copy file HOSTFILE from the host system (the machine running GDB) to
TARGETFILE on the target system.

GDB Command
...........

The corresponding GDB command is `remote put'.

Example
.......

     (gdb)
     -target-file-put localfile remotefile
     ^done
     (gdb)

The `-target-file-get' Command
------------------------------

Synopsis
........

      -target-file-get TARGETFILE HOSTFILE

   Copy file TARGETFILE from the target system to HOSTFILE on the host
system.

GDB Command
...........

The corresponding GDB command is `remote get'.

Example
.......

     (gdb)
     -target-file-get remotefile localfile
     ^done
     (gdb)

The `-target-file-delete' Command
---------------------------------

Synopsis
........

      -target-file-delete TARGETFILE

   Delete TARGETFILE from the target system.

GDB Command
...........

The corresponding GDB command is `remote delete'.

Example
.......

     (gdb)
     -target-file-delete remotefile
     ^done
     (gdb)


File: gdb.info,  Node: GDB/MI Miscellaneous Commands,  Prev: GDB/MI File Transfer Commands,  Up: GDB/MI

27.21 Miscellaneous GDB/MI Commands
===================================

The `-gdb-exit' Command
-----------------------

Synopsis
........

      -gdb-exit

   Exit GDB immediately.

GDB Command
...........

Approximately corresponds to `quit'.

Example
.......

     (gdb)
     -gdb-exit
     ^exit

The `-gdb-set' Command
----------------------

Synopsis
........

      -gdb-set

   Set an internal GDB variable.

GDB Command
...........

The corresponding GDB command is `set'.

Example
.......

     (gdb)
     -gdb-set $foo=3
     ^done
     (gdb)

The `-gdb-show' Command
-----------------------

Synopsis
........

      -gdb-show

   Show the current value of a GDB variable.

GDB Command
...........

The corresponding GDB command is `show'.

Example
.......

     (gdb)
     -gdb-show annotate
     ^done,value="0"
     (gdb)

The `-gdb-version' Command
--------------------------

Synopsis
........

      -gdb-version

   Show version information for GDB.  Used mostly in testing.

GDB Command
...........

The GDB equivalent is `show version'.  GDB by default shows this
information when you start an interactive session.

Example
.......

     (gdb)
     -gdb-version
     ~GNU gdb 5.2.1
     ~Copyright 2000 Free Software Foundation, Inc.
     ~GDB is free software, covered by the GNU General Public License, and
     ~you are welcome to change it and/or distribute copies of it under
     ~ certain conditions.
     ~Type "show copying" to see the conditions.
     ~There is absolutely no warranty for GDB.  Type "show warranty" for
     ~ details.
     ~This GDB was configured as
      "--host=sparc-sun-solaris2.5.1 --target=ppc-eabi".
     ^done
     (gdb)

The `-list-features' Command
----------------------------

Returns a list of particular features of the MI protocol that this
version of gdb implements.  A feature can be a command, or a new field
in an output of some command, or even an important bugfix.  While a
frontend can sometimes detect presence of a feature at runtime, it is
easier to perform detection at debugger startup.

   The command returns a list of strings, with each string naming an
available feature.  Each returned string is just a name, it does not
have any internal structure.  The list of possible feature names is
given below.

   Example output:

     (gdb) -list-features
     ^done,result=["feature1","feature2"]

   The current list of features is:

`frozen-varobjs'
     Indicates support for the `-var-set-frozen' command, as well as
     possible presense of the `frozen' field in the output of
     `-varobj-create'.

`pending-breakpoints'
     Indicates support for the `-f' option to the `-break-insert'
     command.

`python'
     Indicates Python scripting support, Python-based pretty-printing
     commands, and possible presence of the `display_hint' field in the
     output of `-var-list-children'

`thread-info'
     Indicates support for the `-thread-info' command.

`data-read-memory-bytes'
     Indicates support for the `-data-read-memory-bytes' and the
     `-data-write-memory-bytes' commands.

`breakpoint-notifications'
     Indicates that changes to breakpoints and breakpoints created via
     the CLI will be announced via async records.

`ada-task-info'
     Indicates support for the `-ada-task-info' command.

The `-list-target-features' Command
-----------------------------------

Returns a list of particular features that are supported by the target.
Those features affect the permitted MI commands, but unlike the
features reported by the `-list-features' command, the features depend
on which target GDB is using at the moment.  Whenever a target can
change, due to commands such as `-target-select', `-target-attach' or
`-exec-run', the list of target features may change, and the frontend
should obtain it again.  Example output:

     (gdb) -list-features
     ^done,result=["async"]

   The current list of features is:

`async'
     Indicates that the target is capable of asynchronous command
     execution, which means that GDB will accept further commands while
     the target is running.

`reverse'
     Indicates that the target is capable of reverse execution.  *Note
     Reverse Execution::, for more information.


The `-list-thread-groups' Command
---------------------------------

Synopsis
--------

     -list-thread-groups [ --available ] [ --recurse 1 ] [ GROUP ... ]

   Lists thread groups (*note Thread groups::).  When a single thread
group is passed as the argument, lists the children of that group.
When several thread group are passed, lists information about those
thread groups.  Without any parameters, lists information about all
top-level thread groups.

   Normally, thread groups that are being debugged are reported.  With
the `--available' option, GDB reports thread groups available on the
target.

   The output of this command may have either a `threads' result or a
`groups' result.  The `thread' result has a list of tuples as value,
with each tuple describing a thread (*note GDB/MI Thread
Information::).  The `groups' result has a list of tuples as value,
each tuple describing a thread group.  If top-level groups are
requested (that is, no parameter is passed), or when several groups are
passed, the output always has a `groups' result.  The format of the
`group' result is described below.

   To reduce the number of roundtrips it's possible to list thread
groups together with their children, by passing the `--recurse' option
and the recursion depth.  Presently, only recursion depth of 1 is
permitted.  If this option is present, then every reported thread group
will also include its children, either as `group' or `threads' field.

   In general, any combination of option and parameters is permitted,
with the following caveats:

   * When a single thread group is passed, the output will typically be
     the `threads' result.  Because threads may not contain anything,
     the `recurse' option will be ignored.

   * When the `--available' option is passed, limited information may
     be available.  In particular, the list of threads of a process
     might be inaccessible.  Further, specifying specific thread groups
     might not give any performance advantage over listing all thread
     groups.  The frontend should assume that `-list-thread-groups
     --available' is always an expensive operation and cache the
     results.


   The `groups' result is a list of tuples, where each tuple may have
the following fields:

`id'
     Identifier of the thread group.  This field is always present.
     The identifier is an opaque string; frontends should not try to
     convert it to an integer, even though it might look like one.

`type'
     The type of the thread group.  At present, only `process' is a
     valid type.

`pid'
     The target-specific process identifier.  This field is only present
     for thread groups of type `process' and only if the process exists.

`num_children'
     The number of children this thread group has.  This field may be
     absent for an available thread group.

`threads'
     This field has a list of tuples as value, each tuple describing a
     thread.  It may be present if the `--recurse' option is specified,
     and it's actually possible to obtain the threads.

`cores'
     This field is a list of integers, each identifying a core that one
     thread of the group is running on.  This field may be absent if
     such information is not available.

`executable'
     The name of the executable file that corresponds to this thread
     group.  The field is only present for thread groups of type
     `process', and only if there is a corresponding executable file.


Example
-------

     gdb
     -list-thread-groups
     ^done,groups=[{id="17",type="process",pid="yyy",num_children="2"}]
     -list-thread-groups 17
     ^done,threads=[{id="2",target-id="Thread 0xb7e14b90 (LWP 21257)",
        frame={level="0",addr="0xffffe410",func="__kernel_vsyscall",args=[]},state="running"},
     {id="1",target-id="Thread 0xb7e156b0 (LWP 21254)",
        frame={level="0",addr="0x0804891f",func="foo",args=[{name="i",value="10"}],
                file="/tmp/a.c",fullname="/tmp/a.c",line="158"},state="running"}]]
     -list-thread-groups --available
     ^done,groups=[{id="17",type="process",pid="yyy",num_children="2",cores=[1,2]}]
     -list-thread-groups --available --recurse 1
      ^done,groups=[{id="17", types="process",pid="yyy",num_children="2",cores=[1,2],
                     threads=[{id="1",target-id="Thread 0xb7e14b90",cores=[1]},
                              {id="2",target-id="Thread 0xb7e14b90",cores=[2]}]},..]
     -list-thread-groups --available --recurse 1 17 18
     ^done,groups=[{id="17", types="process",pid="yyy",num_children="2",cores=[1,2],
                    threads=[{id="1",target-id="Thread 0xb7e14b90",cores=[1]},
                             {id="2",target-id="Thread 0xb7e14b90",cores=[2]}]},...]

The `-add-inferior' Command
---------------------------

Synopsis
--------

     -add-inferior

   Creates a new inferior (*note Inferiors and Programs::).  The created
inferior is not associated with any executable.  Such association may
be established with the `-file-exec-and-symbols' command (*note GDB/MI
File Commands::).  The command response has a single field,
`thread-group', whose value is the identifier of the thread group
corresponding to the new inferior.

Example
-------

     gdb
     -add-inferior
     ^done,thread-group="i3"

The `-interpreter-exec' Command
-------------------------------

Synopsis
--------

     -interpreter-exec INTERPRETER COMMAND
Execute the specified COMMAND in the given INTERPRETER.

GDB Command
-----------

The corresponding GDB command is `interpreter-exec'.

Example
-------

     (gdb)
     -interpreter-exec console "break main"
     &"During symbol reading, couldn't parse type; debugger out of date?.\n"
     &"During symbol reading, bad structure-type format.\n"
     ~"Breakpoint 1 at 0x8074fc6: file ../../src/gdb/main.c, line 743.\n"
     ^done
     (gdb)

The `-inferior-tty-set' Command
-------------------------------

Synopsis
--------

     -inferior-tty-set /dev/pts/1

   Set terminal for future runs of the program being debugged.

GDB Command
-----------

The corresponding GDB command is `set inferior-tty' /dev/pts/1.

Example
-------

     (gdb)
     -inferior-tty-set /dev/pts/1
     ^done
     (gdb)

The `-inferior-tty-show' Command
--------------------------------

Synopsis
--------

     -inferior-tty-show

   Show terminal for future runs of program being debugged.

GDB Command
-----------

The corresponding GDB command is `show inferior-tty'.

Example
-------

     (gdb)
     -inferior-tty-set /dev/pts/1
     ^done
     (gdb)
     -inferior-tty-show
     ^done,inferior_tty_terminal="/dev/pts/1"
     (gdb)

The `-enable-timings' Command
-----------------------------

Synopsis
--------

     -enable-timings [yes | no]

   Toggle the printing of the wallclock, user and system times for an MI
command as a field in its output.  This command is to help frontend
developers optimize the performance of their code.  No argument is
equivalent to `yes'.

GDB Command
-----------

No equivalent.

Example
-------

     (gdb)
     -enable-timings
     ^done
     (gdb)
     -break-insert main
     ^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x080484ed",func="main",file="myprog.c",
     fullname="/home/nickrob/myprog.c",line="73",times="0"},
     time={wallclock="0.05185",user="0.00800",system="0.00000"}
     (gdb)
     -enable-timings no
     ^done
     (gdb)
     -exec-run
     ^running
     (gdb)
     *stopped,reason="breakpoint-hit",disp="keep",bkptno="1",thread-id="0",
     frame={addr="0x080484ed",func="main",args=[{name="argc",value="1"},
     {name="argv",value="0xbfb60364"}],file="myprog.c",
     fullname="/home/nickrob/myprog.c",line="73"}
     (gdb)


File: gdb.info,  Node: Annotations,  Next: JIT Interface,  Prev: GDB/MI,  Up: Top

28 GDB Annotations
******************

This chapter describes annotations in GDB.  Annotations were designed
to interface GDB to graphical user interfaces or other similar programs
which want to interact with GDB at a relatively high level.

   The annotation mechanism has largely been superseded by GDB/MI
(*note GDB/MI::).

* Menu:

* Annotations Overview::  What annotations are; the general syntax.
* Server Prefix::       Issuing a command without affecting user state.
* Prompting::           Annotations marking GDB's need for input.
* Errors::              Annotations for error messages.
* Invalidation::        Some annotations describe things now invalid.
* Annotations for Running::
                        Whether the program is running, how it stopped, etc.
* Source Annotations::  Annotations describing source code.


File: gdb.info,  Node: Annotations Overview,  Next: Server Prefix,  Up: Annotations

28.1 What is an Annotation?
===========================

Annotations start with a newline character, two `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 `control-z'
characters denotes literal output from GDB.  Currently there is no need
for GDB to output a newline followed by two `control-z' characters, but
if there was such a need, the annotations could be extended with an
`escape' annotation which means those three characters as output.

   The annotation LEVEL, which is specified using the `--annotate'
command line option (*note Mode Options::), controls how much
information GDB prints together with its prompt, values of expressions,
source lines, and other types of output.  Level 0 is for no
annotations, level 1 is for use when GDB is run as a subprocess of GNU
Emacs, level 3 is the maximum annotation suitable for programs that
control GDB, and level 2 annotations have been made obsolete (*note
Limitations of the Annotation Interface: (annotate)Limitations.).

`set annotate LEVEL'
     The GDB command `set annotate' sets the level of annotations to
     the specified LEVEL.

`show annotate'
     Show the current annotation level.

   This chapter describes level 3 annotations.

   A simple example of starting up GDB with annotations is:

     $ gdb --annotate=3
     GNU gdb 6.0
     Copyright 2003 Free Software Foundation, Inc.
     GDB is free software, covered by the GNU General Public License,
     and you are welcome to change it and/or distribute copies of it
     under certain conditions.
     Type "show copying" to see the conditions.
     There is absolutely no warranty for GDB.  Type "show warranty"
     for details.
     This GDB was configured as "i386-pc-linux-gnu"

     ^Z^Zpre-prompt
     (gdb)
     ^Z^Zprompt
     quit

     ^Z^Zpost-prompt
     $

   Here `quit' is input to GDB; the rest is output from GDB.  The three
lines beginning `^Z^Z' (where `^Z' denotes a `control-z' character) are
annotations; the rest is output from GDB.


File: gdb.info,  Node: Server Prefix,  Next: Prompting,  Prev: Annotations Overview,  Up: Annotations

28.2 The Server Prefix
======================

If you prefix a command with `server ' then it will not affect the
command history, nor will it affect GDB's notion of which command to
repeat if <RET> is pressed on a line by itself.  This means that
commands can be run behind a user's back by a front-end in a
transparent manner.

   The `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 `output' command instead of the `print' command.

   Using this prefix also disables confirmation requests (*note
confirmation requests::).


File: gdb.info,  Node: Prompting,  Next: Errors,  Prev: Server Prefix,  Up: Annotations

28.3 Annotation for GDB Input
=============================

When GDB 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 "input type".  Each
input type has three annotations: a `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 `post-' annotation
which denotes the end of any echo which may (or may not) be associated
with the input.  For example, the `prompt' input type features the
following annotations:

     ^Z^Zpre-prompt
     ^Z^Zprompt
     ^Z^Zpost-prompt

   The input types are

`prompt'
     When GDB is prompting for a command (the main GDB prompt).

`commands'
     When GDB prompts for a set of commands, like in the `commands'
     command.  The annotations are repeated for each command which is
     input.

`overload-choice'
     When GDB wants the user to select between various overloaded
     functions.

`query'
     When GDB wants the user to confirm a potentially dangerous
     operation.

`prompt-for-continue'
     When GDB is asking the user to press return to continue.  Note:
     Don't expect this to work well; instead use `set height 0' to
     disable prompting.  This is because the counting of lines is buggy
     in the presence of annotations.


File: gdb.info,  Node: Errors,  Next: Invalidation,  Prev: Prompting,  Up: Annotations

28.4 Errors
===========

     ^Z^Zquit

   This annotation occurs right before GDB responds to an interrupt.

     ^Z^Zerror

   This annotation occurs right before GDB responds to an error.

   Quit and error annotations indicate that any annotations which GDB
was in the middle of may end abruptly.  For example, if a
`value-history-begin' annotation is followed by a `error', one cannot
expect to receive the matching `value-history-end'.  One cannot expect
not to receive it either, however; an error annotation does not
necessarily mean that GDB is immediately returning all the way to the
top level.

   A quit or error annotation may be preceded by

     ^Z^Zerror-begin

   Any output between that and the quit or error annotation is the error
message.

   Warning messages are not yet annotated.


File: gdb.info,  Node: Invalidation,  Next: Annotations for Running,  Prev: Errors,  Up: Annotations

28.5 Invalidation Notices
=========================

The following annotations say that certain pieces of state may have
changed.

`^Z^Zframes-invalid'
     The frames (for example, output from the `backtrace' command) may
     have changed.

`^Z^Zbreakpoints-invalid'
     The breakpoints may have changed.  For example, the user just
     added or deleted a breakpoint.


File: gdb.info,  Node: Annotations for Running,  Next: Source Annotations,  Prev: Invalidation,  Up: Annotations

28.6 Running the Program
========================

When the program starts executing due to a GDB command such as `step'
or `continue',

     ^Z^Zstarting

   is output.  When the program stops,

     ^Z^Zstopped

   is output.  Before the `stopped' annotation, a variety of
annotations describe how the program stopped.

`^Z^Zexited EXIT-STATUS'
     The program exited, and EXIT-STATUS is the exit status (zero for
     successful exit, otherwise nonzero).

`^Z^Zsignalled'
     The program exited with a signal.  After the `^Z^Zsignalled', the
     annotation continues:

          INTRO-TEXT
          ^Z^Zsignal-name
          NAME
          ^Z^Zsignal-name-end
          MIDDLE-TEXT
          ^Z^Zsignal-string
          STRING
          ^Z^Zsignal-string-end
          END-TEXT

     where NAME is the name of the signal, such as `SIGILL' or
     `SIGSEGV', and STRING is the explanation of the signal, such as
     `Illegal Instruction' or `Segmentation fault'.  INTRO-TEXT,
     MIDDLE-TEXT, and END-TEXT are for the user's benefit and have no
     particular format.

`^Z^Zsignal'
     The syntax of this annotation is just like `signalled', but GDB is
     just saying that the program received the signal, not that it was
     terminated with it.

`^Z^Zbreakpoint NUMBER'
     The program hit breakpoint number NUMBER.

`^Z^Zwatchpoint NUMBER'
     The program hit watchpoint number NUMBER.


File: gdb.info,  Node: Source Annotations,  Prev: Annotations for Running,  Up: Annotations

28.7 Displaying Source
======================

The following annotation is used instead of displaying source code:

     ^Z^Zsource FILENAME:LINE:CHARACTER:MIDDLE:ADDR

   where FILENAME is an absolute file name indicating which source
file, LINE is the line number within that file (where 1 is the first
line in the file), 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), MIDDLE is
`middle' if ADDR is in the middle of the line, or `beg' if ADDR is at
the beginning of the line, and ADDR is the address in the target
program associated with the source which is being displayed.  ADDR is
in the form `0x' followed by one or more lowercase hex digits (note
that this does not depend on the language).


File: gdb.info,  Node: JIT Interface,  Next: GDB Bugs,  Prev: Annotations,  Up: Top

29 JIT Compilation Interface
****************************

This chapter documents GDB's "just-in-time" (JIT) compilation
interface.  A JIT compiler is a program or library that generates native
executable code at runtime and executes it, usually in order to achieve
good performance while maintaining platform independence.

   Programs that use JIT compilation are normally difficult to debug
because portions of their code are generated at runtime, instead of
being loaded from object files, which is where GDB normally finds the
program's symbols and debug information.  In order to debug programs
that use JIT compilation, GDB has an interface that allows the program
to register in-memory symbol files with GDB at runtime.

   If you are using GDB to debug a program that uses this interface,
then it should work transparently so long as you have not stripped the
binary.  If you are developing a JIT compiler, then the interface is
documented in the rest of this chapter.  At this time, the only known
client of this interface is the LLVM JIT.

   Broadly speaking, the JIT interface mirrors the dynamic loader
interface.  The JIT compiler communicates with GDB by writing data into
a global variable and calling a fuction at a well-known symbol.  When
GDB attaches, it reads a linked list of symbol files from the global
variable to find existing code, and puts a breakpoint in the function
so that it can find out about additional code.

* Menu:

* Declarations::                Relevant C struct declarations
* Registering Code::            Steps to register code
* Unregistering Code::          Steps to unregister code
* Custom Debug Info::           Emit debug information in a custom format


File: gdb.info,  Node: Declarations,  Next: Registering Code,  Up: JIT Interface

29.1 JIT Declarations
=====================

These are the relevant struct declarations that a C program should
include to implement the interface:

     typedef enum
     {
       JIT_NOACTION = 0,
       JIT_REGISTER_FN,
       JIT_UNREGISTER_FN
     } jit_actions_t;

     struct jit_code_entry
     {
       struct jit_code_entry *next_entry;
       struct jit_code_entry *prev_entry;
       const char *symfile_addr;
       uint64_t symfile_size;
     };

     struct jit_descriptor
     {
       uint32_t version;
       /* This type should be jit_actions_t, but we use uint32_t
          to be explicit about the bitwidth.  */
       uint32_t action_flag;
       struct jit_code_entry *relevant_entry;
       struct jit_code_entry *first_entry;
     };

     /* GDB puts a breakpoint in this function.  */
     void __attribute__((noinline)) __jit_debug_register_code() { };

     /* Make sure to specify the version statically, because the
        debugger may check the version before we can set it.  */
     struct jit_descriptor __jit_debug_descriptor = { 1, 0, 0, 0 };

   If the JIT is multi-threaded, then it is important that the JIT
synchronize any modifications to this global data properly, which can
easily be done by putting a global mutex around modifications to these
structures.


File: gdb.info,  Node: Registering Code,  Next: Unregistering Code,  Prev: Declarations,  Up: JIT Interface

29.2 Registering Code
=====================

To register code with GDB, the JIT should follow this protocol:

   * Generate an object file in memory with symbols and other desired
     debug information.  The file must include the virtual addresses of
     the sections.

   * Create a code entry for the file, which gives the start and size
     of the symbol file.

   * Add it to the linked list in the JIT descriptor.

   * Point the relevant_entry field of the descriptor at the entry.

   * Set `action_flag' to `JIT_REGISTER' and call
     `__jit_debug_register_code'.

   When GDB is attached and the breakpoint fires, GDB uses the
`relevant_entry' pointer so it doesn't have to walk the list looking for
new code.  However, the linked list must still be maintained in order
to allow GDB to attach to a running process and still find the symbol
files.


File: gdb.info,  Node: Unregistering Code,  Next: Custom Debug Info,  Prev: Registering Code,  Up: JIT Interface

29.3 Unregistering Code
=======================

If code is freed, then the JIT should use the following protocol:

   * Remove the code entry corresponding to the code from the linked
     list.

   * Point the `relevant_entry' field of the descriptor at the code
     entry.

   * Set `action_flag' to `JIT_UNREGISTER' and call
     `__jit_debug_register_code'.

   If the JIT frees or recompiles code without unregistering it, then
GDB and the JIT will leak the memory used for the associated symbol
files.


File: gdb.info,  Node: Custom Debug Info,  Prev: Unregistering Code,  Up: JIT Interface

29.4 Custom Debug Info
======================

Generating debug information in platform-native file formats (like ELF
or COFF) may be an overkill for JIT compilers; especially if all the
debug info is used for is displaying a meaningful backtrace.  The issue
can be resolved by having the JIT writers decide on a debug info format
and also provide a reader that parses the debug info generated by the
JIT compiler.  This section gives a brief overview on writing such a
parser.  More specific details can be found in the source file
`gdb/jit-reader.in', which is also installed as a header at
`INCLUDEDIR/gdb/jit-reader.h' for easy inclusion.

   The reader is implemented as a shared object (so this functionality
is not available on platforms which don't allow loading shared objects
at runtime).  Two GDB commands, `jit-reader-load' and
`jit-reader-unload' are provided, to be used to load and unload the
readers from a preconfigured directory.  Once loaded, the shared object
is used the parse the debug information emitted by the JIT compiler.

* Menu:

* Using JIT Debug Info Readers::       How to use supplied readers correctly
* Writing JIT Debug Info Readers::     Creating a debug-info reader


File: gdb.info,  Node: Using JIT Debug Info Readers,  Next: Writing JIT Debug Info Readers,  Up: Custom Debug Info

29.4.1 Using JIT Debug Info Readers
-----------------------------------

Readers can be loaded and unloaded using the `jit-reader-load' and
`jit-reader-unload' commands.

`jit-reader-load READER-NAME'
     Load the JIT reader named READER-NAME.  On a UNIX system, this
     will usually load `LIBDIR/gdb/READER-NAME', where LIBDIR is the
     system library directory, usually `/usr/local/lib'.  Only one
     reader can be active at a time; trying to load a second reader
     when one is already loaded will result in GDB reporting an error.
     A new JIT reader can be loaded by first unloading the current one
     using `jit-reader-load' and then invoking `jit-reader-load'.

`jit-reader-unload'
     Unload the currently loaded JIT reader.



File: gdb.info,  Node: Writing JIT Debug Info Readers,  Prev: Using JIT Debug Info Readers,  Up: Custom Debug Info

29.4.2 Writing JIT Debug Info Readers
-------------------------------------

As mentioned, a reader is essentially a shared object conforming to a
certain ABI.  This ABI is described in `jit-reader.h'.

   `jit-reader.h' defines the structures, macros and functions required
to write a reader.  It is installed (along with GDB), in
`INCLUDEDIR/gdb' where INCLUDEDIR is the system include directory.

   Readers need to be released under a GPL compatible license.  A reader
can be declared as released under such a license by placing the macro
`GDB_DECLARE_GPL_COMPATIBLE_READER' in a source file.

   The entry point for readers is the symbol `gdb_init_reader', which
is expected to be a function with the prototype

     extern struct gdb_reader_funcs *gdb_init_reader (void);

   `struct gdb_reader_funcs' contains a set of pointers to callback
functions.  These functions are executed to read the debug info
generated by the JIT compiler (`read'), to unwind stack frames
(`unwind') and to create canonical frame IDs (`get_Frame_id').  It also
has a callback that is called when the reader is being unloaded
(`destroy').  The struct looks like this

     struct gdb_reader_funcs
     {
       /* Must be set to GDB_READER_INTERFACE_VERSION.  */
       int reader_version;

       /* For use by the reader.  */
       void *priv_data;

       gdb_read_debug_info *read;
       gdb_unwind_frame *unwind;
       gdb_get_frame_id *get_frame_id;
       gdb_destroy_reader *destroy;
     };

   The callbacks are provided with another set of callbacks by GDB to
do their job.  For `read', these callbacks are passed in a `struct
gdb_symbol_callbacks' and for `unwind' and `get_frame_id', in a `struct
gdb_unwind_callbacks'.  `struct gdb_symbol_callbacks' has callbacks to
create new object files and new symbol tables inside those object
files.  `struct gdb_unwind_callbacks' has callbacks to read registers
off the current frame and to write out the values of the registers in
the previous frame.  Both have a callback (`target_read') to read bytes
off the target's address space.


File: gdb.info,  Node: GDB Bugs,  Next: Command Line Editing,  Prev: JIT Interface,  Up: Top

30 Reporting Bugs in GDB
************************

Your bug reports play an essential role in making GDB 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 GDB work
better.  Bug reports are your contribution to the maintenance of GDB.

   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


File: gdb.info,  Node: Bug Criteria,  Next: Bug Reporting,  Up: GDB Bugs

30.1 Have You Found a Bug?
==========================

If you are not sure whether you have found a bug, here are some
guidelines:

   * If the debugger gets a fatal signal, for any input whatever, that
     is a GDB bug.  Reliable debuggers never crash.

   * If GDB 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.)

   * If GDB 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".

   * If you are an experienced user of debugging tools, your suggestions
     for improvement of GDB are welcome in any case.


File: gdb.info,  Node: Bug Reporting,  Prev: Bug Criteria,  Up: GDB Bugs

30.2 How to Report Bugs
=======================

A number of companies and individuals offer support for GNU products.
If you obtained GDB 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 `etc/SERVICE' in the GNU Emacs distribution.

   In any event, we also recommend that you submit bug reports for GDB
to `mailto:mrvlgccbug@gmail.com'.

   The fundamental principle of reporting bugs usefully is this:
*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 _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:

   * The version of GDB.  GDB announces it if you start with no
     arguments; you can also print it at any time using `show version'.

     Without this, we will not know whether there is any point in
     looking for the bug in the current version of GDB.

   * The type of machine you are using, and the operating system name
     and version number.

   * What compiler (and its version) was used to compile GDB--e.g.
     "gcc-2.8.1".

   * What compiler (and its version) was used to compile the program
     you are debugging--e.g.  "gcc-2.8.1", or "HP92453-01 A.10.32.03 HP
     C Compiler".  For GCC, you can say `gcc --version' to get this
     information; for other compilers, see the documentation for those
     compilers.

   * The command arguments you gave the compiler to compile your
     example and observe the bug.  For example, did you use `-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.

   * A complete input script, and all necessary source files, that will
     reproduce the bug.

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

     To collect all this information, you can use a session recording
     program such as `script', which is available on many Unix systems.
     Just run your GDB session inside `script' and then include the
     `typescript' file with your bug report.

     Another way to record a GDB session is to run GDB inside Emacs and
     then save the entire buffer to a file.

   * If you wish to suggest changes to the GDB source, send us context
     diffs.  If you even discuss something in the GDB 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.


   Here are some things that are not necessary:

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

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

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


File: gdb.info,  Node: Command Line Editing,  Next: Using History Interactively,  Prev: GDB Bugs,  Up: Top

31 Command Line Editing
***********************

This chapter describes the basic features of the GNU command line
editing interface.

* Menu:

* Introduction and Notation::	Notation used in this text.
* Readline Interaction::	The minimum set of commands for editing a line.
* Readline Init File::		Customizing Readline from a user's view.
* Bindable Readline Commands::	A description of most of the Readline commands
				available for binding
* Readline vi Mode::		A short description of how to make Readline
				behave like the vi editor.


File: gdb.info,  Node: Introduction and Notation,  Next: Readline Interaction,  Up: Command Line Editing

31.1 Introduction to Line Editing
=================================

The following paragraphs describe the notation used to represent
keystrokes.

   The text `C-k' is read as `Control-K' and describes the character
produced when the <k> key is pressed while the Control key is depressed.

   The text `M-k' is read as `Meta-K' and describes the character
produced when the Meta key (if you have one) is depressed, and the <k>
key is pressed.  The Meta key is labeled <ALT> on many keyboards.  On
keyboards with two keys labeled <ALT> (usually to either side of the
space bar), the <ALT> on the left side is generally set to work as a
Meta key.  The <ALT> key on the right may also be configured to work as
a Meta key or may be configured as some other modifier, such as a
Compose key for typing accented characters.

   If you do not have a Meta or <ALT> key, or another key working as a
Meta key, the identical keystroke can be generated by typing <ESC>
_first_, and then typing <k>.  Either process is known as "metafying"
the <k> key.

   The text `M-C-k' is read as `Meta-Control-k' and describes the
character produced by "metafying" `C-k'.

   In addition, several keys have their own names.  Specifically,
<DEL>, <ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves
when seen in this text, or in an init file (*note Readline Init File::).
If your keyboard lacks a <LFD> key, typing <C-j> will produce the
desired character.  The <RET> key may be labeled <Return> or <Enter> on
some keyboards.


File: gdb.info,  Node: Readline Interaction,  Next: Readline Init File,  Prev: Introduction and Notation,  Up: Command Line Editing

31.2 Readline Interaction
=========================

Often during an interactive session you type in a long line of text,
only to notice that the first word on the line is misspelled.  The
Readline library gives you a set of commands for manipulating the text
as you type it in, allowing you to just fix your typo, and not forcing
you to retype the majority of the line.  Using these editing commands,
you move the cursor to the place that needs correction, and delete or
insert the text of the corrections.  Then, when you are satisfied with
the line, you simply press <RET>.  You do not have to be at the end of
the line to press <RET>; the entire line is accepted regardless of the
location of the cursor within the line.

* Menu:

* Readline Bare Essentials::	The least you need to know about Readline.
* Readline Movement Commands::	Moving about the input line.
* Readline Killing Commands::	How to delete text, and how to get it back!
* Readline Arguments::		Giving numeric arguments to commands.
* Searching::			Searching through previous lines.


File: gdb.info,  Node: Readline Bare Essentials,  Next: Readline Movement Commands,  Up: Readline Interaction

31.2.1 Readline Bare Essentials
-------------------------------

In order to enter characters into the line, simply type them.  The typed
character appears where the cursor was, and then the cursor moves one
space to the right.  If you mistype a character, you can use your erase
character to back up and delete the mistyped character.

   Sometimes you may mistype a character, and not notice the error
until you have typed several other characters.  In that case, you can
type `C-b' to move the cursor to the left, and then correct your
mistake.  Afterwards, you can move the cursor to the right with `C-f'.

   When you add text in the middle of a line, you will notice that
characters to the right of the cursor are `pushed over' to make room
for the text that you have inserted.  Likewise, when you delete text
behind the cursor, characters to the right of the cursor are `pulled
back' to fill in the blank space created by the removal of the text.  A
list of the bare essentials for editing the text of an input line
follows.

`C-b'
     Move back one character.

`C-f'
     Move forward one character.

<DEL> or <Backspace>
     Delete the character to the left of the cursor.

`C-d'
     Delete the character underneath the cursor.

Printing characters
     Insert the character into the line at the cursor.

`C-_' or `C-x C-u'
     Undo the last editing command.  You can undo all the way back to an
     empty line.

(Depending on your configuration, the <Backspace> key be set to delete
the character to the left of the cursor and the <DEL> key set to delete
the character underneath the cursor, like `C-d', rather than the
character to the left of the cursor.)


File: gdb.info,  Node: Readline Movement Commands,  Next: Readline Killing Commands,  Prev: Readline Bare Essentials,  Up: Readline Interaction

31.2.2 Readline Movement Commands
---------------------------------

The above table describes the most basic keystrokes that you need in
order to do editing of the input line.  For your convenience, many
other commands have been added in addition to `C-b', `C-f', `C-d', and
<DEL>.  Here are some commands for moving more rapidly about the line.

`C-a'
     Move to the start of the line.

`C-e'
     Move to the end of the line.

`M-f'
     Move forward a word, where a word is composed of letters and
     digits.

`M-b'
     Move backward a word.

`C-l'
     Clear the screen, reprinting the current line at the top.

   Notice how `C-f' moves forward a character, while `M-f' moves
forward a word.  It is a loose convention that control keystrokes
operate on characters while meta keystrokes operate on words.


File: gdb.info,  Node: Readline Killing Commands,  Next: Readline Arguments,  Prev: Readline Movement Commands,  Up: Readline Interaction

31.2.3 Readline Killing Commands
--------------------------------

"Killing" text means to delete the text from the line, but to save it
away for later use, usually by "yanking" (re-inserting) it back into
the line.  (`Cut' and `paste' are more recent jargon for `kill' and
`yank'.)

   If the description for a command says that it `kills' text, then you
can be sure that you can get the text back in a different (or the same)
place later.

   When you use a kill command, the text is saved in a "kill-ring".
Any number of consecutive kills save all of the killed text together, so
that when you yank it back, you get it all.  The kill ring is not line
specific; the text that you killed on a previously typed line is
available to be yanked back later, when you are typing another line.  

   Here is the list of commands for killing text.

`C-k'
     Kill the text from the current cursor position to the end of the
     line.

`M-d'
     Kill from the cursor to the end of the current word, or, if between
     words, to the end of the next word.  Word boundaries are the same
     as those used by `M-f'.

`M-<DEL>'
     Kill from the cursor the start of the current word, or, if between
     words, to the start of the previous word.  Word boundaries are the
     same as those used by `M-b'.

`C-w'
     Kill from the cursor to the previous whitespace.  This is
     different than `M-<DEL>' because the word boundaries differ.


   Here is how to "yank" the text back into the line.  Yanking means to
copy the most-recently-killed text from the kill buffer.

`C-y'
     Yank the most recently killed text back into the buffer at the
     cursor.

`M-y'
     Rotate the kill-ring, and yank the new top.  You can only do this
     if the prior command is `C-y' or `M-y'.


File: gdb.info,  Node: Readline Arguments,  Next: Searching,  Prev: Readline Killing Commands,  Up: Readline Interaction

31.2.4 Readline Arguments
-------------------------

You can pass numeric arguments to Readline commands.  Sometimes the
argument acts as a repeat count, other times it is the sign of the
argument that is significant.  If you pass a negative argument to a
command which normally acts in a forward direction, that command will
act in a backward direction.  For example, to kill text back to the
start of the line, you might type `M-- C-k'.

   The general way to pass numeric arguments to a command is to type
meta digits before the command.  If the first `digit' typed is a minus
sign (`-'), then the sign of the argument will be negative.  Once you
have typed one meta digit to get the argument started, you can type the
remainder of the digits, and then the command.  For example, to give
the `C-d' command an argument of 10, you could type `M-1 0 C-d', which
will delete the next ten characters on the input line.


File: gdb.info,  Node: Searching,  Prev: Readline Arguments,  Up: Readline Interaction

31.2.5 Searching for Commands in the History
--------------------------------------------

Readline provides commands for searching through the command history
for lines containing a specified string.  There are two search modes:
"incremental" and "non-incremental".

   Incremental searches begin before the user has finished typing the
search string.  As each character of the search string is typed,
Readline displays the next entry from the history matching the string
typed so far.  An incremental search requires only as many characters
as needed to find the desired history entry.  To search backward in the
history for a particular string, type `C-r'.  Typing `C-s' searches
forward through the history.  The characters present in the value of
the `isearch-terminators' variable are used to terminate an incremental
search.  If that variable has not been assigned a value, the <ESC> and
`C-J' characters will terminate an incremental search.  `C-g' will
abort an incremental search and restore the original line.  When the
search is terminated, the history entry containing the search string
becomes the current line.

   To find other matching entries in the history list, type `C-r' or
`C-s' as appropriate.  This will search backward or forward in the
history for the next entry matching the search string typed so far.
Any other key sequence bound to a Readline command will terminate the
search and execute that command.  For instance, a <RET> will terminate
the search and accept the line, thereby executing the command from the
history list.  A movement command will terminate the search, make the
last line found the current line, and begin editing.

   Readline remembers the last incremental search string.  If two
`C-r's are typed without any intervening characters defining a new
search string, any remembered search string is used.

   Non-incremental searches read the entire search string before
starting to search for matching history lines.  The search string may be
typed by the user or be part of the contents of the current line.


File: gdb.info,  Node: Readline Init File,  Next: Bindable Readline Commands,  Prev: Readline Interaction,  Up: Command Line Editing

31.3 Readline Init File
=======================

Although the Readline library comes with a set of Emacs-like
keybindings installed by default, it is possible to use a different set
of keybindings.  Any user can customize programs that use Readline by
putting commands in an "inputrc" file, conventionally in his home
directory.  The name of this file is taken from the value of the
environment variable `INPUTRC'.  If that variable is unset, the default
is `~/.inputrc'.  If that file does not exist or cannot be read, the
ultimate default is `/etc/inputrc'.

   When a program which uses the Readline library starts up, the init
file is read, and the key bindings are set.

   In addition, the `C-x C-r' command re-reads this init file, thus
incorporating any changes that you might have made to it.

* Menu:

* Readline Init File Syntax::	Syntax for the commands in the inputrc file.

* Conditional Init Constructs::	Conditional key bindings in the inputrc file.

* Sample Init File::		An example inputrc file.


File: gdb.info,  Node: Readline Init File Syntax,  Next: Conditional Init Constructs,  Up: Readline Init File

31.3.1 Readline Init File Syntax
--------------------------------

There are only a few basic constructs allowed in the Readline init
file.  Blank lines are ignored.  Lines beginning with a `#' are
comments.  Lines beginning with a `$' indicate conditional constructs
(*note Conditional Init Constructs::).  Other lines denote variable
settings and key bindings.

Variable Settings
     You can modify the run-time behavior of Readline by altering the
     values of variables in Readline using the `set' command within the
     init file.  The syntax is simple:

          set VARIABLE VALUE

     Here, for example, is how to change from the default Emacs-like
     key binding to use `vi' line editing commands:

          set editing-mode vi

     Variable names and values, where appropriate, are recognized
     without regard to case.  Unrecognized variable names are ignored.

     Boolean variables (those that can be set to on or off) are set to
     on if the value is null or empty, ON (case-insensitive), or 1.
     Any other value results in the variable being set to off.

     A great deal of run-time behavior is changeable with the following
     variables.

    `bell-style'
          Controls what happens when Readline wants to ring the
          terminal bell.  If set to `none', Readline never rings the
          bell.  If set to `visible', Readline uses a visible bell if
          one is available.  If set to `audible' (the default),
          Readline attempts to ring the terminal's bell.

    `bind-tty-special-chars'
          If set to `on', Readline attempts to bind the control
          characters treated specially by the kernel's terminal driver
          to their Readline equivalents.

    `comment-begin'
          The string to insert at the beginning of the line when the
          `insert-comment' command is executed.  The default value is
          `"#"'.

    `completion-display-width'
          The number of screen columns used to display possible matches
          when performing completion.  The value is ignored if it is
          less than 0 or greater than the terminal screen width.  A
          value of 0 will cause matches to be displayed one per line.
          The default value is -1.

    `completion-ignore-case'
          If set to `on', Readline performs filename matching and
          completion in a case-insensitive fashion.  The default value
          is `off'.

    `completion-map-case'
          If set to `on', and COMPLETION-IGNORE-CASE is enabled,
          Readline treats hyphens (`-') and underscores (`_') as
          equivalent when performing case-insensitive filename matching
          and completion.

    `completion-prefix-display-length'
          The length in characters of the common prefix of a list of
          possible completions that is displayed without modification.
          When set to a value greater than zero, common prefixes longer
          than this value are replaced with an ellipsis when displaying
          possible completions.

    `completion-query-items'
          The number of possible completions that determines when the
          user is asked whether the list of possibilities should be
          displayed.  If the number of possible completions is greater
          than this value, Readline will ask the user whether or not he
          wishes to view them; otherwise, they are simply listed.  This
          variable must be set to an integer value greater than or
          equal to 0.  A negative value means Readline should never ask.
          The default limit is `100'.

    `convert-meta'
          If set to `on', Readline will convert characters with the
          eighth bit set to an ASCII key sequence by stripping the
          eighth bit and prefixing an <ESC> character, converting them
          to a meta-prefixed key sequence.  The default value is `on'.

    `disable-completion'
          If set to `On', Readline will inhibit word completion.
          Completion  characters will be inserted into the line as if
          they had been mapped to `self-insert'.  The default is `off'.

    `editing-mode'
          The `editing-mode' variable controls which default set of key
          bindings is used.  By default, Readline starts up in Emacs
          editing mode, where the keystrokes are most similar to Emacs.
          This variable can be set to either `emacs' or `vi'.

    `echo-control-characters'
          When set to `on', on operating systems that indicate they
          support it, readline echoes a character corresponding to a
          signal generated from the keyboard.  The default is `on'.

    `enable-keypad'
          When set to `on', Readline will try to enable the application
          keypad when it is called.  Some systems need this to enable
          the arrow keys.  The default is `off'.

    `enable-meta-key'
          When set to `on', Readline will try to enable any meta
          modifier key the terminal claims to support when it is
          called.  On many terminals, the meta key is used to send
          eight-bit characters.  The default is `on'.

    `expand-tilde'
          If set to `on', tilde expansion is performed when Readline
          attempts word completion.  The default is `off'.

    `history-preserve-point'
          If set to `on', the history code attempts to place the point
          (the current cursor position) at the same location on each
          history line retrieved with `previous-history' or
          `next-history'.  The default is `off'.

    `history-size'
          Set the maximum number of history entries saved in the
          history list.  If set to zero, the number of entries in the
          history list is not limited.

    `horizontal-scroll-mode'
          This variable can be set to either `on' or `off'.  Setting it
          to `on' means that the text of the lines being edited will
          scroll horizontally on a single screen line when they are
          longer than the width of the screen, instead of wrapping onto
          a new screen line.  By default, this variable is set to `off'.

    `input-meta'
          If set to `on', Readline will enable eight-bit input (it will
          not clear the eighth bit in the characters it reads),
          regardless of what the terminal claims it can support.  The
          default value is `off'.  The name `meta-flag' is a synonym
          for this variable.

    `isearch-terminators'
          The string of characters that should terminate an incremental
          search without subsequently executing the character as a
          command (*note Searching::).  If this variable has not been
          given a value, the characters <ESC> and `C-J' will terminate
          an incremental search.

    `keymap'
          Sets Readline's idea of the current keymap for key binding
          commands.  Acceptable `keymap' names are `emacs',
          `emacs-standard', `emacs-meta', `emacs-ctlx', `vi', `vi-move',
          `vi-command', and `vi-insert'.  `vi' is equivalent to
          `vi-command'; `emacs' is equivalent to `emacs-standard'.  The
          default value is `emacs'.  The value of the `editing-mode'
          variable also affects the default keymap.

    `mark-directories'
          If set to `on', completed directory names have a slash
          appended.  The default is `on'.

    `mark-modified-lines'
          This variable, when set to `on', causes Readline to display an
          asterisk (`*') at the start of history lines which have been
          modified.  This variable is `off' by default.

    `mark-symlinked-directories'
          If set to `on', completed names which are symbolic links to
          directories have a slash appended (subject to the value of
          `mark-directories').  The default is `off'.

    `match-hidden-files'
          This variable, when set to `on', causes Readline to match
          files whose names begin with a `.' (hidden files) when
          performing filename completion.  If set to `off', the leading
          `.' must be supplied by the user in the filename to be
          completed.  This variable is `on' by default.

    `menu-complete-display-prefix'
          If set to `on', menu completion displays the common prefix of
          the list of possible completions (which may be empty) before
          cycling through the list.  The default is `off'.

    `output-meta'
          If set to `on', Readline will display characters with the
          eighth bit set directly rather than as a meta-prefixed escape
          sequence.  The default is `off'.

    `page-completions'
          If set to `on', Readline uses an internal `more'-like pager
          to display a screenful of possible completions at a time.
          This variable is `on' by default.

    `print-completions-horizontally'
          If set to `on', Readline will display completions with matches
          sorted horizontally in alphabetical order, rather than down
          the screen.  The default is `off'.

    `revert-all-at-newline'
          If set to `on', Readline will undo all changes to history
          lines before returning when `accept-line' is executed.  By
          default, history lines may be modified and retain individual
          undo lists across calls to `readline'.  The default is `off'.

    `show-all-if-ambiguous'
          This alters the default behavior of the completion functions.
          If set to `on', words which have more than one possible
          completion cause the matches to be listed immediately instead
          of ringing the bell.  The default value is `off'.

    `show-all-if-unmodified'
          This alters the default behavior of the completion functions
          in a fashion similar to SHOW-ALL-IF-AMBIGUOUS.  If set to
          `on', words which have more than one possible completion
          without any possible partial completion (the possible
          completions don't share a common prefix) cause the matches to
          be listed immediately instead of ringing the bell.  The
          default value is `off'.

    `skip-completed-text'
          If set to `on', this alters the default completion behavior
          when inserting a single match into the line.  It's only
          active when performing completion in the middle of a word.
          If enabled, readline does not insert characters from the
          completion that match characters after point in the word
          being completed, so portions of the word following the cursor
          are not duplicated.  For instance, if this is enabled,
          attempting completion when the cursor is after the `e' in
          `Makefile' will result in `Makefile' rather than
          `Makefilefile', assuming there is a single possible
          completion.  The default value is `off'.

    `visible-stats'
          If set to `on', a character denoting a file's type is
          appended to the filename when listing possible completions.
          The default is `off'.


Key Bindings
     The syntax for controlling key bindings in the init file is
     simple.  First you need to find the name of the command that you
     want to change.  The following sections contain tables of the
     command name, the default keybinding, if any, and a short
     description of what the command does.

     Once you know the name of the command, simply place on a line in
     the init file the name of the key you wish to bind the command to,
     a colon, and then the name of the command.  There can be no space
     between the key name and the colon - that will be interpreted as
     part of the key name.  The name of the key can be expressed in
     different ways, depending on what you find most comfortable.

     In addition to command names, readline allows keys to be bound to
     a string that is inserted when the key is pressed (a MACRO).

    KEYNAME: FUNCTION-NAME or MACRO
          KEYNAME is the name of a key spelled out in English.  For
          example:
               Control-u: universal-argument
               Meta-Rubout: backward-kill-word
               Control-o: "> output"

          In the above example, `C-u' is bound to the function
          `universal-argument', `M-DEL' is bound to the function
          `backward-kill-word', and `C-o' is bound to run the macro
          expressed on the right hand side (that is, to insert the text
          `> output' into the line).

          A number of symbolic character names are recognized while
          processing this key binding syntax: DEL, ESC, ESCAPE, LFD,
          NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB.

    "KEYSEQ": FUNCTION-NAME or MACRO
          KEYSEQ differs from KEYNAME above in that strings denoting an
          entire key sequence can be specified, by placing the key
          sequence in double quotes.  Some GNU Emacs style key escapes
          can be used, as in the following example, but the special
          character names are not recognized.

               "\C-u": universal-argument
               "\C-x\C-r": re-read-init-file
               "\e[11~": "Function Key 1"

          In the above example, `C-u' is again bound to the function
          `universal-argument' (just as it was in the first example),
          `C-x C-r' is bound to the function `re-read-init-file', and
          `<ESC> <[> <1> <1> <~>' is bound to insert the text `Function
          Key 1'.


     The following GNU Emacs style escape sequences are available when
     specifying key sequences:

    `\C-'
          control prefix

    `\M-'
          meta prefix

    `\e'
          an escape character

    `\\'
          backslash

    `\"'
          <">, a double quotation mark

    `\''
          <'>, a single quote or apostrophe

     In addition to the GNU Emacs style escape sequences, a second set
     of backslash escapes is available:

    `\a'
          alert (bell)

    `\b'
          backspace

    `\d'
          delete

    `\f'
          form feed

    `\n'
          newline

    `\r'
          carriage return

    `\t'
          horizontal tab

    `\v'
          vertical tab

    `\NNN'
          the eight-bit character whose value is the octal value NNN
          (one to three digits)

    `\xHH'
          the eight-bit character whose value is the hexadecimal value
          HH (one or two hex digits)

     When entering the text of a macro, single or double quotes must be
     used to indicate a macro definition.  Unquoted text is assumed to
     be a function name.  In the macro body, the backslash escapes
     described above are expanded.  Backslash will quote any other
     character in the macro text, including `"' and `''.  For example,
     the following binding will make `C-x \' insert a single `\' into
     the line:
          "\C-x\\": "\\"



File: gdb.info,  Node: Conditional Init Constructs,  Next: Sample Init File,  Prev: Readline Init File Syntax,  Up: Readline Init File

31.3.2 Conditional Init Constructs
----------------------------------

Readline implements a facility similar in spirit to the conditional
compilation features of the C preprocessor which allows key bindings
and variable settings to be performed as the result of tests.  There
are four parser directives used.

`$if'
     The `$if' construct allows bindings to be made based on the
     editing mode, the terminal being used, or the application using
     Readline.  The text of the test extends to the end of the line; no
     characters are required to isolate it.

    `mode'
          The `mode=' form of the `$if' directive is used to test
          whether Readline is in `emacs' or `vi' mode.  This may be
          used in conjunction with the `set keymap' command, for
          instance, to set bindings in the `emacs-standard' and
          `emacs-ctlx' keymaps only if Readline is starting out in
          `emacs' mode.

    `term'
          The `term=' form may be used to include terminal-specific key
          bindings, perhaps to bind the key sequences output by the
          terminal's function keys.  The word on the right side of the
          `=' is tested against both the full name of the terminal and
          the portion of the terminal name before the first `-'.  This
          allows `sun' to match both `sun' and `sun-cmd', for instance.

    `application'
          The APPLICATION construct is used to include
          application-specific settings.  Each program using the
          Readline library sets the APPLICATION NAME, and you can test
          for a particular value.  This could be used to bind key
          sequences to functions useful for a specific program.  For
          instance, the following command adds a key sequence that
          quotes the current or previous word in Bash:
               $if Bash
               # Quote the current or previous word
               "\C-xq": "\eb\"\ef\""
               $endif

`$endif'
     This command, as seen in the previous example, terminates an `$if'
     command.

`$else'
     Commands in this branch of the `$if' directive are executed if the
     test fails.

`$include'
     This directive takes a single filename as an argument and reads
     commands and bindings from that file.  For example, the following
     directive reads from `/etc/inputrc':
          $include /etc/inputrc


File: gdb.info,  Node: Sample Init File,  Prev: Conditional Init Constructs,  Up: Readline Init File

31.3.3 Sample Init File
-----------------------

Here is an example of an INPUTRC file.  This illustrates key binding,
variable assignment, and conditional syntax.


     # This file controls the behaviour of line input editing for
     # programs that use the GNU Readline library.  Existing
     # programs include FTP, Bash, and GDB.
     #
     # You can re-read the inputrc file with C-x C-r.
     # Lines beginning with '#' are comments.
     #
     # First, include any systemwide bindings and variable
     # assignments from /etc/Inputrc
     $include /etc/Inputrc

     #
     # Set various bindings for emacs mode.

     set editing-mode emacs

     $if mode=emacs

     Meta-Control-h:	backward-kill-word	Text after the function name is ignored

     #
     # Arrow keys in keypad mode
     #
     #"\M-OD":        backward-char
     #"\M-OC":        forward-char
     #"\M-OA":        previous-history
     #"\M-OB":        next-history
     #
     # Arrow keys in ANSI mode
     #
     "\M-[D":        backward-char
     "\M-[C":        forward-char
     "\M-[A":        previous-history
     "\M-[B":        next-history
     #
     # Arrow keys in 8 bit keypad mode
     #
     #"\M-\C-OD":       backward-char
     #"\M-\C-OC":       forward-char
     #"\M-\C-OA":       previous-history
     #"\M-\C-OB":       next-history
     #
     # Arrow keys in 8 bit ANSI mode
     #
     #"\M-\C-[D":       backward-char
     #"\M-\C-[C":       forward-char
     #"\M-\C-[A":       previous-history
     #"\M-\C-[B":       next-history

     C-q: quoted-insert

     $endif

     # An old-style binding.  This happens to be the default.
     TAB: complete

     # Macros that are convenient for shell interaction
     $if Bash
     # edit the path
     "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
     # prepare to type a quoted word --
     # insert open and close double quotes
     # and move to just after the open quote
     "\C-x\"": "\"\"\C-b"
     # insert a backslash (testing backslash escapes
     # in sequences and macros)
     "\C-x\\": "\\"
     # Quote the current or previous word
     "\C-xq": "\eb\"\ef\""
     # Add a binding to refresh the line, which is unbound
     "\C-xr": redraw-current-line
     # Edit variable on current line.
     "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
     $endif

     # use a visible bell if one is available
     set bell-style visible

     # don't strip characters to 7 bits when reading
     set input-meta on

     # allow iso-latin1 characters to be inserted rather
     # than converted to prefix-meta sequences
     set convert-meta off

     # display characters with the eighth bit set directly
     # rather than as meta-prefixed characters
     set output-meta on

     # if there are more than 150 possible completions for
     # a word, ask the user if he wants to see all of them
     set completion-query-items 150

     # For FTP
     $if Ftp
     "\C-xg": "get \M-?"
     "\C-xt": "put \M-?"
     "\M-.": yank-last-arg
     $endif


File: gdb.info,  Node: Bindable Readline Commands,  Next: Readline vi Mode,  Prev: Readline Init File,  Up: Command Line Editing

31.4 Bindable Readline Commands
===============================

* Menu:

* Commands For Moving::		Moving about the line.
* Commands For History::	Getting at previous lines.
* Commands For Text::		Commands for changing text.
* Commands For Killing::	Commands for killing and yanking.
* Numeric Arguments::		Specifying numeric arguments, repeat counts.
* Commands For Completion::	Getting Readline to do the typing for you.
* Keyboard Macros::		Saving and re-executing typed characters
* Miscellaneous Commands::	Other miscellaneous commands.

   This section describes Readline commands that may be bound to key
sequences.  Command names without an accompanying key sequence are
unbound by default.

   In the following descriptions, "point" refers to the current cursor
position, and "mark" refers to a cursor position saved by the
`set-mark' command.  The text between the point and mark is referred to
as the "region".


File: gdb.info,  Node: Commands For Moving,  Next: Commands For History,  Up: Bindable Readline Commands

31.4.1 Commands For Moving
--------------------------

`beginning-of-line (C-a)'
     Move to the start of the current line.

`end-of-line (C-e)'
     Move to the end of the line.

`forward-char (C-f)'
     Move forward a character.

`backward-char (C-b)'
     Move back a character.

`forward-word (M-f)'
     Move forward to the end of the next word.  Words are composed of
     letters and digits.

`backward-word (M-b)'
     Move back to the start of the current or previous word.  Words are
     composed of letters and digits.

`clear-screen (C-l)'
     Clear the screen and redraw the current line, leaving the current
     line at the top of the screen.

`redraw-current-line ()'
     Refresh the current line.  By default, this is unbound.



File: gdb.info,  Node: Commands For History,  Next: Commands For Text,  Prev: Commands For Moving,  Up: Bindable Readline Commands

31.4.2 Commands For Manipulating The History
--------------------------------------------

`accept-line (Newline or Return)'
     Accept the line regardless of where the cursor is.  If this line is
     non-empty, it may be added to the history list for future recall
     with `add_history()'.  If this line is a modified history line,
     the history line is restored to its original state.

`previous-history (C-p)'
     Move `back' through the history list, fetching the previous
     command.

`next-history (C-n)'
     Move `forward' through the history list, fetching the next command.

`beginning-of-history (M-<)'
     Move to the first line in the history.

`end-of-history (M->)'
     Move to the end of the input history, i.e., the line currently
     being entered.

`reverse-search-history (C-r)'
     Search backward starting at the current line and moving `up'
     through the history as necessary.  This is an incremental search.

`forward-search-history (C-s)'
     Search forward starting at the current line and moving `down'
     through the the history as necessary.  This is an incremental
     search.

`non-incremental-reverse-search-history (M-p)'
     Search backward starting at the current line and moving `up'
     through the history as necessary using a non-incremental search
     for a string supplied by the user.

`non-incremental-forward-search-history (M-n)'
     Search forward starting at the current line and moving `down'
     through the the history as necessary using a non-incremental search
     for a string supplied by the user.

`history-search-forward ()'
     Search forward through the history for the string of characters
     between the start of the current line and the point.  This is a
     non-incremental search.  By default, this command is unbound.

`history-search-backward ()'
     Search backward through the history for the string of characters
     between the start of the current line and the point.  This is a
     non-incremental search.  By default, this command is unbound.

`yank-nth-arg (M-C-y)'
     Insert the first argument to the previous command (usually the
     second word on the previous line) at point.  With an argument N,
     insert the Nth word from the previous command (the words in the
     previous command begin with word 0).  A negative argument inserts
     the Nth word from the end of the previous command.  Once the
     argument N is computed, the argument is extracted as if the `!N'
     history expansion had been specified.

`yank-last-arg (M-. or M-_)'
     Insert last argument to the previous command (the last word of the
     previous history entry).  With a numeric argument, behave exactly
     like `yank-nth-arg'.  Successive calls to `yank-last-arg' move
     back through the history list, inserting the last word (or the
     word specified by the argument to the first call) of each line in
     turn.  Any numeric argument supplied to these successive calls
     determines the direction to move through the history.  A negative
     argument switches the direction through the history (back or
     forward).  The history expansion facilities are used to extract
     the last argument, as if the `!$' history expansion had been
     specified.



File: gdb.info,  Node: Commands For Text,  Next: Commands For Killing,  Prev: Commands For History,  Up: Bindable Readline Commands

31.4.3 Commands For Changing Text
---------------------------------

`delete-char (C-d)'
     Delete the character at point.  If point is at the beginning of
     the line, there are no characters in the line, and the last
     character typed was not bound to `delete-char', then return EOF.

`backward-delete-char (Rubout)'
     Delete the character behind the cursor.  A numeric argument means
     to kill the characters instead of deleting them.

`forward-backward-delete-char ()'
     Delete the character under the cursor, unless the cursor is at the
     end of the line, in which case the character behind the cursor is
     deleted.  By default, this is not bound to a key.

`quoted-insert (C-q or C-v)'
     Add the next character typed to the line verbatim.  This is how to
     insert key sequences like `C-q', for example.

`tab-insert (M-<TAB>)'
     Insert a tab character.

`self-insert (a, b, A, 1, !, ...)'
     Insert yourself.

`transpose-chars (C-t)'
     Drag the character before the cursor forward over the character at
     the cursor, moving the cursor forward as well.  If the insertion
     point is at the end of the line, then this transposes the last two
     characters of the line.  Negative arguments have no effect.

`transpose-words (M-t)'
     Drag the word before point past the word after point, moving point
     past that word as well.  If the insertion point is at the end of
     the line, this transposes the last two words on the line.

`upcase-word (M-u)'
     Uppercase the current (or following) word.  With a negative
     argument, uppercase the previous word, but do not move the cursor.

`downcase-word (M-l)'
     Lowercase the current (or following) word.  With a negative
     argument, lowercase the previous word, but do not move the cursor.

`capitalize-word (M-c)'
     Capitalize the current (or following) word.  With a negative
     argument, capitalize the previous word, but do not move the cursor.

`overwrite-mode ()'
     Toggle overwrite mode.  With an explicit positive numeric argument,
     switches to overwrite mode.  With an explicit non-positive numeric
     argument, switches to insert mode.  This command affects only
     `emacs' mode; `vi' mode does overwrite differently.  Each call to
     `readline()' starts in insert mode.

     In overwrite mode, characters bound to `self-insert' replace the
     text at point rather than pushing the text to the right.
     Characters bound to `backward-delete-char' replace the character
     before point with a space.

     By default, this command is unbound.



File: gdb.info,  Node: Commands For Killing,  Next: Numeric Arguments,  Prev: Commands For Text,  Up: Bindable Readline Commands

31.4.4 Killing And Yanking
--------------------------

`kill-line (C-k)'
     Kill the text from point to the end of the line.

`backward-kill-line (C-x Rubout)'
     Kill backward to the beginning of the line.

`unix-line-discard (C-u)'
     Kill backward from the cursor to the beginning of the current line.

`kill-whole-line ()'
     Kill all characters on the current line, no matter where point is.
     By default, this is unbound.

`kill-word (M-d)'
     Kill from point to the end of the current word, or if between
     words, to the end of the next word.  Word boundaries are the same
     as `forward-word'.

`backward-kill-word (M-<DEL>)'
     Kill the word behind point.  Word boundaries are the same as
     `backward-word'.

`unix-word-rubout (C-w)'
     Kill the word behind point, using white space as a word boundary.
     The killed text is saved on the kill-ring.

`unix-filename-rubout ()'
     Kill the word behind point, using white space and the slash
     character as the word boundaries.  The killed text is saved on the
     kill-ring.

`delete-horizontal-space ()'
     Delete all spaces and tabs around point.  By default, this is
     unbound.

`kill-region ()'
     Kill the text in the current region.  By default, this command is
     unbound.

`copy-region-as-kill ()'
     Copy the text in the region to the kill buffer, so it can be yanked
     right away.  By default, this command is unbound.

`copy-backward-word ()'
     Copy the word before point to the kill buffer.  The word
     boundaries are the same as `backward-word'.  By default, this
     command is unbound.

`copy-forward-word ()'
     Copy the word following point to the kill buffer.  The word
     boundaries are the same as `forward-word'.  By default, this
     command is unbound.

`yank (C-y)'
     Yank the top of the kill ring into the buffer at point.

`yank-pop (M-y)'
     Rotate the kill-ring, and yank the new top.  You can only do this
     if the prior command is `yank' or `yank-pop'.


File: gdb.info,  Node: Numeric Arguments,  Next: Commands For Completion,  Prev: Commands For Killing,  Up: Bindable Readline Commands

31.4.5 Specifying Numeric Arguments
-----------------------------------

`digit-argument (M-0, M-1, ... M--)'
     Add this digit to the argument already accumulating, or start a new
     argument.  `M--' starts a negative argument.

`universal-argument ()'
     This is another way to specify an argument.  If this command is
     followed by one or more digits, optionally with a leading minus
     sign, those digits define the argument.  If the command is
     followed by digits, executing `universal-argument' again ends the
     numeric argument, but is otherwise ignored.  As a special case, if
     this command is immediately followed by a character that is
     neither a digit or minus sign, the argument count for the next
     command is multiplied by four.  The argument count is initially
     one, so executing this function the first time makes the argument
     count four, a second time makes the argument count sixteen, and so
     on.  By default, this is not bound to a key.


File: gdb.info,  Node: Commands For Completion,  Next: Keyboard Macros,  Prev: Numeric Arguments,  Up: Bindable Readline Commands

31.4.6 Letting Readline Type For You
------------------------------------

`complete (<TAB>)'
     Attempt to perform completion on the text before point.  The
     actual completion performed is application-specific.  The default
     is filename completion.

`possible-completions (M-?)'
     List the possible completions of the text before point.  When
     displaying completions, Readline sets the number of columns used
     for display to the value of `completion-display-width', the value
     of the environment variable `COLUMNS', or the screen width, in
     that order.

`insert-completions (M-*)'
     Insert all completions of the text before point that would have
     been generated by `possible-completions'.

`menu-complete ()'
     Similar to `complete', but replaces the word to be completed with
     a single match from the list of possible completions.  Repeated
     execution of `menu-complete' steps through the list of possible
     completions, inserting each match in turn.  At the end of the list
     of completions, the bell is rung (subject to the setting of
     `bell-style') and the original text is restored.  An argument of N
     moves N positions forward in the list of matches; a negative
     argument may be used to move backward through the list.  This
     command is intended to be bound to <TAB>, but is unbound by
     default.

`menu-complete-backward ()'
     Identical to `menu-complete', but moves backward through the list
     of possible completions, as if `menu-complete' had been given a
     negative argument.

`delete-char-or-list ()'
     Deletes the character under the cursor if not at the beginning or
     end of the line (like `delete-char').  If at the end of the line,
     behaves identically to `possible-completions'.  This command is
     unbound by default.



File: gdb.info,  Node: Keyboard Macros,  Next: Miscellaneous Commands,  Prev: Commands For Completion,  Up: Bindable Readline Commands

31.4.7 Keyboard Macros
----------------------

`start-kbd-macro (C-x ()'
     Begin saving the characters typed into the current keyboard macro.

`end-kbd-macro (C-x ))'
     Stop saving the characters typed into the current keyboard macro
     and save the definition.

`call-last-kbd-macro (C-x e)'
     Re-execute the last keyboard macro defined, by making the
     characters in the macro appear as if typed at the keyboard.



File: gdb.info,  Node: Miscellaneous Commands,  Prev: Keyboard Macros,  Up: Bindable Readline Commands

31.4.8 Some Miscellaneous Commands
----------------------------------

`re-read-init-file (C-x C-r)'
     Read in the contents of the INPUTRC file, and incorporate any
     bindings or variable assignments found there.

`abort (C-g)'
     Abort the current editing command and ring the terminal's bell
     (subject to the setting of `bell-style').

`do-uppercase-version (M-a, M-b, M-X, ...)'
     If the metafied character X is lowercase, run the command that is
     bound to the corresponding uppercase character.

`prefix-meta (<ESC>)'
     Metafy the next character typed.  This is for keyboards without a
     meta key.  Typing `<ESC> f' is equivalent to typing `M-f'.

`undo (C-_ or C-x C-u)'
     Incremental undo, separately remembered for each line.

`revert-line (M-r)'
     Undo all changes made to this line.  This is like executing the
     `undo' command enough times to get back to the beginning.

`tilde-expand (M-~)'
     Perform tilde expansion on the current word.

`set-mark (C-@)'
     Set the mark to the point.  If a numeric argument is supplied, the
     mark is set to that position.

`exchange-point-and-mark (C-x C-x)'
     Swap the point with the mark.  The current cursor position is set
     to the saved position, and the old cursor position is saved as the
     mark.

`character-search (C-])'
     A character is read and point is moved to the next occurrence of
     that character.  A negative count searches for previous
     occurrences.

`character-search-backward (M-C-])'
     A character is read and point is moved to the previous occurrence
     of that character.  A negative count searches for subsequent
     occurrences.

`skip-csi-sequence ()'
     Read enough characters to consume a multi-key sequence such as
     those defined for keys like Home and End.  Such sequences begin
     with a Control Sequence Indicator (CSI), usually ESC-[.  If this
     sequence is bound to "\e[", keys producing such sequences will
     have no effect unless explicitly bound to a readline command,
     instead of inserting stray characters into the editing buffer.
     This is unbound by default, but usually bound to ESC-[.

`insert-comment (M-#)'
     Without a numeric argument, the value of the `comment-begin'
     variable is inserted at the beginning of the current line.  If a
     numeric argument is supplied, this command acts as a toggle:  if
     the characters at the beginning of the line do not match the value
     of `comment-begin', the value is inserted, otherwise the
     characters in `comment-begin' are deleted from the beginning of
     the line.  In either case, the line is accepted as if a newline
     had been typed.

`dump-functions ()'
     Print all of the functions and their key bindings to the Readline
     output stream.  If a numeric argument is supplied, the output is
     formatted in such a way that it can be made part of an INPUTRC
     file.  This command is unbound by default.

`dump-variables ()'
     Print all of the settable variables and their values to the
     Readline output stream.  If a numeric argument is supplied, the
     output is formatted in such a way that it can be made part of an
     INPUTRC file.  This command is unbound by default.

`dump-macros ()'
     Print all of the Readline key sequences bound to macros and the
     strings they output.  If a numeric argument is supplied, the
     output is formatted in such a way that it can be made part of an
     INPUTRC file.  This command is unbound by default.

`emacs-editing-mode (C-e)'
     When in `vi' command mode, this causes a switch to `emacs' editing
     mode.

`vi-editing-mode (M-C-j)'
     When in `emacs' editing mode, this causes a switch to `vi' editing
     mode.



File: gdb.info,  Node: Readline vi Mode,  Prev: Bindable Readline Commands,  Up: Command Line Editing

31.5 Readline vi Mode
=====================

While the Readline library does not have a full set of `vi' editing
functions, it does contain enough to allow simple editing of the line.
The Readline `vi' mode behaves as specified in the POSIX standard.

   In order to switch interactively between `emacs' and `vi' editing
modes, use the command `M-C-j' (bound to emacs-editing-mode when in
`vi' mode and to vi-editing-mode in `emacs' mode).  The Readline
default is `emacs' mode.

   When you enter a line in `vi' mode, you are already placed in
`insertion' mode, as if you had typed an `i'.  Pressing <ESC> switches
you into `command' mode, where you can edit the text of the line with
the standard `vi' movement keys, move to previous history lines with
`k' and subsequent lines with `j', and so forth.


File: gdb.info,  Node: Using History Interactively,  Next: In Memoriam,  Prev: Command Line Editing,  Up: Top

32 Using History Interactively
******************************

This chapter describes how to use the GNU History Library interactively,
from a user's standpoint.  It should be considered a user's guide.  For
information on using the GNU History Library in your own programs,
*note Programming with GNU History: (history)Programming with GNU
History.

* Menu:

* History Interaction::		What it feels like using History as a user.


File: gdb.info,  Node: History Interaction,  Up: Using History Interactively

32.1 History Expansion
======================

The History library provides a history expansion feature that is similar
to the history expansion provided by `csh'.  This section describes the
syntax used to manipulate the history information.

   History expansions introduce words from the history list into the
input stream, making it easy to repeat commands, insert the arguments
to a previous command into the current input line, or fix errors in
previous commands quickly.

   History expansion takes place in two parts.  The first is to
determine which line from the history list should be used during
substitution.  The second is to select portions of that line for
inclusion into the current one.  The line selected from the history is
called the "event", and the portions of that line that are acted upon
are called "words".  Various "modifiers" are available to manipulate
the selected words.  The line is broken into words in the same fashion
that Bash does, so that several words surrounded by quotes are
considered one word.  History expansions are introduced by the
appearance of the history expansion character, which is `!' by default.

* Menu:

* Event Designators::	How to specify which history line to use.
* Word Designators::	Specifying which words are of interest.
* Modifiers::		Modifying the results of substitution.


File: gdb.info,  Node: Event Designators,  Next: Word Designators,  Up: History Interaction

32.1.1 Event Designators
------------------------

An event designator is a reference to a command line entry in the
history list.  Unless the reference is absolute, events are relative to
the current position in the history list.  

`!'
     Start a history substitution, except when followed by a space, tab,
     the end of the line, or `='.

`!N'
     Refer to command line N.

`!-N'
     Refer to the command N lines back.

`!!'
     Refer to the previous command.  This is a synonym for `!-1'.

`!STRING'
     Refer to the most recent command preceding the current position in
     the history list starting with STRING.

`!?STRING[?]'
     Refer to the most recent command preceding the current position in
     the history list containing STRING.  The trailing `?' may be
     omitted if the STRING is followed immediately by a newline.

`^STRING1^STRING2^'
     Quick Substitution.  Repeat the last command, replacing STRING1
     with STRING2.  Equivalent to `!!:s/STRING1/STRING2/'.

`!#'
     The entire command line typed so far.



File: gdb.info,  Node: Word Designators,  Next: Modifiers,  Prev: Event Designators,  Up: History Interaction

32.1.2 Word Designators
-----------------------

Word designators are used to select desired words from the event.  A
`:' separates the event specification from the word designator.  It may
be omitted if the word designator begins with a `^', `$', `*', `-', or
`%'.  Words are numbered from the beginning of the line, with the first
word being denoted by 0 (zero).  Words are inserted into the current
line separated by single spaces.

   For example,

`!!'
     designates the preceding command.  When you type this, the
     preceding command is repeated in toto.

`!!:$'
     designates the last argument of the preceding command.  This may be
     shortened to `!$'.

`!fi:2'
     designates the second argument of the most recent command starting
     with the letters `fi'.

   Here are the word designators:

`0 (zero)'
     The `0'th word.  For many applications, this is the command word.

`N'
     The Nth word.

`^'
     The first argument; that is, word 1.

`$'
     The last argument.

`%'
     The word matched by the most recent `?STRING?' search.

`X-Y'
     A range of words; `-Y' abbreviates `0-Y'.

`*'
     All of the words, except the `0'th.  This is a synonym for `1-$'.
     It is not an error to use `*' if there is just one word in the
     event; the empty string is returned in that case.

`X*'
     Abbreviates `X-$'

`X-'
     Abbreviates `X-$' like `X*', but omits the last word.


   If a word designator is supplied without an event specification, the
previous command is used as the event.


File: gdb.info,  Node: Modifiers,  Prev: Word Designators,  Up: History Interaction

32.1.3 Modifiers
----------------

After the optional word designator, you can add a sequence of one or
more of the following modifiers, each preceded by a `:'.

`h'
     Remove a trailing pathname component, leaving only the head.

`t'
     Remove all leading pathname components, leaving the tail.

`r'
     Remove a trailing suffix of the form `.SUFFIX', leaving the
     basename.

`e'
     Remove all but the trailing suffix.

`p'
     Print the new command but do not execute it.

`s/OLD/NEW/'
     Substitute NEW for the first occurrence of OLD in the event line.
     Any delimiter may be used in place of `/'.  The delimiter may be
     quoted in OLD and NEW with a single backslash.  If `&' appears in
     NEW, it is replaced by OLD.  A single backslash will quote the
     `&'.  The final delimiter is optional if it is the last character
     on the input line.

`&'
     Repeat the previous substitution.

`g'
`a'
     Cause changes to be applied over the entire event line.  Used in
     conjunction with `s', as in `gs/OLD/NEW/', or with `&'.

`G'
     Apply the following `s' modifier once to each word in the event.



File: gdb.info,  Node: In Memoriam,  Next: Formatting Documentation,  Prev: Using History Interactively,  Up: Top

Appendix A In Memoriam
**********************

The GDB project mourns the loss of the following long-time contributors:

`Fred Fish'
     Fred was a long-standing contributor to GDB (1991-2006), and to
     Free Software in general.  Outside of GDB, he was known in the
     Amiga world for his series of Fish Disks, and the GeekGadget
     project.

`Michael Snyder'
     Michael was one of the Global Maintainers of the GDB project, with
     contributions recorded as early as 1996, until 2011.  In addition
     to his day to day participation, he was a large driving force
     behind adding Reverse Debugging to GDB.

   Beyond their technical contributions to the project, they were also
enjoyable members of the Free Software Community.  We will miss them.


File: gdb.info,  Node: Formatting Documentation,  Next: Installing GDB,  Prev: In Memoriam,  Up: Top

Appendix B Formatting Documentation
***********************************

The GDB 4 release includes an already-formatted reference card, ready
for printing with PostScript or Ghostscript, in the `gdb' subdirectory
of the main source directory(1).  If you can use PostScript or
Ghostscript with your printer, you can print the reference card
immediately with `refcard.ps'.

   The release also includes the source for the reference card.  You
can format it, using TeX, by typing:

     make refcard.dvi

   The GDB reference card is designed to print in "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 DVI output program.

   All the documentation for GDB 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 `texi2roff') to typeset the printed version.

   GDB includes an already formatted copy of the on-line Info version
of this manual in the `gdb' subdirectory.  The main Info file is
`gdb-7.4-2012.06-1~bzr/gdb/gdb.info', and it refers to subordinate
files matching `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 `info' subsystem in GNU Emacs or the
standalone `info' program, available as part of the GNU Texinfo
distribution.

   If you want to format these Info files yourself, you need one of the
Info formatting programs, such as `texinfo-format-buffer' or `makeinfo'.

   If you have `makeinfo' installed, and are in the top level GDB
source directory (`gdb-7.4-2012.06-1~bzr', in the case of version
7.4-2012.06-1~bzr), you can make the Info file by typing:

     cd gdb
     make gdb.info

   If you want to typeset and print copies of this manual, you need TeX,
a program to print its DVI output files, and `texinfo.tex', the Texinfo
definitions file.

   TeX is a typesetting program; it does not print files directly, but
produces output files called DVI files.  To print a typeset document,
you need a program to print DVI files.  If your system has TeX
installed, chances are it has such a program.  The precise command to
use depends on your system; `lpr -d' is common; another (for PostScript
devices) is `dvips'.  The DVI print command may require a file name
without any extension or a `.dvi' extension.

   TeX also requires a macro definitions file called `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.
`texinfo.tex' is distributed with GDB and is located in the
`gdb-VERSION-NUMBER/texinfo' directory.

   If you have TeX and a DVI printer program installed, you can typeset
and print this manual.  First switch to the `gdb' subdirectory of the
main source directory (for example, to `gdb-7.4-2012.06-1~bzr/gdb') and
type:

     make gdb.dvi

   Then give `gdb.dvi' to your DVI printing program.

   ---------- Footnotes ----------

   (1) In `gdb-7.4-2012.06-1~bzr/gdb/refcard.ps' of the version
7.4-2012.06-1~bzr release.


File: gdb.info,  Node: Installing GDB,  Next: Maintenance Commands,  Prev: Formatting Documentation,  Up: Top

Appendix C Installing GDB
*************************

* Menu:

* Requirements::                Requirements for building GDB
* Running Configure::           Invoking the GDB `configure' script
* Separate Objdir::             Compiling GDB in another directory
* Config Names::                Specifying names for hosts and targets
* Configure Options::           Summary of options for configure
* System-wide configuration::   Having a system-wide init file


File: gdb.info,  Node: Requirements,  Next: Running Configure,  Up: Installing GDB

C.1 Requirements for Building GDB
=================================

Building GDB requires various tools and packages to be available.
Other packages will be used only if they are found.

Tools/Packages Necessary for Building GDB
=========================================

ISO C90 compiler
     GDB is written in ISO C90.  It should be buildable with any
     working C90 compiler, e.g. GCC.


Tools/Packages Optional for Building GDB
========================================

Expat
     GDB can use the Expat XML parsing library.  This library may be
     included with your operating system distribution; if it is not, you
     can get the latest version from `http://expat.sourceforge.net'.
     The `configure' script will search for this library in several
     standard locations; if it is installed in an unusual path, you can
     use the `--with-libexpat-prefix' option to specify its location.

     Expat is used for:

        * Remote protocol memory maps (*note Memory Map Format::)

        * Target descriptions (*note Target Descriptions::)

        * Remote shared library lists (*Note Library List Format::, or
          alternatively *note Library List Format for SVR4 Targets::)

        * MS-Windows shared libraries (*note Shared Libraries::)

        * Traceframe info (*note Traceframe Info Format::)

zlib
     GDB will use the `zlib' library, if available, to read compressed
     debug sections.  Some linkers, such as GNU gold, are capable of
     producing binaries with compressed debug sections.  If GDB is
     compiled with `zlib', it will be able to read the debug
     information in such binaries.

     The `zlib' library is likely included with your operating system
     distribution; if it is not, you can get the latest version from
     `http://zlib.net'.

iconv
     GDB's features related to character sets (*note Character Sets::)
     require a functioning `iconv' implementation.  If you are on a GNU
     system, then this is provided by the GNU C Library.  Some other
     systems also provide a working `iconv'.

     If GDB is using the `iconv' program which is installed in a
     non-standard place, you will need to tell GDB where to find it.
     This is done with `--with-iconv-bin' which specifies the directory
     that contains the `iconv' program.

     On systems without `iconv', you can install GNU Libiconv.  If you
     have previously installed Libiconv, you can use the
     `--with-libiconv-prefix' option to configure.

     GDB's top-level `configure' and `Makefile' will arrange to build
     Libiconv if a directory named `libiconv' appears in the top-most
     source directory.  If Libiconv is built this way, and if the
     operating system does not provide a suitable `iconv'
     implementation, then the just-built library will automatically be
     used by GDB.  One easy way to set this up is to download GNU
     Libiconv, unpack it, and then rename the directory holding the
     Libiconv source code to `libiconv'.


File: gdb.info,  Node: Running Configure,  Next: Separate Objdir,  Prev: Requirements,  Up: Installing GDB

C.2 Invoking the GDB `configure' Script
=======================================

GDB comes with a `configure' script that automates the process of
preparing GDB for installation; you can then use `make' to build the
`gdb' program.

   The GDB distribution includes all the source code you need for GDB
in a single directory, whose name is usually composed by appending the
version number to `gdb'.

   For example, the GDB version 7.4-2012.06-1~bzr distribution is in the
`gdb-7.4-2012.06-1~bzr' directory.  That directory contains:

`gdb-7.4-2012.06-1~bzr/configure (and supporting files)'
     script for configuring GDB and all its supporting libraries

`gdb-7.4-2012.06-1~bzr/gdb'
     the source specific to GDB itself

`gdb-7.4-2012.06-1~bzr/bfd'
     source for the Binary File Descriptor library

`gdb-7.4-2012.06-1~bzr/include'
     GNU include files

`gdb-7.4-2012.06-1~bzr/libiberty'
     source for the `-liberty' free software library

`gdb-7.4-2012.06-1~bzr/opcodes'
     source for the library of opcode tables and disassemblers

`gdb-7.4-2012.06-1~bzr/readline'
     source for the GNU command-line interface

`gdb-7.4-2012.06-1~bzr/glob'
     source for the GNU filename pattern-matching subroutine

`gdb-7.4-2012.06-1~bzr/mmalloc'
     source for the GNU memory-mapped malloc package

   The simplest way to configure and build GDB is to run `configure'
from the `gdb-VERSION-NUMBER' source directory, which in this example
is the `gdb-7.4-2012.06-1~bzr' directory.

   First switch to the `gdb-VERSION-NUMBER' source directory if you are
not already in it; then run `configure'.  Pass the identifier for the
platform on which GDB will run as an argument.

   For example:

     cd gdb-7.4-2012.06-1~bzr
     ./configure HOST
     make

where HOST is an identifier such as `sun4' or `decstation', that
identifies the platform where GDB will run.  (You can often leave off
HOST; `configure' tries to guess the correct value by examining your
system.)

   Running `configure HOST' and then running `make' builds the `bfd',
`readline', `mmalloc', and `libiberty' libraries, then `gdb' itself.
The configured source files, and the binaries, are left in the
corresponding source directories.

   `configure' is a Bourne-shell (`/bin/sh') script; if your system
does not recognize this automatically when you run a different shell,
you may need to run `sh' on it explicitly:

     sh configure HOST

   If you run `configure' from a directory that contains source
directories for multiple libraries or programs, such as the
`gdb-7.4-2012.06-1~bzr' source directory for version 7.4-2012.06-1~bzr,
`configure' creates configuration files for every directory level
underneath (unless you tell it not to, with the `--norecursion' option).

   You should run the `configure' script from the top directory in the
source tree, the `gdb-VERSION-NUMBER' directory.  If you run
`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 `configure' from the `gdb' subdirectory of the
`gdb-VERSION-NUMBER' directory, you will omit the configuration of
`bfd', `readline', and other sibling directories of the `gdb'
subdirectory.  This leads to build errors about missing include files
such as `bfd/bfd.h'.

   You can install `gdb' anywhere; it has no hardwired paths.  However,
you should make sure that the shell on your path (named by the `SHELL'
environment variable) is publicly readable.  Remember that GDB uses the
shell to start your program--some systems refuse to let GDB debug child
processes whose programs are not readable.


File: gdb.info,  Node: Separate Objdir,  Next: Config Names,  Prev: Running Configure,  Up: Installing GDB

C.3 Compiling GDB in Another Directory
======================================

If you want to run GDB versions for several host or target machines,
you need a different `gdb' compiled for each combination of host and
target.  `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 `make' program handles the `VPATH'
feature (GNU `make' does), running `make' in each of these directories
builds the `gdb' program specified there.

   To build `gdb' in a separate directory, run `configure' with the
`--srcdir' option to specify where to find the source.  (You also need
to specify a path to find `configure' itself from your working
directory.  If the path to `configure' would be the same as the
argument to `--srcdir', you can leave out the `--srcdir' option; it is
assumed.)

   For example, with version 7.4-2012.06-1~bzr, you can build GDB in a
separate directory for a Sun 4 like this:

     cd gdb-7.4-2012.06-1~bzr
     mkdir ../gdb-sun4
     cd ../gdb-sun4
     ../gdb-7.4-2012.06-1~bzr/configure sun4
     make

   When `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 `libiberty.a' in the
directory `gdb-sun4/libiberty', and GDB itself in `gdb-sun4/gdb'.

   Make sure that your path to the `configure' script has just one
instance of `gdb' in it.  If your path to `configure' looks like
`../gdb-7.4-2012.06-1~bzr/gdb/configure', you are configuring only one
subdirectory of GDB, not the whole package.  This leads to build errors
about missing include files such as `bfd/bfd.h'.

   One popular reason to build several GDB configurations in separate
directories is to configure GDB for cross-compiling (where GDB runs on
one machine--the "host"--while debugging programs that run on another
machine--the "target").  You specify a cross-debugging target by giving
the `--target=TARGET' option to `configure'.

   When you run `make' to build a program or library, you must run it
in a configured directory--whatever directory you were in when you
called `configure' (or one of its subdirectories).

   The `Makefile' that `configure' generates in each source directory
also runs recursively.  If you type `make' in a source directory such
as `gdb-7.4-2012.06-1~bzr' (or in a separate configured directory
configured with `--srcdir=DIRNAME/gdb-7.4-2012.06-1~bzr'), 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 `make' on them in parallel (for example, if
they are NFS-mounted on each of the hosts); they will not interfere
with each other.


File: gdb.info,  Node: Config Names,  Next: Configure Options,  Prev: Separate Objdir,  Up: Installing GDB

C.4 Specifying Names for Hosts and Targets
==========================================

The specifications used for hosts and targets in the `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:

     ARCHITECTURE-VENDOR-OS

   For example, you can use the alias `sun4' as a HOST argument, or as
the value for TARGET in a `--target=TARGET' option.  The equivalent
full name is `sparc-sun-sunos4'.

   The `configure' script accompanying GDB does not provide any query
facility to list all supported host and target names or aliases.
`configure' calls the Bourne shell script `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:

     % 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

`config.sub' is also distributed in the GDB source directory
(`gdb-7.4-2012.06-1~bzr', for version 7.4-2012.06-1~bzr).


File: gdb.info,  Node: Configure Options,  Next: System-wide configuration,  Prev: Config Names,  Up: Installing GDB

C.5 `configure' Options
=======================

Here is a summary of the `configure' options and arguments that are
most often useful for building GDB.  `configure' also has several other
options not listed here.  *note (configure.info)What Configure Does::,
for a full explanation of `configure'.

     configure [--help]
               [--prefix=DIR]
               [--exec-prefix=DIR]
               [--srcdir=DIRNAME]
               [--norecursion] [--rm]
               [--target=TARGET]
               HOST

You may introduce options with a single `-' rather than `--' if you
prefer; but you may abbreviate option names if you use `--'.

`--help'
     Display a quick summary of how to invoke `configure'.

`--prefix=DIR'
     Configure the source to install programs and files under directory
     `DIR'.

`--exec-prefix=DIR'
     Configure the source to install programs under directory `DIR'.

`--srcdir=DIRNAME'
     *Warning: using this option requires GNU `make', or another `make'
     that implements the `VPATH' feature.*
     Use this option to make configurations in directories separate
     from the GDB source directories.  Among other things, you can use
     this to build (or maintain) several configurations simultaneously,
     in separate directories.  `configure' writes
     configuration-specific files in the current directory, but
     arranges for them to use the source in the directory DIRNAME.
     `configure' creates directories under the working directory in
     parallel to the source directories below DIRNAME.

`--norecursion'
     Configure only the directory level where `configure' is executed;
     do not propagate configuration to subdirectories.

`--target=TARGET'
     Configure GDB for cross-debugging programs running on the specified
     TARGET.  Without this option, GDB is configured to debug programs
     that run on the same machine (HOST) as GDB itself.

     There is no convenient way to generate a list of all available
     targets.

`HOST ...'
     Configure GDB to run on the specified HOST.

     There is no convenient way to generate a list of all available
     hosts.

   There are many other options available as well, but they are
generally needed for special purposes only.


File: gdb.info,  Node: System-wide configuration,  Prev: Configure Options,  Up: Installing GDB

C.6 System-wide configuration and settings
==========================================

GDB can be configured to have a system-wide init file; this file will
be read and executed at startup (*note What GDB does during startup:
Startup.).

   Here is the corresponding configure option:

`--with-system-gdbinit=FILE'
     Specify that the default location of the system-wide init file is
     FILE.

   If GDB has been configured with the option `--prefix=$prefix', it
may be subject to relocation.  Two possible cases:

   * If the default location of this init file contains `$prefix', it
     will be subject to relocation.  Suppose that the configure options
     are `--prefix=$prefix --with-system-gdbinit=$prefix/etc/gdbinit';
     if GDB is moved from `$prefix' to `$install', the system init file
     is looked for as `$install/etc/gdbinit' instead of
     `$prefix/etc/gdbinit'.

   * By contrast, if the default location does not contain the prefix,
     it will not be relocated.  E.g. if GDB has been configured with
     `--prefix=/usr/local --with-system-gdbinit=/usr/share/gdb/gdbinit',
     then GDB will always look for `/usr/share/gdb/gdbinit', wherever
     GDB is installed.


File: gdb.info,  Node: Maintenance Commands,  Next: Remote Protocol,  Prev: Installing GDB,  Up: Top

Appendix D Maintenance Commands
*******************************

In addition to commands intended for GDB users, GDB includes a number
of commands intended for GDB developers, that are not documented
elsewhere in this manual.  These commands are provided here for
reference.  (For commands that turn on debugging messages, see *note
Debugging Output::.)

`maint agent EXPRESSION'
`maint agent-eval EXPRESSION'
     Translate the given EXPRESSION into remote agent bytecodes.  This
     command is useful for debugging the Agent Expression mechanism
     (*note Agent Expressions::).  The `agent' version produces an
     expression useful for data collection, such as by tracepoints,
     while `maint agent-eval' produces an expression that evaluates
     directly to a result.  For instance, a collection expression for
     `globa + globb' will include bytecodes to record four bytes of
     memory at each of the addresses of `globa' and `globb', while
     discarding the result of the addition, while an evaluation
     expression will do the addition and return the sum.

`maint info breakpoints'
     Using the same format as `info breakpoints', display both the
     breakpoints you've set explicitly, and those GDB is using for
     internal purposes.  Internal breakpoints are shown with negative
     breakpoint numbers.  The type column identifies what kind of
     breakpoint is shown:

    `breakpoint'
          Normal, explicitly set breakpoint.

    `watchpoint'
          Normal, explicitly set watchpoint.

    `longjmp'
          Internal breakpoint, used to handle correctly stepping through
          `longjmp' calls.

    `longjmp resume'
          Internal breakpoint at the target of a `longjmp'.

    `until'
          Temporary internal breakpoint used by the GDB `until' command.

    `finish'
          Temporary internal breakpoint used by the GDB `finish'
          command.

    `shlib events'
          Shared library events.


`set displaced-stepping'
`show displaced-stepping'
     Control whether or not GDB will do "displaced stepping" if the
     target supports it.  Displaced stepping is a way to single-step
     over breakpoints without removing them from the inferior, by
     executing an out-of-line copy of the instruction that was
     originally at the breakpoint location.  It is also known as
     out-of-line single-stepping.

    `set displaced-stepping on'
          If the target architecture supports it, GDB will use
          displaced stepping to step over breakpoints.

    `set displaced-stepping off'
          GDB will not use displaced stepping to step over breakpoints,
          even if such is supported by the target architecture.

    `set displaced-stepping auto'
          This is the default mode.  GDB will use displaced stepping
          only if non-stop mode is active (*note Non-Stop Mode::) and
          the target architecture supports displaced stepping.

`maint check-symtabs'
     Check the consistency of psymtabs and symtabs.

`maint cplus first_component NAME'
     Print the first C++ class/namespace component of NAME.

`maint cplus namespace'
     Print the list of possible C++ namespaces.

`maint demangle NAME'
     Demangle a C++ or Objective-C mangled NAME.

`maint deprecate COMMAND [REPLACEMENT]'
`maint undeprecate COMMAND'
     Deprecate or undeprecate the named COMMAND.  Deprecated commands
     cause GDB to issue a warning when you use them.  The optional
     argument REPLACEMENT says which newer command should be used in
     favor of the deprecated one; if it is given, GDB will mention the
     replacement as part of the warning.

`maint dump-me'
     Cause a fatal signal in the debugger and force it to dump its core.
     This is supported only on systems which support aborting a program
     with the `SIGQUIT' signal.

`maint internal-error [MESSAGE-TEXT]'
`maint internal-warning [MESSAGE-TEXT]'
     Cause GDB to call the internal function `internal_error' or
     `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 GDB or create a core file of the current GDB session.

     These commands take an optional parameter MESSAGE-TEXT that is
     used as the text of the error or warning message.

     Here's an example of using `internal-error':

          (gdb) maint internal-error testing, 1, 2
          .../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) n
          Create a core file? (y or n) n
          (gdb)

`maint set internal-error ACTION [ask|yes|no]'
`maint show internal-error ACTION'
`maint set internal-warning ACTION [ask|yes|no]'
`maint show internal-warning ACTION'
     When GDB reports an internal problem (error or warning) it gives
     the user the opportunity to both quit GDB and create a core file
     of the current GDB session.  These commands let you override the
     default behaviour for each particular ACTION, described in the
     table below.

    `quit'
          You can specify that GDB should always (yes) or never (no)
          quit.  The default is to ask the user what to do.

    `corefile'
          You can specify that GDB should always (yes) or never (no)
          create a core file.  The default is to ask the user what to
          do.

`maint packet TEXT'
     If GDB is talking to an inferior via the serial protocol, then
     this command sends the string TEXT to the inferior, and displays
     the response packet.  GDB supplies the initial `$' character, the
     terminating `#' character, and the checksum.

`maint print architecture [FILE]'
     Print the entire architecture configuration.  The optional argument
     FILE names the file where the output goes.

`maint print c-tdesc'
     Print the current target description (*note Target Descriptions::)
     as a C source file.  The created source file can be used in GDB
     when an XML parser is not available to parse the description.

`maint print dummy-frames'
     Prints the contents of GDB's internal dummy-frame stack.

          (gdb) b add
          ...
          (gdb) print add(2,3)
          Breakpoint 2, add (a=2, b=3) at ...
          58	  return (a + b);
          The program being debugged stopped while in a function called from GDB.
          ...
          (gdb) maint print dummy-frames
          0x1a57c80: pc=0x01014068 fp=0x0200bddc sp=0x0200bdd6
           top=0x0200bdd4 id={stack=0x200bddc,code=0x101405c}
           call_lo=0x01014000 call_hi=0x01014001
          (gdb)

     Takes an optional file parameter.

`maint print registers [FILE]'
`maint print raw-registers [FILE]'
`maint print cooked-registers [FILE]'
`maint print register-groups [FILE]'
`maint print remote-registers [FILE]'
     Print GDB's internal register data structures.

     The command `maint print raw-registers' includes the contents of
     the raw register cache; the command `maint print cooked-registers'
     includes the (cooked) value of all registers, including registers
     which aren't available on the target nor visible to user; the
     command `maint print register-groups' includes the groups that
     each register is a member of; and the command `maint print
     remote-registers' includes the remote target's register numbers
     and offsets in the `G' packets.  *Note Registers:
     (gdbint)Registers.

     These commands take an optional parameter, a file name to which to
     write the information.

`maint print reggroups [FILE]'
     Print GDB's internal register group data structures.  The optional
     argument FILE tells to what file to write the information.

     The register groups info looks like this:

          (gdb) maint print reggroups
           Group      Type
           general    user
           float      user
           all        user
           vector     user
           system     user
           save       internal
           restore    internal

`flushregs'
     This command forces GDB to flush its internal register cache.

`maint print objfiles'
     Print a dump of all known object files.  For each object file, this
     command prints its name, address in memory, and all of its psymtabs
     and symtabs.

`maint print section-scripts [REGEXP]'
     Print a dump of scripts specified in the `.debug_gdb_section'
     section.  If REGEXP is specified, only print scripts loaded by
     object files matching REGEXP.  For each script, this command
     prints its name as specified in the objfile, and the full path if
     known.  *Note .debug_gdb_scripts section::.

`maint print statistics'
     This command prints, for each object file in the program, various
     data about that object file followed by the byte cache ("bcache")
     statistics for the object file.  The objfile data includes the
     number of minimal, partial, full, and stabs symbols, the number of
     types defined by the objfile, the number of as yet unexpanded psym
     tables, the number of line tables and string tables, and the
     amount of memory used by the various tables.  The bcache
     statistics include the counts, sizes, and counts of duplicates of
     all and unique objects, max, average, and median entry size, total
     memory used and its overhead and savings, and various measures of
     the hash table size and chain lengths.

`maint print target-stack'
     A "target" is an interface between the debugger and a particular
     kind of file or process.  Targets can be stacked in "strata", so
     that more than one target can potentially respond to a request.
     In particular, memory accesses will walk down the stack of targets
     until they find a target that is interested in handling that
     particular address.

     This command prints a short description of each layer that was
     pushed on the "target stack", starting from the top layer down to
     the bottom one.

`maint print type EXPR'
     Print the type chain for a type specified by EXPR.  The argument
     can be either a type name or a symbol.  If it is a symbol, the
     type of that symbol is described.  The type chain produced by this
     command is a recursive definition of the data type as stored in
     GDB's data structures, including its flags and contained types.

`maint set dwarf2 always-disassemble'

`maint show dwarf2 always-disassemble'
     Control the behavior of `info address' when using DWARF debugging
     information.

     The default is `off', which means that GDB should try to describe
     a variable's location in an easily readable format.  When `on',
     GDB will instead display the DWARF location expression in an
     assembly-like format.  Note that some locations are too complex
     for GDB to describe simply; in this case you will always see the
     disassembly form.

     Here is an example of the resulting disassembly:

          (gdb) info addr argc
          Symbol "argc" is a complex DWARF expression:
               1: DW_OP_fbreg 0

     For more information on these expressions, see the DWARF standard
     (http://www.dwarfstd.org/).

`maint set dwarf2 max-cache-age'
`maint show dwarf2 max-cache-age'
     Control the DWARF 2 compilation unit cache.

     In object files with inter-compilation-unit references, such as
     those produced by the GCC option `-feliminate-dwarf2-dups', the
     DWARF 2 reader needs to frequently refer to previously read
     compilation units.  This setting controls how long a compilation
     unit will remain in the cache if it is not referenced.  A higher
     limit means that cached compilation units will be stored in memory
     longer, and more total memory will be used.  Setting it to zero
     disables caching, which will slow down GDB startup, but reduce
     memory consumption.

`maint set profile'
`maint show profile'
     Control profiling of GDB.

     Profiling will be disabled until you use the `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 GDB, the results will be written to a log file.
     Remember that if you use profiling, GDB will overwrite the
     profiling log file (often called `gmon.out').  If you have a
     record of important profiling data in a `gmon.out' file, be sure
     to move it to a safe location.

     Configuring with `--enable-profiling' arranges for GDB to be
     compiled with the `-pg' compiler option.

`maint set show-debug-regs'
`maint show show-debug-regs'
     Control whether to show variables that mirror the hardware debug
     registers.  Use `ON' to enable, `OFF' to disable.  If enabled, the
     debug registers values are shown when GDB inserts or removes a
     hardware breakpoint or watchpoint, and when the inferior triggers
     a hardware-assisted breakpoint or watchpoint.

`maint set show-all-tib'
`maint show show-all-tib'
     Control whether to show all non zero areas within a 1k block
     starting at thread local base, when using the `info w32
     thread-information-block' command.

`maint space'
     Control whether to display memory usage for each command.  If set
     to a nonzero value, GDB will display how much memory each command
     took, following the command's own output.  This can also be
     requested by invoking GDB with the `--statistics' command-line
     switch (*note Mode Options::).

`maint time'
     Control whether to display the execution time of GDB for each
     command.  If set to a nonzero value, GDB will display how much
     time it took to execute each command, following the command's own
     output.  Both CPU time and wallclock time are printed.  Printing
     both is useful when trying to determine whether the cost is CPU
     or, e.g., disk/network, latency.  Note that the CPU time printed
     is for GDB only, it does not include the execution time of the
     inferior because there's no mechanism currently to compute how
     much time was spent by GDB and how much time was spent by the
     program been debugged.  This can also be requested by invoking GDB
     with the `--statistics' command-line switch (*note Mode Options::).

`maint translate-address [SECTION] ADDR'
     Find the symbol stored at the location specified by the address
     ADDR and an optional section name SECTION.  If found, GDB prints
     the name of the closest symbol and an offset from the symbol's
     location to the specified address.  This is similar to the `info
     address' command (*note Symbols::), except that this command also
     allows to find symbols in other sections.

     If section was not specified, the section in which the symbol was
     found is also printed.  For dynamically linked executables, the
     name of executable or shared library containing the symbol is
     printed as well.


   The following command is useful for non-interactive invocations of
GDB, such as in the test suite.

`set watchdog NSEC'
     Set the maximum number of seconds GDB will wait for the target
     operation to finish.  If this time expires, GDB reports and error
     and the command is aborted.

`show watchdog'
     Show the current setting of the target wait timeout.


File: gdb.info,  Node: Remote Protocol,  Next: Agent Expressions,  Prev: Maintenance Commands,  Up: Top

Appendix E GDB Remote Serial Protocol
*************************************

* Menu:

* Overview::
* Packets::
* Stop Reply Packets::
* General Query Packets::
* Architecture-Specific Protocol Details::
* Tracepoint Packets::
* Host I/O Packets::
* Interrupts::
* Notification Packets::
* Remote Non-Stop::
* Packet Acknowledgment::
* Examples::
* File-I/O Remote Protocol Extension::
* Library List Format::
* Library List Format for SVR4 Targets::
* Memory Map Format::
* Thread List Format::
* Traceframe Info Format::


File: gdb.info,  Node: Overview,  Next: Packets,  Up: Remote Protocol

E.1 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 GDB.

   In the examples below, `->' and `<-' are used to indicate
transmitted and received data, respectively.

   All GDB commands and responses (other than acknowledgments and
notifications, see *note Notification Packets::) are sent as a PACKET.
A PACKET is introduced with the character `$', the actual PACKET-DATA,
and the terminating character `#' followed by a two-digit CHECKSUM:

     `$'PACKET-DATA`#'CHECKSUM
   The two-digit CHECKSUM is computed as the modulo 256 sum of all
characters between the leading `$' and the trailing `#' (an eight bit
unsigned checksum).

   Implementors should note that prior to GDB 5.0 the protocol
specification also included an optional two-digit SEQUENCE-ID:

     `$'SEQUENCE-ID`:'PACKET-DATA`#'CHECKSUM

That SEQUENCE-ID was appended to the acknowledgment.  GDB has never
output SEQUENCE-IDs.  Stubs that handle packets added since GDB 5.0
must not accept SEQUENCE-ID.

   When either the host or the target machine receives a packet, the
first response expected is an acknowledgment: either `+' (to indicate
the package was received correctly) or `-' (to request retransmission):

     -> `$'PACKET-DATA`#'CHECKSUM
     <- `+'
   The `+'/`-' acknowledgments can be disabled once a connection is
established.  *Note Packet Acknowledgment::, for details.

   The host (GDB) sends COMMANDs, and the target (the debugging stub
incorporated in your program) sends a RESPONSE.  In the case of step
and continue COMMANDs, the response is only sent when the operation has
completed, and the target has again stopped all threads in all attached
processes.  This is the default all-stop mode behavior, but the remote
protocol also supports GDB's non-stop execution mode; see *note Remote
Non-Stop::, for details.

   PACKET-DATA consists of a sequence of characters with the exception
of `#' and `$' (see `X' packet for additional exceptions).

   Fields within the packet should be separated using `,' `;' or `:'.
Except where otherwise noted all numbers are represented in HEX with
leading zeros suppressed.

   Implementors should note that prior to GDB 5.0, the character `:'
could not appear as the third character in a packet (as it would
potentially conflict with the SEQUENCE-ID).

   Binary data in most packets is encoded either as two hexadecimal
digits per byte of binary data.  This allowed the traditional remote
protocol to work over connections which were only seven-bit clean.
Some packets designed more recently assume an eight-bit clean
connection, and use a more efficient encoding to send and receive
binary data.

   The binary data representation uses `7d' (ASCII `}') as an escape
character.  Any escaped byte is transmitted as the escape character
followed by the original character XORed with `0x20'.  For example, the
byte `0x7d' would be transmitted as the two bytes `0x7d 0x5d'.  The
bytes `0x23' (ASCII `#'), `0x24' (ASCII `$'), and `0x7d' (ASCII `}')
must always be escaped.  Responses sent by the stub must also escape
`0x2a' (ASCII `*'), so that it is not interpreted as the start of a
run-length encoded sequence (described next).

   Response DATA can be run-length encoded to save space.  Run-length
encoding replaces runs of identical characters with one instance of the
repeated character, followed by a `*' and a repeat count.  The repeat
count is itself sent encoded, to avoid binary characters in DATA: a
value of N is sent as `N+29'.  For a repeat count greater or equal to
3, this produces a printable ASCII character, e.g. a space (ASCII code
32) for a repeat count of 3.  (This is because run-length encoding
starts to win for counts 3 or more.)  Thus, for example, `0* ' is a
run-length encoding of "0000": the space character after `*' means
repeat the leading `0' `32 - 29 = 3' more times.

   The printable characters `#' and `$' or with a numeric value greater
than 126 must not be used.  Runs of six repeats (`#') or seven repeats
(`$') can be expanded using a repeat count of only five (`"').  For
example, `00000000' can be encoded as `0*"00'.

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

   For any COMMAND not supported by the stub, an empty response
(`$#00') should be returned.  That way it is possible to extend the
protocol.  A newer GDB can tell if a packet is supported based on that
response.

   At a minimum, a stub is required to support the `g' and `G' commands
for register access, and the `m' and `M' commands for memory access.
Stubs that only control single-threaded targets can implement run
control with the `c' (continue), and `s' (step) commands.  Stubs that
support multi-threading targets should support the `vCont' command.
All other commands are optional.


File: gdb.info,  Node: Packets,  Next: Stop Reply Packets,  Prev: Overview,  Up: Remote Protocol

E.2 Packets
===========

The following table provides a complete list of all currently defined
COMMANDs and their corresponding response DATA.  *Note File-I/O Remote
Protocol Extension::, for details about the File I/O extension of the
remote protocol.

   Each packet's description has a template showing the packet's overall
syntax, followed by an explanation of the packet's meaning.  We include
spaces in some of the templates for clarity; these are not part of the
packet's syntax.  No GDB packet uses spaces to separate its components.
For example, a template like `foo BAR BAZ' describes a packet beginning
with the three ASCII bytes `foo', followed by a BAR, followed directly
by a BAZ.  GDB does not transmit a space character between the `foo'
and the BAR, or between the BAR and the BAZ.

   Several packets and replies include a THREAD-ID field to identify a
thread.  Normally these are positive numbers with a target-specific
interpretation, formatted as big-endian hex strings.  A THREAD-ID can
also be a literal `-1' to indicate all threads, or `0' to pick any
thread.

   In addition, the remote protocol supports a multiprocess feature in
which the THREAD-ID syntax is extended to optionally include both
process and thread ID fields, as `pPID.TID'.  The PID (process) and TID
(thread) components each have the format described above: a positive
number with target-specific interpretation formatted as a big-endian
hex string, literal `-1' to indicate all processes or threads
(respectively), or `0' to indicate an arbitrary process or thread.
Specifying just a process, as `pPID', is equivalent to `pPID.-1'.  It
is an error to specify all processes but a specific thread, such as
`p-1.TID'.  Note that the `p' prefix is _not_ used for those packets
and replies explicitly documented to include a process ID, rather than
a THREAD-ID.

   The multiprocess THREAD-ID syntax extensions are only used if both
GDB and the stub report support for the `multiprocess' feature using
`qSupported'.  *Note multiprocess extensions::, for more information.

   Note that all packet forms beginning with an upper- or lower-case
letter, other than those described here, are reserved for future use.

   Here are the packet descriptions.

`!'
     Enable extended mode.  In extended mode, the remote server is made
     persistent.  The `R' packet is used to restart the program being
     debugged.

     Reply:
    `OK'
          The remote target both supports and has enabled extended mode.

`?'
     Indicate the reason the target halted.  The reply is the same as
     for step and continue.  This packet has a special interpretation
     when the target is in non-stop mode; see *note Remote Non-Stop::.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`A ARGLEN,ARGNUM,ARG,...'
     Initialized `argv[]' array passed into program. ARGLEN specifies
     the number of bytes in the hex encoded byte stream ARG.  See
     `gdbserver' for more details.

     Reply:
    `OK'
          The arguments were set.

    `E NN'
          An error occurred.

`b BAUD'
     (Don't use this packet; its behavior is not well-defined.)  Change
     the serial line speed to BAUD.

     JTC: _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: _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._

`B ADDR,MODE'
     Set (MODE is `S') or clear (MODE is `C') a breakpoint at ADDR.

     Don't use this packet.  Use the `Z' and `z' packets instead (*note
     insert breakpoint or watchpoint packet::).

`bc'
     Backward continue.  Execute the target system in reverse.  No
     parameter.  *Note Reverse Execution::, for more information.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`bs'
     Backward single step.  Execute one instruction in reverse.  No
     parameter.  *Note Reverse Execution::, for more information.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`c [ADDR]'
     Continue.  ADDR is address to resume.  If ADDR is omitted, resume
     at current address.

     This packet is deprecated for multi-threading support.  *Note
     vCont packet::.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`C SIG[;ADDR]'
     Continue with signal SIG (hex signal number).  If `;ADDR' is
     omitted, resume at same address.

     This packet is deprecated for multi-threading support.  *Note
     vCont packet::.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`d'
     Toggle debug flag.

     Don't use this packet; instead, define a general set packet (*note
     General Query Packets::).

`D'
`D;PID'
     The first form of the packet is used to detach GDB from the remote
     system.  It is sent to the remote target before GDB disconnects
     via the `detach' command.

     The second form, including a process ID, is used when multiprocess
     protocol extensions are enabled (*note multiprocess extensions::),
     to detach only a specific process.  The PID is specified as a
     big-endian hex string.

     Reply:
    `OK'
          for success

    `E NN'
          for an error

`F RC,EE,CF;XX'
     A reply from GDB to an `F' packet sent by the target.  This is
     part of the File-I/O protocol extension.  *Note File-I/O Remote
     Protocol Extension::, for the specification.

`g'
     Read general registers.

     Reply:
    `XX...'
          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 `g' packet are determined by the GDB internal gdbarch
          functions `DEPRECATED_REGISTER_RAW_SIZE' and
          `gdbarch_register_name'.  The specification of several
          standard `g' packets is specified below.

          When reading registers from a trace frame (*note Using the
          Collected Data: Analyze Collected Data.), the stub may also
          return a string of literal `x''s in place of the register
          data digits, to indicate that the corresponding register has
          not been collected, thus its value is unavailable.  For
          example, for an architecture with 4 registers of 4 bytes
          each, the following reply indicates to GDB that registers 0
          and 2 have not been collected, while registers 1 and 3 have
          been collected, and both have zero value:

               -> `g'
               <- `xxxxxxxx00000000xxxxxxxx00000000'

    `E NN'
          for an error.

`G XX...'
     Write general registers.  *Note read registers packet::, for a
     description of the XX... data.

     Reply:
    `OK'
          for success

    `E NN'
          for an error

`H OP THREAD-ID'
     Set thread for subsequent operations (`m', `M', `g', `G', et.al.).
     OP depends on the operation to be performed: it should be `c' for
     step and continue operations (note that this is deprecated,
     supporting the `vCont' command is a better option), `g' for other
     operations.  The thread designator THREAD-ID has the format and
     interpretation described in *note thread-id syntax::.

     Reply:
    `OK'
          for success

    `E NN'
          for an error

`i [ADDR[,NNN]]'
     Step the remote target by a single clock cycle.  If `,NNN' is
     present, cycle step NNN cycles.  If ADDR is present, cycle step
     starting at that address.

`I'
     Signal, then cycle step.  *Note step with signal packet::.  *Note
     cycle step packet::.

`k'
     Kill request.

     FIXME: _There is no description of how to operate when a specific
     thread context has been selected (i.e. does 'k' kill only that
     thread?)_.

`m ADDR,LENGTH'
     Read LENGTH bytes of memory starting at address ADDR.  Note that
     ADDR may not be aligned to any particular boundary.

     The stub need not use any particular size or alignment when
     gathering data from memory for the response; even if ADDR is
     word-aligned and LENGTH is a multiple of the word size, the stub
     is free to use byte accesses, or not.  For this reason, this
     packet may not be suitable for accessing memory-mapped I/O devices.  

     Reply:
    `XX...'
          Memory contents; each byte is transmitted as a two-digit
          hexadecimal number.  The reply may contain fewer bytes than
          requested if the server was able to read only part of the
          region of memory.

    `E NN'
          NN is errno

`M ADDR,LENGTH:XX...'
     Write LENGTH bytes of memory starting at address ADDR.  XX... is
     the data; each byte is transmitted as a two-digit hexadecimal
     number.

     Reply:
    `OK'
          for success

    `E NN'
          for an error (this includes the case where only part of the
          data was written).

`p N'
     Read the value of register N; N is in hex.  *Note read registers
     packet::, for a description of how the returned register value is
     encoded.

     Reply:
    `XX...'
          the register's value

    `E NN'
          for an error

    `'
          Indicating an unrecognized QUERY.

`P N...=R...'
     Write register N... with value R....  The register number N is in
     hexadecimal, and R... contains two hex digits for each byte in the
     register (target byte order).

     Reply:
    `OK'
          for success

    `E NN'
          for an error

`q NAME PARAMS...'
`Q NAME PARAMS...'
     General query (`q') and set (`Q').  These packets are described
     fully in *note General Query Packets::.

`r'
     Reset the entire system.

     Don't use this packet; use the `R' packet instead.

`R XX'
     Restart the program being debugged.  XX, while needed, is ignored.
     This packet is only available in extended mode (*note extended
     mode::).

     The `R' packet has no reply.

`s [ADDR]'
     Single step.  ADDR is the address at which to resume.  If ADDR is
     omitted, resume at same address.

     This packet is deprecated for multi-threading support.  *Note
     vCont packet::.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`S SIG[;ADDR]'
     Step with signal.  This is analogous to the `C' packet, but
     requests a single-step, rather than a normal resumption of
     execution.

     This packet is deprecated for multi-threading support.  *Note
     vCont packet::.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`t ADDR:PP,MM'
     Search backwards starting at address ADDR for a match with pattern
     PP and mask MM.  PP and MM are 4 bytes.  ADDR must be at least 3
     digits.

`T THREAD-ID'
     Find out if the thread THREAD-ID is alive.  *Note thread-id
     syntax::.

     Reply:
    `OK'
          thread is still alive

    `E NN'
          thread is dead

`v'
     Packets starting with `v' are identified by a multi-letter name,
     up to the first `;' or `?' (or the end of the packet).

`vAttach;PID'
     Attach to a new process with the specified process ID PID.  The
     process ID is a hexadecimal integer identifying the process.  In
     all-stop mode, all threads in the attached process are stopped; in
     non-stop mode, it may be attached without being stopped if that is
     supported by the target.

     This packet is only available in extended mode (*note extended
     mode::).

     Reply:
    `E NN'
          for an error

    `Any stop packet'
          for success in all-stop mode (*note Stop Reply Packets::)

    `OK'
          for success in non-stop mode (*note Remote Non-Stop::)

`vCont[;ACTION[:THREAD-ID]]...'
     Resume the inferior, specifying different actions for each thread.
     If an action is specified with no THREAD-ID, then it is applied to
     any threads that don't have a specific action specified; if no
     default action is specified then other threads should remain
     stopped in all-stop mode and in their current state in non-stop
     mode.  Specifying multiple default actions is an error; specifying
     no actions is also an error.  Thread IDs are specified using the
     syntax described in *note thread-id syntax::.

     Currently supported actions are:

    `c'
          Continue.

    `C SIG'
          Continue with signal SIG.  The signal SIG should be two hex
          digits.

    `s'
          Step.

    `S SIG'
          Step with signal SIG.  The signal SIG should be two hex
          digits.

    `t'
          Stop.

     The optional argument ADDR normally associated with the `c', `C',
     `s', and `S' packets is not supported in `vCont'.

     The `t' action is only relevant in non-stop mode (*note Remote
     Non-Stop::) and may be ignored by the stub otherwise.  A stop
     reply should be generated for any affected thread not already
     stopped.  When a thread is stopped by means of a `t' action, the
     corresponding stop reply should indicate that the thread has
     stopped with signal `0', regardless of whether the target uses
     some other signal as an implementation detail.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`vCont?'
     Request a list of actions supported by the `vCont' packet.

     Reply:
    `vCont[;ACTION...]'
          The `vCont' packet is supported.  Each ACTION is a supported
          command in the `vCont' packet.

    `'
          The `vCont' packet is not supported.

`vFile:OPERATION:PARAMETER...'
     Perform a file operation on the target system.  For details, see
     *note Host I/O Packets::.

`vFlashErase:ADDR,LENGTH'
     Direct the stub to erase LENGTH bytes of flash starting at ADDR.
     The region may enclose any number of flash blocks, but its start
     and end must fall on block boundaries, as indicated by the flash
     block size appearing in the memory map (*note Memory Map
     Format::).  GDB groups flash memory programming operations
     together, and sends a `vFlashDone' request after each group; the
     stub is allowed to delay erase operation until the `vFlashDone'
     packet is received.

     The stub must support `vCont' if it reports support for
     multiprocess extensions (*note multiprocess extensions::).  Note
     that in this case `vCont' actions can be specified to apply to all
     threads in a process by using the `pPID.-1' form of the THREAD-ID.

     Reply:
    `OK'
          for success

    `E NN'
          for an error

`vFlashWrite:ADDR:XX...'
     Direct the stub to write data to flash address ADDR.  The data is
     passed in binary form using the same encoding as for the `X'
     packet (*note Binary Data::).  The memory ranges specified by
     `vFlashWrite' packets preceding a `vFlashDone' packet must not
     overlap, and must appear in order of increasing addresses
     (although `vFlashErase' packets for higher addresses may already
     have been received; the ordering is guaranteed only between
     `vFlashWrite' packets).  If a packet writes to an address that was
     neither erased by a preceding `vFlashErase' packet nor by some
     other target-specific method, the results are unpredictable.

     Reply:
    `OK'
          for success

    `E.memtype'
          for vFlashWrite addressing non-flash memory

    `E NN'
          for an error

`vFlashDone'
     Indicate to the stub that flash programming operation is finished.
     The stub is permitted to delay or batch the effects of a group of
     `vFlashErase' and `vFlashWrite' packets until a `vFlashDone'
     packet is received.  The contents of the affected regions of flash
     memory are unpredictable until the `vFlashDone' request is
     completed.

`vKill;PID'
     Kill the process with the specified process ID.  PID is a
     hexadecimal integer identifying the process.  This packet is used
     in preference to `k' when multiprocess protocol extensions are
     supported; see *note multiprocess extensions::.

     Reply:
    `E NN'
          for an error

    `OK'
          for success

`vRun;FILENAME[;ARGUMENT]...'
     Run the program FILENAME, passing it each ARGUMENT on its command
     line.  The file and arguments are hex-encoded strings.  If
     FILENAME is an empty string, the stub may use a default program
     (e.g. the last program run).  The program is created in the stopped
     state.

     This packet is only available in extended mode (*note extended
     mode::).

     Reply:
    `E NN'
          for an error

    `Any stop packet'
          for success (*note Stop Reply Packets::)

`vStopped'
     In non-stop mode (*note Remote Non-Stop::), acknowledge a previous
     stop reply and prompt for the stub to report another one.

     Reply:
    `Any stop packet'
          if there is another unreported stop event (*note Stop Reply
          Packets::)

    `OK'
          if there are no unreported stop events

`X ADDR,LENGTH:XX...'
     Write data to memory, where the data is transmitted in binary.
     ADDR is address, LENGTH is number of bytes, `XX...' is binary data
     (*note Binary Data::).

     Reply:
    `OK'
          for success

    `E NN'
          for an error

`z TYPE,ADDR,KIND'
`Z TYPE,ADDR,KIND'
     Insert (`Z') or remove (`z') a TYPE breakpoint or watchpoint
     starting at address ADDRESS of kind KIND.

     Each breakpoint and watchpoint packet TYPE is documented
     separately.

     _Implementation notes: A remote target shall return an empty string
     for an unrecognized breakpoint or watchpoint packet TYPE.  A
     remote target shall support either both or neither of a given
     `ZTYPE...' and `zTYPE...' packet pair.  To avoid potential
     problems with duplicate packets, the operations should be
     implemented in an idempotent way._

`z0,ADDR,KIND'
`Z0,ADDR,KIND'
     Insert (`Z0') or remove (`z0') a memory breakpoint at address ADDR
     of type KIND.

     A memory breakpoint is implemented by replacing the instruction at
     ADDR with a software breakpoint or trap instruction.  The KIND is
     target-specific and typically indicates the size of the breakpoint
     in bytes that should be inserted.  E.g., the ARM and MIPS can
     insert either a 2 or 4 byte breakpoint.  Some architectures have
     additional meanings for KIND; see *note Architecture-Specific
     Protocol Details::.

     _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:
    `OK'
          success

    `'
          not supported

    `E NN'
          for an error

`z1,ADDR,KIND'
`Z1,ADDR,KIND'
     Insert (`Z1') or remove (`z1') a hardware breakpoint at address
     ADDR.

     A hardware breakpoint is implemented using a mechanism that is not
     dependant on being able to modify the target's memory.  KIND has
     the same meaning as in `Z0' packets.

     _Implementation note: A hardware breakpoint is not affected by code
     movement._

     Reply:
    `OK'
          success

    `'
          not supported

    `E NN'
          for an error

`z2,ADDR,KIND'
`Z2,ADDR,KIND'
     Insert (`Z2') or remove (`z2') a write watchpoint at ADDR.  KIND
     is interpreted as the number of bytes to watch.

     Reply:
    `OK'
          success

    `'
          not supported

    `E NN'
          for an error

`z3,ADDR,KIND'
`Z3,ADDR,KIND'
     Insert (`Z3') or remove (`z3') a read watchpoint at ADDR.  KIND is
     interpreted as the number of bytes to watch.

     Reply:
    `OK'
          success

    `'
          not supported

    `E NN'
          for an error

`z4,ADDR,KIND'
`Z4,ADDR,KIND'
     Insert (`Z4') or remove (`z4') an access watchpoint at ADDR.  KIND
     is interpreted as the number of bytes to watch.

     Reply:
    `OK'
          success

    `'
          not supported

    `E NN'
          for an error



File: gdb.info,  Node: Stop Reply Packets,  Next: General Query Packets,  Prev: Packets,  Up: Remote Protocol

E.3 Stop Reply Packets
======================

The `C', `c', `S', `s', `vCont', `vAttach', `vRun', `vStopped', and `?'
packets can receive any of the below as a reply.  Except for `?' and
`vStopped', that reply is only returned when the target halts.  In the
below the exact meaning of "signal number" is defined by the header
`include/gdb/signals.h' in the GDB source code.

   As in the description of request packets, we include spaces in the
reply templates for clarity; these are not part of the reply packet's
syntax.  No GDB stop reply packet uses spaces to separate its
components.

`S AA'
     The program received signal number AA (a two-digit hexadecimal
     number).  This is equivalent to a `T' response with no N:R pairs.

`T AA N1:R1;N2:R2;...'
     The program received signal number AA (a two-digit hexadecimal
     number).  This is equivalent to an `S' response, except that the
     `N:R' pairs can carry values of important registers and other
     information directly in the stop reply packet, reducing round-trip
     latency.  Single-step and breakpoint traps are reported this way.
     Each `N:R' pair is interpreted as follows:

        * If N is a hexadecimal number, it is a register number, and the
          corresponding R gives that register's value.  R is a series
          of bytes in target byte order, with each byte given by a
          two-digit hex number.

        * If N is `thread', then R is the THREAD-ID of the stopped
          thread, as specified in *note thread-id syntax::.

        * If N is `core', then R is the hexadecimal number of the core
          on which the stop event was detected.

        * If N is a recognized "stop reason", it describes a more
          specific event that stopped the target.  The currently
          defined stop reasons are listed below.  AA should be `05',
          the trap signal.  At most one stop reason should be present.

        * Otherwise, GDB should ignore this `N:R' pair and go on to the
          next; this allows us to extend the protocol in the future.

     The currently defined stop reasons are:

    `watch'
    `rwatch'
    `awatch'
          The packet indicates a watchpoint hit, and R is the data
          address, in hex.

    `library'
          The packet indicates that the loaded libraries have changed.
          GDB should use `qXfer:libraries:read' to fetch a new list of
          loaded libraries.  R is ignored.

    `replaylog'
          The packet indicates that the target cannot continue replaying
          logged execution events, because it has reached the end (or
          the beginning when executing backward) of the log.  The value
          of R will be either `begin' or `end'.  *Note Reverse
          Execution::, for more information.

`W AA'
`W AA ; process:PID'
     The process exited, and AA is the exit status.  This is only
     applicable to certain targets.

     The second form of the response, including the process ID of the
     exited process, can be used only when GDB has reported support for
     multiprocess protocol extensions; see *note multiprocess
     extensions::.  The PID is formatted as a big-endian hex string.

`X AA'
`X AA ; process:PID'
     The process terminated with signal AA.

     The second form of the response, including the process ID of the
     terminated process, can be used only when GDB has reported support
     for multiprocess protocol extensions; see *note multiprocess
     extensions::.  The PID is formatted as a big-endian hex string.

`O XX...'
     `XX...' is hex encoding of ASCII data, to be written as the
     program's console output.  This can happen at any time while the
     program is running and the debugger should continue to wait for
     `W', `T', etc.  This reply is not permitted in non-stop mode.

`F CALL-ID,PARAMETER...'
     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
     GDB.  *Note File-I/O Remote Protocol Extension::, for a list of
     implemented system calls.

     `PARAMETER...' is a list of parameters as defined for this very
     system call.

     The target replies with this packet when it expects GDB to call a
     host system call on behalf of the target.  GDB replies with an
     appropriate `F' packet and keeps up waiting for the next reply
     packet from the target.  The latest `C', `c', `S' or `s' action is
     expected to be continued.  *Note File-I/O Remote Protocol
     Extension::, for more details.



File: gdb.info,  Node: General Query Packets,  Next: Architecture-Specific Protocol Details,  Prev: Stop Reply Packets,  Up: Remote Protocol

E.4 General Query Packets
=========================

Packets starting with `q' are "general query packets"; packets starting
with `Q' are "general set packets".  General query and set packets are
a semi-unified form for retrieving and sending information to and from
the stub.

   The initial letter of a query or set packet is followed by a name
indicating what sort of thing the packet applies to.  For example, GDB
may use a `qSymbol' packet to exchange symbol definitions with the
stub.  These packet names follow some conventions:

   * The name must not contain commas, colons or semicolons.

   * Most GDB query and set packets have a leading upper case letter.

   * The names of custom vendor packets should use a company prefix, in
     lower case, followed by a period.  For example, packets designed at
     the Acme Corporation might begin with `qacme.foo' (for querying
     foos) or `Qacme.bar' (for setting bars).

   The name of a query or set packet should be separated from any
parameters by a `:'; the parameters themselves should be separated by
`,' or `;'.  Stubs must be careful to match the full packet name, and
check for a separator or the end of the packet, in case two packet
names share a common prefix.  New packets should not begin with `qC',
`qP', or `qL'(1).

   Like the descriptions of the other packets, each description here
has a template showing the packet's overall syntax, followed by an
explanation of the packet's meaning.  We include spaces in some of the
templates for clarity; these are not part of the packet's syntax.  No
GDB packet uses spaces to separate its components.

   Here are the currently defined query and set packets:

`QAllow:OP:VAL...'
     Specify which operations GDB expects to request of the target, as
     a semicolon-separated list of operation name and value pairs.
     Possible values for OP include `WriteReg', `WriteMem',
     `InsertBreak', `InsertTrace', `InsertFastTrace', and `Stop'. VAL
     is either 0, indicating that GDB will not request the operation,
     or 1, indicating that it may.  (The target can then use this to
     set up its own internals optimally, for instance if the debugger
     never expects to insert breakpoints, it may not need to install
     its own trap handler.)

`qC'
     Return the current thread ID.

     Reply:
    `QC THREAD-ID'
          Where THREAD-ID is a thread ID as documented in *note
          thread-id syntax::.

    `(anything else)'
          Any other reply implies the old thread ID.

`qCRC:ADDR,LENGTH'
     Compute the CRC checksum of a block of memory using CRC-32 defined
     in IEEE 802.3.  The CRC is computed byte at a time, taking the most
     significant bit of each byte first.  The initial pattern code
     `0xffffffff' is used to ensure leading zeros affect the CRC.

     _Note:_ This is the same CRC used in validating separate debug
     files (*note Debugging Information in Separate Files: Separate
     Debug Files.).  However the algorithm is slightly different.  When
     validating separate debug files, the CRC is computed taking the
     _least_ significant bit of each byte first, and the final result
     is inverted to detect trailing zeros.

     Reply:
    `E NN'
          An error (such as memory fault)

    `C CRC32'
          The specified memory region's checksum is CRC32.

`QDisableRandomization:VALUE'
     Some target operating systems will randomize the virtual address
     space of the inferior process as a security feature, but provide a
     feature to disable such randomization, e.g. to allow for a more
     deterministic debugging experience.  On such systems, this packet
     with a VALUE of 1 directs the target to disable address space
     randomization for processes subsequently started via `vRun'
     packets, while a packet with a VALUE of 0 tells the target to
     enable address space randomization.

     This packet is only available in extended mode (*note extended
     mode::).

     Reply:
    `OK'
          The request succeeded.

    `E NN'
          An error occurred.  NN are hex digits.

    `'
          An empty reply indicates that `QDisableRandomization' is not
          supported by the stub.

     This packet is not probed by default; the remote stub must request
     it, by supplying an appropriate `qSupported' response (*note
     qSupported::).  This should only be done on targets that actually
     support disabling address space randomization.

`qfThreadInfo'
`qsThreadInfo'
     Obtain a list of all active thread IDs from the target (OS).
     Since there may be too many active threads to fit into one reply
     packet, this query works iteratively: it may require more than one
     query/reply sequence to obtain the entire list of threads.  The
     first query of the sequence will be the `qfThreadInfo' query;
     subsequent queries in the sequence will be the `qsThreadInfo'
     query.

     NOTE: This packet replaces the `qL' query (see below).

     Reply:
    `m THREAD-ID'
          A single thread ID

    `m THREAD-ID,THREAD-ID...'
          a comma-separated list of thread IDs

    `l'
          (lower case letter `L') denotes end of list.

     In response to each query, the target will reply with a list of
     one or more thread IDs, separated by commas.  GDB will respond to
     each reply with a request for more thread ids (using the `qs' form
     of the query), until the target responds with `l' (lower-case ell,
     for "last").  Refer to *note thread-id syntax::, for the format of
     the THREAD-ID fields.

`qGetTLSAddr:THREAD-ID,OFFSET,LM'
     Fetch the address associated with thread local storage specified
     by THREAD-ID, OFFSET, and LM.

     THREAD-ID is the thread ID associated with the thread for which to
     fetch the TLS address.  *Note thread-id syntax::.

     OFFSET is the (big endian, hex encoded) offset associated with the
     thread local variable.  (This offset is obtained from the debug
     information associated with the variable.)

     LM is the (big endian, hex encoded) OS/ABI-specific encoding of the
     load module associated with the thread local storage.  For example,
     a GNU/Linux system will pass the link map address of the shared
     object associated with the thread local storage under
     consideration.  Other operating environments may choose to
     represent the load module differently, so the precise meaning of
     this parameter will vary.

     Reply:
    `XX...'
          Hex encoded (big endian) bytes representing the address of
          the thread local storage requested.

    `E NN'
          An error occurred.  NN are hex digits.

    `'
          An empty reply indicates that `qGetTLSAddr' is not supported
          by the stub.

`qGetTIBAddr:THREAD-ID'
     Fetch address of the Windows OS specific Thread Information Block.

     THREAD-ID is the thread ID associated with the thread.

     Reply:
    `XX...'
          Hex encoded (big endian) bytes representing the linear
          address of the thread information block.

    `E NN'
          An error occured.  This means that either the thread was not
          found, or the address could not be retrieved.

    `'
          An empty reply indicates that `qGetTIBAddr' is not supported
          by the stub.

`qL STARTFLAG THREADCOUNT NEXTTHREAD'
     Obtain thread information from RTOS.  Where: STARTFLAG (one hex
     digit) is one to indicate the first query and zero to indicate a
     subsequent query; THREADCOUNT (two hex digits) is the maximum
     number of threads the response packet can contain; and NEXTTHREAD
     (eight hex digits), for subsequent queries (STARTFLAG is zero), is
     returned in the response as ARGTHREAD.

     Don't use this packet; use the `qfThreadInfo' query instead (see
     above).

     Reply:
    `qM COUNT DONE ARGTHREAD THREAD...'
          Where: COUNT (two hex digits) is the number of threads being
          returned; DONE (one hex digit) is zero to indicate more
          threads and one indicates no further threads; ARGTHREADID
          (eight hex digits) is NEXTTHREAD from the request packet;
          THREAD...  is a sequence of thread IDs from the target.
          THREADID (eight hex digits).  See
          `remote.c:parse_threadlist_response()'.

`qOffsets'
     Get section offsets that the target used when relocating the
     downloaded image.

     Reply:
    `Text=XXX;Data=YYY[;Bss=ZZZ]'
          Relocate the `Text' section by XXX from its original address.
          Relocate the `Data' section by YYY from its original address.
          If the object file format provides segment information (e.g.
          ELF `PT_LOAD' program headers), GDB will relocate entire
          segments by the supplied offsets.

          _Note: while a `Bss' offset may be included in the response,
          GDB ignores this and instead applies the `Data' offset to the
          `Bss' section._

    `TextSeg=XXX[;DataSeg=YYY]'
          Relocate the first segment of the object file, which
          conventionally contains program code, to a starting address
          of XXX.  If `DataSeg' is specified, relocate the second
          segment, which conventionally contains modifiable data, to a
          starting address of YYY.  GDB will report an error if the
          object file does not contain segment information, or does not
          contain at least as many segments as mentioned in the reply.
          Extra segments are kept at fixed offsets relative to the last
          relocated segment.

`qP MODE THREAD-ID'
     Returns information on THREAD-ID.  Where: MODE is a hex encoded 32
     bit mode; THREAD-ID is a thread ID (*note thread-id syntax::).

     Don't use this packet; use the `qThreadExtraInfo' query instead
     (see below).

     Reply: see `remote.c:remote_unpack_thread_info_response()'.

`QNonStop:1'

`QNonStop:0'
     Enter non-stop (`QNonStop:1') or all-stop (`QNonStop:0') mode.
     *Note Remote Non-Stop::, for more information.

     Reply:
    `OK'
          The request succeeded.

    `E NN'
          An error occurred.  NN are hex digits.

    `'
          An empty reply indicates that `QNonStop' is not supported by
          the stub.

     This packet is not probed by default; the remote stub must request
     it, by supplying an appropriate `qSupported' response (*note
     qSupported::).  Use of this packet is controlled by the `set
     non-stop' command; *note Non-Stop Mode::.

`QPassSignals: SIGNAL [;SIGNAL]...'
     Each listed SIGNAL should be passed directly to the inferior
     process.  Signals are numbered identically to continue packets and
     stop replies (*note Stop Reply Packets::).  Each SIGNAL list item
     should be strictly greater than the previous item.  These signals
     do not need to stop the inferior, or be reported to GDB.  All
     other signals should be reported to GDB.  Multiple `QPassSignals'
     packets do not combine; any earlier `QPassSignals' list is
     completely replaced by the new list.  This packet improves
     performance when using `handle SIGNAL nostop noprint pass'.

     Reply:
    `OK'
          The request succeeded.

    `E NN'
          An error occurred.  NN are hex digits.

    `'
          An empty reply indicates that `QPassSignals' is not supported
          by the stub.

     Use of this packet is controlled by the `set remote pass-signals'
     command (*note set remote pass-signals: Remote Configuration.).
     This packet is not probed by default; the remote stub must request
     it, by supplying an appropriate `qSupported' response (*note
     qSupported::).

`qRcmd,COMMAND'
     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 `OOUTPUT' console output
     packets.  _Implementors should note that providing access to a
     stubs's interpreter may have security implications_.

     Reply:
    `OK'
          A command response with no output.

    `OUTPUT'
          A command response with the hex encoded output string OUTPUT.

    `E NN'
          Indicate a badly formed request.

    `'
          An empty reply indicates that `qRcmd' is not recognized.

     (Note that the `qRcmd' packet's name is separated from the command
     by a `,', not a `:', contrary to the naming conventions above.
     Please don't use this packet as a model for new packets.)

`qSearch:memory:ADDRESS;LENGTH;SEARCH-PATTERN'
     Search LENGTH bytes at ADDRESS for SEARCH-PATTERN.  ADDRESS and
     LENGTH are encoded in hex.  SEARCH-PATTERN is a sequence of bytes,
     hex encoded.

     Reply:
    `0'
          The pattern was not found.

    `1,address'
          The pattern was found at ADDRESS.

    `E NN'
          A badly formed request or an error was encountered while
          searching memory.

    `'
          An empty reply indicates that `qSearch:memory' is not
          recognized.

`QStartNoAckMode'
     Request that the remote stub disable the normal `+'/`-' protocol
     acknowledgments (*note Packet Acknowledgment::).

     Reply:
    `OK'
          The stub has switched to no-acknowledgment mode.  GDB
          acknowledges this reponse, but neither the stub nor GDB shall
          send or expect further `+'/`-' acknowledgments in the current
          connection.

    `'
          An empty reply indicates that the stub does not support
          no-acknowledgment mode.

`qSupported [:GDBFEATURE [;GDBFEATURE]... ]'
     Tell the remote stub about features supported by GDB, and query
     the stub for features it supports.  This packet allows GDB and the
     remote stub to take advantage of each others' features.
     `qSupported' also consolidates multiple feature probes at startup,
     to improve GDB performance--a single larger packet performs better
     than multiple smaller probe packets on high-latency links.  Some
     features may enable behavior which must not be on by default, e.g.
     because it would confuse older clients or stubs.  Other features
     may describe packets which could be automatically probed for, but
     are not.  These features must be reported before GDB will use
     them.  This "default unsupported" behavior is not appropriate for
     all packets, but it helps to keep the initial connection time
     under control with new versions of GDB which support increasing
     numbers of packets.

     Reply:
    `STUBFEATURE [;STUBFEATURE]...'
          The stub supports or does not support each returned
          STUBFEATURE, depending on the form of each STUBFEATURE (see
          below for the possible forms).

    `'
          An empty reply indicates that `qSupported' is not recognized,
          or that no features needed to be reported to GDB.

     The allowed forms for each feature (either a GDBFEATURE in the
     `qSupported' packet, or a STUBFEATURE in the response) are:

    `NAME=VALUE'
          The remote protocol feature NAME is supported, and associated
          with the specified VALUE.  The format of VALUE depends on the
          feature, but it must not include a semicolon.

    `NAME+'
          The remote protocol feature NAME is supported, and does not
          need an associated value.

    `NAME-'
          The remote protocol feature NAME is not supported.

    `NAME?'
          The remote protocol feature NAME may be supported, and GDB
          should auto-detect support in some other way when it is
          needed.  This form will not be used for GDBFEATURE
          notifications, but may be used for STUBFEATURE responses.

     Whenever the stub receives a `qSupported' request, the supplied
     set of GDB features should override any previous request.  This
     allows GDB to put the stub in a known state, even if the stub had
     previously been communicating with a different version of GDB.

     The following values of GDBFEATURE (for the packet sent by GDB)
     are defined:

    `multiprocess'
          This feature indicates whether GDB supports multiprocess
          extensions to the remote protocol.  GDB does not use such
          extensions unless the stub also reports that it supports them
          by including `multiprocess+' in its `qSupported' reply.
          *Note multiprocess extensions::, for details.

    `xmlRegisters'
          This feature indicates that GDB supports the XML target
          description.  If the stub sees `xmlRegisters=' with target
          specific strings separated by a comma, it will report register
          description.

    `qRelocInsn'
          This feature indicates whether GDB supports the `qRelocInsn'
          packet (*note Relocate instruction reply packet: Tracepoint
          Packets.).

     Stubs should ignore any unknown values for GDBFEATURE.  Any GDB
     which sends a `qSupported' packet supports receiving packets of
     unlimited length (earlier versions of GDB may reject overly long
     responses).  Additional values for GDBFEATURE may be defined in
     the future to let the stub take advantage of new features in GDB,
     e.g. incompatible improvements in the remote protocol--the
     `multiprocess' feature is an example of such a feature.  The
     stub's reply should be independent of the GDBFEATURE entries sent
     by GDB; first GDB describes all the features it supports, and then
     the stub replies with all the features it supports.

     Similarly, GDB will silently ignore unrecognized stub feature
     responses, as long as each response uses one of the standard forms.

     Some features are flags.  A stub which supports a flag feature
     should respond with a `+' form response.  Other features require
     values, and the stub should respond with an `=' form response.

     Each feature has a default value, which GDB will use if
     `qSupported' is not available or if the feature is not mentioned
     in the `qSupported' response.  The default values are fixed; a
     stub is free to omit any feature responses that match the defaults.

     Not all features can be probed, but for those which can, the
     probing mechanism is useful: in some cases, a stub's internal
     architecture may not allow the protocol layer to know some
     information about the underlying target in advance.  This is
     especially common in stubs which may be configured for multiple
     targets.

     These are the currently defined stub features and their properties:

     Feature Name            Value         Default  Probe Allowed
                             Required               
     `PacketSize'            Yes           `-'      No
     `qXfer:auxv:read'       No            `-'      Yes
     `qXfer:features:read'   No            `-'      Yes
     `qXfer:libraries:read'  No            `-'      Yes
     `qXfer:memory-map:read' No            `-'      Yes
     `qXfer:sdata:read'      No            `-'      Yes
     `qXfer:spu:read'        No            `-'      Yes
     `qXfer:spu:write'       No            `-'      Yes
     `qXfer:siginfo:read'    No            `-'      Yes
     `qXfer:siginfo:write'   No            `-'      Yes
     `qXfer:threads:read'    No            `-'      Yes
     `qXfer:traceframe-info:read'No            `-'      Yes
     `qXfer:fdpic:read'      No            `-'      Yes
     `QNonStop'              No            `-'      Yes
     `QPassSignals'          No            `-'      Yes
     `QStartNoAckMode'       No            `-'      Yes
     `multiprocess'          No            `-'      No
     `ConditionalTracepoints'No            `-'      No
     `ReverseContinue'       No            `-'      No
     `ReverseStep'           No            `-'      No
     `TracepointSource'      No            `-'      No
     `QAllow'                No            `-'      No
     `QDisableRandomization' No            `-'      No
     `EnableDisableTracepoints'No            `-'      No
     `tracenz'               No            `-'      No

     These are the currently defined stub features, in more detail:

    `PacketSize=BYTES'
          The remote stub can accept packets up to at least BYTES in
          length.  GDB will send packets up to this size for bulk
          transfers, and will never send larger packets.  This is a
          limit on the data characters in the packet, including the
          frame and checksum.  There is no trailing NUL byte in a
          remote protocol packet; if the stub stores packets in a
          NUL-terminated format, it should allow an extra byte in its
          buffer for the NUL.  If this stub feature is not supported,
          GDB guesses based on the size of the `g' packet response.

    `qXfer:auxv:read'
          The remote stub understands the `qXfer:auxv:read' packet
          (*note qXfer auxiliary vector read::).

    `qXfer:features:read'
          The remote stub understands the `qXfer:features:read' packet
          (*note qXfer target description read::).

    `qXfer:libraries:read'
          The remote stub understands the `qXfer:libraries:read' packet
          (*note qXfer library list read::).

    `qXfer:libraries-svr4:read'
          The remote stub understands the `qXfer:libraries-svr4:read'
          packet (*note qXfer svr4 library list read::).

    `qXfer:memory-map:read'
          The remote stub understands the `qXfer:memory-map:read' packet
          (*note qXfer memory map read::).

    `qXfer:sdata:read'
          The remote stub understands the `qXfer:sdata:read' packet
          (*note qXfer sdata read::).

    `qXfer:spu:read'
          The remote stub understands the `qXfer:spu:read' packet
          (*note qXfer spu read::).

    `qXfer:spu:write'
          The remote stub understands the `qXfer:spu:write' packet
          (*note qXfer spu write::).

    `qXfer:siginfo:read'
          The remote stub understands the `qXfer:siginfo:read' packet
          (*note qXfer siginfo read::).

    `qXfer:siginfo:write'
          The remote stub understands the `qXfer:siginfo:write' packet
          (*note qXfer siginfo write::).

    `qXfer:threads:read'
          The remote stub understands the `qXfer:threads:read' packet
          (*note qXfer threads read::).

    `qXfer:traceframe-info:read'
          The remote stub understands the `qXfer:traceframe-info:read'
          packet (*note qXfer traceframe info read::).

    `qXfer:fdpic:read'
          The remote stub understands the `qXfer:fdpic:read' packet
          (*note qXfer fdpic loadmap read::).

    `QNonStop'
          The remote stub understands the `QNonStop' packet (*note
          QNonStop::).

    `QPassSignals'
          The remote stub understands the `QPassSignals' packet (*note
          QPassSignals::).

    `QStartNoAckMode'
          The remote stub understands the `QStartNoAckMode' packet and
          prefers to operate in no-acknowledgment mode.  *Note Packet
          Acknowledgment::.

    `multiprocess'
          The remote stub understands the multiprocess extensions to
          the remote protocol syntax.  The multiprocess extensions
          affect the syntax of thread IDs in both packets and replies
          (*note thread-id syntax::), and add process IDs to the `D'
          packet and `W' and `X' replies.  Note that reporting this
          feature indicates support for the syntactic extensions only,
          not that the stub necessarily supports debugging of more than
          one process at a time.  The stub must not use multiprocess
          extensions in packet replies unless GDB has also indicated it
          supports them in its `qSupported' request.

    `qXfer:osdata:read'
          The remote stub understands the `qXfer:osdata:read' packet
          ((*note qXfer osdata read::).

    `ConditionalTracepoints'
          The remote stub accepts and implements conditional
          expressions defined for tracepoints (*note Tracepoint
          Conditions::).

    `ReverseContinue'
          The remote stub accepts and implements the reverse continue
          packet (*note bc::).

    `ReverseStep'
          The remote stub accepts and implements the reverse step packet
          (*note bs::).

    `TracepointSource'
          The remote stub understands the `QTDPsrc' packet that supplies
          the source form of tracepoint definitions.

    `QAllow'
          The remote stub understands the `QAllow' packet.

    `QDisableRandomization'
          The remote stub understands the `QDisableRandomization'
          packet.

    `StaticTracepoint'
          The remote stub supports static tracepoints.

    `InstallInTrace'
          The remote stub supports installing tracepoint in tracing.

    `EnableDisableTracepoints'
          The remote stub supports the `QTEnable' (*note QTEnable::) and
          `QTDisable' (*note QTDisable::) packets that allow tracepoints
          to be enabled and disabled while a trace experiment is
          running.

    `tracenz'
          The remote stub supports the `tracenz' bytecode for
          collecting strings.  See *note Bytecode Descriptions:: for
          details about the bytecode.


`qSymbol::'
     Notify the target that GDB is prepared to serve symbol lookup
     requests.  Accept requests from the target for the values of
     symbols.

     Reply:
    `OK'
          The target does not need to look up any (more) symbols.

    `qSymbol:SYM_NAME'
          The target requests the value of symbol SYM_NAME (hex
          encoded).  GDB may provide the value by using the
          `qSymbol:SYM_VALUE:SYM_NAME' message, described below.

`qSymbol:SYM_VALUE:SYM_NAME'
     Set the value of SYM_NAME to SYM_VALUE.

     SYM_NAME (hex encoded) is the name of a symbol whose value the
     target has previously requested.

     SYM_VALUE (hex) is the value for symbol SYM_NAME.  If GDB cannot
     supply a value for SYM_NAME, then this field will be empty.

     Reply:
    `OK'
          The target does not need to look up any (more) symbols.

    `qSymbol:SYM_NAME'
          The target requests the value of a new symbol SYM_NAME (hex
          encoded).  GDB will continue to supply the values of symbols
          (if available), until the target ceases to request them.

`qTBuffer'

`QTBuffer'

`QTDisconnected'
`QTDP'
`QTDPsrc'
`QTDV'
`qTfP'
`qTfV'
`QTFrame'
`qTMinFTPILen'
     *Note Tracepoint Packets::.

`qThreadExtraInfo,THREAD-ID'
     Obtain a printable string description of a thread's attributes from
     the target OS.  THREAD-ID is a thread ID; see *note thread-id
     syntax::.  This string may contain anything that the target OS
     thinks is interesting for GDB to tell the user about the thread.
     The string is displayed in GDB's `info threads' display.  Some
     examples of possible thread extra info strings are `Runnable', or
     `Blocked on Mutex'.

     Reply:
    `XX...'
          Where `XX...' is a hex encoding of ASCII data, comprising the
          printable string containing the extra information about the
          thread's attributes.

     (Note that the `qThreadExtraInfo' packet's name is separated from
     the command by a `,', not a `:', contrary to the naming
     conventions above.  Please don't use this packet as a model for new
     packets.)

`QTNotes'

`qTP'

`QTSave'

`qTsP'

`qTsV'
`QTStart'
`QTStop'
`QTEnable'
`QTDisable'
`QTinit'
`QTro'
`qTStatus'
`qTV'
`qTfSTM'
`qTsSTM'
`qTSTMat'
     *Note Tracepoint Packets::.

`qXfer:OBJECT:read:ANNEX:OFFSET,LENGTH'
     Read uninterpreted bytes from the target's special data area
     identified by the keyword OBJECT.  Request LENGTH bytes starting
     at OFFSET bytes into the data.  The content and encoding of ANNEX
     is specific to OBJECT; it can supply additional details about what
     data to access.

     Here are the specific requests of this form defined so far.  All
     `qXfer:OBJECT:read:...' requests use the same reply formats,
     listed below.

    `qXfer:auxv:read::OFFSET,LENGTH'
          Access the target's "auxiliary vector".  *Note auxiliary
          vector: OS Information.  Note ANNEX must be empty.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:features:read:ANNEX:OFFSET,LENGTH'
          Access the "target description".  *Note Target
          Descriptions::.  The annex specifies which XML document to
          access.  The main description is always loaded from the
          `target.xml' annex.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:libraries:read:ANNEX:OFFSET,LENGTH'
          Access the target's list of loaded libraries.  *Note Library
          List Format::.  The annex part of the generic `qXfer' packet
          must be empty (*note qXfer read::).

          Targets which maintain a list of libraries in the program's
          memory do not need to implement this packet; it is designed
          for platforms where the operating system manages the list of
          loaded libraries.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:libraries-svr4:read:ANNEX:OFFSET,LENGTH'
          Access the target's list of loaded libraries when the target
          is an SVR4 platform.  *Note Library List Format for SVR4
          Targets::.  The annex part of the generic `qXfer' packet must
          be empty (*note qXfer read::).

          This packet is optional for better performance on SVR4
          targets.  GDB uses memory read packets to read the SVR4
          library list otherwise.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:memory-map:read::OFFSET,LENGTH'
          Access the target's "memory-map".  *Note Memory Map Format::.
          The annex part of the generic `qXfer' packet must be empty
          (*note qXfer read::).

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:sdata:read::OFFSET,LENGTH'
          Read contents of the extra collected static tracepoint marker
          information.  The annex part of the generic `qXfer' packet
          must be empty (*note qXfer read::).  *Note Tracepoint Action
          Lists: Tracepoint Actions.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:siginfo:read::OFFSET,LENGTH'
          Read contents of the extra signal information on the target
          system.  The annex part of the generic `qXfer' packet must be
          empty (*note qXfer read::).

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:spu:read:ANNEX:OFFSET,LENGTH'
          Read contents of an `spufs' file on the target system.  The
          annex specifies which file to read; it must be of the form
          `ID/NAME', where ID specifies an SPU context ID in the target
          process, and NAME identifes the `spufs' file in that context
          to be accessed.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:threads:read::OFFSET,LENGTH'
          Access the list of threads on target.  *Note Thread List
          Format::.  The annex part of the generic `qXfer' packet must
          be empty (*note qXfer read::).

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:traceframe-info:read::OFFSET,LENGTH'
          Return a description of the current traceframe's contents.
          *Note Traceframe Info Format::.  The annex part of the generic
          `qXfer' packet must be empty (*note qXfer read::).

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:fdpic:read:ANNEX:OFFSET,LENGTH'
          Read contents of `loadmap's on the target system.  The annex,
          either `exec' or `interp', specifies which `loadmap',
          executable `loadmap' or interpreter `loadmap' to read.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:osdata:read::OFFSET,LENGTH'
          Access the target's "operating system information".  *Note
          Operating System Information::.


     Reply:
    `m DATA'
          Data DATA (*note Binary Data::) has been read from the
          target.  There may be more data at a higher address (although
          it is permitted to return `m' even for the last valid block
          of data, as long as at least one byte of data was read).
          DATA may have fewer bytes than the LENGTH in the request.

    `l DATA'
          Data DATA (*note Binary Data::) has been read from the target.
          There is no more data to be read.  DATA may have fewer bytes
          than the LENGTH in the request.

    `l'
          The OFFSET in the request is at the end of the data.  There
          is no more data to be read.

    `E00'
          The request was malformed, or ANNEX was invalid.

    `E NN'
          The offset was invalid, or there was an error encountered
          reading the data.  NN is a hex-encoded `errno' value.

    `'
          An empty reply indicates the OBJECT string was not recognized
          by the stub, or that the object does not support reading.

`qXfer:OBJECT:write:ANNEX:OFFSET:DATA...'
     Write uninterpreted bytes into the target's special data area
     identified by the keyword OBJECT, starting at OFFSET bytes into
     the data.  DATA... is the binary-encoded data (*note Binary
     Data::) to be written.  The content and encoding of ANNEX is
     specific to OBJECT; it can supply additional details about what
     data to access.

     Here are the specific requests of this form defined so far.  All
     `qXfer:OBJECT:write:...' requests use the same reply formats,
     listed below.

    `qXfer:siginfo:write::OFFSET:DATA...'
          Write DATA to the extra signal information on the target
          system.  The annex part of the generic `qXfer' packet must be
          empty (*note qXfer write::).

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:spu:write:ANNEX:OFFSET:DATA...'
          Write DATA to an `spufs' file on the target system.  The
          annex specifies which file to write; it must be of the form
          `ID/NAME', where ID specifies an SPU context ID in the target
          process, and NAME identifes the `spufs' file in that context
          to be accessed.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

     Reply:
    `NN'
          NN (hex encoded) is the number of bytes written.  This may be
          fewer bytes than supplied in the request.

    `E00'
          The request was malformed, or ANNEX was invalid.

    `E NN'
          The offset was invalid, or there was an error encountered
          writing the data.  NN is a hex-encoded `errno' value.

    `'
          An empty reply indicates the OBJECT string was not recognized
          by the stub, or that the object does not support writing.

`qXfer:OBJECT:OPERATION:...'
     Requests of this form may be added in the future.  When a stub does
     not recognize the OBJECT keyword, or its support for OBJECT does
     not recognize the OPERATION keyword, the stub must respond with an
     empty packet.

`qAttached:PID'
     Return an indication of whether the remote server attached to an
     existing process or created a new process.  When the multiprocess
     protocol extensions are supported (*note multiprocess
     extensions::), PID is an integer in hexadecimal format identifying
     the target process.  Otherwise, GDB will omit the PID field and
     the query packet will be simplified as `qAttached'.

     This query is used, for example, to know whether the remote process
     should be detached or killed when a GDB session is ended with the
     `quit' command.

     Reply:
    `1'
          The remote server attached to an existing process.

    `0'
          The remote server created a new process.

    `E NN'
          A badly formed request or an error was encountered.


   ---------- Footnotes ----------

   (1) The `qP' and `qL' packets predate these conventions, and have
arguments without any terminator for the packet name; we suspect they
are in widespread use in places that are difficult to upgrade.  The
`qC' packet has no arguments, but some existing stubs (e.g. RedBoot)
are known to not check for the end of the packet.


File: gdb.info,  Node: Architecture-Specific Protocol Details,  Next: Tracepoint Packets,  Prev: General Query Packets,  Up: Remote Protocol

E.5 Architecture-Specific Protocol Details
==========================================

This section describes how the remote protocol is applied to specific
target architectures.  Also see *note Standard Target Features::, for
details of XML target descriptions for each architecture.

E.5.1 ARM
---------

E.5.1.1 Breakpoint Kinds
........................

These breakpoint kinds are defined for the `Z0' and `Z1' packets.

2
     16-bit Thumb mode breakpoint.

3
     32-bit Thumb mode (Thumb-2) breakpoint.

4
     32-bit ARM mode breakpoint.


E.5.2 MIPS
----------

E.5.2.1 Register Packet Format
..............................

The following `g'/`G' packets have previously been defined.  In the
below, some thirty-two bit registers are transferred as sixty-four
bits.  Those registers should be zero/sign extended (which?)  to fill
the space allocated.  Register bytes are transferred in target byte
order.  The two nibbles within a register byte are transferred
most-significant - least-significant.

MIPS32
     All registers are transferred as thirty-two bit quantities in the
     order: 32 general-purpose; sr; lo; hi; bad; cause; pc; 32
     floating-point registers; fsr; fir; fp.

MIPS64
     All registers are transferred as sixty-four bit quantities
     (including thirty-two bit registers such as `sr').  The ordering
     is the same as `MIPS32'.



File: gdb.info,  Node: Tracepoint Packets,  Next: Host I/O Packets,  Prev: Architecture-Specific Protocol Details,  Up: Remote Protocol

E.6 Tracepoint Packets
======================

Here we describe the packets GDB uses to implement tracepoints (*note
Tracepoints::).

`QTDP:N:ADDR:ENA:STEP:PASS[:FFLEN][:XLEN,BYTES][-]'
     Create a new tracepoint, number N, at ADDR.  If ENA is `E', then
     the tracepoint is enabled; if it is `D', then the tracepoint is
     disabled.  STEP is the tracepoint's step count, and PASS is its
     pass count.  If an `F' is present, then the tracepoint is to be a
     fast tracepoint, and the FLEN is the number of bytes that the
     target should copy elsewhere to make room for the tracepoint.  If
     an `X' is present, it introduces a tracepoint condition, which
     consists of a hexadecimal length, followed by a comma and
     hex-encoded bytes, in a manner similar to action encodings as
     described below.  If the trailing `-' is present, further `QTDP'
     packets will follow to specify this tracepoint's actions.

     Replies:
    `OK'
          The packet was understood and carried out.

    `qRelocInsn'
          *Note Relocate instruction reply packet: Tracepoint Packets.

    `'
          The packet was not recognized.

`QTDP:-N:ADDR:[S]ACTION...[-]'
     Define actions to be taken when a tracepoint is hit.  N and ADDR
     must be the same as in the initial `QTDP' packet for this
     tracepoint.  This packet may only be sent immediately after
     another `QTDP' packet that ended with a `-'.  If the trailing `-'
     is present, further `QTDP' packets will follow, specifying more
     actions for this tracepoint.

     In the series of action packets for a given tracepoint, at most one
     can have an `S' before its first ACTION.  If such a packet is
     sent, it and the following packets define "while-stepping"
     actions.  Any prior packets define ordinary actions -- that is,
     those taken when the tracepoint is first hit.  If no action packet
     has an `S', then all the packets in the series specify ordinary
     tracepoint actions.

     The `ACTION...' portion of the packet is a series of actions,
     concatenated without separators.  Each action has one of the
     following forms:

    `R MASK'
          Collect the registers whose bits are set in MASK.  MASK is a
          hexadecimal number whose I'th bit is set if register number I
          should be collected.  (The least significant bit is numbered
          zero.)  Note that MASK may be any number of digits long; it
          may not fit in a 32-bit word.

    `M BASEREG,OFFSET,LEN'
          Collect LEN bytes of memory starting at the address in
          register number BASEREG, plus OFFSET.  If BASEREG is `-1',
          then the range has a fixed address: OFFSET is the address of
          the lowest byte to collect.  The BASEREG, OFFSET, and LEN
          parameters are all unsigned hexadecimal values (the `-1'
          value for BASEREG is a special case).

    `X LEN,EXPR'
          Evaluate EXPR, whose length is LEN, and collect memory as it
          directs.  EXPR is an agent expression, as described in *note
          Agent Expressions::.  Each byte of the expression is encoded
          as a two-digit hex number in the packet; LEN is the number of
          bytes in the expression (and thus one-half the number of hex
          digits in the packet).


     Any number of actions may be packed together in a single `QTDP'
     packet, as long as the packet does not exceed the maximum packet
     length (400 bytes, for many stubs).  There may be only one `R'
     action per tracepoint, and it must precede any `M' or `X' actions.
     Any registers referred to by `M' and `X' actions must be collected
     by a preceding `R' action.  (The "while-stepping" actions are
     treated as if they were attached to a separate tracepoint, as far
     as these restrictions are concerned.)

     Replies:
    `OK'
          The packet was understood and carried out.

    `qRelocInsn'
          *Note Relocate instruction reply packet: Tracepoint Packets.

    `'
          The packet was not recognized.

`QTDPsrc:N:ADDR:TYPE:START:SLEN:BYTES'
     Specify a source string of tracepoint N at address ADDR.  This is
     useful to get accurate reproduction of the tracepoints originally
     downloaded at the beginning of the trace run.  TYPE is the name of
     the tracepoint part, such as `cond' for the tracepoint's
     conditional expression (see below for a list of types), while
     BYTES is the string, encoded in hexadecimal.

     START is the offset of the BYTES within the overall source string,
     while SLEN is the total length of the source string.  This is
     intended for handling source strings that are longer than will fit
     in a single packet.

     The available string types are `at' for the location, `cond' for
     the conditional, and `cmd' for an action command.  GDB sends a
     separate packet for each command in the action list, in the same
     order in which the commands are stored in the list.

     The target does not need to do anything with source strings except
     report them back as part of the replies to the `qTfP'/`qTsP' query
     packets.

     Although this packet is optional, and GDB will only send it if the
     target replies with `TracepointSource' *Note General Query
     Packets::, it makes both disconnected tracing and trace files much
     easier to use.  Otherwise the user must be careful that the
     tracepoints in effect while looking at trace frames are identical
     to the ones in effect during the trace run; even a small
     discrepancy could cause `tdump' not to work, or a particular trace
     frame not be found.

`QTDV:N:VALUE'
     Create a new trace state variable, number N, with an initial value
     of VALUE, which is a 64-bit signed integer.  Both N and VALUE are
     encoded as hexadecimal values. GDB has the option of not using
     this packet for initial values of zero; the target should simply
     create the trace state variables as they are mentioned in
     expressions.

`QTFrame:N'
     Select the N'th tracepoint frame from the buffer, and use the
     register and memory contents recorded there to answer subsequent
     request packets from GDB.

     A successful reply from the stub indicates that the stub has found
     the requested frame.  The response is a series of parts,
     concatenated without separators, describing the frame we selected.
     Each part has one of the following forms:

    `F F'
          The selected frame is number N in the trace frame buffer; F
          is a hexadecimal number.  If F is `-1', then there was no
          frame matching the criteria in the request packet.

    `T T'
          The selected trace frame records a hit of tracepoint number T;
          T is a hexadecimal number.


`QTFrame:pc:ADDR'
     Like `QTFrame:N', but select the first tracepoint frame after the
     currently selected frame whose PC is ADDR; ADDR is a hexadecimal
     number.

`QTFrame:tdp:T'
     Like `QTFrame:N', but select the first tracepoint frame after the
     currently selected frame that is a hit of tracepoint T; T is a
     hexadecimal number.

`QTFrame:range:START:END'
     Like `QTFrame:N', but select the first tracepoint frame after the
     currently selected frame whose PC is between START (inclusive) and
     END (inclusive); START and END are hexadecimal numbers.

`QTFrame:outside:START:END'
     Like `QTFrame:range:START:END', but select the first frame
     _outside_ the given range of addresses (exclusive).

`qTMinFTPILen'
     This packet requests the minimum length of instruction at which a
     fast tracepoint (*note Set Tracepoints::) may be placed.  For
     instance, on the 32-bit x86 architecture, it is possible to use a
     4-byte jump, but it depends on the target system being able to
     create trampolines in the first 64K of memory, which might or
     might not be possible for that system.  So the reply to this
     packet will be 4 if it is able to arrange for that.

     Replies:

    `0'
          The minimum instruction length is currently unknown.

    `LENGTH'
          The minimum instruction length is LENGTH, where LENGTH is
          greater or equal to 1.  LENGTH is a hexadecimal number.  A
          reply of 1 means that a fast tracepoint may be placed on any
          instruction regardless of size.

    `E'
          An error has occurred.

    `'
          An empty reply indicates that the request is not supported by
          the stub.

`QTStart'
     Begin the tracepoint experiment.  Begin collecting data from
     tracepoint hits in the trace frame buffer.  This packet supports
     the `qRelocInsn' reply (*note Relocate instruction reply packet:
     Tracepoint Packets.).

`QTStop'
     End the tracepoint experiment.  Stop collecting trace frames.

`QTEnable:N:ADDR'
     Enable tracepoint N at address ADDR in a started tracepoint
     experiment.  If the tracepoint was previously disabled, then
     collection of data from it will resume.

`QTDisable:N:ADDR'
     Disable tracepoint N at address ADDR in a started tracepoint
     experiment.  No more data will be collected from the tracepoint
     unless `QTEnable:N:ADDR' is subsequently issued.

`QTinit'
     Clear the table of tracepoints, and empty the trace frame buffer.

`QTro:START1,END1:START2,END2:...'
     Establish the given ranges of memory as "transparent".  The stub
     will answer requests for these ranges from memory's current
     contents, if they were not collected as part of the tracepoint hit.

     GDB uses this to mark read-only regions of memory, like those
     containing program code.  Since these areas never change, they
     should still have the same contents they did when the tracepoint
     was hit, so there's no reason for the stub to refuse to provide
     their contents.

`QTDisconnected:VALUE'
     Set the choice to what to do with the tracing run when GDB
     disconnects from the target.  A VALUE of 1 directs the target to
     continue the tracing run, while 0 tells the target to stop tracing
     if GDB is no longer in the picture.

`qTStatus'
     Ask the stub if there is a trace experiment running right now.

     The reply has the form:

    `TRUNNING[;FIELD]...'
          RUNNING is a single digit `1' if the trace is presently
          running, or `0' if not.  It is followed by semicolon-separated
          optional fields that an agent may use to report additional
          status.


     If the trace is not running, the agent may report any of several
     explanations as one of the optional fields:

    `tnotrun:0'
          No trace has been run yet.

    `tstop[:TEXT]:0'
          The trace was stopped by a user-originated stop command.  The
          optional TEXT field is a user-supplied string supplied as
          part of the stop command (for instance, an explanation of why
          the trace was stopped manually).  It is hex-encoded.

    `tfull:0'
          The trace stopped because the trace buffer filled up.

    `tdisconnected:0'
          The trace stopped because GDB disconnected from the target.

    `tpasscount:TPNUM'
          The trace stopped because tracepoint TPNUM exceeded its pass
          count.

    `terror:TEXT:TPNUM'
          The trace stopped because tracepoint TPNUM had an error.  The
          string TEXT is available to describe the nature of the error
          (for instance, a divide by zero in the condition expression).
          TEXT is hex encoded.

    `tunknown:0'
          The trace stopped for some other reason.


     Additional optional fields supply statistical and other
     information.  Although not required, they are extremely useful for
     users monitoring the progress of a trace run.  If a trace has
     stopped, and these numbers are reported, they must reflect the
     state of the just-stopped trace.

    `tframes:N'
          The number of trace frames in the buffer.

    `tcreated:N'
          The total number of trace frames created during the run. This
          may be larger than the trace frame count, if the buffer is
          circular.

    `tsize:N'
          The total size of the trace buffer, in bytes.

    `tfree:N'
          The number of bytes still unused in the buffer.

    `circular:N'
          The value of the circular trace buffer flag.  `1' means that
          the trace buffer is circular and old trace frames will be
          discarded if necessary to make room, `0' means that the trace
          buffer is linear and may fill up.

    `disconn:N'
          The value of the disconnected tracing flag.  `1' means that
          tracing will continue after GDB disconnects, `0' means that
          the trace run will stop.


`qTP:TP:ADDR'
     Ask the stub for the current state of tracepoint number TP at
     address ADDR.

     Replies:
    `VHITS:USAGE'
          The tracepoint has been hit HITS times so far during the trace
          run, and accounts for USAGE in the trace buffer.  Note that
          `while-stepping' steps are not counted as separate hits, but
          the steps' space consumption is added into the usage number.


`qTV:VAR'
     Ask the stub for the value of the trace state variable number VAR.

     Replies:
    `VVALUE'
          The value of the variable is VALUE.  This will be the current
          value of the variable if the user is examining a running
          target, or a saved value if the variable was collected in the
          trace frame that the user is looking at.  Note that multiple
          requests may result in different reply values, such as when
          requesting values while the program is running.

    `U'
          The value of the variable is unknown.  This would occur, for
          example, if the user is examining a trace frame in which the
          requested variable was not collected.

`qTfP'
`qTsP'
     These packets request data about tracepoints that are being used by
     the target.  GDB sends `qTfP' to get the first piece of data, and
     multiple `qTsP' to get additional pieces.  Replies to these
     packets generally take the form of the `QTDP' packets that define
     tracepoints. (FIXME add detailed syntax)

`qTfV'
`qTsV'
     These packets request data about trace state variables that are on
     the target.  GDB sends `qTfV' to get the first vari of data, and
     multiple `qTsV' to get additional variables.  Replies to these
     packets follow the syntax of the `QTDV' packets that define trace
     state variables.

`qTfSTM'
`qTsSTM'
     These packets request data about static tracepoint markers that
     exist in the target program.  GDB sends `qTfSTM' to get the first
     piece of data, and multiple `qTsSTM' to get additional pieces.
     Replies to these packets take the following form:

     Reply:
    `m ADDRESS:ID:EXTRA'
          A single marker

    `m ADDRESS:ID:EXTRA,ADDRESS:ID:EXTRA...'
          a comma-separated list of markers

    `l'
          (lower case letter `L') denotes end of list.

    `E NN'
          An error occurred.  NN are hex digits.

    `'
          An empty reply indicates that the request is not supported by
          the stub.

     ADDRESS is encoded in hex.  ID and EXTRA are strings encoded in
     hex.

     In response to each query, the target will reply with a list of
     one or more markers, separated by commas.  GDB will respond to each
     reply with a request for more markers (using the `qs' form of the
     query), until the target responds with `l' (lower-case ell, for
     "last").

`qTSTMat:ADDRESS'
     This packets requests data about static tracepoint markers in the
     target program at ADDRESS.  Replies to this packet follow the
     syntax of the `qTfSTM' and `qTsSTM' packets that list static
     tracepoint markers.

`QTSave:FILENAME'
     This packet directs the target to save trace data to the file name
     FILENAME in the target's filesystem.  FILENAME is encoded as a hex
     string; the interpretation of the file name (relative vs absolute,
     wild cards, etc) is up to the target.

`qTBuffer:OFFSET,LEN'
     Return up to LEN bytes of the current contents of trace buffer,
     starting at OFFSET.  The trace buffer is treated as if it were a
     contiguous collection of traceframes, as per the trace file format.
     The reply consists as many hex-encoded bytes as the target can
     deliver in a packet; it is not an error to return fewer than were
     asked for.  A reply consisting of just `l' indicates that no bytes
     are available.

`QTBuffer:circular:VALUE'
     This packet directs the target to use a circular trace buffer if
     VALUE is 1, or a linear buffer if the value is 0.

`QTNotes:[TYPE:TEXT][;TYPE:TEXT]...'
     This packet adds optional textual notes to the trace run.
     Allowable types include `user', `notes', and `tstop', the TEXT
     fields are arbitrary strings, hex-encoded.


E.6.1 Relocate instruction reply packet
---------------------------------------

When installing fast tracepoints in memory, the target may need to
relocate the instruction currently at the tracepoint address to a
different address in memory.  For most instructions, a simple copy is
enough, but, for example, call instructions that implicitly push the
return address on the stack, and relative branches or other PC-relative
instructions require offset adjustment, so that the effect of executing
the instruction at a different address is the same as if it had
executed in the original location.

   In response to several of the tracepoint packets, the target may also
respond with a number of intermediate `qRelocInsn' request packets
before the final result packet, to have GDB handle this relocation
operation.  If a packet supports this mechanism, its documentation will
explicitly say so.  See for example the above descriptions for the
`QTStart' and `QTDP' packets.  The format of the request is:

`qRelocInsn:FROM;TO'
     This requests GDB to copy instruction at address FROM to address
     TO, possibly adjusted so that executing the instruction at TO has
     the same effect as executing it at FROM.  GDB writes the adjusted
     instruction to target memory starting at TO.

   Replies:
`qRelocInsn:ADJUSTED_SIZE'
     Informs the stub the relocation is complete.  ADJUSTED_SIZE is the
     length in bytes of resulting relocated instruction sequence.

`E NN'
     A badly formed request was detected, or an error was encountered
     while relocating the instruction.


File: gdb.info,  Node: Host I/O Packets,  Next: Interrupts,  Prev: Tracepoint Packets,  Up: Remote Protocol

E.7 Host I/O Packets
====================

The "Host I/O" packets allow GDB to perform I/O operations on the far
side of a remote link.  For example, Host I/O is used to upload and
download files to a remote target with its own filesystem.  Host I/O
uses the same constant values and data structure layout as the
target-initiated File-I/O protocol.  However, the Host I/O packets are
structured differently.  The target-initiated protocol relies on target
memory to store parameters and buffers.  Host I/O requests are
initiated by GDB, and the target's memory is not involved.  *Note
File-I/O Remote Protocol Extension::, for more details on the
target-initiated protocol.

   The Host I/O request packets all encode a single operation along with
its arguments.  They have this format:

`vFile:OPERATION: PARAMETER...'
     OPERATION is the name of the particular request; the target should
     compare the entire packet name up to the second colon when checking
     for a supported operation.  The format of PARAMETER depends on the
     operation.  Numbers are always passed in hexadecimal.  Negative
     numbers have an explicit minus sign (i.e. two's complement is not
     used).  Strings (e.g. filenames) are encoded as a series of
     hexadecimal bytes.  The last argument to a system call may be a
     buffer of escaped binary data (*note Binary Data::).


   The valid responses to Host I/O packets are:

`F RESULT [, ERRNO] [; ATTACHMENT]'
     RESULT is the integer value returned by this operation, usually
     non-negative for success and -1 for errors.  If an error has
     occured, ERRNO will be included in the result.  ERRNO will have a
     value defined by the File-I/O protocol (*note Errno Values::).  For
     operations which return data, ATTACHMENT supplies the data as a
     binary buffer.  Binary buffers in response packets are escaped in
     the normal way (*note Binary Data::).  See the individual packet
     documentation for the interpretation of RESULT and ATTACHMENT.

`'
     An empty response indicates that this operation is not recognized.


   These are the supported Host I/O operations:

`vFile:open: PATHNAME, FLAGS, MODE'
     Open a file at PATHNAME and return a file descriptor for it, or
     return -1 if an error occurs.  PATHNAME is a string, FLAGS is an
     integer indicating a mask of open flags (*note Open Flags::), and
     MODE is an integer indicating a mask of mode bits to use if the
     file is created (*note mode_t Values::).  *Note open::, for
     details of the open flags and mode values.

`vFile:close: FD'
     Close the open file corresponding to FD and return 0, or -1 if an
     error occurs.

`vFile:pread: FD, COUNT, OFFSET'
     Read data from the open file corresponding to FD.  Up to COUNT
     bytes will be read from the file, starting at OFFSET relative to
     the start of the file.  The target may read fewer bytes; common
     reasons include packet size limits and an end-of-file condition.
     The number of bytes read is returned.  Zero should only be
     returned for a successful read at the end of the file, or if COUNT
     was zero.

     The data read should be returned as a binary attachment on success.
     If zero bytes were read, the response should include an empty
     binary attachment (i.e. a trailing semicolon).  The return value
     is the number of target bytes read; the binary attachment may be
     longer if some characters were escaped.

`vFile:pwrite: FD, OFFSET, DATA'
     Write DATA (a binary buffer) to the open file corresponding to FD.
     Start the write at OFFSET from the start of the file.  Unlike many
     `write' system calls, there is no separate COUNT argument; the
     length of DATA in the packet is used.  `vFile:write' returns the
     number of bytes written, which may be shorter than the length of
     DATA, or -1 if an error occurred.

`vFile:unlink: PATHNAME'
     Delete the file at PATHNAME on the target.  Return 0, or -1 if an
     error occurs.  PATHNAME is a string.

`vFile:readlink: FILENAME'
     Read value of symbolic link FILENAME on the target.  Return the
     number of bytes read, or -1 if an error occurs.

     The data read should be returned as a binary attachment on success.
     If zero bytes were read, the response should include an empty
     binary attachment (i.e. a trailing semicolon).  The return value
     is the number of target bytes read; the binary attachment may be
     longer if some characters were escaped.



File: gdb.info,  Node: Interrupts,  Next: Notification Packets,  Prev: Host I/O Packets,  Up: Remote Protocol

E.8 Interrupts
==============

When a program on the remote target is running, GDB may attempt to
interrupt it by sending a `Ctrl-C', `BREAK' or a `BREAK' followed by
`g', control of which is specified via GDB's `interrupt-sequence'.

   The precise meaning of `BREAK' is defined by the transport mechanism
and may, in fact, be undefined.  GDB does not currently define a
`BREAK' mechanism for any of the network interfaces except for TCP, in
which case GDB sends the `telnet' BREAK sequence.

   `Ctrl-C', on the other hand, is defined and implemented for all
transport mechanisms.  It is represented by sending the single byte
`0x03' without any of the usual packet overhead described in the
Overview section (*note Overview::).  When a `0x03' byte is transmitted
as part of a packet, it is considered to be packet data and does _not_
represent an interrupt.  E.g., an `X' packet (*note X packet::), used
for binary downloads, may include an unescaped `0x03' as part of its
packet.

   `BREAK' followed by `g' is also known as Magic SysRq g.  When Linux
kernel receives this sequence from serial port, it stops execution and
connects to gdb.

   Stubs are not required to recognize these interrupt mechanisms and
the precise meaning associated with receipt of the interrupt is
implementation defined.  If the target supports debugging of multiple
threads and/or processes, it should attempt to interrupt all
currently-executing threads and processes.  If the stub is successful
at interrupting the running program, it should send one of the stop
reply packets (*note Stop Reply Packets::) to GDB as a result of
successfully stopping the program in all-stop mode, and a stop reply
for each stopped thread in non-stop mode.  Interrupts received while the
program is stopped are discarded.


File: gdb.info,  Node: Notification Packets,  Next: Remote Non-Stop,  Prev: Interrupts,  Up: Remote Protocol

E.9 Notification Packets
========================

The GDB remote serial protocol includes "notifications", packets that
require no acknowledgment.  Both the GDB and the stub may send
notifications (although the only notifications defined at present are
sent by the stub).  Notifications carry information without incurring
the round-trip latency of an acknowledgment, and so are useful for
low-impact communications where occasional packet loss is not a problem.

   A notification packet has the form `% DATA # CHECKSUM', where DATA
is the content of the notification, and CHECKSUM is a checksum of DATA,
computed and formatted as for ordinary GDB packets.  A notification's
DATA never contains `$', `%' or `#' characters.  Upon receiving a
notification, the recipient sends no `+' or `-' to acknowledge the
notification's receipt or to report its corruption.

   Every notification's DATA begins with a name, which contains no
colon characters, followed by a colon character.

   Recipients should silently ignore corrupted notifications and
notifications they do not understand.  Recipients should restart
timeout periods on receipt of a well-formed notification, whether or
not they understand it.

   Senders should only send the notifications described here when this
protocol description specifies that they are permitted.  In the future,
we may extend the protocol to permit existing notifications in new
contexts; this rule helps older senders avoid confusing newer
recipients.

   (Older versions of GDB ignore bytes received until they see the `$'
byte that begins an ordinary packet, so new stubs may transmit
notifications without fear of confusing older clients.  There are no
notifications defined for GDB to send at the moment, but we assume that
most older stubs would ignore them, as well.)

   The following notification packets from the stub to GDB are defined:

`Stop: REPLY'
     Report an asynchronous stop event in non-stop mode.  The REPLY has
     the form of a stop reply, as described in *note Stop Reply
     Packets::.  Refer to *note Remote Non-Stop::, for information on
     how these notifications are acknowledged by GDB.


File: gdb.info,  Node: Remote Non-Stop,  Next: Packet Acknowledgment,  Prev: Notification Packets,  Up: Remote Protocol

E.10 Remote Protocol Support for Non-Stop Mode
==============================================

GDB's remote protocol supports non-stop debugging of multi-threaded
programs, as described in *note Non-Stop Mode::.  If the stub supports
non-stop mode, it should report that to GDB by including `QNonStop+' in
its `qSupported' response (*note qSupported::).

   GDB typically sends a `QNonStop' packet only when establishing a new
connection with the stub.  Entering non-stop mode does not alter the
state of any currently-running threads, but targets must stop all
threads in any already-attached processes when entering all-stop mode.
GDB uses the `?' packet as necessary to probe the target state after a
mode change.

   In non-stop mode, when an attached process encounters an event that
would otherwise be reported with a stop reply, it uses the asynchronous
notification mechanism (*note Notification Packets::) to inform GDB.
In contrast to all-stop mode, where all threads in all processes are
stopped when a stop reply is sent, in non-stop mode only the thread
reporting the stop event is stopped.  That is, when reporting a `S' or
`T' response to indicate completion of a step operation, hitting a
breakpoint, or a fault, only the affected thread is stopped; any other
still-running threads continue to run.  When reporting a `W' or `X'
response, all running threads belonging to other attached processes
continue to run.

   Only one stop reply notification at a time may be pending; if
additional stop events occur before GDB has acknowledged the previous
notification, they must be queued by the stub for later synchronous
transmission in response to `vStopped' packets from GDB.  Because the
notification mechanism is unreliable, the stub is permitted to resend a
stop reply notification if it believes GDB may not have received it.
GDB ignores additional stop reply notifications received before it has
finished processing a previous notification and the stub has completed
sending any queued stop events.

   Otherwise, GDB must be prepared to receive a stop reply notification
at any time.  Specifically, they may appear when GDB is not otherwise
reading input from the stub, or when GDB is expecting to read a normal
synchronous response or a `+'/`-' acknowledgment to a packet it has
sent.  Notification packets are distinct from any other communication
from the stub so there is no ambiguity.

   After receiving a stop reply notification, GDB shall acknowledge it
by sending a `vStopped' packet (*note vStopped packet::) as a regular,
synchronous request to the stub.  Such acknowledgment is not required
to happen immediately, as GDB is permitted to send other, unrelated
packets to the stub first, which the stub should process normally.

   Upon receiving a `vStopped' packet, if the stub has other queued
stop events to report to GDB, it shall respond by sending a normal stop
reply response.  GDB shall then send another `vStopped' packet to
solicit further responses; again, it is permitted to send other,
unrelated packets as well which the stub should process normally.

   If the stub receives a `vStopped' packet and there are no additional
stop events to report, the stub shall return an `OK' response.  At this
point, if further stop events occur, the stub shall send a new stop
reply notification, GDB shall accept the notification, and the process
shall be repeated.

   In non-stop mode, the target shall respond to the `?' packet as
follows.  First, any incomplete stop reply notification/`vStopped'
sequence in progress is abandoned.  The target must begin a new
sequence reporting stop events for all stopped threads, whether or not
it has previously reported those events to GDB.  The first stop reply
is sent as a synchronous reply to the `?' packet, and subsequent stop
replies are sent as responses to `vStopped' packets using the mechanism
described above.  The target must not send asynchronous stop reply
notifications until the sequence is complete.  If all threads are
running when the target receives the `?' packet, or if the target is
not attached to any process, it shall respond `OK'.


File: gdb.info,  Node: Packet Acknowledgment,  Next: Examples,  Prev: Remote Non-Stop,  Up: Remote Protocol

E.11 Packet Acknowledgment
==========================

By default, when either the host or the target machine receives a
packet, the first response expected is an acknowledgment: either `+'
(to indicate the package was received correctly) or `-' (to request
retransmission).  This mechanism allows the GDB remote protocol to
operate over unreliable transport mechanisms, such as a serial line.

   In cases where the transport mechanism is itself reliable (such as a
pipe or TCP connection), the `+'/`-' acknowledgments are redundant.  It
may be desirable to disable them in that case to reduce communication
overhead, or for other reasons.  This can be accomplished by means of
the `QStartNoAckMode' packet; *note QStartNoAckMode::.

   When in no-acknowledgment mode, neither the stub nor GDB shall send
or expect `+'/`-' protocol acknowledgments.  The packet and response
format still includes the normal checksum, as described in *note
Overview::, but the checksum may be ignored by the receiver.

   If the stub supports `QStartNoAckMode' and prefers to operate in
no-acknowledgment mode, it should report that to GDB by including
`QStartNoAckMode+' in its response to `qSupported'; *note qSupported::.
If GDB also supports `QStartNoAckMode' and it has not been disabled via
the `set remote noack-packet off' command (*note Remote
Configuration::), GDB may then send a `QStartNoAckMode' packet to the
stub.  Only then may the stub actually turn off packet acknowledgments.
GDB sends a final `+' acknowledgment of the stub's `OK' response, which
can be safely ignored by the stub.

   Note that `set remote noack-packet' command only affects negotiation
between GDB and the stub when subsequent connections are made; it does
not affect the protocol acknowledgment state for any current connection.
Since `+'/`-' acknowledgments are enabled by default when a new
connection is established, there is also no protocol request to
re-enable the acknowledgments for the current connection, once disabled.


File: gdb.info,  Node: Examples,  Next: File-I/O Remote Protocol Extension,  Prev: Packet Acknowledgment,  Up: Remote Protocol

E.12 Examples
=============

Example sequence of a target being re-started.  Notice how the restart
does not get any direct output:

     -> `R00'
     <- `+'
     _target restarts_
     -> `?'
     <- `+'
     <- `T001:1234123412341234'
     -> `+'

   Example sequence of a target being stepped by a single instruction:

     -> `G1445...'
     <- `+'
     -> `s'
     <- `+'
     _time passes_
     <- `T001:1234123412341234'
     -> `+'
     -> `g'
     <- `+'
     <- `1455...'
     -> `+'


File: gdb.info,  Node: File-I/O Remote Protocol Extension,  Next: Library List Format,  Prev: Examples,  Up: Remote Protocol

E.13 File-I/O Remote Protocol Extension
=======================================

* Menu:

* File-I/O Overview::
* Protocol Basics::
* The F Request Packet::
* The F Reply Packet::
* The Ctrl-C Message::
* Console I/O::
* List of Supported Calls::
* Protocol-specific Representation of Datatypes::
* Constants::
* File-I/O Examples::


File: gdb.info,  Node: File-I/O Overview,  Next: Protocol Basics,  Up: File-I/O Remote Protocol Extension

E.13.1 File-I/O Overview
------------------------

The "File I/O remote protocol extension" (short: File-I/O) allows the
target to use the host's file system and console I/O to perform various
system calls.  System calls on the target system are translated into a
remote protocol packet to the host system, which then performs the
needed actions and returns a response packet to the target system.
This simulates file system operations even on targets that lack file
systems.

   The protocol is defined to be independent of both the host and
target systems.  It uses its own internal representation of datatypes
and values.  Both GDB and the target's GDB stub are responsible for
translating the system-dependent value representations into the internal
protocol representations when data is transmitted.

   The communication is synchronous.  A system call is possible only
when GDB is waiting for a response from the `C', `c', `S' or `s'
packets.  While GDB handles the request for a system call, the target
is stopped to allow deterministic access to the target's memory.
Therefore File-I/O is not interruptible by target signals.  On the
other hand, it is possible to interrupt File-I/O by a user interrupt
(`Ctrl-C') within GDB.

   The target's request to perform a host system call does not finish
the latest `C', `c', `S' or `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 GDB is
required.

     (gdb) continue
       <- target requests 'system call X'
       target is stopped, GDB executes system call
       -> GDB returns result
       ... target continues, GDB returns to wait for the target
       <- target hits breakpoint and sends a Txx packet

   The protocol only supports I/O on the console and to regular files on
the host file system.  Character or block special devices, pipes, named
pipes, sockets or any other communication method on the host system are
not supported by this protocol.

   File I/O is not supported in non-stop mode.


File: gdb.info,  Node: Protocol Basics,  Next: The F Request Packet,  Prev: File-I/O Overview,  Up: File-I/O Remote Protocol Extension

E.13.2 Protocol Basics
----------------------

The File-I/O protocol uses the `F' packet as the request as well as
reply packet.  Since a File-I/O system call can only occur when GDB is
waiting for a response from the continuing or stepping target, the
File-I/O request is a reply that GDB has to expect as a result of a
previous `C', `c', `S' or `s' packet.  This `F' packet contains all
information needed to allow GDB to call the appropriate host system
call:

   * A unique identifier for the requested system call.

   * All parameters to the system call.  Pointers are given as addresses
     in the target memory address space.  Pointers to strings are given
     as pointer/length pair.  Numerical values are given as they are.
     Numerical control flags are given in a protocol-specific
     representation.


   At this point, GDB has to perform the following actions.

   * If the parameters include pointer values to data needed as input
     to a system call, GDB requests this data from the target with a
     standard `m' packet request.  This additional communication has to
     be expected by the target implementation and is handled as any
     other `m' packet.

   * GDB translates all value from protocol representation to host
     representation as needed.  Datatypes are coerced into the host
     types.

   * GDB calls the system call.

   * It then coerces datatypes back to protocol representation.

   * If the system call is expected to return data in buffer space
     specified by pointer parameters to the call, the data is
     transmitted to the target using a `M' or `X' packet.  This packet
     has to be expected by the target implementation and is handled as
     any other `M' or `X' packet.


   Eventually GDB replies with another `F' packet which contains all
necessary information for the target to continue.  This at least
contains

   * Return value.

   * `errno', if has been changed by the system call.

   * "Ctrl-C" flag.


   After having done the needed type and value coercion, the target
continues the latest continue or step action.


File: gdb.info,  Node: The F Request Packet,  Next: The F Reply Packet,  Prev: Protocol Basics,  Up: File-I/O Remote Protocol Extension

E.13.3 The `F' Request Packet
-----------------------------

The `F' request packet has the following format:

`FCALL-ID,PARAMETER...'
     CALL-ID is the identifier to indicate the host system call to be
     called.  This is just the name of the function.

     PARAMETER... are the parameters to the system call.  Parameters
     are hexadecimal integer values, either the actual values in case
     of scalar datatypes, pointers to target buffer space in case of
     compound datatypes and unspecified memory areas, or pointer/length
     pairs in case of string parameters.  These are appended to the
     CALL-ID as a comma-delimited list.  All values are transmitted in
     ASCII string representation, pointer/length pairs separated by a
     slash.



File: gdb.info,  Node: The F Reply Packet,  Next: The Ctrl-C Message,  Prev: The F Request Packet,  Up: File-I/O Remote Protocol Extension

E.13.4 The `F' Reply Packet
---------------------------

The `F' reply packet has the following format:

`FRETCODE,ERRNO,CTRL-C FLAG;CALL-SPECIFIC ATTACHMENT'
     RETCODE is the return code of the system call as hexadecimal value.

     ERRNO is the `errno' set by the call, in protocol-specific
     representation.  This parameter can be omitted if the call was
     successful.

     CTRL-C FLAG is only sent if the user requested a break.  In this
     case, ERRNO must be sent as well, even if the call was successful.
     The CTRL-C FLAG itself consists of the character `C':

          F0,0,C

     or, if the call was interrupted before the host call has been
     performed:

          F-1,4,C

     assuming 4 is the protocol-specific representation of `EINTR'.



File: gdb.info,  Node: The Ctrl-C Message,  Next: Console I/O,  Prev: The F Reply Packet,  Up: File-I/O Remote Protocol Extension

E.13.5 The `Ctrl-C' Message
---------------------------

If the `Ctrl-C' flag is set in the GDB reply packet (*note The F Reply
Packet::), the target should behave as if it had gotten a break
message.  The meaning for the target is "system call interrupted by
`SIGINT'".  Consequentially, the target should actually stop (as with a
break message) and return to GDB with a `T02' packet.

   It's important for the target to know in which state the system call
was interrupted.  There are two possible cases:

   * The system call hasn't been performed on the host yet.

   * The system call on the host has been finished.


   These two states can be distinguished by the target by the value of
the returned `errno'.  If it's the protocol representation of `EINTR',
the system call hasn't been performed.  This is equivalent to the
`EINTR' handling on POSIX systems.  In any other case, the target may
presume that the system call has been finished -- successfully or not
-- and should behave as if the break message arrived right after the
system call.

   GDB must behave reliably.  If the system call has not been called
yet, GDB may send the `F' reply immediately, setting `EINTR' as `errno'
in the packet.  If the system call on the host has been finished before
the user requests a break, the full action must be finished by GDB.
This requires sending `M' or `X' packets as necessary.  The `F' packet
may only be sent when either nothing has happened or the full action
has been completed.


File: gdb.info,  Node: Console I/O,  Next: List of Supported Calls,  Prev: The Ctrl-C Message,  Up: File-I/O Remote Protocol Extension

E.13.6 Console I/O
------------------

By default and if not explicitly closed by the target system, the file
descriptors 0, 1 and 2 are connected to the GDB console.  Output on the
GDB console is handled as any other file output operation (`write(1,
...)' or `write(2, ...)').  Console input is handled by GDB 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:

   * The user types `Ctrl-c'.  The behaviour is as explained above, and
     the `read' system call is treated as finished.

   * The user presses <RET>.  This is treated as end of input with a
     trailing newline.

   * The user types `Ctrl-d'.  This is treated as end of input.  No
     trailing character (neither newline nor `Ctrl-D') is appended to
     the input.


   If the user has typed more characters than fit in the buffer given to
the `read' call, the trailing characters are buffered in GDB until
either another `read(0, ...)' is requested by the target, or debugging
is stopped at the user's request.


File: gdb.info,  Node: List of Supported Calls,  Next: Protocol-specific Representation of Datatypes,  Prev: Console I/O,  Up: File-I/O Remote Protocol Extension

E.13.7 List of Supported Calls
------------------------------

* Menu:

* open::
* close::
* read::
* write::
* lseek::
* rename::
* unlink::
* stat/fstat::
* gettimeofday::
* isatty::
* system::


File: gdb.info,  Node: open,  Next: close,  Up: List of Supported Calls

open
....

Synopsis:
          int open(const char *pathname, int flags);
          int open(const char *pathname, int flags, mode_t mode);

Request:
     `Fopen,PATHPTR/LEN,FLAGS,MODE'

     FLAGS is the bitwise `OR' of the following values:

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

    `O_EXCL'
          When used with `O_CREAT', if the file already exists it is an
          error and open() fails.

    `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
          zero length.

    `O_APPEND'
          The file is opened in append mode.

    `O_RDONLY'
          The file is opened for reading only.

    `O_WRONLY'
          The file is opened for writing only.

    `O_RDWR'
          The file is opened for reading and writing.

     Other bits are silently ignored.

     MODE is the bitwise `OR' of the following values:

    `S_IRUSR'
          User has read permission.

    `S_IWUSR'
          User has write permission.

    `S_IRGRP'
          Group has read permission.

    `S_IWGRP'
          Group has write permission.

    `S_IROTH'
          Others have read permission.

    `S_IWOTH'
          Others have write permission.

     Other bits are silently ignored.

Return value:
     `open' returns the new file descriptor or -1 if an error occurred.

Errors:

    `EEXIST'
          PATHNAME already exists and `O_CREAT' and `O_EXCL' were used.

    `EISDIR'
          PATHNAME refers to a directory.

    `EACCES'
          The requested access is not allowed.

    `ENAMETOOLONG'
          PATHNAME was too long.

    `ENOENT'
          A directory component in PATHNAME does not exist.

    `ENODEV'
          PATHNAME refers to a device, pipe, named pipe or socket.

    `EROFS'
          PATHNAME refers to a file on a read-only filesystem and write
          access was requested.

    `EFAULT'
          PATHNAME is an invalid pointer value.

    `ENOSPC'
          No space on device to create the file.

    `EMFILE'
          The process already has the maximum number of files open.

    `ENFILE'
          The limit on the total number of files open on the system has
          been reached.

    `EINTR'
          The call was interrupted by the user.



File: gdb.info,  Node: close,  Next: read,  Prev: open,  Up: List of Supported Calls

close
.....

Synopsis:
          int close(int fd);

Request:
     `Fclose,FD'

Return value:
     `close' returns zero on success, or -1 if an error occurred.

Errors:

    `EBADF'
          FD isn't a valid open file descriptor.

    `EINTR'
          The call was interrupted by the user.



File: gdb.info,  Node: read,  Next: write,  Prev: close,  Up: List of Supported Calls

read
....

Synopsis:
          int read(int fd, void *buf, unsigned int count);

Request:
     `Fread,FD,BUFPTR,COUNT'

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.

Errors:

    `EBADF'
          FD is not a valid file descriptor or is not open for reading.

    `EFAULT'
          BUFPTR is an invalid pointer value.

    `EINTR'
          The call was interrupted by the user.



File: gdb.info,  Node: write,  Next: lseek,  Prev: read,  Up: List of Supported Calls

write
.....

Synopsis:
          int write(int fd, const void *buf, unsigned int count);

Request:
     `Fwrite,FD,BUFPTR,COUNT'

Return value:
     On success, the number of bytes written are returned.  Zero
     indicates nothing was written.  On error, -1 is returned.

Errors:

    `EBADF'
          FD is not a valid file descriptor or is not open for writing.

    `EFAULT'
          BUFPTR is an invalid pointer value.

    `EFBIG'
          An attempt was made to write a file that exceeds the
          host-specific maximum file size allowed.

    `ENOSPC'
          No space on device to write the data.

    `EINTR'
          The call was interrupted by the user.



File: gdb.info,  Node: lseek,  Next: rename,  Prev: write,  Up: List of Supported Calls

lseek
.....

Synopsis:
          long lseek (int fd, long offset, int flag);

Request:
     `Flseek,FD,OFFSET,FLAG'

     FLAG is one of:

    `SEEK_SET'
          The offset is set to OFFSET bytes.

    `SEEK_CUR'
          The offset is set to its current location plus OFFSET bytes.

    `SEEK_END'
          The offset is set to the size of the file plus OFFSET bytes.

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.

Errors:

    `EBADF'
          FD is not a valid open file descriptor.

    `ESPIPE'
          FD is associated with the GDB console.

    `EINVAL'
          FLAG is not a proper value.

    `EINTR'
          The call was interrupted by the user.



File: gdb.info,  Node: rename,  Next: unlink,  Prev: lseek,  Up: List of Supported Calls

rename
......

Synopsis:
          int rename(const char *oldpath, const char *newpath);

Request:
     `Frename,OLDPATHPTR/LEN,NEWPATHPTR/LEN'

Return value:
     On success, zero is returned.  On error, -1 is returned.

Errors:

    `EISDIR'
          NEWPATH is an existing directory, but OLDPATH is not a
          directory.

    `EEXIST'
          NEWPATH is a non-empty directory.

    `EBUSY'
          OLDPATH or NEWPATH is a directory that is in use by some
          process.

    `EINVAL'
          An attempt was made to make a directory a subdirectory of
          itself.

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

    `EFAULT'
          OLDPATHPTR or NEWPATHPTR are invalid pointer values.

    `EACCES'
          No access to the file or the path of the file.

    `ENAMETOOLONG'
          OLDPATH or NEWPATH was too long.

    `ENOENT'
          A directory component in OLDPATH or NEWPATH does not exist.

    `EROFS'
          The file is on a read-only filesystem.

    `ENOSPC'
          The device containing the file has no room for the new
          directory entry.

    `EINTR'
          The call was interrupted by the user.



File: gdb.info,  Node: unlink,  Next: stat/fstat,  Prev: rename,  Up: List of Supported Calls

unlink
......

Synopsis:
          int unlink(const char *pathname);

Request:
     `Funlink,PATHNAMEPTR/LEN'

Return value:
     On success, zero is returned.  On error, -1 is returned.

Errors:

    `EACCES'
          No access to the file or the path of the file.

    `EPERM'
          The system does not allow unlinking of directories.

    `EBUSY'
          The file PATHNAME cannot be unlinked because it's being used
          by another process.

    `EFAULT'
          PATHNAMEPTR is an invalid pointer value.

    `ENAMETOOLONG'
          PATHNAME was too long.

    `ENOENT'
          A directory component in PATHNAME does not exist.

    `ENOTDIR'
          A component of the path is not a directory.

    `EROFS'
          The file is on a read-only filesystem.

    `EINTR'
          The call was interrupted by the user.



File: gdb.info,  Node: stat/fstat,  Next: gettimeofday,  Prev: unlink,  Up: List of Supported Calls

stat/fstat
..........

Synopsis:
          int stat(const char *pathname, struct stat *buf);
          int fstat(int fd, struct stat *buf);

Request:
     `Fstat,PATHNAMEPTR/LEN,BUFPTR'
     `Ffstat,FD,BUFPTR'

Return value:
     On success, zero is returned.  On error, -1 is returned.

Errors:

    `EBADF'
          FD is not a valid open file.

    `ENOENT'
          A directory component in PATHNAME does not exist or the path
          is an empty string.

    `ENOTDIR'
          A component of the path is not a directory.

    `EFAULT'
          PATHNAMEPTR is an invalid pointer value.

    `EACCES'
          No access to the file or the path of the file.

    `ENAMETOOLONG'
          PATHNAME was too long.

    `EINTR'
          The call was interrupted by the user.



File: gdb.info,  Node: gettimeofday,  Next: isatty,  Prev: stat/fstat,  Up: List of Supported Calls

gettimeofday
............

Synopsis:
          int gettimeofday(struct timeval *tv, void *tz);

Request:
     `Fgettimeofday,TVPTR,TZPTR'

Return value:
     On success, 0 is returned, -1 otherwise.

Errors:

    `EINVAL'
          TZ is a non-NULL pointer.

    `EFAULT'
          TVPTR and/or TZPTR is an invalid pointer value.



File: gdb.info,  Node: isatty,  Next: system,  Prev: gettimeofday,  Up: List of Supported Calls

isatty
......

Synopsis:
          int isatty(int fd);

Request:
     `Fisatty,FD'

Return value:
     Returns 1 if FD refers to the GDB console, 0 otherwise.

Errors:

    `EINTR'
          The call was interrupted by the user.


   Note that the `isatty' call is treated as a special case: it returns
1 to the target if the file descriptor is attached to the GDB console,
0 otherwise.  Implementing through system calls would require
implementing `ioctl' and would be more complex than needed.


File: gdb.info,  Node: system,  Prev: isatty,  Up: List of Supported Calls

system
......

Synopsis:
          int system(const char *command);

Request:
     `Fsystem,COMMANDPTR/LEN'

Return value:
     If LEN is zero, the return value indicates whether a shell is
     available.  A zero return value indicates a shell is not available.
     For non-zero LEN, the value returned is -1 on error and the return
     status of the command otherwise.  Only the exit status of the
     command is returned, which is extracted from the host's `system'
     return value by calling `WEXITSTATUS(retval)'.  In case `/bin/sh'
     could not be executed, 127 is returned.

Errors:

    `EINTR'
          The call was interrupted by the user.


   GDB takes over the full task of calling the necessary host calls to
perform the `system' call.  The return value of `system' on the host is
simplified before it's returned to the target.  Any termination signal
information from the child process is discarded, and the return value
consists entirely of the exit status of the called command.

   Due to security concerns, the `system' call is by default refused by
GDB.  The user has to allow this call explicitly with the `set remote
system-call-allowed 1' command.

`set remote system-call-allowed'
     Control whether to allow the `system' calls in the File I/O
     protocol for the remote target.  The default is zero (disabled).

`show remote system-call-allowed'
     Show whether the `system' calls are allowed in the File I/O
     protocol.


File: gdb.info,  Node: Protocol-specific Representation of Datatypes,  Next: Constants,  Prev: List of Supported Calls,  Up: File-I/O Remote Protocol Extension

E.13.8 Protocol-specific Representation of Datatypes
----------------------------------------------------

* Menu:

* Integral Datatypes::
* Pointer Values::
* Memory Transfer::
* struct stat::
* struct timeval::


File: gdb.info,  Node: Integral Datatypes,  Next: Pointer Values,  Up: Protocol-specific Representation of Datatypes

Integral Datatypes
..................

The integral datatypes used in the system calls are `int', `unsigned
int', `long', `unsigned long', `mode_t', and `time_t'.

   `int', `unsigned int', `mode_t' and `time_t' are implemented as 32
bit values in this protocol.

   `long' and `unsigned long' are implemented as 64 bit types.

   *Note Limits::, for corresponding MIN and MAX values (similar to
those in `limits.h') to allow range checking on host and target.

   `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 `struct stat' have to be given in big
endian byte order.


File: gdb.info,  Node: Pointer Values,  Next: Memory Transfer,  Prev: Integral Datatypes,  Up: Protocol-specific Representation of Datatypes

Pointer Values
..............

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.

     `1aaf/12'

which is a pointer to data of length 18 bytes at position 0x1aaf.  The
length is defined as the full string length in bytes, including the
trailing null byte.  For example, the string `"hello world"' at address
0x123456 is transmitted as

     `123456/d'


File: gdb.info,  Node: Memory Transfer,  Next: struct stat,  Prev: Pointer Values,  Up: Protocol-specific Representation of Datatypes

Memory Transfer
...............

Structured data which is transferred using a memory read or write (for
example, a `struct stat') is expected to be in a protocol-specific
format with all scalar multibyte datatypes being big endian.
Translation to this representation needs to be done both by the target
before the `F' packet is sent, and by GDB before it transfers memory to
the target.  Transferred pointers to structured data should point to
the already-coerced data at any time.


File: gdb.info,  Node: struct stat,  Next: struct timeval,  Prev: Memory Transfer,  Up: Protocol-specific Representation of Datatypes

struct stat
...........

The buffer of type `struct stat' used by the target and GDB is defined
as follows:

     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 */
     };

   The integral datatypes conform to the definitions given in the
appropriate section (see *note 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.

`st_dev'
     A value of 0 represents a file, 1 the console.

`st_ino'
     No valid meaning for the target.  Transmitted unchanged.

`st_mode'
     Valid mode bits are described in *note Constants::.  Any other
     bits have currently no meaning for the target.

`st_uid'
`st_gid'
`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 system may not support exact
     timing values.

   The target gets a `struct stat' of the above representation and is
responsible for coercing it to the target representation before
continuing.

   Note that due to size differences between the host, target, and
protocol representations of `struct stat' members, these members could
eventually get truncated on the target.


File: gdb.info,  Node: struct timeval,  Prev: struct stat,  Up: Protocol-specific Representation of Datatypes

struct timeval
..............

The buffer of type `struct timeval' used by the File-I/O protocol is
defined as follows:

     struct timeval {
         time_t tv_sec;  /* second */
         long   tv_usec; /* microsecond */
     };

   The integral datatypes conform to the definitions given in the
appropriate section (see *note Integral Datatypes::, for details) so
this structure is of size 8 bytes.


File: gdb.info,  Node: Constants,  Next: File-I/O Examples,  Prev: Protocol-specific Representation of Datatypes,  Up: File-I/O Remote Protocol Extension

E.13.9 Constants
----------------

The following values are used for the constants inside of the protocol.
GDB and target are responsible for translating these values before and
after the call as needed.

* Menu:

* Open Flags::
* mode_t Values::
* Errno Values::
* Lseek Flags::
* Limits::


File: gdb.info,  Node: Open Flags,  Next: mode_t Values,  Up: Constants

Open Flags
..........

All values are given in hexadecimal representation.

       O_RDONLY        0x0
       O_WRONLY        0x1
       O_RDWR          0x2
       O_APPEND        0x8
       O_CREAT       0x200
       O_TRUNC       0x400
       O_EXCL        0x800


File: gdb.info,  Node: mode_t Values,  Next: Errno Values,  Prev: Open Flags,  Up: Constants

mode_t Values
.............

All values are given in octal representation.

       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


File: gdb.info,  Node: Errno Values,  Next: Lseek Flags,  Prev: mode_t Values,  Up: Constants

Errno Values
............

All values are given in decimal representation.

       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

   `EUNKNOWN' is used as a fallback error value if a host system returns
 any error value not in the list of supported error numbers.


File: gdb.info,  Node: Lseek Flags,  Next: Limits,  Prev: Errno Values,  Up: Constants

Lseek Flags
...........

       SEEK_SET      0
       SEEK_CUR      1
       SEEK_END      2


File: gdb.info,  Node: Limits,  Prev: Lseek Flags,  Up: Constants

Limits
......

All values are given in decimal representation.

       INT_MIN       -2147483648
       INT_MAX        2147483647
       UINT_MAX       4294967295
       LONG_MIN      -9223372036854775808
       LONG_MAX       9223372036854775807
       ULONG_MAX      18446744073709551615


File: gdb.info,  Node: File-I/O Examples,  Prev: Constants,  Up: File-I/O Remote Protocol Extension

E.13.10 File-I/O Examples
-------------------------

Example sequence of a write call, file descriptor 3, buffer is at target
address 0x1234, 6 bytes should be written:

     <- `Fwrite,3,1234,6'
     _request memory read from target_
     -> `m1234,6'
     <- XXXXXX
     _return "6 bytes written"_
     -> `F6'

   Example sequence of a read call, file descriptor 3, buffer is at
target address 0x1234, 6 bytes should be read:

     <- `Fread,3,1234,6'
     _request memory write to target_
     -> `X1234,6:XXXXXX'
     _return "6 bytes read"_
     -> `F6'

   Example sequence of a read call, call fails on the host due to
invalid file descriptor (`EBADF'):

     <- `Fread,3,1234,6'
     -> `F-1,9'

   Example sequence of a read call, user presses `Ctrl-c' before
syscall on host is called:

     <- `Fread,3,1234,6'
     -> `F-1,4,C'
     <- `T02'

   Example sequence of a read call, user presses `Ctrl-c' after syscall
on host is called:

     <- `Fread,3,1234,6'
     -> `X1234,6:XXXXXX'
     <- `T02'


File: gdb.info,  Node: Library List Format,  Next: Library List Format for SVR4 Targets,  Prev: File-I/O Remote Protocol Extension,  Up: Remote Protocol

E.14 Library List Format
========================

On some platforms, a dynamic loader (e.g. `ld.so') runs in the same
process as your application to manage libraries.  In this case, GDB can
use the loader's symbol table and normal memory operations to maintain
a list of shared libraries.  On other platforms, the operating system
manages loaded libraries.  GDB can not retrieve the list of currently
loaded libraries through memory operations, so it uses the
`qXfer:libraries:read' packet (*note qXfer library list read::)
instead.  The remote stub queries the target's operating system and
reports which libraries are loaded.

   The `qXfer:libraries:read' packet returns an XML document which
lists loaded libraries and their offsets.  Each library has an
associated name and one or more segment or section base addresses,
which report where the library was loaded in memory.

   For the common case of libraries that are fully linked binaries, the
library should have a list of segments.  If the target supports dynamic
linking of a relocatable object file, its library XML element should
instead include a list of allocated sections.  The segment or section
bases are start addresses, not relocation offsets; they do not depend
on the library's link-time base addresses.

   GDB must be linked with the Expat library to support XML library
lists.  *Note Expat::.

   A simple memory map, with one loaded library relocated by a single
offset, looks like this:

     <library-list>
       <library name="/lib/libc.so.6">
         <segment address="0x10000000"/>
       </library>
     </library-list>

   Another simple memory map, with one loaded library with three
allocated sections (.text, .data, .bss), looks like this:

     <library-list>
       <library name="sharedlib.o">
         <section address="0x10000000"/>
         <section address="0x20000000"/>
         <section address="0x30000000"/>
       </library>
     </library-list>

   The format of a library list is described by this DTD:

     <!-- library-list: Root element with versioning -->
     <!ELEMENT library-list  (library)*>
     <!ATTLIST library-list  version CDATA   #FIXED  "1.0">
     <!ELEMENT library       (segment*, section*)>
     <!ATTLIST library       name    CDATA   #REQUIRED>
     <!ELEMENT segment       EMPTY>
     <!ATTLIST segment       address CDATA   #REQUIRED>
     <!ELEMENT section       EMPTY>
     <!ATTLIST section       address CDATA   #REQUIRED>

   In addition, segments and section descriptors cannot be mixed within
a single library element, and you must supply at least one segment or
section for each library.


File: gdb.info,  Node: Library List Format for SVR4 Targets,  Next: Memory Map Format,  Prev: Library List Format,  Up: Remote Protocol

E.15 Library List Format for SVR4 Targets
=========================================

On SVR4 platforms GDB can use the symbol table of a dynamic loader
(e.g. `ld.so') and normal memory operations to maintain a list of
shared libraries.  Still a special library list provided by this packet
is more efficient for the GDB remote protocol.

   The `qXfer:libraries-svr4:read' packet returns an XML document which
lists loaded libraries and their SVR4 linker parameters.  For each
library on SVR4 target, the following parameters are reported:

   - `name', the absolute file name from the `l_name' field of `struct
     link_map'.

   - `lm' with address of `struct link_map' used for TLS (Thread Local
     Storage) access.

   - `l_addr', the displacement as read from the field `l_addr' of
     `struct link_map'.  For prelinked libraries this is not an absolute
     memory address.  It is a displacement of absolute memory address
     against address the file was prelinked to during the library load.

   - `l_ld', which is memory address of the `PT_DYNAMIC' segment

   Additionally the single `main-lm' attribute specifies address of
`struct link_map' used for the main executable.  This parameter is used
for TLS access and its presence is optional.

   GDB must be linked with the Expat library to support XML SVR4
library lists.  *Note Expat::.

   A simple memory map, with two loaded libraries (which do not use
prelink), looks like this:

     <library-list-svr4 version="1.0" main-lm="0xe4f8f8">
       <library name="/lib/ld-linux.so.2" lm="0xe4f51c" l_addr="0xe2d000"
                l_ld="0xe4eefc"/>
       <library name="/lib/libc.so.6" lm="0xe4fbe8" l_addr="0x154000"
                l_ld="0x152350"/>
     </library-list-svr>

   The format of an SVR4 library list is described by this DTD:

     <!-- library-list-svr4: Root element with versioning -->
     <!ELEMENT library-list-svr4  (library)*>
     <!ATTLIST library-list-svr4  version CDATA   #FIXED  "1.0">
     <!ATTLIST library-list-svr4  main-lm CDATA   #IMPLIED>
     <!ELEMENT library            EMPTY>
     <!ATTLIST library            name    CDATA   #REQUIRED>
     <!ATTLIST library            lm      CDATA   #REQUIRED>
     <!ATTLIST library            l_addr  CDATA   #REQUIRED>
     <!ATTLIST library            l_ld    CDATA   #REQUIRED>


File: gdb.info,  Node: Memory Map Format,  Next: Thread List Format,  Prev: Library List Format for SVR4 Targets,  Up: Remote Protocol

E.16 Memory Map Format
======================

To be able to write into flash memory, GDB needs to obtain a memory map
from the target.  This section describes the format of the memory map.

   The memory map is obtained using the `qXfer:memory-map:read' (*note
qXfer memory map read::) packet and is an XML document that lists
memory regions.

   GDB must be linked with the Expat library to support XML memory
maps.  *Note Expat::.

   The top-level structure of the document is shown below:

     <?xml version="1.0"?>
     <!DOCTYPE memory-map
               PUBLIC "+//IDN gnu.org//DTD GDB Memory Map V1.0//EN"
                      "http://sourceware.org/gdb/gdb-memory-map.dtd">
     <memory-map>
         region...
     </memory-map>

   Each region can be either:

   * A region of RAM starting at ADDR and extending for LENGTH bytes
     from there:

          <memory type="ram" start="ADDR" length="LENGTH"/>

   * A region of read-only memory:

          <memory type="rom" start="ADDR" length="LENGTH"/>

   * A region of flash memory, with erasure blocks BLOCKSIZE bytes in
     length:

          <memory type="flash" start="ADDR" length="LENGTH">
            <property name="blocksize">BLOCKSIZE</property>
          </memory>


   Regions must not overlap.  GDB assumes that areas of memory not
covered by the memory map are RAM, and uses the ordinary `M' and `X'
packets to write to addresses in such ranges.

   The formal DTD for memory map format is given below:

     <!-- ................................................... -->
     <!-- Memory Map XML DTD ................................ -->
     <!-- File: memory-map.dtd .............................. -->
     <!-- .................................... .............. -->
     <!-- memory-map.dtd -->
     <!-- memory-map: Root element with versioning -->
     <!ELEMENT memory-map (memory | property)>
     <!ATTLIST memory-map    version CDATA   #FIXED  "1.0.0">
     <!ELEMENT memory (property)>
     <!-- memory: Specifies a memory region,
                  and its type, or device. -->
     <!ATTLIST memory        type    CDATA   #REQUIRED
                             start   CDATA   #REQUIRED
                             length  CDATA   #REQUIRED
                             device  CDATA   #IMPLIED>
     <!-- property: Generic attribute tag -->
     <!ELEMENT property (#PCDATA | property)*>
     <!ATTLIST property      name    CDATA   #REQUIRED>


File: gdb.info,  Node: Thread List Format,  Next: Traceframe Info Format,  Prev: Memory Map Format,  Up: Remote Protocol

E.17 Thread List Format
=======================

To efficiently update the list of threads and their attributes, GDB
issues the `qXfer:threads:read' packet (*note qXfer threads read::) and
obtains the XML document with the following structure:

     <?xml version="1.0"?>
     <threads>
         <thread id="id" core="0">
         ... description ...
         </thread>
     </threads>

   Each `thread' element must have the `id' attribute that identifies
the thread (*note thread-id syntax::).  The `core' attribute, if
present, specifies which processor core the thread was last executing
on.  The content of the of `thread' element is interpreted as
human-readable auxilliary information.


File: gdb.info,  Node: Traceframe Info Format,  Prev: Thread List Format,  Up: Remote Protocol

E.18 Traceframe Info Format
===========================

To be able to know which objects in the inferior can be examined when
inspecting a tracepoint hit, GDB needs to obtain the list of memory
ranges, registers and trace state variables that have been collected in
a traceframe.

   This list is obtained using the `qXfer:traceframe-info:read' (*note
qXfer traceframe info read::) packet and is an XML document.

   GDB must be linked with the Expat library to support XML traceframe
info discovery.  *Note Expat::.

   The top-level structure of the document is shown below:

     <?xml version="1.0"?>
     <!DOCTYPE traceframe-info
               PUBLIC "+//IDN gnu.org//DTD GDB Memory Map V1.0//EN"
                      "http://sourceware.org/gdb/gdb-traceframe-info.dtd">
     <traceframe-info>
        block...
     </traceframe-info>

   Each traceframe block can be either:

   * A region of collected memory starting at ADDR and extending for
     LENGTH bytes from there:

          <memory start="ADDR" length="LENGTH"/>


   The formal DTD for the traceframe info format is given below:

     <!ELEMENT traceframe-info  (memory)* >
     <!ATTLIST traceframe-info  version CDATA   #FIXED  "1.0">

     <!ELEMENT memory        EMPTY>
     <!ATTLIST memory        start   CDATA   #REQUIRED
                             length  CDATA   #REQUIRED>


File: gdb.info,  Node: Agent Expressions,  Next: Target Descriptions,  Prev: Remote Protocol,  Up: Top

Appendix F The GDB Agent Expression Mechanism
*********************************************

In some applications, it is not feasible for the debugger to interrupt
the program's execution long enough for the developer to learn anything
helpful about its behavior.  If the program's correctness depends on its
real-time behavior, delays introduced by a debugger might cause the
program to fail, even when the code itself is correct.  It is useful to
be able to observe the program's behavior without interrupting it.

   Using GDB's `trace' and `collect' commands, the user can specify
locations in the program, and arbitrary expressions to evaluate when
those locations are reached.  Later, using the `tfind' command, she can
examine the values those expressions had when the program hit the trace
points.  The expressions may also denote objects in memory --
structures or arrays, for example -- whose values GDB should record;
while visiting a particular tracepoint, the user may inspect those
objects as if they were in memory at that moment.  However, because GDB
records these values without interacting with the user, it can do so
quickly and unobtrusively, hopefully not disturbing the program's
behavior.

   When GDB is debugging a remote target, the GDB "agent" code running
on the target computes the values of the expressions itself.  To avoid
having a full symbolic expression evaluator on the agent, GDB translates
expressions in the source language into a simpler bytecode language, and
then sends the bytecode to the agent; the agent then executes the
bytecode, and records the values for GDB to retrieve later.

   The bytecode language is simple; there are forty-odd opcodes, the
bulk of which are the usual vocabulary of C operands (addition,
subtraction, shifts, and so on) and various sizes of literals and
memory reference operations.  The bytecode interpreter operates
strictly on machine-level values -- various sizes of integers and
floating point numbers -- and requires no information about types or
symbols; thus, the interpreter's internal data structures are simple,
and each bytecode requires only a few native machine instructions to
implement it.  The interpreter is small, and strict limits on the
memory and time required to evaluate an expression are easy to
determine, making it suitable for use by the debugging agent in
real-time applications.

* Menu:

* General Bytecode Design::     Overview of the interpreter.
* Bytecode Descriptions::       What each one does.
* Using Agent Expressions::     How agent expressions fit into the big picture.
* Varying Target Capabilities:: How to discover what the target can do.
* Rationale::                   Why we did it this way.


File: gdb.info,  Node: General Bytecode Design,  Next: Bytecode Descriptions,  Up: Agent Expressions

F.1 General Bytecode Design
===========================

The agent represents bytecode expressions as an array of bytes.  Each
instruction is one byte long (thus the term "bytecode").  Some
instructions are followed by operand bytes; for example, the `goto'
instruction is followed by a destination for the jump.

   The bytecode interpreter is a stack-based machine; most instructions
pop their operands off the stack, perform some operation, and push the
result back on the stack for the next instruction to consume.  Each
element of the stack may contain either a integer or a floating point
value; these values are as many bits wide as the largest integer that
can be directly manipulated in the source language.  Stack elements
carry no record of their type; bytecode could push a value as an
integer, then pop it as a floating point value.  However, GDB will not
generate code which does this.  In C, one might define the type of a
stack element as follows:
     union agent_val {
       LONGEST l;
       DOUBLEST d;
     };
   where `LONGEST' and `DOUBLEST' are `typedef' names for the largest
integer and floating point types on the machine.

   By the time the bytecode interpreter reaches the end of the
expression, the value of the expression should be the only value left
on the stack.  For tracing applications, `trace' bytecodes in the
expression will have recorded the necessary data, and the value on the
stack may be discarded.  For other applications, like conditional
breakpoints, the value may be useful.

   Separate from the stack, the interpreter has two registers:
`pc'
     The address of the next bytecode to execute.

`start'
     The address of the start of the bytecode expression, necessary for
     interpreting the `goto' and `if_goto' instructions.

   Neither of these registers is directly visible to the bytecode
language itself, but they are useful for defining the meanings of the
bytecode operations.

   There are no instructions to perform side effects on the running
program, or call the program's functions; we assume that these
expressions are only used for unobtrusive debugging, not for patching
the running code.

   Most bytecode instructions do not distinguish between the various
sizes of values, and operate on full-width values; the upper bits of the
values are simply ignored, since they do not usually make a difference
to the value computed.  The exceptions to this rule are:
memory reference instructions (`ref'N)
     There are distinct instructions to fetch different word sizes from
     memory.  Once on the stack, however, the values are treated as
     full-size integers.  They may need to be sign-extended; the `ext'
     instruction exists for this purpose.

the sign-extension instruction (`ext' N)
     These clearly need to know which portion of their operand is to be
     extended to occupy the full length of the word.


   If the interpreter is unable to evaluate an expression completely for
some reason (a memory location is inaccessible, or a divisor is zero,
for example), we say that interpretation "terminates with an error".
This means that the problem is reported back to the interpreter's caller
in some helpful way.  In general, code using agent expressions should
assume that they may attempt to divide by zero, fetch arbitrary memory
locations, and misbehave in other ways.

   Even complicated C expressions compile to a few bytecode
instructions; for example, the expression `x + y * z' would typically
produce code like the following, assuming that `x' and `y' live in
registers, and `z' is a global variable holding a 32-bit `int':
     reg 1
     reg 2
     const32 address of z
     ref32
     ext 32
     mul
     add
     end

   In detail, these mean:
`reg 1'
     Push the value of register 1 (presumably holding `x') onto the
     stack.

`reg 2'
     Push the value of register 2 (holding `y').

`const32 address of z'
     Push the address of `z' onto the stack.

`ref32'
     Fetch a 32-bit word from the address at the top of the stack;
     replace the address on the stack with the value.  Thus, we replace
     the address of `z' with `z''s value.

`ext 32'
     Sign-extend the value on the top of the stack from 32 bits to full
     length.  This is necessary because `z' is a signed integer.

`mul'
     Pop the top two numbers on the stack, multiply them, and push their
     product.  Now the top of the stack contains the value of the
     expression `y * z'.

`add'
     Pop the top two numbers, add them, and push the sum.  Now the top
     of the stack contains the value of `x + y * z'.

`end'
     Stop executing; the value left on the stack top is the value to be
     recorded.



File: gdb.info,  Node: Bytecode Descriptions,  Next: Using Agent Expressions,  Prev: General Bytecode Design,  Up: Agent Expressions

F.2 Bytecode Descriptions
=========================

Each bytecode description has the following form:

`add' (0x02): A B => A+B
     Pop the top two stack items, A and B, as integers; push their sum,
     as an integer.


   In this example, `add' is the name of the bytecode, and `(0x02)' is
the one-byte value used to encode the bytecode, in hexadecimal.  The
phrase "A B => A+B" shows the stack before and after the bytecode
executes.  Beforehand, the stack must contain at least two values, A
and B; since the top of the stack is to the right, B is on the top of
the stack, and A is underneath it.  After execution, the bytecode will
have popped A and B from the stack, and replaced them with a single
value, A+B.  There may be other values on the stack below those shown,
but the bytecode affects only those shown.

   Here is another example:

`const8' (0x22) N: => N
     Push the 8-bit integer constant N on the stack, without sign
     extension.


   In this example, the bytecode `const8' takes an operand N directly
from the bytecode stream; the operand follows the `const8' bytecode
itself.  We write any such operands immediately after the name of the
bytecode, before the colon, and describe the exact encoding of the
operand in the bytecode stream in the body of the bytecode description.

   For the `const8' bytecode, there are no stack items given before the
=>; this simply means that the bytecode consumes no values from the
stack.  If a bytecode consumes no values, or produces no values, the
list on either side of the => may be empty.

   If a value is written as A, B, or N, then the bytecode treats it as
an integer.  If a value is written is ADDR, then the bytecode treats it
as an address.

   We do not fully describe the floating point operations here; although
this design can be extended in a clean way to handle floating point
values, they are not of immediate interest to the customer, so we avoid
describing them, to save time.

`float' (0x01): =>
     Prefix for floating-point bytecodes.  Not implemented yet.

`add' (0x02): A B => A+B
     Pop two integers from the stack, and push their sum, as an integer.

`sub' (0x03): A B => A-B
     Pop two integers from the stack, subtract the top value from the
     next-to-top value, and push the difference.

`mul' (0x04): A B => A*B
     Pop two integers from the stack, multiply them, and push the
     product on the stack.  Note that, when one multiplies two N-bit
     numbers yielding another N-bit number, it is irrelevant whether the
     numbers are signed or not; the results are the same.

`div_signed' (0x05): A B => A/B
     Pop two signed integers from the stack; divide the next-to-top
     value by the top value, and push the quotient.  If the divisor is
     zero, terminate with an error.

`div_unsigned' (0x06): A B => A/B
     Pop two unsigned integers from the stack; divide the next-to-top
     value by the top value, and push the quotient.  If the divisor is
     zero, terminate with an error.

`rem_signed' (0x07): A B => A MODULO B
     Pop two signed integers from the stack; divide the next-to-top
     value by the top value, and push the remainder.  If the divisor is
     zero, terminate with an error.

`rem_unsigned' (0x08): A B => A MODULO B
     Pop two unsigned integers from the stack; divide the next-to-top
     value by the top value, and push the remainder.  If the divisor is
     zero, terminate with an error.

`lsh' (0x09): A B => A<<B
     Pop two integers from the stack; let A be the next-to-top value,
     and B be the top value.  Shift A left by B bits, and push the
     result.

`rsh_signed' (0x0a): A B => `(signed)'A>>B
     Pop two integers from the stack; let A be the next-to-top value,
     and B be the top value.  Shift A right by B bits, inserting copies
     of the top bit at the high end, and push the result.

`rsh_unsigned' (0x0b): A B => A>>B
     Pop two integers from the stack; let A be the next-to-top value,
     and B be the top value.  Shift A right by B bits, inserting zero
     bits at the high end, and push the result.

`log_not' (0x0e): A => !A
     Pop an integer from the stack; if it is zero, push the value one;
     otherwise, push the value zero.

`bit_and' (0x0f): A B => A&B
     Pop two integers from the stack, and push their bitwise `and'.

`bit_or' (0x10): A B => A|B
     Pop two integers from the stack, and push their bitwise `or'.

`bit_xor' (0x11): A B => A^B
     Pop two integers from the stack, and push their bitwise
     exclusive-`or'.

`bit_not' (0x12): A => ~A
     Pop an integer from the stack, and push its bitwise complement.

`equal' (0x13): A B => A=B
     Pop two integers from the stack; if they are equal, push the value
     one; otherwise, push the value zero.

`less_signed' (0x14): A B => A<B
     Pop two signed integers from the stack; if the next-to-top value
     is less than the top value, push the value one; otherwise, push
     the value zero.

`less_unsigned' (0x15): A B => A<B
     Pop two unsigned integers from the stack; if the next-to-top value
     is less than the top value, push the value one; otherwise, push
     the value zero.

`ext' (0x16) N: A => A, sign-extended from N bits
     Pop an unsigned value from the stack; treating it as an N-bit
     twos-complement value, extend it to full length.  This means that
     all bits to the left of bit N-1 (where the least significant bit
     is bit 0) are set to the value of bit N-1.  Note that N may be
     larger than or equal to the width of the stack elements of the
     bytecode engine; in this case, the bytecode should have no effect.

     The number of source bits to preserve, N, is encoded as a single
     byte unsigned integer following the `ext' bytecode.

`zero_ext' (0x2a) N: A => A, zero-extended from N bits
     Pop an unsigned value from the stack; zero all but the bottom N
     bits.  This means that all bits to the left of bit N-1 (where the
     least significant bit is bit 0) are set to the value of bit N-1.

     The number of source bits to preserve, N, is encoded as a single
     byte unsigned integer following the `zero_ext' bytecode.

`ref8' (0x17): ADDR => A
`ref16' (0x18): ADDR => A
`ref32' (0x19): ADDR => A
`ref64' (0x1a): ADDR => A
     Pop an address ADDR from the stack.  For bytecode `ref'N, fetch an
     N-bit value from ADDR, using the natural target endianness.  Push
     the fetched value as an unsigned integer.

     Note that ADDR may not be aligned in any particular way; the
     `refN' bytecodes should operate correctly for any address.

     If attempting to access memory at ADDR would cause a processor
     exception of some sort, terminate with an error.

`ref_float' (0x1b): ADDR => D
`ref_double' (0x1c): ADDR => D
`ref_long_double' (0x1d): ADDR => D
`l_to_d' (0x1e): A => D
`d_to_l' (0x1f): D => A
     Not implemented yet.

`dup' (0x28): A => A A
     Push another copy of the stack's top element.

`swap' (0x2b): A B => B A
     Exchange the top two items on the stack.

`pop' (0x29): A =>
     Discard the top value on the stack.

`pick' (0x32) N: A ... B => A ... B A
     Duplicate an item from the stack and push it on the top of the
     stack.  N, a single byte, indicates the stack item to copy.  If N
     is zero, this is the same as `dup'; if N is one, it copies the
     item under the top item, etc.  If N exceeds the number of items on
     the stack, terminate with an error.

`rot' (0x33): A B C => C B A
     Rotate the top three items on the stack.

`if_goto' (0x20) OFFSET: A =>
     Pop an integer off the stack; if it is non-zero, branch to the
     given offset in the bytecode string.  Otherwise, continue to the
     next instruction in the bytecode stream.  In other words, if A is
     non-zero, set the `pc' register to `start' + OFFSET.  Thus, an
     offset of zero denotes the beginning of the expression.

     The OFFSET is stored as a sixteen-bit unsigned value, stored
     immediately following the `if_goto' bytecode.  It is always stored
     most significant byte first, regardless of the target's normal
     endianness.  The offset is not guaranteed to fall at any particular
     alignment within the bytecode stream; thus, on machines where
     fetching a 16-bit on an unaligned address raises an exception, you
     should fetch the offset one byte at a time.

`goto' (0x21) OFFSET: =>
     Branch unconditionally to OFFSET; in other words, set the `pc'
     register to `start' + OFFSET.

     The offset is stored in the same way as for the `if_goto' bytecode.

`const8' (0x22) N: => N
`const16' (0x23) N: => N
`const32' (0x24) N: => N
`const64' (0x25) N: => N
     Push the integer constant N on the stack, without sign extension.
     To produce a small negative value, push a small twos-complement
     value, and then sign-extend it using the `ext' bytecode.

     The constant N is stored in the appropriate number of bytes
     following the `const'B bytecode.  The constant N is always stored
     most significant byte first, regardless of the target's normal
     endianness.  The constant is not guaranteed to fall at any
     particular alignment within the bytecode stream; thus, on machines
     where fetching a 16-bit on an unaligned address raises an
     exception, you should fetch N one byte at a time.

`reg' (0x26) N: => A
     Push the value of register number N, without sign extension.  The
     registers are numbered following GDB's conventions.

     The register number N is encoded as a 16-bit unsigned integer
     immediately following the `reg' bytecode.  It is always stored most
     significant byte first, regardless of the target's normal
     endianness.  The register number is not guaranteed to fall at any
     particular alignment within the bytecode stream; thus, on machines
     where fetching a 16-bit on an unaligned address raises an
     exception, you should fetch the register number one byte at a time.

`getv' (0x2c) N: => V
     Push the value of trace state variable number N, without sign
     extension.

     The variable number N is encoded as a 16-bit unsigned integer
     immediately following the `getv' bytecode.  It is always stored
     most significant byte first, regardless of the target's normal
     endianness.  The variable number is not guaranteed to fall at any
     particular alignment within the bytecode stream; thus, on machines
     where fetching a 16-bit on an unaligned address raises an
     exception, you should fetch the register number one byte at a time.

`setv' (0x2d) N: => V
     Set trace state variable number N to the value found on the top of
     the stack.  The stack is unchanged, so that the value is readily
     available if the assignment is part of a larger expression.  The
     handling of N is as described for `getv'.

`trace' (0x0c): ADDR SIZE =>
     Record the contents of the SIZE bytes at ADDR in a trace buffer,
     for later retrieval by GDB.

`trace_quick' (0x0d) SIZE: ADDR => ADDR
     Record the contents of the SIZE bytes at ADDR in a trace buffer,
     for later retrieval by GDB.  SIZE is a single byte unsigned
     integer following the `trace' opcode.

     This bytecode is equivalent to the sequence `dup const8 SIZE
     trace', but we provide it anyway to save space in bytecode strings.

`trace16' (0x30) SIZE: ADDR => ADDR
     Identical to trace_quick, except that SIZE is a 16-bit big-endian
     unsigned integer, not a single byte.  This should probably have
     been named `trace_quick16', for consistency.

`tracev' (0x2e) N: => A
     Record the value of trace state variable number N in the trace
     buffer.  The handling of N is as described for `getv'.

`tracenz' (0x2f)  ADDR SIZE =>
     Record the bytes at ADDR in a trace buffer, for later retrieval by
     GDB.  Stop at either the first zero byte, or when SIZE bytes have
     been recorded, whichever occurs first.

`end' (0x27): =>
     Stop executing bytecode; the result should be the top element of
     the stack.  If the purpose of the expression was to compute an
     lvalue or a range of memory, then the next-to-top of the stack is
     the lvalue's address, and the top of the stack is the lvalue's
     size, in bytes.



File: gdb.info,  Node: Using Agent Expressions,  Next: Varying Target Capabilities,  Prev: Bytecode Descriptions,  Up: Agent Expressions

F.3 Using Agent Expressions
===========================

Agent expressions can be used in several different ways by GDB, and the
debugger can generate different bytecode sequences as appropriate.

   One possibility is to do expression evaluation on the target rather
than the host, such as for the conditional of a conditional tracepoint.
In such a case, GDB compiles the source expression into a bytecode
sequence that simply gets values from registers or memory, does
arithmetic, and returns a result.

   Another way to use agent expressions is for tracepoint data
collection.  GDB generates a different bytecode sequence for
collection; in addition to bytecodes that do the calculation, GDB adds
`trace' bytecodes to save the pieces of memory that were used.

   * The user selects trace points in the program's code at which GDB
     should collect data.

   * The user specifies expressions to evaluate at each trace point.
     These expressions may denote objects in memory, in which case
     those objects' contents are recorded as the program runs, or
     computed values, in which case the values themselves are recorded.

   * GDB transmits the tracepoints and their associated expressions to
     the GDB agent, running on the debugging target.

   * The agent arranges to be notified when a trace point is hit.

   * When execution on the target reaches a trace point, the agent
     evaluates the expressions associated with that trace point, and
     records the resulting values and memory ranges.

   * Later, when the user selects a given trace event and inspects the
     objects and expression values recorded, GDB talks to the agent to
     retrieve recorded data as necessary to meet the user's requests.
     If the user asks to see an object whose contents have not been
     recorded, GDB reports an error.



File: gdb.info,  Node: Varying Target Capabilities,  Next: Rationale,  Prev: Using Agent Expressions,  Up: Agent Expressions

F.4 Varying Target Capabilities
===============================

Some targets don't support floating-point, and some would rather not
have to deal with `long long' operations.  Also, different targets will
have different stack sizes, and different bytecode buffer lengths.

   Thus, GDB needs a way to ask the target about itself.  We haven't
worked out the details yet, but in general, GDB should be able to send
the target a packet asking it to describe itself.  The reply should be a
packet whose length is explicit, so we can add new information to the
packet in future revisions of the agent, without confusing old versions
of GDB, and it should contain a version number.  It should contain at
least the following information:

   * whether floating point is supported

   * whether `long long' is supported

   * maximum acceptable size of bytecode stack

   * maximum acceptable length of bytecode expressions

   * which registers are actually available for collection

   * whether the target supports disabled tracepoints



File: gdb.info,  Node: Rationale,  Prev: Varying Target Capabilities,  Up: Agent Expressions

F.5 Rationale
=============

Some of the design decisions apparent above are arguable.

What about stack overflow/underflow?
     GDB should be able to query the target to discover its stack size.
     Given that information, GDB can determine at translation time
     whether a given expression will overflow the stack.  But this spec
     isn't about what kinds of error-checking GDB ought to do.

Why are you doing everything in LONGEST?
     Speed isn't important, but agent code size is; using LONGEST
     brings in a bunch of support code to do things like division, etc.
     So this is a serious concern.

     First, note that you don't need different bytecodes for different
     operand sizes.  You can generate code without _knowing_ how big the
     stack elements actually are on the target.  If the target only
     supports 32-bit ints, and you don't send any 64-bit bytecodes,
     everything just works.  The observation here is that the MIPS and
     the Alpha have only fixed-size registers, and you can still get
     C's semantics even though most instructions only operate on
     full-sized words.  You just need to make sure everything is
     properly sign-extended at the right times.  So there is no need
     for 32- and 64-bit variants of the bytecodes.  Just implement
     everything using the largest size you support.

     GDB should certainly check to see what sizes the target supports,
     so the user can get an error earlier, rather than later.  But this
     information is not necessary for correctness.

Why don't you have `>' or `<=' operators?
     I want to keep the interpreter small, and we don't need them.  We
     can combine the `less_' opcodes with `log_not', and swap the order
     of the operands, yielding all four asymmetrical comparison
     operators.  For example, `(x <= y)' is `! (x > y)', which is `! (y
     < x)'.

Why do you have `log_not'?
Why do you have `ext'?
Why do you have `zero_ext'?
     These are all easily synthesized from other instructions, but I
     expect them to be used frequently, and they're simple, so I
     include them to keep bytecode strings short.

     `log_not' is equivalent to `const8 0 equal'; it's used in half the
     relational operators.

     `ext N' is equivalent to `const8 S-N lsh const8 S-N rsh_signed',
     where S is the size of the stack elements; it follows `refM' and
     REG bytecodes when the value should be signed.  See the next
     bulleted item.

     `zero_ext N' is equivalent to `constM MASK log_and'; it's used
     whenever we push the value of a register, because we can't assume
     the upper bits of the register aren't garbage.

Why not have sign-extending variants of the `ref' operators?
     Because that would double the number of `ref' operators, and we
     need the `ext' bytecode anyway for accessing bitfields.

Why not have constant-address variants of the `ref' operators?
     Because that would double the number of `ref' operators again, and
     `const32 ADDRESS ref32' is only one byte longer.

Why do the `refN' operators have to support unaligned fetches?
     GDB will generate bytecode that fetches multi-byte values at
     unaligned addresses whenever the executable's debugging
     information tells it to.  Furthermore, GDB does not know the value
     the pointer will have when GDB generates the bytecode, so it
     cannot determine whether a particular fetch will be aligned or not.

     In particular, structure bitfields may be several bytes long, but
     follow no alignment rules; members of packed structures are not
     necessarily aligned either.

     In general, there are many cases where unaligned references occur
     in correct C code, either at the programmer's explicit request, or
     at the compiler's discretion.  Thus, it is simpler to make the GDB
     agent bytecodes work correctly in all circumstances than to make
     GDB guess in each case whether the compiler did the usual thing.

Why are there no side-effecting operators?
     Because our current client doesn't want them?  That's a cheap
     answer.  I think the real answer is that I'm afraid of
     implementing function calls.  We should re-visit this issue after
     the present contract is delivered.

Why aren't the `goto' ops PC-relative?
     The interpreter has the base address around anyway for PC bounds
     checking, and it seemed simpler.

Why is there only one offset size for the `goto' ops?
     Offsets are currently sixteen bits.  I'm not happy with this
     situation either:

     Suppose we have multiple branch ops with different offset sizes.
     As I generate code left-to-right, all my jumps are forward jumps
     (there are no loops in expressions), so I never know the target
     when I emit the jump opcode.  Thus, I have to either always assume
     the largest offset size, or do jump relaxation on the code after I
     generate it, which seems like a big waste of time.

     I can imagine a reasonable expression being longer than 256 bytes.
     I can't imagine one being longer than 64k.  Thus, we need 16-bit
     offsets.  This kind of reasoning is so bogus, but relaxation is
     pathetic.

     The other approach would be to generate code right-to-left.  Then
     I'd always know my offset size.  That might be fun.

Where is the function call bytecode?
     When we add side-effects, we should add this.

Why does the `reg' bytecode take a 16-bit register number?
     Intel's IA-64 architecture has 128 general-purpose registers, and
     128 floating-point registers, and I'm sure it has some random
     control registers.

Why do we need `trace' and `trace_quick'?
     Because GDB needs to record all the memory contents and registers
     an expression touches.  If the user wants to evaluate an expression
     `x->y->z', the agent must record the values of `x' and `x->y' as
     well as the value of `x->y->z'.

Don't the `trace' bytecodes make the interpreter less general?
     They do mean that the interpreter contains special-purpose code,
     but that doesn't mean the interpreter can only be used for that
     purpose.  If an expression doesn't use the `trace' bytecodes, they
     don't get in its way.

Why doesn't `trace_quick' consume its arguments the way everything else does?
     In general, you do want your operators to consume their arguments;
     it's consistent, and generally reduces the amount of stack
     rearrangement necessary.  However, `trace_quick' is a kludge to
     save space; it only exists so we needn't write `dup const8 SIZE
     trace' before every memory reference.  Therefore, it's okay for it
     not to consume its arguments; it's meant for a specific context in
     which we know exactly what it should do with the stack.  If we're
     going to have a kludge, it should be an effective kludge.

Why does `trace16' exist?
     That opcode was added by the customer that contracted Cygnus for
     the data tracing work.  I personally think it is unnecessary;
     objects that large will be quite rare, so it is okay to use `dup
     const16 SIZE trace' in those cases.

     Whatever we decide to do with `trace16', we should at least leave
     opcode 0x30 reserved, to remain compatible with the customer who
     added it.



File: gdb.info,  Node: Target Descriptions,  Next: Operating System Information,  Prev: Agent Expressions,  Up: Top

Appendix G Target Descriptions
******************************

One of the challenges of using GDB to debug embedded systems is that
there are so many minor variants of each processor architecture in use.
It is common practice for vendors to start with a standard processor
core -- ARM, PowerPC, or MIPS, for example -- and then make changes to
adapt it to a particular market niche.  Some architectures have
hundreds of variants, available from dozens of vendors.  This leads to
a number of problems:

   * With so many different customized processors, it is difficult for
     the GDB maintainers to keep up with the changes.

   * Since individual variants may have short lifetimes or limited
     audiences, it may not be worthwhile to carry information about
     every variant in the GDB source tree.

   * When GDB does support the architecture of the embedded system at
     hand, the task of finding the correct architecture name to give the
     `set architecture' command can be error-prone.

   To address these problems, the GDB remote protocol allows a target
system to not only identify itself to GDB, but to actually describe its
own features.  This lets GDB support processor variants it has never
seen before -- to the extent that the descriptions are accurate, and
that GDB understands them.

   GDB must be linked with the Expat library to support XML target
descriptions.  *Note Expat::.

* Menu:

* Retrieving Descriptions::         How descriptions are fetched from a target.
* Target Description Format::       The contents of a target description.
* Predefined Target Types::         Standard types available for target
                                    descriptions.
* Standard Target Features::        Features GDB knows about.


File: gdb.info,  Node: Retrieving Descriptions,  Next: Target Description Format,  Up: Target Descriptions

G.1 Retrieving Descriptions
===========================

Target descriptions can be read from the target automatically, or
specified by the user manually.  The default behavior is to read the
description from the target.  GDB retrieves it via the remote protocol
using `qXfer' requests (*note qXfer: General Query Packets.).  The
ANNEX in the `qXfer' packet will be `target.xml'.  The contents of the
`target.xml' annex are an XML document, of the form described in *note
Target Description Format::.

   Alternatively, you can specify a file to read for the target
description.  If a file is set, the target will not be queried.  The
commands to specify a file are:

`set tdesc filename PATH'
     Read the target description from PATH.

`unset tdesc filename'
     Do not read the XML target description from a file.  GDB will use
     the description supplied by the current target.

`show tdesc filename'
     Show the filename to read for a target description, if any.


File: gdb.info,  Node: Target Description Format,  Next: Predefined Target Types,  Prev: Retrieving Descriptions,  Up: Target Descriptions

G.2 Target Description Format
=============================

A target description annex is an XML (http://www.w3.org/XML/) document
which complies with the Document Type Definition provided in the GDB
sources in `gdb/features/gdb-target.dtd'.  This means you can use
generally available tools like `xmllint' to check that your feature
descriptions are well-formed and valid.  However, to help people
unfamiliar with XML write descriptions for their targets, we also
describe the grammar here.

   Target descriptions can identify the architecture of the remote
target and (for some architectures) provide information about custom
register sets.  They can also identify the OS ABI of the remote target.
GDB can use this information to autoconfigure for your target, or to
warn you if you connect to an unsupported target.

   Here is a simple target description:

     <target version="1.0">
       <architecture>i386:x86-64</architecture>
     </target>

This minimal description only says that the target uses the x86-64
architecture.

   A target description has the following overall form, with [ ] marking
optional elements and ... marking repeatable elements.  The elements
are explained further below.

     <?xml version="1.0"?>
     <!DOCTYPE target SYSTEM "gdb-target.dtd">
     <target version="1.0">
       [ARCHITECTURE]
       [OSABI]
       [COMPATIBLE]
       [FEATURE...]
     </target>

The description is generally insensitive to whitespace and line breaks,
under the usual common-sense rules.  The XML version declaration and
document type declaration can generally be omitted (GDB does not
require them), but specifying them may be useful for XML validation
tools.  The `version' attribute for `<target>' may also be omitted, but
we recommend including it; if future versions of GDB use an incompatible
revision of `gdb-target.dtd', they will detect and report the version
mismatch.

G.2.1 Inclusion
---------------

It can sometimes be valuable to split a target description up into
several different annexes, either for organizational purposes, or to
share files between different possible target descriptions.  You can
divide a description into multiple files by replacing any element of
the target description with an inclusion directive of the form:

     <xi:include href="DOCUMENT"/>

When GDB encounters an element of this form, it will retrieve the named
XML DOCUMENT, and replace the inclusion directive with the contents of
that document.  If the current description was read using `qXfer', then
so will be the included document; DOCUMENT will be interpreted as the
name of an annex.  If the current description was read from a file, GDB
will look for DOCUMENT as a file in the same directory where it found
the original description.

G.2.2 Architecture
------------------

An `<architecture>' element has this form:

       <architecture>ARCH</architecture>

   ARCH is one of the architectures from the set accepted by `set
architecture' (*note Specifying a Debugging Target: Targets.).

G.2.3 OS ABI
------------

This optional field was introduced in GDB version 7.0.  Previous
versions of GDB ignore it.

   An `<osabi>' element has this form:

       <osabi>ABI-NAME</osabi>

   ABI-NAME is an OS ABI name from the same selection accepted by
`set osabi' (*note Configuring the Current ABI: ABI.).

G.2.4 Compatible Architecture
-----------------------------

This optional field was introduced in GDB version 7.0.  Previous
versions of GDB ignore it.

   A `<compatible>' element has this form:

       <compatible>ARCH</compatible>

   ARCH is one of the architectures from the set accepted by `set
architecture' (*note Specifying a Debugging Target: Targets.).

   A `<compatible>' element is used to specify that the target is able
to run binaries in some other than the main target architecture given
by the `<architecture>' element.  For example, on the Cell Broadband
Engine, the main architecture is `powerpc:common' or
`powerpc:common64', but the system is able to run binaries in the `spu'
architecture as well.  The way to describe this capability with
`<compatible>' is as follows:

       <architecture>powerpc:common</architecture>
       <compatible>spu</compatible>

G.2.5 Features
--------------

Each `<feature>' describes some logical portion of the target system.
Features are currently used to describe available CPU registers and the
types of their contents.  A `<feature>' element has this form:

     <feature name="NAME">
       [TYPE...]
       REG...
     </feature>

Each feature's name should be unique within the description.  The name
of a feature does not matter unless GDB has some special knowledge of
the contents of that feature; if it does, the feature should have its
standard name.  *Note Standard Target Features::.

G.2.6 Types
-----------

Any register's value is a collection of bits which GDB must interpret.
The default interpretation is a two's complement integer, but other
types can be requested by name in the register description.  Some
predefined types are provided by GDB (*note Predefined Target Types::),
and the description can define additional composite types.

   Each type element must have an `id' attribute, which gives a unique
(within the containing `<feature>') name to the type.  Types must be
defined before they are used.

   Some targets offer vector registers, which can be treated as arrays
of scalar elements.  These types are written as `<vector>' elements,
specifying the array element type, TYPE, and the number of elements,
COUNT:

     <vector id="ID" type="TYPE" count="COUNT"/>

   If a register's value is usefully viewed in multiple ways, define it
with a union type containing the useful representations.  The `<union>'
element contains one or more `<field>' elements, each of which has a
NAME and a TYPE:

     <union id="ID">
       <field name="NAME" type="TYPE"/>
       ...
     </union>

   If a register's value is composed from several separate values,
define it with a structure type.  There are two forms of the `<struct>'
element; a `<struct>' element must either contain only bitfields or
contain no bitfields.  If the structure contains only bitfields, its
total size in bytes must be specified, each bitfield must have an
explicit start and end, and bitfields are automatically assigned an
integer type.  The field's START should be less than or equal to its
END, and zero represents the least significant bit.

     <struct id="ID" size="SIZE">
       <field name="NAME" start="START" end="END"/>
       ...
     </struct>

   If the structure contains no bitfields, then each field has an
explicit type, and no implicit padding is added.

     <struct id="ID">
       <field name="NAME" type="TYPE"/>
       ...
     </struct>

   If a register's value is a series of single-bit flags, define it with
a flags type.  The `<flags>' element has an explicit SIZE and contains
one or more `<field>' elements.  Each field has a NAME, a START, and an
END.  Only single-bit flags are supported.

     <flags id="ID" size="SIZE">
       <field name="NAME" start="START" end="END"/>
       ...
     </flags>

G.2.7 Registers
---------------

Each register is represented as an element with this form:

     <reg name="NAME"
          bitsize="SIZE"
          [regnum="NUM"]
          [save-restore="SAVE-RESTORE"]
          [type="TYPE"]
          [group="GROUP"]/>

The components are as follows:

NAME
     The register's name; it must be unique within the target
     description.

BITSIZE
     The register's size, in bits.

REGNUM
     The register's number.  If omitted, a register's number is one
     greater than that of the previous register (either in the current
     feature or in a preceding feature); the first register in the
     target description defaults to zero.  This register number is used
     to read or write the register; e.g. it is used in the remote `p'
     and `P' packets, and registers appear in the `g' and `G' packets
     in order of increasing register number.

SAVE-RESTORE
     Whether the register should be preserved across inferior function
     calls; this must be either `yes' or `no'.  The default is `yes',
     which is appropriate for most registers except for some system
     control registers; this is not related to the target's ABI.

TYPE
     The type of the register.  TYPE may be a predefined type, a type
     defined in the current feature, or one of the special types `int'
     and `float'.  `int' is an integer type of the correct size for
     BITSIZE, and `float' is a floating point type (in the
     architecture's normal floating point format) of the correct size
     for BITSIZE.  The default is `int'.

GROUP
     The register group to which this register belongs.  GROUP must be
     either `general', `float', or `vector'.  If no GROUP is specified,
     GDB will not display the register in `info registers'.



File: gdb.info,  Node: Predefined Target Types,  Next: Standard Target Features,  Prev: Target Description Format,  Up: Target Descriptions

G.3 Predefined Target Types
===========================

Type definitions in the self-description can build up composite types
from basic building blocks, but can not define fundamental types.
Instead, standard identifiers are provided by GDB for the fundamental
types.  The currently supported types are:

`int8'
`int16'
`int32'
`int64'
`int128'
     Signed integer types holding the specified number of bits.

`uint8'
`uint16'
`uint32'
`uint64'
`uint128'
     Unsigned integer types holding the specified number of bits.

`code_ptr'
`data_ptr'
     Pointers to unspecified code and data.  The program counter and
     any dedicated return address register may be marked as code
     pointers; printing a code pointer converts it into a symbolic
     address.  The stack pointer and any dedicated address registers
     may be marked as data pointers.

`ieee_single'
     Single precision IEEE floating point.

`ieee_double'
     Double precision IEEE floating point.

`arm_fpa_ext'
     The 12-byte extended precision format used by ARM FPA registers.

`i387_ext'
     The 10-byte extended precision format used by x87 registers.

`i386_eflags'
     32bit EFLAGS register used by x86.

`i386_mxcsr'
     32bit MXCSR register used by x86.



File: gdb.info,  Node: Standard Target Features,  Prev: Predefined Target Types,  Up: Target Descriptions

G.4 Standard Target Features
============================

A target description must contain either no registers or all the
target's registers.  If the description contains no registers, then GDB
will assume a default register layout, selected based on the
architecture.  If the description contains any registers, the default
layout will not be used; the standard registers must be described in
the target description, in such a way that GDB can recognize them.

   This is accomplished by giving specific names to feature elements
which contain standard registers.  GDB will look for features with
those names and verify that they contain the expected registers; if any
known feature is missing required registers, or if any required feature
is missing, GDB will reject the target description.  You can add
additional registers to any of the standard features -- GDB will
display them just as if they were added to an unrecognized feature.

   This section lists the known features and their expected contents.
Sample XML documents for these features are included in the GDB source
tree, in the directory `gdb/features'.

   Names recognized by GDB should include the name of the company or
organization which selected the name, and the overall architecture to
which the feature applies; so e.g. the feature containing ARM core
registers is named `org.gnu.gdb.arm.core'.

   The names of registers are not case sensitive for the purpose of
recognizing standard features, but GDB will only display registers
using the capitalization used in the description.

* Menu:

* ARM Features::
* i386 Features::
* MIPS Features::
* M68K Features::
* PowerPC Features::
* TIC6x Features::


File: gdb.info,  Node: ARM Features,  Next: i386 Features,  Up: Standard Target Features

G.4.1 ARM Features
------------------

The `org.gnu.gdb.arm.core' feature is required for non-M-profile ARM
targets.  It should contain registers `r0' through `r13', `sp', `lr',
`pc', and `cpsr'.

   For M-profile targets (e.g. Cortex-M3), the `org.gnu.gdb.arm.core'
feature is replaced by `org.gnu.gdb.arm.m-profile'.  It should contain
registers `r0' through `r13', `sp', `lr', `pc', and `xpsr'.

   The `org.gnu.gdb.arm.fpa' feature is optional.  If present, it
should contain registers `f0' through `f7' and `fps'.

   The `org.gnu.gdb.xscale.iwmmxt' feature is optional.  If present, it
should contain at least registers `wR0' through `wR15' and `wCGR0'
through `wCGR3'.  The `wCID', `wCon', `wCSSF', and `wCASF' registers
are optional.

   The `org.gnu.gdb.arm.vfp' feature is optional.  If present, it
should contain at least registers `d0' through `d15'.  If they are
present, `d16' through `d31' should also be included.  GDB will
synthesize the single-precision registers from halves of the
double-precision registers.

   The `org.gnu.gdb.arm.neon' feature is optional.  It does not need to
contain registers; it instructs GDB to display the VFP double-precision
registers as vectors and to synthesize the quad-precision registers
from pairs of double-precision registers.  If this feature is present,
`org.gnu.gdb.arm.vfp' must also be present and include 32
double-precision registers.


File: gdb.info,  Node: i386 Features,  Next: MIPS Features,  Prev: ARM Features,  Up: Standard Target Features

G.4.2 i386 Features
-------------------

The `org.gnu.gdb.i386.core' feature is required for i386/amd64 targets.
It should describe the following registers:

   - `eax' through `edi' plus `eip' for i386

   - `rax' through `r15' plus `rip' for amd64

   - `eflags', `cs', `ss', `ds', `es', `fs', `gs'

   - `st0' through `st7'

   - `fctrl', `fstat', `ftag', `fiseg', `fioff', `foseg', `fooff' and
     `fop'

   The register sets may be different, depending on the target.

   The `org.gnu.gdb.i386.sse' feature is optional.  It should describe
registers:

   - `xmm0' through `xmm7' for i386

   - `xmm0' through `xmm15' for amd64

   - `mxcsr'

   The `org.gnu.gdb.i386.avx' feature is optional and requires the
`org.gnu.gdb.i386.sse' feature.  It should describe the upper 128 bits
of YMM registers:

   - `ymm0h' through `ymm7h' for i386

   - `ymm0h' through `ymm15h' for amd64

   The `org.gnu.gdb.i386.linux' feature is optional.  It should
describe a single register, `orig_eax'.


File: gdb.info,  Node: MIPS Features,  Next: M68K Features,  Prev: i386 Features,  Up: Standard Target Features

G.4.3 MIPS Features
-------------------

The `org.gnu.gdb.mips.cpu' feature is required for MIPS targets.  It
should contain registers `r0' through `r31', `lo', `hi', and `pc'.
They may be 32-bit or 64-bit depending on the target.

   The `org.gnu.gdb.mips.cp0' feature is also required.  It should
contain at least the `status', `badvaddr', and `cause' registers.  They
may be 32-bit or 64-bit depending on the target.

   The `org.gnu.gdb.mips.fpu' feature is currently required, though it
may be optional in a future version of GDB.  It should contain
registers `f0' through `f31', `fcsr', and `fir'.  They may be 32-bit or
64-bit depending on the target.

   The `org.gnu.gdb.mips.linux' feature is optional.  It should contain
a single register, `restart', which is used by the Linux kernel to
control restartable syscalls.


File: gdb.info,  Node: M68K Features,  Next: PowerPC Features,  Prev: MIPS Features,  Up: Standard Target Features

G.4.4 M68K Features
-------------------

``org.gnu.gdb.m68k.core''
``org.gnu.gdb.coldfire.core''
``org.gnu.gdb.fido.core''
     One of those features must be always present.  The feature that is
     present determines which flavor of m68k is used.  The feature that
     is present should contain registers `d0' through `d7', `a0'
     through `a5', `fp', `sp', `ps' and `pc'.

``org.gnu.gdb.coldfire.fp''
     This feature is optional.  If present, it should contain registers
     `fp0' through `fp7', `fpcontrol', `fpstatus' and `fpiaddr'.


File: gdb.info,  Node: PowerPC Features,  Next: TIC6x Features,  Prev: M68K Features,  Up: Standard Target Features

G.4.5 PowerPC Features
----------------------

The `org.gnu.gdb.power.core' feature is required for PowerPC targets.
It should contain registers `r0' through `r31', `pc', `msr', `cr',
`lr', `ctr', and `xer'.  They may be 32-bit or 64-bit depending on the
target.

   The `org.gnu.gdb.power.fpu' feature is optional.  It should contain
registers `f0' through `f31' and `fpscr'.

   The `org.gnu.gdb.power.altivec' feature is optional.  It should
contain registers `vr0' through `vr31', `vscr', and `vrsave'.

   The `org.gnu.gdb.power.vsx' feature is optional.  It should contain
registers `vs0h' through `vs31h'.  GDB will combine these registers
with the floating point registers (`f0' through `f31') and the altivec
registers (`vr0' through `vr31') to present the 128-bit wide registers
`vs0' through `vs63', the set of vector registers for POWER7.

   The `org.gnu.gdb.power.spe' feature is optional.  It should contain
registers `ev0h' through `ev31h', `acc', and `spefscr'.  SPE targets
should provide 32-bit registers in `org.gnu.gdb.power.core' and provide
the upper halves in `ev0h' through `ev31h'.  GDB will combine these to
present registers `ev0' through `ev31' to the user.


File: gdb.info,  Node: TIC6x Features,  Prev: PowerPC Features,  Up: Standard Target Features

G.4.6 TMS320C6x Features
------------------------

The `org.gnu.gdb.tic6x.core' feature is required for TMS320C6x targets.
It should contain registers `A0' through `A15', registers `B0' through
`B15', `CSR' and `PC'.

   The `org.gnu.gdb.tic6x.gp' feature is optional.  It should contain
registers `A16' through `A31' and `B16' through `B31'.

   The `org.gnu.gdb.tic6x.c6xp' feature is optional.  It should contain
registers `TSR', `ILC' and `RILC'.


File: gdb.info,  Node: Operating System Information,  Next: Trace File Format,  Prev: Target Descriptions,  Up: Top

Appendix H Operating System Information
***************************************

* Menu:

* Process list::

   Users of GDB often wish to obtain information about the state of the
operating system running on the target--for example the list of
processes, or the list of open files.  This section describes the
mechanism that makes it possible.  This mechanism is similar to the
target features mechanism (*note Target Descriptions::), but focuses on
a different aspect of target.

   Operating system information is retrived from the target via the
remote protocol, using `qXfer' requests (*note qXfer osdata read::).
The object name in the request should be `osdata', and the ANNEX
identifies the data to be fetched.


File: gdb.info,  Node: Process list,  Up: Operating System Information

H.1 Process list
================

When requesting the process list, the ANNEX field in the `qXfer'
request should be `processes'.  The returned data is an XML document.
The formal syntax of this document is defined in
`gdb/features/osdata.dtd'.

   An example document is:

     <?xml version="1.0"?>
     <!DOCTYPE target SYSTEM "osdata.dtd">
     <osdata type="processes">
       <item>
         <column name="pid">1</column>
         <column name="user">root</column>
         <column name="command">/sbin/init</column>
         <column name="cores">1,2,3</column>
       </item>
     </osdata>

   Each item should include a column whose name is `pid'.  The value of
that column should identify the process on the target.  The `user' and
`command' columns are optional, and will be displayed by GDB.  The
`cores' column, if present, should contain a comma-separated list of
cores that this process is running on.  Target may provide additional
columns, which GDB currently ignores.


File: gdb.info,  Node: Trace File Format,  Next: Index Section Format,  Prev: Operating System Information,  Up: Top

Appendix I Trace File Format
****************************

The trace file comes in three parts: a header, a textual description
section, and a trace frame section with binary data.

   The header has the form `\x7fTRACE0\n'.  The first byte is `0x7f' so
as to indicate that the file contains binary data, while the `0' is a
version number that may have different values in the future.

   The description section consists of multiple lines of ASCII text
separated by newline characters (`0xa').  The lines may include a
variety of optional descriptive or context-setting information, such as
tracepoint definitions or register set size.  GDB will ignore any line
that it does not recognize.  An empty line marks the end of this
section.

   The trace frame section consists of a number of consecutive frames.
Each frame begins with a two-byte tracepoint number, followed by a
four-byte size giving the amount of data in the frame.  The data in the
frame consists of a number of blocks, each introduced by a character
indicating its type (at least register, memory, and trace state
variable).  The data in this section is raw binary, not a hexadecimal
or other encoding; its endianness matches the target's endianness.

`R BYTES'
     Register block.  The number and ordering of bytes matches that of a
     `g' packet in the remote protocol.  Note that these are the actual
     bytes, in target order and GDB register order, not a hexadecimal
     encoding.

`M ADDRESS LENGTH BYTES...'
     Memory block.  This is a contiguous block of memory, at the 8-byte
     address ADDRESS, with a 2-byte length LENGTH, followed by LENGTH
     bytes.

`V NUMBER VALUE'
     Trace state variable block.  This records the 8-byte signed value
     VALUE of trace state variable numbered NUMBER.


   Future enhancements of the trace file format may include additional
types of blocks.


File: gdb.info,  Node: Index Section Format,  Next: Copying,  Prev: Trace File Format,  Up: Top

Appendix J `.gdb_index' section format
**************************************

This section documents the index section that is created by `save
gdb-index' (*note Index Files::).  The index section is DWARF-specific;
some knowledge of DWARF is assumed in this description.

   The mapped index file format is designed to be directly `mmap'able
on any architecture.  In most cases, a datum is represented using a
little-endian 32-bit integer value, called an `offset_type'.  Big
endian machines must byte-swap the values before using them.
Exceptions to this rule are noted.  The data is laid out such that
alignment is always respected.

   A mapped index consists of several areas, laid out in order.

  1. The file header.  This is a sequence of values, of `offset_type'
     unless otherwise noted:

       1. The version number, currently 5.  Versions 1, 2 and 3 are
          obsolete.  Version 4 differs by its hashing function.

       2. The offset, from the start of the file, of the CU list.

       3. The offset, from the start of the file, of the types CU list.
          Note that this area can be empty, in which case this offset
          will be equal to the next offset.

       4. The offset, from the start of the file, of the address area.

       5. The offset, from the start of the file, of the symbol table.

       6. The offset, from the start of the file, of the constant pool.

  2. The CU list.  This is a sequence of pairs of 64-bit little-endian
     values, sorted by the CU offset.  The first element in each pair is
     the offset of a CU in the `.debug_info' section.  The second
     element in each pair is the length of that CU.  References to a CU
     elsewhere in the map are done using a CU index, which is just the
     0-based index into this table.  Note that if there are type CUs,
     then conceptually CUs and type CUs form a single list for the
     purposes of CU indices.

  3. The types CU list.  This is a sequence of triplets of 64-bit
     little-endian values.  In a triplet, the first value is the CU
     offset, the second value is the type offset in the CU, and the
     third value is the type signature.  The types CU list is not
     sorted.

  4. The address area.  The address area consists of a sequence of
     address entries.  Each address entry has three elements:

       1. The low address.  This is a 64-bit little-endian value.

       2. The high address.  This is a 64-bit little-endian value.  Like
          `DW_AT_high_pc', the value is one byte beyond the end.

       3. The CU index.  This is an `offset_type' value.

  5. The symbol table.  This is an open-addressed hash table.  The size
     of the hash table is always a power of 2.

     Each slot in the hash table consists of a pair of `offset_type'
     values.  The first value is the offset of the symbol's name in the
     constant pool.  The second value is the offset of the CU vector in
     the constant pool.

     If both values are 0, then this slot in the hash table is empty.
     This is ok because while 0 is a valid constant pool index, it
     cannot be a valid index for both a string and a CU vector.

     The hash value for a table entry is computed by applying an
     iterative hash function to the symbol's name.  Starting with an
     initial value of `r = 0', each (unsigned) character `c' in the
     string is incorporated into the hash using the formula depending
     on the index version:

    Version 4
          The formula is `r = r * 67 + c - 113'.

    Version 5
          The formula is `r = r * 67 + tolower (c) - 113'.

     The terminating `\0' is not incorporated into the hash.

     The step size used in the hash table is computed via `((hash * 17)
     & (size - 1)) | 1', where `hash' is the hash value, and `size' is
     the size of the hash table.  The step size is used to find the
     next candidate slot when handling a hash collision.

     The names of C++ symbols in the hash table are canonicalized.  We
     don't currently have a simple description of the canonicalization
     algorithm; if you intend to create new index sections, you must
     read the code.

  6. The constant pool.  This is simply a bunch of bytes.  It is
     organized so that alignment is correct: CU vectors are stored
     first, followed by strings.

     A CU vector in the constant pool is a sequence of `offset_type'
     values.  The first value is the number of CU indices in the vector.
     Each subsequent value is the index of a CU in the CU list.  This
     element in the hash table is used to indicate which CUs define the
     symbol.

     A string in the constant pool is zero-terminated.


File: gdb.info,  Node: Copying,  Next: GNU Free Documentation License,  Prev: Index Section Format,  Up: Top

Appendix K GNU GENERAL PUBLIC LICENSE
*************************************

                        Version 3, 29 June 2007

     Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/'

     Everyone is permitted to copy and distribute verbatim copies of this
     license document, but changing it is not allowed.

Preamble
========

The GNU General Public License is a free, copyleft license for software
and other kinds of works.

   The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains
free software for all its users.  We, the Free Software Foundation, use
the GNU General Public License for most of our software; it applies
also to any other work released this way by its authors.  You can apply
it to your programs, too.

   When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

   To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you
have certain responsibilities if you distribute copies of the software,
or if you modify it: responsibilities to respect the freedom of others.

   For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

   Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

   For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

   Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the
manufacturer can do so.  This is fundamentally incompatible with the
aim of protecting users' freedom to change the software.  The
systematic pattern of such abuse occurs in the area of products for
individuals to use, which is precisely where it is most unacceptable.
Therefore, we have designed this version of the GPL to prohibit the
practice for those products.  If such problems arise substantially in
other domains, we stand ready to extend this provision to those domains
in future versions of the GPL, as needed to protect the freedom of
users.

   Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

   The precise terms and conditions for copying, distribution and
modification follow.

TERMS AND CONDITIONS
====================

  0. Definitions.

     "This License" refers to version 3 of the GNU General Public
     License.

     "Copyright" also means copyright-like laws that apply to other
     kinds of works, such as semiconductor masks.

     "The Program" refers to any copyrightable work licensed under this
     License.  Each licensee is addressed as "you".  "Licensees" and
     "recipients" may be individuals or organizations.

     To "modify" a work means to copy from or adapt all or part of the
     work in a fashion requiring copyright permission, other than the
     making of an exact copy.  The resulting work is called a "modified
     version" of the earlier work or a work "based on" the earlier work.

     A "covered work" means either the unmodified Program or a work
     based on the Program.

     To "propagate" a work means to do anything with it that, without
     permission, would make you directly or secondarily liable for
     infringement under applicable copyright law, except executing it
     on a computer or modifying a private copy.  Propagation includes
     copying, distribution (with or without modification), making
     available to the public, and in some countries other activities as
     well.

     To "convey" a work means any kind of propagation that enables other
     parties to make or receive copies.  Mere interaction with a user
     through a computer network, with no transfer of a copy, is not
     conveying.

     An interactive user interface displays "Appropriate Legal Notices"
     to the extent that it includes a convenient and prominently visible
     feature that (1) displays an appropriate copyright notice, and (2)
     tells the user that there is no warranty for the work (except to
     the extent that warranties are provided), that licensees may
     convey the work under this License, and how to view a copy of this
     License.  If the interface presents a list of user commands or
     options, such as a menu, a prominent item in the list meets this
     criterion.

  1. Source Code.

     The "source code" for a work means the preferred form of the work
     for making modifications to it.  "Object code" means any
     non-source form of a work.

     A "Standard Interface" means an interface that either is an
     official standard defined by a recognized standards body, or, in
     the case of interfaces specified for a particular programming
     language, one that is widely used among developers working in that
     language.

     The "System Libraries" of an executable work include anything,
     other than the work as a whole, that (a) is included in the normal
     form of packaging a Major Component, but which is not part of that
     Major Component, and (b) serves only to enable use of the work
     with that Major Component, or to implement a Standard Interface
     for which an implementation is available to the public in source
     code form.  A "Major Component", in this context, means a major
     essential component (kernel, window system, and so on) of the
     specific operating system (if any) on which the executable work
     runs, or a compiler used to produce the work, or an object code
     interpreter used to run it.

     The "Corresponding Source" for a work in object code form means all
     the source code needed to generate, install, and (for an executable
     work) run the object code and to modify the work, including
     scripts to control those activities.  However, it does not include
     the work's System Libraries, or general-purpose tools or generally
     available free programs which are used unmodified in performing
     those activities but which are not part of the work.  For example,
     Corresponding Source includes interface definition files
     associated with source files for the work, and the source code for
     shared libraries and dynamically linked subprograms that the work
     is specifically designed to require, such as by intimate data
     communication or control flow between those subprograms and other
     parts of the work.

     The Corresponding Source need not include anything that users can
     regenerate automatically from other parts of the Corresponding
     Source.

     The Corresponding Source for a work in source code form is that
     same work.

  2. Basic Permissions.

     All rights granted under this License are granted for the term of
     copyright on the Program, and are irrevocable provided the stated
     conditions are met.  This License explicitly affirms your unlimited
     permission to run the unmodified Program.  The output from running
     a covered work is covered by this License only if the output,
     given its content, constitutes a covered work.  This License
     acknowledges your rights of fair use or other equivalent, as
     provided by copyright law.

     You may make, run and propagate covered works that you do not
     convey, without conditions so long as your license otherwise
     remains in force.  You may convey covered works to others for the
     sole purpose of having them make modifications exclusively for
     you, or provide you with facilities for running those works,
     provided that you comply with the terms of this License in
     conveying all material for which you do not control copyright.
     Those thus making or running the covered works for you must do so
     exclusively on your behalf, under your direction and control, on
     terms that prohibit them from making any copies of your
     copyrighted material outside their relationship with you.

     Conveying under any other circumstances is permitted solely under
     the conditions stated below.  Sublicensing is not allowed; section
     10 makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

     No covered work shall be deemed part of an effective technological
     measure under any applicable law fulfilling obligations under
     article 11 of the WIPO copyright treaty adopted on 20 December
     1996, or similar laws prohibiting or restricting circumvention of
     such measures.

     When you convey a covered work, you waive any legal power to forbid
     circumvention of technological measures to the extent such
     circumvention is effected by exercising rights under this License
     with respect to the covered work, and you disclaim any intention
     to limit operation or modification of the work as a means of
     enforcing, against the work's users, your or third parties' legal
     rights to forbid circumvention of technological measures.

  4. Conveying Verbatim Copies.

     You may convey verbatim copies of the Program's source code as you
     receive it, in any medium, provided that you conspicuously and
     appropriately publish on each copy an appropriate copyright notice;
     keep intact all notices stating that this License and any
     non-permissive terms added in accord with section 7 apply to the
     code; keep intact all notices of the absence of any warranty; and
     give all recipients a copy of this License along with the Program.

     You may charge any price or no price for each copy that you convey,
     and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

     You may convey a work based on the Program, or the modifications to
     produce it from the Program, in the form of source code under the
     terms of section 4, provided that you also meet all of these
     conditions:

       a. The work must carry prominent notices stating that you
          modified it, and giving a relevant date.

       b. The work must carry prominent notices stating that it is
          released under this License and any conditions added under
          section 7.  This requirement modifies the requirement in
          section 4 to "keep intact all notices".

       c. You must license the entire work, as a whole, under this
          License to anyone who comes into possession of a copy.  This
          License will therefore apply, along with any applicable
          section 7 additional terms, to the whole of the work, and all
          its parts, regardless of how they are packaged.  This License
          gives no permission to license the work in any other way, but
          it does not invalidate such permission if you have separately
          received it.

       d. If the work has interactive user interfaces, each must display
          Appropriate Legal Notices; however, if the Program has
          interactive interfaces that do not display Appropriate Legal
          Notices, your work need not make them do so.

     A compilation of a covered work with other separate and independent
     works, which are not by their nature extensions of the covered
     work, and which are not combined with it such as to form a larger
     program, in or on a volume of a storage or distribution medium, is
     called an "aggregate" if the compilation and its resulting
     copyright are not used to limit the access or legal rights of the
     compilation's users beyond what the individual works permit.
     Inclusion of a covered work in an aggregate does not cause this
     License to apply to the other parts of the aggregate.

  6. Conveying Non-Source Forms.

     You may convey a covered work in object code form under the terms
     of sections 4 and 5, provided that you also convey the
     machine-readable Corresponding Source under the terms of this
     License, in one of these ways:

       a. Convey the object code in, or embodied in, a physical product
          (including a physical distribution medium), accompanied by the
          Corresponding Source fixed on a durable physical medium
          customarily used for software interchange.

       b. Convey the object code in, or embodied in, a physical product
          (including a physical distribution medium), accompanied by a
          written offer, valid for at least three years and valid for
          as long as you offer spare parts or customer support for that
          product model, to give anyone who possesses the object code
          either (1) a copy of the Corresponding Source for all the
          software in the product that is covered by this License, on a
          durable physical medium customarily used for software
          interchange, for a price no more than your reasonable cost of
          physically performing this conveying of source, or (2) access
          to copy the Corresponding Source from a network server at no
          charge.

       c. Convey individual copies of the object code with a copy of
          the written offer to provide the Corresponding Source.  This
          alternative is allowed only occasionally and noncommercially,
          and only if you received the object code with such an offer,
          in accord with subsection 6b.

       d. Convey the object code by offering access from a designated
          place (gratis or for a charge), and offer equivalent access
          to the Corresponding Source in the same way through the same
          place at no further charge.  You need not require recipients
          to copy the Corresponding Source along with the object code.
          If the place to copy the object code is a network server, the
          Corresponding Source may be on a different server (operated
          by you or a third party) that supports equivalent copying
          facilities, provided you maintain clear directions next to
          the object code saying where to find the Corresponding Source.
          Regardless of what server hosts the Corresponding Source, you
          remain obligated to ensure that it is available for as long
          as needed to satisfy these requirements.

       e. Convey the object code using peer-to-peer transmission,
          provided you inform other peers where the object code and
          Corresponding Source of the work are being offered to the
          general public at no charge under subsection 6d.


     A separable portion of the object code, whose source code is
     excluded from the Corresponding Source as a System Library, need
     not be included in conveying the object code work.

     A "User Product" is either (1) a "consumer product", which means
     any tangible personal property which is normally used for personal,
     family, or household purposes, or (2) anything designed or sold for
     incorporation into a dwelling.  In determining whether a product
     is a consumer product, doubtful cases shall be resolved in favor of
     coverage.  For a particular product received by a particular user,
     "normally used" refers to a typical or common use of that class of
     product, regardless of the status of the particular user or of the
     way in which the particular user actually uses, or expects or is
     expected to use, the product.  A product is a consumer product
     regardless of whether the product has substantial commercial,
     industrial or non-consumer uses, unless such uses represent the
     only significant mode of use of the product.

     "Installation Information" for a User Product means any methods,
     procedures, authorization keys, or other information required to
     install and execute modified versions of a covered work in that
     User Product from a modified version of its Corresponding Source.
     The information must suffice to ensure that the continued
     functioning of the modified object code is in no case prevented or
     interfered with solely because modification has been made.

     If you convey an object code work under this section in, or with,
     or specifically for use in, a User Product, and the conveying
     occurs as part of a transaction in which the right of possession
     and use of the User Product is transferred to the recipient in
     perpetuity or for a fixed term (regardless of how the transaction
     is characterized), the Corresponding Source conveyed under this
     section must be accompanied by the Installation Information.  But
     this requirement does not apply if neither you nor any third party
     retains the ability to install modified object code on the User
     Product (for example, the work has been installed in ROM).

     The requirement to provide Installation Information does not
     include a requirement to continue to provide support service,
     warranty, or updates for a work that has been modified or
     installed by the recipient, or for the User Product in which it
     has been modified or installed.  Access to a network may be denied
     when the modification itself materially and adversely affects the
     operation of the network or violates the rules and protocols for
     communication across the network.

     Corresponding Source conveyed, and Installation Information
     provided, in accord with this section must be in a format that is
     publicly documented (and with an implementation available to the
     public in source code form), and must require no special password
     or key for unpacking, reading or copying.

  7. Additional Terms.

     "Additional permissions" are terms that supplement the terms of
     this License by making exceptions from one or more of its
     conditions.  Additional permissions that are applicable to the
     entire Program shall be treated as though they were included in
     this License, to the extent that they are valid under applicable
     law.  If additional permissions apply only to part of the Program,
     that part may be used separately under those permissions, but the
     entire Program remains governed by this License without regard to
     the additional permissions.

     When you convey a copy of a covered work, you may at your option
     remove any additional permissions from that copy, or from any part
     of it.  (Additional permissions may be written to require their own
     removal in certain cases when you modify the work.)  You may place
     additional permissions on material, added by you to a covered work,
     for which you have or can give appropriate copyright permission.

     Notwithstanding any other provision of this License, for material
     you add to a covered work, you may (if authorized by the copyright
     holders of that material) supplement the terms of this License
     with terms:

       a. Disclaiming warranty or limiting liability differently from
          the terms of sections 15 and 16 of this License; or

       b. Requiring preservation of specified reasonable legal notices
          or author attributions in that material or in the Appropriate
          Legal Notices displayed by works containing it; or

       c. Prohibiting misrepresentation of the origin of that material,
          or requiring that modified versions of such material be
          marked in reasonable ways as different from the original
          version; or

       d. Limiting the use for publicity purposes of names of licensors
          or authors of the material; or

       e. Declining to grant rights under trademark law for use of some
          trade names, trademarks, or service marks; or

       f. Requiring indemnification of licensors and authors of that
          material by anyone who conveys the material (or modified
          versions of it) with contractual assumptions of liability to
          the recipient, for any liability that these contractual
          assumptions directly impose on those licensors and authors.

     All other non-permissive additional terms are considered "further
     restrictions" within the meaning of section 10.  If the Program as
     you received it, or any part of it, contains a notice stating that
     it is governed by this License along with a term that is a further
     restriction, you may remove that term.  If a license document
     contains a further restriction but permits relicensing or
     conveying under this License, you may add to a covered work
     material governed by the terms of that license document, provided
     that the further restriction does not survive such relicensing or
     conveying.

     If you add terms to a covered work in accord with this section, you
     must place, in the relevant source files, a statement of the
     additional terms that apply to those files, or a notice indicating
     where to find the applicable terms.

     Additional terms, permissive or non-permissive, may be stated in
     the form of a separately written license, or stated as exceptions;
     the above requirements apply either way.

  8. Termination.

     You may not propagate or modify a covered work except as expressly
     provided under this License.  Any attempt otherwise to propagate or
     modify it is void, and will automatically terminate your rights
     under this License (including any patent licenses granted under
     the third paragraph of section 11).

     However, if you cease all violation of this License, then your
     license from a particular copyright holder is reinstated (a)
     provisionally, unless and until the copyright holder explicitly
     and finally terminates your license, and (b) permanently, if the
     copyright holder fails to notify you of the violation by some
     reasonable means prior to 60 days after the cessation.

     Moreover, your license from a particular copyright holder is
     reinstated permanently if the copyright holder notifies you of the
     violation by some reasonable means, this is the first time you have
     received notice of violation of this License (for any work) from
     that copyright holder, and you cure the violation prior to 30 days
     after your receipt of the notice.

     Termination of your rights under this section does not terminate
     the licenses of parties who have received copies or rights from
     you under this License.  If your rights have been terminated and
     not permanently reinstated, you do not qualify to receive new
     licenses for the same material under section 10.

  9. Acceptance Not Required for Having Copies.

     You are not required to accept this License in order to receive or
     run a copy of the Program.  Ancillary propagation of a covered work
     occurring solely as a consequence of using peer-to-peer
     transmission to receive a copy likewise does not require
     acceptance.  However, nothing other than this License grants you
     permission to propagate or modify any covered work.  These actions
     infringe copyright if you do not accept this License.  Therefore,
     by modifying or propagating a covered work, you indicate your
     acceptance of this License to do so.

 10. Automatic Licensing of Downstream Recipients.

     Each time you convey a covered work, the recipient automatically
     receives a license from the original licensors, to run, modify and
     propagate that work, subject to this License.  You are not
     responsible for enforcing compliance by third parties with this
     License.

     An "entity transaction" is a transaction transferring control of an
     organization, or substantially all assets of one, or subdividing an
     organization, or merging organizations.  If propagation of a
     covered work results from an entity transaction, each party to that
     transaction who receives a copy of the work also receives whatever
     licenses to the work the party's predecessor in interest had or
     could give under the previous paragraph, plus a right to
     possession of the Corresponding Source of the work from the
     predecessor in interest, if the predecessor has it or can get it
     with reasonable efforts.

     You may not impose any further restrictions on the exercise of the
     rights granted or affirmed under this License.  For example, you
     may not impose a license fee, royalty, or other charge for
     exercise of rights granted under this License, and you may not
     initiate litigation (including a cross-claim or counterclaim in a
     lawsuit) alleging that any patent claim is infringed by making,
     using, selling, offering for sale, or importing the Program or any
     portion of it.

 11. Patents.

     A "contributor" is a copyright holder who authorizes use under this
     License of the Program or a work on which the Program is based.
     The work thus licensed is called the contributor's "contributor
     version".

     A contributor's "essential patent claims" are all patent claims
     owned or controlled by the contributor, whether already acquired or
     hereafter acquired, that would be infringed by some manner,
     permitted by this License, of making, using, or selling its
     contributor version, but do not include claims that would be
     infringed only as a consequence of further modification of the
     contributor version.  For purposes of this definition, "control"
     includes the right to grant patent sublicenses in a manner
     consistent with the requirements of this License.

     Each contributor grants you a non-exclusive, worldwide,
     royalty-free patent license under the contributor's essential
     patent claims, to make, use, sell, offer for sale, import and
     otherwise run, modify and propagate the contents of its
     contributor version.

     In the following three paragraphs, a "patent license" is any
     express agreement or commitment, however denominated, not to
     enforce a patent (such as an express permission to practice a
     patent or covenant not to sue for patent infringement).  To
     "grant" such a patent license to a party means to make such an
     agreement or commitment not to enforce a patent against the party.

     If you convey a covered work, knowingly relying on a patent
     license, and the Corresponding Source of the work is not available
     for anyone to copy, free of charge and under the terms of this
     License, through a publicly available network server or other
     readily accessible means, then you must either (1) cause the
     Corresponding Source to be so available, or (2) arrange to deprive
     yourself of the benefit of the patent license for this particular
     work, or (3) arrange, in a manner consistent with the requirements
     of this License, to extend the patent license to downstream
     recipients.  "Knowingly relying" means you have actual knowledge
     that, but for the patent license, your conveying the covered work
     in a country, or your recipient's use of the covered work in a
     country, would infringe one or more identifiable patents in that
     country that you have reason to believe are valid.

     If, pursuant to or in connection with a single transaction or
     arrangement, you convey, or propagate by procuring conveyance of, a
     covered work, and grant a patent license to some of the parties
     receiving the covered work authorizing them to use, propagate,
     modify or convey a specific copy of the covered work, then the
     patent license you grant is automatically extended to all
     recipients of the covered work and works based on it.

     A patent license is "discriminatory" if it does not include within
     the scope of its coverage, prohibits the exercise of, or is
     conditioned on the non-exercise of one or more of the rights that
     are specifically granted under this License.  You may not convey a
     covered work if you are a party to an arrangement with a third
     party that is in the business of distributing software, under
     which you make payment to the third party based on the extent of
     your activity of conveying the work, and under which the third
     party grants, to any of the parties who would receive the covered
     work from you, a discriminatory patent license (a) in connection
     with copies of the covered work conveyed by you (or copies made
     from those copies), or (b) primarily for and in connection with
     specific products or compilations that contain the covered work,
     unless you entered into that arrangement, or that patent license
     was granted, prior to 28 March 2007.

     Nothing in this License shall be construed as excluding or limiting
     any implied license or other defenses to infringement that may
     otherwise be available to you under applicable patent law.

 12. No Surrender of Others' Freedom.

     If conditions are imposed on you (whether by court order,
     agreement or otherwise) that contradict the conditions of this
     License, they do not excuse you from the conditions of this
     License.  If you cannot convey a covered work so as to satisfy
     simultaneously your obligations under this License and any other
     pertinent obligations, then as a consequence you may not convey it
     at all.  For example, if you agree to terms that obligate you to
     collect a royalty for further conveying from those to whom you
     convey the Program, the only way you could satisfy both those
     terms and this License would be to refrain entirely from conveying
     the Program.

 13. Use with the GNU Affero General Public License.

     Notwithstanding any other provision of this License, you have
     permission to link or combine any covered work with a work licensed
     under version 3 of the GNU Affero General Public License into a
     single combined work, and to convey the resulting work.  The terms
     of this License will continue to apply to the part which is the
     covered work, but the special requirements of the GNU Affero
     General Public License, section 13, concerning interaction through
     a network will apply to the combination as such.

 14. Revised Versions of this License.

     The Free Software Foundation may publish revised and/or new
     versions of the GNU General Public License from time to time.
     Such new versions will be similar in spirit to the present
     version, but may differ in detail to address new problems or
     concerns.

     Each version is given a distinguishing version number.  If the
     Program specifies that a certain numbered version of the GNU
     General Public License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that numbered version or of any later version published by the
     Free Software Foundation.  If the Program does not specify a
     version number of the GNU General Public License, you may choose
     any version ever published by the Free Software Foundation.

     If the Program specifies that a proxy can decide which future
     versions of the GNU General Public License can be used, that
     proxy's public statement of acceptance of a version permanently
     authorizes you to choose that version for the Program.

     Later license versions may give you additional or different
     permissions.  However, no additional obligations are imposed on any
     author or copyright holder as a result of your choosing to follow a
     later version.

 15. Disclaimer of Warranty.

     THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
     APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE
     COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE
     RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
     SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
     NECESSARY SERVICING, REPAIR OR CORRECTION.

 16. Limitation of Liability.

     IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
     WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
     AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
     FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
     CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
     THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
     BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
     PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
     PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
     THE POSSIBILITY OF SUCH DAMAGES.

 17. Interpretation of Sections 15 and 16.

     If the disclaimer of warranty and limitation of liability provided
     above cannot be given local legal effect according to their terms,
     reviewing courts shall apply local law that most closely
     approximates an absolute waiver of all civil liability in
     connection with the Program, unless a warranty or assumption of
     liability accompanies a copy of the Program in return for a fee.


END OF TERMS AND CONDITIONS
===========================

How to Apply These Terms to Your New Programs
=============================================

If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.

   To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

     ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
     Copyright (C) YEAR NAME OF AUTHOR

     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 3 of the License, or (at
     your option) any later version.

     This program is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     General Public License for more details.

     You should have received a copy of the GNU General Public License
     along with this program.  If not, see `http://www.gnu.org/licenses/'.

   Also add information on how to contact you by electronic and paper
mail.

   If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

     PROGRAM Copyright (C) YEAR NAME OF AUTHOR
     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
     This is free software, and you are welcome to redistribute it
     under certain conditions; type `show c' for details.

   The hypothetical commands `show w' and `show c' should show the
appropriate parts of the General Public License.  Of course, your
program's commands might be different; for a GUI interface, you would
use an "about box".

   You should also get your employer (if you work as a programmer) or
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  For more information on this, and how to apply and follow
the GNU GPL, see `http://www.gnu.org/licenses/'.

   The GNU General Public License does not permit incorporating your
program into proprietary programs.  If your program is a subroutine
library, you may consider it more useful to permit linking proprietary
applications with the library.  If this is what you want to do, use the
GNU Lesser General Public License instead of this License.  But first,
please read `http://www.gnu.org/philosophy/why-not-lgpl.html'.


File: gdb.info,  Node: GNU Free Documentation License,  Next: Concept Index,  Prev: Copying,  Up: Top

Appendix L GNU Free Documentation License
*****************************************

                     Version 1.3, 3 November 2008

     Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
     `http://fsf.org/'

     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.

  0. PREAMBLE

     The purpose of this License is to make a manual, textbook, or other
     functional and useful document "free" in the sense of freedom: to
     assure everyone the effective freedom to copy and redistribute it,
     with or without modifying it, either commercially or
     noncommercially.  Secondarily, this License preserves for the
     author and publisher a way to get credit for their work, while not
     being considered responsible for modifications made by others.

     This License is a kind of "copyleft", which means that derivative
     works of the document must themselves be free in the same sense.
     It complements the GNU General Public License, which is a copyleft
     license designed for free software.

     We have designed this License in order to use it for manuals for
     free software, because free software needs free documentation: a
     free program should come with manuals providing the same freedoms
     that the software does.  But this License is not limited to
     software manuals; it can be used for any textual work, regardless
     of subject matter or whether it is published as a printed book.
     We recommend this License principally for works whose purpose is
     instruction or reference.

  1. APPLICABILITY AND DEFINITIONS

     This License applies to any manual or other work, in any medium,
     that contains a notice placed by the copyright holder saying it
     can be distributed under the terms of this License.  Such a notice
     grants a world-wide, royalty-free license, unlimited in duration,
     to use that work under the conditions stated herein.  The
     "Document", below, refers to any such manual or work.  Any member
     of the public is a licensee, and is addressed as "you".  You
     accept the license if you copy, modify or distribute the work in a
     way requiring permission under copyright law.

     A "Modified Version" of the Document means any work containing the
     Document or a portion of it, either copied verbatim, or with
     modifications and/or translated into another language.

     A "Secondary Section" is a named appendix or a front-matter section
     of the Document that deals exclusively with the relationship of the
     publishers or authors of the Document to the Document's overall
     subject (or to related matters) and contains nothing that could
     fall directly within that overall subject.  (Thus, if the Document
     is in part a textbook of mathematics, a Secondary Section may not
     explain any mathematics.)  The relationship could be a matter of
     historical connection with the subject or with related matters, or
     of legal, commercial, philosophical, ethical or political position
     regarding them.

     The "Invariant Sections" are certain Secondary Sections whose
     titles are designated, as being those of Invariant Sections, in
     the notice that says that the Document is released under this
     License.  If a section does not fit the above definition of
     Secondary then it is not allowed to be designated as Invariant.
     The Document may contain zero Invariant Sections.  If the Document
     does not identify any Invariant Sections then there are none.

     The "Cover Texts" are certain short passages of text that are
     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
     that says that the Document is released under this License.  A
     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
     be at most 25 words.

     A "Transparent" copy of the Document means a machine-readable copy,
     represented in a format whose specification is available to the
     general public, that is suitable for revising the document
     straightforwardly with generic text editors or (for images
     composed of pixels) generic paint programs or (for drawings) some
     widely available drawing editor, and that is suitable for input to
     text formatters or for automatic translation to a variety of
     formats suitable for input to text formatters.  A copy made in an
     otherwise Transparent file format whose markup, or absence of
     markup, has been arranged to thwart or discourage subsequent
     modification by readers is not Transparent.  An image format is
     not Transparent if used for any substantial amount of text.  A
     copy that is not "Transparent" is called "Opaque".

     Examples of suitable formats for Transparent copies include plain
     ASCII without markup, Texinfo input format, LaTeX input format,
     SGML or XML using a publicly available DTD, and
     standard-conforming simple HTML, PostScript or PDF designed for
     human modification.  Examples of transparent image formats include
     PNG, XCF and JPG.  Opaque formats include proprietary formats that
     can be read and edited only by proprietary word processors, SGML or
     XML for which the DTD and/or processing tools are not generally
     available, and the machine-generated HTML, PostScript or PDF
     produced by some word processors for output purposes only.

     The "Title Page" means, for a printed book, the title page itself,
     plus such following pages as are needed to hold, legibly, the
     material this License requires to appear in the title page.  For
     works in formats which do not have any title page as such, "Title
     Page" means the text near the most prominent appearance of the
     work's title, preceding the beginning of the body of the text.

     The "publisher" means any person or entity that distributes copies
     of the Document to the public.

     A section "Entitled XYZ" means a named subunit of the Document
     whose title either is precisely XYZ or contains XYZ in parentheses
     following text that translates XYZ in another language.  (Here XYZ
     stands for a specific section name mentioned below, such as
     "Acknowledgements", "Dedications", "Endorsements", or "History".)
     To "Preserve the Title" of such a section when you modify the
     Document means that it remains a section "Entitled XYZ" according
     to this definition.

     The Document may include Warranty Disclaimers next to the notice
     which states that this License applies to the Document.  These
     Warranty Disclaimers are considered to be included by reference in
     this License, but only as regards disclaiming warranties: any other
     implication that these Warranty Disclaimers may have is void and
     has no effect on the meaning of this License.

  2. VERBATIM COPYING

     You may copy and distribute the Document in any medium, either
     commercially or noncommercially, provided that this License, the
     copyright notices, and the license notice saying this License
     applies to the Document are reproduced in all copies, and that you
     add no other conditions whatsoever to those of this License.  You
     may not use technical measures to obstruct or control the reading
     or further copying of the copies you make or distribute.  However,
     you may accept compensation in exchange for copies.  If you
     distribute a large enough number of copies you must also follow
     the conditions in section 3.

     You may also lend copies, under the same conditions stated above,
     and you may publicly display copies.

  3. COPYING IN QUANTITY

     If you publish printed copies (or copies in media that commonly
     have printed covers) of the Document, numbering more than 100, and
     the Document's license notice requires Cover Texts, you must
     enclose the copies in covers that carry, clearly and legibly, all
     these Cover Texts: Front-Cover Texts on the front cover, and
     Back-Cover Texts on the back cover.  Both covers must also clearly
     and legibly identify you as the publisher of these copies.  The
     front cover must present the full title with all words of the
     title equally prominent and visible.  You may add other material
     on the covers in addition.  Copying with changes limited to the
     covers, as long as they preserve the title of the Document and
     satisfy these conditions, can be treated as verbatim copying in
     other respects.

     If the required texts for either cover are too voluminous to fit
     legibly, you should put the first ones listed (as many as fit
     reasonably) on the actual cover, and continue the rest onto
     adjacent pages.

     If you publish or distribute Opaque copies of the Document
     numbering more than 100, you must either include a
     machine-readable Transparent copy along with each Opaque copy, or
     state in or with each Opaque copy a computer-network location from
     which the general network-using public has access to download
     using public-standard network protocols a complete Transparent
     copy of the Document, free of added material.  If you use the
     latter option, you must take reasonably prudent steps, when you
     begin distribution of Opaque copies in quantity, to ensure that
     this Transparent copy will remain thus accessible at the stated
     location until at least one year after the last time you
     distribute an Opaque copy (directly or through your agents or
     retailers) of that edition to the public.

     It is requested, but not required, that you contact the authors of
     the Document well before redistributing any large number of
     copies, to give them a chance to provide you with an updated
     version of the Document.

  4. MODIFICATIONS

     You may copy and distribute a Modified Version of the Document
     under the conditions of sections 2 and 3 above, provided that you
     release the Modified Version under precisely this License, with
     the Modified Version filling the role of the Document, thus
     licensing distribution and modification of the Modified Version to
     whoever possesses a copy of it.  In addition, you must do these
     things in the Modified Version:

       A. Use in the Title Page (and on the covers, if any) a title
          distinct from that of the Document, and from those of
          previous versions (which should, if there were any, be listed
          in the History section of the Document).  You may use the
          same title as a previous version if the original publisher of
          that version gives permission.

       B. List on the Title Page, as authors, one or more persons or
          entities responsible for authorship of the modifications in
          the Modified Version, together with at least five of the
          principal authors of the Document (all of its principal
          authors, if it has fewer than five), unless they release you
          from this requirement.

       C. State on the Title page the name of the publisher of the
          Modified Version, as the publisher.

       D. Preserve all the copyright notices of the Document.

       E. Add an appropriate copyright notice for your modifications
          adjacent to the other copyright notices.

       F. Include, immediately after the copyright notices, a license
          notice giving the public permission to use the Modified
          Version under the terms of this License, in the form shown in
          the Addendum below.

       G. Preserve in that license notice the full lists of Invariant
          Sections and required Cover Texts given in the Document's
          license notice.

       H. Include an unaltered copy of this License.

       I. Preserve the section Entitled "History", Preserve its Title,
          and add to it an item stating at least the title, year, new
          authors, and publisher of the Modified Version as given on
          the Title Page.  If there is no section Entitled "History" in
          the Document, create one stating the title, year, authors,
          and publisher of the Document as given on its Title Page,
          then add an item describing the Modified Version as stated in
          the previous sentence.

       J. Preserve the network location, if any, given in the Document
          for public access to a Transparent copy of the Document, and
          likewise the network locations given in the Document for
          previous versions it was based on.  These may be placed in
          the "History" section.  You may omit a network location for a
          work that was published at least four years before the
          Document itself, or if the original publisher of the version
          it refers to gives permission.

       K. For any section Entitled "Acknowledgements" or "Dedications",
          Preserve the Title of the section, and preserve in the
          section all the substance and tone of each of the contributor
          acknowledgements and/or dedications given therein.

       L. Preserve all the Invariant Sections of the Document,
          unaltered in their text and in their titles.  Section numbers
          or the equivalent are not considered part of the section
          titles.

       M. Delete any section Entitled "Endorsements".  Such a section
          may not be included in the Modified Version.

       N. Do not retitle any existing section to be Entitled
          "Endorsements" or to conflict in title with any Invariant
          Section.

       O. Preserve any Warranty Disclaimers.

     If the Modified Version includes new front-matter sections or
     appendices that qualify as Secondary Sections and contain no
     material copied from the Document, you may at your option
     designate some or all of these sections as invariant.  To do this,
     add their titles to the list of Invariant Sections in the Modified
     Version's license notice.  These titles must be distinct from any
     other section titles.

     You may add a section Entitled "Endorsements", provided it contains
     nothing but endorsements of your Modified Version by various
     parties--for example, statements of peer review or that the text
     has been approved by an organization as the authoritative
     definition of a standard.

     You may add a passage of up to five words as a Front-Cover Text,
     and a passage of up to 25 words as a Back-Cover Text, to the end
     of the list of Cover Texts in the Modified Version.  Only one
     passage of Front-Cover Text and one of Back-Cover Text may be
     added by (or through arrangements made by) any one entity.  If the
     Document already includes a cover text for the same cover,
     previously added by you or by arrangement made by the same entity
     you are acting on behalf of, you may not add another; but you may
     replace the old one, on explicit permission from the previous
     publisher that added the old one.

     The author(s) and publisher(s) of the Document do not by this
     License give permission to use their names for publicity for or to
     assert or imply endorsement of any Modified Version.

  5. COMBINING DOCUMENTS

     You may combine the Document with other documents released under
     this License, under the terms defined in section 4 above for
     modified versions, provided that you include in the combination
     all of the Invariant Sections of all of the original documents,
     unmodified, and list them all as Invariant Sections of your
     combined work in its license notice, and that you preserve all
     their Warranty Disclaimers.

     The combined work need only contain one copy of this License, and
     multiple identical Invariant Sections may be replaced with a single
     copy.  If there are multiple Invariant Sections with the same name
     but different contents, make the title of each such section unique
     by adding at the end of it, in parentheses, the name of the
     original author or publisher of that section if known, or else a
     unique number.  Make the same adjustment to the section titles in
     the list of Invariant Sections in the license notice of the
     combined work.

     In the combination, you must combine any sections Entitled
     "History" in the various original documents, forming one section
     Entitled "History"; likewise combine any sections Entitled
     "Acknowledgements", and any sections Entitled "Dedications".  You
     must delete all sections Entitled "Endorsements."

  6. COLLECTIONS OF DOCUMENTS

     You may make a collection consisting of the Document and other
     documents released under this License, and replace the individual
     copies of this License in the various documents with a single copy
     that is included in the collection, provided that you follow the
     rules of this License for verbatim copying of each of the
     documents in all other respects.

     You may extract a single document from such a collection, and
     distribute it individually under this License, provided you insert
     a copy of this License into the extracted document, and follow
     this License in all other respects regarding verbatim copying of
     that document.

  7. AGGREGATION WITH INDEPENDENT WORKS

     A compilation of the Document or its derivatives with other
     separate and independent documents or works, in or on a volume of
     a storage or distribution medium, is called an "aggregate" if the
     copyright resulting from the compilation is not used to limit the
     legal rights of the compilation's users beyond what the individual
     works permit.  When the Document is included in an aggregate, this
     License does not apply to the other works in the aggregate which
     are not themselves derivative works of the Document.

     If the Cover Text requirement of section 3 is applicable to these
     copies of the Document, then if the Document is less than one half
     of the entire aggregate, the Document's Cover Texts may be placed
     on covers that bracket the Document within the aggregate, or the
     electronic equivalent of covers if the Document is in electronic
     form.  Otherwise they must appear on printed covers that bracket
     the whole aggregate.

  8. TRANSLATION

     Translation is considered a kind of modification, so you may
     distribute translations of the Document under the terms of section
     4.  Replacing Invariant Sections with translations requires special
     permission from their copyright holders, but you may include
     translations of some or all Invariant Sections in addition to the
     original versions of these Invariant Sections.  You may include a
     translation of this License, and all the license notices in the
     Document, and any Warranty Disclaimers, provided that you also
     include the original English version of this License and the
     original versions of those notices and disclaimers.  In case of a
     disagreement between the translation and the original version of
     this License or a notice or disclaimer, the original version will
     prevail.

     If a section in the Document is Entitled "Acknowledgements",
     "Dedications", or "History", the requirement (section 4) to
     Preserve its Title (section 1) will typically require changing the
     actual title.

  9. TERMINATION

     You may not copy, modify, sublicense, or distribute the Document
     except as expressly provided under this License.  Any attempt
     otherwise to copy, modify, sublicense, or distribute it is void,
     and will automatically terminate your rights under this License.

     However, if you cease all violation of this License, then your
     license from a particular copyright holder is reinstated (a)
     provisionally, unless and until the copyright holder explicitly
     and finally terminates your license, and (b) permanently, if the
     copyright holder fails to notify you of the violation by some
     reasonable means prior to 60 days after the cessation.

     Moreover, your license from a particular copyright holder is
     reinstated permanently if the copyright holder notifies you of the
     violation by some reasonable means, this is the first time you have
     received notice of violation of this License (for any work) from
     that copyright holder, and you cure the violation prior to 30 days
     after your receipt of the notice.

     Termination of your rights under this section does not terminate
     the licenses of parties who have received copies or rights from
     you under this License.  If your rights have been terminated and
     not permanently reinstated, receipt of a copy of some or all of
     the same material does not give you any rights to use it.

 10. FUTURE REVISIONS OF THIS LICENSE

     The Free Software Foundation may publish new, revised versions of
     the GNU Free Documentation License from time to time.  Such new
     versions will be similar in spirit to the present version, but may
     differ in detail to address new problems or concerns.  See
     `http://www.gnu.org/copyleft/'.

     Each version of the License is given a distinguishing version
     number.  If the Document specifies that a particular numbered
     version of this License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that specified version or of any later version that has been
     published (not as a draft) by the Free Software Foundation.  If
     the Document does not specify a version number of this License,
     you may choose any version ever published (not as a draft) by the
     Free Software Foundation.  If the Document specifies that a proxy
     can decide which future versions of this License can be used, that
     proxy's public statement of acceptance of a version permanently
     authorizes you to choose that version for the Document.

 11. RELICENSING

     "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
     World Wide Web server that publishes copyrightable works and also
     provides prominent facilities for anybody to edit those works.  A
     public wiki that anybody can edit is an example of such a server.
     A "Massive Multiauthor Collaboration" (or "MMC") contained in the
     site means any set of copyrightable works thus published on the MMC
     site.

     "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
     license published by Creative Commons Corporation, a not-for-profit
     corporation with a principal place of business in San Francisco,
     California, as well as future copyleft versions of that license
     published by that same organization.

     "Incorporate" means to publish or republish a Document, in whole or
     in part, as part of another Document.

     An MMC is "eligible for relicensing" if it is licensed under this
     License, and if all works that were first published under this
     License somewhere other than this MMC, and subsequently
     incorporated in whole or in part into the MMC, (1) had no cover
     texts or invariant sections, and (2) were thus incorporated prior
     to November 1, 2008.

     The operator of an MMC Site may republish an MMC contained in the
     site under CC-BY-SA on the same site at any time before August 1,
     2009, provided the MMC is eligible for relicensing.


ADDENDUM: How to use this License for your documents
====================================================

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:

       Copyright (C)  YEAR  YOUR NAME.
       Permission is granted to copy, distribute and/or modify this document
       under the terms of the GNU Free Documentation License, Version 1.3
       or any later version published by the Free Software Foundation;
       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
       Texts.  A copy of the license is included in the section entitled ``GNU
       Free Documentation License''.

   If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts." line with this:

         with the Invariant Sections being LIST THEIR TITLES, with
         the Front-Cover Texts being LIST, and with the Back-Cover Texts
         being LIST.

   If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

   If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License, to
permit their use in free software.


File: gdb.info,  Node: Concept Index,  Next: Command and Variable Index,  Prev: GNU Free Documentation License,  Up: Top

Concept Index
*************

 [index ]
* Menu:

* ! packet:                              Packets.             (line  49)
* "No symbol "foo" in current context":  Variables.           (line  74)
* # in Modula-2:                         GDB/M2.              (line  18)
* $:                                     Value History.       (line  13)
* $$:                                    Value History.       (line  13)
* $_ and info breakpoints:               Set Breaks.          (line 128)
* $_ and info line:                      Machine Code.        (line  30)
* $_, $__, and value history:            Memory.              (line 109)
* --annotate:                            Mode Options.        (line 107)
* --args:                                Mode Options.        (line 120)
* --attach, gdbserver option:            Server.              (line  71)
* --batch:                               Mode Options.        (line  23)
* --batch-silent:                        Mode Options.        (line  41)
* --baud:                                Mode Options.        (line 126)
* --cd:                                  Mode Options.        (line  82)
* --command:                             File Options.        (line  51)
* --core:                                File Options.        (line  43)
* --data-directory:                      Mode Options.        (line  86)
* --debug, gdbserver option:             Server.              (line 151)
* --directory:                           File Options.        (line  67)
* --epoch:                               Mode Options.        (line 102)
* --eval-command:                        File Options.        (line  57)
* --exec:                                File Options.        (line  35)
* --fullname:                            Mode Options.        (line  91)
* --interpreter:                         Mode Options.        (line 147)
* --multi, gdbserver option:             Server.              (line 104)
* --nowindows:                           Mode Options.        (line  72)
* --nx:                                  Mode Options.        (line  11)
* --once, gdbserver option:              Server.              (line 136)
* --pid:                                 File Options.        (line  47)
* --quiet:                               Mode Options.        (line  19)
* --readnow:                             File Options.        (line  71)
* --remote-debug, gdbserver option:      Server.              (line 152)
* --return-child-result:                 Mode Options.        (line  53)
* --se:                                  File Options.        (line  39)
* --silent:                              Mode Options.        (line  19)
* --statistics:                          Mode Options.        (line 164)
* --symbols:                             File Options.        (line  31)
* --tty:                                 Mode Options.        (line 135)
* --tui:                                 Mode Options.        (line 138)
* --version:                             Mode Options.        (line 168)
* --windows:                             Mode Options.        (line  78)
* --with-gdb-datadir:                    Data Files.          (line  19)
* --with-relocated-sources:              Source Path.         (line  89)
* --with-sysroot:                        Files.               (line 434)
* --wrapper, gdbserver option:           Server.              (line 157)
* --write:                               Mode Options.        (line 159)
* -b:                                    Mode Options.        (line 126)
* -c:                                    File Options.        (line  43)
* -d:                                    File Options.        (line  67)
* -e:                                    File Options.        (line  35)
* -ex:                                   File Options.        (line  57)
* -f:                                    Mode Options.        (line  91)
* -l:                                    Mode Options.        (line 130)
* -n:                                    Mode Options.        (line  11)
* -nw:                                   Mode Options.        (line  72)
* -p:                                    File Options.        (line  47)
* -q:                                    Mode Options.        (line  19)
* -r:                                    File Options.        (line  71)
* -s:                                    File Options.        (line  31)
* -t:                                    Mode Options.        (line 135)
* -w:                                    Mode Options.        (line  78)
* -x:                                    File Options.        (line  51)
* ., Modula-2 scope operator:            M2 Scope.            (line   6)
* .build-id directory:                   Separate Debug Files.
                                                              (line   6)
* .debug subdirectories:                 Separate Debug Files.
                                                              (line   6)
* .debug_gdb_scripts section:            .debug_gdb_scripts section.
                                                              (line   6)
* .gdb_index section:                    Index Files.         (line   6)
* .gdb_index section format:             Index Section Format.
                                                              (line   6)
* .gdbinit:                              Startup.             (line  60)
* .gnu_debuglink sections:               Separate Debug Files.
                                                              (line  78)
* .note.gnu.build-id sections:           Separate Debug Files.
                                                              (line  96)
* .o files, reading symbols from:        Files.               (line 132)
* /proc:                                 SVR4 Process Information.
                                                              (line   6)
* <architecture>:                        Target Description Format.
                                                              (line  73)
* <compatible>:                          Target Description Format.
                                                              (line  96)
* <feature>:                             Target Description Format.
                                                              (line 120)
* <flags>:                               Target Description Format.
                                                              (line 186)
* <osabi>:                               Target Description Format.
                                                              (line  83)
* <reg>:                                 Target Description Format.
                                                              (line 199)
* <struct>:                              Target Description Format.
                                                              (line 164)
* <union>:                               Target Description Format.
                                                              (line 154)
* <vector>:                              Target Description Format.
                                                              (line 147)
* ? packet:                              Packets.             (line  58)
* _NSPrintForDebugger, and printing Objective-C objects: The Print Command with Objective-C.
                                                              (line  11)
* A packet:                              Packets.             (line  65)
* abbreviation:                          Command Syntax.      (line  13)
* acknowledgment, for GDB remote:        Packet Acknowledgment.
                                                              (line   6)
* active targets:                        Active Targets.      (line   6)
* Ada:                                   Ada.                 (line   6)
* Ada exception catching:                Set Catchpoints.     (line  19)
* Ada mode, general:                     Ada Mode Intro.      (line   6)
* Ada task switching:                    Ada Tasks.           (line 115)
* Ada tasking and core file debugging:   Ada Tasks and Core Files.
                                                              (line   6)
* Ada, deviations from:                  Additions to Ada.    (line   6)
* Ada, omissions from:                   Omissions from Ada.  (line   6)
* Ada, problems:                         Ada Glitches.        (line   6)
* Ada, tasking:                          Ada Tasks.           (line   6)
* add new commands for external monitor: Connecting.          (line 105)
* address of a symbol:                   Symbols.             (line  44)
* address size for remote targets:       Remote Configuration.
                                                              (line  12)
* ADP (Angel Debugger Protocol) logging: ARM.                 (line  89)
* aggregates (Ada):                      Omissions from Ada.  (line  44)
* AIX threads:                           Debugging Output.    (line  28)
* aliases for commands:                  Aliases.             (line   6)
* alignment of remote memory accesses:   Packets.             (line 235)
* all-stop mode:                         All-Stop Mode.       (line   6)
* Alpha stack:                           MIPS.                (line   6)
* ambiguous expressions:                 Ambiguous Expressions.
                                                              (line   6)
* AMD 29K register stack:                A29K.                (line   6)
* annotations:                           Annotations Overview.
                                                              (line   6)
* annotations for errors, warnings and interrupts: Errors.    (line   6)
* annotations for invalidation messages: Invalidation.        (line   6)
* annotations for prompts:               Prompting.           (line   6)
* annotations for running programs:      Annotations for Running.
                                                              (line   6)
* annotations for source display:        Source Annotations.  (line   6)
* append data to a file:                 Dump/Restore Files.  (line   6)
* apply command to several threads:      Threads.             (line 122)
* architecture debugging info:           Debugging Output.    (line  18)
* argument count in user-defined commands: Define.            (line  25)
* arguments (to your program):           Arguments.           (line   6)
* arguments, to gdbserver:               Server.              (line  34)
* arguments, to user-defined commands:   Define.              (line   6)
* ARM 32-bit mode:                       ARM.                 (line  25)
* ARM RDI:                               ARM.                 (line   6)
* array aggregates (Ada):                Omissions from Ada.  (line  44)
* arrays:                                Arrays.              (line   6)
* arrays in expressions:                 Expressions.         (line  14)
* artificial array:                      Arrays.              (line   6)
* assembly instructions:                 Machine Code.        (line  36)
* assignment:                            Assignment.          (line   6)
* async output in GDB/MI:                GDB/MI Output Syntax.
                                                              (line  98)
* async records in GDB/MI:               GDB/MI Async Records.
                                                              (line   6)
* asynchronous execution:                Background Execution.
                                                              (line   6)
* asynchronous execution, and process record and replay: Process Record and Replay.
                                                              (line  52)
* AT&T disassembly flavor:               Machine Code.        (line 127)
* attach:                                Attach.              (line   6)
* attach to a program, gdbserver:        Server.              (line  71)
* auto-loading, Python:                  Auto-loading.        (line   6)
* auto-retry, for remote TCP target:     Remote Configuration.
                                                              (line 117)
* automatic display:                     Auto Display.        (line   6)
* automatic hardware breakpoints:        Set Breaks.          (line 286)
* automatic overlay debugging:           Automatic Overlay Debugging.
                                                              (line   6)
* automatic thread selection:            All-Stop Mode.       (line  28)
* auxiliary vector:                      OS Information.      (line  21)
* AVR:                                   AVR.                 (line   6)
* B packet:                              Packets.             (line  92)
* b packet:                              Packets.             (line  77)
* background execution:                  Background Execution.
                                                              (line   6)
* backtrace beyond main function:        Backtrace.           (line  93)
* backtrace limit:                       Backtrace.           (line 129)
* base name differences:                 Files.               (line 501)
* baud rate for remote targets:          Remote Configuration.
                                                              (line  21)
* bc packet:                             Packets.             (line  97)
* bcache statistics:                     Maintenance Commands.
                                                              (line 227)
* bits in remote address:                Remote Configuration.
                                                              (line  12)
* blocks in python:                      Blocks In Python.    (line   6)
* bookmark:                              Checkpoint/Restart.  (line   6)
* break in overloaded functions:         Debugging C Plus Plus.
                                                              (line   9)
* break on a system call.:               Set Catchpoints.     (line  48)
* break on fork/exec:                    Set Catchpoints.     (line  43)
* BREAK signal instead of Ctrl-C:        Remote Configuration.
                                                              (line  29)
* breakpoint address adjusted:           Breakpoint-related Warnings.
                                                              (line   6)
* breakpoint commands:                   Break Commands.      (line   6)
* breakpoint commands for GDB/MI:        GDB/MI Breakpoint Commands.
                                                              (line   6)
* breakpoint conditions:                 Conditions.          (line   6)
* breakpoint numbers:                    Breakpoints.         (line  41)
* breakpoint on events:                  Breakpoints.         (line  33)
* breakpoint on memory address:          Breakpoints.         (line  20)
* breakpoint on variable modification:   Breakpoints.         (line  20)
* breakpoint ranges:                     Breakpoints.         (line  48)
* breakpoint subroutine, remote:         Stub Contents.       (line  31)
* breakpointing Ada elaboration code:    Stopping Before Main Program.
                                                              (line   6)
* breakpoints:                           Breakpoints.         (line   6)
* breakpoints and tasks, in Ada:         Ada Tasks.           (line 135)
* breakpoints and threads:               Thread-Specific Breakpoints.
                                                              (line  10)
* breakpoints at functions matching a regexp: Set Breaks.     (line  92)
* breakpoints in overlays:               Overlay Commands.    (line  93)
* breakpoints in python:                 Breakpoints In Python.
                                                              (line   6)
* breakpoints, multiple locations:       Set Breaks.          (line 190)
* bs packet:                             Packets.             (line 103)
* bug criteria:                          Bug Criteria.        (line   6)
* bug reports:                           Bug Reporting.       (line   6)
* bugs in GDB:                           GDB Bugs.            (line   6)
* build ID sections:                     Separate Debug Files.
                                                              (line  96)
* build ID, and separate debugging files: Separate Debug Files.
                                                              (line   6)
* building GDB, requirements for:        Requirements.        (line   6)
* built-in simulator target:             Target Commands.     (line  73)
* C and C++:                             C.                   (line   6)
* C and C++ checks:                      C Checks.            (line   6)
* C and C++ constants:                   C Constants.         (line   6)
* C and C++ defaults:                    C Defaults.          (line   6)
* C and C++ operators:                   C Operators.         (line   6)
* C packet:                              Packets.             (line 119)
* c packet:                              Packets.             (line 110)
* C++:                                   C.                   (line  10)
* C++ compilers:                         C Plus Plus Expressions.
                                                              (line   8)
* C++ exception handling:                Debugging C Plus Plus.
                                                              (line  20)
* C++ overload debugging info:           Debugging Output.    (line 118)
* C++ scope resolution:                  Variables.           (line  54)
* C++ symbol decoding style:             Print Settings.      (line 397)
* C++ symbol display:                    Debugging C Plus Plus.
                                                              (line  29)
* caching data of remote targets:        Caching Remote Data. (line   6)
* call dummy stack unwinding:            Calling.             (line  35)
* call dummy stack unwinding on unhandled exception.: Calling.
                                                              (line  46)
* call overloaded functions:             C Plus Plus Expressions.
                                                              (line  26)
* call stack:                            Stack.               (line   9)
* call stack traces:                     Backtrace.           (line   6)
* calling functions:                     Calling.             (line   6)
* calling make:                          Shell Commands.      (line  21)
* case sensitivity in symbol names:      Symbols.             (line  27)
* case-insensitive symbol names:         Symbols.             (line  27)
* casts, in expressions:                 Expressions.         (line  28)
* casts, to view memory:                 Expressions.         (line  43)
* catch Ada exceptions:                  Set Catchpoints.     (line  19)
* catch exceptions, list active handlers: Frame Info.         (line  60)
* catchpoints:                           Breakpoints.         (line  33)
* catchpoints, setting:                  Set Catchpoints.     (line   6)
* Cell Broadband Engine:                 SPU.                 (line   6)
* change working directory:              Working Directory.   (line  16)
* character sets:                        Character Sets.      (line   6)
* charset:                               Character Sets.      (line   6)
* checkpoint:                            Checkpoint/Restart.  (line   6)
* checkpoints and process id:            Checkpoint/Restart.  (line  80)
* checks, range:                         Type Checking.       (line  65)
* checks, type:                          Checks.              (line  31)
* checksum, for GDB remote:              Overview.            (line  20)
* choosing target byte order:            Byte Order.          (line   6)
* circular trace buffer:                 Starting and Stopping Trace Experiments.
                                                              (line  81)
* clearing breakpoints, watchpoints, catchpoints: Delete Breaks.
                                                              (line   6)
* close, file-i/o system call:           close.               (line   6)
* closest symbol and offset for an address: Symbols.          (line  54)
* code address and its source line:      Machine Code.        (line  25)
* collected data discarded:              Starting and Stopping Trace Experiments.
                                                              (line   6)
* colon, doubled as scope operator:      M2 Scope.            (line   6)
* colon-colon, context for variables/functions: Variables.    (line  44)
* command editing:                       Readline Bare Essentials.
                                                              (line   6)
* command files:                         Command Files.       (line   6)
* command history:                       Command History.     (line   6)
* command hooks:                         Hooks.               (line   6)
* command interpreters:                  Interpreters.        (line   6)
* command line editing:                  Editing.             (line   6)
* command scripts, debugging:            Messages/Warnings.   (line  67)
* command tracing:                       Messages/Warnings.   (line  62)
* commands for C++:                      Debugging C Plus Plus.
                                                              (line   6)
* commands in python:                    Commands In Python.  (line   6)
* commands to access python:             Python Commands.     (line   6)
* comment:                               Command Syntax.      (line  38)
* COMMON blocks, Fortran:                Special Fortran Commands.
                                                              (line   9)
* common targets:                        Target Commands.     (line  46)
* compatibility, GDB/MI and CLI:         GDB/MI Compatibility with CLI.
                                                              (line   6)
* compilation directory:                 Source Path.         (line 108)
* compiling, on Sparclet:                Sparclet.            (line  16)
* completion:                            Completion.          (line   6)
* completion of Python commands:         Commands In Python.  (line  72)
* completion of quoted strings:          Completion.          (line  57)
* completion of structure field names:   Completion.          (line  96)
* completion of union field names:       Completion.          (line  96)
* compressed debug sections:             Requirements.        (line  42)
* conditional breakpoints:               Conditions.          (line   6)
* conditional tracepoints:               Tracepoint Conditions.
                                                              (line   6)
* configuring GDB:                       Running Configure.   (line   6)
* confirmation:                          Messages/Warnings.   (line  50)
* connection timeout, for remote TCP target: Remote Configuration.
                                                              (line 132)
* console i/o as part of file-i/o:       Console I/O.         (line   6)
* console interpreter:                   Interpreters.        (line  21)
* console output in GDB/MI:              GDB/MI Output Syntax.
                                                              (line 106)
* constants, in file-i/o protocol:       Constants.           (line   6)
* continuing:                            Continuing and Stepping.
                                                              (line   6)
* continuing threads:                    Thread Stops.        (line   6)
* control C, and remote debugging:       Bootstrapping.       (line  25)
* controlling terminal:                  Input/Output.        (line  23)
* convenience functions:                 Convenience Vars.    (line 106)
* convenience functions in python:       Functions In Python. (line   6)
* convenience variables:                 Convenience Vars.    (line   6)
* convenience variables for tracepoints: Tracepoint Variables.
                                                              (line   6)
* convenience variables, and trace state variables: Trace State Variables.
                                                              (line  17)
* convenience variables, initializing:   Convenience Vars.    (line  41)
* core dump file:                        Files.               (line   6)
* core dump file target:                 Target Commands.     (line  54)
* crash of debugger:                     Bug Criteria.        (line   9)
* CRC algorithm definition:              Separate Debug Files.
                                                              (line 140)
* CRC of memory block, remote request:   General Query Packets.
                                                              (line  63)
* CRIS:                                  CRIS.                (line   6)
* CRIS mode:                             CRIS.                (line  26)
* CRIS version:                          CRIS.                (line  10)
* Ctrl-BREAK, MS-Windows:                Cygwin Native.       (line   9)
* ctrl-c message, in file-i/o protocol:  The Ctrl-C Message.  (line   6)
* current Ada task ID:                   Ada Tasks.           (line 105)
* current directory:                     Source Path.         (line 108)
* current stack frame:                   Frames.              (line  45)
* current thread:                        Threads.             (line  45)
* current thread, remote request:        General Query Packets.
                                                              (line  52)
* custom JIT debug info:                 Custom Debug Info.   (line   6)
* Cygwin DLL, debugging:                 Cygwin Native.       (line  42)
* Cygwin-specific commands:              Cygwin Native.       (line   6)
* D:                                     D.                   (line   6)
* D packet:                              Packets.             (line 135)
* d packet:                              Packets.             (line 128)
* Darwin:                                Darwin.              (line   6)
* data breakpoints:                      Breakpoints.         (line  20)
* data manipulation, in GDB/MI:          GDB/MI Data Manipulation.
                                                              (line   6)
* dcache line-size:                      Caching Remote Data. (line  48)
* dcache size:                           Caching Remote Data. (line  45)
* dead names, GNU Hurd:                  Hurd Native.         (line  85)
* debug expression parser:               Debugging Output.    (line 124)
* debug formats and C++:                 C Plus Plus Expressions.
                                                              (line   8)
* debug link sections:                   Separate Debug Files.
                                                              (line  78)
* debug remote protocol:                 Debugging Output.    (line 133)
* debugger crash:                        Bug Criteria.        (line   9)
* debugging C++ programs:                C Plus Plus Expressions.
                                                              (line   8)
* debugging information directory, global: Separate Debug Files.
                                                              (line   6)
* debugging information in separate files: Separate Debug Files.
                                                              (line   6)
* debugging libthread_db:                Threads.             (line 212)
* debugging multiple processes:          Forks.               (line  52)
* debugging optimized code:              Optimized Code.      (line   6)
* debugging stub, example:               Remote Stub.         (line   6)
* debugging target:                      Targets.             (line   6)
* debugging the Cygwin DLL:              Cygwin Native.       (line  42)
* decimal floating point format:         Decimal Floating Point.
                                                              (line   6)
* default collection action:             Tracepoint Actions.  (line 126)
* default data directory:                Data Files.          (line  19)
* default source path substitution:      Source Path.         (line  89)
* default system root:                   Files.               (line 434)
* define trace state variable, remote request: Tracepoint Packets.
                                                              (line 127)
* defining macros interactively:         Macros.              (line  59)
* definition of a macro, showing:        Macros.              (line  47)
* delete breakpoints:                    Delete Breaks.       (line  41)
* deleting breakpoints, watchpoints, catchpoints: Delete Breaks.
                                                              (line   6)
* deliver a signal to a program:         Signaling.           (line   6)
* demangling C++ names:                  Print Settings.      (line 378)
* deprecated commands:                   Maintenance Commands.
                                                              (line  90)
* derived type of an object, printing:   Print Settings.      (line 430)
* descriptor tables display:             DJGPP Native.        (line  24)
* detach from task, GNU Hurd:            Hurd Native.         (line  60)
* detach from thread, GNU Hurd:          Hurd Native.         (line 110)
* direct memory access (DMA) on MS-DOS:  DJGPP Native.        (line  75)
* directories for source files:          Source Path.         (line   6)
* directory, compilation:                Source Path.         (line 108)
* directory, current:                    Source Path.         (line 108)
* disable address space randomization, remote request: General Query Packets.
                                                              (line  83)
* disconnected tracing:                  Starting and Stopping Trace Experiments.
                                                              (line  45)
* displaced stepping debugging info:     Debugging Output.    (line  53)
* displaced stepping support:            Maintenance Commands.
                                                              (line  56)
* displaced stepping, and process record and replay: Process Record and Replay.
                                                              (line  47)
* display command history:               Command History.     (line  78)
* display derived types:                 Print Settings.      (line 430)
* display disabled out of scope:         Auto Display.        (line  86)
* display GDB copyright:                 Help.                (line 136)
* display of expressions:                Auto Display.        (line   6)
* display remote monitor communications: Target Commands.     (line 108)
* display remote packets:                Debugging Output.    (line 133)
* DJGPP debugging:                       DJGPP Native.        (line   6)
* DLLs with no debugging symbols:        Non-debug DLL Symbols.
                                                              (line   6)
* do not print frame argument values:    Print Settings.      (line 135)
* documentation:                         Formatting Documentation.
                                                              (line  22)
* don't repeat command:                  Define.              (line  61)
* don't repeat Python command:           Commands In Python.  (line  43)
* DOS file-name semantics of file names.: Files.              (line 457)
* DOS serial data link, remote debugging: DJGPP Native.       (line 121)
* DOS serial port status:                DJGPP Native.        (line 142)
* download server address (M32R):        M32R/D.              (line  27)
* download to Sparclet:                  Sparclet Download.   (line   6)
* download to VxWorks:                   VxWorks Download.    (line   6)
* DPMI:                                  DJGPP Native.        (line   6)
* dump all data collected at tracepoint: tdump.               (line   6)
* dump core from inferior:               Core File Generation.
                                                              (line   6)
* dump data to a file:                   Dump/Restore Files.  (line   6)
* dump/restore files:                    Dump/Restore Files.  (line   6)
* DVC register:                          PowerPC Embedded.    (line   6)
* DWARF 2 compilation units cache:       Maintenance Commands.
                                                              (line 285)
* DWARF-2 CFI and CRIS:                  CRIS.                (line  18)
* DWARF2 DIEs:                           Debugging Output.    (line  46)
* dynamic linking:                       Files.               (line 113)
* dynamic varobj:                        GDB/MI Variable Objects.
                                                              (line 164)
* editing:                               Editing.             (line  15)
* editing command lines:                 Readline Bare Essentials.
                                                              (line   6)
* editing source files:                  Edit.                (line   6)
* eight-bit characters in strings:       Print Settings.      (line 323)
* elaboration phase:                     Starting.            (line  90)
* Emacs:                                 Emacs.               (line   6)
* empty response, for unsupported packets: Overview.          (line  96)
* enable/disable a breakpoint:           Disabling.           (line   6)
* entering numbers:                      Numbers.             (line   6)
* environment (of your program):         Environment.         (line   6)
* errno values, in file-i/o protocol:    Errno Values.        (line   6)
* error on valid input:                  Bug Criteria.        (line  12)
* event debugging info:                  Debugging Output.    (line  61)
* event designators:                     Event Designators.   (line   6)
* event handling:                        Set Catchpoints.     (line   6)
* examine process image:                 SVR4 Process Information.
                                                              (line   6)
* examining data:                        Data.                (line   6)
* examining memory:                      Memory.              (line   9)
* exception handlers:                    Set Catchpoints.     (line   6)
* exception handlers, how to list:       Frame Info.          (line  60)
* exceptions, python:                    Exception Handling.  (line   6)
* executable file:                       Files.               (line  16)
* executable file target:                Target Commands.     (line  50)
* executable file, for remote target:    Remote Configuration.
                                                              (line  88)
* execute commands from a file:          Command Files.       (line  17)
* execute forward or backward in time:   Reverse Execution.   (line  87)
* execute remote command, remote request: General Query Packets.
                                                              (line 297)
* execution, foreground, background and asynchronous: Background Execution.
                                                              (line   6)
* exiting GDB:                           Quitting GDB.        (line   6)
* expand macro once:                     Macros.              (line  38)
* expanding preprocessor macros:         Macros.              (line  29)
* expression debugging info:             Debugging Output.    (line  68)
* expression parser, debugging info:     Debugging Output.    (line 124)
* expressions:                           Expressions.         (line   6)
* expressions in Ada:                    Ada.                 (line  11)
* expressions in C or C++:               C.                   (line   6)
* expressions in C++:                    C Plus Plus Expressions.
                                                              (line   6)
* expressions in Modula-2:               Modula-2.            (line  12)
* extend GDB for remote targets:         Connecting.          (line 105)
* extending GDB:                         Extending GDB.       (line   6)
* extra signal information:              Signals.             (line 102)
* F packet:                              Packets.             (line 152)
* F reply packet:                        The F Reply Packet.  (line   6)
* F request packet:                      The F Request Packet.
                                                              (line   6)
* fast tracepoints:                      Set Tracepoints.     (line  24)
* fast tracepoints, setting:             Create and Delete Tracepoints.
                                                              (line  51)
* fatal signal:                          Bug Criteria.        (line   9)
* fatal signals:                         Signals.             (line  15)
* features of the remote protocol:       General Query Packets.
                                                              (line 357)
* file name canonicalization:            Files.               (line 501)
* file transfer:                         File Transfer.       (line   6)
* file transfer, remote protocol:        Host I/O Packets.    (line   6)
* file-i/o examples:                     File-I/O Examples.   (line   6)
* file-i/o overview:                     File-I/O Overview.   (line   6)
* File-I/O remote protocol extension:    File-I/O Remote Protocol Extension.
                                                              (line   6)
* file-i/o reply packet:                 The F Reply Packet.  (line   6)
* file-i/o request packet:               The F Request Packet.
                                                              (line   6)
* find downloadable SREC files (M32R):   M32R/D.              (line  15)
* find trace snapshot:                   tfind.               (line   6)
* flinching:                             Messages/Warnings.   (line  50)
* float promotion:                       ABI.                 (line  29)
* floating point:                        Floating Point Hardware.
                                                              (line   6)
* floating point registers:              Registers.           (line  15)
* floating point, MIPS remote:           MIPS Embedded.       (line  60)
* focus of debugging:                    Threads.             (line  45)
* foo:                                   Symbol Errors.       (line  50)
* foreground execution:                  Background Execution.
                                                              (line   6)
* fork, debugging programs which call:   Forks.               (line   6)
* format options:                        Print Settings.      (line   6)
* formatted output:                      Output Formats.      (line   6)
* Fortran:                               Summary.             (line  40)
* Fortran Defaults:                      Fortran Defaults.    (line   6)
* Fortran operators and expressions:     Fortran Operators.   (line   6)
* Fortran-specific support in GDB:       Fortran.             (line   6)
* FR-V shared-library debugging:         Debugging Output.    (line 151)
* frame debugging info:                  Debugging Output.    (line  76)
* frame number:                          Frames.              (line  28)
* frame pointer:                         Frames.              (line  21)
* frame pointer register:                Registers.           (line  26)
* frame, definition:                     Frames.              (line   6)
* frameless execution:                   Frames.              (line  34)
* frames in python:                      Frames In Python.    (line   6)
* free memory information (MS-DOS):      DJGPP Native.        (line  19)
* fstat, file-i/o system call:           stat/fstat.          (line   6)
* Fujitsu:                               Remote Stub.         (line  69)
* full symbol tables, listing GDB's internal: Symbols.        (line 321)
* function call arguments, optimized out: Backtrace.          (line  71)
* function entry/exit, wrong values of variables: Variables.  (line  58)
* functions without line info, and stepping: Continuing and Stepping.
                                                              (line  93)
* G packet:                              Packets.             (line 186)
* g packet:                              Packets.             (line 157)
* g++, GNU C++ compiler:                 C.                   (line  10)
* garbled pointers:                      DJGPP Native.        (line  42)
* GCC and C++:                           C Plus Plus Expressions.
                                                              (line   8)
* GDB bugs, reporting:                   Bug Reporting.       (line   6)
* GDB internal error:                    Maintenance Commands.
                                                              (line 124)
* gdb module:                            Basic Python.        (line   6)
* GDB reference card:                    Formatting Documentation.
                                                              (line   6)
* GDB startup:                           Startup.             (line   6)
* GDB version number:                    Help.                (line 126)
* gdb.ini:                               Startup.             (line  60)
* gdb.printing:                          gdb.printing.        (line   6)
* gdb.prompt:                            gdb.prompt.          (line   6)
* gdb.types:                             gdb.types.           (line   6)
* gdb.Value:                             Values From Inferior.
                                                              (line   6)
* GDB/MI development:                    GDB/MI Development and Front Ends.
                                                              (line   6)
* GDB/MI General Design:                 GDB/MI General Design.
                                                              (line   6)
* GDB/MI, async records:                 GDB/MI Async Records.
                                                              (line   6)
* GDB/MI, breakpoint commands:           GDB/MI Breakpoint Commands.
                                                              (line   6)
* GDB/MI, compatibility with CLI:        GDB/MI Compatibility with CLI.
                                                              (line   6)
* GDB/MI, data manipulation:             GDB/MI Data Manipulation.
                                                              (line   6)
* GDB/MI, input syntax:                  GDB/MI Input Syntax. (line   6)
* GDB/MI, its purpose:                   GDB/MI.              (line   9)
* GDB/MI, output syntax:                 GDB/MI Output Syntax.
                                                              (line   6)
* GDB/MI, result records:                GDB/MI Result Records.
                                                              (line   6)
* GDB/MI, simple examples:               GDB/MI Simple Examples.
                                                              (line   6)
* GDB/MI, stream records:                GDB/MI Stream Records.
                                                              (line   6)
* gdbarch debugging info:                Debugging Output.    (line  18)
* GDBHISTFILE, environment variable:     Command History.     (line  26)
* gdbserver, command-line arguments:     Server.              (line  34)
* gdbserver, multiple processes:         Server.              (line  91)
* gdbserver, search path for libthread_db: Server.            (line 223)
* GDT:                                   DJGPP Native.        (line  24)
* get thread information block address:  General Query Packets.
                                                              (line 172)
* get thread-local storage address, remote request: General Query Packets.
                                                              (line 141)
* gettimeofday, file-i/o system call:    gettimeofday.        (line   6)
* global debugging information directory: Separate Debug Files.
                                                              (line   6)
* GNU C++:                               C.                   (line  10)
* GNU Emacs:                             Emacs.               (line   6)
* GNU Hurd debugging:                    Hurd Native.         (line   6)
* GNU/Hurd debug messages:               Debugging Output.    (line  83)
* GNU/Linux LWP debug messages:          Debugging Output.    (line 104)
* H packet:                              Packets.             (line 197)
* handling signals:                      Signals.             (line  27)
* hardware breakpoints:                  Set Breaks.          (line  62)
* hardware debug registers:              Maintenance Commands.
                                                              (line 311)
* hardware watchpoints:                  Set Watchpoints.     (line  31)
* hash mark while downloading:           Target Commands.     (line  99)
* heuristic-fence-post (Alpha, MIPS):    MIPS.                (line  14)
* history events:                        Event Designators.   (line   8)
* history expansion:                     History Interaction. (line   6)
* history expansion, turn on/off:        Command History.     (line  53)
* history file:                          Command History.     (line  26)
* history number:                        Value History.       (line  13)
* history of values printed by GDB:      Value History.       (line   6)
* history size:                          Command History.     (line  45)
* history substitution:                  Command History.     (line  26)
* HISTSIZE, environment variable:        Command History.     (line  45)
* hooks, for commands:                   Hooks.               (line   6)
* hooks, post-command:                   Hooks.               (line  11)
* hooks, pre-command:                    Hooks.               (line   6)
* host character set:                    Character Sets.      (line   6)
* Host I/O, remote protocol:             Host I/O Packets.    (line   6)
* how many arguments (user-defined commands): Define.         (line  25)
* HPPA support:                          HPPA.                (line   6)
* I packet:                              Packets.             (line 217)
* i packet:                              Packets.             (line 212)
* i/o:                                   Input/Output.        (line   6)
* I/O registers (Atmel AVR):             AVR.                 (line  10)
* i386:                                  Remote Stub.         (line  57)
* i386-stub.c:                           Remote Stub.         (line  57)
* IDT:                                   DJGPP Native.        (line  24)
* ignore count (of breakpoint):          Conditions.          (line  66)
* incomplete type:                       Symbols.             (line 150)
* indentation in structure display:      Print Settings.      (line 299)
* index files:                           Index Files.         (line   6)
* index section format:                  Index Section Format.
                                                              (line   6)
* inferior:                              Inferiors and Programs.
                                                              (line  13)
* inferior debugging info:               Debugging Output.    (line  89)
* inferior events in Python:             Events In Python.    (line   6)
* inferior functions, calling:           Calling.             (line   6)
* inferior tty:                          Input/Output.        (line  44)
* inferiors in Python:                   Inferiors In Python. (line   6)
* infinite recursion in user-defined commands: Define.        (line  76)
* info for known .debug_gdb_scripts-loaded scripts: Maintenance Commands.
                                                              (line 220)
* info for known object files:           Maintenance Commands.
                                                              (line 215)
* information about static tracepoint markers: Listing Static Tracepoint Markers.
                                                              (line   6)
* information about tracepoints:         Listing Tracepoints. (line   6)
* inheritance:                           Debugging C Plus Plus.
                                                              (line  25)
* init file:                             Startup.             (line  11)
* init file name:                        Startup.             (line  60)
* initial frame:                         Frames.              (line  12)
* initialization file, readline:         Readline Init File.  (line   6)
* inline functions, debugging:           Inline Functions.    (line   6)
* innermost frame:                       Frames.              (line  12)
* input syntax for GDB/MI:               GDB/MI Input Syntax. (line   6)
* installation:                          Installing GDB.      (line   6)
* instructions, assembly:                Machine Code.        (line  36)
* integral datatypes, in file-i/o protocol: Integral Datatypes.
                                                              (line   6)
* Intel:                                 Remote Stub.         (line  57)
* Intel disassembly flavor:              Machine Code.        (line 127)
* interaction, readline:                 Readline Interaction.
                                                              (line   6)
* internal commands:                     Maintenance Commands.
                                                              (line   6)
* internal errors, control of GDB behavior: Maintenance Commands.
                                                              (line 124)
* internal GDB breakpoints:              Set Breaks.          (line 335)
* interrupt:                             Quitting GDB.        (line  13)
* interrupt debuggee on MS-Windows:      Cygwin Native.       (line   9)
* interrupt remote programs:             Remote Configuration.
                                                              (line  29)
* interrupting remote programs:          Connecting.          (line  78)
* interrupting remote targets:           Bootstrapping.       (line  25)
* interrupts (remote protocol):          Interrupts.          (line   6)
* invalid input:                         Bug Criteria.        (line  16)
* invoke another interpreter:            Interpreters.        (line  37)
* isatty, file-i/o system call:          isatty.              (line   6)
* JIT compilation interface:             JIT Interface.       (line   6)
* JIT debug info reader:                 Custom Debug Info.   (line   6)
* just-in-time compilation:              JIT Interface.       (line   6)
* just-in-time compilation, debugging messages: Debugging Output.
                                                              (line  98)
* k packet:                              Packets.             (line 221)
* kernel crash dump:                     BSD libkvm Interface.
                                                              (line   6)
* kernel memory image:                   BSD libkvm Interface.
                                                              (line   6)
* kill ring:                             Readline Killing Commands.
                                                              (line  19)
* killing text:                          Readline Killing Commands.
                                                              (line   6)
* languages:                             Languages.           (line   6)
* last tracepoint number:                Create and Delete Tracepoints.
                                                              (line 123)
* latest breakpoint:                     Set Breaks.          (line   6)
* lazy strings in python:                Lazy Strings In Python.
                                                              (line   6)
* LDT:                                   DJGPP Native.        (line  24)
* leaving GDB:                           Quitting GDB.        (line   6)
* libkvm:                                BSD libkvm Interface.
                                                              (line   6)
* library list format, remote protocol <1>: Library List Format for SVR4 Targets.
                                                              (line   6)
* library list format, remote protocol:  Library List Format. (line   6)
* limit hardware breakpoints and watchpoints: Remote Configuration.
                                                              (line  72)
* limit hardware watchpoints length:     Remote Configuration.
                                                              (line  77)
* limit on number of printed array elements: Print Settings.  (line 123)
* limits, in file-i/o protocol:          Limits.              (line   6)
* linespec:                              Specify Location.    (line   6)
* Linux lightweight processes:           Debugging Output.    (line 104)
* list active threads, remote request:   General Query Packets.
                                                              (line 113)
* list of supported file-i/o calls:      List of Supported Calls.
                                                              (line   6)
* list output in GDB/MI:                 GDB/MI Output Syntax.
                                                              (line 117)
* list, how many lines to display:       List.                (line  30)
* listing GDB's internal symbol tables:  Symbols.             (line 321)
* listing machine instructions:          Machine Code.        (line  36)
* listing mapped overlays:               Overlay Commands.    (line  60)
* load address, overlay's:               How Overlays Work.   (line   6)
* load shared library:                   Files.               (line 323)
* load symbols from memory:              Files.               (line 162)
* local variables:                       Symbols.             (line 181)
* locate address:                        Output Formats.      (line  35)
* lock scheduler:                        All-Stop Mode.       (line  37)
* log output in GDB/MI:                  GDB/MI Output Syntax.
                                                              (line 113)
* logging file name:                     Logging Output.      (line  13)
* logging GDB output:                    Logging Output.      (line   6)
* lseek flags, in file-i/o protocol:     Lseek Flags.         (line   6)
* lseek, file-i/o system call:           lseek.               (line   6)
* M packet:                              Packets.             (line 248)
* m packet:                              Packets.             (line 228)
* M32-EVA target board address:          M32R/D.              (line  21)
* M32R/Chaos debugging:                  M32R/D.              (line  50)
* m680x0:                                Remote Stub.         (line  60)
* m68k-stub.c:                           Remote Stub.         (line  60)
* machine instructions:                  Machine Code.        (line  36)
* macro definition, showing:             Macros.              (line  47)
* macro expansion, showing the results of preprocessor: Macros.
                                                              (line  29)
* macros, example of debugging with:     Macros.              (line  83)
* macros, from debug info:               Macros.              (line  47)
* macros, user-defined:                  Macros.              (line  59)
* mailing lists:                         GDB/MI Development and Front Ends.
                                                              (line  35)
* maintenance commands:                  Maintenance Commands.
                                                              (line   6)
* manual overlay debugging:              Overlay Commands.    (line  23)
* map an overlay:                        Overlay Commands.    (line  30)
* mapinfo list, QNX Neutrino:            SVR4 Process Information.
                                                              (line  78)
* mapped address:                        How Overlays Work.   (line   6)
* mapped overlays:                       How Overlays Work.   (line   6)
* markers, static tracepoints:           Set Tracepoints.     (line  28)
* maximum value for offset of closest symbol: Print Settings. (line  70)
* member functions:                      C Plus Plus Expressions.
                                                              (line  16)
* memory address space mappings:         SVR4 Process Information.
                                                              (line  32)
* memory map format:                     Memory Map Format.   (line   6)
* memory region attributes:              Memory Region Attributes.
                                                              (line   6)
* memory tracing:                        Breakpoints.         (line  20)
* memory transfer, in file-i/o protocol: Memory Transfer.     (line   6)
* memory used by commands:               Maintenance Commands.
                                                              (line 325)
* memory used for symbol tables:         Files.               (line 311)
* memory, alignment and size of remote accesses: Packets.     (line 235)
* memory, viewing as typed object:       Expressions.         (line  43)
* mi interpreter:                        Interpreters.        (line  26)
* mi1 interpreter:                       Interpreters.        (line  34)
* mi2 interpreter:                       Interpreters.        (line  31)
* minimal language:                      Unsupported Languages.
                                                              (line   6)
* Minimal symbols and DLLs:              Non-debug DLL Symbols.
                                                              (line   6)
* MIPS addresses, masking:               MIPS.                (line  59)
* MIPS boards:                           MIPS Embedded.       (line   6)
* MIPS remote floating point:            MIPS Embedded.       (line  60)
* MIPS stack:                            MIPS.                (line   6)
* miscellaneous settings:                Other Misc Settings. (line   6)
* MMX registers (x86):                   Registers.           (line  71)
* mode_t values, in file-i/o protocol:   mode_t Values.       (line   6)
* Modula-2:                              Summary.             (line  29)
* Modula-2 built-ins:                    Built-In Func/Proc.  (line   6)
* Modula-2 checks:                       M2 Checks.           (line   6)
* Modula-2 constants:                    Built-In Func/Proc.  (line 112)
* Modula-2 defaults:                     M2 Defaults.         (line   6)
* Modula-2 operators:                    M2 Operators.        (line   6)
* Modula-2 types:                        M2 Types.            (line   6)
* Modula-2, deviations from:             Deviations.          (line   6)
* Modula-2, GDB support:                 Modula-2.            (line   6)
* monitor commands, for gdbserver:       Server.              (line 206)
* Motorola 680x0:                        Remote Stub.         (line  60)
* MS Windows debugging:                  Cygwin Native.       (line   6)
* MS-DOS system info:                    DJGPP Native.        (line  19)
* MS-DOS-specific commands:              DJGPP Native.        (line   6)
* multiple locations, breakpoints:       Set Breaks.          (line 190)
* multiple processes:                    Forks.               (line   6)
* multiple processes with gdbserver:     Server.              (line  91)
* multiple targets:                      Active Targets.      (line   6)
* multiple threads:                      Threads.             (line   6)
* multiple threads, backtrace:           Backtrace.           (line  37)
* multiple-symbols menu:                 Ambiguous Expressions.
                                                              (line  51)
* multiprocess extensions, in remote protocol: General Query Packets.
                                                              (line 568)
* name a thread:                         Threads.             (line 131)
* names of symbols:                      Symbols.             (line  14)
* namespace in C++:                      C Plus Plus Expressions.
                                                              (line  20)
* native Cygwin debugging:               Cygwin Native.       (line   6)
* native DJGPP debugging:                DJGPP Native.        (line   6)
* negative breakpoint numbers:           Set Breaks.          (line 335)
* NetROM ROM emulator target:            Target Commands.     (line  88)
* New SYSTAG message:                    Threads.             (line  51)
* non-member C++ functions, set breakpoint in: Set Breaks.    (line 108)
* non-stop mode:                         Non-Stop Mode.       (line   6)
* non-stop mode, and breakpoint always-inserted: Set Breaks.  (line 328)
* non-stop mode, and process record and replay: Process Record and Replay.
                                                              (line  52)
* non-stop mode, and set displaced-stepping: Maintenance Commands.
                                                              (line  73)
* non-stop mode, remote request:         General Query Packets.
                                                              (line 249)
* noninvasive task options:              Hurd Native.         (line  73)
* notation, readline:                    Readline Bare Essentials.
                                                              (line   6)
* notational conventions, for GDB/MI:    GDB/MI.              (line  25)
* notification packets:                  Notification Packets.
                                                              (line   6)
* notify output in GDB/MI:               GDB/MI Output Syntax.
                                                              (line 102)
* NULL elements in arrays:               Print Settings.      (line 290)
* number of array elements to print:     Print Settings.      (line 123)
* number representation:                 Numbers.             (line   6)
* numbers for breakpoints:               Breakpoints.         (line  41)
* object files, relocatable, reading symbols from: Files.     (line 132)
* Objective-C:                           Objective-C.         (line   6)
* Objective-C, classes and selectors:    Symbols.             (line 248)
* Objective-C, print objects:            The Print Command with Objective-C.
                                                              (line   6)
* OBJFILE-gdb.py:                        objfile-gdb.py file. (line   6)
* objfiles in python:                    Objfiles In Python.  (line   6)
* observer debugging info:               Debugging Output.    (line 111)
* octal escapes in strings:              Print Settings.      (line 323)
* online documentation:                  Help.                (line   6)
* opaque data types:                     Symbols.             (line 284)
* open flags, in file-i/o protocol:      Open Flags.          (line   6)
* open, file-i/o system call:            open.                (line   6)
* OpenCL C:                              OpenCL C.            (line   6)
* OpenCL C Datatypes:                    OpenCL C Datatypes.  (line   6)
* OpenCL C Expressions:                  OpenCL C Expressions.
                                                              (line   6)
* OpenCL C Operators:                    OpenCL C Operators.  (line   6)
* OpenRISC 1000:                         OpenRISC 1000.       (line   6)
* OpenRISC 1000 htrace:                  OpenRISC 1000.       (line  58)
* operating system information:          Operating System Information.
                                                              (line   6)
* operating system information, process list: Process list.   (line   6)
* optimized code, debugging:             Optimized Code.      (line   6)
* optimized code, wrong values of variables: Variables.       (line  58)
* optimized out value in Python:         Values From Inferior.
                                                              (line  49)
* optimized out, in backtrace:           Backtrace.           (line  71)
* optional debugging messages:           Debugging Output.    (line   6)
* optional warnings:                     Messages/Warnings.   (line   6)
* or1k boards:                           OpenRISC 1000.       (line   6)
* OS ABI:                                ABI.                 (line  11)
* OS information:                        OS Information.      (line   6)
* out-of-line single-stepping:           Maintenance Commands.
                                                              (line  56)
* outermost frame:                       Frames.              (line  12)
* output formats:                        Output Formats.      (line   6)
* output syntax of GDB/MI:               GDB/MI Output Syntax.
                                                              (line   6)
* overlay area:                          How Overlays Work.   (line   6)
* overlay example program:               Overlay Sample Program.
                                                              (line   6)
* overlays:                              Overlays.            (line   6)
* overlays, setting breakpoints in:      Overlay Commands.    (line  93)
* overloaded functions, calling:         C Plus Plus Expressions.
                                                              (line  26)
* overloaded functions, overload resolution: Debugging C Plus Plus.
                                                              (line  48)
* overloading in C++:                    Debugging C Plus Plus.
                                                              (line  15)
* P packet:                              Packets.             (line 276)
* p packet:                              Packets.             (line 261)
* packet acknowledgment, for GDB remote: Packet Acknowledgment.
                                                              (line   6)
* packet size, remote protocol:          General Query Packets.
                                                              (line 491)
* packets, notification:                 Notification Packets.
                                                              (line   6)
* packets, reporting on stdout:          Debugging Output.    (line 133)
* packets, tracepoint:                   Tracepoint Packets.  (line   6)
* page tables display (MS-DOS):          DJGPP Native.        (line  56)
* parameters in python:                  Parameters In Python.
                                                              (line   6)
* partial symbol dump:                   Symbols.             (line 302)
* partial symbol tables, listing GDB's internal: Symbols.     (line 321)
* Pascal:                                Summary.             (line  35)
* Pascal objects, static members display: Print Settings.     (line 457)
* Pascal support in GDB, limitations:    Pascal.              (line   6)
* pass signals to inferior, remote request: General Query Packets.
                                                              (line 269)
* patching binaries:                     Patching.            (line   6)
* patching object files:                 Files.               (line  26)
* pause current task (GNU Hurd):         Hurd Native.         (line  49)
* pause current thread (GNU Hurd):       Hurd Native.         (line  91)
* pauses in output:                      Screen Size.         (line   6)
* pending breakpoints:                   Set Breaks.          (line 234)
* physical address from linear address:  DJGPP Native.        (line  81)
* physname:                              Debugging Output.    (line  35)
* pipe, target remote to:                Connecting.          (line  60)
* pipes:                                 Starting.            (line  62)
* pointer values, in file-i/o protocol:  Pointer Values.      (line   6)
* pointer, finding referent:             Print Settings.      (line  79)
* port rights, GNU Hurd:                 Hurd Native.         (line  85)
* port sets, GNU Hurd:                   Hurd Native.         (line  85)
* PowerPC architecture:                  PowerPC.             (line   6)
* prefix for data files:                 Data Files.          (line   6)
* prefix for shared library file names:  Files.               (line 374)
* premature return from system calls:    Interrupted System Calls.
                                                              (line   6)
* preprocessor macro expansion, showing the results of: Macros.
                                                              (line  29)
* pretty print arrays:                   Print Settings.      (line  98)
* pretty print C++ virtual function tables: Print Settings.   (line 468)
* pretty-printer commands:               Pretty-Printer Commands.
                                                              (line   6)
* print all frame argument values:       Print Settings.      (line 135)
* print an Objective-C object description: The Print Command with Objective-C.
                                                              (line  11)
* print array indexes:                   Print Settings.      (line 108)
* print frame argument values for scalars only: Print Settings.
                                                              (line 135)
* print list of auto-loaded scripts:     Auto-loading.        (line  29)
* print messages on inferior start and exit: Inferiors and Programs.
                                                              (line 117)
* print messages on thread start and exit: Threads.           (line 156)
* print settings:                        Print Settings.      (line   6)
* print structures in indented form:     Print Settings.      (line 299)
* print/don't print memory addresses:    Print Settings.      (line  13)
* printing byte arrays:                  Output Formats.      (line  60)
* printing data:                         Data.                (line   6)
* printing frame argument values:        Print Settings.      (line 135)
* printing strings:                      Output Formats.      (line  60)
* probe static tracepoint marker:        Create and Delete Tracepoints.
                                                              (line  76)
* probing markers, static tracepoints:   Set Tracepoints.     (line  28)
* process detailed status information:   SVR4 Process Information.
                                                              (line  40)
* process ID:                            SVR4 Process Information.
                                                              (line  16)
* process info via /proc:                SVR4 Process Information.
                                                              (line   6)
* process list, QNX Neutrino:            SVR4 Process Information.
                                                              (line  74)
* process record and replay:             Process Record and Replay.
                                                              (line   6)
* process status register:               Registers.           (line  26)
* processes, multiple:                   Forks.               (line   6)
* procfs API calls:                      SVR4 Process Information.
                                                              (line  53)
* profiling GDB:                         Maintenance Commands.
                                                              (line 295)
* program counter register:              Registers.           (line  26)
* program entry point:                   Backtrace.           (line  93)
* programming in python:                 Python API.          (line   6)
* progspaces in python:                  Progspaces In Python.
                                                              (line   6)
* prompt:                                Prompt.              (line   6)
* protocol basics, file-i/o:             Protocol Basics.     (line   6)
* protocol, GDB remote serial:           Overview.            (line  14)
* protocol-specific representation of datatypes, in file-i/o protocol: Protocol-specific Representation of Datatypes.
                                                              (line   6)
* ptrace system call:                    OS Information.      (line   9)
* python api:                            Python API.          (line   6)
* python commands <1>:                   Commands In Python.  (line   6)
* python commands:                       Python Commands.     (line   6)
* python convenience functions:          Functions In Python. (line   6)
* python directory:                      Python.              (line  10)
* python exceptions:                     Exception Handling.  (line   6)
* python finish breakpoints:             Finish Breakpoints in Python.
                                                              (line   6)
* python functions:                      Basic Python.        (line   6)
* python module:                         Basic Python.        (line   6)
* python modules:                        Python modules.      (line   6)
* python pagination:                     Python API.          (line   6)
* python parameters:                     Parameters In Python.
                                                              (line   6)
* python scripting:                      Python.              (line   6)
* python stdout:                         Python API.          (line   6)
* Python, working with types:            Types In Python.     (line   6)
* python, working with values from inferior: Values From Inferior.
                                                              (line   6)
* Q packet:                              Packets.             (line 289)
* q packet:                              Packets.             (line 289)
* QAllow packet:                         General Query Packets.
                                                              (line  41)
* qAttached packet:                      General Query Packets.
                                                              (line 924)
* qC packet:                             General Query Packets.
                                                              (line  52)
* qCRC packet:                           General Query Packets.
                                                              (line  63)
* QDisableRandomization packet:          General Query Packets.
                                                              (line  83)
* qfThreadInfo packet:                   General Query Packets.
                                                              (line 113)
* qGetTIBAddr packet:                    General Query Packets.
                                                              (line 172)
* qGetTLSAddr packet:                    General Query Packets.
                                                              (line 141)
* QNonStop packet:                       General Query Packets.
                                                              (line 249)
* QNX Neutrino:                          Neutrino.            (line   6)
* qOffsets packet:                       General Query Packets.
                                                              (line 211)
* qP packet:                             General Query Packets.
                                                              (line 238)
* QPassSignals packet:                   General Query Packets.
                                                              (line 269)
* qRcmd packet:                          General Query Packets.
                                                              (line 297)
* qSearch:memory packet:                 General Query Packets.
                                                              (line 322)
* QStartNoAckMode packet:                General Query Packets.
                                                              (line 342)
* qsThreadInfo packet:                   General Query Packets.
                                                              (line 113)
* qSupported packet:                     General Query Packets.
                                                              (line 357)
* qSymbol packet:                        General Query Packets.
                                                              (line 626)
* QTDPsrc packet:                        Tracepoint Packets.  (line  96)
* QTDV packet:                           Tracepoint Packets.  (line 127)
* qThreadExtraInfo packet:               General Query Packets.
                                                              (line 672)
* qTP packet:                            Tracepoint Packets.  (line 316)
* qTV packet:                            Tracepoint Packets.  (line 328)
* query attached, remote request:        General Query Packets.
                                                              (line 924)
* quotes in commands:                    Completion.          (line  57)
* quoting Ada internal identifiers:      Additions to Ada.    (line  76)
* quoting names:                         Symbols.             (line  14)
* qXfer packet:                          General Query Packets.
                                                              (line 714)
* R packet:                              Packets.             (line 298)
* r packet:                              Packets.             (line 293)
* raise exceptions:                      Set Catchpoints.     (line 197)
* range checking:                        Type Checking.       (line  65)
* ranged breakpoint:                     PowerPC Embedded.    (line  33)
* ranges of breakpoints:                 Breakpoints.         (line  48)
* Ravenscar Profile:                     Ravenscar Profile.   (line   6)
* raw printing:                          Output Formats.      (line  70)
* RDI heartbeat:                         ARM.                 (line 112)
* read special object, remote request:   General Query Packets.
                                                              (line 714)
* read, file-i/o system call:            read.                (line   6)
* read-only sections:                    Files.               (line 258)
* reading symbols from relocatable object files: Files.       (line 132)
* reading symbols immediately:           Files.               (line  90)
* readline:                              Editing.             (line   6)
* receive rights, GNU Hurd:              Hurd Native.         (line  85)
* recent tracepoint number:              Create and Delete Tracepoints.
                                                              (line 123)
* record aggregates (Ada):               Omissions from Ada.  (line  44)
* record mode:                           Process Record and Replay.
                                                              (line  19)
* record serial communications on file:  Remote Configuration.
                                                              (line  57)
* recording a session script:            Bug Reporting.       (line  89)
* recording inferior's execution and replaying it: Process Record and Replay.
                                                              (line   6)
* redirection:                           Input/Output.        (line   6)
* reference card:                        Formatting Documentation.
                                                              (line   6)
* reference declarations:                C Plus Plus Expressions.
                                                              (line  50)
* register stack, AMD29K:                A29K.                (line   6)
* registers:                             Registers.           (line   6)
* regular expression:                    Set Breaks.          (line  92)
* reloading symbols:                     Symbols.             (line 260)
* reloading the overlay table:           Overlay Commands.    (line  52)
* relocatable object files, reading symbols from: Files.      (line 132)
* remote connection without stubs:       Server.              (line   6)
* remote debugging:                      Remote Debugging.    (line   6)
* remote memory comparison:              Memory.              (line 123)
* remote monitor prompt:                 MIPS Embedded.       (line 107)
* remote packets, enabling and disabling: Remote Configuration.
                                                              (line 141)
* remote programs, interrupting:         Connecting.          (line  78)
* remote protocol debugging:             Debugging Output.    (line 133)
* remote protocol, binary data:          Overview.            (line  61)
* remote protocol, field separator:      Overview.            (line  53)
* remote query requests:                 General Query Packets.
                                                              (line   6)
* remote serial debugging summary:       Debug Session.       (line   6)
* remote serial debugging, overview:     Remote Stub.         (line  14)
* remote serial protocol:                Overview.            (line  14)
* remote serial stub:                    Stub Contents.       (line   6)
* remote serial stub list:               Remote Stub.         (line  54)
* remote serial stub, initialization:    Stub Contents.       (line  10)
* remote serial stub, main routine:      Stub Contents.       (line  15)
* remote stub, example:                  Remote Stub.         (line   6)
* remote stub, support routines:         Bootstrapping.       (line   6)
* remote target:                         Target Commands.     (line  58)
* remote target, file transfer:          File Transfer.       (line   6)
* remote target, limit break- and watchpoints: Remote Configuration.
                                                              (line  72)
* remote target, limit watchpoints length: Remote Configuration.
                                                              (line  77)
* remote timeout:                        Remote Configuration.
                                                              (line  65)
* remove actions from a tracepoint:      Tracepoint Actions.  (line  21)
* rename, file-i/o system call:          rename.              (line   6)
* Renesas:                               Remote Stub.         (line  63)
* repeated array elements:               Print Settings.      (line 277)
* repeating command sequences:           Command Syntax.      (line  42)
* repeating commands:                    Command Syntax.      (line  21)
* replay log events, remote reply:       Stop Reply Packets.  (line  61)
* replay mode:                           Process Record and Replay.
                                                              (line  10)
* reporting bugs in GDB:                 GDB Bugs.            (line   6)
* reprint the last value:                Data.                (line  23)
* reset SDI connection, M32R:            M32R/D.              (line  44)
* response time, MIPS debugging:         MIPS.                (line  10)
* restart:                               Checkpoint/Restart.  (line   6)
* restore data from a file:              Dump/Restore Files.  (line   6)
* result records in GDB/MI:              GDB/MI Result Records.
                                                              (line   6)
* resume threads of multiple processes simultaneously: All-Stop Mode.
                                                              (line  53)
* resuming execution:                    Continuing and Stepping.
                                                              (line   6)
* retransmit-timeout, MIPS protocol:     MIPS Embedded.       (line  83)
* returning from a function:             Returning.           (line   6)
* reverse execution:                     Reverse Execution.   (line   6)
* rewind program state:                  Checkpoint/Restart.  (line   6)
* ROM at zero address, RDI:              ARM.                 (line 102)
* run to main procedure:                 Starting.            (line  79)
* run until specified location:          Continuing and Stepping.
                                                              (line 118)
* running:                               Starting.            (line   6)
* running and debugging Sparclet programs: Sparclet Execution.
                                                              (line   6)
* running programs backward:             Reverse Execution.   (line   6)
* running VxWorks tasks:                 VxWorks Attach.      (line   6)
* running, on Sparclet:                  Sparclet.            (line  28)
* S packet:                              Packets.             (line 314)
* s packet:                              Packets.             (line 305)
* save breakpoints to a file for future sessions: Save Breakpoints.
                                                              (line   9)
* save command history:                  Command History.     (line  36)
* save GDB output to a file:             Logging Output.      (line   6)
* save tracepoints for future sessions:  save tracepoints.    (line   6)
* scheduler locking mode:                All-Stop Mode.       (line  37)
* scope:                                 M2 Scope.            (line   6)
* scripting commands:                    Command Files.       (line   6)
* scripting with python:                 Python.              (line   6)
* SDS protocol:                          PowerPC Embedded.    (line  83)
* search for a thread:                   Threads.             (line 142)
* search path for libthread_db:          Threads.             (line 177)
* searching memory:                      Searching Memory.    (line   6)
* searching memory, in remote debugging: General Query Packets.
                                                              (line 322)
* searching source files:                Search.              (line   6)
* section offsets, remote request:       General Query Packets.
                                                              (line 211)
* segment descriptor tables:             DJGPP Native.        (line  24)
* select Ctrl-C, BREAK or BREAK-g:       Remote Configuration.
                                                              (line  94)
* select trace snapshot:                 tfind.               (line   6)
* selected frame:                        Stack.               (line  19)
* selecting frame silently:              Frames.              (line  51)
* send command to remote monitor:        Connecting.          (line 105)
* send command to simulator:             Embedded Processors. (line   9)
* send interrupt-sequence on start:      Remote Configuration.
                                                              (line 107)
* send PMON command:                     MIPS Embedded.       (line 132)
* send rights, GNU Hurd:                 Hurd Native.         (line  85)
* sending files to remote systems:       File Transfer.       (line   6)
* separate debugging information files:  Separate Debug Files.
                                                              (line   6)
* sequence-id, for GDB remote:           Overview.            (line  29)
* serial connections, debugging:         Debugging Output.    (line 133)
* serial line, target remote:            Connecting.          (line  18)
* serial protocol, GDB remote:           Overview.            (line  14)
* server prefix:                         Server Prefix.       (line   6)
* server, command prefix:                Command History.     (line  20)
* set ABI for MIPS:                      MIPS.                (line  32)
* set breakpoints in many functions:     Set Breaks.          (line  92)
* set breakpoints on all functions:      Set Breaks.          (line 112)
* set fast tracepoint:                   Create and Delete Tracepoints.
                                                              (line  51)
* set inferior controlling terminal:     Input/Output.        (line  44)
* set static tracepoint:                 Create and Delete Tracepoints.
                                                              (line  76)
* set tdesc filename:                    Retrieving Descriptions.
                                                              (line  18)
* set tracepoint:                        Create and Delete Tracepoints.
                                                              (line   6)
* setting variables:                     Assignment.          (line   6)
* setting watchpoints:                   Set Watchpoints.     (line   6)
* SH:                                    Remote Stub.         (line  63)
* sh-stub.c:                             Remote Stub.         (line  63)
* shared libraries:                      Files.               (line 281)
* shared library events, remote reply:   Stop Reply Packets.  (line  56)
* shell escape:                          Shell Commands.      (line  10)
* show all convenience functions:        Convenience Vars.    (line 112)
* show all user variables:               Convenience Vars.    (line  37)
* show last commands:                    Command History.     (line  78)
* show tdesc filename:                   Retrieving Descriptions.
                                                              (line  25)
* signals:                               Signals.             (line   6)
* SIGQUIT signal, dump core of GDB:      Maintenance Commands.
                                                              (line  99)
* simulator, Z8000:                      Z8000.               (line   6)
* size of remote memory accesses:        Packets.             (line 235)
* size of screen:                        Screen Size.         (line   6)
* skipping over functions and files:     Skipping Over Functions and Files.
                                                              (line   6)
* snapshot of a process:                 Checkpoint/Restart.  (line   6)
* software watchpoints:                  Set Watchpoints.     (line  31)
* source file and line of a symbol:      Print Settings.      (line  51)
* source line and its code address:      Machine Code.        (line   6)
* source path:                           Source Path.         (line   6)
* Sparc:                                 Remote Stub.         (line  66)
* sparc-stub.c:                          Remote Stub.         (line  66)
* sparcl-stub.c:                         Remote Stub.         (line  69)
* Sparclet:                              Sparclet.            (line   6)
* SparcLite:                             Remote Stub.         (line  69)
* Special Fortran commands:              Special Fortran Commands.
                                                              (line   6)
* specifying location:                   Specify Location.    (line   6)
* SPU:                                   SPU.                 (line   6)
* SSE registers (x86):                   Registers.           (line  71)
* stack frame:                           Frames.              (line   6)
* stack on Alpha:                        MIPS.                (line   6)
* stack on MIPS:                         MIPS.                (line   6)
* stack pointer register:                Registers.           (line  26)
* stacking targets:                      Active Targets.      (line   6)
* standard registers:                    Registers.           (line  26)
* start a new trace experiment:          Starting and Stopping Trace Experiments.
                                                              (line   6)
* starting:                              Starting.            (line   6)
* startup code, and backtrace:           Backtrace.           (line  93)
* stat, file-i/o system call:            stat/fstat.          (line   6)
* static members of C++ objects:         Print Settings.      (line 446)
* static members of Pascal objects:      Print Settings.      (line 457)
* static tracepoints:                    Set Tracepoints.     (line  28)
* static tracepoints, in remote protocol: General Query Packets.
                                                              (line 608)
* static tracepoints, setting:           Create and Delete Tracepoints.
                                                              (line  76)
* status of trace data collection:       Starting and Stopping Trace Experiments.
                                                              (line  27)
* status output in GDB/MI:               GDB/MI Output Syntax.
                                                              (line  94)
* stepping:                              Continuing and Stepping.
                                                              (line   6)
* stepping into functions with no line info: Continuing and Stepping.
                                                              (line  93)
* stop a running trace experiment:       Starting and Stopping Trace Experiments.
                                                              (line  16)
* stop on C++ exceptions:                Set Catchpoints.     (line  13)
* stop reply packets:                    Stop Reply Packets.  (line   6)
* stopped threads:                       Thread Stops.        (line   6)
* stream records in GDB/MI:              GDB/MI Stream Records.
                                                              (line   6)
* string tracing, in remote protocol:    General Query Packets.
                                                              (line 620)
* struct gdb_reader_funcs:               Writing JIT Debug Info Readers.
                                                              (line  22)
* struct gdb_symbol_callbacks:           Writing JIT Debug Info Readers.
                                                              (line  43)
* struct gdb_unwind_callbacks:           Writing JIT Debug Info Readers.
                                                              (line  43)
* struct return convention:              i386.                (line   7)
* struct stat, in file-i/o protocol:     struct stat.         (line   6)
* struct timeval, in file-i/o protocol:  struct timeval.      (line   6)
* struct user contents:                  OS Information.      (line   9)
* struct/union returned in registers:    i386.                (line   7)
* structure field name completion:       Completion.          (line  96)
* stub example, remote debugging:        Remote Stub.         (line   6)
* stupid questions:                      Messages/Warnings.   (line  50)
* Super-H:                               Super-H.             (line   6)
* supported packets, remote query:       General Query Packets.
                                                              (line 357)
* switching threads:                     Threads.             (line   6)
* switching threads automatically:       All-Stop Mode.       (line  28)
* symbol decoding style, C++:            Print Settings.      (line 397)
* symbol dump:                           Symbols.             (line 302)
* symbol from address:                   Symbols.             (line  54)
* symbol lookup, remote request:         General Query Packets.
                                                              (line 626)
* symbol names:                          Symbols.             (line  14)
* symbol table:                          Files.               (line   6)
* symbol tables in python:               Symbol Tables In Python.
                                                              (line   6)
* symbol tables, listing GDB's internal: Symbols.             (line 321)
* symbol, source file and line:          Print Settings.      (line  51)
* symbols in python:                     Symbols In Python.   (line   6)
* symbols, reading from relocatable object files: Files.      (line 132)
* symbols, reading immediately:          Files.               (line  90)
* synchronize with remote MIPS target:   MIPS Embedded.       (line  98)
* syscall DSO:                           Files.               (line 162)
* system calls and thread breakpoints:   Interrupted System Calls.
                                                              (line   6)
* system root, alternate:                Files.               (line 374)
* system, file-i/o system call:          system.              (line   6)
* system-wide init file:                 System-wide configuration.
                                                              (line   6)
* T packet:                              Packets.             (line 329)
* t packet:                              Packets.             (line 324)
* T packet reply:                        Stop Reply Packets.  (line  22)
* tail call frames, debugging:           Tail Call Frames.    (line   6)
* target architecture:                   Targets.             (line  17)
* target byte order:                     Byte Order.          (line   6)
* target character set:                  Character Sets.      (line   6)
* target debugging info:                 Debugging Output.    (line 158)
* target descriptions:                   Target Descriptions. (line   6)
* target descriptions, ARM features:     ARM Features.        (line   6)
* target descriptions, i386 features:    i386 Features.       (line   6)
* target descriptions, inclusion:        Target Description Format.
                                                              (line  54)
* target descriptions, M68K features:    M68K Features.       (line   6)
* target descriptions, MIPS features:    MIPS Features.       (line   6)
* target descriptions, PowerPC features: PowerPC Features.    (line   6)
* target descriptions, predefined types: Predefined Target Types.
                                                              (line   6)
* target descriptions, standard features: Standard Target Features.
                                                              (line   6)
* target descriptions, TIC6x features:   TIC6x Features.      (line   6)
* target descriptions, TMS320C6x features: TIC6x Features.    (line   6)
* target descriptions, XML format:       Target Description Format.
                                                              (line   6)
* target output in GDB/MI:               GDB/MI Output Syntax.
                                                              (line 110)
* target remote:                         Connecting.          (line  11)
* target stack description:              Maintenance Commands.
                                                              (line 240)
* task attributes (GNU Hurd):            Hurd Native.         (line  49)
* task breakpoints, in Ada:              Ada Tasks.           (line 135)
* task exception port, GNU Hurd:         Hurd Native.         (line  68)
* task suspend count:                    Hurd Native.         (line  60)
* task switching with program using Ravenscar Profile: Ravenscar Profile.
                                                              (line  10)
* TCP port, target remote:               Connecting.          (line  29)
* terminal:                              Input/Output.        (line   6)
* Text User Interface:                   TUI.                 (line   6)
* thread attributes info, remote request: General Query Packets.
                                                              (line 672)
* thread breakpoints:                    Thread-Specific Breakpoints.
                                                              (line  10)
* thread breakpoints and system calls:   Interrupted System Calls.
                                                              (line   6)
* thread default settings, GNU Hurd:     Hurd Native.         (line 131)
* thread identifier (GDB):               Threads.             (line  63)
* thread identifier (system):            Threads.             (line  51)
* thread info (Solaris):                 Threads.             (line  98)
* thread information, remote request:    General Query Packets.
                                                              (line 238)
* thread list format:                    Thread List Format.  (line   6)
* thread number:                         Threads.             (line  63)
* thread properties, GNU Hurd:           Hurd Native.         (line  91)
* thread suspend count, GNU Hurd:        Hurd Native.         (line 110)
* THREAD-ID, in remote protocol:         Packets.             (line  20)
* threads and watchpoints:               Set Watchpoints.     (line 180)
* threads in python:                     Threads In Python.   (line   6)
* threads of execution:                  Threads.             (line   6)
* threads, automatic switching:          All-Stop Mode.       (line  28)
* threads, continuing:                   Thread Stops.        (line   6)
* threads, stopped:                      Thread Stops.        (line   6)
* time of command execution:             Maintenance Commands.
                                                              (line 332)
* timeout for commands:                  Maintenance Commands.
                                                              (line 363)
* timeout for serial communications:     Remote Configuration.
                                                              (line  65)
* timeout, for remote target connection: Remote Configuration.
                                                              (line 132)
* timeout, MIPS protocol:                MIPS Embedded.       (line  83)
* timestampping debugging info:          Debugging Output.    (line 169)
* trace experiment, status of:           Starting and Stopping Trace Experiments.
                                                              (line  27)
* trace file format:                     Trace File Format.   (line   6)
* trace files:                           Trace Files.         (line   6)
* trace state variable value, remote request: Tracepoint Packets.
                                                              (line 328)
* trace state variables:                 Trace State Variables.
                                                              (line   6)
* traceback:                             Backtrace.           (line   6)
* traceframe info format:                Traceframe Info Format.
                                                              (line   6)
* tracepoint actions:                    Tracepoint Actions.  (line   6)
* tracepoint conditions:                 Tracepoint Conditions.
                                                              (line   6)
* tracepoint data, display:              tdump.               (line   6)
* tracepoint deletion:                   Create and Delete Tracepoints.
                                                              (line 126)
* tracepoint number:                     Create and Delete Tracepoints.
                                                              (line 123)
* tracepoint packets:                    Tracepoint Packets.  (line   6)
* tracepoint pass count:                 Tracepoint Passcounts.
                                                              (line   6)
* tracepoint restrictions:               Tracepoint Restrictions.
                                                              (line   6)
* tracepoint status, remote request:     Tracepoint Packets.  (line 316)
* tracepoint variables:                  Tracepoint Variables.
                                                              (line   6)
* tracepoints:                           Tracepoints.         (line   6)
* tracepoints support in gdbserver:      Server.              (line 242)
* trailing underscore, in Fortran symbols: Fortran.           (line   9)
* translating between character sets:    Character Sets.      (line   6)
* TUI:                                   TUI.                 (line   6)
* TUI commands:                          TUI Commands.        (line   6)
* TUI configuration variables:           TUI Configuration.   (line   6)
* TUI key bindings:                      TUI Keys.            (line   6)
* TUI single key mode:                   TUI Single Key Mode. (line   6)
* type casting memory:                   Expressions.         (line  43)
* type chain of a data type:             Maintenance Commands.
                                                              (line 252)
* type checking:                         Checks.              (line  31)
* type conversions in C++:               C Plus Plus Expressions.
                                                              (line  26)
* types in Python:                       Types In Python.     (line   6)
* UDP port, target remote:               Connecting.          (line  49)
* union field name completion:           Completion.          (line  96)
* unions in structures, printing:        Print Settings.      (line 337)
* unknown address, locating:             Output Formats.      (line  35)
* unlink, file-i/o system call:          unlink.              (line   6)
* unlinked object files:                 Files.               (line  26)
* unload symbols from shared libraries:  Files.               (line 341)
* unmap an overlay:                      Overlay Commands.    (line  39)
* unmapped overlays:                     How Overlays Work.   (line   6)
* unset tdesc filename:                  Retrieving Descriptions.
                                                              (line  21)
* unsupported languages:                 Unsupported Languages.
                                                              (line   6)
* unwind stack in called functions:      Calling.             (line  35)
* unwind stack in called functions with unhandled exceptions: Calling.
                                                              (line  46)
* use only software watchpoints:         Set Watchpoints.     (line 108)
* user-defined command:                  Define.              (line   6)
* user-defined macros:                   Macros.              (line  59)
* user-defined variables:                Convenience Vars.    (line   6)
* value history:                         Value History.       (line   6)
* values from inferior, with Python:     Values From Inferior.
                                                              (line   6)
* variable name conflict:                Variables.           (line  36)
* variable object debugging info:        Debugging Output.    (line 178)
* variable objects in GDB/MI:            GDB/MI Variable Objects.
                                                              (line   9)
* variable values, wrong:                Variables.           (line  58)
* variables, readline:                   Readline Init File Syntax.
                                                              (line  34)
* variables, setting:                    Assignment.          (line  16)
* vAttach packet:                        Packets.             (line 344)
* vCont packet:                          Packets.             (line 364)
* vCont? packet:                         Packets.             (line 406)
* vector unit:                           Vector Unit.         (line   6)
* vector, auxiliary:                     OS Information.      (line  21)
* verbose operation:                     Messages/Warnings.   (line   6)
* verify remote memory image:            Memory.              (line 123)
* vFile packet:                          Packets.             (line 417)
* vFlashDone packet:                     Packets.             (line 465)
* vFlashErase packet:                    Packets.             (line 421)
* vFlashWrite packet:                    Packets.             (line 443)
* virtual functions (C++) display:       Print Settings.      (line 468)
* vKill packet:                          Packets.             (line 473)
* vRun packet:                           Packets.             (line 486)
* vStopped packet:                       Packets.             (line 503)
* VTBL display:                          Print Settings.      (line 468)
* VxWorks:                               VxWorks.             (line   6)
* watchdog timer:                        Maintenance Commands.
                                                              (line 363)
* watchpoints:                           Breakpoints.         (line  20)
* watchpoints and threads:               Set Watchpoints.     (line 180)
* weak alias functions:                  Calling.             (line  58)
* where to look for shared libraries:    Files.               (line 369)
* wild pointer, interpreting:            Print Settings.      (line  79)
* word completion:                       Completion.          (line   6)
* working directory:                     Source Path.         (line 108)
* working directory (of your program):   Working Directory.   (line   6)
* working language:                      Languages.           (line  13)
* write data into object, remote request: General Query Packets.
                                                              (line 870)
* write, file-i/o system call:           write.               (line   6)
* writing a pretty-printer:              Writing a Pretty-Printer.
                                                              (line   6)
* writing convenience functions:         Functions In Python. (line   6)
* writing into corefiles:                Patching.            (line   6)
* writing into executables:              Patching.            (line   6)
* writing JIT debug info readers:        Writing JIT Debug Info Readers.
                                                              (line   6)
* wrong values:                          Variables.           (line  58)
* x command, default address:            Machine Code.        (line  30)
* X packet:                              Packets.             (line 515)
* Xilinx MicroBlaze:                     MicroBlaze.          (line   6)
* XInclude:                              Target Description Format.
                                                              (line  54)
* XMD, Xilinx Microprocessor Debugger:   MicroBlaze.          (line   6)
* XML parser debugging:                  Debugging Output.    (line 186)
* yanking text:                          Readline Killing Commands.
                                                              (line   6)
* z packet:                              Packets.             (line 528)
* Z packets:                             Packets.             (line 528)
* Z0 packet:                             Packets.             (line 543)
* z0 packet:                             Packets.             (line 543)
* Z1 packet:                             Packets.             (line 571)
* z1 packet:                             Packets.             (line 571)
* Z2 packet:                             Packets.             (line 593)
* z2 packet:                             Packets.             (line 593)
* Z3 packet:                             Packets.             (line 608)
* z3 packet:                             Packets.             (line 608)
* Z4 packet:                             Packets.             (line 623)
* z4 packet:                             Packets.             (line 623)
* Z8000:                                 Z8000.               (line   6)
* Zilog Z8000 simulator:                 Z8000.               (line   6)
* {TYPE}:                                Expressions.         (line  43)


File: gdb.info,  Node: Command and Variable Index,  Prev: Concept Index,  Up: Top

Command, Variable, and Function Index
*************************************

 [index ]
* Menu:

* !:                                     Shell Commands.      (line  10)
* # (a comment):                         Command Syntax.      (line  38)
* $_, convenience variable:              Convenience Vars.    (line  64)
* $__, convenience variable:             Convenience Vars.    (line  73)
* $_exitcode, convenience variable:      Convenience Vars.    (line  79)
* $_sdata, collect:                      Tracepoint Actions.  (line  69)
* $_sdata, inspect, convenience variable: Convenience Vars.   (line  83)
* $_siginfo, convenience variable:       Convenience Vars.    (line  89)
* $_thread, convenience variable:        Threads.             (line 116)
* $_tlb, convenience variable:           Convenience Vars.    (line  95)
* $bpnum, convenience variable:          Set Breaks.          (line   6)
* $cdir, convenience variable:           Source Path.         (line 108)
* $cwd, convenience variable:            Source Path.         (line 108)
* $tpnum:                                Create and Delete Tracepoints.
                                                              (line 123)
* $trace_file:                           Tracepoint Variables.
                                                              (line  16)
* $trace_frame:                          Tracepoint Variables.
                                                              (line   6)
* $trace_func:                           Tracepoint Variables.
                                                              (line  19)
* $trace_line:                           Tracepoint Variables.
                                                              (line  13)
* $tracepoint:                           Tracepoint Variables.
                                                              (line  10)
* -ada-task-info:                        GDB/MI Ada Tasking Commands.
                                                              (line   9)
* -add-inferior:                         GDB/MI Miscellaneous Commands.
                                                              (line 294)
* -break-after:                          GDB/MI Breakpoint Commands.
                                                              (line  11)
* -break-commands:                       GDB/MI Breakpoint Commands.
                                                              (line  55)
* -break-condition:                      GDB/MI Breakpoint Commands.
                                                              (line  88)
* -break-delete:                         GDB/MI Breakpoint Commands.
                                                              (line 125)
* -break-disable:                        GDB/MI Breakpoint Commands.
                                                              (line 159)
* -break-enable:                         GDB/MI Breakpoint Commands.
                                                              (line 195)
* -break-info:                           GDB/MI Breakpoint Commands.
                                                              (line 230)
* -break-insert:                         GDB/MI Breakpoint Commands.
                                                              (line 250)
* -break-list:                           GDB/MI Breakpoint Commands.
                                                              (line 355)
* -break-passcount:                      GDB/MI Breakpoint Commands.
                                                              (line 430)
* -break-watch:                          GDB/MI Breakpoint Commands.
                                                              (line 442)
* -data-disassemble:                     GDB/MI Data Manipulation.
                                                              (line  12)
* -data-evaluate-expression:             GDB/MI Data Manipulation.
                                                              (line 141)
* -data-list-changed-registers:          GDB/MI Data Manipulation.
                                                              (line 179)
* -data-list-register-names:             GDB/MI Data Manipulation.
                                                              (line 215)
* -data-list-register-values:            GDB/MI Data Manipulation.
                                                              (line 255)
* -data-read-memory:                     GDB/MI Data Manipulation.
                                                              (line 345)
* -data-read-memory-bytes:               GDB/MI Data Manipulation.
                                                              (line 452)
* -data-write-memory-bytes:              GDB/MI Data Manipulation.
                                                              (line 527)
* -enable-pretty-printing:               GDB/MI Variable Objects.
                                                              (line 116)
* -enable-timings:                       GDB/MI Miscellaneous Commands.
                                                              (line 390)
* -environment-cd:                       GDB/MI Program Context.
                                                              (line  33)
* -environment-directory:                GDB/MI Program Context.
                                                              (line  56)
* -environment-path:                     GDB/MI Program Context.
                                                              (line 100)
* -environment-pwd:                      GDB/MI Program Context.
                                                              (line 141)
* -exec-arguments:                       GDB/MI Program Context.
                                                              (line   9)
* -exec-continue:                        GDB/MI Program Execution.
                                                              (line  13)
* -exec-finish:                          GDB/MI Program Execution.
                                                              (line  56)
* -exec-interrupt:                       GDB/MI Program Execution.
                                                              (line  99)
* -exec-jump:                            GDB/MI Program Execution.
                                                              (line 149)
* -exec-next:                            GDB/MI Program Execution.
                                                              (line 173)
* -exec-next-instruction:                GDB/MI Program Execution.
                                                              (line 204)
* -exec-return:                          GDB/MI Program Execution.
                                                              (line 240)
* -exec-run:                             GDB/MI Program Execution.
                                                              (line 283)
* -exec-step:                            GDB/MI Program Execution.
                                                              (line 348)
* -exec-step-instruction:                GDB/MI Program Execution.
                                                              (line 390)
* -exec-until:                           GDB/MI Program Execution.
                                                              (line 431)
* -file-exec-and-symbols:                GDB/MI File Commands.
                                                              (line  12)
* -file-exec-file:                       GDB/MI File Commands.
                                                              (line  40)
* -file-list-exec-source-file:           GDB/MI File Commands.
                                                              (line  67)
* -file-list-exec-source-files:          GDB/MI File Commands.
                                                              (line  93)
* -file-symbol-file:                     GDB/MI File Commands.
                                                              (line 123)
* -gdb-exit:                             GDB/MI Miscellaneous Commands.
                                                              (line   9)
* -gdb-set:                              GDB/MI Miscellaneous Commands.
                                                              (line  31)
* -gdb-show:                             GDB/MI Miscellaneous Commands.
                                                              (line  54)
* -gdb-version:                          GDB/MI Miscellaneous Commands.
                                                              (line  77)
* -inferior-tty-set:                     GDB/MI Miscellaneous Commands.
                                                              (line 341)
* -inferior-tty-show:                    GDB/MI Miscellaneous Commands.
                                                              (line 364)
* -interpreter-exec:                     GDB/MI Miscellaneous Commands.
                                                              (line 316)
* -list-features:                        GDB/MI Miscellaneous Commands.
                                                              (line 111)
* -list-target-features:                 GDB/MI Miscellaneous Commands.
                                                              (line 160)
* -list-thread-groups:                   GDB/MI Miscellaneous Commands.
                                                              (line 186)
* -stack-info-depth:                     GDB/MI Stack Manipulation.
                                                              (line  35)
* -stack-info-frame:                     GDB/MI Stack Manipulation.
                                                              (line   9)
* -stack-list-arguments:                 GDB/MI Stack Manipulation.
                                                              (line  73)
* -stack-list-frames:                    GDB/MI Stack Manipulation.
                                                              (line 162)
* -stack-list-locals:                    GDB/MI Stack Manipulation.
                                                              (line 265)
* -stack-list-variables:                 GDB/MI Stack Manipulation.
                                                              (line 305)
* -stack-select-frame:                   GDB/MI Stack Manipulation.
                                                              (line 328)
* -symbol-list-lines:                    GDB/MI Symbol Query. (line   9)
* -target-attach:                        GDB/MI Target Manipulation.
                                                              (line   9)
* -target-detach:                        GDB/MI Target Manipulation.
                                                              (line  36)
* -target-disconnect:                    GDB/MI Target Manipulation.
                                                              (line  61)
* -target-download:                      GDB/MI Target Manipulation.
                                                              (line  85)
* -target-file-delete:                   GDB/MI File Transfer Commands.
                                                              (line  57)
* -target-file-get:                      GDB/MI File Transfer Commands.
                                                              (line  33)
* -target-file-put:                      GDB/MI File Transfer Commands.
                                                              (line   9)
* -target-select:                        GDB/MI Target Manipulation.
                                                              (line 198)
* -thread-info:                          GDB/MI Thread Commands.
                                                              (line   9)
* -thread-list-ids:                      GDB/MI Thread Commands.
                                                              (line  90)
* -thread-select:                        GDB/MI Thread Commands.
                                                              (line 118)
* -trace-define-variable:                GDB/MI Tracepoint Commands.
                                                              (line  83)
* -trace-find:                           GDB/MI Tracepoint Commands.
                                                              (line  12)
* -trace-list-variables:                 GDB/MI Tracepoint Commands.
                                                              (line 100)
* -trace-save:                           GDB/MI Tracepoint Commands.
                                                              (line 143)
* -trace-start:                          GDB/MI Tracepoint Commands.
                                                              (line 160)
* -trace-status:                         GDB/MI Tracepoint Commands.
                                                              (line 176)
* -trace-stop:                           GDB/MI Tracepoint Commands.
                                                              (line 244)
* -var-assign:                           GDB/MI Variable Objects.
                                                              (line 474)
* -var-create:                           GDB/MI Variable Objects.
                                                              (line 134)
* -var-delete:                           GDB/MI Variable Objects.
                                                              (line 220)
* -var-evaluate-expression:              GDB/MI Variable Objects.
                                                              (line 453)
* -var-info-expression:                  GDB/MI Variable Objects.
                                                              (line 391)
* -var-info-num-children:                GDB/MI Variable Objects.
                                                              (line 269)
* -var-info-path-expression:             GDB/MI Variable Objects.
                                                              (line 415)
* -var-info-type:                        GDB/MI Variable Objects.
                                                              (line 378)
* -var-list-children:                    GDB/MI Variable Objects.
                                                              (line 285)
* -var-set-format:                       GDB/MI Variable Objects.
                                                              (line 233)
* -var-set-frozen:                       GDB/MI Variable Objects.
                                                              (line 612)
* -var-set-update-range:                 GDB/MI Variable Objects.
                                                              (line 638)
* -var-set-visualizer:                   GDB/MI Variable Objects.
                                                              (line 661)
* -var-show-attributes:                  GDB/MI Variable Objects.
                                                              (line 439)
* -var-show-format:                      GDB/MI Variable Objects.
                                                              (line 256)
* -var-update:                           GDB/MI Variable Objects.
                                                              (line 498)
* @, referencing memory as an array:     Arrays.              (line   6)
* ^connected:                            GDB/MI Result Records.
                                                              (line  22)
* ^done:                                 GDB/MI Result Records.
                                                              (line   9)
* ^error:                                GDB/MI Result Records.
                                                              (line  25)
* ^exit:                                 GDB/MI Result Records.
                                                              (line  29)
* ^running:                              GDB/MI Result Records.
                                                              (line  14)
* abort (C-g):                           Miscellaneous Commands.
                                                              (line  10)
* accept-line (Newline or Return):       Commands For History.
                                                              (line   6)
* actions:                               Tracepoint Actions.  (line   6)
* add-inferior:                          Inferiors and Programs.
                                                              (line  60)
* add-shared-symbol-files:               Files.               (line 172)
* add-symbol-file:                       Files.               (line 113)
* add-symbol-file-from-memory:           Files.               (line 162)
* advance LOCATION:                      Continuing and Stepping.
                                                              (line 181)
* alias:                                 Aliases.             (line  21)
* append:                                Dump/Restore Files.  (line  35)
* apropos:                               Help.                (line  62)
* assf:                                  Files.               (line 172)
* attach:                                Attach.              (line   6)
* attach&:                               Background Execution.
                                                              (line  38)
* awatch:                                Set Watchpoints.     (line  83)
* b (break):                             Set Breaks.          (line   6)
* backtrace:                             Backtrace.           (line  11)
* backward-char (C-b):                   Commands For Moving. (line  15)
* backward-delete-char (Rubout):         Commands For Text.   (line  11)
* backward-kill-line (C-x Rubout):       Commands For Killing.
                                                              (line   9)
* backward-kill-word (M-<DEL>):          Commands For Killing.
                                                              (line  24)
* backward-word (M-b):                   Commands For Moving. (line  22)
* beginning-of-history (M-<):            Commands For History.
                                                              (line  19)
* beginning-of-line (C-a):               Commands For Moving. (line   6)
* bell-style:                            Readline Init File Syntax.
                                                              (line  35)
* bind-tty-special-chars:                Readline Init File Syntax.
                                                              (line  42)
* Block.end:                             Blocks In Python.    (line  40)
* Block.function:                        Blocks In Python.    (line  43)
* Block.global_block:                    Blocks In Python.    (line  53)
* Block.is_global:                       Blocks In Python.    (line  61)
* Block.is_static:                       Blocks In Python.    (line  65)
* Block.is_valid:                        Blocks In Python.    (line  24)
* Block.start:                           Blocks In Python.    (line  36)
* Block.static_block:                    Blocks In Python.    (line  57)
* Block.superblock:                      Blocks In Python.    (line  48)
* BP_ACCESS_WATCHPOINT:                  Breakpoints In Python.
                                                              (line 139)
* BP_BREAKPOINT:                         Breakpoints In Python.
                                                              (line 127)
* BP_HARDWARE_WATCHPOINT:                Breakpoints In Python.
                                                              (line 133)
* BP_READ_WATCHPOINT:                    Breakpoints In Python.
                                                              (line 136)
* BP_WATCHPOINT:                         Breakpoints In Python.
                                                              (line 130)
* break:                                 Set Breaks.          (line   6)
* break ... task TASKNO (Ada):           Ada Tasks.           (line 135)
* break ... thread THREADNO:             Thread-Specific Breakpoints.
                                                              (line  10)
* break, and Objective-C:                Method Names in Commands.
                                                              (line   9)
* break-range:                           PowerPC Embedded.    (line  41)
* breakpoint annotation:                 Annotations for Running.
                                                              (line  47)
* Breakpoint.__init__:                   Breakpoints In Python.
                                                              (line  10)
* Breakpoint.commands:                   Breakpoints In Python.
                                                              (line 165)
* Breakpoint.condition:                  Breakpoints In Python.
                                                              (line 160)
* Breakpoint.delete:                     Breakpoints In Python.
                                                              (line  78)
* Breakpoint.enabled:                    Breakpoints In Python.
                                                              (line  83)
* Breakpoint.expression:                 Breakpoints In Python.
                                                              (line 154)
* Breakpoint.hit_count:                  Breakpoints In Python.
                                                              (line 143)
* Breakpoint.ignore_count:               Breakpoints In Python.
                                                              (line 106)
* Breakpoint.is_valid:                   Breakpoints In Python.
                                                              (line  70)
* Breakpoint.location:                   Breakpoints In Python.
                                                              (line 148)
* Breakpoint.number:                     Breakpoints In Python.
                                                              (line 110)
* Breakpoint.silent:                     Breakpoints In Python.
                                                              (line  87)
* Breakpoint.stop:                       Breakpoints In Python.
                                                              (line  27)
* Breakpoint.task:                       Breakpoints In Python.
                                                              (line 100)
* Breakpoint.thread:                     Breakpoints In Python.
                                                              (line  95)
* Breakpoint.type:                       Breakpoints In Python.
                                                              (line 115)
* Breakpoint.visible:                    Breakpoints In Python.
                                                              (line 120)
* BreakpointEvent.breakpoint:            Events In Python.    (line 113)
* BreakpointEvent.breakpoints:           Events In Python.    (line 107)
* breakpoints-invalid annotation:        Invalidation.        (line  13)
* bt (backtrace):                        Backtrace.           (line  11)
* c (continue):                          Continuing and Stepping.
                                                              (line  15)
* c (SingleKey TUI key):                 TUI Single Key Mode. (line  10)
* C-L:                                   TUI Keys.            (line  65)
* C-x 1:                                 TUI Keys.            (line  19)
* C-x 2:                                 TUI Keys.            (line  26)
* C-x A:                                 TUI Keys.            (line  12)
* C-x a:                                 TUI Keys.            (line  11)
* C-x C-a:                               TUI Keys.            (line  10)
* C-x o:                                 TUI Keys.            (line  34)
* C-x s:                                 TUI Keys.            (line  41)
* call:                                  Calling.             (line  10)
* call-last-kbd-macro (C-x e):           Keyboard Macros.     (line  13)
* capitalize-word (M-c):                 Commands For Text.   (line  49)
* catch:                                 Set Catchpoints.     (line  10)
* cd:                                    Working Directory.   (line  16)
* cdir:                                  Source Path.         (line 108)
* character-search (C-]):                Miscellaneous Commands.
                                                              (line  41)
* character-search-backward (M-C-]):     Miscellaneous Commands.
                                                              (line  46)
* checkpoint:                            Checkpoint/Restart.  (line  26)
* clear:                                 Delete Breaks.       (line  21)
* clear, and Objective-C:                Method Names in Commands.
                                                              (line   9)
* clear-screen (C-l):                    Commands For Moving. (line  26)
* clone-inferior:                        Inferiors and Programs.
                                                              (line  67)
* collect (tracepoints):                 Tracepoint Actions.  (line  49)
* colon-colon, in Modula-2:              M2 Scope.            (line   6)
* Command.__init__:                      Commands In Python.  (line  12)
* Command.complete:                      Commands In Python.  (line  73)
* Command.dont_repeat:                   Commands In Python.  (line  44)
* Command.invoke:                        Commands In Python.  (line  50)
* COMMAND_BREAKPOINTS:                   Commands In Python.  (line 145)
* COMMAND_DATA:                          Commands In Python.  (line 115)
* COMMAND_FILES:                         Commands In Python.  (line 126)
* COMMAND_MAINTENANCE:                   Commands In Python.  (line 163)
* COMMAND_NONE:                          Commands In Python.  (line 105)
* COMMAND_OBSCURE:                       Commands In Python.  (line 157)
* COMMAND_RUNNING:                       Commands In Python.  (line 109)
* COMMAND_STACK:                         Commands In Python.  (line 120)
* COMMAND_STATUS:                        Commands In Python.  (line 139)
* COMMAND_SUPPORT:                       Commands In Python.  (line 132)
* COMMAND_TRACEPOINTS:                   Commands In Python.  (line 151)
* commands:                              Break Commands.      (line  11)
* commands annotation:                   Prompting.           (line  27)
* comment-begin:                         Readline Init File Syntax.
                                                              (line  47)
* compare-sections:                      Memory.              (line 129)
* complete:                              Help.                (line  76)
* complete (<TAB>):                      Commands For Completion.
                                                              (line   6)
* COMPLETE_COMMAND:                      Commands In Python.  (line 184)
* COMPLETE_FILENAME:                     Commands In Python.  (line 177)
* COMPLETE_LOCATION:                     Commands In Python.  (line 180)
* COMPLETE_NONE:                         Commands In Python.  (line 174)
* COMPLETE_SYMBOL:                       Commands In Python.  (line 188)
* completion-display-width:              Readline Init File Syntax.
                                                              (line  52)
* completion-ignore-case:                Readline Init File Syntax.
                                                              (line  59)
* completion-map-case:                   Readline Init File Syntax.
                                                              (line  64)
* completion-prefix-display-length:      Readline Init File Syntax.
                                                              (line  70)
* completion-query-items:                Readline Init File Syntax.
                                                              (line  77)
* condition:                             Conditions.          (line  45)
* continue:                              Continuing and Stepping.
                                                              (line  15)
* continue&:                             Background Execution.
                                                              (line  53)
* convert-meta:                          Readline Init File Syntax.
                                                              (line  87)
* copy-backward-word ():                 Commands For Killing.
                                                              (line  49)
* copy-forward-word ():                  Commands For Killing.
                                                              (line  54)
* copy-region-as-kill ():                Commands For Killing.
                                                              (line  45)
* core-file:                             Files.               (line  97)
* Ctrl-o (operate-and-get-next):         Command Syntax.      (line  42)
* cwd:                                   Source Path.         (line 108)
* d (delete):                            Delete Breaks.       (line  41)
* d (SingleKey TUI key):                 TUI Single Key Mode. (line  13)
* debug_chaos:                           M32R/D.              (line  50)
* define:                                Define.              (line  37)
* delete:                                Delete Breaks.       (line  41)
* delete checkpoint CHECKPOINT-ID:       Checkpoint/Restart.  (line  56)
* delete display:                        Auto Display.        (line  45)
* delete mem:                            Memory Region Attributes.
                                                              (line  34)
* delete tracepoint:                     Create and Delete Tracepoints.
                                                              (line 126)
* delete tvariable:                      Trace State Variables.
                                                              (line  42)
* delete-char (C-d):                     Commands For Text.   (line   6)
* delete-char-or-list ():                Commands For Completion.
                                                              (line  39)
* delete-horizontal-space ():            Commands For Killing.
                                                              (line  37)
* detach:                                Attach.              (line  36)
* detach (remote):                       Connecting.          (line  91)
* detach inferiors INFNO...:             Inferiors and Programs.
                                                              (line  97)
* digit-argument (M-0, M-1, ... M--):    Numeric Arguments.   (line   6)
* dir:                                   Source Path.         (line  39)
* directory:                             Source Path.         (line  39)
* dis (disable):                         Disabling.           (line  38)
* disable:                               Disabling.           (line  38)
* disable display:                       Auto Display.        (line  56)
* disable mem:                           Memory Region Attributes.
                                                              (line  38)
* disable pretty-printer:                Pretty-Printer Commands.
                                                              (line  20)
* disable tracepoint:                    Enable and Disable Tracepoints.
                                                              (line   9)
* disable-completion:                    Readline Init File Syntax.
                                                              (line  93)
* disassemble:                           Machine Code.        (line  36)
* disconnect:                            Connecting.          (line  98)
* display:                               Auto Display.        (line  23)
* dll-symbols:                           Cygwin Native.       (line  38)
* do (down):                             Selection.           (line  40)
* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands.
                                                              (line  14)
* document:                              Define.              (line  49)
* dont-repeat:                           Define.              (line  61)
* Down:                                  TUI Keys.            (line  56)
* down:                                  Selection.           (line  40)
* down-silently:                         Selection.           (line  64)
* downcase-word (M-l):                   Commands For Text.   (line  45)
* dump:                                  Dump/Restore Files.  (line  13)
* dump-functions ():                     Miscellaneous Commands.
                                                              (line  70)
* dump-macros ():                        Miscellaneous Commands.
                                                              (line  82)
* dump-variables ():                     Miscellaneous Commands.
                                                              (line  76)
* e (edit):                              Edit.                (line   6)
* echo:                                  Output.              (line  12)
* edit:                                  Edit.                (line   6)
* editing-mode:                          Readline Init File Syntax.
                                                              (line  98)
* else:                                  Command Files.       (line  75)
* enable:                                Disabling.           (line  45)
* enable display:                        Auto Display.        (line  65)
* enable mem:                            Memory Region Attributes.
                                                              (line  42)
* enable pretty-printer:                 Pretty-Printer Commands.
                                                              (line  25)
* enable tracepoint:                     Enable and Disable Tracepoints.
                                                              (line  19)
* enable-keypad:                         Readline Init File Syntax.
                                                              (line 109)
* end (breakpoint commands):             Break Commands.      (line  11)
* end (if/else/while commands):          Command Files.       (line 104)
* end (user-defined commands):           Define.              (line  49)
* end-kbd-macro (C-x )):                 Keyboard Macros.     (line   9)
* end-of-history (M->):                  Commands For History.
                                                              (line  22)
* end-of-line (C-e):                     Commands For Moving. (line   9)
* error annotation:                      Errors.              (line  10)
* error-begin annotation:                Errors.              (line  22)
* eval:                                  Output.              (line 117)
* EventRegistry.connect:                 Events In Python.    (line  20)
* EventRegistry.disconnect:              Events In Python.    (line  25)
* exceptionHandler:                      Bootstrapping.       (line  38)
* exchange-point-and-mark (C-x C-x):     Miscellaneous Commands.
                                                              (line  36)
* exec-file:                             Files.               (line  39)
* exited annotation:                     Annotations for Running.
                                                              (line  18)
* ExitedEvent:                           Events In Python.    (line  77)
* ExitedEvent.exit_code:                 Events In Python.    (line  70)
* expand-tilde:                          Readline Init File Syntax.
                                                              (line 120)
* f (frame):                             Selection.           (line  11)
* f (SingleKey TUI key):                 TUI Single Key Mode. (line  16)
* fg (resume foreground execution):      Continuing and Stepping.
                                                              (line  15)
* file:                                  Files.               (line  16)
* fin (finish):                          Continuing and Stepping.
                                                              (line 110)
* find:                                  Searching Memory.    (line   9)
* finish:                                Continuing and Stepping.
                                                              (line 110)
* finish&:                               Background Execution.
                                                              (line  56)
* FinishBreakpoint.__init__:             Finish Breakpoints in Python.
                                                              (line  15)
* FinishBreakpoint.out_of_scope:         Finish Breakpoints in Python.
                                                              (line  22)
* FinishBreakpoint.return_value:         Finish Breakpoints in Python.
                                                              (line  39)
* flush_i_cache:                         Bootstrapping.       (line  60)
* flushregs:                             Maintenance Commands.
                                                              (line 212)
* focus:                                 TUI Commands.        (line  40)
* forward-backward-delete-char ():       Commands For Text.   (line  15)
* forward-char (C-f):                    Commands For Moving. (line  12)
* forward-search:                        Search.              (line   9)
* forward-search-history (C-s):          Commands For History.
                                                              (line  30)
* forward-word (M-f):                    Commands For Moving. (line  18)
* frame, command:                        Frames.              (line  45)
* frame, selecting:                      Selection.           (line  11)
* Frame.block:                           Frames In Python.    (line 131)
* Frame.find_sal:                        Frames In Python.    (line 144)
* Frame.function:                        Frames In Python.    (line 134)
* Frame.is_valid:                        Frames In Python.    (line  37)
* Frame.name:                            Frames In Python.    (line  44)
* Frame.newer:                           Frames In Python.    (line 141)
* Frame.older:                           Frames In Python.    (line 138)
* Frame.pc:                              Frames In Python.    (line 128)
* Frame.read_var:                        Frames In Python.    (line 148)
* Frame.select:                          Frames In Python.    (line 156)
* Frame.type:                            Frames In Python.    (line  48)
* Frame.unwind_stop_reason:              Frames In Python.    (line  78)
* frames-invalid annotation:             Invalidation.        (line   9)
* ftrace:                                Create and Delete Tracepoints.
                                                              (line  51)
* Function:                              Functions In Python. (line   6)
* Function.__init__:                     Functions In Python. (line  11)
* Function.invoke:                       Functions In Python. (line  21)
* gcore:                                 Core File Generation.
                                                              (line  18)
* gdb.Block:                             Blocks In Python.    (line   6)
* gdb.block_for_pc:                      Blocks In Python.    (line  16)
* gdb.BP_ACCESS_WATCHPOINT:              Breakpoints In Python.
                                                              (line 139)
* gdb.BP_BREAKPOINT:                     Breakpoints In Python.
                                                              (line 127)
* gdb.BP_HARDWARE_WATCHPOINT:            Breakpoints In Python.
                                                              (line 133)
* gdb.BP_READ_WATCHPOINT:                Breakpoints In Python.
                                                              (line 136)
* gdb.BP_WATCHPOINT:                     Breakpoints In Python.
                                                              (line 130)
* gdb.Breakpoint:                        Breakpoints In Python.
                                                              (line   6)
* gdb.breakpoints:                       Basic Python.        (line  31)
* gdb.COMMAND_BREAKPOINTS:               Commands In Python.  (line 145)
* gdb.COMMAND_DATA:                      Commands In Python.  (line 115)
* gdb.COMMAND_FILES:                     Commands In Python.  (line 126)
* gdb.COMMAND_MAINTENANCE:               Commands In Python.  (line 163)
* gdb.COMMAND_NONE:                      Commands In Python.  (line 105)
* gdb.COMMAND_OBSCURE:                   Commands In Python.  (line 157)
* gdb.COMMAND_RUNNING:                   Commands In Python.  (line 109)
* gdb.COMMAND_STACK:                     Commands In Python.  (line 120)
* gdb.COMMAND_STATUS:                    Commands In Python.  (line 139)
* gdb.COMMAND_SUPPORT:                   Commands In Python.  (line 132)
* gdb.COMMAND_TRACEPOINTS:               Commands In Python.  (line 151)
* gdb.COMPLETE_COMMAND:                  Commands In Python.  (line 184)
* gdb.COMPLETE_FILENAME:                 Commands In Python.  (line 177)
* gdb.COMPLETE_LOCATION:                 Commands In Python.  (line 180)
* gdb.COMPLETE_NONE:                     Commands In Python.  (line 174)
* gdb.COMPLETE_SYMBOL:                   Commands In Python.  (line 188)
* gdb.current_objfile:                   Objfiles In Python.  (line  15)
* gdb.current_progspace:                 Progspaces In Python.
                                                              (line  14)
* gdb.decode_line:                       Basic Python.        (line 157)
* gdb.default_visualizer:                Pretty Printing API. (line  85)
* gdb.error:                             Exception Handling.  (line  22)
* gdb.execute:                           Basic Python.        (line  14)
* gdb.FinishBreakpoint:                  Finish Breakpoints in Python.
                                                              (line   6)
* gdb.flush:                             Basic Python.        (line 121)
* gdb.frame_stop_reason_string:          Frames In Python.    (line  30)
* gdb.Function:                          Functions In Python. (line   6)
* gdb.GdbError:                          Exception Handling.  (line  42)
* gdb.history:                           Basic Python.        (line  46)
* gdb.Inferior:                          Inferiors In Python. (line   6)
* gdb.inferiors:                         Inferiors In Python. (line  15)
* gdb.InferiorThread:                    Threads In Python.   (line   6)
* gdb.LazyString:                        Lazy Strings In Python.
                                                              (line   6)
* gdb.lookup_global_symbol:              Symbols In Python.   (line  33)
* gdb.lookup_symbol:                     Symbols In Python.   (line  13)
* gdb.lookup_type:                       Types In Python.     (line  11)
* gdb.MemoryError:                       Exception Handling.  (line  30)
* gdb.newest_frame:                      Frames In Python.    (line  26)
* gdb.Objfile:                           Objfiles In Python.  (line   6)
* gdb.objfiles:                          Objfiles In Python.  (line  21)
* gdb.PARAM_AUTO_BOOLEAN:                Parameters In Python.
                                                              (line  93)
* gdb.PARAM_BOOLEAN:                     Parameters In Python.
                                                              (line  89)
* gdb.PARAM_ENUM:                        Parameters In Python.
                                                              (line 127)
* gdb.PARAM_FILENAME:                    Parameters In Python.
                                                              (line 119)
* gdb.PARAM_INTEGER:                     Parameters In Python.
                                                              (line 102)
* gdb.PARAM_OPTIONAL_FILENAME:           Parameters In Python.
                                                              (line 116)
* gdb.PARAM_STRING:                      Parameters In Python.
                                                              (line 106)
* gdb.PARAM_STRING_NOESCAPE:             Parameters In Python.
                                                              (line 112)
* gdb.PARAM_UINTEGER:                    Parameters In Python.
                                                              (line  98)
* gdb.PARAM_ZINTEGER:                    Parameters In Python.
                                                              (line 123)
* gdb.Parameter:                         Parameters In Python.
                                                              (line   6)
* gdb.parameter:                         Basic Python.        (line  35)
* gdb.parse_and_eval:                    Basic Python.        (line  58)
* gdb.post_event:                        Basic Python.        (line  69)
* gdb.Progspace:                         Progspaces In Python.
                                                              (line   6)
* gdb.progspaces:                        Progspaces In Python.
                                                              (line  18)
* gdb.prompt_hook:                       Basic Python.        (line 170)
* gdb.PYTHONDIR:                         Basic Python.        (line  11)
* gdb.read_memory:                       Inferiors In Python. (line  47)
* gdb.search_memory:                     Inferiors In Python. (line  60)
* gdb.selected_frame:                    Frames In Python.    (line  22)
* gdb.selected_inferior:                 Inferiors In Python. (line  18)
* gdb.selected_thread:                   Threads In Python.   (line  13)
* gdb.solib_name:                        Basic Python.        (line 153)
* gdb.STDERR:                            Basic Python.        (line 111)
* gdb.STDLOG:                            Basic Python.        (line 114)
* gdb.STDOUT:                            Basic Python.        (line 108)
* gdb.string_to_argv:                    Commands In Python.  (line  62)
* gdb.Symbol:                            Symbols In Python.   (line   6)
* gdb.SYMBOL_FUNCTIONS_DOMAIN:           Symbols In Python.   (line 117)
* gdb.SYMBOL_LABEL_DOMAIN:               Symbols In Python.   (line 110)
* gdb.SYMBOL_LOC_ARG:                    Symbols In Python.   (line 139)
* gdb.SYMBOL_LOC_BLOCK:                  Symbols In Python.   (line 160)
* gdb.SYMBOL_LOC_COMPUTED:               Symbols In Python.   (line 174)
* gdb.SYMBOL_LOC_CONST:                  Symbols In Python.   (line 130)
* gdb.SYMBOL_LOC_CONST_BYTES:            Symbols In Python.   (line 163)
* gdb.SYMBOL_LOC_LOCAL:                  Symbols In Python.   (line 153)
* gdb.SYMBOL_LOC_OPTIMIZED_OUT:          Symbols In Python.   (line 171)
* gdb.SYMBOL_LOC_REF_ARG:                Symbols In Python.   (line 143)
* gdb.SYMBOL_LOC_REGISTER:               Symbols In Python.   (line 136)
* gdb.SYMBOL_LOC_REGPARM_ADDR:           Symbols In Python.   (line 148)
* gdb.SYMBOL_LOC_STATIC:                 Symbols In Python.   (line 133)
* gdb.SYMBOL_LOC_TYPEDEF:                Symbols In Python.   (line 156)
* gdb.SYMBOL_LOC_UNDEF:                  Symbols In Python.   (line 128)
* gdb.SYMBOL_LOC_UNRESOLVED:             Symbols In Python.   (line 166)
* gdb.SYMBOL_STRUCT_DOMAIN:              Symbols In Python.   (line 107)
* gdb.SYMBOL_TYPES_DOMAIN:               Symbols In Python.   (line 120)
* gdb.SYMBOL_UNDEF_DOMAIN:               Symbols In Python.   (line 100)
* gdb.SYMBOL_VAR_DOMAIN:                 Symbols In Python.   (line 103)
* gdb.SYMBOL_VARIABLES_DOMAIN:           Symbols In Python.   (line 113)
* gdb.Symtab:                            Symbol Tables In Python.
                                                              (line   6)
* gdb.Symtab_and_line:                   Symbol Tables In Python.
                                                              (line   6)
* gdb.target_charset:                    Basic Python.        (line 142)
* gdb.target_wide_charset:               Basic Python.        (line 147)
* gdb.Type:                              Types In Python.     (line   6)
* gdb.TYPE_CODE_ARRAY:                   Types In Python.     (line 167)
* gdb.TYPE_CODE_BITSTRING:               Types In Python.     (line 205)
* gdb.TYPE_CODE_BOOL:                    Types In Python.     (line 226)
* gdb.TYPE_CODE_CHAR:                    Types In Python.     (line 223)
* gdb.TYPE_CODE_COMPLEX:                 Types In Python.     (line 229)
* gdb.TYPE_CODE_DECFLOAT:                Types In Python.     (line 238)
* gdb.TYPE_CODE_ENUM:                    Types In Python.     (line 176)
* gdb.TYPE_CODE_ERROR:                   Types In Python.     (line 208)
* gdb.TYPE_CODE_FLAGS:                   Types In Python.     (line 179)
* gdb.TYPE_CODE_FLT:                     Types In Python.     (line 188)
* gdb.TYPE_CODE_FUNC:                    Types In Python.     (line 182)
* gdb.TYPE_CODE_INT:                     Types In Python.     (line 185)
* gdb.TYPE_CODE_INTERNAL_FUNCTION:       Types In Python.     (line 241)
* gdb.TYPE_CODE_MEMBERPTR:               Types In Python.     (line 217)
* gdb.TYPE_CODE_METHOD:                  Types In Python.     (line 211)
* gdb.TYPE_CODE_METHODPTR:               Types In Python.     (line 214)
* gdb.TYPE_CODE_NAMESPACE:               Types In Python.     (line 235)
* gdb.TYPE_CODE_PTR:                     Types In Python.     (line 164)
* gdb.TYPE_CODE_RANGE:                   Types In Python.     (line 197)
* gdb.TYPE_CODE_REF:                     Types In Python.     (line 220)
* gdb.TYPE_CODE_SET:                     Types In Python.     (line 194)
* gdb.TYPE_CODE_STRING:                  Types In Python.     (line 200)
* gdb.TYPE_CODE_STRUCT:                  Types In Python.     (line 170)
* gdb.TYPE_CODE_TYPEDEF:                 Types In Python.     (line 232)
* gdb.TYPE_CODE_UNION:                   Types In Python.     (line 173)
* gdb.TYPE_CODE_VOID:                    Types In Python.     (line 191)
* gdb.WP_ACCESS:                         Breakpoints In Python.
                                                              (line  66)
* gdb.WP_READ:                           Breakpoints In Python.
                                                              (line  60)
* gdb.WP_WRITE:                          Breakpoints In Python.
                                                              (line  63)
* gdb.write:                             Basic Python.        (line 103)
* gdb.write_memory:                      Inferiors In Python. (line  53)
* gdb_init_reader:                       Writing JIT Debug Info Readers.
                                                              (line  20)
* gdbserver:                             Server.              (line   6)
* generate-core-file:                    Core File Generation.
                                                              (line  18)
* getDebugChar:                          Bootstrapping.       (line  14)
* gnu_debuglink_crc32:                   Separate Debug Files.
                                                              (line 164)
* h (help):                              Help.                (line   9)
* handle:                                Signals.             (line  45)
* handle_exception:                      Stub Contents.       (line  15)
* hbreak:                                Set Breaks.          (line  62)
* help:                                  Help.                (line   6)
* help function:                         Convenience Vars.    (line 112)
* help target:                           Target Commands.     (line  19)
* help user-defined:                     Define.              (line  66)
* history-preserve-point:                Readline Init File Syntax.
                                                              (line 124)
* history-search-backward ():            Commands For History.
                                                              (line  50)
* history-search-forward ():             Commands For History.
                                                              (line  45)
* history-size:                          Readline Init File Syntax.
                                                              (line 130)
* hook:                                  Hooks.               (line   6)
* hookpost:                              Hooks.               (line  11)
* horizontal-scroll-mode:                Readline Init File Syntax.
                                                              (line 135)
* htrace:                                OpenRISC 1000.       (line  69)
* hwatch:                                OpenRISC 1000.       (line  59)
* i (info):                              Help.                (line  99)
* if:                                    Command Files.       (line  75)
* ignore:                                Conditions.          (line  77)
* INCLUDE_RDB:                           VxWorks.             (line  33)
* inferior INFNO:                        Inferiors and Programs.
                                                              (line  49)
* Inferior.is_valid:                     Inferiors In Python. (line  36)
* Inferior.num:                          Inferiors In Python. (line  23)
* Inferior.pid:                          Inferiors In Python. (line  26)
* Inferior.read_memory:                  Inferiors In Python. (line  48)
* Inferior.search_memory:                Inferiors In Python. (line  61)
* Inferior.threads:                      Inferiors In Python. (line  43)
* Inferior.was_attached:                 Inferiors In Python. (line  30)
* Inferior.write_memory:                 Inferiors In Python. (line  54)
* InferiorThread.is_exited:              Threads In Python.   (line  61)
* InferiorThread.is_running:             Threads In Python.   (line  58)
* InferiorThread.is_stopped:             Threads In Python.   (line  55)
* InferiorThread.is_valid:               Threads In Python.   (line  43)
* InferiorThread.name:                   Threads In Python.   (line  20)
* InferiorThread.num:                    Threads In Python.   (line  30)
* InferiorThread.ptid:                   Threads In Python.   (line  33)
* InferiorThread.switch:                 Threads In Python.   (line  51)
* info:                                  Help.                (line  99)
* info address:                          Symbols.             (line  44)
* info all-registers:                    Registers.           (line  15)
* info args:                             Frame Info.          (line  51)
* info auto-load-scripts:                Auto-loading.        (line  29)
* info auxv:                             OS Information.      (line  33)
* info breakpoints:                      Set Breaks.          (line 128)
* info catch:                            Frame Info.          (line  60)
* info checkpoints:                      Checkpoint/Restart.  (line  31)
* info classes:                          Symbols.             (line 248)
* info common:                           Special Fortran Commands.
                                                              (line   9)
* info copying:                          Help.                (line 136)
* info dcache:                           Caching Remote Data. (line  34)
* info display:                          Auto Display.        (line  78)
* info dll:                              Cygwin Native.       (line  35)
* info dos:                              DJGPP Native.        (line  15)
* info extensions:                       Show.                (line  34)
* info f (info frame):                   Frame Info.          (line  17)
* info files:                            Files.               (line 191)
* info float:                            Floating Point Hardware.
                                                              (line   9)
* info frame:                            Frame Info.          (line  17)
* info frame, show the source language:  Show.                (line  15)
* info functions:                        Symbols.             (line 227)
* info handle:                           Signals.             (line  33)
* info inferiors:                        Inferiors and Programs.
                                                              (line  25)
* info io_registers, AVR:                AVR.                 (line  10)
* info line:                             Machine Code.        (line  14)
* info line, and Objective-C:            Method Names in Commands.
                                                              (line   9)
* info locals:                           Frame Info.          (line  55)
* info macro:                            Macros.              (line  47)
* info macros:                           Macros.              (line  54)
* info mem:                              Memory Region Attributes.
                                                              (line  45)
* info meminfo:                          SVR4 Process Information.
                                                              (line  78)
* info or1k spr:                         OpenRISC 1000.       (line  20)
* info os:                               OS Information.      (line  47)
* info os processes:                     OS Information.      (line  52)
* info pidlist:                          SVR4 Process Information.
                                                              (line  74)
* info pretty-printer:                   Pretty-Printer Commands.
                                                              (line   6)
* info proc:                             SVR4 Process Information.
                                                              (line  16)
* info program:                          Stopping.            (line  18)
* info record:                           Process Record and Replay.
                                                              (line 137)
* info registers:                        Registers.           (line  11)
* info scope:                            Symbols.             (line 181)
* info selectors:                        Symbols.             (line 254)
* info serial:                           DJGPP Native.        (line 142)
* info set:                              Help.                (line 119)
* info share:                            Files.               (line 326)
* info sharedlibrary:                    Files.               (line 326)
* info signals:                          Signals.             (line  33)
* info skip:                             Skipping Over Functions and Files.
                                                              (line  56)
* info source:                           Symbols.             (line 202)
* info source, show the source language: Show.                (line  21)
* info sources:                          Symbols.             (line 221)
* info spu:                              SPU.                 (line  10)
* info stack:                            Backtrace.           (line  34)
* info static-tracepoint-markers:        Listing Static Tracepoint Markers.
                                                              (line   6)
* info symbol:                           Symbols.             (line  54)
* info target:                           Files.               (line 191)
* info task TASKNO:                      Ada Tasks.           (line  89)
* info tasks:                            Ada Tasks.           (line   9)
* info terminal:                         Input/Output.        (line  12)
* info threads:                          Threads.             (line  66)
* info tp [N...]:                        Listing Tracepoints. (line   6)
* info tracepoints [N...]:               Listing Tracepoints. (line   6)
* info tvariables:                       Trace State Variables.
                                                              (line  37)
* info types:                            Symbols.             (line 167)
* info udot:                             OS Information.      (line  16)
* info variables:                        Symbols.             (line 239)
* info vector:                           Vector Unit.         (line   9)
* info w32:                              Cygwin Native.       (line  19)
* info warranty:                         Help.                (line 140)
* info watchpoints [N...]:               Set Watchpoints.     (line  87)
* info win:                              TUI Commands.        (line  18)
* init-if-undefined:                     Convenience Vars.    (line  41)
* input-meta:                            Readline Init File Syntax.
                                                              (line 142)
* insert-comment (M-#):                  Miscellaneous Commands.
                                                              (line  60)
* insert-completions (M-*):              Commands For Completion.
                                                              (line  18)
* inspect:                               Data.                (line   6)
* interpreter-exec:                      Interpreters.        (line  43)
* interrupt:                             Background Execution.
                                                              (line  73)
* isearch-terminators:                   Readline Init File Syntax.
                                                              (line 149)
* jit-reader-load:                       Using JIT Debug Info Readers.
                                                              (line   6)
* jit-reader-unload:                     Using JIT Debug Info Readers.
                                                              (line   6)
* jump:                                  Jumping.             (line  10)
* jump, and Objective-C:                 Method Names in Commands.
                                                              (line   9)
* KeyboardInterrupt:                     Exception Handling.  (line  34)
* keymap:                                Readline Init File Syntax.
                                                              (line 156)
* kill:                                  Kill Process.        (line   6)
* kill inferiors INFNO...:               Inferiors and Programs.
                                                              (line 103)
* kill-line (C-k):                       Commands For Killing.
                                                              (line   6)
* kill-region ():                        Commands For Killing.
                                                              (line  41)
* kill-whole-line ():                    Commands For Killing.
                                                              (line  15)
* kill-word (M-d):                       Commands For Killing.
                                                              (line  19)
* kvm:                                   BSD libkvm Interface.
                                                              (line  24)
* l (list):                              List.                (line   6)
* layout:                                TUI Commands.        (line  21)
* LazyString.address:                    Lazy Strings In Python.
                                                              (line  27)
* LazyString.encoding:                   Lazy Strings In Python.
                                                              (line  37)
* LazyString.length:                     Lazy Strings In Python.
                                                              (line  31)
* LazyString.type:                       Lazy Strings In Python.
                                                              (line  44)
* LazyString.value:                      Lazy Strings In Python.
                                                              (line  21)
* Left:                                  TUI Keys.            (line  59)
* list:                                  List.                (line   6)
* list, and Objective-C:                 Method Names in Commands.
                                                              (line   9)
* load FILENAME:                         Target Commands.     (line 115)
* loop_break:                            Command Files.       (line  94)
* loop_continue:                         Command Files.       (line  98)
* macro define:                          Macros.              (line  59)
* macro exp1:                            Macros.              (line  36)
* macro expand:                          Macros.              (line  29)
* macro list:                            Macros.              (line  80)
* macro undef:                           Macros.              (line  74)
* maint agent:                           Maintenance Commands.
                                                              (line  12)
* maint agent-eval:                      Maintenance Commands.
                                                              (line  12)
* maint check-symtabs:                   Maintenance Commands.
                                                              (line  78)
* maint cplus first_component:           Maintenance Commands.
                                                              (line  81)
* maint cplus namespace:                 Maintenance Commands.
                                                              (line  84)
* maint demangle:                        Maintenance Commands.
                                                              (line  87)
* maint deprecate:                       Maintenance Commands.
                                                              (line  90)
* maint dump-me:                         Maintenance Commands.
                                                              (line  98)
* maint info breakpoints:                Maintenance Commands.
                                                              (line  25)
* maint info program-spaces:             Inferiors and Programs.
                                                              (line 138)
* maint info psymtabs:                   Symbols.             (line 321)
* maint info sections:                   Files.               (line 200)
* maint info sol-threads:                Threads.             (line  98)
* maint info symtabs:                    Symbols.             (line 321)
* maint internal-error:                  Maintenance Commands.
                                                              (line 103)
* maint internal-warning:                Maintenance Commands.
                                                              (line 103)
* maint packet:                          Maintenance Commands.
                                                              (line 143)
* maint print architecture:              Maintenance Commands.
                                                              (line 149)
* maint print c-tdesc:                   Maintenance Commands.
                                                              (line 153)
* maint print cooked-registers:          Maintenance Commands.
                                                              (line 176)
* maint print dummy-frames:              Maintenance Commands.
                                                              (line 158)
* maint print objfiles:                  Maintenance Commands.
                                                              (line 215)
* maint print psymbols:                  Symbols.             (line 302)
* maint print raw-registers:             Maintenance Commands.
                                                              (line 176)
* maint print reggroups:                 Maintenance Commands.
                                                              (line 196)
* maint print register-groups:           Maintenance Commands.
                                                              (line 176)
* maint print registers:                 Maintenance Commands.
                                                              (line 176)
* maint print remote-registers:          Maintenance Commands.
                                                              (line 176)
* maint print section-scripts:           Maintenance Commands.
                                                              (line 220)
* maint print statistics:                Maintenance Commands.
                                                              (line 227)
* maint print symbols:                   Symbols.             (line 302)
* maint print target-stack:              Maintenance Commands.
                                                              (line 240)
* maint print type:                      Maintenance Commands.
                                                              (line 252)
* maint print unwind, HPPA:              HPPA.                (line  17)
* maint set dwarf2 always-disassemble:   Maintenance Commands.
                                                              (line 259)
* maint set dwarf2 max-cache-age:        Maintenance Commands.
                                                              (line 281)
* maint set internal-error:              Maintenance Commands.
                                                              (line 124)
* maint set internal-warning:            Maintenance Commands.
                                                              (line 124)
* maint set profile:                     Maintenance Commands.
                                                              (line 295)
* maint set show-all-tib:                Maintenance Commands.
                                                              (line 319)
* maint set show-debug-regs:             Maintenance Commands.
                                                              (line 311)
* maint show dwarf2 always-disassemble:  Maintenance Commands.
                                                              (line 259)
* maint show dwarf2 max-cache-age:       Maintenance Commands.
                                                              (line 281)
* maint show internal-error:             Maintenance Commands.
                                                              (line 124)
* maint show internal-warning:           Maintenance Commands.
                                                              (line 124)
* maint show profile:                    Maintenance Commands.
                                                              (line 295)
* maint show show-all-tib:               Maintenance Commands.
                                                              (line 319)
* maint show show-debug-regs:            Maintenance Commands.
                                                              (line 311)
* maint space:                           Maintenance Commands.
                                                              (line 325)
* maint time:                            Maintenance Commands.
                                                              (line 332)
* maint translate-address:               Maintenance Commands.
                                                              (line 345)
* maint undeprecate:                     Maintenance Commands.
                                                              (line  90)
* make:                                  Shell Commands.      (line  21)
* mark-modified-lines:                   Readline Init File Syntax.
                                                              (line 169)
* mark-symlinked-directories:            Readline Init File Syntax.
                                                              (line 174)
* match-hidden-files:                    Readline Init File Syntax.
                                                              (line 179)
* may-insert-breakpoints:                Observer Mode.       (line  50)
* may-insert-fast-tracepoints:           Observer Mode.       (line  69)
* may-insert-tracepoints:                Observer Mode.       (line  59)
* may-interrupt:                         Observer Mode.       (line  79)
* may-write-memory:                      Observer Mode.       (line  41)
* may-write-registers:                   Observer Mode.       (line  32)
* mem:                                   Memory Region Attributes.
                                                              (line  22)
* memset:                                Bootstrapping.       (line  70)
* menu-complete ():                      Commands For Completion.
                                                              (line  22)
* menu-complete-backward ():             Commands For Completion.
                                                              (line  34)
* menu-complete-display-prefix:          Readline Init File Syntax.
                                                              (line 186)
* meta-flag:                             Readline Init File Syntax.
                                                              (line 142)
* monitor:                               Connecting.          (line 105)
* n (next):                              Continuing and Stepping.
                                                              (line  78)
* n (SingleKey TUI key):                 TUI Single Key Mode. (line  19)
* NewObjFileEvent.new_objfile:           Events In Python.    (line 123)
* next:                                  Continuing and Stepping.
                                                              (line  78)
* next&:                                 Background Execution.
                                                              (line  47)
* next-history (C-n):                    Commands For History.
                                                              (line  16)
* nexti:                                 Continuing and Stepping.
                                                              (line 203)
* nexti&:                                Background Execution.
                                                              (line  50)
* ni (nexti):                            Continuing and Stepping.
                                                              (line 203)
* non-incremental-forward-search-history (M-n): Commands For History.
                                                              (line  40)
* non-incremental-reverse-search-history (M-p): Commands For History.
                                                              (line  35)
* nosharedlibrary:                       Files.               (line 341)
* Objfile:                               Objfiles In Python.  (line   6)
* Objfile.filename:                      Objfiles In Python.  (line  29)
* Objfile.is_valid:                      Objfiles In Python.  (line  42)
* Objfile.pretty_printers:               Objfiles In Python.  (line  32)
* observer:                              Observer Mode.       (line  22)
* or1ksim:                               OpenRISC 1000.       (line  16)
* output:                                Output.              (line  35)
* output-meta:                           Readline Init File Syntax.
                                                              (line 191)
* overlay:                               Overlay Commands.    (line  17)
* overload-choice annotation:            Prompting.           (line  32)
* overwrite-mode ():                     Commands For Text.   (line  53)
* page-completions:                      Readline Init File Syntax.
                                                              (line 196)
* PARAM_AUTO_BOOLEAN:                    Parameters In Python.
                                                              (line  93)
* PARAM_BOOLEAN:                         Parameters In Python.
                                                              (line  89)
* PARAM_ENUM:                            Parameters In Python.
                                                              (line 127)
* PARAM_FILENAME:                        Parameters In Python.
                                                              (line 119)
* PARAM_INTEGER:                         Parameters In Python.
                                                              (line 102)
* PARAM_OPTIONAL_FILENAME:               Parameters In Python.
                                                              (line 116)
* PARAM_STRING:                          Parameters In Python.
                                                              (line 106)
* PARAM_STRING_NOESCAPE:                 Parameters In Python.
                                                              (line 112)
* PARAM_UINTEGER:                        Parameters In Python.
                                                              (line  98)
* PARAM_ZINTEGER:                        Parameters In Python.
                                                              (line 123)
* Parameter:                             Parameters In Python.
                                                              (line   6)
* Parameter.__init__:                    Parameters In Python.
                                                              (line  20)
* Parameter.get_set_string:              Parameters In Python.
                                                              (line  74)
* Parameter.get_show_string:             Parameters In Python.
                                                              (line  80)
* Parameter.set_doc:                     Parameters In Python.
                                                              (line  54)
* Parameter.show_doc:                    Parameters In Python.
                                                              (line  60)
* Parameter.value:                       Parameters In Python.
                                                              (line  66)
* passcount:                             Tracepoint Passcounts.
                                                              (line   6)
* path:                                  Environment.         (line  14)
* PgDn:                                  TUI Keys.            (line  50)
* PgUp:                                  TUI Keys.            (line  47)
* pmon, MIPS remote:                     MIPS Embedded.       (line 132)
* po (print-object):                     The Print Command with Objective-C.
                                                              (line   6)
* possible-completions (M-?):            Commands For Completion.
                                                              (line  11)
* post-commands annotation:              Prompting.           (line  27)
* post-overload-choice annotation:       Prompting.           (line  32)
* post-prompt annotation:                Prompting.           (line  24)
* post-prompt-for-continue annotation:   Prompting.           (line  40)
* post-query annotation:                 Prompting.           (line  36)
* pre-commands annotation:               Prompting.           (line  27)
* pre-overload-choice annotation:        Prompting.           (line  32)
* pre-prompt annotation:                 Prompting.           (line  24)
* pre-prompt-for-continue annotation:    Prompting.           (line  40)
* pre-query annotation:                  Prompting.           (line  36)
* prefix-meta (<ESC>):                   Miscellaneous Commands.
                                                              (line  18)
* pretty_printer.children:               Pretty Printing API. (line  12)
* pretty_printer.display_hint:           Pretty Printing API. (line  25)
* pretty_printer.to_string:              Pretty Printing API. (line  54)
* previous-history (C-p):                Commands For History.
                                                              (line  12)
* print:                                 Data.                (line   6)
* print-object:                          The Print Command with Objective-C.
                                                              (line   6)
* printf:                                Output.              (line  46)
* proc-trace-entry:                      SVR4 Process Information.
                                                              (line  70)
* proc-trace-exit:                       SVR4 Process Information.
                                                              (line  70)
* proc-untrace-entry:                    SVR4 Process Information.
                                                              (line  70)
* proc-untrace-exit:                     SVR4 Process Information.
                                                              (line  70)
* Progspace:                             Progspaces In Python.
                                                              (line   6)
* Progspace.filename:                    Progspaces In Python.
                                                              (line  25)
* Progspace.pretty_printers:             Progspaces In Python.
                                                              (line  28)
* prompt annotation:                     Prompting.           (line  24)
* prompt-for-continue annotation:        Prompting.           (line  40)
* ptype:                                 Symbols.             (line 102)
* putDebugChar:                          Bootstrapping.       (line  20)
* pwd:                                   Working Directory.   (line  19)
* python:                                Python Commands.     (line   9)
* q (quit):                              Quitting GDB.        (line   6)
* q (SingleKey TUI key):                 TUI Single Key Mode. (line  22)
* query annotation:                      Prompting.           (line  36)
* quit [EXPRESSION]:                     Quitting GDB.        (line   6)
* quit annotation:                       Errors.              (line   6)
* quoted-insert (C-q or C-v):            Commands For Text.   (line  20)
* r (run):                               Starting.            (line   6)
* r (SingleKey TUI key):                 TUI Single Key Mode. (line  25)
* rbreak:                                Set Breaks.          (line  92)
* rc (reverse-continue):                 Reverse Execution.   (line  30)
* rdilogenable:                          ARM.                 (line  95)
* rdilogfile:                            ARM.                 (line  89)
* re-read-init-file (C-x C-r):           Miscellaneous Commands.
                                                              (line   6)
* readnow:                               Files.               (line  90)
* rec:                                   Process Record and Replay.
                                                              (line  38)
* rec del:                               Process Record and Replay.
                                                              (line 155)
* rec s:                                 Process Record and Replay.
                                                              (line  57)
* record:                                Process Record and Replay.
                                                              (line  38)
* record delete:                         Process Record and Replay.
                                                              (line 155)
* record restore:                        Process Record and Replay.
                                                              (line  85)
* record save:                           Process Record and Replay.
                                                              (line  80)
* record stop:                           Process Record and Replay.
                                                              (line  57)
* redraw-current-line ():                Commands For Moving. (line  30)
* refresh:                               TUI Commands.        (line  58)
* regs, Super-H:                         Super-H.             (line   9)
* remote delete:                         File Transfer.       (line  23)
* remote get:                            File Transfer.       (line  19)
* remote put:                            File Transfer.       (line  15)
* remotetimeout:                         Sparclet.            (line  12)
* remove-inferiors:                      Inferiors and Programs.
                                                              (line  86)
* restart CHECKPOINT-ID:                 Checkpoint/Restart.  (line  44)
* restore:                               Dump/Restore Files.  (line  41)
* RET (repeat last command):             Command Syntax.      (line  21)
* return:                                Returning.           (line   6)
* reverse-continue:                      Reverse Execution.   (line  30)
* reverse-finish:                        Reverse Execution.   (line  77)
* reverse-next:                          Reverse Execution.   (line  60)
* reverse-nexti:                         Reverse Execution.   (line  69)
* reverse-search:                        Search.              (line  16)
* reverse-search-history (C-r):          Commands For History.
                                                              (line  26)
* reverse-step:                          Reverse Execution.   (line  37)
* reverse-stepi:                         Reverse Execution.   (line  52)
* revert-all-at-newline:                 Readline Init File Syntax.
                                                              (line 206)
* revert-line (M-r):                     Miscellaneous Commands.
                                                              (line  25)
* Right:                                 TUI Keys.            (line  62)
* rn (reverse-next):                     Reverse Execution.   (line  60)
* rni (reverse-nexti):                   Reverse Execution.   (line  69)
* rs (step):                             Reverse Execution.   (line  37)
* rsi (reverse-stepi):                   Reverse Execution.   (line  52)
* run:                                   Starting.            (line   6)
* run&:                                  Background Execution.
                                                              (line  34)
* rwatch:                                Set Watchpoints.     (line  79)
* s (SingleKey TUI key):                 TUI Single Key Mode. (line  28)
* s (step):                              Continuing and Stepping.
                                                              (line  46)
* save breakpoints:                      Save Breakpoints.    (line   9)
* save gdb-index:                        Index Files.         (line  19)
* save tracepoints:                      save tracepoints.    (line   6)
* save-tracepoints:                      save tracepoints.    (line   6)
* sdireset:                              M32R/D.              (line  44)
* sdistatus:                             M32R/D.              (line  47)
* sds, a command:                        PowerPC Embedded.    (line  94)
* search:                                Search.              (line   9)
* section:                               Files.               (line 182)
* select-frame:                          Frames.              (line  51)
* self-insert (a, b, A, 1, !, ...):      Commands For Text.   (line  27)
* set:                                   Help.                (line 107)
* set ada trust-PAD-over-XVS:            Ada Glitches.        (line  43)
* set annotate:                          Annotations Overview.
                                                              (line  29)
* set architecture:                      Targets.             (line  21)
* set args:                              Arguments.           (line  21)
* set arm:                               ARM.                 (line  18)
* set auto-load-scripts:                 Auto-loading.        (line  23)
* set auto-solib-add:                    Files.               (line 303)
* set backtrace:                         Backtrace.           (line 104)
* set basenames-may-differ:              Files.               (line 517)
* set board-address:                     M32R/D.              (line  21)
* set breakpoint always-inserted:        Set Breaks.          (line 316)
* set breakpoint auto-hw:                Set Breaks.          (line 296)
* set breakpoint pending:                Set Breaks.          (line 265)
* set can-use-hw-watchpoints:            Set Watchpoints.     (line 116)
* set case-sensitive:                    Symbols.             (line  27)
* set charset:                           Character Sets.      (line  46)
* set check range:                       Range Checking.      (line  34)
* set check type:                        Type Checking.       (line  42)
* set circular-trace-buffer:             Starting and Stopping Trace Experiments.
                                                              (line  94)
* set coerce-float-to-double:            ABI.                 (line  41)
* set com1base:                          DJGPP Native.        (line 125)
* set com1irq:                           DJGPP Native.        (line 125)
* set com2base:                          DJGPP Native.        (line 125)
* set com2irq:                           DJGPP Native.        (line 125)
* set com3base:                          DJGPP Native.        (line 125)
* set com3irq:                           DJGPP Native.        (line 125)
* set com4base:                          DJGPP Native.        (line 125)
* set com4irq:                           DJGPP Native.        (line 125)
* set complaints:                        Messages/Warnings.   (line  29)
* set confirm:                           Messages/Warnings.   (line  50)
* set cp-abi:                            ABI.                 (line  53)
* set cygwin-exceptions:                 Cygwin Native.       (line  42)
* set data-directory:                    Data Files.          (line  12)
* set dcache line-size:                  Caching Remote Data. (line  48)
* set dcache size:                       Caching Remote Data. (line  45)
* set debug:                             Debugging Output.    (line  18)
* set debug darwin:                      Darwin.              (line   9)
* set debug entry-values:                Tail Call Frames.    (line  48)
* set debug hppa:                        HPPA.                (line  10)
* set debug libthread-db:                Threads.             (line 212)
* set debug mach-o:                      Darwin.              (line  16)
* set debug mips:                        MIPS.                (line  79)
* set debug monitor:                     Target Commands.     (line 108)
* set debug nto-debug:                   Neutrino.            (line   9)
* set debug-file-directory:              Separate Debug Files.
                                                              (line  68)
* set debugevents:                       Cygwin Native.       (line  71)
* set debugexceptions:                   Cygwin Native.       (line  82)
* set debugexec:                         Cygwin Native.       (line  78)
* set debugmemory:                       Cygwin Native.       (line  86)
* set default-collect:                   Tracepoint Actions.  (line 126)
* set demangle-style:                    Print Settings.      (line 397)
* set detach-on-fork:                    Forks.               (line  55)
* set directories:                       Source Path.         (line 120)
* set disable-randomization:             Starting.            (line 136)
* set disassemble-next-line:             Machine Code.        (line 139)
* set disassembly-flavor:                Machine Code.        (line 127)
* set disconnected-tracing:              Starting and Stopping Trace Experiments.
                                                              (line  55)
* set displaced-stepping:                Maintenance Commands.
                                                              (line  56)
* set download-path:                     M32R/D.              (line  15)
* set editing:                           Editing.             (line  15)
* set endian:                            Byte Order.          (line  13)
* set environment:                       Environment.         (line  39)
* set exceptions, Hurd command:          Hurd Native.         (line  40)
* set exec-direction:                    Reverse Execution.   (line  83)
* set exec-done-display:                 Debugging Output.    (line  11)
* set exec-wrapper:                      Starting.            (line 111)
* set extended-prompt:                   Prompt.              (line  25)
* set extension-language:                Show.                (line  30)
* set follow-exec-mode:                  Forks.               (line 101)
* set follow-fork-mode:                  Forks.               (line  35)
* set gnutarget:                         Target Commands.     (line  28)
* set hash, for remote monitors:         Target Commands.     (line  99)
* set height:                            Screen Size.         (line  21)
* set history expansion:                 Command History.     (line  65)
* set history filename:                  Command History.     (line  26)
* set history save:                      Command History.     (line  36)
* set history size:                      Command History.     (line  45)
* set host-charset:                      Character Sets.      (line  33)
* set inferior-tty:                      Input/Output.        (line  49)
* set input-radix:                       Numbers.             (line  14)
* set interactive-mode:                  Other Misc Settings. (line   6)
* set language:                          Manually.            (line   9)
* set libthread-db-search-path:          Threads.             (line 177)
* set listsize:                          List.                (line  33)
* set logging:                           Logging Output.      (line   9)
* set mach-exceptions:                   Darwin.              (line  27)
* set max-user-call-depth:               Define.              (line  76)
* set mem inaccessible-by-default:       Memory Region Attributes.
                                                              (line 130)
* set mips abi:                          MIPS.                (line  32)
* set mips mask-address:                 MIPS.                (line  59)
* set mipsfpu:                           MIPS Embedded.       (line  60)
* set monitor-prompt, MIPS remote:       MIPS Embedded.       (line 107)
* set monitor-warnings, MIPS remote:     MIPS Embedded.       (line 123)
* set multiple-symbols:                  Ambiguous Expressions.
                                                              (line  50)
* set new-console:                       Cygwin Native.       (line  54)
* set new-group:                         Cygwin Native.       (line  63)
* set non-stop:                          Non-Stop Mode.       (line  38)
* set opaque-type-resolution:            Symbols.             (line 284)
* set osabi:                             ABI.                 (line  11)
* set output-radix:                      Numbers.             (line  31)
* set overload-resolution:               Debugging C Plus Plus.
                                                              (line  48)
* set pagination:                        Screen Size.         (line  38)
* set powerpc:                           PowerPC Embedded.    (line  51)
* set print:                             Print Settings.      (line  11)
* set print entry-values:                Print Settings.      (line 176)
* set print frame-arguments:             Print Settings.      (line 135)
* set print inferior-events:             Inferiors and Programs.
                                                              (line 117)
* set print thread-events:               Threads.             (line 156)
* set processor:                         Targets.             (line  31)
* set procfs-file:                       SVR4 Process Information.
                                                              (line  59)
* set procfs-trace:                      SVR4 Process Information.
                                                              (line  53)
* set prompt:                            Prompt.              (line  16)
* set python print-stack:                Python Commands.     (line  31)
* set radix:                             Numbers.             (line  44)
* set ravenscar task-switching off:      Ravenscar Profile.   (line  14)
* set ravenscar task-switching on:       Ravenscar Profile.   (line  10)
* set rdiheartbeat:                      ARM.                 (line 112)
* set rdiromatzero:                      ARM.                 (line 102)
* set record insn-number-max:            Process Record and Replay.
                                                              (line  89)
* set record memory-query:               Process Record and Replay.
                                                              (line 123)
* set record stop-at-limit:              Process Record and Replay.
                                                              (line 109)
* set remote:                            Remote Configuration.
                                                              (line   6)
* set remote system-call-allowed:        system.              (line  38)
* set remote-mips64-transfers-32bit-regs: MIPS.               (line  69)
* set remotecache:                       Caching Remote Data. (line  18)
* set remoteflow:                        Remote Configuration.
                                                              (line  41)
* set retransmit-timeout:                MIPS Embedded.       (line  83)
* set rstack_high_address:               A29K.                (line   6)
* set schedule-multiple:                 All-Stop Mode.       (line  66)
* set script-extension:                  Extending GDB.       (line  20)
* set sdstimeout:                        PowerPC Embedded.    (line  87)
* set server-address:                    M32R/D.              (line  27)
* set sh calling-convention:             Super-H.             (line  12)
* set shell:                             Cygwin Native.       (line  90)
* set signal-thread:                     Hurd Native.         (line  21)
* set signals, Hurd command:             Hurd Native.         (line  11)
* set sigs, Hurd command:                Hurd Native.         (line  11)
* set sigthread:                         Hurd Native.         (line  21)
* set solib-absolute-prefix:             Files.               (line 374)
* set solib-search-path:                 Files.               (line 443)
* set spu:                               SPU.                 (line  39)
* set stack-cache:                       Caching Remote Data. (line  26)
* set step-mode:                         Continuing and Stepping.
                                                              (line  92)
* set stop-on-solib-events:              Files.               (line 351)
* set stopped, Hurd command:             Hurd Native.         (line  32)
* set struct-convention:                 i386.                (line   7)
* set substitute-path:                   Source Path.         (line 127)
* set symbol-reloading:                  Symbols.             (line 267)
* set syn-garbage-limit, MIPS remote:    MIPS Embedded.       (line  98)
* set sysroot:                           Files.               (line 374)
* set target-async:                      Background Execution.
                                                              (line  17)
* set target-charset:                    Character Sets.      (line  28)
* set target-file-system-kind (unix|dos-based|auto): Files.   (line 457)
* set target-wide-charset:               Character Sets.      (line  61)
* set task, Hurd commands:               Hurd Native.         (line  49)
* set tcp:                               Remote Configuration.
                                                              (line 116)
* set thread, Hurd command:              Hurd Native.         (line  91)
* set timeout:                           MIPS Embedded.       (line  83)
* set trace-commands:                    Messages/Warnings.   (line  67)
* set trace-notes:                       Starting and Stopping Trace Experiments.
                                                              (line 113)
* set trace-stop-notes:                  Starting and Stopping Trace Experiments.
                                                              (line 119)
* set trace-user:                        Starting and Stopping Trace Experiments.
                                                              (line 109)
* set trust-readonly-sections:           Files.               (line 258)
* set tui active-border-mode:            TUI Configuration.   (line  24)
* set tui border-kind:                   TUI Configuration.   (line   9)
* set tui border-mode:                   TUI Configuration.   (line  23)
* set unwind-on-terminating-exception:   Calling.             (line  46)
* set unwindonsignal:                    Calling.             (line  35)
* set variable:                          Assignment.          (line  16)
* set verbose:                           Messages/Warnings.   (line  15)
* set watchdog:                          Maintenance Commands.
                                                              (line 363)
* set width:                             Screen Size.         (line  21)
* set write:                             Patching.            (line  15)
* set-mark (C-@):                        Miscellaneous Commands.
                                                              (line  32)
* set_debug_traps:                       Stub Contents.       (line  10)
* share:                                 Files.               (line 332)
* sharedlibrary:                         Files.               (line 332)
* shell:                                 Shell Commands.      (line  10)
* show:                                  Help.                (line 112)
* show ada trust-PAD-over-XVS:           Ada Glitches.        (line  43)
* show annotate:                         Annotations Overview.
                                                              (line  34)
* show architecture:                     Targets.             (line  21)
* show args:                             Arguments.           (line  28)
* show arm:                              ARM.                 (line  22)
* show auto-load-scripts:                Auto-loading.        (line  26)
* show auto-solib-add:                   Files.               (line 320)
* show backtrace:                        Backtrace.           (line 111)
* show basenames-may-differ:             Files.               (line 520)
* show board-address:                    M32R/D.              (line  24)
* show breakpoint always-inserted:       Set Breaks.          (line 316)
* show breakpoint auto-hw:               Set Breaks.          (line 296)
* show breakpoint pending:               Set Breaks.          (line 265)
* show can-use-hw-watchpoints:           Set Watchpoints.     (line 119)
* show case-sensitive:                   Symbols.             (line  40)
* show charset:                          Character Sets.      (line  52)
* show check range:                      Range Checking.      (line  34)
* show check type:                       Type Checking.       (line  42)
* show circular-trace-buffer:            Starting and Stopping Trace Experiments.
                                                              (line 101)
* show coerce-float-to-double:           ABI.                 (line  50)
* show com1base:                         DJGPP Native.        (line 137)
* show com1irq:                          DJGPP Native.        (line 137)
* show com2base:                         DJGPP Native.        (line 137)
* show com2irq:                          DJGPP Native.        (line 137)
* show com3base:                         DJGPP Native.        (line 137)
* show com3irq:                          DJGPP Native.        (line 137)
* show com4base:                         DJGPP Native.        (line 137)
* show com4irq:                          DJGPP Native.        (line 137)
* show commands:                         Command History.     (line  78)
* show complaints:                       Messages/Warnings.   (line  35)
* show confirm:                          Messages/Warnings.   (line  58)
* show convenience:                      Convenience Vars.    (line  37)
* show copying:                          Help.                (line 136)
* show cp-abi:                           ABI.                 (line  53)
* show cygwin-exceptions:                Cygwin Native.       (line  50)
* show data-directory:                   Data Files.          (line  16)
* show dcache line-size:                 Caching Remote Data. (line  56)
* show dcache size:                      Caching Remote Data. (line  52)
* show debug:                            Debugging Output.    (line  22)
* show debug darwin:                     Darwin.              (line  13)
* show debug entry-values:               Tail Call Frames.    (line  56)
* show debug libthread-db:               Threads.             (line 212)
* show debug mach-o:                     Darwin.              (line  23)
* show debug mips:                       MIPS.                (line  83)
* show debug monitor:                    Target Commands.     (line 112)
* show debug nto-debug:                  Neutrino.            (line  13)
* show debug-file-directory:             Separate Debug Files.
                                                              (line  73)
* show default-collect:                  Tracepoint Actions.  (line 135)
* show detach-on-fork:                   Forks.               (line  71)
* show directories:                      Source Path.         (line 124)
* show disassemble-next-line:            Machine Code.        (line 139)
* show disassembly-flavor:               Machine Code.        (line 136)
* show disconnected-tracing:             Starting and Stopping Trace Experiments.
                                                              (line  62)
* show displaced-stepping:               Maintenance Commands.
                                                              (line  56)
* show download-path:                    M32R/D.              (line  18)
* show editing:                          Editing.             (line  22)
* show environment:                      Environment.         (line  33)
* show exceptions, Hurd command:         Hurd Native.         (line  46)
* show exec-done-display:                Debugging Output.    (line  14)
* show extended-prompt:                  Prompt.              (line  39)
* show follow-fork-mode:                 Forks.               (line  49)
* show gnutarget:                        Target Commands.     (line  40)
* show hash, for remote monitors:        Target Commands.     (line 105)
* show height:                           Screen Size.         (line  21)
* show history:                          Command History.     (line  70)
* show host-charset:                     Character Sets.      (line  55)
* show inferior-tty:                     Input/Output.        (line  52)
* show input-radix:                      Numbers.             (line  36)
* show interactive-mode:                 Other Misc Settings. (line  21)
* show language:                         Show.                (line  10)
* show libthread-db-search-path:         Threads.             (line 209)
* show listsize:                         List.                (line  37)
* show logging:                          Logging Output.      (line  26)
* show mach-exceptions:                  Darwin.              (line  34)
* show max-user-call-depth:              Define.              (line  76)
* show mem inaccessible-by-default:      Memory Region Attributes.
                                                              (line 136)
* show mips abi:                         MIPS.                (line  52)
* show mips mask-address:                MIPS.                (line  65)
* show mipsfpu:                          MIPS Embedded.       (line  60)
* show monitor-prompt, MIPS remote:      MIPS Embedded.       (line 119)
* show monitor-warnings, MIPS remote:    MIPS Embedded.       (line 129)
* show multiple-symbols:                 Ambiguous Expressions.
                                                              (line  70)
* show new-console:                      Cygwin Native.       (line  59)
* show new-group:                        Cygwin Native.       (line  68)
* show non-stop:                         Non-Stop Mode.       (line  42)
* show opaque-type-resolution:           Symbols.             (line 299)
* show osabi:                            ABI.                 (line  11)
* show output-radix:                     Numbers.             (line  39)
* show overload-resolution:              Debugging C Plus Plus.
                                                              (line  65)
* show pagination:                       Screen Size.         (line  44)
* show paths:                            Environment.         (line  29)
* show print:                            Print Settings.      (line  39)
* show print inferior-events:            Inferiors and Programs.
                                                              (line 125)
* show print thread-events:              Threads.             (line 166)
* show processor:                        Targets.             (line  31)
* show procfs-file:                      SVR4 Process Information.
                                                              (line  64)
* show procfs-trace:                     SVR4 Process Information.
                                                              (line  56)
* show prompt:                           Prompt.              (line  19)
* show radix:                            Numbers.             (line  44)
* show ravenscar task-switching:         Ravenscar Profile.   (line  22)
* show rdiheartbeat:                     ARM.                 (line 117)
* show rdiromatzero:                     ARM.                 (line 109)
* show record insn-number-max:           Process Record and Replay.
                                                              (line 106)
* show record memory-query:              Process Record and Replay.
                                                              (line 134)
* show record stop-at-limit:             Process Record and Replay.
                                                              (line 120)
* show remote:                           Remote Configuration.
                                                              (line   6)
* show remote system-call-allowed:       system.              (line  42)
* show remote-mips64-transfers-32bit-regs: MIPS.              (line  75)
* show remotecache:                      Caching Remote Data. (line  23)
* show remoteflow:                       Remote Configuration.
                                                              (line  45)
* show retransmit-timeout:               MIPS Embedded.       (line  83)
* show rstack_high_address:              A29K.                (line  17)
* show script-extension:                 Extending GDB.       (line  20)
* show sdstimeout:                       PowerPC Embedded.    (line  91)
* show server-address:                   M32R/D.              (line  31)
* show sh calling-convention:            Super-H.             (line  25)
* show shell:                            Cygwin Native.       (line  94)
* show signal-thread:                    Hurd Native.         (line  28)
* show signals, Hurd command:            Hurd Native.         (line  17)
* show sigs, Hurd command:               Hurd Native.         (line  17)
* show sigthread:                        Hurd Native.         (line  28)
* show solib-search-path:                Files.               (line 454)
* show spu:                              SPU.                 (line  44)
* show stack-cache:                      Caching Remote Data. (line  31)
* show stop-on-solib-events:             Files.               (line 357)
* show stopped, Hurd command:            Hurd Native.         (line  37)
* show struct-convention:                i386.                (line  15)
* show substitute-path:                  Source Path.         (line 164)
* show symbol-reloading:                 Symbols.             (line 281)
* show syn-garbage-limit, MIPS remote:   MIPS Embedded.       (line 103)
* show sysroot:                          Files.               (line 440)
* show target-async:                     Background Execution.
                                                              (line  21)
* show target-charset:                   Character Sets.      (line  58)
* show target-file-system-kind:          Files.               (line 457)
* show target-wide-charset:              Character Sets.      (line  67)
* show task, Hurd commands:              Hurd Native.         (line  57)
* show tcp:                              Remote Configuration.
                                                              (line 116)
* show thread, Hurd command:             Hurd Native.         (line 101)
* show timeout:                          MIPS Embedded.       (line  83)
* show trace-notes:                      Starting and Stopping Trace Experiments.
                                                              (line 116)
* show trace-stop-notes:                 Starting and Stopping Trace Experiments.
                                                              (line 124)
* show trace-user:                       Starting and Stopping Trace Experiments.
                                                              (line 111)
* show unwind-on-terminating-exception:  Calling.             (line  54)
* show unwindonsignal:                   Calling.             (line  42)
* show user:                             Define.              (line  70)
* show values:                           Value History.       (line  47)
* show verbose:                          Messages/Warnings.   (line  21)
* show version:                          Help.                (line 126)
* show warranty:                         Help.                (line 140)
* show width:                            Screen Size.         (line  21)
* show write:                            Patching.            (line  26)
* show-all-if-ambiguous:                 Readline Init File Syntax.
                                                              (line 212)
* show-all-if-unmodified:                Readline Init File Syntax.
                                                              (line 218)
* si (stepi):                            Continuing and Stepping.
                                                              (line 190)
* signal:                                Signaling.           (line   6)
* signal annotation:                     Annotations for Running.
                                                              (line  42)
* signal-name annotation:                Annotations for Running.
                                                              (line  22)
* signal-name-end annotation:            Annotations for Running.
                                                              (line  22)
* signal-string annotation:              Annotations for Running.
                                                              (line  22)
* signal-string-end annotation:          Annotations for Running.
                                                              (line  22)
* SignalEvent.stop_signal:               Events In Python.    (line  96)
* signalled annotation:                  Annotations for Running.
                                                              (line  22)
* silent:                                Break Commands.      (line  43)
* sim:                                   Z8000.               (line  15)
* sim, a command:                        Embedded Processors. (line  13)
* skip delete:                           Skipping Over Functions and Files.
                                                              (line  86)
* skip disable:                          Skipping Over Functions and Files.
                                                              (line  94)
* skip enable:                           Skipping Over Functions and Files.
                                                              (line  90)
* skip file:                             Skipping Over Functions and Files.
                                                              (line  46)
* skip function:                         Skipping Over Functions and Files.
                                                              (line  34)
* skip-completed-text:                   Readline Init File Syntax.
                                                              (line 227)
* skip-csi-sequence ():                  Miscellaneous Commands.
                                                              (line  51)
* source:                                Command Files.       (line  17)
* source annotation:                     Source Annotations.  (line   6)
* spr:                                   OpenRISC 1000.       (line  33)
* start:                                 Starting.            (line  78)
* start-kbd-macro (C-x ():               Keyboard Macros.     (line   6)
* starting annotation:                   Annotations for Running.
                                                              (line   6)
* STDERR:                                Basic Python.        (line 111)
* STDLOG:                                Basic Python.        (line 114)
* STDOUT:                                Basic Python.        (line 108)
* step:                                  Continuing and Stepping.
                                                              (line  46)
* step&:                                 Background Execution.
                                                              (line  41)
* stepi:                                 Continuing and Stepping.
                                                              (line 190)
* stepi&:                                Background Execution.
                                                              (line  44)
* stop, a pseudo-command:                Hooks.               (line  21)
* stopping annotation:                   Annotations for Running.
                                                              (line   6)
* strace:                                Create and Delete Tracepoints.
                                                              (line  76)
* symbol-file:                           Files.               (line  45)
* Symbol.addr_class:                     Symbols In Python.   (line  71)
* Symbol.is_argument:                    Symbols In Python.   (line  77)
* Symbol.is_constant:                    Symbols In Python.   (line  80)
* Symbol.is_function:                    Symbols In Python.   (line  83)
* Symbol.is_valid:                       Symbols In Python.   (line  91)
* Symbol.is_variable:                    Symbols In Python.   (line  86)
* Symbol.linkage_name:                   Symbols In Python.   (line  62)
* Symbol.name:                           Symbols In Python.   (line  58)
* Symbol.print_name:                     Symbols In Python.   (line  66)
* Symbol.symtab:                         Symbols In Python.   (line  53)
* Symbol.type:                           Symbols In Python.   (line  48)
* SYMBOL_FUNCTIONS_DOMAIN:               Symbols In Python.   (line 117)
* SYMBOL_LABEL_DOMAIN:                   Symbols In Python.   (line 110)
* SYMBOL_LOC_ARG:                        Symbols In Python.   (line 139)
* SYMBOL_LOC_BLOCK:                      Symbols In Python.   (line 160)
* SYMBOL_LOC_COMPUTED:                   Symbols In Python.   (line 174)
* SYMBOL_LOC_CONST:                      Symbols In Python.   (line 130)
* SYMBOL_LOC_CONST_BYTES:                Symbols In Python.   (line 163)
* SYMBOL_LOC_LOCAL:                      Symbols In Python.   (line 153)
* SYMBOL_LOC_OPTIMIZED_OUT:              Symbols In Python.   (line 171)
* SYMBOL_LOC_REF_ARG:                    Symbols In Python.   (line 143)
* SYMBOL_LOC_REGISTER:                   Symbols In Python.   (line 136)
* SYMBOL_LOC_REGPARM_ADDR:               Symbols In Python.   (line 148)
* SYMBOL_LOC_STATIC:                     Symbols In Python.   (line 133)
* SYMBOL_LOC_TYPEDEF:                    Symbols In Python.   (line 156)
* SYMBOL_LOC_UNDEF:                      Symbols In Python.   (line 128)
* SYMBOL_LOC_UNRESOLVED:                 Symbols In Python.   (line 166)
* SYMBOL_STRUCT_DOMAIN:                  Symbols In Python.   (line 107)
* SYMBOL_TYPES_DOMAIN:                   Symbols In Python.   (line 120)
* SYMBOL_UNDEF_DOMAIN:                   Symbols In Python.   (line 100)
* SYMBOL_VAR_DOMAIN:                     Symbols In Python.   (line 103)
* SYMBOL_VARIABLES_DOMAIN:               Symbols In Python.   (line 113)
* Symtab.filename:                       Symbol Tables In Python.
                                                              (line  41)
* Symtab.fullname:                       Symbol Tables In Python.
                                                              (line  58)
* Symtab.is_valid:                       Symbol Tables In Python.
                                                              (line  51)
* Symtab.objfile:                        Symbol Tables In Python.
                                                              (line  45)
* Symtab_and_line.is_valid:              Symbol Tables In Python.
                                                              (line  31)
* Symtab_and_line.line:                  Symbol Tables In Python.
                                                              (line  25)
* Symtab_and_line.pc:                    Symbol Tables In Python.
                                                              (line  21)
* Symtab_and_line.symtab:                Symbol Tables In Python.
                                                              (line  17)
* sysinfo:                               DJGPP Native.        (line  19)
* tabset:                                TUI Commands.        (line  84)
* target:                                Target Commands.     (line  49)
* target array:                          MIPS Embedded.       (line  49)
* target dbug:                           M68K.                (line   9)
* target ddb PORT:                       MIPS Embedded.       (line  41)
* target dink32:                         PowerPC Embedded.    (line  72)
* target jtag:                           OpenRISC 1000.       (line   9)
* target lsi PORT:                       MIPS Embedded.       (line  44)
* target m32r:                           M32R/D.              (line   6)
* target m32rsdi:                        M32R/D.              (line   9)
* target mips PORT:                      MIPS Embedded.       (line  14)
* target op50n:                          PA.                  (line   6)
* target pmon PORT:                      MIPS Embedded.       (line  38)
* target ppcbug:                         PowerPC Embedded.    (line  75)
* target ppcbug1:                        PowerPC Embedded.    (line  76)
* target r3900:                          MIPS Embedded.       (line  46)
* target rdi:                            ARM.                 (line   6)
* target rdp:                            ARM.                 (line  11)
* target record:                         Process Record and Replay.
                                                              (line  38)
* target sds:                            PowerPC Embedded.    (line  80)
* target sim, with Z8000:                Z8000.               (line  15)
* target sparclite:                      Sparclite.           (line   6)
* target tfile:                          Trace Files.         (line  22)
* target vxworks:                        VxWorks.             (line   6)
* target w89k:                           PA.                  (line   9)
* task (Ada):                            Ada Tasks.           (line 105)
* tbreak:                                Set Breaks.          (line  55)
* tdump:                                 tdump.               (line   6)
* teval (tracepoints):                   Tracepoint Actions.  (line 101)
* tfile:                                 Trace Files.         (line  22)
* tfind:                                 tfind.               (line   6)
* thbreak:                               Set Breaks.          (line  82)
* this, inside C++ member functions:     C Plus Plus Expressions.
                                                              (line  20)
* thread apply:                          Threads.             (line 122)
* thread find:                           Threads.             (line 142)
* thread name:                           Threads.             (line 131)
* thread THREADNO:                       Threads.             (line 100)
* ThreadEvent.inferior_thread:           Events In Python.    (line  57)
* tload, M32R:                           M32R/D.              (line  39)
* trace:                                 Create and Delete Tracepoints.
                                                              (line   6)
* transpose-chars (C-t):                 Commands For Text.   (line  30)
* transpose-words (M-t):                 Commands For Text.   (line  36)
* tsave:                                 Trace Files.         (line  12)
* tstart [ NOTES ]:                      Starting and Stopping Trace Experiments.
                                                              (line   6)
* tstatus:                               Starting and Stopping Trace Experiments.
                                                              (line  27)
* tstop [ NOTES ]:                       Starting and Stopping Trace Experiments.
                                                              (line  16)
* tty:                                   Input/Output.        (line  23)
* tui reg:                               TUI Commands.        (line  61)
* tvariable:                             Trace State Variables.
                                                              (line  26)
* Type.array:                            Types In Python.     (line  94)
* Type.code:                             Types In Python.     (line  34)
* Type.const:                            Types In Python.     (line 103)
* Type.fields:                           Types In Python.     (line  51)
* Type.pointer:                          Types In Python.     (line 126)
* Type.range:                            Types In Python.     (line 116)
* Type.reference:                        Types In Python.     (line 122)
* Type.sizeof:                           Types In Python.     (line  38)
* Type.strip_typedefs:                   Types In Python.     (line 130)
* Type.tag:                              Types In Python.     (line  43)
* Type.target:                           Types In Python.     (line 134)
* Type.template_argument:                Types In Python.     (line 149)
* Type.unqualified:                      Types In Python.     (line 111)
* Type.volatile:                         Types In Python.     (line 107)
* TYPE_CODE_ARRAY:                       Types In Python.     (line 167)
* TYPE_CODE_BITSTRING:                   Types In Python.     (line 205)
* TYPE_CODE_BOOL:                        Types In Python.     (line 226)
* TYPE_CODE_CHAR:                        Types In Python.     (line 223)
* TYPE_CODE_COMPLEX:                     Types In Python.     (line 229)
* TYPE_CODE_DECFLOAT:                    Types In Python.     (line 238)
* TYPE_CODE_ENUM:                        Types In Python.     (line 176)
* TYPE_CODE_ERROR:                       Types In Python.     (line 208)
* TYPE_CODE_FLAGS:                       Types In Python.     (line 179)
* TYPE_CODE_FLT:                         Types In Python.     (line 188)
* TYPE_CODE_FUNC:                        Types In Python.     (line 182)
* TYPE_CODE_INT:                         Types In Python.     (line 185)
* TYPE_CODE_INTERNAL_FUNCTION:           Types In Python.     (line 241)
* TYPE_CODE_MEMBERPTR:                   Types In Python.     (line 217)
* TYPE_CODE_METHOD:                      Types In Python.     (line 211)
* TYPE_CODE_METHODPTR:                   Types In Python.     (line 214)
* TYPE_CODE_NAMESPACE:                   Types In Python.     (line 235)
* TYPE_CODE_PTR:                         Types In Python.     (line 164)
* TYPE_CODE_RANGE:                       Types In Python.     (line 197)
* TYPE_CODE_REF:                         Types In Python.     (line 220)
* TYPE_CODE_SET:                         Types In Python.     (line 194)
* TYPE_CODE_STRING:                      Types In Python.     (line 200)
* TYPE_CODE_STRUCT:                      Types In Python.     (line 170)
* TYPE_CODE_TYPEDEF:                     Types In Python.     (line 232)
* TYPE_CODE_UNION:                       Types In Python.     (line 173)
* TYPE_CODE_VOID:                        Types In Python.     (line 191)
* u (SingleKey TUI key):                 TUI Single Key Mode. (line  31)
* u (until):                             Continuing and Stepping.
                                                              (line 118)
* undisplay:                             Auto Display.        (line  45)
* undo (C-_ or C-x C-u):                 Miscellaneous Commands.
                                                              (line  22)
* universal-argument ():                 Numeric Arguments.   (line  10)
* unix-filename-rubout ():               Commands For Killing.
                                                              (line  32)
* unix-line-discard (C-u):               Commands For Killing.
                                                              (line  12)
* unix-word-rubout (C-w):                Commands For Killing.
                                                              (line  28)
* unset environment:                     Environment.         (line  55)
* unset substitute-path:                 Source Path.         (line 156)
* until:                                 Continuing and Stepping.
                                                              (line 118)
* until&:                                Background Execution.
                                                              (line  59)
* Up:                                    TUI Keys.            (line  53)
* up:                                    Selection.           (line  35)
* up-silently:                           Selection.           (line  64)
* upcase-word (M-u):                     Commands For Text.   (line  41)
* update:                                TUI Commands.        (line  76)
* upload, M32R:                          M32R/D.              (line  34)
* use_dbt_break:                         M32R/D.              (line  64)
* use_debug_dma:                         M32R/D.              (line  53)
* use_ib_break:                          M32R/D.              (line  61)
* use_mon_code:                          M32R/D.              (line  57)
* v (SingleKey TUI key):                 TUI Single Key Mode. (line  34)
* Value.__init__:                        Values From Inferior.
                                                              (line  88)
* Value.address:                         Values From Inferior.
                                                              (line  45)
* Value.cast:                            Values From Inferior.
                                                              (line 121)
* Value.dereference:                     Values From Inferior.
                                                              (line 127)
* Value.dynamic_cast:                    Values From Inferior.
                                                              (line 143)
* Value.dynamic_type:                    Values From Inferior.
                                                              (line  59)
* Value.fetch_lazy:                      Values From Inferior.
                                                              (line 209)
* Value.is_lazy:                         Values From Inferior.
                                                              (line  74)
* Value.is_optimized_out:                Values From Inferior.
                                                              (line  50)
* Value.lazy_string:                     Values From Inferior.
                                                              (line 184)
* Value.reinterpret_cast:                Values From Inferior.
                                                              (line 147)
* Value.string:                          Values From Inferior.
                                                              (line 151)
* Value.type:                            Values From Inferior.
                                                              (line  55)
* visible-stats:                         Readline Init File Syntax.
                                                              (line 240)
* vxworks-timeout:                       VxWorks.             (line  23)
* w (SingleKey TUI key):                 TUI Single Key Mode. (line  37)
* watch:                                 Set Watchpoints.     (line  42)
* watchpoint annotation:                 Annotations for Running.
                                                              (line  50)
* whatis:                                Symbols.             (line  74)
* where:                                 Backtrace.           (line  34)
* while:                                 Command Files.       (line  86)
* while-stepping (tracepoints):          Tracepoint Actions.  (line 109)
* winheight:                             TUI Commands.        (line  80)
* WP_ACCESS:                             Breakpoints In Python.
                                                              (line  66)
* WP_READ:                               Breakpoints In Python.
                                                              (line  60)
* WP_WRITE:                              Breakpoints In Python.
                                                              (line  63)
* x (examine memory):                    Memory.              (line   9)
* x(examine), and info line:             Machine Code.        (line  30)
* yank (C-y):                            Commands For Killing.
                                                              (line  59)
* yank-last-arg (M-. or M-_):            Commands For History.
                                                              (line  64)
* yank-nth-arg (M-C-y):                  Commands For History.
                                                              (line  55)
* yank-pop (M-y):                        Commands For Killing.
                                                              (line  62)



Tag Table:
Node: Top2062
Node: Summary5515
Node: Free Software7317
Node: Contributors12885
Node: Sample Session20974
Node: Invocation27824
Node: Invoking GDB28368
Node: File Options30681
Node: Mode Options33418
Node: Startup40191
Ref: Startup-Footnote-142970
Node: Quitting GDB43079
Node: Shell Commands43976
Node: Logging Output44903
Node: Commands45749
Node: Command Syntax46387
Node: Completion48553
Ref: Completion-Footnote-153917
Node: Help54077
Node: Running59372
Node: Compilation60601
Node: Starting62685
Node: Arguments71610
Node: Environment72880
Node: Working Directory76148
Node: Input/Output77256
Node: Attach79227
Node: Kill Process81694
Node: Inferiors and Programs82675
Node: Threads89920
Node: Forks99083
Node: Checkpoint/Restart105393
Ref: Checkpoint/Restart-Footnote-1109922
Node: Stopping109957
Node: Breakpoints111220
Node: Set Breaks114656
Node: Set Watchpoints130993
Node: Set Catchpoints140396
Node: Delete Breaks149592
Node: Disabling151528
Node: Conditions154381
Node: Break Commands159330
Node: Save Breakpoints162554
Node: Error in Breakpoints163730
Node: Breakpoint-related Warnings164461
Node: Continuing and Stepping166788
Node: Skipping Over Functions and Files176174
Node: Signals179746
Ref: extra signal information184028
Node: Thread Stops185531
Node: All-Stop Mode186630
Node: Non-Stop Mode190528
Node: Background Execution194005
Node: Thread-Specific Breakpoints196574
Node: Interrupted System Calls197896
Node: Observer Mode199410
Node: Reverse Execution202849
Ref: Reverse Execution-Footnote-1207476
Ref: Reverse Execution-Footnote-2208103
Node: Process Record and Replay208153
Node: Stack215400
Node: Frames216893
Node: Backtrace219645
Ref: Backtrace-Footnote-1224858
Node: Selection225046
Node: Frame Info227910
Node: Source230241
Node: List231307
Node: Specify Location233920
Node: Edit237566
Ref: Edit-Footnote-1239041
Node: Search239276
Node: Source Path240084
Ref: set substitute-path246451
Node: Machine Code248672
Node: Data255346
Node: Expressions258016
Node: Ambiguous Expressions260108
Node: Variables263342
Node: Arrays268100
Node: Output Formats270631
Ref: Output Formats-Footnote-1273819
Node: Memory273976
Node: Auto Display280130
Node: Print Settings284672
Ref: set print entry-values291748
Node: Pretty Printing302872
Node: Pretty-Printer Introduction303385
Node: Pretty-Printer Example305140
Node: Pretty-Printer Commands305918
Node: Value History308342
Node: Convenience Vars310763
Node: Registers315498
Ref: Registers-Footnote-1320175
Node: Floating Point Hardware320570
Node: Vector Unit321102
Node: OS Information321489
Node: Memory Region Attributes324134
Node: Dump/Restore Files328804
Node: Core File Generation331109
Node: Character Sets332343
Node: Caching Remote Data338708
Ref: Caching Remote Data-Footnote-1340973
Node: Searching Memory341211
Node: Optimized Code344088
Node: Inline Functions345765
Node: Tail Call Frames348760
Ref: set debug entry-values350900
Node: Macros354974
Ref: Macros-Footnote-1362550
Node: Tracepoints362703
Node: Set Tracepoints364764
Node: Create and Delete Tracepoints367702
Node: Enable and Disable Tracepoints374102
Node: Tracepoint Passcounts375342
Node: Tracepoint Conditions376769
Node: Trace State Variables378463
Node: Tracepoint Actions380653
Node: Listing Tracepoints386599
Node: Listing Static Tracepoint Markers387720
Node: Starting and Stopping Trace Experiments389566
Ref: disconnected tracing391311
Node: Tracepoint Restrictions394929
Node: Analyze Collected Data398699
Node: tfind400004
Node: tdump404426
Node: save tracepoints406941
Node: Tracepoint Variables407437
Node: Trace Files408565
Node: Overlays410023
Node: How Overlays Work410743
Ref: A code overlay413303
Node: Overlay Commands416741
Node: Automatic Overlay Debugging420931
Node: Overlay Sample Program423072
Node: Languages424832
Node: Setting425995
Node: Filenames427697
Node: Manually428508
Node: Automatically429717
Node: Show430778
Node: Checks432100
Node: Type Checking433490
Node: Range Checking436223
Node: Supported Languages438624
Node: C439885
Node: C Operators440849
Node: C Constants445168
Node: C Plus Plus Expressions448049
Node: C Defaults451392
Node: C Checks452075
Node: Debugging C452798
Node: Debugging C Plus Plus453282
Node: Decimal Floating Point456469
Node: D457728
Node: Objective-C457994
Node: Method Names in Commands458456
Node: The Print Command with Objective-C460151
Node: OpenCL C460802
Node: OpenCL C Datatypes461077
Node: OpenCL C Expressions461452
Node: OpenCL C Operators461809
Node: Fortran462041
Node: Fortran Operators462763
Node: Fortran Defaults463619
Node: Special Fortran Commands464004
Node: Pascal464510
Node: Modula-2465025
Node: M2 Operators466000
Node: Built-In Func/Proc468999
Node: M2 Constants471860
Node: M2 Types473461
Node: M2 Defaults476680
Node: Deviations477280
Node: M2 Checks478381
Node: M2 Scope479199
Node: GDB/M2480223
Node: Ada481135
Node: Ada Mode Intro482198
Node: Omissions from Ada484108
Node: Additions to Ada488462
Node: Stopping Before Main Program492392
Node: Ada Tasks492921
Node: Ada Tasks and Core Files499334
Node: Ravenscar Profile500252
Node: Ada Glitches501322
Node: Unsupported Languages504116
Node: Symbols504806
Node: Altering520543
Node: Assignment521512
Node: Jumping524617
Node: Signaling526752
Node: Returning527883
Node: Calling531235
Node: Patching534262
Node: GDB Files535339
Node: Files535984
Ref: Shared Libraries548829
Ref: Files-Footnote-1560182
Node: Separate Debug Files560357
Node: Index Files571927
Node: Symbol Errors573270
Node: Data Files576883
Node: Targets577839
Node: Active Targets579319
Node: Target Commands580393
Ref: load584666
Node: Byte Order585647
Node: Remote Debugging586624
Node: Connecting587886
Node: File Transfer592826
Node: Server593766
Ref: Monitor Commands for gdbserver603323
Ref: Server-Footnote-1607977
Node: Remote Configuration608097
Ref: set remotebreak609121
Ref: set remote hardware-watchpoint-limit610585
Ref: set remote hardware-breakpoint-limit610585
Ref: set remote hardware-watchpoint-length-limit610811
Ref: set remote exec-file611226
Node: Remote Stub617836
Node: Stub Contents620733
Node: Bootstrapping622844
Node: Debug Session626653
Node: Configurations628213
Node: Native628982
Node: HP-UX629617
Node: BSD libkvm Interface629906
Node: SVR4 Process Information630977
Node: DJGPP Native634407
Node: Cygwin Native640987
Node: Non-debug DLL Symbols644936
Node: Hurd Native649484
Node: Neutrino654747
Node: Darwin655137
Node: Embedded OS656395
Node: VxWorks656871
Node: VxWorks Connection659088
Node: VxWorks Download660022
Node: VxWorks Attach661757
Node: Embedded Processors662155
Node: ARM663334
Node: M32R/D667455
Node: M68K669157
Node: MicroBlaze669450
Node: MIPS Embedded670900
Node: OpenRISC 1000675850
Node: PowerPC Embedded678705
Node: PA682467
Node: Sparclet682756
Node: Sparclet File684240
Node: Sparclet Connection685120
Node: Sparclet Download685598
Node: Sparclet Execution686647
Node: Sparclite687238
Node: Z8000687613
Node: AVR688997
Node: CRIS689360
Node: Super-H690338
Node: Architectures691453
Node: i386691875
Node: A29K692557
Node: Alpha693396
Node: MIPS693529
Node: HPPA696141
Node: SPU696660
Node: PowerPC698848
Node: Controlling GDB699566
Node: Prompt700392
Node: Editing702111
Node: Command History703054
Node: Screen Size706458
Node: Numbers708292
Node: ABI710269
Node: Messages/Warnings713198
Ref: confirmation requests714624
Node: Debugging Output715831
Node: Other Misc Settings722182
Node: Extending GDB723209
Node: Sequences724837
Node: Define725432
Node: Hooks729045
Node: Command Files731412
Node: Output736482
Node: Python741415
Node: Python Commands742590
Node: Python API744384
Node: Basic Python746310
Ref: prompt_hook753436
Node: Exception Handling754033
Node: Values From Inferior756532
Node: Types In Python765925
Node: Pretty Printing API774664
Node: Selecting Pretty-Printers778557
Node: Writing a Pretty-Printer780890
Node: Inferiors In Python786207
Node: Events In Python789204
Node: Threads In Python794612
Node: Commands In Python797224
Node: Parameters In Python806116
Node: Functions In Python811577
Node: Progspaces In Python813692
Node: Objfiles In Python815044
Node: Frames In Python816968
Node: Blocks In Python823405
Node: Symbols In Python826157
Node: Symbol Tables In Python832861
Node: Breakpoints In Python835344
Node: Finish Breakpoints in Python842455
Node: Lazy Strings In Python844531
Node: Auto-loading846759
Node: objfile-gdb.py file848655
Node: .debug_gdb_scripts section849910
Node: Which flavor to choose?851287
Node: Python modules853104
Node: gdb.printing853483
Node: gdb.types854558
Node: gdb.prompt856260
Node: Aliases857909
Node: Interpreters860752
Node: TUI862851
Node: TUI Overview863818
Node: TUI Keys866251
Node: TUI Single Key Mode868555
Node: TUI Commands869430
Node: TUI Configuration871814
Node: Emacs873110
Node: GDB/MI878584
Node: GDB/MI General Design880464
Node: Context management882987
Node: Asynchronous and non-stop modes886122
Node: Thread groups888114
Node: GDB/MI Command Syntax890392
Node: GDB/MI Input Syntax890635
Node: GDB/MI Output Syntax892189
Node: GDB/MI Compatibility with CLI895761
Node: GDB/MI Development and Front Ends896498
Node: GDB/MI Output Records898155
Node: GDB/MI Result Records898527
Node: GDB/MI Stream Records899533
Node: GDB/MI Async Records900798
Node: GDB/MI Frame Information908537
Node: GDB/MI Thread Information909615
Node: GDB/MI Ada Exception Information910594
Node: GDB/MI Simple Examples911017
Node: GDB/MI Command Description Format913194
Node: GDB/MI Breakpoint Commands914074
Node: GDB/MI Program Context932070
Node: GDB/MI Thread Commands936338
Node: GDB/MI Ada Tasking Commands940294
Node: GDB/MI Program Execution942548
Node: GDB/MI Stack Manipulation954334
Node: GDB/MI Variable Objects965236
Ref: -var-set-format974964
Ref: -var-list-children976082
Ref: -var-update984259
Ref: -var-set-frozen986956
Ref: -var-set-update-range987752
Ref: -var-set-visualizer988282
Node: GDB/MI Data Manipulation989779
Node: GDB/MI Tracepoint Commands1007364
Node: GDB/MI Symbol Query1014693
Node: GDB/MI File Commands1015382
Node: GDB/MI Target Manipulation1018719
Node: GDB/MI File Transfer Commands1024941
Node: GDB/MI Miscellaneous Commands1026263
Ref: -interpreter-exec1036005
Node: Annotations1038314
Node: Annotations Overview1039233
Node: Server Prefix1041696
Node: Prompting1042430
Node: Errors1043947
Node: Invalidation1044843
Node: Annotations for Running1045320
Node: Source Annotations1046840
Node: JIT Interface1047765
Node: Declarations1049557
Node: Registering Code1050944
Node: Unregistering Code1051916
Node: Custom Debug Info1052543
Node: Using JIT Debug Info Readers1053839
Node: Writing JIT Debug Info Readers1054706
Node: GDB Bugs1056903
Node: Bug Criteria1057632
Node: Bug Reporting1058509
Node: Command Line Editing1065269
Node: Introduction and Notation1065921
Node: Readline Interaction1067541
Node: Readline Bare Essentials1068730
Node: Readline Movement Commands1070517
Node: Readline Killing Commands1071480
Node: Readline Arguments1073398
Node: Searching1074440
Node: Readline Init File1076589
Node: Readline Init File Syntax1077740
Node: Conditional Init Constructs1092798
Node: Sample Init File1095329
Node: Bindable Readline Commands1098444
Node: Commands For Moving1099499
Node: Commands For History1100358
Node: Commands For Text1103760
Node: Commands For Killing1106484
Node: Numeric Arguments1108624
Node: Commands For Completion1109761
Node: Keyboard Macros1111728
Node: Miscellaneous Commands1112297
Node: Readline vi Mode1116151
Node: Using History Interactively1117061
Node: History Interaction1117604
Node: Event Designators1119026
Node: Word Designators1120166
Node: Modifiers1121803
Node: In Memoriam1123026
Node: Formatting Documentation1123909
Ref: Formatting Documentation-Footnote-11127278
Node: Installing GDB1127370
Node: Requirements1127942
Ref: Expat1128511
Node: Running Configure1131029
Node: Separate Objdir1134778
Node: Config Names1137746
Node: Configure Options1139219
Node: System-wide configuration1141589
Node: Maintenance Commands1142884
Ref: maint info breakpoints1144068
Node: Remote Protocol1158464
Node: Overview1159094
Ref: Binary Data1161656
Node: Packets1164179
Ref: thread-id syntax1165079
Ref: extended mode1166524
Ref: bc1168245
Ref: bs1168455
Ref: read registers packet1170059
Ref: cycle step packet1171992
Ref: write register packet1173868
Ref: step with signal packet1174864
Ref: vCont packet1176318
Ref: vStopped packet1181234
Ref: X packet1181577
Ref: insert breakpoint or watchpoint packet1181863
Node: Stop Reply Packets1184625
Node: General Query Packets1189365
Ref: QNonStop1199427
Ref: QPassSignals1200051
Ref: qSearch memory1202128
Ref: QStartNoAckMode1202626
Ref: qSupported1203156
Ref: multiprocess extensions1212619
Ref: install tracepoint in tracing1214290
Ref: qXfer read1217155
Ref: qXfer auxiliary vector read1217649
Ref: qXfer target description read1217998
Ref: qXfer library list read1218442
Ref: qXfer svr4 library list read1219097
Ref: qXfer memory map read1219732
Ref: qXfer sdata read1220118
Ref: qXfer siginfo read1220582
Ref: qXfer spu read1220978
Ref: qXfer threads read1221501
Ref: qXfer traceframe info read1221903
Ref: qXfer fdpic loadmap read1222324
Ref: qXfer osdata read1222739
Ref: qXfer write1223941
Ref: qXfer siginfo write1224498
Ref: qXfer spu write1224894
Ref: General Query Packets-Footnote-11226981
Node: Architecture-Specific Protocol Details1227308
Node: Tracepoint Packets1228821
Ref: QTEnable1237814
Ref: QTDisable1238010
Node: Host I/O Packets1247500
Node: Interrupts1252118
Node: Notification Packets1254021
Node: Remote Non-Stop1256292
Node: Packet Acknowledgment1260551
Node: Examples1262666
Node: File-I/O Remote Protocol Extension1263292
Node: File-I/O Overview1263754
Node: Protocol Basics1265951
Node: The F Request Packet1268183
Node: The F Reply Packet1269084
Node: The Ctrl-C Message1270002
Node: Console I/O1271631
Node: List of Supported Calls1272848
Node: open1273210
Node: close1275704
Node: read1276086
Node: write1276693
Node: lseek1277460
Node: rename1278338
Node: unlink1279734
Node: stat/fstat1280673
Node: gettimeofday1281560
Node: isatty1281995
Node: system1282591
Node: Protocol-specific Representation of Datatypes1284133
Node: Integral Datatypes1284510
Node: Pointer Values1285317
Node: Memory Transfer1286025
Node: struct stat1286645
Node: struct timeval1288847
Node: Constants1289364
Node: Open Flags1289813
Node: mode_t Values1290154
Node: Errno Values1290646
Node: Lseek Flags1291457
Node: Limits1291642
Node: File-I/O Examples1292002
Node: Library List Format1293118
Node: Library List Format for SVR4 Targets1295901
Node: Memory Map Format1298371
Node: Thread List Format1300948
Node: Traceframe Info Format1301766
Node: Agent Expressions1303223
Node: General Bytecode Design1306044
Node: Bytecode Descriptions1310844
Node: Using Agent Expressions1323209
Node: Varying Target Capabilities1325187
Node: Rationale1326349
Node: Target Descriptions1333735
Node: Retrieving Descriptions1335611
Node: Target Description Format1336696
Node: Predefined Target Types1345745
Node: Standard Target Features1347130
Node: ARM Features1348920
Node: i386 Features1350412
Node: MIPS Features1351516
Node: M68K Features1352461
Node: PowerPC Features1353124
Node: TIC6x Features1354431
Node: Operating System Information1354980
Node: Process list1355818
Node: Trace File Format1356880
Node: Index Section Format1358874
Node: Copying1363657
Node: GNU Free Documentation License1401247
Node: Concept Index1426413
Node: Command and Variable Index1538244

End Tag Table
