This is gdb.info, produced by makeinfo version 5.2 from gdb.texinfo.

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

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

   (a) The FSF's Back-Cover Text is: "You are free to copy and modify
this GNU Manual.  Buying copies from GNU Press supports the FSF in
developing GNU and promoting software freedom."
INFO-DIR-SECTION Software development
START-INFO-DIR-ENTRY
* Gdb: (gdb).                     The GNU debugger.
* gdbserver: (gdb) Server.        The GNU debugging server.
END-INFO-DIR-ENTRY

   This file documents the GNU debugger GDB.

   This is the Tenth Edition, of 'Debugging with GDB: the GNU
Source-Level Debugger' for GDB (Linaro GDB 2015.08) Version
7.10.0.20151009-cvs.

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

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

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


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 GDB 2015.08) Version
7.10.0.20151009-cvs.

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

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

* Menu:

* Summary::                     Summary of 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.
* In-Process Agent::            In-Process Agent

* 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
* Man Pages::			Manual pages
* Copying::			GNU General Public License says
                                how you can copy and share GDB
* GNU Free Documentation License::  The license for this documentation
* Concept Index::               Index of GDB concepts
* Command and Variable Index::  Index of GDB commands, variables,
                                  functions, and Python data types


File: gdb.info,  Node: Summary,  Next: Sample Session,  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
* Free Documentation::          Free Software Needs Free Documentation
* Contributors::                Contributors to GDB


File: gdb.info,  Node: Free Software,  Next: Free Documentation,  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.

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

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 Documentation,  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.10.0.20151009-cvs, 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' (or
'-q'/'--quiet'):

     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

'-init-command FILE'
'-ix FILE'
     Execute commands from file FILE before loading the inferior (but
     after loading gdbinit files).  *Note Startup::.

'-init-eval-command COMMAND'
'-iex COMMAND'
     Execute a single GDB command before loading the inferior (but after
     loading gdbinit files).  *Note Startup::.

'-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 file.  There
     are three init files, loaded in the following order:

     'system.gdbinit'
          This is the system-wide init file.  Its location is specified
          with the '--with-system-gdbinit' configure option (*note
          System-wide configuration::).  It is loaded first when GDB
          starts, before command line options have been processed.
     '~/.gdbinit'
          This is the init file in your home directory.  It is loaded
          next, after 'system.gdbinit', and before command options have
          been processed.
     './.gdbinit'
          This is the init file in the current directory.  It is loaded
          last, after command line options other than '-x' and '-ex'
          have been processed.  Command line options '-x' and '-ex' are
          processed last, after './.gdbinit' has been loaded.

     For further documentation on startup processing, *Note Startup::.
     For documentation on how to write command files, *Note Command
     Files: Command Files.

'-nh'
     Do not execute commands found in '~/.gdbinit', the init file in
     your home directory.  *Note Startup::.

'-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'
'-D 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.

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

'-configuration'
     This option causes GDB to print details about its build-time
     configuration parameters, and then exit.  These details can be
     important when reporting GDB bugs (*note GDB Bugs::).


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. Executes commands and command files specified by the '-iex' and
     '-ix' options in their specified order.  Usually you should use the
     '-ex' and '-x' options instead, but this way you can apply settings
     before GDB init files get executed and before inferior gets loaded.

  5. Processes command line options and operands.

  6. Reads and executes the commands from init file (if any) in the
     current working directory as long as 'set auto-load local-gdbinit'
     is set to 'on' (*note Init File in the Current Directory::).  This
     is only done if the current directory is different from your home
     directory.  Thus, you can have more than one init file, one generic
     in your home directory, and another, specific to the program you
     are debugging, in the directory where you invoke GDB.

  7. 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 -iex "set auto-load python-scripts off" myprogram

     Option '-ex' does not work because the auto-loading is then turned
     off too late.

  8. Executes commands and command files specified by the '-ex' and '-x'
     options in their specified order.  *Note Command Files::, for more
     details about GDB command files.

  9. 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 port of GDB uses the standard
name, but if it finds a 'gdb.ini' file in your home directory, it warns
you about that and suggests 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 '?'.

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

     (gdb) b m<TAB><TAB>
     main
     <... the rest of the possible completions ...>
     *** List may be truncated, max-completions reached. ***
     (gdb) b m

This behavior can be controlled with the following commands:

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

   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 alias

     results in:

          alias -- Define a new command that is an alias of an existing command
          aliases -- Aliases of other commands
          d -- Delete some breakpoints or auto-display expressions
          del -- Delete some breakpoints or auto-display expressions
          delete -- Delete some breakpoints or auto-display expressions

'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 several 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.

'show configuration'
     Display detailed information about the way GDB was configured when
     it was built.  This displays the optional arguments passed to the
     'configure' script and also configuration parameters detected
     automatically by 'configure'.  When reporting a GDB bug (*note GDB
     Bugs::), it is important to include this information in your
     report.


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 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.  If you
     do not define 'SHELL', GDB uses the default shell ('/bin/sh').  You
     can disable use of any shell with the 'set startup-with-shell'
     command (see below for details).

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 startup-with-shell'
'set startup-with-shell on'
'set startup-with-shell off'
'show set startup-with-shell'
     On Unix systems, by default, if a shell is available on your
     target, GDB) uses it to start your program.  Arguments of the 'run'
     command are passed to the shell, which does variable substitution,
     expands wildcard characters and performs redirection of I/O. In
     some circumstances, it may be useful to disable such use of a
     shell, for example, when debugging the shell itself or diagnosing
     startup failures such as:

          (gdb) run
          Starting program: ./a.out
          During startup program terminated with signal SIGSEGV, Segmentation fault.

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

'set auto-connect-native-target'
'set auto-connect-native-target on'
'set auto-connect-native-target off'
'show auto-connect-native-target'

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

     If 'on', which is the default, and if GDB is not connected to a
     target already, the 'run' command automaticaly connects to the
     native target, if one is available.

     If 'off', and if GDB is not connected to a target already, the
     'run' command fails with an error:

          (gdb) run
          Don't know how to run.  Try "help target".

     If GDB is already connected to a target, GDB always uses it with
     the 'run' command.

     In any case, you can explicitly connect to the native target with
     the 'target native' command.  For example,

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

     In case you connected explicitly to the 'native' target, GDB
     remains connected even if all inferiors exit, ready for the next
     'run' command.  Use the 'disconnect' command to disconnect.

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

'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 (and the shell GDB uses to launch it), not for GDB
     itself.  The 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.)

     Note that on Unix systems, GDB runs your program via a shell, which
     also inherits the environment set with 'set environment'.  If
     necessary, you can avoid that by using the 'env' program as a
     wrapper instead of using 'set environment'.  *Note set
     exec-wrapper::, for an example doing just that.

'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 when started non-interactively--such as '.cshrc' for
C-shell, $'.zshenv' for the Z shell, or the file specified in the
'BASH_ENV' environment variable for BASH--any variables you set in that
file affect your program.  You may wish to move setting of environment
variables to files that are only run when you sign on, such as '.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.  If not given,
     DIRECTORY uses ''~''.

'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, and 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]', where 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 [-ascending]] 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 in
     descending order, type 'thread apply all COMMAND'.  To apply a
     command to all threads in ascending order, type 'thread apply all
     -ascending 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'.  GDB also consults first if inferior specific
     thread debugging library loading is enabled by 'set auto-load
     libthread-db' (*note libthread_db.so.1 file::).

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

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

   The fork debugging commands are supported in both native mode and
when connected to 'gdbserver' using 'target extended-remote'.

   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
* Dynamic Printf::              Dynamic printf
* Save Breakpoints::            How to save breakpoints in a file
* Static Probe Points::         Listing static probe points
* Error in Breakpoints::        "Cannot insert breakpoints"
* Breakpoint-related Warnings:: "Breakpoint address adjusted..."


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.  The 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.  The 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.  The
     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, there are two evaluation modes:
     "host" and "target".  If mode is "host", breakpoint condition
     evaluation is done by GDB on the host's side.  If it is "target",
     then the condition is evaluated by the target.  The 'info break'
     command shows the condition on the line following the affected
     breakpoint, together with its condition evaluation mode in between
     parentheses.

     Breakpoint commands, if any, are listed after that.  A pending
     breakpoint is allowed to have a condition specified for it.  The
     condition is not parsed for validity until a shared library is
     loaded that allows the pending breakpoint to resolve to a valid
     location.

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

     For a breakpoints with an enable count (xref) greater than 1, 'info
     break' also displays that count.

   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.  This is the default mode.

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

   GDB handles conditional breakpoints by evaluating these conditions
when a breakpoint breaks.  If the condition is true, then the process
being debugged stops, otherwise the process is resumed.

   If the target supports evaluating conditions on its end, GDB may
download the breakpoint, together with its conditions, to it.

   This feature can be controlled via the following commands:

'set breakpoint condition-evaluation host'
     This option commands GDB to evaluate the breakpoint conditions on
     the host's side.  Unconditional breakpoints are sent to the target
     which in turn receives the triggers and reports them back to GDB
     for condition evaluation.  This is the standard evaluation mode.

'set breakpoint condition-evaluation target'
     This option commands GDB to download breakpoint conditions to the
     target at the moment of their insertion.  The target is responsible
     for evaluating the conditional expression and reporting breakpoint
     stop events back to GDB whenever the condition is true.  Due to
     limitations of target-side evaluation, some conditions cannot be
     evaluated there, e.g., conditions that depend on local data that is
     only known to the host.  Examples include conditional expressions
     involving convenience variables, complex types that cannot be
     handled by the agent expression parser and expressions that are too
     long to be sent over to the target, specially when the target is a
     remote system.  In these cases, the conditions will be evaluated by
     GDB.

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

   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.  The EVENT can be any of the following:

     'throw [REGEXP]'
     'rethrow [REGEXP]'
     'catch [REGEXP]'
          The throwing, re-throwing, or catching of a C++ exception.

          If REGEXP is given, then only exceptions whose type matches
          the regular expression will be caught.

          The convenience variable '$_exception' is available at an
          exception-related catchpoint, on some systems.  This holds the
          exception being thrown.

          There are currently some limitations to C++ exception handling
          in GDB:

             * The support for these commands is system-dependent.
               Currently, only systems using the 'gnu-v3' C++ ABI (*note
               ABI::) are supported.

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

             * The '$_exception' convenience variable is only valid at
               the instruction at which an exception-related catchpoint
               is set.

             * When an exception-related catchpoint is hit, GDB stops at
               a location in the system library which implements runtime
               exception support for C++, usually 'libstdc++'.  You can
               use 'up' (*note Selection::) to get to your code.

             * 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.  *Note Calling::, for information on controlling
               this with 'set unwind-on-terminating-exception'.

             * You cannot raise an exception interactively.

             * You cannot install an exception handler interactively.

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

     'load [regexp]'
     'unload [regexp]'
          The loading or unloading of a shared library.  If REGEXP is
          given, then the catchpoint will stop only if the regular
          expression matches one of the affected libraries.

     'signal [SIGNAL... | 'all']'
          The delivery of a signal.

          With no arguments, this catchpoint will catch any signal that
          is not used internally by GDB, specifically, all signals
          except 'SIGTRAP' and 'SIGINT'.

          With the argument 'all', all signals, including those used by
          GDB, will be caught.  This argument cannot be used with other
          signal names.

          Otherwise, the arguments are a list of signal names as given
          to 'handle' (*note Signals::).  Only signals specified in this
          list will be caught.

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

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

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


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 several
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 a count.  The breakpoint stops your program for the
     next N times, 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] count COUNT RANGE...'
     Enable the specified breakpoints temporarily.  GDB records COUNT
     with each of the specified breakpoints, and decrements a
     breakpoint's count when it is hit.  When any count reaches 0, GDB
     disables that breakpoint.  If a breakpoint has an ignore count
     (*note Break Conditions: Conditions.), that will be decremented to
     0 before COUNT is affected.

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

   Breakpoint conditions can also be evaluated on the target's side if
the target supports it.  Instead of evaluating the conditions locally,
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.

   In this case, GDB will only be notified of a breakpoint trigger when
its condition evaluates to true.  This mechanism may provide faster
response times depending on the performance characteristics of the
target since it does not need to keep GDB informed about every
breakpoint trigger, even those with false conditions.

   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: Dynamic Printf,  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: Dynamic Printf,  Next: Save Breakpoints,  Prev: Break Commands,  Up: Breakpoints

5.1.8 Dynamic Printf
--------------------

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

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

   If you are doing remote debugging with a stub or agent, you can also
ask to have the printf handled by the remote agent.  In addition to
ensuring that the output goes to the remote program's device along with
any other output the program might produce, you can also ask that the
dprintf remain active even after disconnecting from the remote target.
Using the stub/agent is also more efficient, as it can do everything
without needing to communicate with GDB.

'dprintf LOCATION,TEMPLATE,EXPRESSION[,EXPRESSION...]'
     Whenever execution reaches LOCATION, print the values of one or
     more EXPRESSIONS under the control of the string TEMPLATE.  To
     print several values, separate them with commas.

'set dprintf-style STYLE'
     Set the dprintf output to be handled in one of several different
     styles enumerated below.  A change of style affects all existing
     dynamic printfs immediately.  (If you need individual control over
     the print commands, simply define normal breakpoints with
     explicitly-supplied command lists.)

'gdb'
     Handle the output using the GDB 'printf' command.

'call'
     Handle the output by calling a function in your program (normally
     'printf').

'agent'
     Have the remote debugging agent (such as 'gdbserver') handle the
     output itself.  This style is only available for agents that
     support running commands on the target.

'set dprintf-function FUNCTION'
     Set the function to call if the dprintf style is 'call'.  By
     default its value is 'printf'.  You may set it to any expression.
     that GDB can evaluate to a function, as per the 'call' command.

'set dprintf-channel CHANNEL'
     Set a "channel" for dprintf.  If set to a non-empty value, GDB will
     evaluate it as an expression and pass the result as a first
     argument to the 'dprintf-function', in the manner of 'fprintf' and
     similar functions.  Otherwise, the dprintf format string will be
     the first argument, in the manner of 'printf'.

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

          (gdb) set dprintf-style call
          (gdb) set dprintf-function fprintf
          (gdb) set dprintf-channel mylog
          (gdb) dprintf 25,"at line 25, glob=%d\n",glob
          Dprintf 1 at 0x123456: file main.c, line 25.
          (gdb) info break
          1       dprintf        keep y   0x00123456 in main at main.c:25
                  call (void) fprintf (mylog,"at line 25, glob=%d\n",glob)
                  continue
          (gdb)

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

'set disconnected-dprintf on'
'set disconnected-dprintf off'
     Choose whether 'dprintf' commands should continue to run if GDB has
     disconnected from the target.  This only applies if the
     'dprintf-style' is 'agent'.

'show disconnected-dprintf off'
     Show the current choice for disconnected 'dprintf'.

   GDB does not check the validity of function and channel, relying on
you to supply values that are meaningful for the contexts in which they
are being used.  For instance, the function and channel may be the
values of local variables, but if that is the case, then all enabled
dynamic prints must be at locations within the scope of those locals.
If evaluation fails, GDB will report an error.


File: gdb.info,  Node: Save Breakpoints,  Next: Static Probe Points,  Prev: Dynamic Printf,  Up: Breakpoints

5.1.9 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: Static Probe Points,  Next: Error in Breakpoints,  Prev: Save Breakpoints,  Up: Breakpoints

5.1.10 Static Probe Points
--------------------------

GDB supports "SDT" probes in the code.  SDT stands for Statically
Defined Tracing, and the probes are designed to have a tiny runtime code
and data footprint, and no dynamic relocations.

   Currently, the following types of probes are supported on
ELF-compatible systems:

   * 'SystemTap' (<http://sourceware.org/systemtap/>) SDT probes(1).
     'SystemTap' probes are usable from assembly, C and C++
     languages(2).

   * 'DTrace' (<http://oss.oracle.com/projects/DTrace>) USDT probes.
     'DTrace' probes are usable from C and C++ languages.

   Some 'SystemTap' probes have an associated semaphore variable; for
instance, this happens automatically if you defined your probe using a
DTrace-style '.d' file.  If your probe has a semaphore, GDB will
automatically enable it when you specify a breakpoint using the
'-probe-stap' notation.  But, if you put a breakpoint at a probe's
location by some other method (e.g., 'break file:line'), then GDB will
not automatically set the semaphore.  'DTrace' probes do not support
semaphores.

   You can examine the available static static probes using 'info
probes', with optional arguments:

'info probes [TYPE] [PROVIDER [NAME [OBJFILE]]]'
     If given, TYPE is either 'stap' for listing 'SystemTap' probes or
     'dtrace' for listing 'DTrace' probes.  If omitted all probes are
     listed regardless of their types.

     If given, PROVIDER is a regular expression used to match against
     provider names when selecting which probes to list.  If omitted,
     probes by all probes from all providers are listed.

     If given, NAME is a regular expression to match against probe names
     when selecting which probes to list.  If omitted, probe names are
     not considered when deciding whether to display them.

     If given, OBJFILE is a regular expression used to select which
     object files (executable or shared libraries) to examine.  If not
     given, all object files are considered.

'info probes all'
     List the available static probes, from all types.

   Some probe points can be enabled and/or disabled.  The effect of
enabling or disabling a probe depends on the type of probe being
handled.  Some 'DTrace' probes can be enabled or disabled, but
'SystemTap' probes cannot be disabled.

   You can enable (or disable) one or more probes using the following
commands, with optional arguments:

'enable probes [PROVIDER [NAME [OBJFILE]]]'
     If given, PROVIDER is a regular expression used to match against
     provider names when selecting which probes to enable.  If omitted,
     all probes from all providers are enabled.

     If given, NAME is a regular expression to match against probe names
     when selecting which probes to enable.  If omitted, probe names are
     not considered when deciding whether to enable them.

     If given, OBJFILE is a regular expression used to select which
     object files (executable or shared libraries) to examine.  If not
     given, all object files are considered.

'disable probes [PROVIDER [NAME [OBJFILE]]]'
     See the 'enable probes' command above for a description of the
     optional arguments accepted by this command.

   A probe may specify up to twelve arguments.  These are available at
the point at which the probe is defined--that is, when the current PC is
at the probe's location.  The arguments are available using the
convenience variables (*note Convenience Vars::)
'$_probe_arg0'...'$_probe_arg11'.  In 'SystemTap' probes each probe
argument is an integer of the appropriate size; types are not preserved.
In 'DTrace' probes types are preserved provided that they are recognized
as such by GDB; otherwise the value of the probe argument will be a long
integer.  The convenience variable '$_probe_argc' holds the number of
arguments at the current probe point.

   These variables are always available, but attempts to access them at
any location other than a probe point will cause GDB to give an error
message.

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

   (1) See
<http://sourceware.org/systemtap/wiki/AddingUserSpaceProbingToApps> for
more information on how to add 'SystemTap' SDT probes in your
applications.

   (2) See
<http://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation> for
a good reference on how the SDT probes are implemented.

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

5.1.11 "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.12 "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.), or you may step into the signal's
handler (*note stepping and signal handlers::).)

'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.  The 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'.

   By default, and if available, GDB makes use of target-assisted "range
stepping".  In other words, whenever you use a stepping command (e.g.,
'step', 'next'), GDB tells the target to step the corresponding range of
instruction addresses instead of issuing multiple single-steps.  This
speeds up line stepping, particularly for remote targets.  Ideally,
there should be no reason you would want to turn range stepping off.
However, it's possible that a bug in the debug info, a bug in the remote
stub (for remote targets), or even a bug in GDB could make line stepping
behave incorrectly when target-assisted range stepping is enabled.  You
can use the following command to turn off range stepping if necessary:

'set range-stepping'
'show range-stepping'
     Control whether range stepping is enabled.

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

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

'catch signal [SIGNAL... | 'all']'
     Set a catchpoint for the indicated signals.  *Note Set
     Catchpoints::, for details about this command.

'handle SIGNAL [KEYWORDS...]'
     Change the way GDB handles signal SIGNAL.  The 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.

   GDB optimizes for stepping the mainline code.  If a signal that has
'handle nostop' and 'handle pass' set arrives while a stepping command
(e.g., 'stepi', 'step', 'next') is in progress, GDB lets the signal
handler run and then resumes stepping the mainline code once the signal
handler returns.  In other words, GDB steps over the signal handler.
This prevents signals that you've specified as not interesting (with
'handle nostop') from changing the focus of debugging unexpectedly.
Note that the signal handler itself may still hit a breakpoint, stop for
another signal that has 'handle stop' in effect, or for any other event
that normally results in stopping the stepping command sooner.  Also
note that GDB still informs you that the program received a signal if
'handle print' is set.

   If you set 'handle pass' for a signal, and your program sets up a
handler for it, then issuing a stepping command, such as 'step' or
'stepi', when your program is stopped due to the signal will step _into_
the signal handler (if the target supports that).

   Likewise, if you use the 'queue-signal' command to queue a signal to
be delivered to the current thread when execution of the thread resumes
(*note Giving your Program a Signal: Signaling.), then a stepping
command will step into the signal handler.

   Here's an example, using 'stepi' to step to the first instruction of
'SIGUSR1''s handler:

     (gdb) handle SIGUSR1
     Signal        Stop      Print   Pass to program Description
     SIGUSR1       Yes       Yes     Yes             User defined signal 1
     (gdb) c
     Continuing.

     Program received signal SIGUSR1, User defined signal 1.
     main () sigusr1.c:28
     28        p = 0;
     (gdb) si
     sigusr1_handler () at sigusr1.c:9
     9       {

   The same, but using 'queue-signal' instead of waiting for the program
to receive the signal first:

     (gdb) n
     28        p = 0;
     (gdb) queue-signal SIGUSR1
     (gdb) si
     sigusr1_handler () at sigusr1.c:9
     9       {
     (gdb)

   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
     never get a chance to run when you step, 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:

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

   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.  The THREADNO specifier
     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

   Thread-specific breakpoints are automatically deleted when GDB
detects the corresponding thread is no longer in the thread list.  For
example:

     (gdb) c
     Thread-specific breakpoint 3 deleted - thread 28 no longer in the thread list.

   There are several ways for a thread to disappear, such as a regular
thread exit, but also when you detach from the process with the 'detach'
command (*note Debugging an Already-running Process: Attach.), or if GDB
loses the remote connection (*note Remote Debugging::), etc.  Note that
with some targets, GDB is only able to detect a thread has exited when
the user explictly asks for the thread list with the 'info threads'
command.


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:

'record METHOD'
     This command starts the process record and replay target.  The
     recording method can be specified as parameter.  Without a
     parameter the command uses the 'full' recording method.  The
     following recording methods are available:

     'full'
          Full record/replay recording using GDB's software record and
          replay implementation.  This method allows replaying and
          reverse execution.

     'btrace FORMAT'
          Hardware-supported instruction recording.  This method does
          not record data.  Further, the data is collected in a ring
          buffer so old data will be overwritten when the buffer is
          full.  It allows limited reverse execution.  Variables and
          registers are not available during reverse execution.

          The recording format can be specified as parameter.  Without a
          parameter the command chooses the recording format.  The
          following recording formats are available:

          'bts'
               Use the "Branch Trace Store" (BTS) recording format.  In
               this format, the processor stores a from/to record for
               each executed branch in the btrace ring buffer.

          'pt'
               Use the "Intel(R) Processor Trace" recording format.  In
               this format, the processor stores the execution trace in
               a compressed form that is afterwards decoded by GDB.

               The trace can be recorded with very low overhead.  The
               compressed trace format also allows small trace buffers
               to already contain a big number of instructions compared
               to BTS.

               Decoding the recorded execution trace, on the other hand,
               is more expensive than decoding BTS trace.  This is
               mostly due to the increased number of instructions to
               process.  You should increase the buffer-size with care.

          Not all recording formats may be available on all processors.

     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 'record METHOD' command.

     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::),
     not all recording methods are available.  The 'full' recording
     method does not 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 goto'
     Go to a specific location in the execution log.  There are several
     ways to specify the location to go to:

     'record goto begin'
     'record goto start'
          Go to the beginning of the execution log.

     'record goto end'
          Go to the end of the execution log.

     'record goto N'
          Go to instruction number N in the execution log.

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

     This command may not be available for all recording methods.

'record restore FILENAME'
     Restore the execution log from a file 'FILENAME'.  File must have
     been created with 'record save'.

'set record full insn-number-max LIMIT'
'set record full insn-number-max unlimited'
     Set the limit of instructions to be recorded for the 'full'
     recording method.  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 'unlimited' or zero, GDB will never delete recorded
     instructions from the execution log.  The number of recorded
     instructions is limited only by the available memory.

'show record full insn-number-max'
     Show the limit of instructions to be recorded with the 'full'
     recording method.

'set record full stop-at-limit'
     Control the behavior of the 'full' recording method 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 full stop-at-limit'
     Show the current setting of 'stop-at-limit'.

'set record full memory-query'
     Control the behavior when GDB is unable to record memory changes
     caused by an instruction for the 'full' recording method.  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 full memory-query'
     Show the current setting of 'memory-query'.

     The 'btrace' record target does not trace data.  As a convenience,
     when replaying, GDB reads read-only memory off the live program
     directly, assuming that the addresses of the read-only areas don't
     change.  This for example makes it possible to disassemble code
     while replaying, but not to print variables.  In some cases, being
     able to inspect variables might be useful.  You can use the
     following command for that:

'set record btrace replay-memory-access'
     Control the behavior of the 'btrace' recording method when
     accessing memory during replay.  If 'read-only' (the default), GDB
     will only allow accesses to read-only memory.  If 'read-write', GDB
     will allow accesses to read-only and to read-write memory.  Beware
     that the accessed memory corresponds to the live target and not
     necessarily to the current replay position.

'show record btrace replay-memory-access'
     Show the current setting of 'replay-memory-access'.

'set record btrace bts buffer-size SIZE'
'set record btrace bts buffer-size unlimited'
     Set the requested ring buffer size for branch tracing in BTS
     format.  Default is 64KB.

     If SIZE is a positive number, then GDB will try to allocate a
     buffer of at least SIZE bytes for each new thread that uses the
     btrace recording method and the BTS format.  The actually obtained
     buffer size may differ from the requested SIZE.  Use the 'info
     record' command to see the actual buffer size for each thread that
     uses the btrace recording method and the BTS format.

     If LIMIT is 'unlimited' or zero, GDB will try to allocate a buffer
     of 4MB.

     Bigger buffers mean longer traces.  On the other hand, GDB will
     also need longer to process the branch trace data before it can be
     used.

'show record btrace bts buffer-size SIZE'
     Show the current setting of the requested ring buffer size for
     branch tracing in BTS format.

'set record btrace pt buffer-size SIZE'
'set record btrace pt buffer-size unlimited'
     Set the requested ring buffer size for branch tracing in Intel(R)
     Processor Trace format.  Default is 16KB.

     If SIZE is a positive number, then GDB will try to allocate a
     buffer of at least SIZE bytes for each new thread that uses the
     btrace recording method and the Intel(R) Processor Trace format.
     The actually obtained buffer size may differ from the requested
     SIZE.  Use the 'info record' command to see the actual buffer size
     for each thread.

     If LIMIT is 'unlimited' or zero, GDB will try to allocate a buffer
     of 4MB.

     Bigger buffers mean longer traces.  On the other hand, GDB will
     also need longer to process the branch trace data before it can be
     used.

'show record btrace pt buffer-size SIZE'
     Show the current setting of the requested ring buffer size for
     branch tracing in Intel(R) Processor Trace format.

'info record'
     Show various statistics about the recording depending on the
     recording method:

     'full'
          For the 'full' recording method, it shows 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.

     'btrace'
          For the 'btrace' recording method, it shows:

             * Recording format.
             * Number of instructions that have been recorded.
             * Number of blocks of sequential control-flow formed by the
               recorded instructions.
             * Whether in record mode or replay mode.

          For the 'bts' recording format, it also shows:
             * Size of the perf ring buffer.

          For the 'pt' recording format, it also shows:
             * Size of the perf ring buffer.

'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".

'record instruction-history'
     Disassembles instructions from the recorded execution log.  By
     default, ten instructions are disassembled.  This can be changed
     using the 'set record instruction-history-size' command.
     Instructions are printed in execution order.  There are several
     ways to specify what part of the execution log to disassemble:

     'record instruction-history INSN'
          Disassembles ten instructions starting from instruction number
          INSN.

     'record instruction-history INSN, +/-N'
          Disassembles N instructions around instruction number INSN.
          If N is preceded with '+', disassembles N instructions after
          instruction number INSN.  If N is preceded with '-',
          disassembles N instructions before instruction number INSN.

     'record instruction-history'
          Disassembles ten more instructions after the last disassembly.

     'record instruction-history -'
          Disassembles ten more instructions before the last
          disassembly.

     'record instruction-history BEGIN END'
          Disassembles instructions beginning with instruction number
          BEGIN until instruction number END.  The instruction number
          END is included.

     This command may not be available for all recording methods.

'set record instruction-history-size SIZE'
'set record instruction-history-size unlimited'
     Define how many instructions to disassemble in the 'record
     instruction-history' command.  The default value is 10.  A SIZE of
     'unlimited' means unlimited instructions.

'show record instruction-history-size'
     Show how many instructions to disassemble in the 'record
     instruction-history' command.

'record function-call-history'
     Prints the execution history at function granularity.  It prints
     one line for each sequence of instructions that belong to the same
     function giving the name of that function, the source lines for
     this instruction sequence (if the '/l' modifier is specified), and
     the instructions numbers that form the sequence (if the '/i'
     modifier is specified).  The function names are indented to reflect
     the call stack depth if the '/c' modifier is specified.  The '/l',
     '/i', and '/c' modifiers can be given together.

          (gdb) list 1, 10
          1   void foo (void)
          2   {
          3   }
          4
          5   void bar (void)
          6   {
          7     ...
          8     foo ();
          9     ...
          10  }
          (gdb) record function-call-history /ilc
          1  bar     inst 1,4     at foo.c:6,8
          2    foo   inst 5,10    at foo.c:2,3
          3  bar     inst 11,13   at foo.c:9,10

     By default, ten lines are printed.  This can be changed using the
     'set record function-call-history-size' command.  Functions are
     printed in execution order.  There are several ways to specify what
     to print:

     'record function-call-history FUNC'
          Prints ten functions starting from function number FUNC.

     'record function-call-history FUNC, +/-N'
          Prints N functions around function number FUNC.  If N is
          preceded with '+', prints N functions after function number
          FUNC.  If N is preceded with '-', prints N functions before
          function number FUNC.

     'record function-call-history'
          Prints ten more functions after the last ten-line print.

     'record function-call-history -'
          Prints ten more functions before the last ten-line print.

     'record function-call-history BEGIN END'
          Prints functions beginning with function number BEGIN until
          function number END.  The function number END is included.

     This command may not be available for all recording methods.

'set record function-call-history-size SIZE'
'set record function-call-history-size unlimited'
     Define how many lines to print in the 'record
     function-call-history' command.  The default value is 10.  A size
     of 'unlimited' means unlimited lines.

'show record function-call-history-size'
     Show how many lines to print in the 'record function-call-history'
     command.


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
* Frame Filter Management::     Managing frame filters
* 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 [FRAMESPEC]'
     The 'frame' command allows you to move from one stack frame to
     another, and to print the stack frame you select.  The FRAMESPEC
     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: Frame Filter Management,  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.  As described above,
     N specifies the number of frames to print.

'backtrace no-filters'
'bt no-filters'
'bt no-filters N'
'bt no-filters -N'
'bt no-filters full'
'bt no-filters full N'
'bt no-filters full -N'
     Do not run Python frame filters on this backtrace.  *Note Frame
     Filter API::, for more information.  Additionally use *note disable
     frame-filter all:: to turn off all frame filters.  This is only
     relevant when GDB has been configured with 'Python' support.

   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'
'set backtrace limit unlimited'
     Limit the backtrace to N levels.  A value of 'unlimited' or zero
     means unlimited levels.

'show backtrace limit'
     Display the current limit on backtrace levels.

   You can control how file names are displayed.

'set filename-display'
'set filename-display relative'
     Display file names relative to the compilation directory.  This is
     the default.

'set filename-display basename'
     Display only basename of a filename.

'set filename-display absolute'
     Display an absolute filename.

'show filename-display'
     Show the current way to display filenames.

   ---------- 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: Frame Filter Management,  Next: Selection,  Prev: Backtrace,  Up: Stack

8.3 Management of Frame Filters.
================================

Frame filters are Python based utilities to manage and decorate the
output of frames.  *Note Frame Filter API::, for further information.

   Managing frame filters is performed by several commands available
within GDB, detailed here.

'info frame-filter'
     Print a list of installed frame filters from all dictionaries,
     showing their name, priority and enabled status.

'disable frame-filter FILTER-DICTIONARY FILTER-NAME'
     Disable a frame filter in the dictionary matching FILTER-DICTIONARY
     and FILTER-NAME.  The FILTER-DICTIONARY may be 'all', 'global',
     'progspace', or the name of the object file where the frame filter
     dictionary resides.  When 'all' is specified, all frame filters
     across all dictionaries are disabled.  The FILTER-NAME is the name
     of the frame filter and is used when 'all' is not the option for
     FILTER-DICTIONARY.  A disabled frame-filter is not deleted, it may
     be enabled again later.

'enable frame-filter FILTER-DICTIONARY FILTER-NAME'
     Enable a frame filter in the dictionary matching FILTER-DICTIONARY
     and FILTER-NAME.  The FILTER-DICTIONARY may be 'all', 'global',
     'progspace' or the name of the object file where the frame filter
     dictionary resides.  When 'all' is specified, all frame filters
     across all dictionaries are enabled.  The FILTER-NAME is the name
     of the frame filter and is used when 'all' is not the option for
     FILTER-DICTIONARY.

     Example:

          (gdb) info frame-filter

          global frame-filters:
            Priority  Enabled  Name
            1000      No       PrimaryFunctionFilter
            100       Yes      Reverse

          progspace /build/test frame-filters:
            Priority  Enabled  Name
            100       Yes      ProgspaceFilter

          objfile /build/test frame-filters:
            Priority  Enabled  Name
            999       Yes      BuildProgra Filter

          (gdb) disable frame-filter /build/test BuildProgramFilter
          (gdb) info frame-filter

          global frame-filters:
            Priority  Enabled  Name
            1000      No       PrimaryFunctionFilter
            100       Yes      Reverse

          progspace /build/test frame-filters:
            Priority  Enabled  Name
            100       Yes      ProgspaceFilter

          objfile /build/test frame-filters:
            Priority  Enabled  Name
            999       No       BuildProgramFilter

          (gdb) enable frame-filter global PrimaryFunctionFilter
          (gdb) info frame-filter

          global frame-filters:
            Priority  Enabled  Name
            1000      Yes      PrimaryFunctionFilter
            100       Yes      Reverse

          progspace /build/test frame-filters:
            Priority  Enabled  Name
            100       Yes      ProgspaceFilter

          objfile /build/test frame-filters:
            Priority  Enabled  Name
            999       No       BuildProgramFilter

'set frame-filter priority FILTER-DICTIONARY FILTER-NAME PRIORITY'
     Set the PRIORITY of a frame filter in the dictionary matching
     FILTER-DICTIONARY, and the frame filter name matching FILTER-NAME.
     The FILTER-DICTIONARY may be 'global', 'progspace' or the name of
     the object file where the frame filter dictionary resides.  The
     PRIORITY is an integer.

'show frame-filter priority FILTER-DICTIONARY FILTER-NAME'
     Show the PRIORITY of a frame filter in the dictionary matching
     FILTER-DICTIONARY, and the frame filter name matching FILTER-NAME.
     The FILTER-DICTIONARY may be 'global', 'progspace' or the name of
     the object file where the frame filter dictionary resides.

     Example:

          (gdb) info frame-filter

          global frame-filters:
            Priority  Enabled  Name
            1000      Yes      PrimaryFunctionFilter
            100       Yes      Reverse

          progspace /build/test frame-filters:
            Priority  Enabled  Name
            100       Yes      ProgspaceFilter

          objfile /build/test frame-filters:
            Priority  Enabled  Name
            999       No       BuildProgramFilter

          (gdb) set frame-filter priority global Reverse 50
          (gdb) info frame-filter

          global frame-filters:
            Priority  Enabled  Name
            1000      Yes      PrimaryFunctionFilter
            50        Yes      Reverse

          progspace /build/test frame-filters:
            Priority  Enabled  Name
            100       Yes      ProgspaceFilter

          objfile /build/test frame-filters:
            Priority  Enabled  Name
            999       No       BuildProgramFilter


File: gdb.info,  Node: Selection,  Next: Frame Info,  Prev: Frame Filter Management,  Up: Stack

8.4 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 STACK-ADDR [ PC-ADDR ]'
'f STACK-ADDR [ PC-ADDR ]'
     Select the frame at address STACK-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.  The optional PC-ADDR can also be given
     to specify the value of PC for the stack frame.

'up N'
     Move N frames up the stack; N defaults to 1.  For positive numbers
     N, this advances toward the outermost frame, to higher frame
     numbers, to frames that have existed longer.

'down N'
     Move N frames down the stack; N defaults to 1.  For positive
     numbers N, this advances toward the innermost frame, to lower frame
     numbers, to frames that were created more recently.  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.5 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.


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'
'set listsize unlimited'
     Make the 'list' command display COUNT source lines (unless the
     'list' argument explicitly specifies some other number).  Setting
     COUNT to 'unlimited' or 0 means there's no limit.

'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.  If
     FILENAME is a relative file name, then it will match any source
     file name with the same trailing components.  For example, if
     FILENAME is 'gcc/expr.c', then it will match source file name of
     '/build/trunk/gcc/expr.c', but not '/build/trunk/libcpp/expr.c' or
     '/build/trunk/gcc/x-expr.c'.

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

'-pstap|-probe-stap [OBJFILE:[PROVIDER:]]NAME'
     The GNU/Linux tool 'SystemTap' provides a way for applications to
     embed static probes.  *Note Static Probe Points::, for more
     information on finding and using static probes.  This form of
     linespec specifies the location of such a static probe.

     If OBJFILE is given, only probes coming from that shared library or
     executable matching OBJFILE as a regular expression are considered.
     If PROVIDER is given, then only probes from that provider are
     considered.  If several probes match the spec, GDB will insert a
     breakpoint at each one of those probes.


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.

   Addresses cannot be specified as a linespec (*note Specify
Location::).  So, for example, if you want to disassemble function 'bar'
in file 'foo.c', you must type 'disassemble 'foo.c'::bar' and not
'disassemble foo.c:bar'.

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

   For programs that were dynamically linked and use shared libraries,
instructions that call functions or branch to locations in the shared
libraries might show a seemingly bogus location--it's actually a
location of the relocation table.  On some architectures, 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.

   Another way of examining values of expressions and type information
is through the Python extension command 'explore' (available only if the
GDB build is configured with '--with-python').  It offers an interactive
way to start at the highest level (or, the most abstract level) of the
data type of an expression (or, the data type itself) and explore all
the way down to leaf scalar values/fields embedded in the higher level
data types.

'explore ARG'
     ARG is either an expression (in the source language), or a type
     visible in the current context of the program being debugged.

   The working of the 'explore' command can be illustrated with an
example.  If a data type 'struct ComplexStruct' is defined in your C
program as

     struct SimpleStruct
     {
       int i;
       double d;
     };

     struct ComplexStruct
     {
       struct SimpleStruct *ss_p;
       int arr[10];
     };

followed by variable declarations as

     struct SimpleStruct ss = { 10, 1.11 };
     struct ComplexStruct cs = { &ss, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } };

then, the value of the variable 'cs' can be explored using the 'explore'
command as follows.

     (gdb) explore cs
     The value of `cs' is a struct/class of type `struct ComplexStruct' with
     the following fields:

       ss_p = <Enter 0 to explore this field of type `struct SimpleStruct *'>
        arr = <Enter 1 to explore this field of type `int [10]'>

     Enter the field number of choice:

Since the fields of 'cs' are not scalar values, you are being prompted
to chose the field you want to explore.  Let's say you choose the field
'ss_p' by entering '0'.  Then, since this field is a pointer, you will
be asked if it is pointing to a single value.  From the declaration of
'cs' above, it is indeed pointing to a single value, hence you enter
'y'.  If you enter 'n', then you will be asked if it were pointing to an
array of values, in which case this field will be explored as if it were
an array.

     `cs.ss_p' is a pointer to a value of type `struct SimpleStruct'
     Continue exploring it as a pointer to a single value [y/n]: y
     The value of `*(cs.ss_p)' is a struct/class of type `struct
     SimpleStruct' with the following fields:

       i = 10 .. (Value of type `int')
       d = 1.1100000000000001 .. (Value of type `double')

     Press enter to return to parent value:

If the field 'arr' of 'cs' was chosen for exploration by entering '1'
earlier, then since it is as array, you will be prompted to enter the
index of the element in the array that you want to explore.

     `cs.arr' is an array of `int'.
     Enter the index of the element you want to explore in `cs.arr': 5

     `(cs.arr)[5]' is a scalar value of type `int'.

     (cs.arr)[5] = 4

     Press enter to return to parent value:

   In general, at any stage of exploration, you can go deeper towards
the leaf values by responding to the prompts appropriately, or hit the
return key to return to the enclosing data structure (the higher level
data structure).

   Similar to exploring values, you can use the 'explore' command to
explore types.  Instead of specifying a value (which is typically a
variable name or an expression valid in the current context of the
program being debugged), you specify a type name.  If you consider the
same example as above, your can explore the type 'struct ComplexStruct'
by passing the argument 'struct ComplexStruct' to the 'explore' command.

     (gdb) explore struct ComplexStruct

By responding to the prompts appropriately in the subsequent interactive
session, you can explore the type 'struct ComplexStruct' in a manner
similar to how the value 'cs' was explored in the above example.

   The 'explore' command also has two sub-commands, 'explore value' and
'explore type'.  The former sub-command is a way to explicitly specify
that value exploration of the argument is being invoked, while the
latter is a way to explicitly specify that type exploration of the
argument is being invoked.

'explore value EXPR'
     This sub-command of 'explore' explores the value of the expression
     EXPR (if EXPR is an expression valid in the current context of the
     program being debugged).  The behavior of this command is identical
     to that of the behavior of the 'explore' command being passed the
     argument EXPR.

'explore type ARG'
     This sub-command of 'explore' explores the type of ARG (if ARG is a
     type visible in the current context of program being debugged), or
     the type of the value/expression ARG (if ARG is an expression valid
     in the current context of the program being debugged).  If ARG is a
     type, then the behavior of this command is identical to that of the
     'explore' command being passed the argument ARG.  If ARG is an
     expression, then the behavior of this command will be identical to
     that of the 'explore' command being passed the type of ARG as the
     argument.

* Menu:

* Expressions::                 Expressions
* Ambiguous Expressions::       Ambiguous Expressions
* Variables::                   Program variables
* Arrays::                      Artificial arrays
* Output Formats::              Output formats
* Memory::                      Examining memory
* Auto Display::                Automatic display
* Print Settings::              Print settings
* Pretty Printing::             Python pretty printing
* Value History::               Value history
* Convenience Vars::            Convenience variables
* Convenience Funs::            Convenience functions
* Registers::                   Registers
* Floating Point Hardware::     Floating point hardware
* Vector Unit::                 Vector Unit
* OS Information::              Auxiliary data provided by operating system
* Memory Region Attributes::    Memory region attributes
* Dump/Restore Files::          Copy between memory and a file
* Core File Generation::        Cause a program dump its core
* Character Sets::              Debugging programs that use a different
                                character set than GDB does
* Caching Target Data::         Data caching for targets
* Searching Memory::            Searching memory for a sequence of bytes


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.
     The address 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 by
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

   The '::' notation is normally used for referring to static variables,
since you typically disambiguate uses of local variables in functions by
selecting the appropriate frame and using the simple name of the
variable.  However, you may also use this notation to refer to local
variables in frames enclosing the selected frame:

     void
     foo (int a)
     {
       if (a < 10)
         bar (a);
       else
         process (a);    /* Stop here */
     }

     int
     bar (int a)
     {
       foo (a + 5);
     }

For example, if there is a breakpoint at the commented line, here is
what you might see when the program stops after executing the call
'bar(0)':

     (gdb) p a
     $1 = 10
     (gdb) p bar::a
     $2 = 5
     (gdb) up 2
     #2  0x080483d0 in foo (a=5) at foobar.c:12
     (gdb) p a
     $3 = 5
     (gdb) p bar::a
     $4 = 0

   These uses of '::' are very rarely in conflict with the very similar
use of the same notation in C++.  When they are in conflict, the C++
meaning takes precedence; however, this can be overridden by quoting the
file or function name with single quotes.

   For example, suppose the program is stopped in a method of a class
that has a field named 'includefile', and there is also an include file
named 'includefile' that defines a variable, 'some_global'.

     (gdb) p includefile
     $1 = 23
     (gdb) p includefile::some_global
     A syntax error in expression, near `'.
     (gdb) p 'includefile'::some_global
     $2 = 27

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

'z'
     Like 'x' formatting, the value is treated as an integer and printed
     as hexadecimal, but leading zeros are printed to pad the value to
     the size of the integer type.

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

   Most targets have an addressable memory unit size of 8 bits.  This
means that to each memory address are associated 8 bits of data.  Some
targets, however, have other addressable memory unit sizes.  Within GDB
and this document, the term "addressable memory unit" (or "memory unit"
for short) is used when explicitly referring to a chunk of data of that
size.  The word "byte" is used to refer to a chunk of data of 8 bits,
regardless of the addressable memory unit size of the target.  For most
systems, addressable memory unit is a synonym of byte.

   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.  Or, on any target, you may want to check
whether the program has corrupted its own read-only sections.  The
'compare-sections' command is provided for such situations.

'compare-sections [SECTION-NAME|-r]'
     Compare the data of a loadable section SECTION-NAME in the
     executable file of the program being debugged with the same section
     in the target machine's memory, and report any mismatches.  With no
     arguments, compares all loadable sections.  With an argument of
     '-r', compares all loadable read-only sections.

     Note: for remote targets, this command can be accelerated if the
     target supports computing the CRC checksum of a block of memory
     (*note qCRC packet::).


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'
'set print max-symbolic-offset unlimited'
     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 'unlimited', which tells GDB to
     always print the symbolic form of an address if any symbol precedes
     it.  Zero is equivalent to 'unlimited'.

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

   You can also enable '/a'-like formatting all the time using 'set
print symbol on':

'set print symbol on'
     Tell GDB to print the symbol corresponding to an address, if one
     exists.

'set print symbol off'
     Tell GDB not to print the symbol corresponding to an address.  In
     this mode, GDB will still print the symbol corresponding to
     pointers to functions.  This is the default.

'show print symbol'
     Show whether GDB will display the symbol corresponding to an
     address.

   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 print elements unlimited'
     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 'unlimited' or zero means that the number of elements to print
     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 raw frame-arguments on'
     Print frame arguments in raw, non pretty-printed, form.

'set print raw frame-arguments off'
     Print frame arguments in pretty-printed form, if there is a
     pretty-printer for the value (*note Pretty Printing::), otherwise
     print the value in raw form.  This is the default.

'show print raw frame-arguments'
     Show whether to print frame arguments in raw form.

'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 NUMBER-OF-REPEATS'
'set print repeats unlimited'
     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 'unlimited' or 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.  This is the default.

     'gnu'
          Decode based on the GNU C++ compiler ('g++') encoding
          algorithm.

     '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.  Note that this setting is
     also taken into account when working with variable objects via MI
     (*note GDB/MI::).

'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: Convenience Funs,  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, as well as a list of the convenience functions.
     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'
     When the program being debugged terminates normally, GDB
     automatically sets this variable to the exit code of the program,
     and resets '$_exitsignal' to 'void'.

'$_exitsignal'
     When the program being debugged dies due to an uncaught signal, GDB
     automatically sets this variable to that signal's number, and
     resets '$_exitcode' to 'void'.

     To distinguish between whether the program being debugged has
     exited (i.e., '$_exitcode' is not 'void') or signalled (i.e.,
     '$_exitsignal' is not 'void'), the convenience function '$_isvoid'
     can be used (*note Convenience Functions: Convenience Funs.).  For
     example, considering the following source code:

          #include <signal.h>

          int
          main (int argc, char *argv[])
          {
            raise (SIGALRM);
            return 0;
          }

     A valid way of telling whether the program being debugged has
     exited or signalled would be:

          (gdb) define has_exited_or_signalled
          Type commands for definition of ``has_exited_or_signalled''.
          End with a line saying just ``end''.
          >if $_isvoid ($_exitsignal)
           >echo The program has exited\n
           >else
           >echo The program has signalled\n
           >end
          >end
          (gdb) run
          Starting program:

          Program terminated with signal SIGALRM, Alarm clock.
          The program no longer exists.
          (gdb) has_exited_or_signalled
          The program has signalled

     As can be seen, GDB correctly informs that the program being
     debugged has signalled, since it calls 'raise' and raises a
     'SIGALRM' signal.  If the program being debugged had not called
     'raise', then GDB would report a normal exit:

          (gdb) has_exited_or_signalled
          The program has exited

'$_exception'
     The variable '$_exception' is set to the exception object being
     thrown at an exception-related catchpoint.  *Note Set
     Catchpoints::.

'$_probe_argc'
'$_probe_arg0...$_probe_arg11'
     Arguments to a static probe.  *Note Static Probe Points::.

'$_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.


File: gdb.info,  Node: Convenience Funs,  Next: Registers,  Prev: Convenience Vars,  Up: Data

10.12 Convenience Functions
===========================

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.

   These functions do not require GDB to be configured with 'Python'
support, which means that they are always available.

'$_isvoid (EXPR)'
     Return one if the expression EXPR is 'void'.  Otherwise it returns
     zero.

     A 'void' expression is an expression where the type of the result
     is 'void'.  For example, you can examine a convenience variable
     (see *note Convenience Variables: Convenience Vars.) to check
     whether it is 'void':

          (gdb) print $_exitcode
          $1 = void
          (gdb) print $_isvoid ($_exitcode)
          $2 = 1
          (gdb) run
          Starting program: ./a.out
          [Inferior 1 (process 29572) exited normally]
          (gdb) print $_exitcode
          $3 = 0
          (gdb) print $_isvoid ($_exitcode)
          $4 = 0

     In the example above, we used '$_isvoid' to check whether
     '$_exitcode' is 'void' before and after the execution of the
     program being debugged.  Before the execution there is no exit code
     to be examined, therefore '$_exitcode' is 'void'.  After the
     execution the program being debugged returned zero, therefore
     '$_exitcode' is zero, which means that it is not 'void' anymore.

     The 'void' expression can also be a call of a function from the
     program being debugged.  For example, given the following function:

          void
          foo (void)
          {
          }

     The result of calling it inside GDB is 'void':

          (gdb) print foo ()
          $1 = void
          (gdb) print $_isvoid (foo ())
          $2 = 1
          (gdb) set $v = foo ()
          (gdb) print $v
          $3 = void
          (gdb) print $_isvoid ($v)
          $4 = 1

   These functions require GDB to be configured with 'Python' support.

'$_memeq(BUF1, BUF2, LENGTH)'
     Returns one if the LENGTH bytes at the addresses given by BUF1 and
     BUF2 are equal.  Otherwise it returns zero.

'$_regex(STR, REGEX)'
     Returns one if the string STR matches the regular expression REGEX.
     Otherwise it returns zero.  The syntax of the regular expression is
     that specified by 'Python''s regular expression support.

'$_streq(STR1, STR2)'
     Returns one if the strings STR1 and STR2 are equal.  Otherwise it
     returns zero.

'$_strlen(STR)'
     Returns the length of string STR.

'$_caller_is(NAME[, NUMBER_OF_FRAMES])'
     Returns one if the calling function's name is equal to NAME.
     Otherwise it returns zero.

     If the optional argument NUMBER_OF_FRAMES is provided, it is the
     number of frames up in the stack to look.  The default is 1.

     Example:

          (gdb) backtrace
          #0  bottom_func ()
              at testsuite/gdb.python/py-caller-is.c:21
          #1  0x00000000004005a0 in middle_func ()
              at testsuite/gdb.python/py-caller-is.c:27
          #2  0x00000000004005ab in top_func ()
              at testsuite/gdb.python/py-caller-is.c:33
          #3  0x00000000004005b6 in main ()
              at testsuite/gdb.python/py-caller-is.c:39
          (gdb) print $_caller_is ("middle_func")
          $1 = 1
          (gdb) print $_caller_is ("top_func", 2)
          $1 = 1

'$_caller_matches(REGEXP[, NUMBER_OF_FRAMES])'
     Returns one if the calling function's name matches the regular
     expression REGEXP.  Otherwise it returns zero.

     If the optional argument NUMBER_OF_FRAMES is provided, it is the
     number of frames up in the stack to look.  The default is 1.

'$_any_caller_is(NAME[, NUMBER_OF_FRAMES])'
     Returns one if any calling function's name is equal to NAME.
     Otherwise it returns zero.

     If the optional argument NUMBER_OF_FRAMES is provided, it is the
     number of frames up in the stack to look.  The default is 1.

     This function differs from '$_caller_is' in that this function
     checks all stack frames from the immediate caller to the frame
     specified by NUMBER_OF_FRAMES, whereas '$_caller_is' only checks
     the frame specified by NUMBER_OF_FRAMES.

'$_any_caller_matches(REGEXP[, NUMBER_OF_FRAMES])'
     Returns one if any calling function's name matches the regular
     expression REGEXP.  Otherwise it returns zero.

     If the optional argument NUMBER_OF_FRAMES is provided, it is the
     number of frames up in the stack to look.  The default is 1.

     This function differs from '$_caller_matches' in that this function
     checks all stack frames from the immediate caller to the frame
     specified by NUMBER_OF_FRAMES, whereas '$_caller_matches' only
     checks the frame specified by NUMBER_OF_FRAMES.

   GDB provides the ability to list and get help on convenience
functions.

'help function'
     Print a list of all convenience functions.


File: gdb.info,  Node: Registers,  Next: Floating Point Hardware,  Prev: Convenience Funs,  Up: Data

10.13 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.  The 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').

   Usually ABIs reserve some registers as not needed to be saved by the
callee (a.k.a.: "caller-saved", "call-clobbered" or "volatile"
registers).  It may therefore not be possible for GDB to know the value
a register had before the call (in other words, in the outer frame), if
the register value has since been changed by the callee.  GDB tries to
deduce where the inner frame saved ("callee-saved") registers, from the
debug info, unwind info, or the machine code generated by your compiler.
If some register is not saved, and GDB knows the register is
"caller-saved" (via its own knowledge of the ABI, or because the
debug/unwind info explicitly says the register's value is undefined),
GDB displays '<not saved>' as the register's value.  With targets that
GDB has no knowledge of the register saving convention, if a register
was not saved by the callee, then its value and location in the outer
frame are assumed to be the same of the inner frame.  This is usually
harmless, because if the register is call-clobbered, the caller either
does not care what is in the register after the call, or has code to
restore the value that it does care about.  Note, however, that if you
change such a register in the outer frame, you may also be affecting the
inner frame.  Also, the more "outer" the frame is you're looking at, the
more likely a call-clobbered register's value is to be wrong, in the
sense that it doesn't actually represent the value the register had just
before the call.

   ---------- 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.14 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.15 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.16 Operating System Auxiliary Information
============================================

GDB provides interfaces to useful OS facilities that can help you debug
your program.

   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 show it to you.  The types of information available will differ
depending on the type of operating system running on the target.  The
mechanism used to fetch the data is described in *note Operating System
Information::.  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 INFOTYPE'

     Display OS information of the requested type.

     On GNU/Linux, the following values of INFOTYPE are valid:

     'cpus'
          Display the list of all CPUs/cores.  For each CPU/core, GDB
          prints the available fields from /proc/cpuinfo.  For each
          supported architecture different fields are available.  Two
          common entries are processor which gives CPU number and
          bogomips; a system constant that is calculated during kernel
          initialization.

     'files'
          Display the list of open file descriptors on the target.  For
          each file descriptor, GDB prints the identifier of the process
          owning the descriptor, the command of the owning process, the
          value of the descriptor, and the target of the descriptor.

     'modules'
          Display the list of all loaded kernel modules on the target.
          For each module, GDB prints the module name, the size of the
          module in bytes, the number of times the module is used, the
          dependencies of the module, the status of the module, and the
          address of the loaded module in memory.

     'msg'
          Display the list of all System V message queues on the target.
          For each message queue, GDB prints the message queue key, the
          message queue identifier, the access permissions, the current
          number of bytes on the queue, the current number of messages
          on the queue, the processes that last sent and received a
          message on the queue, the user and group of the owner and
          creator of the message queue, the times at which a message was
          last sent and received on the queue, and the time at which the
          message queue was last changed.

     'processes'
          Display the list of processes on the target.  For each
          process, GDB prints the process identifier, the name of the
          user, the command corresponding to the process, and the list
          of processor cores that the process is currently running on.
          (To understand what these properties mean, for this and the
          following info types, please consult the general GNU/Linux
          documentation.)

     'procgroups'
          Display the list of process groups on the target.  For each
          process, GDB prints the identifier of the process group that
          it belongs to, the command corresponding to the process group
          leader, the process identifier, and the command line of the
          process.  The list is sorted first by the process group
          identifier, then by the process identifier, so that processes
          belonging to the same process group are grouped together and
          the process group leader is listed first.

     'semaphores'
          Display the list of all System V semaphore sets on the target.
          For each semaphore set, GDB prints the semaphore set key, the
          semaphore set identifier, the access permissions, the number
          of semaphores in the set, the user and group of the owner and
          creator of the semaphore set, and the times at which the
          semaphore set was operated upon and changed.

     'shm'
          Display the list of all System V shared-memory regions on the
          target.  For each shared-memory region, GDB prints the region
          key, the shared-memory identifier, the access permissions, the
          size of the region, the process that created the region, the
          process that last attached to or detached from the region, the
          current number of live attaches to the region, and the times
          at which the region was last attached to, detach from, and
          changed.

     'sockets'
          Display the list of Internet-domain sockets on the target.
          For each socket, GDB prints the address and port of the local
          and remote endpoints, the current state of the connection, the
          creator of the socket, the IP address family of the socket,
          and the type of the connection.

     'threads'
          Display the list of threads running on the target.  For each
          thread, GDB prints the identifier of the process that the
          thread belongs to, the command of the process, the thread
          identifier, and the processor core that it is currently
          running on.  The main thread of a process is not listed.

'info os'
     If INFOTYPE is omitted, then list the possible values for INFOTYPE
     and the kind of OS information available for each INFOTYPE.  If the
     target does not return a list of possible types, this command will
     report an error.


File: gdb.info,  Node: Memory Region Attributes,  Next: Dump/Restore Files,  Prev: OS Information,  Up: Data

10.17 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.17.1 Attributes
------------------

10.17.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.17.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.17.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.17.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.18 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, Tektronix Hex, or Verilog Hex format; however, GDB
can only append to binary files, and cannot read from Verilog Hex 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.
     'verilog'
          Verilog 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.19 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, and S390).

     On GNU/Linux, this command can take into account the value of the
     file '/proc/PID/coredump_filter' when generating the core dump
     (*note set use-coredump-filter::).

'set use-coredump-filter on'
'set use-coredump-filter off'
     Enable or disable the use of the file '/proc/PID/coredump_filter'
     when generating core dump files.  This file is used by the Linux
     kernel to decide what types of memory mappings will be dumped or
     ignored when generating a core dump file.  PID is the process ID of
     a currently running process.

     To make use of this feature, you have to write in the
     '/proc/PID/coredump_filter' file a value, in hexadecimal, which is
     a bit mask representing the memory mapping types.  If a bit is set
     in the bit mask, then the memory mappings of the corresponding
     types will be dumped; otherwise, they will be ignored.  This
     configuration is inherited by child processes.  For more
     information about the bits that can be set in the
     '/proc/PID/coredump_filter' file, please refer to the manpage of
     'core(5)'.

     By default, this option is 'on'.  If this option is turned 'off',
     GDB does not read the 'coredump_filter' file and instead uses the
     same default value as the Linux kernel in order to decide which
     pages will be dumped in the core dump file.  This value is
     currently '0x33', which means that bits '0' (anonymous private
     mappings), '1' (anonymous shared mappings), '4' (ELF headers) and
     '5' (private huge pages) are active.  This will cause these memory
     mappings to be dumped automatically.


File: gdb.info,  Node: Character Sets,  Next: Caching Target Data,  Prev: Core File Generation,  Up: Data

10.20 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 Target Data,  Next: Searching Memory,  Prev: Character Sets,  Up: Data

10.21 Caching Data of Targets
=============================

GDB caches data exchanged between the debugger and a target.  Each cache
is associated with the address space of the inferior.  *Note Inferiors
and Programs::, about inferior and address space.  Such caching
generally improves performance in remote debugging (*note Remote
Debugging::), because it reduces the overhead of the remote protocol by
bundling memory reads and writes into large chunks.  Unfortunately,
simply caching everything would lead to incorrect results, since 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)
or in the code segment.  Other regions of memory can be explicitly
marked as cacheable; *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.

'set code-cache on'
'set code-cache off'
     Enable or disable caching of code segment accesses.  When 'on', use
     caching.  By default, this option is 'on'.  This improves
     performance of disassembly in remote debugging.

'show code-cache'
     Show the current state of target memory cache for code segment
     accesses.

'info dcache [line]'
     Print the information about the performance of data cache of the
     current inferior's address space.  The information displayed
     includes the dcache width and depth, and for each cache line, its
     number, address, and how many times it was referenced.  This
     command is useful for debugging the data cache operation.

     If a line number is specified, the contents of that line will be
     printed in hex.

'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.  *Note info dcache: Caching
     Target Data.

'show dcache line-size'
     Show default size of dcache lines.

   ---------- 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 Target Data,  Up: Data

10.22 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:

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

     '$_probe_argc'
          Collects the number of arguments from the static probe at
          which the tracepoint is located.  *Note Static Probe Points::.

     '$_probe_argN'
          N is an integer between 0 and 11.  Collects the Nth argument
          from the static probe at which the tracepoint is located.
          *Note Static Probe Points::.

     '$_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

        * the state about installed on target of each location

          (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
          2       tracepoint     keep y   <MULTIPLE>
                  collect $eip
          2.1                         y     0x0804859c in func4 at change-loc.h:35
                  installed on target
          2.2                         y     0xb7ffc480 in func4 at change-loc.h:35
                  installed on target
          2.3                         y     <PENDING>  set_tracepoint
          3       tracepoint     keep y   0x080485b1 in foo at change-loc.c:29
                  not installed on target
          (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-buffer-size N'
'set trace-buffer-size unlimited'
     Request that the target use a trace buffer of N bytes.  Not all
     targets will honor the request; they may have a compiled-in size
     for the trace buffer, or some other limitation.  Set to a value of
     'unlimited' or '-1' to let the target use whatever size it likes.
     This is also the default.

'show trace-buffer-size'
     Show the current requested size for the trace buffer.  Note that
     this will only match the actual size if the target supports
     size-setting, and was able to handle the requested size.  For
     instance, if the target can only change buffer size between runs,
     this variable will not reflect the change until the next run
     starts.  Use 'tstatus' to get a report of the actual buffer size.

'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'
'tsave [-ctf] DIRNAME'
     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.)  By default, this
     command will save trace frame in tfile format.  You can supply the
     optional argument '-ctf' to save date in CTF format.  The "Common
     Trace Format" (CTF) is proposed as a trace format that can be
     shared by multiple debugging and tracing tools.  Please go to
     'http://www.efficios.com/ctf' to get more information.

'target tfile FILENAME'
'target ctf DIRNAME'
     Use the file named FILENAME or directory named DIRNAME as a source
     of trace data.  Commands that examine data work as they do with a
     live target, but it is not possible to run any new trace
     experiments.  'tstatus' will report the state of the trace run at
     the moment the data was saved, as well as the current trace frame
     you are examining.  Both FILENAME and DIRNAME must be on a
     filesystem accessible to the host.

          (gdb) target ctf ctf.ctf
          (gdb) tfind
          Found trace frame 0, tracepoint 2
          39            ++a;  /* set tracepoint 1 here */
          (gdb) tdump
          Data collected at tracepoint 2, trace frame 0:
          i = 0
          a = 0
          b = 1 '\001'
          c = {"123", "456", "789", "123", "456", "789"}
          d = {{{a = 1, b = 2}, {a = 3, b = 4}}, {{a = 5, b = 6}, {a = 7, b = 8}}}
          (gdb) p b
          $1 = 1


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 (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
(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
============================

Some languages are designed to guard you against making seemingly common
errors through a series of compile- and run-time checks.  These include
checking the type of arguments to functions and operators and making
sure mathematical overflows are caught at run time.  Checks such as
these help to ensure a program's correctness once it has been compiled
by eliminating type mismatches and providing active checks for range
errors when your program is running.

   By default GDB checks for these errors according to the rules of the
current source language.  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.

* 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 C and C++, 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,

     int klass::my_method(char *b) { return  b ? 1 : 2; }

     (gdb) print obj.my_method (0)
     $1 = 2
but
     (gdb) print obj.my_method (0x1234)
     Cannot resolve method klass::my_method to any overloaded instance

   The second example fails because in C++ the integer constant '0x1234'
is not type-compatible with the pointer parameter type.

   For the expressions you use in GDB commands, you can tell GDB to not
enforce strict type checking or to treat any mismatches as errors and
abandon the expression; When type checking is disabled, GDB successfully
evaluates expressions like the second example above.

   Even if type checking is 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 which make little sense to evaluate anyway.

   GDB provides some additional commands for controlling type checking:

'set check type on'
'set check type off'
     Set strict type checking on or off.  If any type mismatches occur
     in evaluating an expression while type checking is on, GDB prints a
     message and aborts evaluation of the expression.

'show check type'
     Show the current setting of type checking and whether GDB is
     enforcing strict type checking rules.


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, Go, 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
* Go::                          Go
* 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.  The
     operator OP is any one of the operators '|', '^', '&', '<<', '>>',
     '+', '-', '*', '/', '%'.

'?:'
     The ternary operator.  'A ? B : C' can be thought of as: if A then
     B else C.  The argument 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 range checking automatically, it defaults 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, strict type checking
is used.  However, if you turn type checking off, GDB will allow certain
non-standard conversions, such as promoting integer constants to
pointers.

   Range checking, if turned on, is done on mathematical operations.
Array indices are not checked, since they are often used to index a
pointer that is not itself an array.


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 rethrow'
'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.

'info vtbl EXPRESSION.'
     The 'info vtbl' command can be used to display the virtual method
     tables of the object computed by EXPRESSION.  This shows one entry
     per virtual table; there may be multiple virtual tables when
     multiple inheritance is in use.

'demangle NAME'
     Demangle NAME.  *Note Symbols::, for a more complete description of
     the 'demangle' command.

'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 and S/390.  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: Go,  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: Go,  Next: Objective-C,  Prev: D,  Up: Supported Languages

15.4.3 Go
---------

GDB can be used to debug programs written in Go and compiled with
'gccgo' or '6g' compilers.

   Here is a summary of the Go-specific features and restrictions:

'The current Go package'
     The name of the current package does not need to be specified when
     specifying global variables and functions.

     For example, given the program:

          package main
          var myglob = "Shall we?"
          func main () {
            // ...
          }

     When stopped inside 'main' either of these work:

          (gdb) p myglob
          (gdb) p main.myglob

'Builtin Go types'
     The 'string' type is recognized by GDB and is printed as a string.

'Builtin Go functions'
     The GDB expression parser recognizes the 'unsafe.Sizeof' function
     and handles it internally.

'Restrictions on Go expressions'
     All Go operators are supported except '&^'.  The Go '_' "blank
     identifier" is not supported.  Automatic dereferencing of pointers
     is not supported.


File: gdb.info,  Node: Objective-C,  Next: OpenCL C,  Prev: Go,  Up: Supported Languages

15.4.4 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.4.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.4.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.5 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.5.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.5.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.5.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.6 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.6.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.6.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.6.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.7 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.8 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.8.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.8.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).  The argument X must be of an
     ordered type, which include integral, character and enumerated
     types.

'SIZE(X)'
     Returns the size of its argument.  The 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.  The 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.8.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.8.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.8.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.8.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.8.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.8.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.8.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.9 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 Exceptions::              Ada Exceptions
* Ada Tasks::                   Listing and setting breakpoints in tasks.
* Ada Tasks and Core Files::    Tasking Support when Debugging Core Files
* Ravenscar Profile::           Tasking Support when using the Ravenscar
                                   Profile
* Ada Glitches::                Known peculiarities of Ada mode.


File: gdb.info,  Node: Ada Mode Intro,  Next: Omissions from Ada,  Up: Ada

15.4.9.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.9.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.9.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 Exceptions,  Prev: Additions to Ada,  Up: Ada

15.4.9.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 Exceptions,  Next: Ada Tasks,  Prev: Stopping Before Main Program,  Up: Ada

15.4.9.5 Ada Exceptions
.......................

A command is provided to list all Ada exceptions:

'info exceptions'
'info exceptions REGEXP'
     The 'info exceptions' command allows you to list all Ada exceptions
     defined within the program being debugged, as well as their
     addresses.  With a regular expression, REGEXP, as argument, only
     those exceptions whose names match REGEXP are listed.

   Below is a small example, showing how the command can be used, first
without argument, and next with a regular expression passed as an
argument.

     (gdb) info exceptions
     All defined Ada exceptions:
     constraint_error: 0x613da0
     program_error: 0x613d20
     storage_error: 0x613ce0
     tasking_error: 0x613ca0
     const.aint_global_e: 0x613b00
     (gdb) info exceptions const.aint
     All Ada exceptions matching regular expression "const.aint":
     constraint_error: 0x613da0
     const.aint_global_e: 0x613b00

   It is also possible to ask GDB to stop your program's execution when
an exception is raised.  For more details, see *note Set Catchpoints::.


File: gdb.info,  Node: Ada Tasks,  Next: Ada Tasks and Core Files,  Prev: Ada Exceptions,  Up: Ada

15.4.9.6 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::).  The LINESPEC argument 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.  The 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.9.7 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 certain platforms, the debugger needs to perform some memory
writes in order to provide Ada tasking support.  When inspecting a core
file, this means that the core file must be opened with read-write
privileges, using the command '"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.9.8 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.9.9 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.

   Internally, the debugger also relies on the compiler following a
number of conventions known as the 'GNAT Encoding', all documented in
'gcc/ada/exp_dbug.ads' in the GCC sources.  This encoding describes how
the debugging information should be generated for certain types.  In
particular, this convention makes use of "descriptive types", which are
artificial types generated purely to help the debugger.

   These encodings were defined at a time when the debugging information
format used was not powerful enough to describe some of the more complex
types available in Ada.  Since DWARF allows us to express nearly all Ada
features, the long-term goal is to slowly replace these descriptive
types by their pure DWARF equivalent.  To facilitate that transition, a
new maintenance option is available to force the debugger to ignore
those descriptive types.  It allows the user to quickly evaluate how
well GDB works without them.

'maintenance ada set ignore-descriptive-types [on|off]'
     Control whether the debugger should ignore descriptive types.  The
     default is not to ignore descriptives types ('off').

'maintenance ada show ignore-descriptive-types'
     Show if descriptive types are ignored by GDB.


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.

'set print type methods'
'set print type methods on'
'set print type methods off'
     Normally, when GDB prints a class, it displays any methods declared
     in that class.  You can control this behavior either by passing the
     appropriate flag to 'ptype', or using 'set print type methods'.
     Specifying 'on' will cause GDB to display the methods; this is the
     default.  Specifying 'off' will cause GDB to omit the methods.

'show print type methods'
     This command shows the current setting of method display when
     printing classes.

'set print type typedefs'
'set print type typedefs on'
'set print type typedefs off'

     Normally, when GDB prints a class, it displays any typedefs defined
     in that class.  You can control this behavior either by passing the
     appropriate flag to 'ptype', or using 'set print type typedefs'.
     Specifying 'on' will cause GDB to display the typedef definitions;
     this is the default.  Specifying 'off' will cause GDB to omit the
     typedef definitions.  Note that this controls whether the typedef
     definition itself is printed, not whether typedef names are
     substituted when printing other types.

'show print type typedefs'
     This command shows the current setting of typedef display when
     printing classes.

'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

'demangle [-l LANGUAGE] [--] NAME'
     Demangle NAME.  If LANGUAGE is provided it is the name of the
     language to demangle NAME in.  Otherwise NAME is demangled in the
     current language.

     The '--' option specifies the end of options, and is useful when
     NAME begins with a dash.

     The parameter 'demangle-style' specifies how to interpret the kind
     of mangling used.  *Note Print Settings::.

'whatis[/FLAGS] [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'.

     FLAGS can be used to modify how the type is displayed.  Available
     flags are:

     'r'
          Display in "raw" form.  Normally, GDB substitutes template
          parameters and typedefs defined in a class when printing the
          class' members.  The '/r' flag disables this.

     'm'
          Do not print methods defined in the class.

     'M'
          Print methods defined in the class.  This is the default, but
          the flag exists in case you change the default with 'set print
          type methods'.

     't'
          Do not print typedefs defined in the class.  Note that this
          controls whether the typedef definition itself is printed, not
          whether typedef names are substituted when printing other
          types.

     'T'
          Print typedefs defined in the class.  This is the default, but
          the flag exists in case you change the default with 'set print
          type typedefs'.

'ptype[/FLAGS] [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 type-printers'
     Versions of GDB that ship with Python scripting enabled may have
     "type printers" available.  When using 'ptype' or 'whatis', these
     printers are consulted when the name of a type is needed.  *Note
     Type Printing API::, for more information on writing type printers.

     'info type-printers' displays all the available type printers.

'enable type-printer NAME...'
'disable type-printer NAME...'
     These commands can be used to enable or disable type printers.

'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,
        * if the debug information provides it, the program that
          compiled the file (which may include, e.g., the compiler
          version and command line arguments),
        * 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.

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

'set print symbol-loading'
'set print symbol-loading full'
'set print symbol-loading brief'
'set print symbol-loading off'
     The 'set print symbol-loading' command allows you to control the
     printing of messages when GDB loads symbol information.  By default
     a message is printed for the executable and one for each shared
     library, and normally this is what you want.  However, when
     debugging apps with large numbers of shared libraries these
     messages can be annoying.  When set to 'brief' a message is printed
     for each executable, and when GDB loads a collection of shared
     libraries at once it will only print one message regardless of the
     number of shared libraries.  When set to 'off' no messages are
     printed.

'show print symbol-loading'
     Show whether messages will be printed when a GDB command entered
     from the keyboard causes symbol information to be loaded.

'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)

'maint set symbol-cache-size SIZE'
     Set the size of the symbol cache to SIZE.  The default size is
     intended to be good enough for debugging most applications.  This
     option exists to allow for experimenting with different sizes.

'maint show symbol-cache-size'
     Show the size of the symbol cache.

'maint print symbol-cache'
     Print the contents of the symbol cache.  This is useful when
     debugging symbol cache issues.

'maint print symbol-cache-statistics'
     Print symbol cache usage statistics.  This helps determine how well
     the cache is being utilized.

'maint flush-symbol-cache'
     Flush the contents of the symbol cache, all entries are removed.
     This command is useful when debugging the symbol cache.  It is also
     useful when collecting performance data.


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
* Compiling and Injecting Code:: Compiling and injecting code in GDB


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'
'j LINESPEC'
'jump LOCATION'
'j 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 is stopped, but immediately
     give it the signal SIGNAL.  The 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 ordinarily see the signal when resumed with the
     'continue' command; 'signal 0' causes it to resume without a
     signal.

     _Note:_ When resuming a multi-threaded program, SIGNAL is delivered
     to the currently selected thread, not the thread that last reported
     a stop.  This includes the situation where a thread was stopped due
     to a signal.  So if you want to continue execution suppressing the
     signal that stopped a thread, you should select that same thread
     before issuing the 'signal 0' command.  If you issue the 'signal 0'
     command with another thread as the selected one, GDB detects that
     and asks for confirmation.

     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.

     'signal' does not repeat when you press <RET> a second time after
     executing the command.

'queue-signal SIGNAL'
     Queue SIGNAL to be delivered immediately to the current thread when
     execution of the thread resumes.  The 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.  The
     handling of the signal must be set to pass the signal to the
     program, otherwise GDB will report an error.  You can control the
     handling of signals from GDB with the 'handle' command (*note
     Signals::).

     Alternatively, if SIGNAL is zero, any currently queued signal for
     the current thread is discarded and when execution resumes no
     signal will be delivered.  This is useful when your program stopped
     on account of a signal and would ordinarily see the signal when
     resumed with the 'continue' command.

     This command differs from the 'signal' command in that the signal
     is just queued, execution is not resumed.  And 'queue-signal'
     cannot be used to pass a signal whose handling state has been set
     to 'nopass' (*note Signals::).

   *Note stepping into signal handlers::, for information on how
stepping commands behave when the thread has a signal queued.


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.  The
     expression 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,  Next: Compiling and Injecting Code,  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: Compiling and Injecting Code,  Prev: Patching,  Up: Altering

17.7 Compiling and injecting code in GDB
========================================

GDB supports on-demand compilation and code injection into programs
running under GDB.  GCC 5.0 or higher built with 'libcc1.so' must be
installed for this functionality to be enabled.  This functionality is
implemented with the following commands.

'compile code SOURCE-CODE'
'compile code -raw -- SOURCE-CODE'
     Compile SOURCE-CODE with the compiler language found as the current
     language in GDB (*note Languages::).  If compilation and injection
     is not supported with the current language specified in GDB, or the
     compiler does not support this feature, an error message will be
     printed.  If SOURCE-CODE compiles and links successfully, GDB will
     load the object-code emitted, and execute it within the context of
     the currently selected inferior.  It is important to note that the
     compiled code is executed immediately.  After execution, the
     compiled code is removed from GDB and any new types or variables
     you have defined will be deleted.

     The command allows you to specify SOURCE-CODE in two ways.  The
     simplest method is to provide a single line of code to the command.
     E.g.:

          compile code printf ("hello world\n");

     If you specify options on the command line as well as source code,
     they may conflict.  The '--' delimiter can be used to separate
     options from actual source code.  E.g.:

          compile code -r -- printf ("hello world\n");

     Alternatively you can enter source code as multiple lines of text.
     To enter this mode, invoke the 'compile code' command without any
     text following the command.  This will start the multiple-line
     editor and allow you to type as many lines of source code as
     required.  When you have completed typing, enter 'end' on its own
     line to exit the editor.

          compile code
          >printf ("hello\n");
          >printf ("world\n");
          >end

     Specifying '-raw', prohibits GDB from wrapping the provided
     SOURCE-CODE in a callable scope.  In this case, you must specify
     the entry point of the code by defining a function named
     '_gdb_expr_'.  The '-raw' code cannot access variables of the
     inferior.  Using '-raw' option may be needed for example when
     SOURCE-CODE requires '#include' lines which may conflict with
     inferior symbols otherwise.

'compile file FILENAME'
'compile file -raw FILENAME'
     Like 'compile code', but take the source code from FILENAME.

          compile file /home/user/example.c

'compile print EXPR'
'compile print /F EXPR'
     Compile and execute EXPR with the compiler language found as the
     current language in GDB (*note Languages::).  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.

'compile print'
'compile print /F'
     Alternatively you can enter the expression (source code producing
     it) as multiple lines of text.  To enter this mode, invoke the
     'compile print' command without any text following the command.
     This will start the multiple-line editor.

The process of compiling and injecting the code can be inspected using:

'set debug compile'
     Turns on or off display of GDB process of compiling and injecting
     the code.  The default is off.

'show debug compile'
     Displays the current state of displaying GDB process of compiling
     and injecting the code.

17.7.1 Compilation options for the 'compile' command
----------------------------------------------------

GDB needs to specify the right compilation options for the code to be
injected, in part to make its ABI compatible with the inferior and in
part to make the injected code compatible with GDB's injecting process.

The options used, in increasing precedence:

target architecture and OS options ('gdbarch')
     These options depend on target processor type and target operating
     system, usually they specify at least 32-bit ('-m32') or 64-bit
     ('-m64') compilation option.

compilation options recorded in the target
     GCC (since version 4.7) stores the options used for compilation
     into 'DW_AT_producer' part of DWARF debugging information according
     to the GCC option '-grecord-gcc-switches'.  One has to explicitly
     specify '-g' during inferior compilation otherwise GCC produces no
     DWARF. This feature is only relevant for platforms where '-g'
     produces DWARF by default, otherwise one may try to enforce DWARF
     by using '-gdwarf-4'.

compilation options set by 'set compile-args'

You can override compilation options using the following command:

'set compile-args'
     Set compilation options used for compiling and injecting code with
     the 'compile' commands.  These options override any conflicting
     ones from the target architecture and/or options stored during
     inferior compilation.

'show compile-args'
     Displays the current state of compilation options override.  This
     does not show all the options actually used during compilation, use
     *note set debug compile:: for that.

17.7.2 Caveats when using the 'compile' command
-----------------------------------------------

There are a few caveats to keep in mind when using the 'compile'
command.  As the caveats are different per language, the table below
highlights specific issues on a per language basis.

C code examples and caveats
     When the language in GDB is set to 'C', the compiler will attempt
     to compile the source code with a 'C' compiler.  The source code
     provided to the 'compile' command will have much the same access to
     variables and types as it normally would if it were part of the
     program currently being debugged in GDB.

     Below is a sample program that forms the basis of the examples that
     follow.  This program has been compiled and loaded into GDB, much
     like any other normal debugging session.

          void function1 (void)
          {
             int i = 42;
             printf ("function 1\n");
          }

          void function2 (void)
          {
             int j = 12;
             function1 ();
          }

          int main(void)
          {
             int k = 6;
             int *p;
             function2 ();
             return 0;
          }

     For the purposes of the examples in this section, the program above
     has been compiled, loaded into GDB, stopped at the function 'main',
     and GDB is awaiting input from the user.

     To access variables and types for any program in GDB, the program
     must be compiled and packaged with debug information.  The
     'compile' command is not an exception to this rule.  Without debug
     information, you can still use the 'compile' command, but you will
     be very limited in what variables and types you can access.

     So with that in mind, the example above has been compiled with
     debug information enabled.  The 'compile' command will have access
     to all variables and types (except those that may have been
     optimized out).  Currently, as GDB has stopped the program in the
     'main' function, the 'compile' command would have access to the
     variable 'k'.  You could invoke the 'compile' command and type some
     source code to set the value of 'k'.  You can also read it, or do
     anything with that variable you would normally do in 'C'.  Be aware
     that changes to inferior variables in the 'compile' command are
     persistent.  In the following example:

          compile code k = 3;

     the variable 'k' is now 3.  It will retain that value until
     something else in the example program changes it, or another
     'compile' command changes it.

     Normal scope and access rules apply to source code compiled and
     injected by the 'compile' command.  In the example, the variables
     'j' and 'k' are not accessible yet, because the program is
     currently stopped in the 'main' function, where these variables are
     not in scope.  Therefore, the following command

          compile code j = 3;

     will result in a compilation error message.

     Once the program is continued, execution will bring these variables
     in scope, and they will become accessible; then the code you
     specify via the 'compile' command will be able to access them.

     You can create variables and types with the 'compile' command as
     part of your source code.  Variables and types that are created as
     part of the 'compile' command are not visible to the rest of the
     program for the duration of its run.  This example is valid:

          compile code int ff = 5; printf ("ff is %d\n", ff);

     However, if you were to type the following into GDB after that
     command has completed:

          compile code printf ("ff is %d\n'', ff);

     a compiler error would be raised as the variable 'ff' no longer
     exists.  Object code generated and injected by the 'compile'
     command is removed when its execution ends.  Caution is advised
     when assigning to program variables values of variables created by
     the code submitted to the 'compile' command.  This example is
     valid:

          compile code int ff = 5; k = ff;

     The value of the variable 'ff' is assigned to 'k'.  The variable
     'k' does not require the existence of 'ff' to maintain the value it
     has been assigned.  However, pointers require particular care in
     assignment.  If the source code compiled with the 'compile' command
     changed the address of a pointer in the example program, perhaps to
     a variable created in the 'compile' command, that pointer would
     point to an invalid location when the command exits.  The following
     example would likely cause issues with your debugged program:

          compile code int ff = 5; p = &ff;

     In this example, 'p' would point to 'ff' when the 'compile' command
     is executing the source code provided to it.  However, as variables
     in the (example) program persist with their assigned values, the
     variable 'p' would point to an invalid location when the command
     exists.  A general rule should be followed in that you should
     either assign 'NULL' to any assigned pointers, or restore a valid
     location to the pointer before the command exits.

     Similar caution must be exercised with any structs, unions, and
     typedefs defined in 'compile' command.  Types defined in the
     'compile' command will no longer be available in the next 'compile'
     command.  Therefore, if you cast a variable to a type defined in
     the 'compile' command, care must be taken to ensure that any future
     need to resolve the type can be achieved.

          (gdb) compile code static struct a { int a; } v = { 42 }; argv = &v;
          (gdb) compile code printf ("%d\n", ((struct a *) argv)->a);
          gdb command line:1:36: error: dereferencing pointer to incomplete type ‘struct a’
          Compilation failed.
          (gdb) compile code struct a { int a; }; printf ("%d\n", ((struct a *) argv)->a);
          42

     Variables that have been optimized away by the compiler are not
     accessible to the code submitted to the 'compile' command.  Access
     to those variables will generate a compiler error which GDB will
     print to the console.

17.7.3 Compiler search for the 'compile' command
------------------------------------------------

GDB needs to find GCC for the inferior being debugged which may not be
obvious for remote targets of different architecture than where GDB is
running.  Environment variable 'PATH' ('PATH' from shell that executed
GDB, not the one set by GDB command 'set environment').  *Note
Environment::.  'PATH' on GDB host is searched for GCC binary matching
the target architecture and operating system.

   Specifically 'PATH' is searched for binaries matching regular
expression 'ARCH(-[^-]*)?-OS-gcc' according to the inferior target being
debugged.  ARCH is processor name -- multiarch is supported, so for
example both 'i386' and 'x86_64' targets look for pattern
'(x86_64|i.86)' and both 's390' and 's390x' targets look for pattern
's390x?'.  OS is currently supported only for pattern 'linux(-gnu)?'.


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
* MiniDebugInfo::               Debugging information in a special section
* Index Files::                 Index files speed up GDB
* Symbol Errors::               Errors reading symbol files
* Data Files::                  GDB data files


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.  The ADDRESS should give 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 is kept in addition to the old.

     Changes can be reverted using the command 'remove-symbol-file'.

     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.

'remove-symbol-file FILENAME'
'remove-symbol-file -a ADDRESS'
     Remove a symbol file added via the 'add-symbol-file' command.  The
     file to remove can be identified by its FILENAME or by an ADDRESS
     that lies within the boundaries of this symbol file in memory.
     Example:

          (gdb) add-symbol-file /home/user/gdb/mylib.so 0x7ffff7ff9480
          add symbol table from file "/home/user/gdb/mylib.so" at
              .text_addr = 0x7ffff7ff9480
          (y or n) y
          Reading symbols from /home/user/gdb/mylib.so...done.
          (gdb) remove-symbol-file -a 0x7ffff7ff9480
          Remove symbol table from file "/home/user/gdb/mylib.so"? (y or n) y
          (gdb)

     'remove-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.

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

'info dll REGEX'
     This is an alias of 'info sharedlibrary'.

'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.  The best way to do this is to use
'catch load' and 'catch unload' (*note Set Catchpoints::).

   GDB also supports the the 'set stop-on-solib-events' command for
this.  This command exists for historical reasons.  It is less useful
than setting a catchpoint, because it does not allow for conditions or
commands as a catchpoint does.

'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.  When starting processes remotely, and
     when attaching to already-running processes (local or remote),
     their executable filenames will be prefixed with PATH if reported
     to GDB as absolute by the operating system.  If you use 'set
     sysroot' to find executables and shared libraries, they need to be
     laid out in the same way that they are on the target, with e.g. a
     '/bin', '/lib' and '/usr/lib' hierarchy under PATH.

     If PATH starts with the sequence 'target:' and the target system is
     remote then GDB will retrieve the target binaries 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
     'target:' (if present) is used as system root prefix on the remote
     file system.  If PATH starts with the sequence 'remote:' this is
     converted to the sequence 'target:' by 'set sysroot'(1).  If you
     want to specify a local system root using a directory that happens
     to be named 'target:' or 'remote:', you need to use some equivalent
     variant of the name like './target:'.

     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 binary, 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 binary, 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 executable and 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) Historically the functionality to retrieve binaries from the
remote system was provided by prefixing PATH with 'remote:'


File: gdb.info,  Node: Separate Debug Files,  Next: MiniDebugInfo,  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, when using the ELF or PE
     file formats 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 each one of the global
     debug directories, in a subdirectory whose name is identical to the
     leading directories of the executable's absolute file name.

   * For the "build ID" method, GDB looks in the '.build-id'
     subdirectory of each one of the global debug directories 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 list of the global debug
directories includes '/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'.

   Global debugging info directories default to what is set by GDB
configure option '--with-separate-debug-dir'.  During GDB run you can
also set the global debugging info directories, and view the list GDB is
currently using.

'set debug-file-directory DIRECTORIES'
     Set the directories which GDB searches for separate debugging
     information files to DIRECTORY.  Multiple path components can be
     set concatenating them by a path 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 qCRC packet::).  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: MiniDebugInfo,  Next: Index Files,  Prev: Separate Debug Files,  Up: GDB Files

18.3 Debugging information in a special section
===============================================

Some systems ship pre-built executables and libraries that have a
special '.gnu_debugdata' section.  This feature is called
"MiniDebugInfo".  This section holds an LZMA-compressed object and is
used to supply extra symbols for backtraces.

   The intent of this section is to provide extra minimal debugging
information for use in simple backtraces.  It is not intended to be a
replacement for full separate debugging information (*note Separate
Debug Files::).  The example below shows the intended use; however, GDB
does not currently put restrictions on what sort of debugging
information might be included in the section.

   GDB has support for this extension.  If the section exists, then it
is used provided that no other source of debugging information can be
found, and that GDB was configured with LZMA support.

   This section can be easily created using 'objcopy' and other standard
utilities:

     # Extract the dynamic symbols from the main binary, there is no need
     # to also have these in the normal symbol table.
     nm -D BINARY --format=posix --defined-only \
       | awk '{ print $1 }' | sort > dynsyms

     # Extract all the text (i.e. function) symbols from the debuginfo.
     # (Note that we actually also accept "D" symbols, for the benefit
     # of platforms like PowerPC64 that use function descriptors.)
     nm BINARY --format=posix --defined-only \
       | awk '{ if ($2 == "T" || $2 == "t" || $2 == "D") print $1 }' \
       | sort > funcsyms

     # Keep all the function symbols not already in the dynamic symbol
     # table.
     comm -13 dynsyms funcsyms > keep_symbols

     # Separate full debug info into debug binary.
     objcopy --only-keep-debug BINARY debug

     # Copy the full debuginfo, keeping only a minimal set of symbols and
     # removing some unnecessary sections.
     objcopy -S --remove-section .gdb_index --remove-section .comment \
       --keep-symbols=keep_symbols debug mini_debuginfo

     # Drop the full debug info from the original binary.
     strip --strip-all -R .comment BINARY

     # Inject the compressed data into the .gnu_debugdata section of the
     # original binary.
     xz mini_debuginfo
     objcopy --add-section .gnu_debugdata=mini_debuginfo.xz BINARY


File: gdb.info,  Node: Index Files,  Next: Symbol Errors,  Prev: MiniDebugInfo,  Up: GDB Files

18.4 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

   GDB will normally ignore older versions of '.gdb_index' sections that
have been deprecated.  Usually they are deprecated because they are
missing a new feature or have performance issues.  To tell GDB to use a
deprecated index section anyway specify 'set
use-deprecated-index-sections on'.  The default is 'off'.  This can
speed up startup, but may result in some functionality being lost.
*Note Index Section Format::.

   _Warning:_ Setting 'use-deprecated-index-sections' to 'on' must be
done before gdb reads the file.  The following will not work:

     $ gdb -ex "set use-deprecated-index-sections on" <program>

   Instead you must do, for example,

     $ gdb -iex "set use-deprecated-index-sections on" <program>

   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.5 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.6 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 BFD 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.

'target native'
     Setup for local/native process debugging.  Useful to make the 'run'
     command spawn native processes (likewise 'attach', etc.) even when
     'set auto-connect-native-target' is 'off' (*note set
     auto-connect-native-target::).

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

GDB needs an unstripped copy of your program to access symbol and
debugging information.  Some remote targets (*note qXfer executable
filename read::, and *note Host I/O Packets::) allow GDB to access
program files over the same connection used to communicate with GDB.
With such a target, if the remote program is unstripped, the only
command you need is 'target remote'.  Otherwise, start up GDB using the
name of the local unstripped copy of your program as the first argument,
or use the 'file' command.

   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 serial baud' command (*note set
     serial baud: 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, or '-' or 'stdio' to use stdin/stdout of
'gdbserver'.  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.

   The 'stdio' connection is useful when starting 'gdbserver' with ssh:

     (gdb) target remote | ssh -T hostname gdbserver - hello

   The '-T' option to ssh is provided because we don't need a remote
pty, and we don't want escape-character handling.  Ssh does this by
default when a command is provided, the flag is provided to make it
explicit.  You could elide it if you want to.

   Programs started with stdio-connected gdbserver have '/dev/null' for
'stdin', and 'stdout','stderr' are sent back to gdb for display through
a pipe connected to gdbserver.  Both 'stdout' and 'stderr' use the same
pipe.

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
subsequent 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 '--debug-format=option1[,option2,...]' option tells 'gdbserver'
to include additional information in each output.  Possible options are:

'none'
     Turn off all extra information in debugging output.
'all'
     Turn on all extra information in debugging output.
'timestamps'
     Include a timestamp in each line of debugging output.

   Options are processed in order.  Thus, for example, if 'none' appears
last then no additional information is added to debugging output.

   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 debug-format option1[,option2,...]'
     Specify additional text to add to debugging messages.  Possible
     options are:

     'none'
          Turn off all extra information in debugging output.
     'all'
          Turn on all extra information in debugging output.
     'timestamps'
          Include a timestamp in each line of debugging output.

     Options are processed in order.  Thus, for example, if 'none'
     appears last then no additional information is added to debugging
     output.

'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 serial baud 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 serial baud'
     Show the current speed of the remote connection.

'set serial parity PARITY'
     Set the parity for the remote serial I/O. Supported values of
     PARITY are: 'even', 'none', and 'odd'.  The default is 'none'.

'show serial parity'
     Show the current parity of the serial port.

'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 tcp connect-timeout unlimited'
     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.  If SECONDS is 'unlimited', there is
     no timeout and GDB will keep attempting to establish a connection
     forever, unless interrupted with 'Ctrl-c'.  The default is 15
     seconds.

'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'
                                             
'pid-to-exec-file'   'qXfer:exec-file:read'  'attach', 'run'
                                             
'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'
                                             
'program-signals'    'QProgramSignals'       '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
                                             
'hostio-fstat-packet''vFile:fstat'           Host I/O
                                             
'hostio-setfs-packet''vFile:setfs'           Host I/O
                                             
'noack-packet'       'QStartNoAckMode'       Packet
                                             acknowledgment
                                             
'osdata'             'qXfer:osdata:read'     'info os'
                                             
'query-attached'     'qAttached'             Querying remote
                                             process attach
                                             state.
                                             
'trace-buffer-size'  'QTBuffer:size'         'set
                                             trace-buffer-size'
                                             
'trace-status'       'qTStatus'              'tstatus'
                                             
'traceframe-info'    'qXfer:traceframe-info:read'Traceframe info
                                             
'install-in-trace'   'InstallInTrace'        Install
                                             tracepoint in
                                             tracing
                                             
'disable-randomization''QDisableRandomization''set
                                             disable-randomization'
                                             
'conditional-breakpoints-packet''Z0 and Z1'  'Support for
                                             target-side
                                             breakpoint
                                             condition
                                             evaluation'
                                             
'swbreak-feature'    'swbreak stop reason'   'break'
                                             
'hwbreak-feature'    'hwbreak stop reason'   'hbreak'
                                             
'fork-event-feature' 'fork stop reason'      'fork'
                                             
'vfork-event-feature''vfork stop reason'     'vfork'
                                             


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 in your
     program's startup code.

'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).  The
     EXCEPTION_NUMBER specifies the exception which should be changed;
     its meaning is architecture-dependent (for example, different
     numbers might represent divide by zero, misaligned access, etc).
     When this exception occurs, control should be transferred directly
     to 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 in your program's startup code, before the main
     procedure is called:

          set_debug_traps();
          breakpoint();

     On some machines, when a breakpoint trap is raised, the hardware
     automatically makes the PC point to the instruction after the
     breakpoint.  If your machine doesn't do that, you may need to
     adjust 'handle_exception' to arrange for it to return to the
     instruction after the breakpoint on this first invocation, so that
     your program doesn't keep hitting the initial breakpoint instead of
     making progress.

  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
* 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.  This
includes, as of this writing, GNU/Linux and Solaris, but not HP-UX, for
example.

   This command may also work on core files that were created on a
system that has the '/proc' facility.

'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 cmdline'
     Show the original command line of the process.  This command is
     specific to GNU/Linux.

'info proc cwd'
     Show the current working directory of the process.  This command is
     specific to GNU/Linux.

'info proc exe'
     Show the name of executable of the process.  This command is
     specific to GNU/Linux.

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

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

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: Darwin,  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: Darwin,  Prev: Hurd Native,  Up: Native

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

   GDB includes the ability to debug programs running on various
real-time operating systems.


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
* PowerPC Embedded::            PowerPC Embedded
* PA::                          HP PA Embedded
* Sparclet::                    Tsqware Sparclet
* Sparclite::                   Fujitsu Sparclite
* Z8000::                       Zilog Z8000
* AVR::                         Atmel AVR
* CRIS::                        CRIS
* Super-H::                     Renesas Super-H


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.  The
          argument 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: PowerPC Embedded,  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-elf'.

   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-elf'.)

     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: PowerPC Embedded,  Next: PA,  Prev: MIPS Embedded,  Up: Embedded Processors

21.3.6 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 given by START-LOCATION and
     END-LOCATION, which can specify a function name, a line number, an
     offset of lines from the current line or from the start location,
     or an address of an instruction (see *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: Sparclet,  Prev: PowerPC Embedded,  Up: Embedded Processors

21.3.7 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: PA,  Up: Embedded Processors

21.3.8 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.8.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.8.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.8.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.8.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.9 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.10 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.11 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.12 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.13 Renesas Super-H
-----------------------

For the Renesas Super-H processor, GDB provides these commands:

'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:

* AArch64::
* i386::
* Alpha::
* MIPS::
* HPPA::               HP PA architecture
* SPU::                Cell Broadband Engine SPU architecture
* PowerPC::
* Nios II::


File: gdb.info,  Node: AArch64,  Next: i386,  Up: Architectures

21.4.1 AArch64
--------------

When GDB is debugging the AArch64 architecture, it provides the
following special commands:

'set debug aarch64'
     This command determines whether AArch64 architecture-specific
     debugging messages are to be displayed.

'show debug aarch64'
     Show whether AArch64 debugging messages are displayed.


File: gdb.info,  Node: i386,  Next: Alpha,  Prev: AArch64,  Up: Architectures

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

21.4.2.1 Intel(R) "Memory Protection Extensions" (MPX).
.......................................................

Memory Protection Extension (MPX) adds the bound registers 'BND0' (1)
through 'BND3'.  Bound registers store a pair of 64-bit values which are
the lower bound and upper bound.  Bounds are effective addresses or
memory locations.  The upper bounds are architecturally represented in
1's complement form.  A bound having lower bound = 0, and upper bound =
0 (1's complement of all bits set) will allow access to the entire
address space.

   'BND0' through 'BND3' are represented in GDB as 'bnd0raw' through
'bnd3raw'.  Pseudo registers 'bnd0' through 'bnd3' display the upper
bound performing the complement of one operation on the upper bound
value, i.e. when upper bound in 'bnd0raw' is 0 in the GDB 'bnd0' it will
be '0xfff...'.  In this sense it can also be noted that the upper bounds
are inclusive.

   As an example, assume that the register BND0 holds bounds for a
pointer having access allowed for the range between 0x32 and 0x71.  The
values present on bnd0raw and bnd registers are presented as follows:

     	bnd0raw = {0x32, 0xffffffff8e}
     	bnd0 = {lbound = 0x32, ubound = 0x71} : size 64

   This way the raw value can be accessed via bnd0raw...bnd3raw.  Any
change on bnd0...bnd3 or bnd0raw...bnd3raw is reflect on its
counterpart.  When the bnd0...bnd3 registers are displayed via Python,
the display includes the memory size, in bits, accessible to the
pointer.

   Bounds can also be stored in bounds tables, which are stored in
application memory.  These tables store bounds for pointers by
specifying the bounds pointer's value along with its bounds.  Evaluating
and changing bounds located in bound tables is therefore interesting
while investigating bugs on MPX context.  GDB provides commands for this
purpose:

'show mpx bound POINTER'
     Display bounds of the given POINTER.

'set mpx bound POINTER, LBOUND, UBOUND'
     Set the bounds of a pointer in the bound table.  This command takes
     three parameters: POINTER is the pointers whose bounds are to be
     changed, LBOUND and UBOUND are new values for lower and upper
     bounds respectively.

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

   (1) The register named with capital letters represent the
architecture registers.


File: gdb.info,  Node: Alpha,  Next: MIPS,  Prev: i386,  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 mips compression ARG'
     Tell GDB which MIPS compressed ISA (Instruction Set Architecture)
     encoding is used by the inferior.  GDB uses this for code
     disassembly and other internal interpretation purposes.  This
     setting is only referred to when no executable has been associated
     with the debugging session or the executable does not provide
     information about the encoding it uses.  Otherwise this setting is
     automatically updated from information provided by the executable.

     Possible values of ARG are 'mips16' and 'micromips'.  The default
     compressed ISA encoding is 'mips16', as executables containing
     MIPS16 code frequently are not identified as such.

     This setting is "sticky"; that is, it retains its value across
     debugging sessions until reset either explicitly with this command
     or implicitly from an executable.

     The compiler and/or assembler typically add symbol table
     annotations to identify functions compiled for the MIPS16 or
     microMIPS ISAs.  If these function-scope annotations are present,
     GDB uses them in preference to the global compressed ISA encoding
     setting.

'show mips compression'
     Show the MIPS compressed ISA encoding 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,  Next: Nios II,  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: Nios II,  Prev: PowerPC,  Up: Architectures

21.4.8 Nios II
--------------

When GDB is debugging the Nios II architecture, it provides the
following special commands:

'set debug nios2'
     This command turns on and off debugging messages for the Nios II
     target code in GDB.

'show debug nios2'
     Show the current setting of Nios II debugging messages.


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
* Auto-loading::                Automatically loading associated files
* Messages/Warnings::           Optional warnings and messages
* Debugging Output::            Optional messages about internal happenings
* Other Misc Settings::         Other Miscellaneous Settings


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 history size unlimited'
     Set the number of commands which GDB keeps in its history list.
     This defaults to the value of the environment variable
     'GDBHISTSIZE', or to 256 if this variable is not set.  Non-numeric
     values of 'GDBHISTSIZE' are ignored.  If SIZE is 'unlimited' or if
     'GDBHISTSIZE' is either a negative number or the empty string, then
     the number of commands GDB keeps in the history list is unlimited.

'set history remove-duplicates COUNT'
'set history remove-duplicates unlimited'
     Control the removal of duplicate history entries in the command
     history list.  If COUNT is non-zero, GDB will look back at the last
     COUNT history entries and remove the first entry that is a
     duplicate of the current entry being added to the command history
     list.  If COUNT is 'unlimited' then this lookbehind is unbounded.
     If COUNT is 0, then removal of duplicate history entries is
     disabled.

     Only history entries added during the current session are
     considered for removal.  This option is set to 0 by default.

   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'
'set height unlimited'
'show height'
'set width CPL'
'set width unlimited'
'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 either 'unlimited' or 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 unlimited' or '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 unlimited'.  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.  The 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.  The 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: Auto-loading,  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.

   When GDB is debugging the AArch64 architecture, it provides a
"Newlib" OS ABI. This is useful for handling 'setjmp' and 'longjmp' when
debugging binaries that use the NEWLIB C library.  The "Newlib" OS ABI
can be selected by 'set osabi Newlib'.

'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: Auto-loading,  Next: Messages/Warnings,  Prev: ABI,  Up: Controlling GDB

22.7 Automatically loading associated files
===========================================

GDB sometimes reads files with commands and settings automatically,
without being explicitly told so by the user.  We call this feature
"auto-loading".  While auto-loading is useful for automatically adapting
GDB to the needs of your project, it can sometimes produce unexpected
results or introduce security risks (e.g., if the file comes from
untrusted sources).

* Menu:

* Init File in the Current Directory:: 'set/show/info auto-load local-gdbinit'
* libthread_db.so.1 file::             'set/show/info auto-load libthread-db'

* Auto-loading safe path::             'set/show/info auto-load safe-path'
* Auto-loading verbose mode::          'set/show debug auto-load'

   There are various kinds of files GDB can automatically load.  In
addition to these files, GDB supports auto-loading code written in
various extension languages.  *Note Auto-loading extensions::.

   Note that loading of these associated files (including the local
'.gdbinit' file) requires accordingly configured 'auto-load safe-path'
(*note Auto-loading safe path::).

   For these reasons, GDB includes commands and options to let you
control when to auto-load files and which files should be auto-loaded.

'set auto-load off'
     Globally disable loading of all auto-loaded files.  You may want to
     use this command with the '-iex' option (*note Option
     -init-eval-command::) such as:
          $ gdb -iex "set auto-load off" untrusted-executable corefile

     Be aware that system init file (*note System-wide configuration::)
     and init files from your home directory (*note Home Directory Init
     File::) still get read (as they come from generally trusted
     directories).  To prevent GDB from auto-loading even those init
     files, use the '-nx' option (*note Mode Options::), in addition to
     'set auto-load no'.

'show auto-load'
     Show whether auto-loading of each specific 'auto-load' file(s) is
     enabled or disabled.

          (gdb) show auto-load
          gdb-scripts:  Auto-loading of canned sequences of commands scripts is on.
          libthread-db:  Auto-loading of inferior specific libthread_db is on.
          local-gdbinit:  Auto-loading of .gdbinit script from current directory
                          is on.
          python-scripts:  Auto-loading of Python scripts is on.
          safe-path:  List of directories from which it is safe to auto-load files
                      is $debugdir:$datadir/auto-load.
          scripts-directory:  List of directories from which to load auto-loaded scripts
                              is $debugdir:$datadir/auto-load.

'info auto-load'
     Print whether each specific 'auto-load' file(s) have been
     auto-loaded or not.

          (gdb) info auto-load
          gdb-scripts:
          Loaded  Script
          Yes     /home/user/gdb/gdb-gdb.gdb
          libthread-db:  No auto-loaded libthread-db.
          local-gdbinit:  Local .gdbinit file "/home/user/gdb/.gdbinit" has been
                          loaded.
          python-scripts:
          Loaded  Script
          Yes     /home/user/gdb/gdb-gdb.py

   These are GDB control commands for the auto-loading:

*Note set auto-load off::.           Disable auto-loading globally.
*Note show auto-load::.              Show setting of all kinds of
                                     files.
*Note info auto-load::.              Show state of all kinds of files.
*Note set auto-load gdb-scripts::.   Control for GDB command scripts.
*Note show auto-load                 Show setting of GDB command
gdb-scripts::.                       scripts.
*Note info auto-load                 Show state of GDB command scripts.
gdb-scripts::.
*Note set auto-load                  Control for GDB Python scripts.
python-scripts::.
*Note show auto-load                 Show setting of GDB Python
python-scripts::.                    scripts.
*Note info auto-load                 Show state of GDB Python scripts.
python-scripts::.
*Note set auto-load                  Control for GDB Guile scripts.
guile-scripts::.
*Note show auto-load                 Show setting of GDB Guile scripts.
guile-scripts::.
*Note info auto-load                 Show state of GDB Guile scripts.
guile-scripts::.
*Note set auto-load                  Control for GDB auto-loaded
scripts-directory::.                 scripts location.
*Note show auto-load                 Show GDB auto-loaded scripts
scripts-directory::.                 location.
*Note                                Add directory for auto-loaded
add-auto-load-scripts-directory::.   scripts location list.
*Note set auto-load                  Control for init file in the
local-gdbinit::.                     current directory.
*Note show auto-load                 Show setting of init file in the
local-gdbinit::.                     current directory.
*Note info auto-load                 Show state of init file in the
local-gdbinit::.                     current directory.
*Note set auto-load                  Control for thread debugging
libthread-db::.                      library.
*Note show auto-load                 Show setting of thread debugging
libthread-db::.                      library.
*Note info auto-load                 Show state of thread debugging
libthread-db::.                      library.
*Note set auto-load safe-path::.     Control directories trusted for
                                     automatic loading.
*Note show auto-load safe-path::.    Show directories trusted for
                                     automatic loading.
*Note add-auto-load-safe-path::.     Add directory trusted for
                                     automatic loading.


File: gdb.info,  Node: Init File in the Current Directory,  Next: libthread_db.so.1 file,  Up: Auto-loading

22.7.1 Automatically loading init file in the current directory
---------------------------------------------------------------

By default, GDB reads and executes the canned sequences of commands from
init file (if any) in the current working directory, see *note Init File
in the Current Directory during Startup::.

   Note that loading of this local '.gdbinit' file also requires
accordingly configured 'auto-load safe-path' (*note Auto-loading safe
path::).

'set auto-load local-gdbinit [on|off]'
     Enable or disable the auto-loading of canned sequences of commands
     (*note Sequences::) found in init file in the current directory.

'show auto-load local-gdbinit'
     Show whether auto-loading of canned sequences of commands from init
     file in the current directory is enabled or disabled.

'info auto-load local-gdbinit'
     Print whether canned sequences of commands from init file in the
     current directory have been auto-loaded.


File: gdb.info,  Node: libthread_db.so.1 file,  Next: Auto-loading safe path,  Prev: Init File in the Current Directory,  Up: Auto-loading

22.7.2 Automatically loading thread debugging library
-----------------------------------------------------

This feature is currently present only on GNU/Linux native hosts.

   GDB reads in some cases thread debugging library from places specific
to the inferior (*note set libthread-db-search-path::).

   The special 'libthread-db-search-path' entry '$sdir' is processed
without checking this 'set auto-load libthread-db' switch as system
libraries have to be trusted in general.  In all other cases of
'libthread-db-search-path' entries GDB checks first if 'set auto-load
libthread-db' is enabled before trying to open such thread debugging
library.

   Note that loading of this debugging library also requires accordingly
configured 'auto-load safe-path' (*note Auto-loading safe path::).

'set auto-load libthread-db [on|off]'
     Enable or disable the auto-loading of inferior specific thread
     debugging library.

'show auto-load libthread-db'
     Show whether auto-loading of inferior specific thread debugging
     library is enabled or disabled.

'info auto-load libthread-db'
     Print the list of all loaded inferior specific thread debugging
     libraries and for each such library print list of inferior PIDs
     using it.


File: gdb.info,  Node: Auto-loading safe path,  Next: Auto-loading verbose mode,  Prev: libthread_db.so.1 file,  Up: Auto-loading

22.7.3 Security restriction for auto-loading
--------------------------------------------

As the files of inferior can come from untrusted source (such as
submitted by an application user) GDB does not always load any files
automatically.  GDB provides the 'set auto-load safe-path' setting to
list directories trusted for loading files not explicitly requested by
user.  Each directory can also be a shell wildcard pattern.

   If the path is not set properly you will see a warning and the file
will not get loaded:

     $ ./gdb -q ./gdb
     Reading symbols from /home/user/gdb/gdb...done.
     warning: File "/home/user/gdb/gdb-gdb.gdb" auto-loading has been
              declined by your `auto-load safe-path' set
              to "$debugdir:$datadir/auto-load".
     warning: File "/home/user/gdb/gdb-gdb.py" auto-loading has been
              declined by your `auto-load safe-path' set
              to "$debugdir:$datadir/auto-load".

To instruct GDB to go ahead and use the init files anyway, invoke GDB
like this:

     $ gdb -q -iex "set auto-load safe-path /home/user/gdb" ./gdb

   The list of trusted directories is controlled by the following
commands:

'set auto-load safe-path [DIRECTORIES]'
     Set the list of directories (and their subdirectories) trusted for
     automatic loading and execution of scripts.  You can also enter a
     specific trusted file.  Each directory can also be a shell wildcard
     pattern; wildcards do not match directory separator - see
     'FNM_PATHNAME' for system function 'fnmatch' (*note fnmatch:
     (libc)Wildcard Matching.).  If you omit DIRECTORIES, 'auto-load
     safe-path' will be reset to its default value as specified during
     GDB compilation.

     The list of directories uses path separator (':' on GNU and Unix
     systems, ';' on MS-Windows and MS-DOS) to separate directories,
     similarly to the 'PATH' environment variable.

'show auto-load safe-path'
     Show the list of directories trusted for automatic loading and
     execution of scripts.

'add-auto-load-safe-path'
     Add an entry (or list of entries) to the list of directories
     trusted for automatic loading and execution of scripts.  Multiple
     entries may be delimited by the host platform path separator in
     use.

   This variable defaults to what '--with-auto-load-dir' has been
configured to (*note with-auto-load-dir::).  '$debugdir' and '$datadir'
substitution applies the same as for *note set auto-load
scripts-directory::.  The default 'set auto-load safe-path' value can be
also overriden by GDB configuration option '--with-auto-load-safe-path'.

   Setting this variable to '/' disables this security protection,
corresponding GDB configuration option is
'--without-auto-load-safe-path'.  This variable is supposed to be set to
the system directories writable by the system superuser only.  Users can
add their source directories in init files in their home directories
(*note Home Directory Init File::).  See also deprecated init file in
the current directory (*note Init File in the Current Directory during
Startup::).

   To force GDB to load the files it declined to load in the previous
example, you could use one of the following ways:

'~/.gdbinit': 'add-auto-load-safe-path ~/src/gdb'
     Specify this trusted directory (or a file) as additional component
     of the list.  You have to specify also any existing directories
     displayed by by 'show auto-load safe-path' (such as '/usr:/bin' in
     this example).

'gdb -iex "set auto-load safe-path /usr:/bin:~/src/gdb" ...'
     Specify this directory as in the previous case but just for a
     single GDB session.

'gdb -iex "set auto-load safe-path /" ...'
     Disable auto-loading safety for a single GDB session.  This assumes
     all the files you debug during this GDB session will come from
     trusted sources.

'./configure --without-auto-load-safe-path'
     During compilation of GDB you may disable any auto-loading safety.
     This assumes all the files you will ever debug with this GDB come
     from trusted sources.

   On the other hand you can also explicitly forbid automatic files
loading which also suppresses any such warning messages:

'gdb -iex "set auto-load no" ...'
     You can use GDB command-line option for a single GDB session.

'~/.gdbinit': 'set auto-load no'
     Disable auto-loading globally for the user (*note Home Directory
     Init File::).  While it is improbable, you could also use system
     init file instead (*note System-wide configuration::).

   This setting applies to the file names as entered by user.  If no
entry matches GDB tries as a last resort to also resolve all the file
names into their canonical form (typically resolving symbolic links) and
compare the entries again.  GDB already canonicalizes most of the
filenames on its own before starting the comparison so a canonical form
of directories is recommended to be entered.


File: gdb.info,  Node: Auto-loading verbose mode,  Prev: Auto-loading safe path,  Up: Auto-loading

22.7.4 Displaying files tried for auto-load
-------------------------------------------

For better visibility of all the file locations where you can place
scripts to be auto-loaded with inferior -- or to protect yourself
against accidental execution of untrusted scripts -- GDB provides a
feature for printing all the files attempted to be loaded.  Both
existing and non-existing files may be printed.

   For example the list of directories from which it is safe to
auto-load files (*note Auto-loading safe path::) applies also to
canonicalized filenames which may not be too obvious while setting it
up.

     (gdb) set debug auto-load on
     (gdb) file ~/src/t/true
     auto-load: Loading canned sequences of commands script "/tmp/true-gdb.gdb"
                for objfile "/tmp/true".
     auto-load: Updating directories of "/usr:/opt".
     auto-load: Using directory "/usr".
     auto-load: Using directory "/opt".
     warning: File "/tmp/true-gdb.gdb" auto-loading has been declined
              by your `auto-load safe-path' set to "/usr:/opt".

'set debug auto-load [on|off]'
     Set whether to print the filenames attempted to be auto-loaded.

'show debug auto-load'
     Show whether printing of the filenames attempted to be auto-loaded
     is turned on or off.


File: gdb.info,  Node: Messages/Warnings,  Next: Debugging Output,  Prev: Auto-loading,  Up: Controlling GDB

22.8 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.9 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 aarch64'
     Turns on or off display of debugging messages related to ARM
     AArch64.  The default is off.
'show debug aarch64'
     Displays the current state of displaying debugging messages related
     to ARM AArch64.
'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-solib'
     Control display of debugging messages from the AIX shared library
     support module.  The default is off.
'show debug aix-thread'
     Show the current state of displaying AIX shared library debugging
     messages.
'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 coff-pe-read'
     Control display of debugging messages related to reading of COFF/PE
     exported symbols.  The default is off.
'show debug coff-pe-read'
     Displays the current state of displaying debugging messages related
     to reading of COFF/PE exported symbols.
'set debug dwarf-die'
     Dump DWARF 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 dwarf-die'
     Show the current state of DWARF DIE debugging.
'set debug dwarf-line'
     Turns on or off display of debugging messages related to reading
     DWARF line tables.  The default is 0 (off).  A value of 1 provides
     basic information.  A value greater than 1 provides more verbose
     information.
'show debug dwarf-line'
     Show the current state of DWARF line table debugging.
'set debug dwarf-read'
     Turns on or off display of debugging messages related to reading
     DWARF debug info.  The default is 0 (off).  A value of 1 provides
     basic information.  A value greater than 1 provides more verbose
     information.
'show debug dwarf-read'
     Show the current state of DWARF reader 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 linux-namespaces'
     Turns on or off debugging messages from the Linux namespaces debug
     support.
'show debug linux-namespaces'
     Show the current state of Linux namespaces debugging messages.
'set debug mach-o'
     Control display of debugging messages related to Mach-O symbols
     processing.  The default is off.
'show debug mach-o'
     Displays the current state of displaying debugging messages related
     to reading of COFF/PE exported symbols.
'set debug notification'
     Turns on or off debugging messages about remote async notification.
     The default is off.
'show debug notification'
     Displays the current state of remote async notification 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 symbol-lookup'
     Turns on or off display of debugging messages related to symbol
     lookup.  The default is 0 (off).  A value of 1 provides basic
     information.  A value greater than 1 provides more verbose
     information.
'show debug symbol-lookup'
     Show the current state of symbol lookup debugging messages.
'set debug symfile'
     Turns on or off display of debugging messages related to symbol
     file functions.  The default is off.  *Note Files::.
'show debug symfile'
     Show the current state of symbol file debugging messages.
'set debug symtab-create'
     Turns on or off display of debugging messages related to symbol
     table creation.  The default is 0 (off).  A value of 1 provides
     basic information.  A value greater than 1 provides more verbose
     information.
'show debug symtab-create'
     Show the current state of symbol table creation debugging.
'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.
'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 debug varobj'
     Turns on or off display of GDB variable object debugging info.  The
     default is off.
'show debug varobj'
     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.10 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 several mechanisms for extension.  GDB also provides the
ability to automatically load extensions when it reads a file for
debugging.  This allows the user to automatically customize GDB for the
program being debugged.

* Menu:

* Sequences::                Canned Sequences of GDB Commands
* Python::                   Extending GDB using Python
* Guile::                    Extending GDB using Guile
* Auto-loading extensions::  Automatically loading extensions
* Multiple Extension Languages:: Working with multiple extension languages
* Aliases::                  Creating new spellings of existing commands

   To facilitate the use of extension languages, GDB is capable of
evaluating the contents of a file.  When doing so, GDB can recognize
which extension language is being used by looking at the filename
extension.  Files with an unrecognized filename extension are always
treated as a 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.


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
* Auto-loading sequences::  Controlling auto-loaded command files


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.  The argument 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 and all python commands defined in
     class COMAND_USER. The first line of the documentation or docstring
     is included (if any).

'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.  This does not work for
     user-defined python 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.  This does not apply to
     user-defined python commands.

   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,  Next: Auto-loading sequences,  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: Auto-loading sequences,  Prev: Output,  Up: Sequences

23.1.5 Controlling auto-loading native GDB scripts
--------------------------------------------------

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
the command file 'OBJFILE-gdb.gdb'.  *Note Auto-loading extensions::.

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

'set auto-load gdb-scripts [on|off]'
     Enable or disable the auto-loading of canned sequences of commands
     scripts.

'show auto-load gdb-scripts'
     Show whether auto-loading of canned sequences of commands scripts
     is enabled or disabled.

'info auto-load gdb-scripts [REGEXP]'
     Print the list of all canned sequences of commands scripts that GDB
     auto-loaded.

   If REGEXP is supplied only canned sequences of commands scripts with
matching names are printed.


File: gdb.info,  Node: Python,  Next: Guile,  Prev: Sequences,  Up: Extending GDB

23.2 Extending GDB using Python
===============================

You can extend 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.
* 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 two commands for accessing the Python interpreter, and one
related setting:

'python-interactive [COMMAND]'
'pi [COMMAND]'
     Without an argument, the 'python-interactive' command can be used
     to start an interactive Python prompt.  To return to GDB, type the
     'EOF' character (e.g., 'Ctrl-D' on an empty prompt).

     Alternatively, a single-line Python command can be given as an
     argument and evaluated.  If the command is an expression, the
     result will be printed; otherwise, nothing will be printed.  For
     example:

          (gdb) python-interactive 2 + 3
          5

'python [COMMAND]'
'py [COMMAND]'
     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: Python Auto-loading,  Prev: Python Commands,  Up: Python

23.2.2 Python API
-----------------

You can get quick online help for GDB's Python API by issuing the
command 'python help (gdb)'.

   Functions and methods which have two or more optional arguments allow
them to be specified using keyword syntax.  This allows passing some
optional arguments while skipping others.  Example:
'gdb.some_function ('foo', bar = 1, baz = 2)'.

* 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.
* Type Printing API::		Pretty-printing types.
* Frame Filter API::            Filtering Frames.
* Frame Decorator API::         Decorating Frames.
* Writing a Frame Filter::      Writing a Frame Filter.
* Unwinding Frames in Python::  Writing frame unwinder.
* Xmethods In Python::          Adding and replacing methods of C++ classes.
* Xmethod API::                 Xmethod types.
* Writing an Xmethod::          Writing an xmethod.
* 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 blocks from Python.
* Symbols In Python::           Python representation of symbols.
* Symbol Tables In Python::     Python representation of symbol tables.
* Line Tables In Python::       Python representation of line tables.
* Breakpoints In Python::       Manipulating breakpoints using Python.
* Finish Breakpoints in Python:: Setting Breakpoints on function return
                                using Python.
* Lazy Strings In Python::      Python representation of lazy strings.
* Architectures In Python::     Python representation of architectures.


File: gdb.info,  Node: Basic Python,  Next: Exception Handling,  Up: Python API

23.2.2.1 Basic Python
.....................

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.

   Some care must be taken when writing Python code to run in GDB.  Two
things worth noting in particular:

   * GDB install handlers for 'SIGCHLD' and 'SIGINT'.  Python code must
     not override these, or even change the options using 'sigaction'.
     If your program changes the handling of these signals, GDB will
     most likely stop working correctly.  Note that it is unfortunately
     common for GUI toolkits to install a 'SIGCHLD' handler.

   * GDB takes care to mark its internal file descriptors as
     close-on-exec.  However, this cannot be done in a thread-safe way
     on all platforms.  Your Python programs should be aware of this and
     should both create new file descriptors with the close-on-exec flag
     set and arrange to close unneeded file descriptors before starting
     a child process.

   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.

     The FROM_TTY flag 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 (and to the log output if logging is turned on).
     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 given by its name, a string;
     the parameter name string 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::).
     The NUMBER argument 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, which must be a string, as an expression in the
     current language, evaluate it, and return the result as a
     'gdb.Value'.

     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.find_pc_line (pc)
     Return the 'gdb.Symtab_and_line' object corresponding to the PC
     value.  *Note Symbol Tables In Python::.  If an invalid value of PC
     is passed as an argument, then the 'symtab' and 'line' attributes
     of the returned 'gdb.Symtab_and_line' object will be 'None' and 0
     respectively.

 -- 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 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_USER)
     >  def invoke (self, args, from_tty):
     >    argv = gdb.string_to_argv (args)
     >    if len (argv) != 0:
     >      raise gdb.GdbError ("hello-world takes no arguments")
     >    print "Hello, World!"
     >HelloWorld ()
     >end
     (gdb) hello-world 42
     hello-world takes no arguments


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'.  Valid Python operations
can also be performed on 'gdb.Value' objects representing a 'struct' or
'class' object.  For such cases, the overloaded operator (if present),
is used to perform the operation.  For example, if 'val1' and 'val2' are
'gdb.Value' objects representing instances of a 'class' which overloads
the '+' operator, then one can use the '+' operator in their Python
script as follows:

     val3 = val1 + val2

The result of the operation 'val3' is also a 'gdb.Value' object
corresponding to the value returned by the overloaded '+' operator.  In
general, overloaded operators are invoked for the following operations:
'+' (binary addition), '-' (binary subtraction), '*' (multiplication),
'/', '%', '<<', '>>', '|', '&', '^'.

   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.  Structure elements
can also be accessed by using 'gdb.Field' objects as subscripts (*note
Types In Python::, for more information on 'gdb.Field' objects).  For
example, if 'foo_field' is a 'gdb.Field' object corresponding to element
'foo' of the above structure, then 'bar' can also be accessed as
follows:

     bar = some_val[foo_field]

   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 in the current
          target language using the current target encoding.  If a
          character cannot be represented in the current target
          encoding, then an exception is thrown.

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

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

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

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

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

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

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

          int val = 10;
          int &ref = val;

     then applying 'Value.dereference' to the 'gdb.Value' object
     corresponding to 'ref' will result in an error, while applying
     'Value.referenced_value' will result in a 'gdb.Value' object
     identical to that corresponding to 'val'.

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

     The 'gdb.Value' object 'py_val' is identical to that corresponding
     to 'val'.

 -- Function: Value.reference_value ()
     Return a 'gdb.Value' object which is a reference to the value
     encapsulated by this instance.

 -- Function: Value.const_value ()
     Return a 'gdb.Value' object which is a 'const' version of the value
     encapsulated by this instance.

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

     Values are interpreted as strings according to the rules of the
     current language.  If the optional length argument is given, the
     string will be converted to that length, and will include any
     embedded zeroes that the string may contain.  Otherwise, for
     languages where the string is zero-terminated, the entire string
     will be converted.

     For example, in C-like languages, a value is a string if it is a
     pointer to or an array of characters or ints of type 'wchar_t',
     'char16_t', or 'char32_t'.

     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 its NAME, which 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.name
     The name of this type.  If this type has no name, then 'None' is
     returned.

 -- 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 'enum' or 'static' (as in
          C++ or Java) fields.  The value is the position, counting in
          bits, from the start of the containing type.

     'enumval'
          This attribute is only available for 'enum' fields, and its
          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.

     'parent_type'
          The type which contains this field.  This is an instance of
          'gdb.Type'.

 -- 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.vector (N1 [, N2])
     Return a new 'gdb.Type' object which represents a vector of this
     type.  If one argument is given, it is the inclusive upper bound of
     the vector; in this case the lower bound is zero.  If two arguments
     are given, the first argument is the lower bound of the vector, and
     the second argument is the upper bound of the vector.  A vector's
     length must not be negative, but the bounds can be.

     The difference between an 'array' and a 'vector' is that arrays
     behave like in C: when used in expressions they decay to a pointer
     to the first element whereas vectors are treated as first class
     values.

 -- 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.Value' or 'gdb.Type' which represents the value
     of the Nth template argument (indexed starting at 0).

     If this 'gdb.Type' is not a template type, or if the type has fewer
     than N template arguments, 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.

 -- Function: Type.optimized_out ()
     Return 'gdb.Value' instance of this type whose value is optimized
     out.  This allows a frame decorator to indicate that the value of
     an argument or a local variable is not known.

   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.  It is deprecated.

'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: Type Printing API,  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 Python 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: Type Printing API,  Next: Frame Filter API,  Prev: Writing a Pretty-Printer,  Up: Python API

23.2.2.8 Type Printing API
..........................

GDB provides a way for Python code to customize type display.  This is
mainly useful for substituting canonical typedef names for types.

   A "type printer" is just a Python object conforming to a certain
protocol.  A simple base class implementing the protocol is provided;
see *note gdb.types::.  A type printer must supply at least:

 -- Instance Variable of type_printer: enabled
     A boolean which is True if the printer is enabled, and False
     otherwise.  This is manipulated by the 'enable type-printer' and
     'disable type-printer' commands.

 -- Instance Variable of type_printer: name
     The name of the type printer.  This must be a string.  This is used
     by the 'enable type-printer' and 'disable type-printer' commands.

 -- Method on type_printer: instantiate (self)
     This is called by GDB at the start of type-printing.  It is only
     called if the type printer is enabled.  This method must return a
     new object that supplies a 'recognize' method, as described below.

   When displaying a type, say via the 'ptype' command, GDB will compute
a list of type recognizers.  This is done by iterating first over the
per-objfile type printers (*note Objfiles In Python::), followed by the
per-progspace type printers (*note Progspaces In Python::), and finally
the global type printers.

   GDB will call the 'instantiate' method of each enabled type printer.
If this method returns 'None', then the result is ignored; otherwise, it
is appended to the list of recognizers.

   Then, when GDB is going to display a type name, it iterates over the
list of recognizers.  For each one, it calls the recognition function,
stopping if the function returns a non-'None' value.  The recognition
function is defined as:

 -- Method on type_recognizer: recognize (self, type)
     If TYPE is not recognized, return 'None'.  Otherwise, return a
     string which is to be printed as the name of TYPE.  The TYPE
     argument will be an instance of 'gdb.Type' (*note Types In
     Python::).

   GDB uses this two-pass approach so that type printers can efficiently
cache information without holding on to it too long.  For example, it
can be convenient to look up type information in a type printer and hold
it for a recognizer's lifetime; if a single pass were done then type
printers would have to make use of the event system in order to avoid
holding information that could become stale as the inferior changed.


File: gdb.info,  Node: Frame Filter API,  Next: Frame Decorator API,  Prev: Type Printing API,  Up: Python API

23.2.2.9 Filtering Frames.
..........................

Frame filters are Python objects that manipulate the visibility of a
frame or frames when a backtrace (*note Backtrace::) is printed by GDB.

   Only commands that print a backtrace, or, in the case of GDB/MI
commands (*note GDB/MI::), those that return a collection of frames are
affected.  The commands that work with frame filters are:

   'backtrace' (*note The backtrace command: backtrace-command.),
'-stack-list-frames' (*note The -stack-list-frames command:
-stack-list-frames.), '-stack-list-variables' (*note The
-stack-list-variables command: -stack-list-variables.),
'-stack-list-arguments' *note The -stack-list-arguments command:
-stack-list-arguments.) and '-stack-list-locals' (*note The
-stack-list-locals command: -stack-list-locals.).

   A frame filter works by taking an iterator as an argument, applying
actions to the contents of that iterator, and returning another iterator
(or, possibly, the same iterator it was provided in the case where the
filter does not perform any operations).  Typically, frame filters
utilize tools such as the Python's 'itertools' module to work with and
create new iterators from the source iterator.  Regardless of how a
filter chooses to apply actions, it must not alter the underlying GDB
frame or frames, or attempt to alter the call-stack within GDB.  This
preserves data integrity within GDB.  Frame filters are executed on a
priority basis and care should be taken that some frame filters may have
been executed before, and that some frame filters will be executed
after.

   An important consideration when designing frame filters, and well
worth reflecting upon, is that frame filters should avoid unwinding the
call stack if possible.  Some stacks can run very deep, into the tens of
thousands in some cases.  To search every frame when a frame filter
executes may be too expensive at that step.  The frame filter cannot
know how many frames it has to iterate over, and it may have to iterate
through them all.  This ends up duplicating effort as GDB performs this
iteration when it prints the frames.  If the filter can defer unwinding
frames until frame decorators are executed, after the last filter has
executed, it should.  *Note Frame Decorator API::, for more information
on decorators.  Also, there are examples for both frame decorators and
filters in later chapters.  *Note Writing a Frame Filter::, for more
information.

   The Python dictionary 'gdb.frame_filters' contains key/object
pairings that comprise a frame filter.  Frame filters in this dictionary
are called 'global' frame filters, and they are available when debugging
all inferiors.  These frame filters must register with the dictionary
directly.  In addition to the 'global' dictionary, there are other
dictionaries that are loaded with different inferiors via auto-loading
(*note Python Auto-loading::).  The two other areas where frame filter
dictionaries can be found are: 'gdb.Progspace' which contains a
'frame_filters' dictionary attribute, and each 'gdb.Objfile' object
which also contains a 'frame_filters' dictionary attribute.

   When a command is executed from GDB that is compatible with frame
filters, GDB combines the 'global', 'gdb.Progspace' and all
'gdb.Objfile' dictionaries currently loaded.  All of the 'gdb.Objfile'
dictionaries are combined, as several frames, and thus several object
files, might be in use.  GDB then prunes any frame filter whose
'enabled' attribute is 'False'.  This pruned list is then sorted
according to the 'priority' attribute in each filter.

   Once the dictionaries are combined, pruned and sorted, GDB creates an
iterator which wraps each frame in the call stack in a 'FrameDecorator'
object, and calls each filter in order.  The output from the previous
filter will always be the input to the next filter, and so on.

   Frame filters have a mandatory interface which each frame filter must
implement, defined here:

 -- Function: FrameFilter.filter (iterator)
     GDB will call this method on a frame filter when it has reached the
     order in the priority list for that filter.

     For example, if there are four frame filters:

          Name         Priority

          Filter1      5
          Filter2      10
          Filter3      100
          Filter4      1

     The order that the frame filters will be called is:

          Filter3 -> Filter2 -> Filter1 -> Filter4

     Note that the output from 'Filter3' is passed to the input of
     'Filter2', and so on.

     This 'filter' method is passed a Python iterator.  This iterator
     contains a sequence of frame decorators that wrap each 'gdb.Frame',
     or a frame decorator that wraps another frame decorator.  The first
     filter that is executed in the sequence of frame filters will
     receive an iterator entirely comprised of default 'FrameDecorator'
     objects.  However, after each frame filter is executed, the
     previous frame filter may have wrapped some or all of the frame
     decorators with their own frame decorator.  As frame decorators
     must also conform to a mandatory interface, these decorators can be
     assumed to act in a uniform manner (*note Frame Decorator API::).

     This method must return an object conforming to the Python iterator
     protocol.  Each item in the iterator must be an object conforming
     to the frame decorator interface.  If a frame filter does not wish
     to perform any operations on this iterator, it should return that
     iterator untouched.

     This method is not optional.  If it does not exist, GDB will raise
     and print an error.

 -- Variable: FrameFilter.name
     The 'name' attribute must be Python string which contains the name
     of the filter displayed by GDB (*note Frame Filter Management::).
     This attribute may contain any combination of letters or numbers.
     Care should be taken to ensure that it is unique.  This attribute
     is mandatory.

 -- Variable: FrameFilter.enabled
     The 'enabled' attribute must be Python boolean.  This attribute
     indicates to GDB whether the frame filter is enabled, and should be
     considered when frame filters are executed.  If 'enabled' is
     'True', then the frame filter will be executed when any of the
     backtrace commands detailed earlier in this chapter are executed.
     If 'enabled' is 'False', then the frame filter will not be
     executed.  This attribute is mandatory.

 -- Variable: FrameFilter.priority
     The 'priority' attribute must be Python integer.  This attribute
     controls the order of execution in relation to other frame filters.
     There are no imposed limits on the range of 'priority' other than
     it must be a valid integer.  The higher the 'priority' attribute,
     the sooner the frame filter will be executed in relation to other
     frame filters.  Although 'priority' can be negative, it is
     recommended practice to assume zero is the lowest priority that a
     frame filter can be assigned.  Frame filters that have the same
     priority are executed in unsorted order in that priority slot.
     This attribute is mandatory.


File: gdb.info,  Node: Frame Decorator API,  Next: Writing a Frame Filter,  Prev: Frame Filter API,  Up: Python API

23.2.2.10 Decorating Frames.
............................

Frame decorators are sister objects to frame filters (*note Frame Filter
API::).  Frame decorators are applied by a frame filter and can only be
used in conjunction with frame filters.

   The purpose of a frame decorator is to customize the printed content
of each 'gdb.Frame' in commands where frame filters are executed.  This
concept is called decorating a frame.  Frame decorators decorate a
'gdb.Frame' with Python code contained within each API call.  This
separates the actual data contained in a 'gdb.Frame' from the decorated
data produced by a frame decorator.  This abstraction is necessary to
maintain integrity of the data contained in each 'gdb.Frame'.

   Frame decorators have a mandatory interface, defined below.

   GDB already contains a frame decorator called 'FrameDecorator'.  This
contains substantial amounts of boilerplate code to decorate the content
of a 'gdb.Frame'.  It is recommended that other frame decorators inherit
and extend this object, and only to override the methods needed.

 -- Function: FrameDecorator.elided (self)

     The 'elided' method groups frames together in a hierarchical
     system.  An example would be an interpreter, where multiple
     low-level frames make up a single call in the interpreted language.
     In this example, the frame filter would elide the low-level frames
     and present a single high-level frame, representing the call in the
     interpreted language, to the user.

     The 'elided' function must return an iterable and this iterable
     must contain the frames that are being elided wrapped in a suitable
     frame decorator.  If no frames are being elided this function may
     return an empty iterable, or 'None'.  Elided frames are indented
     from normal frames in a 'CLI' backtrace, or in the case of
     'GDB/MI', are placed in the 'children' field of the eliding frame.

     It is the frame filter's task to also filter out the elided frames
     from the source iterator.  This will avoid printing the frame
     twice.

 -- Function: FrameDecorator.function (self)

     This method returns the name of the function in the frame that is
     to be printed.

     This method must return a Python string describing the function, or
     'None'.

     If this function returns 'None', GDB will not print any data for
     this field.

 -- Function: FrameDecorator.address (self)

     This method returns the address of the frame that is to be printed.

     This method must return a Python numeric integer type of sufficient
     size to describe the address of the frame, or 'None'.

     If this function returns a 'None', GDB will not print any data for
     this field.

 -- Function: FrameDecorator.filename (self)

     This method returns the filename and path associated with this
     frame.

     This method must return a Python string containing the filename and
     the path to the object file backing the frame, or 'None'.

     If this function returns a 'None', GDB will not print any data for
     this field.

 -- Function: FrameDecorator.line (self):

     This method returns the line number associated with the current
     position within the function addressed by this frame.

     This method must return a Python integer type, or 'None'.

     If this function returns a 'None', GDB will not print any data for
     this field.

 -- Function: FrameDecorator.frame_args (self)

     This method must return an iterable, or 'None'.  Returning an empty
     iterable, or 'None' means frame arguments will not be printed for
     this frame.  This iterable must contain objects that implement two
     methods, described here.

     This object must implement a 'argument' method which takes a single
     'self' parameter and must return a 'gdb.Symbol' (*note Symbols In
     Python::), or a Python string.  The object must also implement a
     'value' method which takes a single 'self' parameter and must
     return a 'gdb.Value' (*note Values From Inferior::), a Python
     value, or 'None'.  If the 'value' method returns 'None', and the
     'argument' method returns a 'gdb.Symbol', GDB will look-up and
     print the value of the 'gdb.Symbol' automatically.

     A brief example:

          class SymValueWrapper():

              def __init__(self, symbol, value):
                  self.sym = symbol
                  self.val = value

              def value(self):
                  return self.val

              def symbol(self):
                  return self.sym

          class SomeFrameDecorator()
          ...
          ...
              def frame_args(self):
                  args = []
                  try:
                      block = self.inferior_frame.block()
                  except:
                      return None

                  # Iterate over all symbols in a block.  Only add
                  # symbols that are arguments.
                  for sym in block:
                      if not sym.is_argument:
                          continue
                      args.append(SymValueWrapper(sym,None))

                  # Add example synthetic argument.
                  args.append(SymValueWrapper(``foo'', 42))

                  return args

 -- Function: FrameDecorator.frame_locals (self)

     This method must return an iterable or 'None'.  Returning an empty
     iterable, or 'None' means frame local arguments will not be printed
     for this frame.

     The object interface, the description of the various strategies for
     reading frame locals, and the example are largely similar to those
     described in the 'frame_args' function, (*note The frame filter
     frame_args function: frame_args.).  Below is a modified example:

          class SomeFrameDecorator()
          ...
          ...
              def frame_locals(self):
                  vars = []
                  try:
                      block = self.inferior_frame.block()
                  except:
                      return None

                  # Iterate over all symbols in a block.  Add all
                  # symbols, except arguments.
                  for sym in block:
                      if sym.is_argument:
                          continue
                      vars.append(SymValueWrapper(sym,None))

                  # Add an example of a synthetic local variable.
                  vars.append(SymValueWrapper(``bar'', 99))

                  return vars

 -- Function: FrameDecorator.inferior_frame (self):

     This method must return the underlying 'gdb.Frame' that this frame
     decorator is decorating.  GDB requires the underlying frame for
     internal frame information to determine how to print certain values
     when printing a frame.


File: gdb.info,  Node: Writing a Frame Filter,  Next: Unwinding Frames in Python,  Prev: Frame Decorator API,  Up: Python API

23.2.2.11 Writing a Frame Filter
................................

There are three basic elements that a frame filter must implement: it
must correctly implement the documented interface (*note Frame Filter
API::), it must register itself with GDB, and finally, it must decide if
it is to work on the data provided by GDB.  In all cases, whether it
works on the iterator or not, each frame filter must return an iterator.
A bare-bones frame filter follows the pattern in the following example.

     import gdb

     class FrameFilter():

         def __init__(self):
             # Frame filter attribute creation.
             #
             # 'name' is the name of the filter that GDB will display.
             #
             # 'priority' is the priority of the filter relative to other
             # filters.
             #
             # 'enabled' is a boolean that indicates whether this filter is
             # enabled and should be executed.

             self.name = "Foo"
             self.priority = 100
             self.enabled = True

             # Register this frame filter with the global frame_filters
             # dictionary.
             gdb.frame_filters[self.name] = self

         def filter(self, frame_iter):
             # Just return the iterator.
             return frame_iter

   The frame filter in the example above implements the three
requirements for all frame filters.  It implements the API, self
registers, and makes a decision on the iterator (in this case, it just
returns the iterator untouched).

   The first step is attribute creation and assignment, and as shown in
the comments the filter assigns the following attributes: 'name',
'priority' and whether the filter should be enabled with the 'enabled'
attribute.

   The second step is registering the frame filter with the dictionary
or dictionaries that the frame filter has interest in.  As shown in the
comments, this filter just registers itself with the global dictionary
'gdb.frame_filters'.  As noted earlier, 'gdb.frame_filters' is a
dictionary that is initialized in the 'gdb' module when GDB starts.
What dictionary a filter registers with is an important consideration.
Generally, if a filter is specific to a set of code, it should be
registered either in the 'objfile' or 'progspace' dictionaries as they
are specific to the program currently loaded in GDB.  The global
dictionary is always present in GDB and is never unloaded.  Any filters
registered with the global dictionary will exist until GDB exits.  To
avoid filters that may conflict, it is generally better to register
frame filters against the dictionaries that more closely align with the
usage of the filter currently in question.  *Note Python Auto-loading::,
for further information on auto-loading Python scripts.

   GDB takes a hands-off approach to frame filter registration,
therefore it is the frame filter's responsibility to ensure registration
has occurred, and that any exceptions are handled appropriately.  In
particular, you may wish to handle exceptions relating to Python
dictionary key uniqueness.  It is mandatory that the dictionary key is
the same as frame filter's 'name' attribute.  When a user manages frame
filters (*note Frame Filter Management::), the names GDB will display
are those contained in the 'name' attribute.

   The final step of this example is the implementation of the 'filter'
method.  As shown in the example comments, we define the 'filter' method
and note that the method must take an iterator, and also must return an
iterator.  In this bare-bones example, the frame filter is not very
useful as it just returns the iterator untouched.  However this is a
valid operation for frame filters that have the 'enabled' attribute set,
but decide not to operate on any frames.

   In the next example, the frame filter operates on all frames and
utilizes a frame decorator to perform some work on the frames.  *Note
Frame Decorator API::, for further information on the frame decorator
interface.

   This example works on inlined frames.  It highlights frames which are
inlined by tagging them with an "[inlined]" tag.  By applying a frame
decorator to all frames with the Python 'itertools imap' method, the
example defers actions to the frame decorator.  Frame decorators are
only processed when GDB prints the backtrace.

   This introduces a new decision making topic: whether to perform
decision making operations at the filtering step, or at the printing
step.  In this example's approach, it does not perform any filtering
decisions at the filtering step beyond mapping a frame decorator to each
frame.  This allows the actual decision making to be performed when each
frame is printed.  This is an important consideration, and well worth
reflecting upon when designing a frame filter.  An issue that frame
filters should avoid is unwinding the stack if possible.  Some stacks
can run very deep, into the tens of thousands in some cases.  To search
every frame to determine if it is inlined ahead of time may be too
expensive at the filtering step.  The frame filter cannot know how many
frames it has to iterate over, and it would have to iterate through them
all.  This ends up duplicating effort as GDB performs this iteration
when it prints the frames.

   In this example decision making can be deferred to the printing step.
As each frame is printed, the frame decorator can examine each frame in
turn when GDB iterates.  From a performance viewpoint, this is the most
appropriate decision to make as it avoids duplicating the effort that
the printing step would undertake anyway.  Also, if there are many frame
filters unwinding the stack during filtering, it can substantially delay
the printing of the backtrace which will result in large memory usage,
and a poor user experience.

     class InlineFilter():

         def __init__(self):
             self.name = "InlinedFrameFilter"
             self.priority = 100
             self.enabled = True
             gdb.frame_filters[self.name] = self

         def filter(self, frame_iter):
             frame_iter = itertools.imap(InlinedFrameDecorator,
                                         frame_iter)
             return frame_iter

   This frame filter is somewhat similar to the earlier example, except
that the 'filter' method applies a frame decorator object called
'InlinedFrameDecorator' to each element in the iterator.  The 'imap'
Python method is light-weight.  It does not proactively iterate over the
iterator, but rather creates a new iterator which wraps the existing
one.

   Below is the frame decorator for this example.

     class InlinedFrameDecorator(FrameDecorator):

         def __init__(self, fobj):
             super(InlinedFrameDecorator, self).__init__(fobj)

         def function(self):
             frame = fobj.inferior_frame()
             name = str(frame.name())

             if frame.type() == gdb.INLINE_FRAME:
                 name = name + " [inlined]"

             return name

   This frame decorator only defines and overrides the 'function'
method.  It lets the supplied 'FrameDecorator', which is shipped with
GDB, perform the other work associated with printing this frame.

   The combination of these two objects create this output from a
backtrace:

     #0  0x004004e0 in bar () at inline.c:11
     #1  0x00400566 in max [inlined] (b=6, a=12) at inline.c:21
     #2  0x00400566 in main () at inline.c:31

   So in the case of this example, a frame decorator is applied to all
frames, regardless of whether they may be inlined or not.  As GDB
iterates over the iterator produced by the frame filters, GDB executes
each frame decorator which then makes a decision on what to print in the
'function' callback.  Using a strategy like this is a way to defer
decisions on the frame content to printing time.

Eliding Frames
--------------

It might be that the above example is not desirable for representing
inlined frames, and a hierarchical approach may be preferred.  If we
want to hierarchically represent frames, the 'elided' frame decorator
interface might be preferable.

   This example approaches the issue with the 'elided' method.  This
example is quite long, but very simplistic.  It is out-of-scope for this
section to write a complete example that comprehensively covers all
approaches of finding and printing inlined frames.  However, this
example illustrates the approach an author might use.

   This example comprises of three sections.

     class InlineFrameFilter():

         def __init__(self):
             self.name = "InlinedFrameFilter"
             self.priority = 100
             self.enabled = True
             gdb.frame_filters[self.name] = self

         def filter(self, frame_iter):
             return ElidingInlineIterator(frame_iter)

   This frame filter is very similar to the other examples.  The only
difference is this frame filter is wrapping the iterator provided to it
('frame_iter') with a custom iterator called 'ElidingInlineIterator'.
This again defers actions to when GDB prints the backtrace, as the
iterator is not traversed until printing.

   The iterator for this example is as follows.  It is in this section
of the example where decisions are made on the content of the backtrace.

     class ElidingInlineIterator:
         def __init__(self, ii):
             self.input_iterator = ii

         def __iter__(self):
             return self

         def next(self):
             frame = next(self.input_iterator)

             if frame.inferior_frame().type() != gdb.INLINE_FRAME:
                 return frame

             try:
                 eliding_frame = next(self.input_iterator)
             except StopIteration:
                 return frame
             return ElidingFrameDecorator(eliding_frame, [frame])

   This iterator implements the Python iterator protocol.  When the
'next' function is called (when GDB prints each frame), the iterator
checks if this frame decorator, 'frame', is wrapping an inlined frame.
If it is not, it returns the existing frame decorator untouched.  If it
is wrapping an inlined frame, it assumes that the inlined frame was
contained within the next oldest frame, 'eliding_frame', which it
fetches.  It then creates and returns a frame decorator,
'ElidingFrameDecorator', which contains both the elided frame, and the
eliding frame.

     class ElidingInlineDecorator(FrameDecorator):

         def __init__(self, frame, elided_frames):
             super(ElidingInlineDecorator, self).__init__(frame)
             self.frame = frame
             self.elided_frames = elided_frames

         def elided(self):
             return iter(self.elided_frames)

   This frame decorator overrides one function and returns the inlined
frame in the 'elided' method.  As before it lets 'FrameDecorator' do the
rest of the work involved in printing this frame.  This produces the
following output.

     #0  0x004004e0 in bar () at inline.c:11
     #2  0x00400529 in main () at inline.c:25
         #1  0x00400529 in max (b=6, a=12) at inline.c:15

   In that output, 'max' which has been inlined into 'main' is printed
hierarchically.  Another approach would be to combine the 'function'
method, and the 'elided' method to both print a marker in the inlined
frame, and also show the hierarchical relationship.


File: gdb.info,  Node: Unwinding Frames in Python,  Next: Xmethods In Python,  Prev: Writing a Frame Filter,  Up: Python API

23.2.2.12 Unwinding Frames in Python
....................................

In GDB terminology "unwinding" is the process of finding the previous
frame (that is, caller's) from the current one.  An unwinder has three
methods.  The first one checks if it can handle given frame ("sniff"
it).  For the frames it can sniff an unwinder provides two additional
methods: it can return frame's ID, and it can fetch registers from the
previous frame.  A running GDB mantains a list of the unwinders and
calls each unwinder's sniffer in turn until it finds the one that
recognizes the current frame.  There is an API to register an unwinder.

   The unwinders that come with GDB handle standard frames.  However,
mixed language applications (for example, an application running Java
Virtual Machine) sometimes use frame layouts that cannot be handled by
the GDB unwinders.  You can write Python code that can handle such
custom frames.

   You implement a frame unwinder in Python as a class with which has
two attributes, 'name' and 'enabled', with obvious meanings, and a
single method '__call__', which examines a given frame and returns an
object (an instance of 'gdb.UnwindInfo class)' describing it.  If an
unwinder does not recognize a frame, it should return 'None'.  The code
in GDB that enables writing unwinders in Python uses this object to
return frame's ID and previous frame registers when GDB core asks for
them.

Unwinder Input
--------------

An object passed to an unwinder (a 'gdb.PendingFrame' instance) provides
a method to read frame's registers:

 -- Function: PendingFrame.read_register (reg)
     This method returns the contents of the register REGN in the frame
     as a 'gdb.Value' object.  REG can be either a register number or a
     register name; the values are platform-specific.  They are usually
     found in the corresponding 'PLATFORM-tdep.h' file in the GDB source
     tree.

   It also provides a factory method to create a 'gdb.UnwindInfo'
instance to be returned to GDB:

 -- Function: PendingFrame.create_unwind_info (frame_id)
     Returns a new 'gdb.UnwindInfo' instance identified by given
     FRAME_ID.  The argument is used to build GDB's frame ID using one
     of functions provided by GDB.  FRAME_ID's attributes determine
     which function will be used, as follows:

     'sp, pc, special'
          'frame_id_build_special (FRAME_ID.sp, FRAME_ID.pc,
          FRAME_ID.special)'

     'sp, pc'
          'frame_id_build (FRAME_ID.sp, FRAME_ID.pc)'

          This is the most common case.

     'sp'
          'frame_id_build_wild (FRAME_ID.sp)'
     The attribute values should be 'gdb.Value'

Unwinder Output: UnwindInfo
---------------------------

Use 'PendingFrame.create_unwind_info' method described above to create a
'gdb.UnwindInfo' instance.  Use the following method to specify caller
registers that have been saved in this frame:

 -- Function: gdb.UnwindInfo.add_saved_register (reg, value)
     REG identifies the register.  It can be a number or a name, just as
     for the 'PendingFrame.read_register' method above.  VALUE is a
     register value (a 'gdb.Value' object).

Unwinder Skeleton Code
----------------------

GDB comes with the module containing the base 'Unwinder' class.  Derive
your unwinder class from it and structure the code as follows:

     from gdb.unwinders import Unwinder

     class FrameId(object):
         def __init__(self, sp, pc):
             self.sp = sp
             self.pc = pc


     class MyUnwinder(Unwinder):
         def __init__(....):
             supe(MyUnwinder, self).__init___(<expects unwinder name argument>)

         def __call__(pending_frame):
             if not <we recognize frame>:
                 return None
             # Create UnwindInfo.  Usually the frame is identified by the stack
             # pointer and the program counter.
             sp = pending_frame.read_register(<SP number>)
             pc = pending_frame.read_register(<PC number>)
             unwind_info = pending_frame.create_unwind_info(FrameId(sp, pc))

             # Find the values of the registers in the caller's frame and
             # save them in the result:
             unwind_info.add_saved_register(<register>, <value>)
             ....

             # Return the result:
             return unwind_info


Registering a Unwinder
----------------------

An object file, a program space, and the GDB proper can have unwinders
registered with it.

   The 'gdb.unwinders' module provides the function to register a
unwinder:

 -- Function: gdb.unwinder.register_unwinder (locus, unwinder,
          replace=False)
     LOCUS is specifies an object file or a program space to which
     UNWINDER is added.  Passing 'None' or 'gdb' adds UNWINDER to the
     GDB's global unwinder list.  The newly added UNWINDER will be
     called before any other unwinder from the same locus.  Two
     unwinders in the same locus cannot have the same name.  An attempt
     to add a unwinder with already existing name raises an exception
     unless REPLACE is 'True', in which case the old unwinder is
     deleted.

Unwinder Precedence
-------------------

GDB first calls the unwinders from all the object files in no particular
order, then the unwinders from the current program space, and finally
the unwinders from GDB.


File: gdb.info,  Node: Xmethods In Python,  Next: Xmethod API,  Prev: Unwinding Frames in Python,  Up: Python API

23.2.2.13 Xmethods In Python
............................

"Xmethods" are additional methods or replacements for existing methods
of a C++ class.  This feature is useful for those cases where a method
defined in C++ source code could be inlined or optimized out by the
compiler, making it unavailable to GDB.  For such cases, one can define
an xmethod to serve as a replacement for the method defined in the C++
source code.  GDB will then invoke the xmethod, instead of the C++
method, to evaluate expressions.  One can also use xmethods when
debugging with core files.  Moreover, when debugging live programs,
invoking an xmethod need not involve running the inferior (which can
potentially perturb its state).  Hence, even if the C++ method is
available, it is better to use its replacement xmethod if one is
defined.

   The xmethods feature in Python is available via the concepts of an
"xmethod matcher" and an "xmethod worker".  To implement an xmethod, one
has to implement a matcher and a corresponding worker for it (more than
one worker can be implemented, each catering to a different overloaded
instance of the method).  Internally, GDB invokes the 'match' method of
a matcher to match the class type and method name.  On a match, the
'match' method returns a list of matching _worker_ objects.  Each worker
object typically corresponds to an overloaded instance of the xmethod.
They implement a 'get_arg_types' method which returns a sequence of
types corresponding to the arguments the xmethod requires.  GDB uses
this sequence of types to perform overload resolution and picks a
winning xmethod worker.  A winner is also selected from among the
methods GDB finds in the C++ source code.  Next, the winning xmethod
worker and the winning C++ method are compared to select an overall
winner.  In case of a tie between a xmethod worker and a C++ method, the
xmethod worker is selected as the winner.  That is, if a winning xmethod
worker is found to be equivalent to the winning C++ method, then the
xmethod worker is treated as a replacement for the C++ method.  GDB uses
the overall winner to invoke the method.  If the winning xmethod worker
is the overall winner, then the corresponding xmethod is invoked via the
'__call__' method of the worker object.

   If one wants to implement an xmethod as a replacement for an existing
C++ method, then they have to implement an equivalent xmethod which has
exactly the same name and takes arguments of exactly the same type as
the C++ method.  If the user wants to invoke the C++ method even though
a replacement xmethod is available for that method, then they can
disable the xmethod.

   *Note Xmethod API::, for API to implement xmethods in Python.  *Note
Writing an Xmethod::, for implementing xmethods in Python.


File: gdb.info,  Node: Xmethod API,  Next: Writing an Xmethod,  Prev: Xmethods In Python,  Up: Python API

23.2.2.14 Xmethod API
.....................

The GDB Python API provides classes, interfaces and functions to
implement, register and manipulate xmethods.  *Note Xmethods In
Python::.

   An xmethod matcher should be an instance of a class derived from
'XMethodMatcher' defined in the module 'gdb.xmethod', or an object with
similar interface and attributes.  An instance of 'XMethodMatcher' has
the following attributes:

 -- Variable: name
     The name of the matcher.

 -- Variable: enabled
     A boolean value indicating whether the matcher is enabled or
     disabled.

 -- Variable: methods
     A list of named methods managed by the matcher.  Each object in the
     list is an instance of the class 'XMethod' defined in the module
     'gdb.xmethod', or any object with the following attributes:

     'name'
          Name of the xmethod which should be unique for each xmethod
          managed by the matcher.

     'enabled'
          A boolean value indicating whether the xmethod is enabled or
          disabled.

     The class 'XMethod' is a convenience class with same attributes as
     above along with the following constructor:

      -- Function: XMethod.__init__ (self, name)
          Constructs an enabled xmethod with name NAME.

The 'XMethodMatcher' class has the following methods:

 -- Function: XMethodMatcher.__init__ (self, name)
     Constructs an enabled xmethod matcher with name NAME.  The
     'methods' attribute is initialized to 'None'.

 -- Function: XMethodMatcher.match (self, class_type, method_name)
     Derived classes should override this method.  It should return a
     xmethod worker object (or a sequence of xmethod worker objects)
     matching the CLASS_TYPE and METHOD_NAME.  CLASS_TYPE is a
     'gdb.Type' object, and METHOD_NAME is a string value.  If the
     matcher manages named methods as listed in its 'methods' attribute,
     then only those worker objects whose corresponding entries in the
     'methods' list are enabled should be returned.

   An xmethod worker should be an instance of a class derived from
'XMethodWorker' defined in the module 'gdb.xmethod', or support the
following interface:

 -- Function: XMethodWorker.get_arg_types (self)
     This method returns a sequence of 'gdb.Type' objects corresponding
     to the arguments that the xmethod takes.  It can return an empty
     sequence or 'None' if the xmethod does not take any arguments.  If
     the xmethod takes a single argument, then a single 'gdb.Type'
     object corresponding to it can be returned.

 -- Function: XMethodWorker.get_result_type (self, *args)
     This method returns a 'gdb.Type' object representing the type of
     the result of invoking this xmethod.  The ARGS argument is the same
     tuple of arguments that would be passed to the '__call__' method of
     this worker.

 -- Function: XMethodWorker.__call__ (self, *args)
     This is the method which does the _work_ of the xmethod.  The ARGS
     arguments is the tuple of arguments to the xmethod.  Each element
     in this tuple is a gdb.Value object.  The first element is always
     the 'this' pointer value.

   For GDB to lookup xmethods, the xmethod matchers should be registered
using the following function defined in the module 'gdb.xmethod':

 -- Function: register_xmethod_matcher (locus, matcher, replace=False)
     The 'matcher' is registered with 'locus', replacing an existing
     matcher with the same name as 'matcher' if 'replace' is 'True'.
     'locus' can be a 'gdb.Objfile' object (*note Objfiles In Python::),
     or a 'gdb.Progspace' object (*note Progspaces In Python::), or
     'None'.  If it is 'None', then 'matcher' is registered globally.


File: gdb.info,  Node: Writing an Xmethod,  Next: Inferiors In Python,  Prev: Xmethod API,  Up: Python API

23.2.2.15 Writing an Xmethod
............................

Implementing xmethods in Python will require implementing xmethod
matchers and xmethod workers (*note Xmethods In Python::).  Consider the
following C++ class:

     class MyClass
     {
     public:
       MyClass (int a) : a_(a) { }

       int geta (void) { return a_; }
       int operator+ (int b);

     private:
       int a_;
     };

     int
     MyClass::operator+ (int b)
     {
       return a_ + b;
     }

Let us define two xmethods for the class 'MyClass', one replacing the
method 'geta', and another adding an overloaded flavor of 'operator+'
which takes a 'MyClass' argument (the C++ code above already has an
overloaded 'operator+' which takes an 'int' argument).  The xmethod
matcher can be defined as follows:

     class MyClass_geta(gdb.xmethod.XMethod):
         def __init__(self):
             gdb.xmethod.XMethod.__init__(self, 'geta')

         def get_worker(self, method_name):
             if method_name == 'geta':
                 return MyClassWorker_geta()


     class MyClass_sum(gdb.xmethod.XMethod):
         def __init__(self):
             gdb.xmethod.XMethod.__init__(self, 'sum')

         def get_worker(self, method_name):
             if method_name == 'operator+':
                 return MyClassWorker_plus()


     class MyClassMatcher(gdb.xmethod.XMethodMatcher):
         def __init__(self):
             gdb.xmethod.XMethodMatcher.__init__(self, 'MyClassMatcher')
             # List of methods 'managed' by this matcher
             self.methods = [MyClass_geta(), MyClass_sum()]

         def match(self, class_type, method_name):
             if class_type.tag != 'MyClass':
                 return None
             workers = []
             for method in self.methods:
                 if method.enabled:
                     worker = method.get_worker(method_name)
                     if worker:
                         workers.append(worker)

             return workers

Notice that the 'match' method of 'MyClassMatcher' returns a worker
object of type 'MyClassWorker_geta' for the 'geta' method, and a worker
object of type 'MyClassWorker_plus' for the 'operator+' method.  This is
done indirectly via helper classes derived from 'gdb.xmethod.XMethod'.
One does not need to use the 'methods' attribute in a matcher as it is
optional.  However, if a matcher manages more than one xmethod, it is a
good practice to list the xmethods in the 'methods' attribute of the
matcher.  This will then facilitate enabling and disabling individual
xmethods via the 'enable/disable' commands.  Notice also that a worker
object is returned only if the corresponding entry in the 'methods'
attribute of the matcher is enabled.

   The implementation of the worker classes returned by the matcher
setup above is as follows:

     class MyClassWorker_geta(gdb.xmethod.XMethodWorker):
         def get_arg_types(self):
             return None

         def get_result_type(self, obj):
             return gdb.lookup_type('int')

         def __call__(self, obj):
             return obj['a_']


     class MyClassWorker_plus(gdb.xmethod.XMethodWorker):
         def get_arg_types(self):
             return gdb.lookup_type('MyClass')

         def get_result_type(self, obj):
             return gdb.lookup_type('int')

         def __call__(self, obj, other):
             return obj['a_'] + other['a_']

   For GDB to actually lookup a xmethod, it has to be registered with
it.  The matcher defined above is registered with GDB globally as
follows:

     gdb.xmethod.register_xmethod_matcher(None, MyClassMatcher())

   If an object 'obj' of type 'MyClass' is initialized in C++ code as
follows:

     MyClass obj(5);

then, after loading the Python script defining the xmethod matchers and
workers into 'GDBN', invoking the method 'geta' or using the operator
'+' on 'obj' will invoke the xmethods defined above:

     (gdb) p obj.geta()
     $1 = 5

     (gdb) p obj + obj
     $2 = 10

   Consider another example with a C++ template class:

     template <class T>
     class MyTemplate
     {
     public:
       MyTemplate () : dsize_(10), data_ (new T [10]) { }
       ~MyTemplate () { delete [] data_; }

       int footprint (void)
       {
         return sizeof (T) * dsize_ + sizeof (MyTemplate<T>);
       }

     private:
       int dsize_;
       T *data_;
     };

   Let us implement an xmethod for the above class which serves as a
replacement for the 'footprint' method.  The full code listing of the
xmethod workers and xmethod matchers is as follows:

     class MyTemplateWorker_footprint(gdb.xmethod.XMethodWorker):
         def __init__(self, class_type):
             self.class_type = class_type

         def get_arg_types(self):
             return None

         def get_result_type(self):
             return gdb.lookup_type('int')

         def __call__(self, obj):
             return (self.class_type.sizeof +
                     obj['dsize_'] *
                     self.class_type.template_argument(0).sizeof)


     class MyTemplateMatcher_footprint(gdb.xmethod.XMethodMatcher):
         def __init__(self):
             gdb.xmethod.XMethodMatcher.__init__(self, 'MyTemplateMatcher')

         def match(self, class_type, method_name):
             if (re.match('MyTemplate<[ \t\n]*[_a-zA-Z][ _a-zA-Z0-9]*>',
                          class_type.tag) and
                 method_name == 'footprint'):
                 return MyTemplateWorker_footprint(class_type)

   Notice that, in this example, we have not used the 'methods'
attribute of the matcher as the matcher manages only one xmethod.  The
user can enable/disable this xmethod by enabling/disabling the matcher
itself.


File: gdb.info,  Node: Inferiors In Python,  Next: Events In Python,  Prev: Writing an Xmethod,  Up: Python API

23.2.2.16 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 addressable memory units 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
     'Inferior.write_memory' function.  In 'Python' 3, the return value
     is a 'memoryview' object.

 -- 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 'Inferior.read_memory'.  If given, LENGTH determines the
     number of addressable memory units 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.17 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.

'events.clear_objfiles'
     Emits 'gdb.ClearObjFilesEvent' which indicates that the list of
     object files for a program space has been reset.
     'gdb.ClearObjFilesEvent' has one attribute:

      -- Variable: ClearObjFilesEvent.progspace
          A reference to the program space ('gdb.Progspace') whose
          objfile list has been cleared.  *Note Progspaces In Python::.

'events.inferior_call_pre'
     Emits 'gdb.InferiorCallPreEvent' which indicates that a function in
     the inferior is about to be called.

      -- Variable: InferiorCallPreEvent.ptid
          The thread in which the call will be run.

      -- Variable: InferiorCallPreEvent.address
          The location of the function to be called.

'events.inferior_call_post'
     Emits 'gdb.InferiorCallPostEvent' which indicates that a function
     in the inferior has returned.

      -- Variable: InferiorCallPostEvent.ptid
          The thread in which the call was run.

      -- Variable: InferiorCallPostEvent.address
          The location of the function that was called.

'events.memory_changed'
     Emits 'gdb.MemoryChangedEvent' which indicates that the memory of
     the inferior has been modified by the GDB user, for instance via a
     command like 'set *addr = value'.  The event has the following
     attributes:

      -- Variable: MemoryChangedEvent.address
          The start address of the changed region.

      -- Variable: MemoryChangedEvent.length
          Length in bytes of the changed region.

'events.register_changed'
     Emits 'gdb.RegisterChangedEvent' which indicates that a register in
     the inferior has been modified by the GDB user.

      -- Variable: RegisterChangedEvent.frame
          A gdb.Frame object representing the frame in which the
          register was modified.
      -- Variable: RegisterChangedEvent.regnum
          Denotes which register was modified.


File: gdb.info,  Node: Threads In Python,  Next: Commands In Python,  Prev: Events In Python,  Up: Python API

23.2.2.18 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.19 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, while 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_USER'
     The command is a general purpose command for the user, and
     typically does not fit in one of the other categories.  Type 'help
     user-defined' at the GDB prompt to see a list of commands in this
     category, as well as the list of gdb macros (*note Sequences::).

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

'gdb.COMPLETE_EXPRESSION'
     This constant means that completion should be done on expressions.
     Often this means completing on symbol names, but some language
     parsers also have support for completing on field names.

   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_USER)

       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.20 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.21 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.

   Now you can use the function in an expression:

     (gdb) print $greet("Bob")
     $1 = "Hello, Bob!"


File: gdb.info,  Node: Progspaces In Python,  Next: Objfiles In Python,  Prev: Functions In Python,  Up: Python API

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

 -- Variable: Progspace.type_printers
     The 'type_printers' attribute is a list of type printer objects.
     *Note Type Printing API::, for more information.

 -- Variable: Progspace.frame_filters
     The 'frame_filters' attribute is a dictionary of frame filter
     objects.  *Note Frame Filter API::, for more information.

   One may add arbitrary attributes to 'gdb.Progspace' objects in the
usual Python way.  This is useful if, for example, one needs to do some
extra record keeping associated with the program space.

   In this contrived example, we want to perform some processing when an
objfile with a certain symbol is loaded, but we only want to do this
once because it is expensive.  To achieve this we record the results
with the program space because we can't predict when the desired objfile
will be loaded.

     (gdb) python
     def clear_objfiles_handler(event):
         event.progspace.expensive_computation = None
     def expensive(symbol):
         """A mock routine to perform an "expensive" computation on symbol."""
         print "Computing the answer to the ultimate question ..."
         return 42
     def new_objfile_handler(event):
         objfile = event.new_objfile
         progspace = objfile.progspace
         if not hasattr(progspace, 'expensive_computation') or \
                 progspace.expensive_computation is None:
             # We use 'main' for the symbol to keep the example simple.
             # Note: There's no current way to constrain the lookup
             # to one objfile.
             symbol = gdb.lookup_global_symbol('main')
             if symbol is not None:
                 progspace.expensive_computation = expensive(symbol)
     gdb.events.clear_objfiles.connect(clear_objfiles_handler)
     gdb.events.new_objfile.connect(new_objfile_handler)
     end
     (gdb) file /tmp/hello
     Reading symbols from /tmp/hello...done.
     Computing the answer to the ultimate question ...
     (gdb) python print gdb.current_progspace().expensive_computation
     42
     (gdb) run
     Starting program: /tmp/hello
     Hello.
     [Inferior 1 (process 4242) exited normally]


File: gdb.info,  Node: Objfiles In Python,  Next: Frames In Python,  Prev: Progspaces In Python,  Up: Python API

23.2.2.23 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 Python 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::.

 -- Function: gdb.lookup_objfile (name [, by_build_id])
     Look up NAME, a file name or build ID, in the list of objfiles for
     the current program space (*note Progspaces In Python::).  If the
     objfile is not found throw the Python 'ValueError' exception.

     If NAME is a relative file name, then it will match any source file
     name with the same trailing components.  For example, if NAME is
     'gcc/expr.c', then it will match source file name of
     '/build/trunk/gcc/expr.c', but not '/build/trunk/libcpp/expr.c' or
     '/build/trunk/gcc/x-expr.c'.

     If BY_BUILD_ID is provided and is 'True' then NAME is the build ID
     of the objfile.  Otherwise, NAME is a file name.  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.

   Each objfile is represented by an instance of the 'gdb.Objfile'
class.

 -- Variable: Objfile.filename
     The file name of the objfile as a string, with symbolic links
     resolved.

     The value is 'None' if the objfile is no longer valid.  See the
     'gdb.Objfile.is_valid' method, described below.

 -- Variable: Objfile.username
     The file name of the objfile as specified by the user as a string.

     The value is 'None' if the objfile is no longer valid.  See the
     'gdb.Objfile.is_valid' method, described below.

 -- Variable: Objfile.owner
     For separate debug info objfiles this is the corresponding
     'gdb.Objfile' object that debug info is being provided for.
     Otherwise this is 'None'.  Separate debug info objfiles are added
     with the 'gdb.Objfile.add_separate_debug_file' method, described
     below.

 -- Variable: Objfile.build_id
     The build ID of the objfile as a string.  If the objfile does not
     have a build ID then the value is 'None'.

     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.

 -- Variable: Objfile.progspace
     The containing program space of the objfile as a 'gdb.Progspace'
     object.  *Note Progspaces In Python::.

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

 -- Variable: Objfile.type_printers
     The 'type_printers' attribute is a list of type printer objects.
     *Note Type Printing API::, for more information.

 -- Variable: Objfile.frame_filters
     The 'frame_filters' attribute is a dictionary of frame filter
     objects.  *Note Frame Filter API::, for more information.

   One may add arbitrary attributes to 'gdb.Objfile' objects in the
usual Python way.  This is useful if, for example, one needs to do some
extra record keeping associated with the objfile.

   In this contrived example we record the time when GDB loaded the
objfile.

     (gdb) python
     import datetime
     def new_objfile_handler(event):
         # Set the time_loaded attribute of the new objfile.
         event.new_objfile.time_loaded = datetime.datetime.today()
     gdb.events.new_objfile.connect(new_objfile_handler)
     end
     (gdb) file ./hello
     Reading symbols from ./hello...done.
     (gdb) python print gdb.objfiles()[0].time_loaded
     2014-10-09 11:41:36.770345

   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.

 -- Function: Objfile.add_separate_debug_file (file)
     Add FILE to the list of files that GDB will search for debug
     information for the objfile.  This is useful when the debug info
     has been removed from the program and stored in a separate file.
     GDB has built-in support for finding separate debug info files
     (*note Separate Debug Files::), but if the file doesn't live in one
     of the standard places that GDB searches then this function can be
     used to add a debug info file from a different place.


File: gdb.info,  Node: Frames In Python,  Next: Blocks In Python,  Prev: Objfiles In Python,  Up: Python API

23.2.2.24 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.architecture ()
     Returns the 'gdb.Architecture' object corresponding to the frame's
     architecture.  *Note Architectures In Python::.

 -- 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.  This
          is no longer used by GDB, and is kept only for backward
          compatibility.

     '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_MEMORY_ERROR'
          The frame unwinder caused an error while trying to access
          memory.

     '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_register (register)
     Return the value of REGISTER in this frame.  The REGISTER argument
     must be a string (e.g., ''sp'' or ''rax'').  Returns a 'Gdb.Value'
     object.  Throws an exception if REGISTER does not exist.

 -- 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).  The VARIABLE
     argument 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.25 Accessing blocks from Python.
.......................................

In GDB, symbols are stored in blocks.  A block corresponds roughly to a
scope in the source code.  Blocks are organized hierarchically, and are
represented individually in Python as a 'gdb.Block'.  Blocks rely on
debugging information being available.

   A frame has a block.  Please see *note Frames In Python::, for a more
in-depth discussion of frames.

   The outermost block is known as the "global block".  The global block
typically holds public global variables and functions.

   The block nested just inside the global block is the "static block".
The static block typically holds file-scoped variables and functions.

   GDB provides a method to get a block's superblock, but there is
currently no way to examine the sub-blocks of a block, or to iterate
over all the blocks in a symbol table (*note Symbol Tables In Python::).

   Here is a short example that should help explain blocks:

     /* This is in the global block.  */
     int global;

     /* This is in the static block.  */
     static int file_scope;

     /* 'function' is in the global block, and 'argument' is
        in a block nested inside of 'function'.  */
     int function (int argument)
     {
       /* 'local' is in a block inside 'function'.  It may or may
          not be in the same block as 'argument'.  */
       int local;

       {
          /* 'inner' is in a block whose superblock is the one holding
             'local'.  */
          int inner;

          /* If this call is expanded by the compiler, you may see
             a nested block here whose function is 'inline_function'
             and whose superblock is the one holding 'inner'.  */
          inline_function ();
       }
     }

   A 'gdb.Block' is iterable.  The iterator returns the symbols (*note
Symbols In Python::) local to the block.  Python programs should not
assume that a specific block object will always contain a given symbol,
since changes in GDB features and infrastructure may cause symbols move
across blocks in a symbol table.

   The following block-related functions are available in the 'gdb'
module:

 -- Function: gdb.block_for_pc (pc)
     Return the innermost '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.  The block's validity is also checked during iteration over
     symbols of the block.

   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.

     For ordinary function blocks, the superblock is the static block.
     However, you should note that it is possible for a function block
     to have a superblock that is not the static block - for instance
     this happens for an inlined function.

 -- 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.26 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.line
     The line number in the source code at which the symbol was defined.
     This is an integer.

 -- 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.needs_frame
     This is 'True' if evaluating this symbol's value requires a frame
     (*note Frames In Python::) and 'False' otherwise.  Typically, local
     variables will require a frame, but other symbols will not.

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

 -- Function: Symbol.value ([frame])
     Compute the value of the symbol, as a 'gdb.Value'.  For functions,
     this computes the address of the function, cast to the appropriate
     type.  If the symbol requires a frame in order to compute its
     value, then FRAME must be given.  If FRAME is not given, or if
     FRAME is invalid, then this method will throw an exception.

   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: Line Tables In Python,  Prev: Symbols In Python,  Up: Python API

23.2.2.27 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 start of the address range occupied by code for the
     current source line.  This attribute is not writable.

 -- Variable: Symtab_and_line.last
     Indicates the end of the address range occupied by code for the
     current source line.  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.

 -- Variable: Symtab.producer
     The name and possibly version number of the program that compiled
     the code in the symbol table.  The contents of this string is up to
     the compiler.  If no producer information is available then 'None'
     is returned.  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.

 -- Function: Symtab.global_block ()
     Return the global block of the underlying symbol table.  *Note
     Blocks In Python::.

 -- Function: Symtab.static_block ()
     Return the static block of the underlying symbol table.  *Note
     Blocks In Python::.

 -- Function: Symtab.linetable ()
     Return the line table associated with the symbol table.  *Note Line
     Tables In Python::.


File: gdb.info,  Node: Line Tables In Python,  Next: Breakpoints In Python,  Prev: Symbol Tables In Python,  Up: Python API

23.2.2.28 Manipulating line tables using Python
...............................................

Python code can request and inspect line table information from a symbol
table that is loaded in GDB.  A line table is a mapping of source lines
to their executable locations in memory.  To acquire the line table
information for a particular symbol table, use the 'linetable' function
(*note Symbol Tables In Python::).

   A 'gdb.LineTable' is iterable.  The iterator returns 'LineTableEntry'
objects that correspond to the source line and address for each line
table entry.  'LineTableEntry' objects have the following attributes:

 -- Variable: LineTableEntry.line
     The source line number for this line table entry.  This number
     corresponds to the actual line of source.  This attribute is not
     writable.

 -- Variable: LineTableEntry.pc
     The address that is associated with the line table entry where the
     executable code for that source line resides in memory.  This
     attribute is not writable.

   As there can be multiple addresses for a single source line, you may
receive multiple 'LineTableEntry' objects with matching 'line'
attributes, but with different 'pc' attributes.  The iterator is sorted
in ascending 'pc' order.  Here is a small example illustrating iterating
over a line table.

     symtab = gdb.selected_frame().find_sal().symtab
     linetable = symtab.linetable()
     for line in linetable:
        print "Line: "+str(line.line)+" Address: "+hex(line.pc)

   This will have the following output:

     Line: 33 Address: 0x4005c8L
     Line: 37 Address: 0x4005caL
     Line: 39 Address: 0x4005d2L
     Line: 40 Address: 0x4005f8L
     Line: 42 Address: 0x4005ffL
     Line: 44 Address: 0x400608L
     Line: 42 Address: 0x40060cL
     Line: 45 Address: 0x400615L

   In addition to being able to iterate over a 'LineTable', it also has
the following direct access methods:

 -- Function: LineTable.line (line)
     Return a Python 'Tuple' of 'LineTableEntry' objects for any entries
     in the line table for the given LINE, which specifies the source
     code line.  If there are no entries for that source code LINE, the
     Python 'None' is returned.

 -- Function: LineTable.has_line (line)
     Return a Python 'Boolean' indicating whether there is an entry in
     the line table for this source line.  Return 'True' if an entry is
     found, or 'False' if not.

 -- Function: LineTable.source_lines ()
     Return a Python 'List' of the source line numbers in the symbol
     table.  Only lines with executable code locations are returned.
     The contents of the 'List' will just be the source line entries
     represented as Python 'Long' values.


File: gdb.info,  Node: Breakpoints In Python,  Next: Finish Breakpoints in Python,  Prev: Line Tables In Python,  Up: Python API

23.2.2.29 Manipulating breakpoints using Python
...............................................

Python code can manipulate breakpoints via the 'gdb.Breakpoint' class.

 -- Function: Breakpoint.__init__ (spec [, type [, wp_class [,internal
          [,temporary]]]])
     Create a new breakpoint according to SPEC, which 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'; it 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 TEMPORARY argument makes
     the breakpoint a temporary breakpoint.  Temporary breakpoints are
     deleted after they have been hit.  Any further access to the Python
     breakpoint after it has been hit will result in a runtime error (as
     that breakpoint has now been automatically deleted).  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 in 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.  You can use it to enable
     or disable the breakpoint.

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

 -- Variable: Breakpoint.temporary
     This attribute indicates whether the breakpoint was created as a
     temporary breakpoint.  Temporary breakpoints are automatically
     deleted after that breakpoint has been hit.  Access to this
     attribute, and all other attributes and functions other than the
     'is_valid' function, will result in an error after the breakpoint
     has been hit (as it has been automatically deleted).  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,  Next: Lazy Strings In Python,  Prev: Breakpoints In Python,  Up: Python API

23.2.2.30 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: Architectures In Python,  Prev: Finish Breakpoints in Python,  Up: Python API

23.2.2.31 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: Architectures In Python,  Prev: Lazy Strings In Python,  Up: Python API

23.2.2.32 Python representation of architectures
................................................

GDB uses architecture specific parameters and artifacts in a number of
its various computations.  An architecture is represented by an instance
of the 'gdb.Architecture' class.

   A 'gdb.Architecture' class has the following methods:

 -- Function: Architecture.name ()
     Return the name (string value) of the architecture.

 -- Function: Architecture.disassemble (START_PC [, END_PC [, COUNT]])
     Return a list of disassembled instructions starting from the memory
     address START_PC.  The optional arguments END_PC and COUNT
     determine the number of instructions in the returned list.  If both
     the optional arguments END_PC and COUNT are specified, then a list
     of at most COUNT disassembled instructions whose start address
     falls in the closed memory address interval from START_PC to END_PC
     are returned.  If END_PC is not specified, but COUNT is specified,
     then COUNT number of instructions starting from the address
     START_PC are returned.  If COUNT is not specified but END_PC is
     specified, then all instructions whose start address falls in the
     closed memory address interval from START_PC to END_PC are
     returned.  If neither END_PC nor COUNT are specified, then a single
     instruction at START_PC is returned.  For all of these cases, each
     element of the returned list is a Python 'dict' with the following
     string keys:

     'addr'
          The value corresponding to this key is a Python long integer
          capturing the memory address of the instruction.

     'asm'
          The value corresponding to this key is a string value which
          represents the instruction with assembly language mnemonics.
          The assembly language flavor used is the same as that
          specified by the current CLI variable 'disassembly-flavor'.
          *Note Machine Code::.

     'length'
          The value corresponding to this key is the length (integer
          value) of the instruction in bytes.


File: gdb.info,  Node: Python Auto-loading,  Next: Python modules,  Prev: Python API,  Up: Python

23.2.3 Python 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.  *Note Auto-loading extensions::.

   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 python-scripts [on|off]'
     Enable or disable the auto-loading of Python scripts.

'show auto-load python-scripts'
     Show whether auto-loading of Python scripts is enabled or disabled.

'info auto-load python-scripts [REGEXP]'
     Print the list of all Python scripts that GDB auto-loaded.

     Also printed is the list of Python scripts that were mentioned in
     the '.debug_gdb_scripts' section and were either not found (*note
     dotdebug_gdb_scripts section::) or were not auto-loaded due to
     'auto-load safe-path' rejection (*note Auto-loading::).  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 Python scripts with matching names are
     printed.

     Example:

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

   When reading an auto-loaded file or script, 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 and frame-filters.


File: gdb.info,  Node: Python modules,  Prev: Python 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.

'FlagEnumerationPrinter (NAME)'
     A pretty-printer which handles printing of 'enum' values.  Unlike
     GDB's built-in 'enum' printing, this printer attempts to work
     properly when there is some overlap between the enumeration
     constants.  The argument NAME is the name of the printer and also
     the name of the 'enum' type to look up.

'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.Type' 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']}

'get_type_recognizers ()'
     Return a list of the enabled type recognizers for the current
     context.  This is called by GDB during the type-printing process
     (*note Type Printing API::).

'apply_type_recognizers (recognizers, type_obj)'
     Apply the type recognizers, RECOGNIZERS, to the type object
     TYPE_OBJ.  If any recognizer returns a string, return that string.
     Otherwise, return 'None'.  This is called by GDB during the
     type-printing process (*note Type Printing API::).

'register_type_printer (locus, printer)'
     This is a convenience function to register a type printer PRINTER.
     The printer must implement the type printer protocol.  The LOCUS
     argument is either a 'gdb.Objfile', in which case the printer is
     registered with that objfile; a 'gdb.Progspace', in which case the
     printer is registered with that progspace; or 'None', in which case
     the printer is registered globally.

'TypePrinter'
     This is a base class that implements the type printer protocol.
     Type printers are encouraged, but not required, to derive from this
     class.  It defines a constructor:

      -- Method on TypePrinter: __init__ (self, name)
          Initialize the type printer with the given name.  The new
          printer starts in the enabled state.


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: Guile,  Next: Auto-loading extensions,  Prev: Python,  Up: Extending GDB

23.3 Extending GDB using Guile
==============================

You can extend GDB using the Guile implementation of the Scheme
programming language (http://www.gnu.org/software/guile/).  This feature
is available only if GDB was configured using '--with-guile'.

* Menu:

* Guile Introduction::     Introduction to Guile scripting in GDB
* Guile Commands::         Accessing Guile from GDB
* Guile API::              Accessing GDB from Guile
* Guile Auto-loading::     Automatically loading Guile code
* Guile Modules::          Guile modules provided by GDB


File: gdb.info,  Node: Guile Introduction,  Next: Guile Commands,  Up: Guile

23.3.1 Guile Introduction
-------------------------

Guile is an implementation of the Scheme programming language and is the
GNU project's official extension language.

   Guile support in GDB follows the Python support in GDB reasonably
closely, so concepts there should carry over.  However, some things are
done differently where it makes sense.

   GDB requires Guile version 2.0 or greater.  Older versions are not
supported.

   Guile scripts used by GDB should be installed in
'DATA-DIRECTORY/guile', where DATA-DIRECTORY is the data directory as
determined at GDB startup (*note Data Files::).  This directory, known
as the "guile directory", is automatically added to the Guile Search
Path in order to allow the Guile interpreter to locate all scripts
installed at this location.


File: gdb.info,  Node: Guile Commands,  Next: Guile API,  Prev: Guile Introduction,  Up: Guile

23.3.2 Guile Commands
---------------------

GDB provides two commands for accessing the Guile interpreter:

'guile-repl'
'gr'
     The 'guile-repl' command can be used to start an interactive Guile
     prompt or "repl".  To return to GDB, type ',q' or the 'EOF'
     character (e.g., 'Ctrl-D' on an empty prompt).  These commands do
     not take any arguments.

'guile [SCHEME-EXPRESSION]'
'gu [SCHEME-EXPRESSION]'
     The 'guile' command can be used to evaluate a Scheme expression.

     If given an argument, GDB will pass the argument to the Guile
     interpreter for evaluation.

          (gdb) guile (display (+ 20 3)) (newline)
          23

     The result of the Scheme expression is displayed using normal Guile
     rules.

          (gdb) guile (+ 20 3)
          23

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

          (gdb) guile
          >(display 23)
          >(newline)
          >end
          23

   It is also possible to execute a Guile script from the GDB
interpreter:

'source script-name'
     The script name must end with '.scm' and GDB must be configured to
     recognize the script language based on filename extension using the
     'script-extension' setting.  *Note Extending GDB: Extending GDB.

'guile (load "script-name")'
     This method uses the 'load' Guile function.  It takes a string
     argument that is the name of the script to load.  See the Guile
     documentation for a description of this function.  (*note
     (guile)Loading::).


File: gdb.info,  Node: Guile API,  Next: Guile Auto-loading,  Prev: Guile Commands,  Up: Guile

23.3.3 Guile API
----------------

You can get quick online help for GDB's Guile API by issuing the command
'help guile', or by issuing the command ',help' from an interactive
Guile session.  Furthermore, most Guile procedures provided by GDB have
doc strings which can be obtained with ',describe PROCEDURE-NAME' or ',d
PROCEDURE-NAME' from the Guile interactive prompt.

* Menu:

* Basic Guile::              Basic Guile Functions
* Guile Configuration::      Guile configuration variables
* GDB Scheme Data Types::    Scheme representations of GDB objects
* Guile Exception Handling:: How Guile exceptions are translated
* Values From Inferior In Guile:: Guile representation of values
* Arithmetic In Guile::      Arithmetic in Guile
* Types In Guile::           Guile representation of types
* Guile Pretty Printing API:: Pretty-printing values with Guile
* Selecting Guile Pretty-Printers:: How GDB chooses a pretty-printer
* Writing a Guile Pretty-Printer:: Writing a pretty-printer
* Commands In Guile::        Implementing new commands in Guile
* Parameters In Guile::      Adding new GDB parameters
* Progspaces In Guile::      Program spaces
* Objfiles In Guile::        Object files in Guile
* Frames In Guile::          Accessing inferior stack frames from Guile
* Blocks In Guile::          Accessing blocks from Guile
* Symbols In Guile::         Guile representation of symbols
* Symbol Tables In Guile::   Guile representation of symbol tables
* Breakpoints In Guile::     Manipulating breakpoints using Guile
* Lazy Strings In Guile::    Guile representation of lazy strings
* Architectures In Guile::   Guile representation of architectures
* Disassembly In Guile::     Disassembling instructions from Guile
* I/O Ports in Guile::       GDB I/O ports
* Memory Ports in Guile::    Accessing memory through ports and bytevectors
* Iterators In Guile::       Basic iterator support


File: gdb.info,  Node: Basic Guile,  Next: Guile Configuration,  Up: Guile API

23.3.3.1 Basic Guile
....................

At startup, GDB overrides Guile's 'current-output-port' and
'current-error-port' to print using GDB's output-paging streams.  A
Guile program which outputs to one of these streams may have its output
interrupted by the user (*note Screen Size::).  In this situation, a
Guile 'signal' exception is thrown with value 'SIGINT'.

   Guile's history mechanism uses the same naming as GDB's, namely the
user of dollar-variables (e.g., $1, $2, etc.).  The results of
evaluations in Guile and in GDB are counted separately, '$1' in Guile is
not the same value as '$1' in GDB.

   GDB is not thread-safe.  If your Guile program uses multiple threads,
you must be careful to only call GDB-specific functions in the GDB
thread.

   Some care must be taken when writing Guile code to run in GDB.  Two
things are worth noting in particular:

   * GDB installs handlers for 'SIGCHLD' and 'SIGINT'.  Guile code must
     not override these, or even change the options using 'sigaction'.
     If your program changes the handling of these signals, GDB will
     most likely stop working correctly.  Note that it is unfortunately
     common for GUI toolkits to install a 'SIGCHLD' handler.

   * GDB takes care to mark its internal file descriptors as
     close-on-exec.  However, this cannot be done in a thread-safe way
     on all platforms.  Your Guile programs should be aware of this and
     should both create new file descriptors with the close-on-exec flag
     set and arrange to close unneeded file descriptors before starting
     a child process.

   GDB introduces a new Guile module, named 'gdb'.  All methods and
classes added by GDB are placed in this module.  GDB does not
automatically 'import' the 'gdb' module, scripts must do this
themselves.  There are various options for how to import a module, so
GDB leaves the choice of how the 'gdb' module is imported to the user.
To simplify interactive use, it is recommended to add one of the
following to your ~/.gdbinit.

     guile (use-modules (gdb))

     guile (use-modules ((gdb) #:renamer (symbol-prefix-proc 'gdb:)))

   Which one to choose depends on your preference.  The second one adds
'gdb:' as a prefix to all module functions and variables.

   The rest of this manual assumes the 'gdb' module has been imported
without any prefix.  See the Guile documentation for 'use-modules' for
more information (*note (guile)Using Guile Modules::).

   Example:

     (gdb) guile (value-type (make-value 1))
     ERROR: Unbound variable: value-type
     Error while executing Scheme code.
     (gdb) guile (use-modules (gdb))
     (gdb) guile (value-type (make-value 1))
     int
     (gdb)

   The '(gdb)' module provides these basic Guile functions.

 -- Scheme Procedure: execute command [#:from-tty boolean] [#:to-string
          boolean]
     Evaluate COMMAND, a string, as a GDB CLI command.  If a GDB
     exception happens while COMMAND runs, it is translated as described
     in *note Guile Exception Handling: Guile 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 '#f'.

     By default, any output produced by COMMAND is sent to GDB's
     standard output (and to the log output if logging is turned on).
     If the TO-STRING parameter is '#t', then output will be collected
     by 'execute' and returned as a string.  The default is '#f', in
     which case the return value is unspecified.  If TO-STRING is '#t',
     the GDB virtual terminal will be temporarily set to unlimited width
     and height, and its pagination will be disabled; *note Screen
     Size::.

 -- Scheme Procedure: history-ref number
     Return a value from GDB's value history (*note Value History::).
     The NUMBER argument 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 In Guile::).

     _Note:_ GDB's value history is independent of Guile's.  '$1' in
     GDB's value history contains the result of evaluating an expression
     from GDB's command line and '$1' from Guile's history contains the
     result of evaluating an expression from Guile's command line.

 -- Scheme Procedure: history-append! value
     Append VALUE, an instance of '<gdb:value>', to GDB's value history.
     Return its index in the history.

     Putting into history values returned by Guile extensions will allow
     the user convenient access to those values via CLI history
     facilities.

 -- Scheme Procedure: parse-and-eval expression
     Parse EXPRESSION as an expression in the current language, evaluate
     it, and return the result as a '<gdb:value>'.  The EXPRESSION must
     be a string.

     This function can be useful when implementing a new command (*note
     Commands In Guile::), as it provides a way to parse the command's
     arguments as an expression.  It is also is useful when computing
     values.  For example, it is the only way to get the value of a
     convenience variable (*note Convenience Vars::) as a '<gdb:value>'.


File: gdb.info,  Node: Guile Configuration,  Next: GDB Scheme Data Types,  Prev: Basic Guile,  Up: Guile API

23.3.3.2 Guile Configuration
............................

GDB provides these Scheme functions to access various configuration
parameters.

 -- Scheme Procedure: data-directory
     Return a string containing GDB's data directory.  This directory
     contains GDB's ancillary files.

 -- Scheme Procedure: guile-data-directory
     Return a string containing GDB's Guile data directory.  This
     directory contains the Guile modules provided by GDB.

 -- Scheme Procedure: gdb-version
     Return a string containing the GDB version.

 -- Scheme Procedure: host-config
     Return a string containing the host configuration.  This is the
     string passed to '--host' when GDB was configured.

 -- Scheme Procedure: target-config
     Return a string containing the target configuration.  This is the
     string passed to '--target' when GDB was configured.


File: gdb.info,  Node: GDB Scheme Data Types,  Next: Guile Exception Handling,  Prev: Guile Configuration,  Up: Guile API

23.3.3.3 GDB Scheme Data Types
..............................

The values exposed by GDB to Guile are known as "GDB objects".  There
are several kinds of GDB object, and each is disjoint from all other
types known to Guile.

 -- Scheme Procedure: gdb-object-kind object
     Return the kind of the GDB object, e.g., '<gdb:breakpoint>', as a
     symbol.

   GDB defines the following object types:

'<gdb:arch>'
     *Note Architectures In Guile::.

'<gdb:block>'
     *Note Blocks In Guile::.

'<gdb:block-symbols-iterator>'
     *Note Blocks In Guile::.

'<gdb:breakpoint>'
     *Note Breakpoints In Guile::.

'<gdb:command>'
     *Note Commands In Guile::.

'<gdb:exception>'
     *Note Guile Exception Handling::.

'<gdb:frame>'
     *Note Frames In Guile::.

'<gdb:iterator>'
     *Note Iterators In Guile::.

'<gdb:lazy-string>'
     *Note Lazy Strings In Guile::.

'<gdb:objfile>'
     *Note Objfiles In Guile::.

'<gdb:parameter>'
     *Note Parameters In Guile::.

'<gdb:pretty-printer>'
     *Note Guile Pretty Printing API::.

'<gdb:pretty-printer-worker>'
     *Note Guile Pretty Printing API::.

'<gdb:progspace>'
     *Note Progspaces In Guile::.

'<gdb:symbol>'
     *Note Symbols In Guile::.

'<gdb:symtab>'
     *Note Symbol Tables In Guile::.

'<gdb:sal>'
     *Note Symbol Tables In Guile::.

'<gdb:type>'
     *Note Types In Guile::.

'<gdb:field>'
     *Note Types In Guile::.

'<gdb:value>'
     *Note Values From Inferior In Guile::.

   The following GDB objects are managed internally so that the Scheme
function 'eq?' may be applied to them.

'<gdb:arch>'
'<gdb:block>'
'<gdb:breakpoint>'
'<gdb:frame>'
'<gdb:objfile>'
'<gdb:progspace>'
'<gdb:symbol>'
'<gdb:symtab>'
'<gdb:type>'


File: gdb.info,  Node: Guile Exception Handling,  Next: Values From Inferior In Guile,  Prev: GDB Scheme Data Types,  Up: Guile API

23.3.3.4 Guile Exception Handling
.................................

When executing the 'guile' command, Guile exceptions uncaught within the
Guile code are translated to calls to the GDB error-reporting mechanism.
If the command that called 'guile' does not handle the error, GDB will
terminate it and report the error according to the setting of the 'guile
print-stack' parameter.

   The 'guile print-stack' parameter has three settings:

'none'
     Nothing is printed.

'message'
     An error message is printed containing the Guile exception name,
     the associated value, and the Guile call stack backtrace at the
     point where the exception was raised.  Example:

          (gdb) guile (display foo)
          ERROR: In procedure memoize-variable-access!:
          ERROR: Unbound variable: foo
          Error while executing Scheme code.

'full'
     In addition to an error message a full backtrace is printed.

          (gdb) set guile print-stack full
          (gdb) guile (display foo)
          Guile Backtrace:
          In ice-9/boot-9.scm:
           157: 10 [catch #t #<catch-closure 2c76e20> ...]
          In unknown file:
             ?: 9 [apply-smob/1 #<catch-closure 2c76e20>]
          In ice-9/boot-9.scm:
           157: 8 [catch #t #<catch-closure 2c76d20> ...]
          In unknown file:
             ?: 7 [apply-smob/1 #<catch-closure 2c76d20>]
             ?: 6 [call-with-input-string "(display foo)" ...]
          In ice-9/boot-9.scm:
          2320: 5 [save-module-excursion #<procedure 2c2dc30 ... ()>]
          In ice-9/eval-string.scm:
            44: 4 [read-and-eval #<input: string 27cb410> #:lang ...]
            37: 3 [lp (display foo)]
          In ice-9/eval.scm:
           387: 2 [eval # ()]
           393: 1 [eval #<memoized foo> ()]
          In unknown file:
             ?: 0 [memoize-variable-access! #<memoized foo> ...]

          ERROR: In procedure memoize-variable-access!:
          ERROR: Unbound variable: foo
          Error while executing Scheme code.

   GDB errors that happen in GDB commands invoked by Guile code are
converted to Guile exceptions.  The type of the Guile exception depends
on the error.

   Guile procedures provided by GDB can throw the standard Guile
exceptions like 'wrong-type-arg' and 'out-of-range'.

   User interrupt (via 'C-c' or by typing 'q' at a pagination prompt) is
translated to a Guile 'signal' exception with value 'SIGINT'.

   GDB Guile procedures can also throw these exceptions:

'gdb:error'
     This exception is a catch-all for errors generated from within GDB.

'gdb:invalid-object'
     This exception is thrown when accessing Guile objects that wrap
     underlying GDB objects have become invalid.  For example, a
     '<gdb:breakpoint>' object becomes invalid if the user deletes it
     from the command line.  The object still exists in Guile, but the
     object it represents is gone.  Further operations on this
     breakpoint will throw this exception.

'gdb:memory-error'
     This exception is thrown when an operation tried to access invalid
     memory in the inferior.

'gdb:pp-type-error'
     This exception is thrown when a Guile pretty-printer passes a bad
     object to GDB.

   The following exception-related procedures are provided by the
'(gdb)' module.

 -- Scheme Procedure: make-exception key args
     Return a '<gdb:exception>' object given by its KEY and ARGS, which
     are the standard Guile parameters of an exception.  See the Guile
     documentation for more information (*note (guile)Exceptions::).

 -- Scheme Procedure: exception? object
     Return '#t' if OBJECT is a '<gdb:exception>' object.  Otherwise
     return '#f'.

 -- Scheme Procedure: exception-key exception
     Return the ARGS field of a '<gdb:exception>' object.

 -- Scheme Procedure: exception-args exception
     Return the ARGS field of a '<gdb:exception>' object.


File: gdb.info,  Node: Values From Inferior In Guile,  Next: Arithmetic In Guile,  Prev: Guile Exception Handling,  Up: Guile API

23.3.3.5 Values From Inferior In Guile
......................................

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.

   GDB does not memoize '<gdb:value>' objects.  'make-value' always
returns a fresh object.

     (gdb) guile (eq? (make-value 1) (make-value 1))
     $1 = #f
     (gdb) guile (equal? (make-value 1) (make-value 1))
     $1 = #t

   A '<gdb:value>' that represents a function can be executed via
inferior function call with 'value-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:

     (define result (value-call some-val 10 20))

   Any values returned from a function call are '<gdb:value>' objects.

   Note: Unlike Python scripting in GDB, inferior values that are simple
scalars cannot be used directly in Scheme expressions that are valid for
the value's data type.  For example, '(+ (parse-and-eval "int_variable")
2)' does not work.  And inferior values that are structures or instances
of some class cannot be accessed using any special syntax, instead
'value-field' must be used.

   The following value-related procedures are provided by the '(gdb)'
module.

 -- Scheme Procedure: value? object
     Return '#t' if OBJECT is a '<gdb:value>' object.  Otherwise return
     '#f'.

 -- Scheme Procedure: make-value value [#:type type]
     Many Scheme values can be converted directly to a '<gdb:value>'
     with this procedure.  If TYPE is specified, the result is a value
     of this type, and if VALUE can't be represented with this type an
     exception is thrown.  Otherwise the type of the result is
     determined from VALUE as described below.

     *Note Architectures In Guile::, for a list of the builtin types for
     an architecture.

     Here's how Scheme values are converted when TYPE argument to
     'make-value' is not specified:

     Scheme boolean
          A Scheme boolean is converted the boolean type for the current
          language.

     Scheme integer
          A Scheme integer is converted to the first of a C 'int',
          'unsigned int', 'long', 'unsigned long', 'long long' or
          'unsigned long long' type for the current architecture that
          can represent the value.

          If the Scheme integer cannot be represented as a target
          integer an 'out-of-range' exception is thrown.

     Scheme real
          A Scheme real is converted to the C 'double' type for the
          current architecture.

     Scheme string
          A Scheme string is converted to a string in the current target
          language using the current target encoding.  Characters that
          cannot be represented in the current target encoding are
          replaced with the corresponding escape sequence.  This is
          Guile's 'SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE' conversion
          strategy (*note (guile)Strings::).

          Passing TYPE is not supported in this case, if it is provided
          a 'wrong-type-arg' exception is thrown.

     '<gdb:lazy-string>'
          If VALUE is a '<gdb:lazy-string>' object (*note Lazy Strings
          In Guile::), then the 'lazy-string->value' procedure is
          called, and its result is used.

          Passing TYPE is not supported in this case, if it is provided
          a 'wrong-type-arg' exception is thrown.

     Scheme bytevector
          If VALUE is a Scheme bytevector and TYPE is provided, VALUE
          must be the same size, in bytes, of values of type TYPE, and
          the result is essentially created by using 'memcpy'.

          If VALUE is a Scheme bytevector and TYPE is not provided, the
          result is an array of type 'uint8' of the same length.

 -- Scheme Procedure: value-optimized-out? value
     Return '#t' if the compiler optimized out VALUE, thus it is not
     available for fetching from the inferior.  Otherwise return '#f'.

 -- Scheme Procedure: value-address value
     If VALUE is addressable, returns a '<gdb:value>' object
     representing the address.  Otherwise, '#f' is returned.

 -- Scheme Procedure: value-type value
     Return the type of VALUE as a '<gdb:type>' object (*note Types In
     Guile::).

 -- Scheme Procedure: value-dynamic-type value
     Return the dynamic type of VALUE.  This uses C++ run-time type
     information (RTTI) to determine the dynamic type of the value.  If
     the value is of class type, it will return the class in which the
     value is embedded, if any.  If the 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.

 -- Scheme Procedure: value-cast value type
     Return a new instance of '<gdb:value>' that is the result of
     casting VALUE 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.

 -- Scheme Procedure: value-dynamic-cast value type
     Like 'value-cast', but works as if the C++ 'dynamic_cast' operator
     were used.  Consult a C++ reference for details.

 -- Scheme Procedure: value-reinterpret-cast value type
     Like 'value-cast', but works as if the C++ 'reinterpret_cast'
     operator were used.  Consult a C++ reference for details.

 -- Scheme Procedure: value-dereference value
     For pointer data types, this method returns a new '<gdb:value>'
     object whose contents is the object pointed to by VALUE.  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:

          (define bar (value-dereference foo))

     The result 'bar' will be a '<gdb:value>' object holding the value
     pointed to by 'foo'.

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

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

     Though 'ptrref' is a reference value, one can apply the method
     'value-dereference' to the '<gdb:value>' object corresponding to it
     and obtain a '<gdb:value>' which is identical to that corresponding
     to 'val'.  However, if you apply the method
     'value-referenced-value', the result would be a '<gdb:value>'
     object identical to that corresponding to 'ptr'.

          (define scm-ptrref (parse-and-eval "ptrref"))
          (define scm-val (value-dereference scm-ptrref))
          (define scm-ptr (value-referenced-value scm-ptrref))

     The '<gdb:value>' object 'scm-val' is identical to that
     corresponding to 'val', and 'scm-ptr' is identical to that
     corresponding to 'ptr'.  In general, 'value-dereference' can be
     applied whenever the C unary operator '*' can be applied to the
     corresponding C value.  For those cases where applying both
     'value-dereference' and 'value-referenced-value' is allowed, the
     results obtained need not be identical (as we have seen in the
     above example).  The results are however identical when applied on
     '<gdb:value>' objects corresponding to pointers ('<gdb:value>'
     objects with type code 'TYPE_CODE_PTR') in a C/C++ program.

 -- Scheme Procedure: value-referenced-value value
     For pointer or reference data types, this method returns a new
     '<gdb:value>' object corresponding to the value referenced by the
     pointer/reference value.  For pointer data types,
     'value-dereference' and 'value-referenced-value' produce identical
     results.  The difference between these methods is that
     'value-dereference' cannot get the values referenced by reference
     values.  For example, consider a reference to an 'int', declared in
     your C++ program as

          int val = 10;
          int &ref = val;

     then applying 'value-dereference' to the '<gdb:value>' object
     corresponding to 'ref' will result in an error, while applying
     'value-referenced-value' will result in a '<gdb:value>' object
     identical to that corresponding to 'val'.

          (define scm-ref (parse-and-eval "ref"))
          (define err-ref (value-dereference scm-ref))      ;; error
          (define scm-val (value-referenced-value scm-ref)) ;; ok

     The '<gdb:value>' object 'scm-val' is identical to that
     corresponding to 'val'.

 -- Scheme Procedure: value-field value field-name
     Return field FIELD-NAME from '<gdb:value>' object VALUE.

 -- Scheme Procedure: value-subscript value index
     Return the value of array VALUE at index INDEX.  The VALUE argument
     must be a subscriptable '<gdb:value>' object.

 -- Scheme Procedure: value-call value arg-list
     Perform an inferior function call, taking VALUE as a pointer to the
     function to call.  Each element of list ARG-LIST must be a
     <gdb:value> object or an object that can be converted to a value.
     The result is the value returned by the function.

 -- Scheme Procedure: value->bool value
     Return the Scheme boolean representing '<gdb:value>' VALUE.  The
     value must be "integer like".  Pointers are ok.

 -- Scheme Procedure: value->integer
     Return the Scheme integer representing '<gdb:value>' VALUE.  The
     value must be "integer like".  Pointers are ok.

 -- Scheme Procedure: value->real
     Return the Scheme real number representing '<gdb:value>' VALUE.
     The value must be a number.

 -- Scheme Procedure: value->bytevector
     Return a Scheme bytevector with the raw contents of '<gdb:value>'
     VALUE.  No transformation, endian or otherwise, is performed.

 -- Scheme Procedure: value->string value [#:encoding encoding]
          [#:errors errors] [#:length length]
     If VALUE> represents a string, then this method converts the
     contents to a Guile string.  Otherwise, this method will throw an
     exception.

     Values are interpreted as strings according to the rules of the
     current language.  If the optional length argument is given, the
     string will be converted to that length, and will include any
     embedded zeroes that the string may contain.  Otherwise, for
     languages where the string is zero-terminated, the entire string
     will be converted.

     For example, in C-like languages, a value is a string if it is a
     pointer to or an array of characters or ints of type 'wchar_t',
     'char16_t', or 'char32_t'.

     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 Guile's
     'scm_from_stringn' function, and the Guile 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 one of '#f', 'error' or
     'substitute'.  'error' and 'substitute' must be symbols.  If ERRORS
     is not specified, or if its value is '#f', then the default
     conversion strategy is used, which is set with the Scheme function
     'set-port-conversion-strategy!'.  If the value is ''error' then an
     exception is thrown if there is any conversion error.  If the value
     is ''substitute' then any conversion error is replaced with
     question marks.  *Note (guile)Strings::.

     If the optional LENGTH argument is given, the string will be
     fetched and converted to the given length.  The length must be a
     Scheme integer and not a '<gdb:value>' integer.

 -- Scheme Procedure: value->lazy-string value [#:encoding encoding]
          [#:length length]
     If this '<gdb:value>' represents a string, then this method
     converts VALUE to a '<gdb:lazy-string' (*note Lazy Strings In
     Guile::).  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:lazy-string'.  Some examples are:
     '"ascii"', '"iso-8859-6"' or '"utf-8"'.  If the ENCODING argument
     is an encoding that GDB does not 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.  The length
     must be a Scheme integer and not a '<gdb:value>' integer.

 -- Scheme Procedure: value-lazy? value
     Return '#t' if VALUE has not yet been fetched from the inferior.
     Otherwise return '#f'.  GDB does not fetch values until necessary,
     for efficiency.  For example:

          (define myval (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'
     procedure is invoked.

 -- Scheme Procedure: make-lazy-value type address
     Return a '<gdb:value>' that will be lazily fetched from the target.
     The object of type '<gdb:type>' whose value to fetch is specified
     by its TYPE and its target memory ADDRESS, which is a Scheme
     integer.

 -- Scheme Procedure: value-fetch-lazy! value
     If VALUE is a lazy value ('(value-lazy? value)' is '#t'), then the
     value is fetched from the inferior.  Any errors that occur in the
     process will produce a Guile exception.

     If VALUE is not a lazy value, this method has no effect.

     The result of this function is unspecified.

 -- Scheme Procedure: value-print value
     Return the string representation (print form) of '<gdb:value>'
     VALUE.


File: gdb.info,  Node: Arithmetic In Guile,  Next: Types In Guile,  Prev: Values From Inferior In Guile,  Up: Guile API

23.3.3.6 Arithmetic In Guile
............................

The '(gdb)' module provides several functions for performing arithmetic
on '<gdb:value>' objects.  The arithmetic is performed as if it were
done by the target, and therefore has target semantics which are not
necessarily those of Scheme.  For example operations work with a fixed
precision, not the arbitrary precision of Scheme.

   Wherever a function takes an integer or pointer as an operand, GDB
will convert appropriate Scheme values to perform the operation.

 -- Scheme Procedure: value-add a b

 -- Scheme Procedure: value-sub a b

 -- Scheme Procedure: value-mul a b

 -- Scheme Procedure: value-div a b

 -- Scheme Procedure: value-rem a b

 -- Scheme Procedure: value-mod a b

 -- Scheme Procedure: value-pow a b

 -- Scheme Procedure: value-not a

 -- Scheme Procedure: value-neg a

 -- Scheme Procedure: value-pos a

 -- Scheme Procedure: value-abs a

 -- Scheme Procedure: value-lsh a b

 -- Scheme Procedure: value-rsh a b

 -- Scheme Procedure: value-min a b

 -- Scheme Procedure: value-max a b

 -- Scheme Procedure: value-lognot a

 -- Scheme Procedure: value-logand a b

 -- Scheme Procedure: value-logior a b

 -- Scheme Procedure: value-logxor a b

 -- Scheme Procedure: value=? a b

 -- Scheme Procedure: value<? a b

 -- Scheme Procedure: value<=? a b

 -- Scheme Procedure: value>? a b

 -- Scheme Procedure: value>=? a b

   Scheme does not provide a 'not-equal' function, and thus Guile
support in GDB does not either.


File: gdb.info,  Node: Types In Guile,  Next: Guile Pretty Printing API,  Prev: Arithmetic In Guile,  Up: Guile API

23.3.3.7 Types In Guile
.......................

GDB represents types from the inferior in objects of type '<gdb:type>'.

   The following type-related procedures are provided by the '(gdb)'
module.

 -- Scheme Procedure: type? object
     Return '#t' if OBJECT is an object of type '<gdb:type>'.  Otherwise
     return '#f'.

 -- Scheme Procedure: lookup-type name [#:block block]
     This function looks up a type by its NAME, which must be a string.

     If BLOCK is given, it is an object of type '<gdb:block>', and 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.

 -- Scheme Procedure: type-code type
     Return the type code of TYPE.  The type code will be one of the
     'TYPE_CODE_' constants defined below.

 -- Scheme Procedure: type-tag type
     Return the tag name of 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 '#f' is returned.

 -- Scheme Procedure: type-name type
     Return the name of TYPE.  If this type has no name, then '#f' is
     returned.

 -- Scheme Procedure: type-print-name type
     Return the print name of TYPE.  This returns something even for
     anonymous types.  For example, for an anonymous C struct '"struct
     {...}"' is returned.

 -- Scheme Procedure: type-sizeof type
     Return 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.

 -- Scheme Procedure: type-strip-typedefs type
     Return a new '<gdb:type>' that represents the real type of TYPE,
     after removing all layers of typedefs.

 -- Scheme Procedure: type-array type 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.

 -- Scheme Procedure: type-vector type n1 [n2]
     Return a new '<gdb:type>' object which represents a vector of this
     type.  If one argument is given, it is the inclusive upper bound of
     the vector; in this case the lower bound is zero.  If two arguments
     are given, the first argument is the lower bound of the vector, and
     the second argument is the upper bound of the vector.  A vector's
     length must not be negative, but the bounds can be.

     The difference between an 'array' and a 'vector' is that arrays
     behave like in C: when used in expressions they decay to a pointer
     to the first element whereas vectors are treated as first class
     values.

 -- Scheme Procedure: type-pointer type
     Return a new '<gdb:type>' object which represents a pointer to
     TYPE.

 -- Scheme Procedure: type-range type
     Return a list of two elements: the low bound and high bound of
     TYPE.  If TYPE does not have a range, an exception is thrown.

 -- Scheme Procedure: type-reference type
     Return a new '<gdb:type>' object which represents a reference to
     TYPE.

 -- Scheme Procedure: type-target type
     Return a new '<gdb:type>' object which represents the target type
     of 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.

 -- Scheme Procedure: type-const type
     Return a new '<gdb:type>' object which represents a
     'const'-qualified variant of TYPE.

 -- Scheme Procedure: type-volatile type
     Return a new '<gdb:type>' object which represents a
     'volatile'-qualified variant of TYPE.

 -- Scheme Procedure: type-unqualified type
     Return a new '<gdb:type>' object which represents an unqualified
     variant of TYPE.  That is, the result is neither 'const' nor
     'volatile'.

 -- Scheme Procedure: type-num-fields
     Return the number of fields of '<gdb:type>' TYPE.

 -- Scheme Procedure: type-fields type
     Return the fields of TYPE as a list.  For structure and union
     types, 'fields' has the usual meaning.  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 list will be returned.  *Note Fields of
     a type in Guile::.

 -- Scheme Procedure: make-field-iterator type
     Return the fields of TYPE as a <gdb:iterator> object.  *Note
     Iterators In Guile::.

 -- Scheme Procedure: type-field type field-name
     Return field named FIELD-NAME in TYPE.  The result is an object of
     type '<gdb:field>'.  *Note Fields of a type in Guile::.  If the
     type does not have fields, or FIELD-NAME is not a field of TYPE, an
     exception is thrown.

     For example, if 'some-type' is a '<gdb:type>' instance holding a
     structure type, you can access its 'foo' field with:

          (define bar (type-field some-type "foo"))

     'bar' will be a '<gdb:field>' object.

 -- Scheme Procedure: type-has-field? type name
     Return '#t' if '<gdb:type>' TYPE has field named NAME.  Otherwise
     return '#f'.

   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:

'TYPE_CODE_PTR'
     The type is a pointer.

'TYPE_CODE_ARRAY'
     The type is an array.

'TYPE_CODE_STRUCT'
     The type is a structure.

'TYPE_CODE_UNION'
     The type is a union.

'TYPE_CODE_ENUM'
     The type is an enum.

'TYPE_CODE_FLAGS'
     A bit flags type, used for things such as status registers.

'TYPE_CODE_FUNC'
     The type is a function.

'TYPE_CODE_INT'
     The type is an integer type.

'TYPE_CODE_FLT'
     A floating point type.

'TYPE_CODE_VOID'
     The special type 'void'.

'TYPE_CODE_SET'
     A Pascal set type.

'TYPE_CODE_RANGE'
     A range type, that is, an integer type with bounds.

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

'TYPE_CODE_BITSTRING'
     A string of bits.  It is deprecated.

'TYPE_CODE_ERROR'
     An unknown or erroneous type.

'TYPE_CODE_METHOD'
     A method type, as found in C++ or Java.

'TYPE_CODE_METHODPTR'
     A pointer-to-member-function.

'TYPE_CODE_MEMBERPTR'
     A pointer-to-member.

'TYPE_CODE_REF'
     A reference type.

'TYPE_CODE_CHAR'
     A character type.

'TYPE_CODE_BOOL'
     A boolean type.

'TYPE_CODE_COMPLEX'
     A complex float type.

'TYPE_CODE_TYPEDEF'
     A typedef to some other type.

'TYPE_CODE_NAMESPACE'
     A C++ namespace.

'TYPE_CODE_DECFLOAT'
     A decimal floating point type.

'TYPE_CODE_INTERNAL_FUNCTION'
     A function internal to GDB.  This is the type used to represent
     convenience functions (*note Convenience Funs::).

   Further support for types is provided in the '(gdb types)' Guile
module (*note Guile Types Module::).

   Each field is represented as an object of type '<gdb:field>'.

   The following field-related procedures are provided by the '(gdb)'
module:

 -- Scheme Procedure: field? object
     Return '#t' if OBJECT is an object of type '<gdb:field>'.
     Otherwise return '#f'.

 -- Scheme Procedure: field-name field
     Return the name of the field, or '#f' for anonymous fields.

 -- Scheme Procedure: field-type field
     Return the type of the field.  This is usually an instance of
     '<gdb:type>', but it can be '#f' in some situations.

 -- Scheme Procedure: field-enumval field
     Return the enum value represented by '<gdb:field>' FIELD.

 -- Scheme Procedure: field-bitpos field
     Return the bit position of '<gdb:field>' FIELD.  This attribute is
     not available for 'static' fields (as in C++ or Java).

 -- Scheme Procedure: field-bitsize field
     If the field is packed, or is a bitfield, return the size of
     '<gdb:field>' FIELD in bits.  Otherwise, zero is returned; in which
     case the field's size is given by its type.

 -- Scheme Procedure: field-artificial? field
     Return '#t' if the field is artificial, usually meaning that it was
     provided by the compiler and not the user.  Otherwise return '#f'.

 -- Scheme Procedure: field-base-class? field
     Return '#t' if the field represents a base class of a C++
     structure.  Otherwise return '#f'.


File: gdb.info,  Node: Guile Pretty Printing API,  Next: Selecting Guile Pretty-Printers,  Prev: Types In Guile,  Up: Guile API

23.3.3.8 Guile Pretty Printing API
..................................

An example output is provided (*note Pretty Printing::).

   A pretty-printer is represented by an object of type
<gdb:pretty-printer>.  Pretty-printer objects are created with
'make-pretty-printer'.

   The following pretty-printer-related procedures are provided by the
'(gdb)' module:

 -- Scheme Procedure: make-pretty-printer name lookup-function
     Return a '<gdb:pretty-printer>' object named NAME.

     LOOKUP-FUNCTION is a function of one parameter: the value to be
     printed.  If the value is handled by this pretty-printer, then
     LOOKUP-FUNCTION returns an object of type
     <gdb:pretty-printer-worker> to perform the actual pretty-printing.
     Otherwise LOOKUP-FUNCTION returns '#f'.

 -- Scheme Procedure: pretty-printer? object
     Return '#t' if OBJECT is a '<gdb:pretty-printer>' object.
     Otherwise return '#f'.

 -- Scheme Procedure: pretty-printer-enabled? pretty-printer
     Return '#t' if PRETTY-PRINTER is enabled.  Otherwise return '#f'.

 -- Scheme Procedure: set-pretty-printer-enabled! pretty-printer flag
     Set the enabled flag of PRETTY-PRINTER to FLAG.  The value returned
     is unspecified.

 -- Scheme Procedure: pretty-printers
     Return the list of global pretty-printers.

 -- Scheme Procedure: set-pretty-printers! pretty-printers
     Set the list of global pretty-printers to PRETTY-PRINTERS.  The
     value returned is unspecified.

 -- Scheme Procedure: make-pretty-printer-worker display-hint to-string
          children
     Return an object of type '<gdb:pretty-printer-worker>'.

     This function takes three parameters:

     'display-hint'
          DISPLAY-HINT provides a hint to GDB or GDB front end via MI to
          change the formatting of the value being printed.  The value
          must be a string or '#f' (meaning there is no hint).  Several
          values for DISPLAY-HINT 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' function returns a Guile
               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.

     'to-string'
          TO-STRING is either a function of one parameter, the
          '<gdb:pretty-printer-worker>' object, or '#f'.

          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 Guile 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.  Guile scalars
          (integers, floats, and booleans) and strings are convertible
          to '<gdb:value>'; other types are not.

          Finally, if this method returns '#f' 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.

          TO-STRING may also be '#f' in which case it is left to
          CHILDREN to print the value.

     'children'
          CHILDREN is either a function of one parameter, the
          '<gdb:pretty-printer-worker>' object, or '#f'.

          GDB will call this function on a pretty-printer to compute the
          children of the pretty-printer's value.

          This function must return a <gdb:iterator> object.  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 Guile
          object which is convertible to a GDB value.

          If CHILDREN is '#f', GDB will act as though the value has no
          children.

   GDB provides a function which can be used to look up the default
pretty-printer for a '<gdb:value>':

 -- Scheme Procedure: 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 '#f'.


File: gdb.info,  Node: Selecting Guile Pretty-Printers,  Next: Writing a Guile Pretty-Printer,  Prev: Guile Pretty Printing API,  Up: Guile API

23.3.3.9 Selecting Guile Pretty-Printers
........................................

There are three sets of pretty-printers that GDB searches:

   * Per-objfile list of pretty-printers (*note Objfiles In Guile::).
   * Per-progspace list of pretty-printers (*note Progspaces In
     Guile::).
   * The global list of pretty-printers (*note Guile Pretty Printing
     API::).  These printers are available when debugging any inferior.

   Pretty-printer lookup is done by passing the value to be printed to
the lookup function of each enabled object in turn.  Lookup stops when a
lookup function returns a non-'#f' value or when the list is exhausted.
Lookup functions must return either a '<gdb:pretty-printer-worker>'
object or '#f'.  Otherwise an exception is thrown.

   GDB first checks the result of 'objfile-pretty-printers' of each
'<gdb:objfile>' in the current program space and iteratively calls each
enabled lookup function in the list for that '<gdb:objfile>' until a
non-'#f' object is returned.  If no pretty-printer is found in the
objfile lists, GDB then searches the result of
'progspace-pretty-printers' of the current program space, calling each
enabled function until a non-'#f' object is returned.  After these lists
have been exhausted, it tries the global pretty-printers list, obtained
with 'pretty-printers', again calling each enabled function until a
non-'#f' 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
'<gdb:pretty-printer-worker>' 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 from Scheme by calling
'set-pretty-printer-enabled!'.  *Note Guile Pretty Printing API::.


File: gdb.info,  Node: Writing a Guile Pretty-Printer,  Next: Commands In Guile,  Prev: Selecting Guile Pretty-Printers,  Up: Guile API

23.3.3.10 Writing a Guile Pretty-Printer
........................................

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

   Here is an example showing how a 'std::string' printer might be
written.  *Note Guile Pretty Printing API::, for details.

     (define (make-my-string-printer value)
       "Print a my::string string"
       (make-pretty-printer-worker
        "string"
        (lambda (printer)
          (value-field value "_data"))
        #f))

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

     (define (str-lookup-function pretty-printer value)
       (let ((tag (type-tag (value-type value))))
         (and tag
              (string-prefix? "std::string<" tag)
              (make-my-string-printer value))))

   Then to register this printer in the global printer list:

     (append-pretty-printer!
      (make-pretty-printer "my-string" str-lookup-function))

   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 <gdb:pretty-printer-worker>
object.  If not, it returns '#f'.

   We recommend that you put your core pretty-printers into a Guile
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 Guile 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 Guile 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 'my::string' example, this code might appear in
'(my-project my-library v1)':

     (use-modules (gdb))
     (define (register-printers objfile)
       (append-objfile-pretty-printer!
        (make-pretty-printer "my-string" str-lookup-function)))

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

     (use-modules (gdb) (my-project my-library v1))
     (register-printers (current-objfile))

   The previous example illustrates a basic pretty-printer.  There are a
few things that can be improved on.  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 this
problem (*note Guile Printing Module::).  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:

     (define (make-foo-printer value)
       "Print a foo object"
       (make-pretty-printer-worker
        "foo"
        (lambda (printer)
          (format #f "a=<~a> b=<~a>"
                  (value-field value "a") (value-field value "a")))
        #f))

     (define (make-bar-printer value)
       "Print a bar object"
       (make-pretty-printer-worker
        "foo"
        (lambda (printer)
          (format #f "x=<~a> y=<~a>"
                  (value-field value "x") (value-field value "y")))
        #f))

   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.

     (use-modules (gdb printing))

     (define (build-pretty-printer)
       (let ((pp (make-pretty-printer-collection "my-library")))
         (pp-collection-add-tag-printer "foo" make-foo-printer)
         (pp-collection-add-tag-printer "bar" make-bar-printer)
         pp))

   And here is the autoload support:

     (use-modules (gdb) (my-library))
     (append-objfile-pretty-printer! (current-objfile) (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: Commands In Guile,  Next: Parameters In Guile,  Prev: Writing a Guile Pretty-Printer,  Up: Guile API

23.3.3.11 Commands In Guile
...........................

You can implement new GDB CLI commands in Guile.  A CLI command object
is created with the 'make-command' Guile function, and added to GDB with
the 'register-command!' Guile function.  This two-step approach is taken
to separate out the side-effect of adding the command to GDB from
'make-command'.

   There is no support for multi-line commands, that is commands that
consist of multiple lines and are terminated with 'end'.

 -- Scheme Procedure: (make-command name [#:invoke invoke]
          [#:command-class command-class] [#:completer-class completer]
          [#:prefix? prefix] [#:doc doc-string])

     The argument 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.

     The result is the '<gdb:command>' object representing the command.
     The command is not usable until it has been registered with GDB
     with 'register-command!'.

     The rest of the arguments are optional.

     The argument INVOKE is a procedure of three arguments: SELF, ARGS
     and FROM-TTY.  The argument SELF is the '<gdb:command>' object
     representing the command.  The argument ARGS is a string
     representing the arguments passed to the command, after leading and
     trailing whitespace has been stripped.  The argument FROM-TTY is a
     boolean flag and specifies whether the command should consider
     itself to have been originated from the user invoking it
     interactively.  If this function throws an exception, it is turned
     into a GDB 'error' call.  Otherwise, the return value is ignored.

     The argument COMMAND-CLASS is one of the 'COMMAND_' constants
     defined below.  This argument tells GDB how to categorize the new
     command in the help system.  The default is 'COMMAND_NONE'.

     The argument COMPLETER is either '#f', one of the 'COMPLETE_'
     constants defined below, or a procedure, also defined below.  This
     argument tells GDB how to perform completion for this command.  If
     not provided or if the value is '#f', then no completion is
     performed on the command.

     The argument PREFIX is a boolean flag indicating whether the new
     command is a prefix command; sub-commands of this command may be
     registered.

     The argument DOC-STRING is help text for the new command.  If no
     documentation string is provided, the default value "This command
     is not documented."  is used.

 -- Scheme Procedure: register-command! command
     Add COMMAND, a '<gdb:command>' object, to GDB's list of commands.
     It is an error to register a command more than once.  The result is
     unspecified.

 -- Scheme Procedure: command? object
     Return '#t' if OBJECT is a '<gdb:command>' object.  Otherwise
     return '#f'.

 -- Scheme Procedure: 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' function.  This is similar to the
     user command 'dont-repeat', see *note dont-repeat: Define.

 -- Scheme Procedure: string->argv string
     Convert a string to a list of strings split up according to GDB's
     argv parsing rules.  It is recommended to use this for consistency.
     Arguments are separated by spaces and may be quoted.  Example:

          scheme@(guile-user)> (string->argv "1 2\\ \\\"3 '4 \"5' \"6 '7\"")
          $1 = ("1" "2 \"3" "4 \"5" "6 '7")

 -- Scheme Procedure: throw-user-error message . args
     Throw a 'gdb:user-error' exception.  The argument MESSAGE is the
     error message as a format string, like the FMT argument to the
     'format' Scheme function.  *Note (guile)Formatted Output::.  The
     argument ARGS is a list of the optional arguments of MESSAGE.

     This is used when the command detects a user error of some kind,
     say a bad command argument.

          (gdb) guile (use-modules (gdb))
          (gdb) guile
          (register-command! (make-command "test-user-error"
            #:command-class COMMAND_OBSCURE
            #:invoke (lambda (self arg from-tty)
              (throw-user-error "Bad argument ~a" arg))))
          end
          (gdb) test-user-error ugh
          ERROR: Bad argument ugh

 -- completer: self text word
     If the COMPLETER option to 'make-command' is a procedure, it takes
     three arguments: SELF which is the '<gdb:command>' object, and TEXT
     and WORD which are both strings.  The argument TEXT holds the
     complete command line up to the cursor's location.  The argument
     WORD holds the last word of the command line; this is computed
     using a word-breaking heuristic.

     All forms of completion are handled by this function, that is, the
     <TAB> and <M-?> key bindings (*note Completion::), and the
     'complete' command (*note complete: Help.).

     This procedure can return several kinds of values:

        * If the return value is a list, the contents of the list are
          used as the completions.  It is up to COMPLETER to ensure that
          the contents actually do complete the word.  An empty list is
          allowed, it means that there were no completions available.
          Only string elements of the list are used; other elements in
          the list are ignored.

        * If the return value is a '<gdb:iterator>' object, it is
          iterated over to obtain the completions.  It is up to
          'completer-procedure' to ensure that the results actually do
          complete the word.  Only string elements of the result are
          used; other elements in the sequence are ignored.

        * All other results are treated as though there were no
          available completions.

   When a new command is registered, it will have been 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:

'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.
     This is the default.

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

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

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

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

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

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

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

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

'COMMAND_USER'
     The command is a general purpose command for the user, and
     typically does not fit in one of the other categories.  Type 'help
     user-defined' at the GDB prompt to see a list of commands in this
     category, as well as the list of gdb macros (*note Sequences::).

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

'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 'completer' procedure.  These predefined completion constants are
all defined in the 'gdb' module:

'COMPLETE_NONE'
     This constant means that no completion should be done.

'COMPLETE_FILENAME'
     This constant means that filename completion should be performed.

'COMPLETE_LOCATION'
     This constant means that location completion should be done.  *Note
     Specify Location::.

'COMPLETE_COMMAND'
     This constant means that completion should examine GDB command
     names.

'COMPLETE_SYMBOL'
     This constant means that completion should be done using symbol
     names as the source.

'COMPLETE_EXPRESSION'
     This constant means that completion should be done on expressions.
     Often this means completing on symbol names, but some language
     parsers also have support for completing on field names.

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

     (gdb) guile
     (register-command! (make-command "hello-world"
       #:command-class COMMAND_USER
       #:doc "Greet the whole world."
       #:invoke (lambda (self args from-tty) (display "Hello, World!\n"))))
     end
     (gdb) hello-world
     Hello, World!


File: gdb.info,  Node: Parameters In Guile,  Next: Progspaces In Guile,  Prev: Commands In Guile,  Up: Guile API

23.3.3.12 Parameters In Guile
.............................

You can implement new GDB "parameters" using Guile (1).

   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 Guile
scripts and commands.

   A new parameter is defined with the 'make-parameter' Guile function,
and added to GDB with the 'register-parameter!' Guile function.  This
two-step approach is taken to separate out the side-effect of adding the
parameter to GDB from 'make-parameter'.

   Parameters are exposed to the user via the 'set' and 'show' commands.
*Note Help::.

 -- Scheme Procedure: (make-parameter name [#:command-class
          command-class] [#:parameter-type parameter-type] [#:enum-list
          enum-list] [#:set-func set-func] [#:show-func show-func]
          [#:doc doc] [#:set-doc set-doc] [#:show-doc show-doc]
          [#:initial-value initial-value])

     The argument 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.

     The result is the '<gdb:parameter>' object representing the
     parameter.  The parameter is not usable until it has been
     registered with GDB with 'register-parameter!'.

     The rest of the arguments are optional.

     The argument COMMAND-CLASS should be one of the 'COMMAND_'
     constants (*note Commands In Guile::).  This argument tells GDB how
     to categorize the new parameter in the help system.  The default is
     'COMMAND_NONE'.

     The argument PARAMETER-TYPE 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.  The default is 'PARAM_BOOLEAN'.

     If PARAMETER-TYPE is 'PARAM_ENUM', then ENUM-LIST must be a list of
     strings.  These strings represent the possible values for the
     parameter.

     If PARAMETER-TYPE is not 'PARAM_ENUM', then the presence of
     ENUM-LIST will cause an exception to be thrown.

     The argument SET-FUNC is a function of one argument: SELF which is
     the '<gdb:parameter>' object representing the parameter.  GDB will
     call this function when a PARAMETER's value has been changed via
     the 'set' API (for example, 'set foo off').  The value of the
     parameter has already been set to the new value.  This function
     must return a string to be displayed to the user.  GDB will add a
     trailing newline if the string is non-empty.  GDB generally doesn't
     print anything when a parameter is set, thus typically this
     function should return '""'.  A non-empty string result should
     typically be used for displaying warnings and errors.

     The argument SHOW-FUNC is a function of two arguments: SELF which
     is the '<gdb:parameter>' object representing the parameter, and
     SVALUE which is the string representation of the current value.
     GDB will call this function when a PARAMETER's 'show' API has been
     invoked (for example, 'show foo').  This function must return a
     string, and will be displayed to the user.  GDB will add a trailing
     newline.

     The argument DOC is the help text for the new parameter.  If there
     is no documentation string, a default value is used.

     The argument SET-DOC is the help text for this parameter's 'set'
     command.

     The argument SHOW-DOC is the help text for this parameter's 'show'
     command.

     The argument INITIAL-VALUE specifies the initial value of the
     parameter.  If it is a function, it takes one parameter, the
     '<gdb:parameter>' object and its result is used as the initial
     value of the parameter.  The initial value must be valid for the
     parameter type, otherwise an exception is thrown.

 -- Scheme Procedure: register-parameter! parameter
     Add PARAMETER, a '<gdb:parameter>' object, to GDB's list of
     parameters.  It is an error to register a parameter more than once.
     The result is unspecified.

 -- Scheme Procedure: parameter? object
     Return '#t' if OBJECT is a '<gdb:parameter>' object.  Otherwise
     return '#f'.

 -- Scheme Procedure: parameter-value parameter
     Return the value of PARAMETER which may either be a
     '<gdb:parameter>' object or a string naming the parameter.

 -- Scheme Procedure: set-parameter-value! parameter new-value
     Assign PARAMETER the value of NEW-VALUE.  The argument PARAMETER
     must be an object of type '<gdb:parameter>'.  GDB does validation
     when assignments are made.

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

'PARAM_BOOLEAN'
     The value is a plain boolean.  The Guile boolean values, '#t' and
     '#f' are the only valid values.

'PARAM_AUTO_BOOLEAN'
     The value has three possible states: true, false, and 'auto'.  In
     Guile, true and false are represented using boolean constants, and
     'auto' is represented using '#:auto'.

'PARAM_UINTEGER'
     The value is an unsigned integer.  The value of 0 should be
     interpreted to mean "unlimited".

'PARAM_ZINTEGER'
     The value is an integer.

'PARAM_ZUINTEGER'
     The value is an unsigned integer.

'PARAM_ZUINTEGER_UNLIMITED'
     The value is an integer in the range '[0, INT_MAX]'.  A value of
     '-1' means "unlimited", and other negative numbers are not allowed.

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

'PARAM_STRING_NOESCAPE'
     The value is a string.  When the user modifies the string, escapes
     are passed through untranslated.

'PARAM_OPTIONAL_FILENAME'
     The value is a either a filename (a string), or '#f'.

'PARAM_FILENAME'
     The value is a filename.  This is just like
     'PARAM_STRING_NOESCAPE', but uses file names for completion.

'PARAM_ENUM'
     The value is a string, which must be one of a collection of string
     constants provided when the parameter is created.

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

   (1) Note that GDB parameters must not be confused with Guile’s
parameter objects (*note (guile)Parameters::).


File: gdb.info,  Node: Progspaces In Guile,  Next: Objfiles In Guile,  Prev: Parameters In Guile,  Up: Guile API

23.3.3.13 Program Spaces In Guile
.................................

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 Guile::.  *Note program spaces: Inferiors and
Programs, for more details about program spaces.

   Each progspace is represented by an instance of the '<gdb:progspace>'
smob.  *Note GDB Scheme Data Types::.

   The following progspace-related functions are available in the
'(gdb)' module:

 -- Scheme Procedure: progspace? object
     Return '#t' if OBJECT is a '<gdb:progspace>' object.  Otherwise
     return '#f'.

 -- Scheme Procedure: progspace-valid? progspace
     Return '#t' if PROGSPACE is valid, '#f' if not.  A
     '<gdb:progspace>' object can become invalid if the program it
     refers to is not loaded in GDB any longer.

 -- Scheme Procedure: current-progspace
     This function returns the program space of the currently selected
     inferior.  There is always a current progspace, this never returns
     '#f'.  *Note Inferiors and Programs::.

 -- Scheme Procedure: progspaces
     Return a list of all the progspaces currently known to GDB.

 -- Scheme Procedure: progspace-filename progspace
     Return the absolute file name of PROGSPACE as a string.  This is
     the name of the file passed as the argument to the 'file' or
     'symbol-file' commands.  If the program space does not have an
     associated file name, then '#f' is returned.  This occurs, for
     example, when GDB is started without a program to debug.

     A 'gdb:invalid-object-error' exception is thrown if PROGSPACE is
     invalid.

 -- Scheme Procedure: progspace-objfiles progspace
     Return the list of objfiles of PROGSPACE.  The order of objfiles in
     the result is arbitrary.  Each element is an object of type
     '<gdb:objfile>'.  *Note Objfiles In Guile::.

     A 'gdb:invalid-object-error' exception is thrown if PROGSPACE is
     invalid.

 -- Scheme Procedure: progspace-pretty-printers progspace
     Return the list of pretty-printers of PROGSPACE.  Each element is
     an object of type '<gdb:pretty-printer>'.  *Note Guile Pretty
     Printing API::, for more information.

 -- Scheme Procedure: set-progspace-pretty-printers! progspace
          printer-list
     Set the list of registered '<gdb:pretty-printer>' objects for
     PROGSPACE to PRINTER-LIST.  *Note Guile Pretty Printing API::, for
     more information.


File: gdb.info,  Node: Objfiles In Guile,  Next: Frames In Guile,  Prev: Progspaces In Guile,  Up: Guile API

23.3.3.14 Objfiles In Guile
...........................

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

   Each objfile is represented as an object of type '<gdb:objfile>'.

   The following objfile-related procedures are provided by the '(gdb)'
module:

 -- Scheme Procedure: objfile? object
     Return '#t' if OBJECT is a '<gdb:objfile>' object.  Otherwise
     return '#f'.

 -- Scheme Procedure: objfile-valid? objfile
     Return '#t' if OBJFILE is valid, '#f' 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>' procedures
     will throw an exception if it is invalid at the time the procedure
     is called.

 -- Scheme Procedure: objfile-filename objfile
     Return the file name of OBJFILE as a string, with symbolic links
     resolved.

 -- Scheme Procedure: objfile-progspace objfile
     Return the '<gdb:progspace>' that this object file lives in.  *Note
     Progspaces In Guile::, for more on progspaces.

 -- Scheme Procedure: objfile-pretty-printers objfile
     Return the list of registered '<gdb:pretty-printer>' objects for
     OBJFILE.  *Note Guile Pretty Printing API::, for more information.

 -- Scheme Procedure: set-objfile-pretty-printers! objfile printer-list
     Set the list of registered '<gdb:pretty-printer>' objects for
     OBJFILE to PRINTER-LIST.  The PRINTER-LIST must be a list of
     '<gdb:pretty-printer>' objects.  *Note Guile Pretty Printing API::,
     for more information.

 -- Scheme Procedure: current-objfile
     When auto-loading a Guile script (*note Guile 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 '#f'.

 -- Scheme Procedure: objfiles
     Return a list of all the objfiles in the current program space.


File: gdb.info,  Node: Frames In Guile,  Next: Blocks In Guile,  Prev: Objfiles In Guile,  Up: Guile API

23.3.3.15 Accessing inferior stack frames from Guile.
.....................................................

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:invalid-object' exception
(*note Guile Exception Handling::).

   Two '<gdb:frame>' objects can be compared for equality with the
'equal?' function, like:

     (gdb) guile (equal? (newest-frame) (selected-frame))
     #t

   The following frame-related procedures are provided by the '(gdb)'
module:

 -- Scheme Procedure: frame? object
     Return '#t' if OBJECT is a '<gdb:frame>' object.  Otherwise return
     '#f'.

 -- Scheme Procedure: frame-valid? frame
     Returns '#t' if FRAME is valid, '#f' if not.  A frame object can
     become invalid if the frame it refers to doesn't exist anymore in
     the inferior.  All '<gdb:frame>' procedures will throw an exception
     if the frame is invalid at the time the procedure is called.

 -- Scheme Procedure: frame-name frame
     Return the function name of FRAME, or '#f' if it can't be obtained.

 -- Scheme Procedure: frame-arch frame
     Return the '<gdb:architecture>' object corresponding to FRAME's
     architecture.  *Note Architectures In Guile::.

 -- Scheme Procedure: frame-type frame
     Return the type of FRAME.  The value can be one of:

     'NORMAL_FRAME'
          An ordinary stack frame.

     'DUMMY_FRAME'
          A fake stack frame that was created by GDB when performing an
          inferior function call.

     'INLINE_FRAME'
          A frame representing an inlined function.  The function was
          inlined into a 'NORMAL_FRAME' that is older than this one.

     'TAILCALL_FRAME'
          A frame representing a tail call.  *Note Tail Call Frames::.

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

     'ARCH_FRAME'
          A fake stack frame representing a cross-architecture call.

     'SENTINEL_FRAME'
          This is like 'NORMAL_FRAME', but it is only used for the
          newest frame.

 -- Scheme Procedure: frame-unwind-stop-reason frame
     Return an integer representing the reason why it's not possible to
     find more frames toward the outermost frame.  Use
     'unwind-stop-reason-string' to convert the value returned by this
     function to a string.  The value can be one of:

     'FRAME_UNWIND_NO_REASON'
          No particular reason (older frames should be available).

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

     'FRAME_UNWIND_OUTERMOST'
          This frame is the outermost.

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

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

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

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

     'FRAME_UNWIND_MEMORY_ERROR'
          The frame unwinder caused an error while trying to access
          memory.

     '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:

               (define reason (frame-unwind-stop-readon (selected-frame)))
               (define reason-str (unwind-stop-reason-string reason))
               (if (>= reason FRAME_UNWIND_FIRST_ERROR)
                   (format #t "An error occured: ~s\n" reason-str))

 -- Scheme Procedure: frame-pc frame
     Return the frame's resume address.

 -- Scheme Procedure: frame-block frame
     Return the frame's code block as a '<gdb:block>' object.  *Note
     Blocks In Guile::.

 -- Scheme Procedure: frame-function frame
     Return the symbol for the function corresponding to this frame as a
     '<gdb:symbol>' object, or '#f' if there isn't one.  *Note Symbols
     In Guile::.

 -- Scheme Procedure: frame-older frame
     Return the frame that called FRAME.

 -- Scheme Procedure: frame-newer frame
     Return the frame called by FRAME.

 -- Scheme Procedure: frame-sal frame
     Return the frame's '<gdb:sal>' (symtab and line) object.  *Note
     Symbol Tables In Guile::.

 -- Scheme Procedure: frame-read-register frame register
     Return the value of REGISTER in FRAME.  REGISTER should be a
     string, like 'pc'.

 -- Scheme Procedure: frame-read-var frame variable [#:block block]
     Return the value of VARIABLE in 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).  The VARIABLE must be
     given as a string or a '<gdb:symbol>' object, and BLOCK must be a
     '<gdb:block>' object.

 -- Scheme Procedure: frame-select frame
     Set FRAME to be the selected frame.  *Note Examining the Stack:
     Stack.

 -- Scheme Procedure: selected-frame
     Return the selected frame object.  *Note Selecting a Frame:
     Selection.

 -- Scheme Procedure: newest-frame
     Return the newest frame object for the selected thread.

 -- Scheme Procedure: unwind-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
     'frame-unwind-stop-reason' procedure above in this section).


File: gdb.info,  Node: Blocks In Guile,  Next: Symbols In Guile,  Prev: Frames In Guile,  Up: Guile API

23.3.3.16 Accessing blocks from Guile.
......................................

In GDB, symbols are stored in blocks.  A block corresponds roughly to a
scope in the source code.  Blocks are organized hierarchically, and are
represented individually in Guile as an object of type '<gdb:block>'.
Blocks rely on debugging information being available.

   A frame has a block.  Please see *note Frames In Guile::, for a more
in-depth discussion of frames.

   The outermost block is known as the "global block".  The global block
typically holds public global variables and functions.

   The block nested just inside the global block is the "static block".
The static block typically holds file-scoped variables and functions.

   GDB provides a method to get a block's superblock, but there is
currently no way to examine the sub-blocks of a block, or to iterate
over all the blocks in a symbol table (*note Symbol Tables In Guile::).

   Here is a short example that should help explain blocks:

     /* This is in the global block.  */
     int global;

     /* This is in the static block.  */
     static int file_scope;

     /* 'function' is in the global block, and 'argument' is
        in a block nested inside of 'function'.  */
     int function (int argument)
     {
       /* 'local' is in a block inside 'function'.  It may or may
          not be in the same block as 'argument'.  */
       int local;

       {
          /* 'inner' is in a block whose superblock is the one holding
             'local'.  */
          int inner;

          /* If this call is expanded by the compiler, you may see
             a nested block here whose function is 'inline_function'
             and whose superblock is the one holding 'inner'.  */
          inline_function ();
       }
     }

   The following block-related procedures are provided by the '(gdb)'
module:

 -- Scheme Procedure: block? object
     Return '#t' if OBJECT is a '<gdb:block>' object.  Otherwise return
     '#f'.

 -- Scheme Procedure: block-valid? block
     Returns '#t' if '<gdb:block>' BLOCK is valid, '#f' 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 procedure is
     called.  The block's validity is also checked during iteration over
     symbols of the block.

 -- Scheme Procedure: block-start block
     Return the start address of '<gdb:block>' BLOCK.

 -- Scheme Procedure: block-end block
     Return the end address of '<gdb:block>' BLOCK.

 -- Scheme Procedure: block-function block
     Return the name of '<gdb:block>' BLOCK represented as a
     '<gdb:symbol>' object.  If the block is not named, then '#f' is
     returned.

     For ordinary function blocks, the superblock is the static block.
     However, you should note that it is possible for a function block
     to have a superblock that is not the static block - for instance
     this happens for an inlined function.

 -- Scheme Procedure: block-superblock block
     Return the block containing '<gdb:block>' BLOCK.  If the parent
     block does not exist, then '#f' is returned.

 -- Scheme Procedure: block-global-block block
     Return the global block associated with '<gdb:block>' BLOCK.

 -- Scheme Procedure: block-static-block block
     Return the static block associated with '<gdb:block>' BLOCK.

 -- Scheme Procedure: block-global? block
     Return '#t' if '<gdb:block>' BLOCK is a global block.  Otherwise
     return '#f'.

 -- Scheme Procedure: block-static? block
     Return '#t' if '<gdb:block>' BLOCK is a static block.  Otherwise
     return '#f'.

 -- Scheme Procedure: block-symbols
     Return a list of all symbols (as <gdb:symbol> objects) in
     '<gdb:block>' BLOCK.

 -- Scheme Procedure: make-block-symbols-iterator block
     Return an object of type '<gdb:iterator>' that will iterate over
     all symbols of the block.  Guile programs should not assume that a
     specific block object will always contain a given symbol, since
     changes in GDB features and infrastructure may cause symbols move
     across blocks in a symbol table.  *Note Iterators In Guile::.

 -- Scheme Procedure: block-symbols-progress?
     Return #t if the object is a <gdb:block-symbols-progress> object.
     This object would be obtained from the 'progress' element of the
     '<gdb:iterator>' object returned by 'make-block-symbols-iterator'.

 -- Scheme Procedure: lookup-block pc
     Return the innermost '<gdb:block>' containing the given PC value.
     If the block cannot be found for the PC value specified, the
     function will return '#f'.


File: gdb.info,  Node: Symbols In Guile,  Next: Symbol Tables In Guile,  Prev: Blocks In Guile,  Up: Guile API

23.3.3.17 Guile representation of Symbols.
..........................................

GDB represents every variable, function and type as an entry in a symbol
table.  *Note Examining the Symbol Table: Symbols.  Guile represents
these symbols in GDB with the '<gdb:symbol>' object.

   The following symbol-related procedures are provided by the '(gdb)'
module:

 -- Scheme Procedure: symbol? object
     Return '#t' if OBJECT is an object of type '<gdb:symbol>'.
     Otherwise return '#f'.

 -- Scheme Procedure: symbol-valid? symbol
     Return '#t' if the '<gdb:symbol>' object is valid, '#f' 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>'
     procedures will throw an exception if it is invalid at the time the
     procedure is called.

 -- Scheme Procedure: symbol-type symbol
     Return the type of SYMBOL or '#f' if no type is recorded.  The
     result is an object of type '<gdb:type>'.  *Note Types In Guile::.

 -- Scheme Procedure: symbol-symtab symbol
     Return the symbol table in which SYMBOL appears.  The result is an
     object of type '<gdb:symtab>'.  *Note Symbol Tables In Guile::.

 -- Scheme Procedure: symbol-line symbol
     Return the line number in the source code at which SYMBOL was
     defined.  This is an integer.

 -- Scheme Procedure: symbol-name symbol
     Return the name of SYMBOL as a string.

 -- Scheme Procedure: symbol-linkage-name symbol
     Return the name of SYMBOL, as used by the linker (i.e., may be
     mangled).

 -- Scheme Procedure: symbol-print-name symbol
     Return the name of 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.

 -- Scheme Procedure: symbol-addr-class symbol
     Return 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.

 -- Scheme Procedure: symbol-needs-frame? symbol
     Return '#t' if evaluating SYMBOL's value requires a frame (*note
     Frames In Guile::) and '#f' otherwise.  Typically, local variables
     will require a frame, but other symbols will not.

 -- Scheme Procedure: symbol-argument? symbol
     Return '#t' if SYMBOL is an argument of a function.  Otherwise
     return '#f'.

 -- Scheme Procedure: symbol-constant? symbol
     Return '#t' if SYMBOL is a constant.  Otherwise return '#f'.

 -- Scheme Procedure: symbol-function? symbol
     Return '#t' if SYMBOL is a function or a method.  Otherwise return
     '#f'.

 -- Scheme Procedure: symbol-variable? symbol
     Return '#t' if SYMBOL is a variable.  Otherwise return '#f'.

 -- Scheme Procedure: symbol-value symbol [#:frame frame]
     Compute the value of SYMBOL, as a '<gdb:value>'.  For functions,
     this computes the address of the function, cast to the appropriate
     type.  If the symbol requires a frame in order to compute its
     value, then FRAME must be given.  If FRAME is not given, or if
     FRAME is invalid, then an exception is thrown.

 -- Scheme Procedure: lookup-symbol name [#:block block] [#:domain
          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 list of two elements.  The first element is a
     '<gdb:symbol>' object or '#f' if the symbol is not found.  If the
     symbol is found, the second element is '#t' if the symbol is a
     field of a method's object (e.g., 'this' in C++), otherwise it is
     '#f'.  If the symbol is not found, the second element is '#f'.

 -- Scheme Procedure: lookup-global-symbol name [#:domain domain]
     This function searches for a global symbol by name.  The search
     scope can be restricted 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 '#f' if the symbol is not
     found.

   The available domain categories in '<gdb:symbol>' are represented as
constants in the '(gdb)' module:

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

'SYMBOL_VAR_DOMAIN'
     This domain contains variables, function names, typedef names and
     enum type values.

'SYMBOL_STRUCT_DOMAIN'
     This domain holds struct, union and enum type names.

'SYMBOL_LABEL_DOMAIN'
     This domain contains names of labels (for gotos).

'SYMBOL_VARIABLES_DOMAIN'
     This domain holds a subset of the 'SYMBOLS_VAR_DOMAIN'; it contains
     everything minus functions and types.

'SYMBOL_FUNCTION_DOMAIN'
     This domain contains all functions.

'SYMBOL_TYPES_DOMAIN'
     This domain contains all types.

   The available address class categories in '<gdb:symbol>' are
represented as constants in the 'gdb' module:

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

'SYMBOL_LOC_CONST'
     Value is constant int.

'SYMBOL_LOC_STATIC'
     Value is at a fixed address.

'SYMBOL_LOC_REGISTER'
     Value is in a register.

'SYMBOL_LOC_ARG'
     Value is an argument.  This value is at the offset stored within
     the symbol inside the frame's argument list.

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

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

'SYMBOL_LOC_LOCAL'
     Value is a local variable.

'SYMBOL_LOC_TYPEDEF'
     Value not used.  Symbols in the domain 'SYMBOL_STRUCT_DOMAIN' all
     have this class.

'SYMBOL_LOC_BLOCK'
     Value is a block.

'SYMBOL_LOC_CONST_BYTES'
     Value is a byte-sequence.

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

'SYMBOL_LOC_OPTIMIZED_OUT'
     The value does not actually exist in the program.

'SYMBOL_LOC_COMPUTED'
     The value's address is a computed location.


File: gdb.info,  Node: Symbol Tables In Guile,  Next: Breakpoints In Guile,  Prev: Symbols In Guile,  Up: Guile API

23.3.3.18 Symbol table representation in Guile.
...............................................

Access to symbol table data maintained by GDB on the inferior is exposed
to Guile via two objects: '<gdb:sal>' (symtab-and-line) and
'<gdb:symtab>'.  Symbol table and line data for a frame is returned from
the 'frame-find-sal' '<gdb:frame>' procedure.  *Note Frames In Guile::.

   For more information on GDB's symbol table management, see *note
Examining the Symbol Table: Symbols.

   The following symtab-related procedures are provided by the '(gdb)'
module:

 -- Scheme Procedure: symtab? object
     Return '#t' if OBJECT is an object of type '<gdb:symtab>'.
     Otherwise return '#f'.

 -- Scheme Procedure: symtab-valid? symtab
     Return '#t' if the '<gdb:symtab>' object is valid, '#f' if not.  A
     '<gdb:symtab>' object becomes invalid when the symbol table it
     refers to no longer exists in GDB.  All other '<gdb:symtab>'
     procedures will throw an exception if it is invalid at the time the
     procedure is called.

 -- Scheme Procedure: symtab-filename symtab
     Return the symbol table's source filename.

 -- Scheme Procedure: symtab-fullname symtab
     Return the symbol table's source absolute file name.

 -- Scheme Procedure: symtab-objfile symtab
     Return the symbol table's backing object file.  *Note Objfiles In
     Guile::.

 -- Scheme Procedure: symtab-global-block symtab
     Return the global block of the underlying symbol table.  *Note
     Blocks In Guile::.

 -- Scheme Procedure: symtab-static-block symtab
     Return the static block of the underlying symbol table.  *Note
     Blocks In Guile::.

   The following symtab-and-line-related procedures are provided by the
'(gdb)' module:

 -- Scheme Procedure: sal? object
     Return '#t' if OBJECT is an object of type '<gdb:sal>'.  Otherwise
     return '#f'.

 -- Scheme Procedure: sal-valid? sal
     Return '#t' if SAL is valid, '#f' if not.  A '<gdb:sal>' object
     becomes invalid when the Symbol table object it refers to no longer
     exists in GDB.  All other '<gdb:sal>' procedures will throw an
     exception if it is invalid at the time the procedure is called.

 -- Scheme Procedure: sal-symtab sal
     Return the symbol table object ('<gdb:symtab>') for SAL.

 -- Scheme Procedure: sal-line sal
     Return the line number for SAL.

 -- Scheme Procedure: sal-pc sal
     Return the start of the address range occupied by code for SAL.

 -- Scheme Procedure: sal-last sal
     Return the end of the address range occupied by code for SAL.

 -- Scheme Procedure: find-pc-line pc
     Return the '<gdb:sal>' object corresponding to the PC value.  If an
     invalid value of PC is passed as an argument, then the 'symtab' and
     'line' attributes of the returned '<gdb:sal>' object will be '#f'
     and 0 respectively.


File: gdb.info,  Node: Breakpoints In Guile,  Next: Lazy Strings In Guile,  Prev: Symbol Tables In Guile,  Up: Guile API

23.3.3.19 Manipulating breakpoints using Guile
..............................................

Breakpoints in Guile are represented by objects of type
'<gdb:breakpoint>'.  New breakpoints can be created with the
'make-breakpoint' Guile function, and then added to GDB with the
'register-breakpoint!' Guile function.  This two-step approach is taken
to separate out the side-effect of adding the breakpoint to GDB from
'make-breakpoint'.

   Support is also provided to view and manipulate breakpoints created
outside of Guile.

   The following breakpoint-related procedures are provided by the
'(gdb)' module:

 -- Scheme Procedure: make-breakpoint location [#:type type] [#:wp-class
          wp-class] [#:internal internal]
     Create a new breakpoint at LOCATION, 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 breakpoint is initially marked as 'invalid'.  The breakpoint is
     not usable until it has been registered with GDB with
     'register-breakpoint!', at which point it becomes 'valid'.  The
     result is the '<gdb:breakpoint>' object representing the
     breakpoint.

     The optional TYPE denotes the breakpoint to create.  This argument
     can be either 'BP_BREAKPOINT' or 'BP_WATCHPOINT', and defaults to
     'BP_BREAKPOINT'.

     The optional WP-CLASS argument defines the class of watchpoint to
     create, if TYPE is 'BP_WATCHPOINT'.  If a watchpoint class is not
     provided, it is assumed to be a 'WP_WRITE' class.

     The optional INTERNAL argument allows the breakpoint to become
     invisible to the user.  The breakpoint will neither be reported
     when registered, nor will it be listed in the output from 'info
     breakpoints' (but will be listed with the 'maint info breakpoints'
     command).  If an internal flag is not provided, the breakpoint is
     visible (non-internal).

     When a watchpoint is created, GDB will try to create a hardware
     assisted watchpoint.  If successful, the type of the watchpoint is
     changed from 'BP_WATCHPOINT' to 'BP_HARDWARE_WATCHPOINT' for
     'WP_WRITE', 'BP_READ_WATCHPOINT' for 'WP_READ', and
     'BP_ACCESS_WATCHPOINT' for 'WP_ACCESS'.  If not successful, the
     type of the watchpoint is left as 'WP_WATCHPOINT'.

     The available types are represented by constants defined in the
     'gdb' module:

     'BP_BREAKPOINT'
          Normal code breakpoint.

     'BP_WATCHPOINT'
          Watchpoint breakpoint.

     'BP_HARDWARE_WATCHPOINT'
          Hardware assisted watchpoint.  This value cannot be specified
          when creating the breakpoint.

     'BP_READ_WATCHPOINT'
          Hardware assisted read watchpoint.  This value cannot be
          specified when creating the breakpoint.

     'BP_ACCESS_WATCHPOINT'
          Hardware assisted access watchpoint.  This value cannot be
          specified when creating the breakpoint.

     The available watchpoint types represented by constants are defined
     in the '(gdb)' module:

     'WP_READ'
          Read only watchpoint.

     'WP_WRITE'
          Write only watchpoint.

     'WP_ACCESS'
          Read/Write watchpoint.

 -- Scheme Procedure: register-breakpoint! breakpoint
     Add BREAKPOINT, a '<gdb:breakpoint>' object, to GDB's list of
     breakpoints.  The breakpoint must have been created with
     'make-breakpoint'.  One cannot register breakpoints that have been
     created outside of Guile.  Once a breakpoint is registered it
     becomes 'valid'.  It is an error to register an already registered
     breakpoint.  The result is unspecified.

 -- Scheme Procedure: delete-breakpoint! breakpoint
     Remove BREAKPOINT from GDB's list of breakpoints.  This also
     invalidates the Guile BREAKPOINT object.  Any further attempt to
     access the object will throw an exception.

     If BREAKPOINT was created from Guile with 'make-breakpoint' it may
     be re-registered with GDB, in which case the breakpoint becomes
     valid again.

 -- Scheme Procedure: breakpoints
     Return a list of all breakpoints.  Each element of the list is a
     '<gdb:breakpoint>' object.

 -- Scheme Procedure: breakpoint? object
     Return '#t' if OBJECT is a '<gdb:breakpoint>' object, and '#f'
     otherwise.

 -- Scheme Procedure: breakpoint-valid? breakpoint
     Return '#t' if BREAKPOINT is valid, '#f' otherwise.  Breakpoints
     created with 'make-breakpoint' are marked as invalid until they are
     registered with GDB with 'register-breakpoint!'.  A
     '<gdb: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.

 -- Scheme Procedure: breakpoint-number breakpoint
     Return the breakpoint's number -- the identifier used by the user
     to manipulate the breakpoint.

 -- Scheme Procedure: breakpoint-type breakpoint
     Return the breakpoint's type -- the identifier used to determine
     the actual breakpoint type or use-case.

 -- Scheme Procedure: breakpoint-visible? breakpoint
     Return '#t' if the breakpoint is visible to the user when hit, or
     when the 'info breakpoints' command is run.  Otherwise return '#f'.

 -- Scheme Procedure: breakpoint-location breakpoint
     Return 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) return '#f'.

 -- Scheme Procedure: breakpoint-expression breakpoint
     Return the 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) return '#f'.

 -- Scheme Procedure: breakpoint-enabled? breakpoint
     Return '#t' if the breakpoint is enabled, and '#f' otherwise.

 -- Scheme Procedure: set-breakpoint-enabled! breakpoint flag
     Set the enabled state of BREAKPOINT to FLAG.  If flag is '#f' it is
     disabled, otherwise it is enabled.

 -- Scheme Procedure: breakpoint-silent? breakpoint
     Return '#t' if the breakpoint is silent, and '#f' otherwise.

     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.

 -- Scheme Procedure: set-breakpoint-silent! breakpoint flag
     Set the silent state of BREAKPOINT to FLAG.  If flag is '#f' the
     breakpoint is made silent, otherwise it is made non-silent (or
     noisy).

 -- Scheme Procedure: breakpoint-ignore-count breakpoint
     Return the ignore count for BREAKPOINT.

 -- Scheme Procedure: set-breakpoint-ignore-count! breakpoint count
     Set the ignore count for BREAKPOINT to COUNT.

 -- Scheme Procedure: breakpoint-hit-count breakpoint
     Return hit count of BREAKPOINT.

 -- Scheme Procedure: set-breakpoint-hit-count! breakpoint count
     Set the hit count of BREAKPOINT to COUNT.  At present, COUNT must
     be zero.

 -- Scheme Procedure: breakpoint-thread breakpoint
     Return the thread-id for thread-specific breakpoint BREAKPOINT.
     Return #f if BREAKPOINT is not thread-specific.

 -- Scheme Procedure: set-breakpoint-thread! breakpoint thread-id|#f
     Set the thread-id for BREAKPOINT to THREAD-ID.  If set to '#f', the
     breakpoint is no longer thread-specific.

 -- Scheme Procedure: breakpoint-task breakpoint
     If the breakpoint is Ada task-specific, return the Ada task id.  If
     the breakpoint is not task-specific (or the underlying language is
     not Ada), return '#f'.

 -- Scheme Procedure: set-breakpoint-task! breakpoint task
     Set the Ada task of BREAKPOINT to TASK.  If set to '#f', the
     breakpoint is no longer task-specific.

 -- Scheme Procedure: breakpoint-condition breakpoint
     Return the condition of BREAKPOINT, as specified by the user.  It
     is a string.  If there is no condition, return '#f'.

 -- Scheme Procedure: set-breakpoint-condition! breakpoint condition
     Set the condition of BREAKPOINT to CONDITION, which must be a
     string.  If set to '#f' then the breakpoint becomes unconditional.

 -- Scheme Procedure: breakpoint-stop breakpoint
     Return the stop predicate of BREAKPOINT.  See
     'set-breakpoint-stop!' below in this section.

 -- Scheme Procedure: set-breakpoint-stop! breakpoint procedure|#f
     Set the stop predicate of BREAKPOINT.  The predicate PROCEDURE
     takes one argument: the <gdb:breakpoint> object.  If this predicate
     is set to a procedure then it is invoked whenever the inferior
     reaches this breakpoint.  If it returns '#t', or any non-'#f'
     value, then the inferior is stopped, otherwise the inferior will
     continue.

     If there are multiple breakpoints at the same location with a
     'stop' predicate, each one will be called regardless of the return
     status of the previous.  This ensures that all 'stop' predicates
     have a chance to execute at that location.  In this scenario if one
     of the methods returns '#t' but the others return '#f', 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:

          (define (my-stop? bkpt)
            (let ((int-val (parse-and-eval "foo")))
              (value=? int-val 3)))
          (define bkpt (make-breakpoint "main.c:42"))
          (register-breakpoint! bkpt)
          (set-breakpoint-stop! bkpt my-stop?)

 -- Scheme Procedure: breakpoint-commands breakpoint
     Return the commands attached to BREAKPOINT as a string, or '#f' if
     there are none.


File: gdb.info,  Node: Lazy Strings In Guile,  Next: Architectures In Guile,  Prev: Breakpoints In Guile,  Up: Guile API

23.3.3.20 Guile representation of lazy strings.
...............................................

A "lazy string" is a string whose contents is not retrieved or encoded
until it is needed.

   A '<gdb:lazy-string>' 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:lazy-string>' and a string wrapped within a '<gdb:value>' is that
a '<gdb:lazy-string>' will be treated differently by GDB when printing.
A '<gdb:lazy-string>' is retrieved and encoded during printing, while a
'<gdb:value>' wrapping a string is immediately retrieved and encoded on
creation.

   The following lazy-string-related procedures are provided by the
'(gdb)' module:

 -- Scheme Procedure: lazy-string? object
     Return '#t' if OBJECT is an object of type '<gdb:lazy-string>'.
     Otherwise return '#f'.

 -- Scheme Procedure: lazy-string-address lazy-sring
     Return the address of LAZY-STRING.

 -- Scheme Procedure: lazy-string-length lazy-string
     Return the length of LAZY-STRING in characters.  If the length is
     -1, then the string will be fetched and encoded up to the first
     null of appropriate width.

 -- Scheme Procedure: lazy-string-encoding lazy-string
     Return the encoding that will be applied to LAZY-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.

 -- Scheme Procedure: lazy-string-type lazy-string
     Return the type that is represented by 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 'type-target-type'.  *Note
     Types In Guile::.

 -- Scheme Procedure: lazy-string->value lazy-string
     Convert the '<gdb:lazy-string>' 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:lazy-string>'.


File: gdb.info,  Node: Architectures In Guile,  Next: Disassembly In Guile,  Prev: Lazy Strings In Guile,  Up: Guile API

23.3.3.21 Guile representation of architectures
...............................................

GDB uses architecture specific parameters and artifacts in a number of
its various computations.  An architecture is represented by an instance
of the '<gdb:arch>' class.

   The following architecture-related procedures are provided by the
'(gdb)' module:

 -- Scheme Procedure: arch? object
     Return '#t' if OBJECT is an object of type '<gdb:arch>'.  Otherwise
     return '#f'.

 -- Scheme Procedure: current-arch
     Return the current architecture as a '<gdb:arch>' object.

 -- Scheme Procedure: arch-name arch
     Return the name (string value) of '<gdb:arch>' ARCH.

 -- Scheme Procedure: arch-charset arch
     Return name of target character set of '<gdb:arch>' ARCH.

 -- Scheme Procedure: arch-wide-charset
     Return name of target wide character set of '<gdb:arch>' ARCH.

   Each architecture provides a set of predefined types, obtained by the
following functions.

 -- Scheme Procedure: arch-void-type arch
     Return the '<gdb:type>' object for a 'void' type of architecture
     ARCH.

 -- Scheme Procedure: arch-char-type arch
     Return the '<gdb:type>' object for a 'char' type of architecture
     ARCH.

 -- Scheme Procedure: arch-short-type arch
     Return the '<gdb:type>' object for a 'short' type of architecture
     ARCH.

 -- Scheme Procedure: arch-int-type arch
     Return the '<gdb:type>' object for an 'int' type of architecture
     ARCH.

 -- Scheme Procedure: arch-long-type arch
     Return the '<gdb:type>' object for a 'long' type of architecture
     ARCH.

 -- Scheme Procedure: arch-schar-type arch
     Return the '<gdb:type>' object for a 'signed char' type of
     architecture ARCH.

 -- Scheme Procedure: arch-uchar-type arch
     Return the '<gdb:type>' object for an 'unsigned char' type of
     architecture ARCH.

 -- Scheme Procedure: arch-ushort-type arch
     Return the '<gdb:type>' object for an 'unsigned short' type of
     architecture ARCH.

 -- Scheme Procedure: arch-uint-type arch
     Return the '<gdb:type>' object for an 'unsigned int' type of
     architecture ARCH.

 -- Scheme Procedure: arch-ulong-type arch
     Return the '<gdb:type>' object for an 'unsigned long' type of
     architecture ARCH.

 -- Scheme Procedure: arch-float-type arch
     Return the '<gdb:type>' object for a 'float' type of architecture
     ARCH.

 -- Scheme Procedure: arch-double-type arch
     Return the '<gdb:type>' object for a 'double' type of architecture
     ARCH.

 -- Scheme Procedure: arch-longdouble-type arch
     Return the '<gdb:type>' object for a 'long double' type of
     architecture ARCH.

 -- Scheme Procedure: arch-bool-type arch
     Return the '<gdb:type>' object for a 'bool' type of architecture
     ARCH.

 -- Scheme Procedure: arch-longlong-type arch
     Return the '<gdb:type>' object for a 'long long' type of
     architecture ARCH.

 -- Scheme Procedure: arch-ulonglong-type arch
     Return the '<gdb:type>' object for an 'unsigned long long' type of
     architecture ARCH.

 -- Scheme Procedure: arch-int8-type arch
     Return the '<gdb:type>' object for an 'int8' type of architecture
     ARCH.

 -- Scheme Procedure: arch-uint8-type arch
     Return the '<gdb:type>' object for a 'uint8' type of architecture
     ARCH.

 -- Scheme Procedure: arch-int16-type arch
     Return the '<gdb:type>' object for an 'int16' type of architecture
     ARCH.

 -- Scheme Procedure: arch-uint16-type arch
     Return the '<gdb:type>' object for a 'uint16' type of architecture
     ARCH.

 -- Scheme Procedure: arch-int32-type arch
     Return the '<gdb:type>' object for an 'int32' type of architecture
     ARCH.

 -- Scheme Procedure: arch-uint32-type arch
     Return the '<gdb:type>' object for a 'uint32' type of architecture
     ARCH.

 -- Scheme Procedure: arch-int64-type arch
     Return the '<gdb:type>' object for an 'int64' type of architecture
     ARCH.

 -- Scheme Procedure: arch-uint64-type arch
     Return the '<gdb:type>' object for a 'uint64' type of architecture
     ARCH.

   Example:

     (gdb) guile (type-name (arch-uchar-type (current-arch)))
     "unsigned char"


File: gdb.info,  Node: Disassembly In Guile,  Next: I/O Ports in Guile,  Prev: Architectures In Guile,  Up: Guile API

23.3.3.22 Disassembly In Guile
..............................

The disassembler can be invoked from Scheme code.  Furthermore, the
disassembler can take a Guile port as input, allowing one to disassemble
from any source, and not just target memory.

 -- Scheme Procedure: arch-disassemble arch start-pc [#:port port]
          [#:offset offset] [#:size size] [#:count count]
     Return a list of disassembled instructions starting from the memory
     address START-PC.

     The optional argument PORT specifies the input port to read bytes
     from.  If PORT is '#f' then bytes are read from target memory.

     The optional argument OFFSET specifies the address offset of the
     first byte in PORT.  This is useful, for example, when PORT
     specifies a 'bytevector' and you want the bytevector to be
     disassembled as if it came from that address.  The START-PC passed
     to the reader for PORT is offset by the same amount.

     Example:
          (gdb) guile (use-modules (rnrs io ports))
          (gdb) guile (define pc (value->integer (parse-and-eval "$pc")))
          (gdb) guile (define mem (open-memory #:start pc))
          (gdb) guile (define bv (get-bytevector-n mem 10))
          (gdb) guile (define bv-port (open-bytevector-input-port bv))
          (gdb) guile (define arch (current-arch))
          (gdb) guile (arch-disassemble arch pc #:port bv-port #:offset pc)
          (((address . 4195516) (asm . "mov    $0x4005c8,%edi") (length . 5)))

     The optional arguments SIZE and COUNT determine the number of
     instructions in the returned list.  If either SIZE or COUNT is
     specified as zero, then no instructions are disassembled and an
     empty list is returned.  If both the optional arguments SIZE and
     COUNT are specified, then a list of at most COUNT disassembled
     instructions whose start address falls in the closed memory address
     interval from START-PC to (START-PC + SIZE - 1) are returned.  If
     SIZE is not specified, but COUNT is specified, then COUNT number of
     instructions starting from the address START-PC are returned.  If
     COUNT is not specified but SIZE is specified, then all instructions
     whose start address falls in the closed memory address interval
     from START-PC to (START-PC + SIZE - 1) are returned.  If neither
     SIZE nor COUNT are specified, then a single instruction at START-PC
     is returned.

     Each element of the returned list is an alist (associative list)
     with the following keys:

     'address'
          The value corresponding to this key is a Guile integer of the
          memory address of the instruction.

     'asm'
          The value corresponding to this key is a string value which
          represents the instruction with assembly language mnemonics.
          The assembly language flavor used is the same as that
          specified by the current CLI variable 'disassembly-flavor'.
          *Note Machine Code::.

     'length'
          The value corresponding to this key is the length of the
          instruction in bytes.


File: gdb.info,  Node: I/O Ports in Guile,  Next: Memory Ports in Guile,  Prev: Disassembly In Guile,  Up: Guile API

23.3.3.23 I/O Ports in Guile
............................

 -- Scheme Procedure: input-port
     Return GDB's input port as a Guile port object.

 -- Scheme Procedure: output-port
     Return GDB's output port as a Guile port object.

 -- Scheme Procedure: error-port
     Return GDB's error port as a Guile port object.

 -- Scheme Procedure: stdio-port? object
     Return '#t' if OBJECT is a GDB stdio port.  Otherwise return '#f'.


File: gdb.info,  Node: Memory Ports in Guile,  Next: Iterators In Guile,  Prev: I/O Ports in Guile,  Up: Guile API

23.3.3.24 Memory Ports in Guile
...............................

GDB provides a 'port' interface to target memory.  This allows Guile
code to read/write target memory using Guile's port and bytevector
functionality.  The main routine is 'open-memory' which returns a port
object.  One can then read/write memory using that object.

 -- Scheme Procedure: open-memory [#:mode mode] [#:start address]
          [#:size size]
     Return a port object that can be used for reading and writing
     memory.  The port will be open according to MODE, which is the
     standard mode argument to Guile port open routines, except that the
     '"a"' and '"l"' modes are not supported.  *Note (guile)File
     Ports::.  The '"b"' (binary) character may be present, but is
     ignored: memory ports are binary only.  If '"0"' is appended then
     the port is marked as unbuffered.  The default is '"r"', read-only
     and buffered.

     The chunk of memory that can be accessed can be bounded.  If both
     START and SIZE are unspecified, all of memory can be accessed.  If
     only START is specified, all of memory from that point on can be
     accessed.  If only SIZE if specified, all memory in the range
     [0,SIZE) can be accessed.  If both are specified, all memory in the
     rane [START,START+SIZE) can be accessed.

 -- Scheme Procedure: memory-port?
     Return '#t' if OBJECT is an object of type '<gdb:memory-port>'.
     Otherwise return '#f'.

 -- Scheme Procedure: memory-port-range memory-port
     Return the range of '<gdb:memory-port>' MEMORY-PORT as a list of
     two elements: '(start end)'.  The range is START to END inclusive.

 -- Scheme Procedure: memory-port-read-buffer-size memory-port
     Return the size of the read buffer of '<gdb:memory-port>'
     MEMORY-PORT.

 -- Scheme Procedure: set-memory-port-read-buffer-size! memory-port size
     Set the size of the read buffer of '<gdb:memory-port>' MEMORY-PORT
     to SIZE.  The result is unspecified.

 -- Scheme Procedure: memory-port-write-buffer-size memory-port
     Return the size of the write buffer of '<gdb:memory-port>'
     MEMORY-PORT.

 -- Scheme Procedure: set-memory-port-write-buffer-size! memory-port
          size
     Set the size of the write buffer of '<gdb:memory-port>' MEMORY-PORT
     to SIZE.  The result is unspecified.

   A memory port is closed like any other port, with 'close-port'.

   Combined with Guile's 'bytevectors', memory ports provide a lot of
utility.  For example, to fill a buffer of 10 integers in memory, one
can do something like the following.

     ;; In the program: int buffer[10];
     (use-modules (rnrs bytevectors))
     (use-modules (rnrs io ports))
     (define addr (parse-and-eval "buffer"))
     (define n 10)
     (define byte-size (* n 4))
     (define mem-port (open-memory #:mode "r+" #:start
                                   (value->integer addr) #:size byte-size))
     (define byte-vec (make-bytevector byte-size))
     (do ((i 0 (+ i 1)))
         ((>= i n))
         (bytevector-s32-native-set! byte-vec (* i 4) (* i 42)))
     (put-bytevector mem-port byte-vec)
     (close-port mem-port)


File: gdb.info,  Node: Iterators In Guile,  Prev: Memory Ports in Guile,  Up: Guile API

23.3.3.25 Iterators In Guile
............................

A simple iterator facility is provided to allow, for example, iterating
over the set of program symbols without having to first construct a list
of all of them.  A useful contribution would be to add support for SRFI
41 and SRFI 45.

 -- Scheme Procedure: make-iterator object progress next!
     A '<gdb:iterator>' object is constructed with the 'make-iterator'
     procedure.  It takes three arguments: the object to be iterated
     over, an object to record the progress of the iteration, and a
     procedure to return the next element in the iteration, or an
     implementation chosen value to denote the end of iteration.

     By convention, end of iteration is marked with
     '(end-of-iteration)', and may be tested with the
     'end-of-iteration?' predicate.  The result of '(end-of-iteration)'
     is chosen so that it is not otherwise used by the '(gdb)' module.
     If you are using '<gdb:iterator>' in your own code it is your
     responsibility to maintain this invariant.

     A trivial example for illustration's sake:

          (use-modules (gdb iterator))
          (define my-list (list 1 2 3))
          (define iter
            (make-iterator my-list my-list
                           (lambda (iter)
                             (let ((l (iterator-progress iter)))
                               (if (eq? l '())
                                   (end-of-iteration)
                                   (begin
                                     (set-iterator-progress! iter (cdr l))
                                     (car l)))))))

     Here is a slightly more realistic example, which computes a list of
     all the functions in 'my-global-block'.

          (use-modules (gdb iterator))
          (define this-sal (find-pc-line (frame-pc (selected-frame))))
          (define this-symtab (sal-symtab this-sal))
          (define this-global-block (symtab-global-block this-symtab))
          (define syms-iter (make-block-symbols-iterator this-global-block))
          (define functions (iterator-filter symbol-function? syms-iter))

 -- Scheme Procedure: iterator? object
     Return '#t' if OBJECT is a '<gdb:iterator>' object.  Otherwise
     return '#f'.

 -- Scheme Procedure: iterator-object iterator
     Return the first argument that was passed to 'make-iterator'.  This
     is the object being iterated over.

 -- Scheme Procedure: iterator-progress iterator
     Return the object tracking iteration progress.

 -- Scheme Procedure: set-iterator-progress! iterator new-value
     Set the object tracking iteration progress.

 -- Scheme Procedure: iterator-next! iterator
     Invoke the procedure that was the third argument to
     'make-iterator', passing it one argument, the '<gdb:iterator>'
     object.  The result is either the next element in the iteration, or
     an end marker as implemented by the 'next!' procedure.  By
     convention the end marker is the result of '(end-of-iteration)'.

 -- Scheme Procedure: end-of-iteration
     Return the Scheme object that denotes end of iteration.

 -- Scheme Procedure: end-of-iteration? object
     Return '#t' if OBJECT is the end of iteration marker.  Otherwise
     return '#f'.

   These functions are provided by the '(gdb iterator)' module to assist
in using iterators.

 -- Scheme Procedure: make-list-iterator list
     Return a '<gdb:iterator>' object that will iterate over LIST.

 -- Scheme Procedure: iterator->list iterator
     Return the elements pointed to by ITERATOR as a list.

 -- Scheme Procedure: iterator-map proc iterator
     Return the list of objects obtained by applying PROC to the object
     pointed to by ITERATOR and to each subsequent object.

 -- Scheme Procedure: iterator-for-each proc iterator
     Apply PROC to each element pointed to by ITERATOR.  The result is
     unspecified.

 -- Scheme Procedure: iterator-filter pred iterator
     Return the list of elements pointed to by ITERATOR that satisfy
     PRED.

 -- Scheme Procedure: iterator-until pred iterator
     Run ITERATOR until the result of '(pred element)' is true and
     return that as the result.  Otherwise return '#f'.


File: gdb.info,  Node: Guile Auto-loading,  Next: Guile Modules,  Prev: Guile API,  Up: Guile

23.3.4 Guile 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
Guile support scripts in two ways: 'OBJFILE-gdb.scm' and the
'.debug_gdb_scripts' section.  *Note Auto-loading extensions::.

   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 guile-scripts [on|off]'
     Enable or disable the auto-loading of Guile scripts.

'show auto-load guile-scripts'
     Show whether auto-loading of Guile scripts is enabled or disabled.

'info auto-load guile-scripts [REGEXP]'
     Print the list of all Guile scripts that GDB auto-loaded.

     Also printed is the list of Guile scripts that were mentioned in
     the '.debug_gdb_scripts' section and were not found.  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 Guile scripts with matching names are
     printed.

     Example:

          (gdb) info auto-load guile-scripts
          Loaded Script
          Yes    scm-section-script.scm
                 full name: /tmp/scm-section-script.scm
          No     my-foo-pretty-printers.scm

   When reading an auto-loaded file, GDB sets the "current objfile".
This is available via the 'current-objfile' procedure (*note Objfiles In
Guile::).  This can be useful for registering objfile-specific
pretty-printers.


File: gdb.info,  Node: Guile Modules,  Prev: Guile Auto-loading,  Up: Guile

23.3.5 Guile Modules
--------------------

GDB comes with several modules to assist writing Guile code.

* Menu:

* Guile Printing Module::  Building and registering pretty-printers
* Guile Types Module::     Utilities for working with types


File: gdb.info,  Node: Guile Printing Module,  Next: Guile Types Module,  Up: Guile Modules

23.3.5.1 Guile Printing Module
..............................

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

   Usage:

     (use-modules (gdb printing))

 -- Scheme Procedure: prepend-pretty-printer! object printer
     Add PRINTER to the front of the list of pretty-printers for OBJECT.
     The OBJECT must either be a '<gdb:objfile>' object, or '#f' in
     which case PRINTER is added to the global list of printers.

 -- Scheme Procecure: append-pretty-printer! object printer
     Add PRINTER to the end of the list of pretty-printers for OBJECT.
     The OBJECT must either be a '<gdb:objfile>' object, or '#f' in
     which case PRINTER is added to the global list of printers.


File: gdb.info,  Node: Guile Types Module,  Prev: Guile Printing Module,  Up: Guile Modules

23.3.5.2 Guile Types Module
...........................

This module provides a collection of utilities for working with
'<gdb:type>' objects.

   Usage:

     (use-modules (gdb types))

 -- Scheme Procedure: 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) guile (use-modules (gdb) (gdb types))
          (gdb) guile (define foo-ref (parse-and-eval "foo_ref"))
          (gdb) guile (get-basic-type (value-type foo-ref))
          int

 -- Scheme Procedure: type-has-field-deep? type field
     Return '#t' if TYPE, assumed to be a type with fields (e.g., a
     structure or union), has field FIELD.  Otherwise return '#f'.  This
     searches baseclasses, whereas 'type-has-field?' does not.

 -- Scheme Procedure: make-enum-hashtable enum-type
     Return a Guile hash table produced from ENUM-TYPE.  Elements in the
     hash table are referenced with 'hashq-ref'.


File: gdb.info,  Node: Auto-loading extensions,  Next: Multiple Extension Languages,  Prev: Guile,  Up: Extending GDB

23.4 Auto-loading extensions
============================

GDB provides two mechanisms for automatically loading extensions when a
new object file is read (for example, due to the 'file' command, or
because the inferior has loaded a shared library): 'OBJFILE-gdb.EXT' and
the '.debug_gdb_scripts' section of modern file formats like ELF.

* Menu:

* objfile-gdb.ext file: objfile-gdbdotext file.  The 'OBJFILE-gdb.EXT' file
* .debug_gdb_scripts section: dotdebug_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 features.

   Auto-loading can be enabled or disabled, and the list of auto-loaded
scripts can be printed.  See the 'auto-loading' section of each
extension language for more information.  For GDB command files see
*note Auto-loading sequences::.  For Python files see *note Python
Auto-loading::.

   Note that loading of this script file also requires accordingly
configured 'auto-load safe-path' (*note Auto-loading safe path::).


File: gdb.info,  Node: objfile-gdbdotext file,  Next: dotdebug_gdb_scripts section,  Up: Auto-loading extensions

23.4.1 The 'OBJFILE-gdb.EXT' file
---------------------------------

When a new object file is read, GDB looks for a file named
'OBJFILE-gdb.EXT' (we call it SCRIPT-NAME below), where OBJFILE is the
object file's name and where EXT is the file extension for the extension
language:

'OBJFILE-gdb.gdb'
     GDB's own command language
'OBJFILE-gdb.py'
     Python
'OBJFILE-gdb.scm'
     Guile

   SCRIPT-NAME is formed by ensuring that the file name of OBJFILE is
absolute, following all symlinks, and resolving '.' and '..' components,
and appending the '-gdb.EXT' suffix.  If this file exists and is
readable, GDB will evaluate it as a script in the specified extension
language.

   If this file does not exist, then GDB will look for SCRIPT-NAME file
in all of the directories as specified below.

   Note that loading of these files requires an accordingly configured
'auto-load safe-path' (*note Auto-loading safe path::).

   For object files using '.exe' suffix GDB tries to load first the
scripts normally according to its '.exe' filename.  But if no scripts
are found GDB also tries script filenames matching the object file
without its '.exe' suffix.  This '.exe' stripping is case insensitive
and it is attempted on any platform.  This makes the script filenames
compatible between Unix and MS-Windows hosts.

'set auto-load scripts-directory [DIRECTORIES]'
     Control GDB auto-loaded scripts location.  Multiple directory
     entries may be delimited by the host platform path separator in use
     (':' on Unix, ';' on MS-Windows and MS-DOS).

     Each entry here needs to be covered also by the security setting
     'set auto-load safe-path' (*note set auto-load safe-path::).

     This variable defaults to '$debugdir:$datadir/auto-load'.  The
     default 'set auto-load safe-path' value can be also overriden by
     GDB configuration option '--with-auto-load-dir'.

     Any reference to '$debugdir' will get replaced by
     DEBUG-FILE-DIRECTORY value (*note Separate Debug Files::) and any
     reference to '$datadir' will get replaced by DATA-DIRECTORY which
     is determined at GDB startup (*note Data Files::).  '$debugdir' and
     '$datadir' must be placed as a directory component -- either alone
     or delimited by '/' or '\' directory separators, depending on the
     host platform.

     The list of directories uses path separator (':' on GNU and Unix
     systems, ';' on MS-Windows and MS-DOS) to separate directories,
     similarly to the 'PATH' environment variable.

'show auto-load scripts-directory'
     Show GDB auto-loaded scripts location.

'add-auto-load-scripts-directory [DIRECTORIES...]'
     Add an entry (or list of entries) to the list of auto-loaded
     scripts locations.  Multiple entries may be delimited by the host
     platform path separator in use.

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


File: gdb.info,  Node: dotdebug_gdb_scripts section,  Next: Which flavor to choose?,  Prev: objfile-gdbdotext file,  Up: Auto-loading extensions

23.4.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
null-terminated entries specifying scripts to load.  Each entry begins
with a non-null prefix byte that specifies the kind of entry, typically
the extension language and whether the script is in a file or inlined in
'.debug_gdb_scripts'.

   The following entries are supported:

'SECTION_SCRIPT_ID_PYTHON_FILE = 1'
'SECTION_SCRIPT_ID_SCHEME_FILE = 3'
'SECTION_SCRIPT_ID_PYTHON_TEXT = 4'
'SECTION_SCRIPT_ID_SCHEME_TEXT = 6'

23.4.2.1 Script File Entries
............................

If the entry specifies a file, GDB will look for the 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.

   File entries can be placed in section '.debug_gdb_scripts' with, for
example, this GCC macro for Python scripts.

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

For Guile scripts, replace '.byte 1' with '.byte 3'.  Then one can
reference the macro in a header or source file like this:

     DEFINE_GDB_PY_SCRIPT ("my-app-scripts.py")

   The script name may include directories if desired.

   Note that loading of this script file also requires accordingly
configured 'auto-load safe-path' (*note Auto-loading safe path::).

   If the macro invocation is put in a header, any application or
library using this header will get a reference to the specified script,
and with the use of '"MS"' attributes on the section, the linker will
remove duplicates.

23.4.2.2 Script Text Entries
............................

Script text entries allow to put the executable script in the entry
itself instead of loading it from a file.  The first line of the entry,
everything after the prefix byte and up to the first newline ('0xa')
character, is the script name, and must not contain any kind of space
character, e.g., spaces or tabs.  The rest of the entry, up to the
trailing null byte, is the script to execute in the specified language.
The name needs to be unique among all script names, as GDB executes each
script only once based on its name.

   Here is an example from file 'py-section-script.c' in the GDB
testsuite.

     #include "symcat.h"
     #include "gdb/section-scripts.h"
     asm(
     ".pushsection \".debug_gdb_scripts\", \"MS\",@progbits,1\n"
     ".byte " XSTRING (SECTION_SCRIPT_ID_PYTHON_TEXT) "\n"
     ".ascii \"gdb.inlined-script\\n\"\n"
     ".ascii \"class test_cmd (gdb.Command):\\n\"\n"
     ".ascii \"  def __init__ (self):\\n\"\n"
     ".ascii \"    super (test_cmd, self).__init__ ("
         "\\\"test-cmd\\\", gdb.COMMAND_OBSCURE)\\n\"\n"
     ".ascii \"  def invoke (self, arg, from_tty):\\n\"\n"
     ".ascii \"    print (\\\"test-cmd output, arg = %s\\\" % arg)\\n\"\n"
     ".ascii \"test_cmd ()\\n\"\n"
     ".byte 0\n"
     ".popsection\n"
     );

   Loading of inlined scripts requires a properly configured 'auto-load
safe-path' (*note Auto-loading safe path::).  The path to specify in
'auto-load safe-path' is the path of the file containing the
'.debug_gdb_scripts' section.


File: gdb.info,  Node: Which flavor to choose?,  Prev: dotdebug_gdb_scripts section,  Up: Auto-loading extensions

23.4.3 Which flavor to choose?
------------------------------

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

Benefits of the '-gdb.EXT' 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.EXT' way require an objfile to
     trigger their loading.  When an application is statically linked
     the only objfile available is the executable, and it is cumbersome
     to attach all the scripts from all the input libraries to the
     executable's '-gdb.EXT' 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.EXT' 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.EXT' 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: Multiple Extension Languages,  Next: Aliases,  Prev: Auto-loading extensions,  Up: Extending GDB

23.5 Multiple Extension Languages
=================================

The Guile and Python extension languages do not share any state, and
generally do not interfere with each other.  There are some things to be
aware of, however.

23.5.1 Python comes first
-------------------------

Python was GDB's first extension language, and to avoid breaking
existing behaviour Python comes first.  This is generally solved by the
"first one wins" principle.  GDB maintains a list of enabled extension
languages, and when it makes a call to an extension language, (say to
pretty-print a value), it tries each in turn until an extension language
indicates it has performed the request (e.g., has returned the
pretty-printed form of a value).  This extends to errors while
performing such requests: If an error happens while, for example, trying
to pretty-print an object then the error is reported and any following
extension languages are not tried.


File: gdb.info,  Node: Aliases,  Prev: Multiple Extension Languages,  Up: Extending GDB

23.6 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 '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 'tui enable' or 'C-x
C-a'.  *Note TUI Commands: TUI Commands, and *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.

'tui enable'
     Activate TUI mode.  The last active TUI window layout will be used
     if TUI mode has prevsiouly been used in the current debugging
     session, otherwise a default layout is used.

'tui disable'
     Disable TUI mode, returning to the console interpreter.

'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 GROUP'
     Changes the register group displayed in the tui register window to
     GROUP.  If the register window is not currently displayed this
     command will cause the register window to be displayed.  The list
     of register groups, as well as their order is target specific.  The
     following groups are available on most targets:
     'next'
          Repeatedly selecting this group will cause the display to
          cycle through all of the available register groups.

     'prev'
          Repeatedly selecting this group will cause the display to
          cycle through all of the available register groups in the
          reverse order to NEXT.

     'general'
          Display the general registers.
     'float'
          Display the floating point registers.
     'system'
          Display the system registers.
     'vector'
          Display the vector registers.
     'all'
          Display all registers.

'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.  The
     NAME parameter can be one of 'src' (the source window), 'cmd' (the
     command window), 'asm' (the disassembly window), or 'regs' (the
     register display window).

'tabset NCHARS'
     Set the width of tab stops to be NCHARS characters.  This setting
     affects the display of TAB characters in the source and assembly
     windows.


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
(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 (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 Catchpoint Commands::
* GDB/MI Program Context::
* GDB/MI Thread Commands::
* GDB/MI Ada Tasking Commands::
* GDB/MI Program Execution::
* GDB/MI Stack Manipulation::
* GDB/MI Variable Objects::
* GDB/MI Data Manipulation::
* GDB/MI Tracepoint Commands::
* GDB/MI Symbol Query::
* GDB/MI File Commands::
* GDB/MI Target Manipulation::
* GDB/MI File Transfer Commands::
* GDB/MI Ada Exceptions Commands::
* GDB/MI Support 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
-------------------------

27.1.1.1 Threads and Frames
...........................

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.

27.1.1.2 Language
.................

The execution of several commands depends on which language is selected.
By default, the current language (*note show language::) is used.  But
for commands known to be language-sensitive, it is recommended to use
the '--language' option.  This option takes one argument, which is the
name of the language to use while executing the command.  For instance:

     -data-evaluate-expression --language c "sizeof (void*)"
     ^done,value="4"
     (gdb)

   The valid language names are the same names accepted by the 'set
language' command (*note Manually::), excluding 'auto', 'local' or
'unknown'.


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 mi-async 1' command,
which should be emitted before either running the executable or
attaching to the target.  After the frontend has started the executable
or attached to the target, it can find if asynchronous execution is
enabled using the '-list-target-features' command.

'-gdb-set mi-async on'
'-gdb-set mi-async off'
     Set whether MI is in asynchronous mode.

     When 'off', which is the default, MI execution commands (e.g.,
     '-exec-continue') are foreground commands, and GDB waits for the
     program to stop before processing further commands.

     When 'on', MI execution commands are background execution commands
     (e.g., '-exec-continue' becomes the equivalent of the 'c&' CLI
     command), and so GDB is capable of processing MI commands even
     while the target is running.

'-gdb-show mi-async'
     Show whether MI asynchronous mode is enabled.

   Note: In GDB version 7.7 and earlier, this option was called
'target-async' instead of 'mi-async', and it had the effect of both
putting MI in asynchronous mode and making CLI background commands
possible.  CLI background commands are now always possible "out of the
box" if the target supports them.  The old spelling is kept as a
deprecated alias for backwards compatibility.

   Even if 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 NL'

'STATUS-ASYNC-OUTPUT ==>'
     '[ TOKEN ] "+" ASYNC-OUTPUT NL'

'NOTIFY-ASYNC-OUTPUT ==>'
     '[ TOKEN ] "=" ASYNC-OUTPUT NL'

'ASYNC-OUTPUT ==>'
     'ASYNC-CLASS ( "," RESULT )*'

'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 NL'

'TARGET-STREAM-OUTPUT ==>'
     '"@" C-STRING NL'

'LOG-STREAM-OUTPUT ==>'
     '"&" C-STRING NL'

'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 Breakpoint Information::
* 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" "," "msg=" C-STRING [ "," "code=" C-STRING ]'
     The operation failed.  The 'msg=C-STRING' variable contains the
     corresponding error message.

     If present, the 'code=C-STRING' variable provides an error code on
     which consumers can rely on to detect the corresponding error
     condition.  At present, only one error code is defined:

     '"undefined-command"'
          Indicates that the command causing the error does not exist.

'"^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 Breakpoint 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 happen when 'stop-on-solib-events' (*note
          Files::) is set or when a 'catch load' or 'catch unload'
          catchpoint is in use (*note Set Catchpoints::).
     '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-return'
          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.  The CODE field 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.

'=traceframe-changed,num=TFNUM,tracepoint=TPNUM'
'=traceframe-changed,end'
     Reports that the trace frame was changed and its new number is
     TFNUM.  The number of the tracepoint associated with this trace
     frame is TPNUM.

'=tsv-created,name=NAME,initial=INITIAL'
     Reports that the new trace state variable NAME is created with
     initial value INITIAL.

'=tsv-deleted,name=NAME'
'=tsv-deleted'
     Reports that the trace state variable NAME is deleted or all trace
     state variables are deleted.

'=tsv-modified,name=NAME,initial=INITIAL[,current=CURRENT]'
     Reports that the trace state variable NAME is modified with the
     initial value INITIAL.  The current value CURRENT of trace state
     variable is optional and is reported if the current value of trace
     state variable is known.

'=breakpoint-created,bkpt={...}'
'=breakpoint-modified,bkpt={...}'
'=breakpoint-deleted,id=NUMBER'
     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::.  The
     NUMBER is the ordinal number of the breakpoint.

     Note that if a breakpoint is emitted in the result record of a
     command, then it will not also be emitted in an async record.

'=record-started,thread-group="ID"'
'=record-stopped,thread-group="ID"'
     Execution log recording was either started or stopped on an
     inferior.  The ID is the GDB identifier of the thread group
     corresponding to the affected inferior.

'=cmd-param-changed,param=PARAM,value=VALUE'
     Reports that a parameter of the command 'set PARAM' is changed to
     VALUE.  In the multi-word 'set' command, the PARAM is the whole
     parameter list to 'set' command.  For example, In command 'set
     check type on', PARAM is 'check type' and VALUE is 'on'.

'=memory-changed,thread-group=ID,addr=ADDR,len=LEN[,type="code"]'
     Reports that bytes from ADDR to DATA + LEN were written in an
     inferior.  The ID is the identifier of the thread group
     corresponding to the affected inferior.  The optional 'type="code"'
     part is reported if the memory written to holds executable code.


File: gdb.info,  Node: GDB/MI Breakpoint Information,  Next: GDB/MI Frame Information,  Prev: GDB/MI Async Records,  Up: GDB/MI Output Records

27.5.4 GDB/MI Breakpoint Information
------------------------------------

When GDB reports information about a breakpoint, a tracepoint, a
watchpoint, or a catchpoint, it uses a tuple with the following fields:

'number'
     The breakpoint number.  For a breakpoint that represents one
     location of a multi-location breakpoint, this will be a dotted
     pair, like '1.2'.

'type'
     The type of the breakpoint.  For ordinary breakpoints this will be
     'breakpoint', but many values are possible.

'catch-type'
     If the type of the breakpoint is 'catchpoint', then this indicates
     the exact type of catchpoint.

'disp'
     This is the breakpoint disposition--either 'del', meaning that the
     breakpoint will be deleted at the next stop, or 'keep', meaning
     that the breakpoint will not be deleted.

'enabled'
     This indicates whether the breakpoint is enabled, in which case the
     value is 'y', or disabled, in which case the value is 'n'.  Note
     that this is not the same as the field 'enable'.

'addr'
     The address of the breakpoint.  This may be a hexidecimal number,
     giving the address; or the string '<PENDING>', for a pending
     breakpoint; or the string '<MULTIPLE>', for a breakpoint with
     multiple locations.  This field will not be present if no address
     can be determined.  For example, a watchpoint does not have an
     address.

'func'
     If known, the function in which the breakpoint appears.  If not
     known, this field is not present.

'filename'
     The name of the source file which contains this function, if known.
     If not known, this field is not present.

'fullname'
     The full file name of the source file which contains this function,
     if known.  If not known, this field is not present.

'line'
     The line number at which this breakpoint appears, if known.  If not
     known, this field is not present.

'at'
     If the source file is not known, this field may be provided.  If
     provided, this holds the address of the breakpoint, possibly
     followed by a symbol name.

'pending'
     If this breakpoint is pending, this field is present and holds the
     text used to set the breakpoint, as entered by the user.

'evaluated-by'
     Where this breakpoint's condition is evaluated, either 'host' or
     'target'.

'thread'
     If this is a thread-specific breakpoint, then this identifies the
     thread in which the breakpoint can trigger.

'task'
     If this breakpoint is restricted to a particular Ada task, then
     this field will hold the task identifier.

'cond'
     If the breakpoint is conditional, this is the condition expression.

'ignore'
     The ignore count of the breakpoint.

'enable'
     The enable count of the breakpoint.

'traceframe-usage'
     FIXME.

'static-tracepoint-marker-string-id'
     For a static tracepoint, the name of the static tracepoint marker.

'mask'
     For a masked watchpoint, this is the mask.

'pass'
     A tracepoint's pass count.

'original-location'
     The location of the breakpoint as originally specified by the user.
     This field is optional.

'times'
     The number of times the breakpoint has been hit.

'installed'
     This field is only given for tracepoints.  This is either 'y',
     meaning that the tracepoint is installed, or 'n', meaning that it
     is not.

'what'
     Some extra data, the exact contents of which are type-dependent.

   For example, here is what the output of '-break-insert' (*note GDB/MI
Breakpoint Commands::) might be:

     -> -break-insert main
     <- ^done,bkpt={number="1",type="breakpoint",disp="keep",
         enabled="y",addr="0x08048564",func="main",file="myprog.c",
         fullname="/home/nickrob/myprog.c",line="68",thread-groups=["i1"],
         times="0"}
     <- (gdb)


File: gdb.info,  Node: GDB/MI Frame Information,  Next: GDB/MI Thread Information,  Prev: GDB/MI Breakpoint Information,  Up: GDB/MI Output Records

27.5.5 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.6 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.7 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",thread-groups=["i1"],
         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 Catchpoint Commands,  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",thread-groups=["i1"],
     times="0"}
     (gdb)
     -break-after 1 3
     ~
     ^done
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="1",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x000100d0",func="main",file="hello.c",fullname="/home/foo/hello.c",
     line="5",thread-groups=["i1"],times="0",ignore="3"}]}
     (gdb)

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",thread-groups=["i1"],
     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",thread-groups=["i1"],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",thread-groups=["i1"],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",thread-groups=["i1"],times="0"}]}
     (gdb)

The '-break-info' Command
-------------------------

Synopsis
........

      -break-info BREAKPOINT

   Get information about a single breakpoint.

   The result is a table of breakpoints.  *Note GDB/MI Breakpoint
Information::, for details on the format of each breakpoint in the
table.

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-ID ] [ 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.
'-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.
'-c CONDITION'
     Make the breakpoint conditional on CONDITION.
'-i IGNORE-COUNT'
     Initialize the IGNORE-COUNT.
'-p THREAD-ID'
     Restrict the breakpoint to the specified THREAD-ID.

Result
......

*Note GDB/MI Breakpoint Information::, for details on the format of the
resulting breakpoint.

   Note: this format is open to change.

GDB Command
...........

The corresponding GDB commands are 'break', 'tbreak', 'hbreak', and
'thbreak'.

Example
.......

     (gdb)
     -break-insert main
     ^done,bkpt={number="1",addr="0x0001072c",file="recursive2.c",
     fullname="/home/foo/recursive2.c,line="4",thread-groups=["i1"],
     times="0"}
     (gdb)
     -break-insert -t foo
     ^done,bkpt={number="2",addr="0x00010774",file="recursive2.c",
     fullname="/home/foo/recursive2.c,line="11",thread-groups=["i1"],
     times="0"}
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="2",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x0001072c", func="main",file="recursive2.c",
     fullname="/home/foo/recursive2.c,"line="4",thread-groups=["i1"],
     times="0"},
     bkpt={number="2",type="breakpoint",disp="del",enabled="y",
     addr="0x00010774",func="foo",file="recursive2.c",
     fullname="/home/foo/recursive2.c",line="11",thread-groups=["i1"],
     times="0"}]}
     (gdb)

The '-dprintf-insert' Command
-----------------------------

Synopsis
........

      -dprintf-insert [ -t ] [ -f ] [ -d ]
         [ -c CONDITION ] [ -i IGNORE-COUNT ]
         [ -p THREAD-ID ] [ LOCATION ] [ FORMAT ]
         [ ARGUMENT ]

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.
'-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.
'-c CONDITION'
     Make the breakpoint conditional on CONDITION.
'-i IGNORE-COUNT'
     Set the ignore count of the breakpoint (*note ignore count:
     Conditions.) to IGNORE-COUNT.
'-p THREAD-ID'
     Restrict the breakpoint to the specified THREAD-ID.

Result
......

*Note GDB/MI Breakpoint Information::, for details on the format of the
resulting breakpoint.

GDB Command
...........

The corresponding GDB command is 'dprintf'.

Example
.......

     (gdb)
     4-dprintf-insert foo "At foo entry\n"
     4^done,bkpt={number="1",type="dprintf",disp="keep",enabled="y",
     addr="0x000000000040061b",func="foo",file="mi-dprintf.c",
     fullname="mi-dprintf.c",line="25",thread-groups=["i1"],
     times="0",script={"printf \"At foo entry\\n\"","continue"},
     original-location="foo"}
     (gdb)
     5-dprintf-insert 26 "arg=%d, g=%d\n" arg g
     5^done,bkpt={number="2",type="dprintf",disp="keep",enabled="y",
     addr="0x000000000040062a",func="foo",file="mi-dprintf.c",
     fullname="mi-dprintf.c",line="26",thread-groups=["i1"],
     times="0",script={"printf \"arg=%d, g=%d\\n\", arg, g","continue"},
     original-location="mi-dprintf.c:26"}
     (gdb)

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
'Thread-groups'
     list of thread groups to which this breakpoint applies
'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",thread-groups=["i1"],
     times="0"},
     bkpt={number="2",type="breakpoint",disp="keep",enabled="y",
     addr="0x00010114",func="foo",file="hello.c",fullname="/home/foo/hello.c",
     line="13",thread-groups=["i1"],times="0"}]}
     (gdb)

   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",thread-groups=["i1"],
     times="1"},
     bkpt={number="2",type="watchpoint",disp="keep",
     enabled="y",addr="",what="C",thread-groups=["i1"],times="0"}]}
     (gdb)
     -exec-continue
     ^running
     (gdb)
     *stopped,reason="watchpoint-trigger",wpt={number="2",exp="C"},
     value={old="-276895068",new="3"},
     frame={func="callee4",args=[],
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="13"}
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="2",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x00010734",func="callee4",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/devo/gdb/testsuite/gdb.mi/basics.c",line="8",thread-groups=["i1"],
     times="1"},
     bkpt={number="2",type="watchpoint",disp="keep",
     enabled="y",addr="",what="C",thread-groups=["i1"],times="-5"}]}
     (gdb)
     -exec-continue
     ^running
     ^done,reason="watchpoint-scope",wpnum="2",
     frame={func="callee3",args=[{name="strarg",
     value="0x11940 \"A string argument.\""}],
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/bar/devo/gdb/testsuite/gdb.mi/basics.c",line="18"}
     (gdb)
     -break-list
     ^done,BreakpointTable={nr_rows="1",nr_cols="6",
     hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},
     {width="14",alignment="-1",col_name="type",colhdr="Type"},
     {width="4",alignment="-1",col_name="disp",colhdr="Disp"},
     {width="3",alignment="-1",col_name="enabled",colhdr="Enb"},
     {width="10",alignment="-1",col_name="addr",colhdr="Address"},
     {width="40",alignment="2",col_name="what",colhdr="What"}],
     body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x00010734",func="callee4",
     file="../../../devo/gdb/testsuite/gdb.mi/basics.c",
     fullname="/home/foo/devo/gdb/testsuite/gdb.mi/basics.c",line="8",
     thread-groups=["i1"],times="1"}]}
     (gdb)


File: gdb.info,  Node: GDB/MI Catchpoint Commands,  Next: GDB/MI Program Context,  Prev: GDB/MI Breakpoint Commands,  Up: GDB/MI

27.9 GDB/MI Catchpoint Commands
===============================

This section documents GDB/MI commands for manipulating catchpoints.

* Menu:

* Shared Library GDB/MI Catchpoint Commands::
* Ada Exception GDB/MI Catchpoint Commands::


File: gdb.info,  Node: Shared Library GDB/MI Catchpoint Commands,  Next: Ada Exception GDB/MI Catchpoint Commands,  Up: GDB/MI Catchpoint Commands

27.9.1 Shared Library GDB/MI Catchpoints
----------------------------------------

The '-catch-load' Command
-------------------------

Synopsis
........

      -catch-load [ -t ] [ -d ] REGEXP

   Add a catchpoint for library load events.  If the '-t' option is
used, the catchpoint is a temporary one (*note Setting Breakpoints: Set
Breaks.).  If the '-d' option is used, the catchpoint is created in a
disabled state.  The 'regexp' argument is a regular expression used to
match the name of the loaded library.

GDB Command
...........

The corresponding GDB command is 'catch load'.

Example
.......

     -catch-load -t foo.so
     ^done,bkpt={number="1",type="catchpoint",disp="del",enabled="y",
     what="load of library matching foo.so",catch-type="load",times="0"}
     (gdb)

The '-catch-unload' Command
---------------------------

Synopsis
........

      -catch-unload [ -t ] [ -d ] REGEXP

   Add a catchpoint for library unload events.  If the '-t' option is
used, the catchpoint is a temporary one (*note Setting Breakpoints: Set
Breaks.).  If the '-d' option is used, the catchpoint is created in a
disabled state.  The 'regexp' argument is a regular expression used to
match the name of the unloaded library.

GDB Command
...........

The corresponding GDB command is 'catch unload'.

Example
.......

     -catch-unload -d bar.so
     ^done,bkpt={number="2",type="catchpoint",disp="keep",enabled="n",
     what="load of library matching bar.so",catch-type="unload",times="0"}
     (gdb)


File: gdb.info,  Node: Ada Exception GDB/MI Catchpoint Commands,  Prev: Shared Library GDB/MI Catchpoint Commands,  Up: GDB/MI Catchpoint Commands

27.9.2 Ada Exception GDB/MI Catchpoints
---------------------------------------

The following GDB/MI commands can be used to create catchpoints that
stop the execution when Ada exceptions are being raised.

The '-catch-assert' Command
---------------------------

Synopsis
........

      -catch-assert [ -c CONDITION] [ -d ] [ -t ]

   Add a catchpoint for failed Ada assertions.

   The possible optional parameters for this command are:

'-c CONDITION'
     Make the catchpoint conditional on CONDITION.
'-d'
     Create a disabled catchpoint.
'-t'
     Create a temporary catchpoint.

GDB Command
...........

The corresponding GDB command is 'catch assert'.

Example
.......

     -catch-assert
     ^done,bkptno="5",bkpt={number="5",type="breakpoint",disp="keep",
     enabled="y",addr="0x0000000000404888",what="failed Ada assertions",
     thread-groups=["i1"],times="0",
     original-location="__gnat_debug_raise_assert_failure"}
     (gdb)

The '-catch-exception' Command
------------------------------

Synopsis
........

      -catch-exception [ -c CONDITION] [ -d ] [ -e EXCEPTION-NAME ]
         [ -t ] [ -u ]

   Add a catchpoint stopping when Ada exceptions are raised.  By
default, the command stops the program when any Ada exception gets
raised.  But it is also possible, by using some of the optional
parameters described below, to create more selective catchpoints.

   The possible optional parameters for this command are:

'-c CONDITION'
     Make the catchpoint conditional on CONDITION.
'-d'
     Create a disabled catchpoint.
'-e EXCEPTION-NAME'
     Only stop when EXCEPTION-NAME is raised.  This option cannot be
     used combined with '-u'.
'-t'
     Create a temporary catchpoint.
'-u'
     Stop only when an unhandled exception gets raised.  This option
     cannot be used combined with '-e'.

GDB Command
...........

The corresponding GDB commands are 'catch exception' and 'catch
exception unhandled'.

Example
.......

     -catch-exception -e Program_Error
     ^done,bkptno="4",bkpt={number="4",type="breakpoint",disp="keep",
     enabled="y",addr="0x0000000000404874",
     what="`Program_Error' Ada exception", thread-groups=["i1"],
     times="0",original-location="__gnat_debug_raise_exception"}
     (gdb)


File: gdb.info,  Node: GDB/MI Program Context,  Next: GDB/MI Thread Commands,  Prev: GDB/MI Catchpoint Commands,  Up: GDB/MI

27.10 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.11 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.12 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.13 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 ] [ --start ]

   Starts execution of the inferior from the beginning.  The inferior
executes until either a breakpoint is encountered or the program exits.
In the latter case the output will include an exit code, if the program
has exited exceptionally.

   When neither the '--all' nor the '--thread-group' 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.

   Using the '--start' option instructs the debugger to stop the
execution at the start of the inferior's main subprogram, following the
same behavior as the 'start' command (*note Starting::).

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.14 GDB/MI Stack Manipulation Commands
========================================

The '-enable-frame-filters' Command
-----------------------------------

     -enable-frame-filters

   GDB allows Python-based frame filters to affect the output of the MI
commands relating to stack traces.  As there is no way to implement this
in a fully backward-compatible way, a front end must request that this
functionality be enabled.

   Once enabled, this feature cannot be disabled.

   Note that if Python support has not been compiled into GDB, this
command will still succeed (and do nothing).

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 [ --no-frame-filters ] [ --skip-unavailable ] 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.  If
the option '--no-frame-filters' is supplied, then Python frame filters
will not be executed.

   If the '--skip-unavailable' option is specified, arguments that are
not available are not listed.  Partially available arguments are still
displayed, however.

   Use of this command to obtain arguments in a single frame is
deprecated in favor of the '-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 [ --no-frame-filters 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.  If the
option '--no-frame-filters' is supplied, then Python frame filters will
not be executed.

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 [ --no-frame-filters ] [ --skip-unavailable ] 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.  If the option
'--no-frame-filters' is supplied, then Python frame filters will not be
executed.

   If the '--skip-unavailable' option is specified, local variables that
are not available are not listed.  Partially available local variables
are still displayed, however.

   This command is deprecated in favor of the '-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 [ --no-frame-filters ] [ --skip-unavailable ] 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.  If the option '--no-frame-filters' is supplied,
then Python frame filters will not be executed.

   If the '--skip-unavailable' option is specified, local variables and
arguments that are not available are not listed.  Partially available
arguments and local variables are still displayed, however.

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.15 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. If 'print object' (*note set print
     object: Print Settings.) is set to 'on', the _actual_ (derived)
     type of the object is shown rather than the _declared_ one.

'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.  If 'print object' (*note set print object:
     Print Settings.) is set to 'on', the _actual_ (derived) type of the
     object is shown rather than the _declared_ one.

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.

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

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.

   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 value of 'lang' is the language name, which can be found in
*note Supported Languages::.

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

     When a varobj's type changes, its children are also likely to have
     become incorrect.  Therefore, the varobj's children are
     automatically deleted when this attribute is 'true'.  Also, the
     varobj's update range, when set using the '-var-set-update-range'
     command, is unset.

'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 Support 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.16 GDB/MI Data Manipulation
==============================

This section describes the GDB/MI commands that manipulate data: examine
memory and registers, evaluate expressions, etc.

   For details about what an addressable memory unit is, *note
addressable memory unit::.

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 result of the '-data-disassemble' command will be a list named
'asm_insns', the contents of this list depend on the MODE used with the
'-data-disassemble' command.

   For modes 0 and 2 the 'asm_insns' list contains tuples with the
following fields:

'address'
     The address at which this instruction was disassembled.

'func-name'
     The name of the function this instruction is within.

'offset'
     The decimal offset in bytes from the start of 'func-name'.

'inst'
     The text disassembly for this 'address'.

'opcodes'
     This field is only present for mode 2.  This contains the raw
     opcode bytes for the 'inst' field.

   For modes 1 and 3 the 'asm_insns' list contains tuples named
'src_and_asm_line', each of which has the following fields:

'line'
     The line number within 'file'.

'file'
     The file name from the compilation unit.  This might be an absolute
     file name or a relative file name depending on the compile command
     used.

'fullname'
     Absolute file name of 'file'.  It is converted to a canonical form
     using the source file search path (*note Specifying Source
     Directories: Source Path.) and after resolving all the symbolic
     links.

     If the source file is not found this field will contain the path as
     present in the debug information.

'line_asm_insn'
     This is a list of tuples containing the disassembly for 'line' in
     'file'.  The fields of each tuple are the same as for
     '-data-disassemble' in MODE 0 and 2, so 'address', 'func-name',
     'offset', 'inst', and optionally 'opcodes'.

   Note that whatever included in the 'inst' field, is not manipulated
directly by GDB/MI, i.e., it is not possible to adjust its format.

GDB Command
...........

The corresponding GDB command is 'disassemble'.

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="../../../src/gdb/testsuite/gdb.mi/basics.c",
     fullname="/absolute/path/to/src/gdb/testsuite/gdb.mi/basics.c",
     line_asm_insn=[{address="0x000107bc",
     func-name="main",offset="0",inst="save  %sp, -112, %sp"}]},
     src_and_asm_line={line="32",
     file="../../../src/gdb/testsuite/gdb.mi/basics.c",
     fullname="/absolute/path/to/src/gdb/testsuite/gdb.mi/basics.c",
     line_asm_insn=[{address="0x000107c0",
     func-name="main",offset="4",inst="mov  2, %o0"},
     {address="0x000107c4",func-name="main",offset="8",
     inst="sethi  %hi(0x11800), %o2"}]}]
     (gdb)

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
         [ --skip-unavailable ] FMT [ ( REGNO )*]

   Display the registers' contents.  The format according to which the
registers' contents are to be returned is given by FMT, followed by an
optional list of numbers specifying the registers to display.  A missing
list of numbers indicates that the contents of all the registers must be
returned.  The '--skip-unavailable' option indicates that only the
available registers are to 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 OFFSET ]
        ADDRESS COUNT

where:

'ADDRESS'
     An expression specifying the address of the first addressable
     memory unit to be read.  Complex expressions containing embedded
     white space should be quoted using the C convention.

'COUNT'
     The number of addressable memory units to read.  This should be an
     integer literal.

'OFFSET'
     The offset 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 memory unit in the region may be readable or
not, and the only way to read every readable unit is to try a read at
every address, which is not practical.  Therefore, GDB will attempt to
read all accessible memory units 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
      -data-write-memory-bytes ADDRESS CONTENTS [COUNT]

where:

'ADDRESS'
     An expression specifying the address of the first addressable
     memory unit to be written.  Complex expressions containing embedded
     white space should be quoted using the C convention.

'CONTENTS'
     The hex-encoded data to write.  It is an error if CONTENTS does not
     represent an integral number of addressable memory units.

'COUNT'
     Optional argument indicating the number of addressable memory units
     to be written.  If COUNT is greater than CONTENTS' length, GDB will
     repeatedly write CONTENTS until it fills COUNT memory units.

GDB Command
...........

There's no corresponding GDB command.

Example
.......

     (gdb)
     -data-write-memory-bytes &a "aabbccdd"
     ^done
     (gdb)

     (gdb)
     -data-write-memory-bytes &a "aabbccdd" 16e
     ^done
     (gdb)


File: gdb.info,  Node: GDB/MI Tracepoint Commands,  Next: GDB/MI Symbol Query,  Prev: GDB/MI Data Manipulation,  Up: GDB/MI

27.17 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'.

The '-trace-frame-collected' Command
------------------------------------

Synopsis
........

      -trace-frame-collected
         [--var-print-values VAR_PVAL]
         [--comp-print-values COMP_PVAL]
         [--registers-format REGFORMAT]
         [--memory-contents]

   This command returns the set of collected objects, register names,
trace state variable names, memory ranges and computed expressions that
have been collected at a particular trace frame.  The optional
parameters to the command affect the output format in different ways.
See the output description table below for more details.

   The reported names can be used in the normal manner to create varobjs
and inspect the objects themselves.  The items returned by this command
are categorized so that it is clear which is a variable, which is a
register, which is a trace state variable, which is a memory range and
which is a computed expression.

   For instance, if the actions were
     collect myVar, myArray[myIndex], myObj.field, myPtr->field, myCount + 2
     collect *(int*)0xaf02bef0@40

the object collected in its entirety would be 'myVar'.  The object
'myArray' would be partially collected, because only the element at
index 'myIndex' would be collected.  The remaining objects would be
computed expressions.

   An example output would be:

     (gdb)
     -trace-frame-collected
     ^done,
       explicit-variables=[{name="myVar",value="1"}],
       computed-expressions=[{name="myArray[myIndex]",value="0"},
                             {name="myObj.field",value="0"},
                             {name="myPtr->field",value="1"},
                             {name="myCount + 2",value="3"},
                             {name="$tvar1 + 1",value="43970027"}],
       registers=[{number="0",value="0x7fe2c6e79ec8"},
                  {number="1",value="0x0"},
                  {number="2",value="0x4"},
                  ...
                  {number="125",value="0x0"}],
       tvars=[{name="$tvar1",current="43970026"}],
       memory=[{address="0x0000000000602264",length="4"},
               {address="0x0000000000615bc0",length="4"}]
     (gdb)

   Where:

'explicit-variables'
     The set of objects that have been collected in their entirety (as
     opposed to collecting just a few elements of an array or a few
     struct members).  For each object, its name and value are printed.
     The '--var-print-values' option affects how or whether the value
     field is output.  If VAR_PVAL is 0, then print only the names; if
     it is 1, print also their values; and if it is 2, print the name,
     type and value for simple data types, and the name and type for
     arrays, structures and unions.

'computed-expressions'
     The set of computed expressions that have been collected at the
     current trace frame.  The '--comp-print-values' option affects this
     set like the '--var-print-values' option affects the
     'explicit-variables' set.  See above.

'registers'
     The registers that have been collected at the current trace frame.
     For each register collected, the name and current value are
     returned.  The value is formatted according to the
     '--registers-format' option.  See the '-data-list-register-values'
     command for a list of the allowed formats.  The default is 'x'.

'tvars'
     The trace state variables that have been collected at the current
     trace frame.  For each trace state variable collected, the name and
     current value are returned.

'memory'
     The set of memory ranges that have been collected at the current
     trace frame.  Its content is a list of tuples.  Each tuple
     represents a collected memory range and has the following fields:

     'address'
          The start address of the memory range, as hexadecimal literal.

     'length'
          The length of the memory range, as decimal literal.

     'contents'
          The contents of the memory block, in hex.  This field is only
          present if the '--memory-contents' option is specified.

GDB Command
...........

There is no corresponding GDB command.

Example
.......

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

'trace-file'
     The filename of the trace file being examined.  This field is
     optional, and only present when examining a trace file.

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.18 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.19 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 both the filename and fullname (absolute file
name) of a source file.

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.20 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 Ada Exceptions Commands,  Prev: GDB/MI Target Manipulation,  Up: GDB/MI

27.21 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 Ada Exceptions Commands,  Next: GDB/MI Support Commands,  Prev: GDB/MI File Transfer Commands,  Up: GDB/MI

27.22 Ada Exceptions GDB/MI Commands
====================================

The '-info-ada-exceptions' Command
----------------------------------

Synopsis
........

      -info-ada-exceptions [ REGEXP]

   List all Ada exceptions defined within the program being debugged.
With a regular expression REGEXP, only those exceptions whose names
match REGEXP are listed.

GDB Command
...........

The corresponding GDB command is 'info exceptions'.

Result
......

The result is a table of Ada exceptions.  The following columns are
defined for each exception:

'name'
     The name of the exception.

'address'
     The address of the exception.

Example
.......

     -info-ada-exceptions aint
     ^done,ada-exceptions={nr_rows="2",nr_cols="2",
     hdr=[{width="1",alignment="-1",col_name="name",colhdr="Name"},
     {width="1",alignment="-1",col_name="address",colhdr="Address"}],
     body=[{name="constraint_error",address="0x0000000000613da0"},
     {name="const.aint_global_e",address="0x0000000000613b00"}]}

Catching Ada Exceptions
-----------------------

The commands describing how to ask GDB to stop when a program raises an
exception are described at *note Ada Exception GDB/MI Catchpoint
Commands::.


File: gdb.info,  Node: GDB/MI Support Commands,  Next: GDB/MI Miscellaneous Commands,  Prev: GDB/MI Ada Exceptions Commands,  Up: GDB/MI

27.23 GDB/MI Support Commands
=============================

Since new commands and features get regularly added to GDB/MI, some
commands are available to help front-ends query the debugger about
support for these capabilities.  Similarly, it is also possible to query
GDB about target support of certain features.

The '-info-gdb-mi-command' Command
----------------------------------

Synopsis
........

      -info-gdb-mi-command CMD_NAME

   Query support for the GDB/MI command named CMD_NAME.

   Note that the dash ('-') starting all GDB/MI commands is technically
not part of the command name (*note GDB/MI Input Syntax::), and thus
should be omitted in CMD_NAME.  However, for ease of use, this command
also accepts the form with the leading dash.

GDB Command
...........

There is no corresponding GDB command.

Result
......

The result is a tuple.  There is currently only one field:

'exists'
     This field is equal to '"true"' if the GDB/MI command exists,
     '"false"' otherwise.

Example
.......

Here is an example where the GDB/MI command does not exist:

     -info-gdb-mi-command unsupported-command
     ^done,command={exists="false"}

And here is an example where the GDB/MI command is known to the
debugger:

     -info-gdb-mi-command symbol-list-lines
     ^done,command={exists="true"}

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.
'language-option'
     Indicates that all GDB/MI commands accept the '--language' option
     (*note Context management::).
'info-gdb-mi-command'
     Indicates support for the '-info-gdb-mi-command' command.
'undefined-command-error-code'
     Indicates support for the "undefined-command" error code in error
     result records, produced when trying to execute an undefined GDB/MI
     command (*note GDB/MI Result Records::).
'exec-run-start-option'
     Indicates that the '-exec-run' command supports the '--start'
     option (*note GDB/MI Program Execution::).

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


File: gdb.info,  Node: GDB/MI Miscellaneous Commands,  Prev: GDB/MI Support Commands,  Up: GDB/MI

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

'exit-code'
     The exit code of this group's last exited thread, formatted in
     octal.  This field is only present for thread groups of type
     'process' and only if the process is not running.

'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 '-info-os' Command
----------------------

Synopsis
........

     -info-os [ TYPE ]

   If no argument is supplied, the command returns a table of available
operating-system-specific information types.  If one of these types is
supplied as an argument TYPE, then the command returns a table of data
of that type.

   The types of information available depend on the target operating
system.

GDB Command
...........

The corresponding GDB command is 'info os'.

Example
.......

When run on a GNU/Linux system, the output will look something like
this:

     gdb
     -info-os
     ^done,OSDataTable={nr_rows="10",nr_cols="3",
     hdr=[{width="10",alignment="-1",col_name="col0",colhdr="Type"},
          {width="10",alignment="-1",col_name="col1",colhdr="Description"},
          {width="10",alignment="-1",col_name="col2",colhdr="Title"}],
     body=[item={col0="cpus",col1="Listing of all cpus/cores on the system",
                 col2="CPUs"},
           item={col0="files",col1="Listing of all file descriptors",
                 col2="File descriptors"},
           item={col0="modules",col1="Listing of all loaded kernel modules",
                 col2="Kernel modules"},
           item={col0="msg",col1="Listing of all message queues",
                 col2="Message queues"},
           item={col0="processes",col1="Listing of all processes",
                 col2="Processes"},
           item={col0="procgroups",col1="Listing of all process groups",
                 col2="Process groups"},
           item={col0="semaphores",col1="Listing of all semaphores",
                 col2="Semaphores"},
           item={col0="shm",col1="Listing of all shared-memory regions",
                 col2="Shared-memory regions"},
           item={col0="sockets",col1="Listing of all internet-domain sockets",
                 col2="Sockets"},
           item={col0="threads",col1="Listing of all threads",
                 col2="Threads"}]
     gdb
     -info-os processes
     ^done,OSDataTable={nr_rows="190",nr_cols="4",
     hdr=[{width="10",alignment="-1",col_name="col0",colhdr="pid"},
          {width="10",alignment="-1",col_name="col1",colhdr="user"},
          {width="10",alignment="-1",col_name="col2",colhdr="command"},
          {width="10",alignment="-1",col_name="col3",colhdr="cores"}],
     body=[item={col0="1",col1="root",col2="/sbin/init",col3="0"},
           item={col0="2",col1="root",col2="[kthreadd]",col3="1"},
           item={col0="3",col1="root",col2="[ksoftirqd/0]",col3="0"},
           ...
           item={col0="26446",col1="stan",col2="bash",col3="0"},
           item={col0="28152",col1="stan",col2="bash",col3="1"}]}
     (gdb)

   (Note that the MI output here includes a '"Title"' column that does
not appear in command-line 'info os'; this column is useful for MI
clients that want to enumerate the types of data, such as in a popup
menu, but is needless clutter on the command line, and 'info os' omits
it.)

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

Example
-------

     gdb
     -add-inferior
     ^done,inferior="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",thread-groups=["i1"],
     times="0"},
     time={wallclock="0.05185",user="0.00800",system="0.00000"}
     (gdb)
     -enable-timings no
     ^done
     (gdb)
     -exec-run
     ^running
     (gdb)
     *stopped,reason="breakpoint-hit",disp="keep",bkptno="1",thread-id="0",
     frame={addr="0x080484ed",func="main",args=[{name="argc",value="1"},
     {name="argv",value="0xbfb60364"}],file="myprog.c",
     fullname="/home/nickrob/myprog.c",line="73"}
     (gdb)


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'.  The arguments
     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.  The 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: In-Process Agent,  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'
     Load the JIT reader named READER, which is a shared object
     specified as either an absolute or a relative file name.  In the
     latter case, GDB will try to load the reader from a pre-configured
     directory, usually 'LIBDIR/gdb/' on a UNIX system (here LIBDIR is
     the system library directory, often '/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-unload' 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: In-Process Agent,  Next: GDB Bugs,  Prev: JIT Interface,  Up: Top

30 In-Process Agent
*******************

The traditional debugging model is conceptually low-speed, but works
fine, because most bugs can be reproduced in debugging-mode execution.
However, as multi-core or many-core processors are becoming mainstream,
and multi-threaded programs become more and more popular, there should
be more and more bugs that only manifest themselves at normal-mode
execution, for example, thread races, because debugger's interference
with the program's timing may conceal the bugs.  On the other hand, in
some applications, it is not feasible for the debugger to interrupt the
program's execution long enough for the developer to learn anything
helpful about its behavior.  If the program's correctness depends on its
real-time behavior, delays introduced by a debugger might cause the
program to fail, even when the code itself is correct.  It is useful to
be able to observe the program's behavior without interrupting it.

   Therefore, traditional debugging model is too intrusive to reproduce
some bugs.  In order to reduce the interference with the program, we can
reduce the number of operations performed by debugger.  The "In-Process
Agent", a shared library, is running within the same process with
inferior, and is able to perform some debugging operations itself.  As a
result, debugger is only involved when necessary, and performance of
debugging can be improved accordingly.  Note that interference with
program can be reduced but can't be removed completely, because the
in-process agent will still stop or slow down the program.

   The in-process agent can interpret and execute Agent Expressions
(*note Agent Expressions::) during performing debugging operations.  The
agent expressions can be used for different purposes, such as collecting
data in tracepoints, and condition evaluation in breakpoints.

   You can control whether the in-process agent is used as an aid for
debugging with the following commands:

'set agent on'
     Causes the in-process agent to perform some operations on behalf of
     the debugger.  Just which operations requested by the user will be
     done by the in-process agent depends on the its capabilities.  For
     example, if you request to evaluate breakpoint conditions in the
     in-process agent, and the in-process agent has such capability as
     well, then breakpoint conditions will be evaluated in the
     in-process agent.

'set agent off'
     Disables execution of debugging operations by the in-process agent.
     All of the operations will be performed by GDB.

'show agent'
     Display the current setting of execution of debugging operations by
     the in-process agent.

* Menu:

* In-Process Agent Protocol::


File: gdb.info,  Node: In-Process Agent Protocol,  Up: In-Process Agent

30.1 In-Process Agent Protocol
==============================

The in-process agent is able to communicate with both GDB and GDBserver
(*note In-Process Agent::).  This section documents the protocol used
for communications between GDB or GDBserver and the IPA. In general, GDB
or GDBserver sends commands (*note IPA Protocol Commands::) and data to
in-process agent, and then in-process agent replies back with the return
result of the command, or some other information.  The data sent to
in-process agent is composed of primitive data types, such as 4-byte or
8-byte type, and composite types, which are called objects (*note IPA
Protocol Objects::).

* Menu:

* IPA Protocol Objects::
* IPA Protocol Commands::


File: gdb.info,  Node: IPA Protocol Objects,  Next: IPA Protocol Commands,  Up: In-Process Agent Protocol

30.1.1 IPA Protocol Objects
---------------------------

The commands sent to and results received from agent may contain some
complex data types called "objects".

   The in-process agent is running on the same machine with GDB or
GDBserver, so it doesn't have to handle as much differences between two
ends as remote protocol (*note Remote Protocol::) tries to handle.
However, there are still some differences of two ends in two processes:

  1. word size.  On some 64-bit machines, GDB or GDBserver can be
     compiled as a 64-bit executable, while in-process agent is a 32-bit
     one.
  2. ABI. Some machines may have multiple types of ABI, GDB or GDBserver
     is compiled with one, and in-process agent is compiled with the
     other one.

   Here are the IPA Protocol Objects:

  1. agent expression object.  It represents an agent expression (*note
     Agent Expressions::).
  2. tracepoint action object.  It represents a tracepoint action (*note
     Tracepoint Action Lists: Tracepoint Actions.) to collect registers,
     memory, static trace data and to evaluate expression.
  3. tracepoint object.  It represents a tracepoint (*note
     Tracepoints::).

   The following table describes important attributes of each IPA
protocol object:

Name                   Size           Description
---------------------------------------------------------------------------
_agent expression
object_
length                 4              length of bytes code
byte code              LENGTH         contents of byte code
_tracepoint action
for collecting
memory_
'M'                    1              type of tracepoint action
addr                   8              if BASEREG is '-1', ADDR is the
                                      address of the lowest byte to
                                      collect, otherwise ADDR is the
                                      offset of BASEREG for memory
                                      collecting.
len                    8              length of memory for collecting
basereg                4              the register number containing the
                                      starting memory address for
                                      collecting.
_tracepoint action
for collecting
registers_
'R'                    1              type of tracepoint action
_tracepoint action
for collecting
static trace data_
'L'                    1              type of tracepoint action
_tracepoint action
for expression
evaluation_
'X'                    1              type of tracepoint action
agent expression       length of      *note agent expression object::
_tracepoint object_
number                 4              number of tracepoint
address                8              address of tracepoint inserted on
type                   4              type of tracepoint
enabled                1              enable or disable of tracepoint
step_count             8              step
pass_count             8              pass
numactions             4              number of tracepoint actions
hit count              8              hit count
trace frame usage      8              trace frame usage
compiled_cond          8              compiled condition
orig_size              8              orig size
condition              4 if           zero if condition is NULL,
                       condition is   otherwise is *note agent
                       NULL           expression object::
                       otherwise
                       length of
                       *note agent
                       expression
                       object::
actions                variable       numactions number of *note
                                      tracepoint action object::


File: gdb.info,  Node: IPA Protocol Commands,  Prev: IPA Protocol Objects,  Up: In-Process Agent Protocol

30.1.2 IPA Protocol Commands
----------------------------

The spaces in each command are delimiters to ease reading this commands
specification.  They don't exist in real commands.

'FastTrace:TRACEPOINT_OBJECT GDB_JUMP_PAD_HEAD'
     Installs a new fast tracepoint described by TRACEPOINT_OBJECT
     (*note tracepoint object::).  The GDB_JUMP_PAD_HEAD, 8-byte long,
     is the head of "jumppad", which is used to jump to data collection
     routine in IPA finally.

     Replies:
     'OK TARGET_ADDRESS GDB_JUMP_PAD_HEAD FJUMP_SIZE FJUMP'
          TARGET_ADDRESS is address of tracepoint in the inferior.  The
          GDB_JUMP_PAD_HEAD is updated head of jumppad.  Both of
          TARGET_ADDRESS and GDB_JUMP_PAD_HEAD are 8-byte long.  The
          FJUMP contains a sequence of instructions jump to jumppad
          entry.  The FJUMP_SIZE, 4-byte long, is the size of FJUMP.
     'E NN'
          for an error

'close'
     Closes the in-process agent.  This command is sent when GDB or
     GDBserver is about to kill inferiors.

'qTfSTM'
     *Note qTfSTM::.
'qTsSTM'
     *Note qTsSTM::.
'qTSTMat'
     *Note qTSTMat::.
'probe_marker_at:ADDRESS'
     Asks in-process agent to probe the marker at ADDRESS.

     Replies:
     'E NN'
          for an error
'unprobe_marker_at:ADDRESS'
     Asks in-process agent to unprobe the marker at ADDRESS.


File: gdb.info,  Node: GDB Bugs,  Next: Command Line Editing,  Prev: In-Process Agent,  Up: Top

31 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

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

31.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 <https://bugs.launchpad.net/gcc-linaro>.

   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.

   * The details of the GDB build-time configuration.  GDB shows these
     details if you invoke it with the '--configuration' command-line
     option, or if you type 'show configuration' at GDB's prompt.

   * 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

32 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

33 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
(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

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

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

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

33.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.10.0.20151009-cvs/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.10.0.20151009-cvs', in the case of version
7.10.0.20151009-cvs), 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.10.0.20151009-cvs/gdb')
and type:

     make gdb.dvi

   Then give 'gdb.dvi' to your DVI printing program.

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

   (1) In 'gdb-7.10.0.20151009-cvs/gdb/refcard.ps' of the version
7.10.0.20151009-cvs 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::)
        * Branch trace (*note Branch Trace Format::, *note Branch Trace
          Configuration 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.10.0.20151009-cvs distribution is in
the 'gdb-7.10.0.20151009-cvs' directory.  That directory contains:

'gdb-7.10.0.20151009-cvs/configure (and supporting files)'
     script for configuring GDB and all its supporting libraries

'gdb-7.10.0.20151009-cvs/gdb'
     the source specific to GDB itself

'gdb-7.10.0.20151009-cvs/bfd'
     source for the Binary File Descriptor library

'gdb-7.10.0.20151009-cvs/include'
     GNU include files

'gdb-7.10.0.20151009-cvs/libiberty'
     source for the '-liberty' free software library

'gdb-7.10.0.20151009-cvs/opcodes'
     source for the library of opcode tables and disassemblers

'gdb-7.10.0.20151009-cvs/readline'
     source for the GNU command-line interface

'gdb-7.10.0.20151009-cvs/glob'
     source for the GNU filename pattern-matching subroutine

'gdb-7.10.0.20151009-cvs/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.10.0.20151009-cvs' 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.10.0.20151009-cvs
     ./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.10.0.20151009-cvs' source directory for version
7.10.0.20151009-cvs, '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.10.0.20151009-cvs, you can build GDB in a
separate directory for a Sun 4 like this:

     cd gdb-7.10.0.20151009-cvs
     mkdir ../gdb-sun4
     cd ../gdb-sun4
     ../gdb-7.10.0.20151009-cvs/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.10.0.20151009-cvs/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.10.0.20151009-cvs' (or in a separate configured directory
configured with '--srcdir=DIRNAME/gdb-7.10.0.20151009-cvs'), 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.10.0.20151009-cvs', for version 7.10.0.20151009-cvs).


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.

   If the configured location of the system-wide init file (as given by
the '--with-system-gdbinit' option at configure time) is in the
data-directory (as specified by '--with-gdb-datadir' at configure time)
or in one of its subdirectories, then GDB will look for the system-wide
init file in the directory specified by the '--data-directory'
command-line option.  Note that the system-wide init file is only read
once, during GDB initialization.  If the data-directory is changed after
GDB has started with the 'set data-directory' command, the file will not
be reread.

* Menu:

* System-wide Configuration Scripts::  Installed System-wide Configuration Scripts


File: gdb.info,  Node: System-wide Configuration Scripts,  Up: System-wide configuration

C.6.1 Installed System-wide Configuration Scripts
-------------------------------------------------

The 'system-gdbinit' directory, located inside the data-directory (as
specified by '--with-gdb-datadir' at configure time) contains a number
of scripts which can be used as system-wide init files.  To
automatically source those scripts at startup, GDB should be configured
with '--with-system-gdbinit'.  Otherwise, any user should be able to
source them by hand as needed.

   The following scripts are currently available:

   * 'elinos.py' This script is useful when debugging a program on an
     ELinOS target.  It takes advantage of the environment variables
     defined in a standard ELinOS environment in order to determine the
     location of the system shared libraries, and then sets the
     'solib-absolute-prefix' and 'solib-search-path' variables
     appropriately.

   * 'wrs-linux.py' This script is useful when debugging a program on a
     target running Wind River Linux.  It expects the 'ENV_PREFIX' to be
     set to the host-side sysroot used by the target system.


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 [-at LOCATION,] EXPRESSION'
'maint agent-eval [-at LOCATION,] 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.  If '-at' is
     given, generate remote agent bytecode for LOCATION.  If not,
     generate remote agent bytecode for current frame PC address.

'maint agent-printf FORMAT,EXPR,...'
     Translate the given format string and list of argument expressions
     into remote agent bytecodes and display them as a disassembled
     list.  This command is useful for debugging the agent version of
     dynamic printf (*note Dynamic Printf::).

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

'maint info bfds'
     This prints information about each 'bfd' object that is known to
     GDB.  *Note BFD: (bfd)Top.

'maint info btrace'
     Pint information about raw branch tracing data.

'maint btrace packet-history'
     Print the raw branch trace packets that are used to compute the
     execution history for the 'record btrace' command.  Both the
     information and the format in which it is printed depend on the
     btrace recording format.

     'bts'
          For the BTS recording format, print a list of blocks of
          sequential code.  For each block, the following information is
          printed:

          Block number
               Newer blocks have higher numbers.  The oldest block has
               number zero.
          Lowest 'PC'
          Highest 'PC'

     'pt'
          For the Intel(R) Processor Trace recording format, print a
          list of Intel(R) Processor Trace packets.  For each packet,
          the following information is printed:

          Packet number
               Newer packets have higher numbers.  The oldest packet has
               number zero.
          Trace offset
               The packet's offset in the trace stream.
          Packet opcode and payload

'maint btrace clear-packet-history'
     Discards the cached packet history printed by the 'maint btrace
     packet-history' command.  The history will be computed again when
     needed.

'maint btrace clear'
     Discard the branch trace data.  The data will be fetched anew and
     the branch trace will be recomputed when needed.

     This implicitly truncates the branch trace to a single branch trace
     buffer.  When updating branch trace incrementally, the branch trace
     available to GDB may be bigger than a single branch trace buffer.

'maint set btrace pt skip-pad'
'maint show btrace pt skip-pad'
     Control whether GDB will skip PAD packets when computing the packet
     history.

'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-psymtabs'
     Check the consistency of currently expanded psymtabs versus
     symtabs.  Use this to check, for example, whether a symbol is in
     one but not the other.

'maint check-symtabs'
     Check the consistency of currently expanded symtabs.

'maint expand-symtabs [REGEXP]'
     Expand symbol tables.  If REGEXP is specified, only expand symbol
     tables for file names matching REGEXP.

'maint set catch-demangler-crashes [on|off]'
'maint show catch-demangler-crashes'
     Control whether GDB should attempt to catch crashes in the symbol
     name demangler.  The default is to attempt to catch crashes.  If
     enabled, the first time a crash is caught, a core file is created,
     the offending symbol is displayed and the user is presented with
     the option to terminate the current session.

'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 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]'
'maint demangler-warning [MESSAGE-TEXT]'

     Cause GDB to call the internal function 'internal_error',
     'internal_warning' or 'demangler_warning' and hence behave as
     though an internal problem has been detected.  In addition to
     reporting the internal problem, these functions give the user the
     opportunity to either quit GDB or (for 'internal_error' and
     'internal_warning') 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'
'maint set demangler-warning ACTION [ask|yes|no]'
'maint show demangler-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.  Note that there is no 'corefile' option for
          'demangler-warning': demangler warnings always create a core
          file and this cannot be disabled.

'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
          0xa8206d8: id={stack=0xbfffe734,code=0xbfffe73f,!special}, ptid=process 9353
          (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.

     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 [REGEXP]'
     Print a dump of all known object files.  If REGEXP is specified,
     only print object files whose names match REGEXP.  For each object
     file, this command prints its name, address in memory, and all of
     its psymtabs and symtabs.

'maint print user-registers'
     List all currently available "user registers".  User registers
     typically provide alternate names for actual hardware registers.
     They include the four "standard" registers '$fp', '$pc', '$sp', and
     '$ps'.  *Note standard registers::.  User registers can be used in
     expressions in the same way as the canonical register names, but
     only the latter are listed by the 'info registers' and 'maint print
     registers' commands.

'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 dotdebug_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 dwarf always-disassemble'
'maint show dwarf 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 dwarf max-cache-age'
'maint show dwarf max-cache-age'
     Control the DWARF compilation unit cache.

     In object files with inter-compilation-unit references, such as
     those produced by the GCC option '-feliminate-dwarf2-dups', the
     DWARF 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 set target-async'
'maint show target-async'
     This controls whether GDB targets operate in synchronous or
     asynchronous mode (*note Background Execution::).  Normally the
     default is asynchronous, if it is available; but this can be
     changed to more easily debug problems occurring only in synchronous
     mode.

'maint set per-command'
'maint show per-command'

     GDB can display the resources used by each command.  This is useful
     in debugging performance problems.

     'maint set per-command space [on|off]'
     'maint show per-command space'
          Enable or disable the printing of the memory used by GDB for
          each command.  If enabled, 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 set per-command time [on|off]'
     'maint show per-command time'
          Enable or disable the printing of the execution time of GDB
          for each command.  If enabled, 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 set per-command symtab [on|off]'
     'maint show per-command symtab'
          Enable or disable the printing of basic symbol table
          statistics for each command.  If enabled, GDB will display the
          following information:

            a. number of symbol tables
            b. number of primary symbol tables
            c. number of blocks in the blockvector

'maint space VALUE'
     An alias for 'maint set per-command space'.  A non-zero value
     enables it, zero disables it.

'maint time VALUE'
     An alias for 'maint set per-command time'.  A non-zero value
     enables it, zero disables it.

'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::
* Branch Trace Format::
* Branch Trace Configuration 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 at ADDR, which is the 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.).
     Depending on the operation to be performed, OP should be 'c' for
     step and continue operations (note that this is deprecated,
     supporting the 'vCont' command is a better option), and '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.

     The exact effect of this packet is not specified.

     For a bare-metal target, it may power cycle or reset the target
     system.  For that reason, the 'k' packet has no reply.

     For a single-process target, it may kill that process if possible.

     A multiple-process target may choose to kill just one process, or
     all that are under GDB's control.  For more precise control, use
     the vKill packet (*note vKill packet::).

     If the target system immediately closes the connection in response
     to 'k', GDB does not consider the lack of packet acknowledgment to
     be an error, and assumes the kill was successful.

     If connected using 'target extended-remote', and the target does
     not close the connection in response to a kill request, GDB probes
     the target state as if a new connection was opened (*note ?
     packet::).

'm ADDR,LENGTH'
     Read LENGTH addressable memory units starting at address ADDR
     (*note addressable memory unit::).  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 addressable
          memory units 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 addressable memory units starting at address ADDR
     (*note addressable memory unit::).  The data is given by XX...;
     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.  The 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, resuming at ADDR.  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, both of which are are 4 byte long.  There must be
     at least 3 digits in ADDR.

'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.
     'r START,END'
          Step once, and then keep stepping as long as the thread stops
          at addresses between START (inclusive) and END (exclusive).
          The remote stub reports a stop reply when either the thread
          goes out of the range or is stopped due to an unrelated
          reason, such as hitting a breakpoint.  *Note range stepping::.

          If the range is empty (START == END), then the action becomes
          equivalent to the 's' action.  In other words, single-step
          once, and report the stop (even if the stepped instruction
          jumps to START).

          (A stop reply may be sent at any point even if the PC is still
          within the stepping range; for example, it is valid to
          implement this packet in a degenerate way as a single
          instruction step operation.)

     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.

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

     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, which 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'
     *Note Notification Packets::.

'X ADDR,LENGTH:XX...'
     Write data to memory, where the data is transmitted in binary.
     Memory is specified by its address ADDR and number of addressable
     memory units LENGTH (*note addressable memory unit::); '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[;COND_LIST...][;cmds:PERSIST,CMD_LIST...]'
     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; COND_LIST is an optional list of
     conditional expressions in bytecode form that should be evaluated
     on the target's side.  These are the conditions that should be
     taken into consideration when deciding if the breakpoint trigger
     should be reported back to GDBN.

     See also the 'swbreak' stop reason (*note swbreak stop reason::)
     for how to best report a memory breakpoint event to GDB.

     The COND_LIST parameter is comprised of a series of expressions,
     concatenated without separators.  Each expression has the following
     form:

     'X LEN,EXPR'
          LEN is the length of the bytecode expression and EXPR is the
          actual conditional expression in bytecode form.

     The optional CMD_LIST parameter introduces commands that may be run
     on the target, rather than being reported back to GDB.  The
     parameter starts with a numeric flag PERSIST; if the flag is
     nonzero, then the breakpoint may remain active and the commands
     continue to be run even when GDB disconnects from the target.
     Following this flag is a series of expressions concatenated with no
     separators.  Each expression has the following form:

     'X LEN,EXPR'
          LEN is the length of the bytecode expression and EXPR is the
          actual conditional expression in bytecode form.

     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[;COND_LIST...]'
     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.  The KIND
     and COND_LIST have 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.  The
     number of bytes to watch is specified by KIND.

     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.  The
     number of bytes to watch is specified by KIND.

     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.  The
     number of bytes to watch is specified by KIND.

     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.  The data 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.  The 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.  The R part 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.

     'swbreak'
          The packet indicates a memory breakpoint instruction was
          executed, irrespective of whether it was GDB that planted the
          breakpoint or the breakpoint is hardcoded in the program.  The
          R part must be left empty.

          On some architectures, such as x86, at the architecture level,
          when a breakpoint instruction executes the program counter
          points at the breakpoint address plus an offset.  On such
          targets, the stub is responsible for adjusting the PC to point
          back at the breakpoint address.

          This packet should not be sent by default; older GDB versions
          did not support it.  GDB requests it, by supplying an
          appropriate 'qSupported' feature (*note qSupported::).  The
          remote stub must also supply the appropriate 'qSupported'
          feature indicating support.

          This packet is required for correct non-stop mode operation.

     'hwbreak'
          The packet indicates the target stopped for a hardware
          breakpoint.  The R part must be left empty.

          The same remarks about 'qSupported' and non-stop mode above
          apply.

     'fork'
          The packet indicates that 'fork' was called, and R is the
          thread ID of the new child process.  Refer to *note thread-id
          syntax:: for the format of the THREAD-ID field.  This packet
          is only applicable to targets that support fork events.

          This packet should not be sent by default; older GDB versions
          did not support it.  GDB requests it, by supplying an
          appropriate 'qSupported' feature (*note qSupported::).  The
          remote stub must also supply the appropriate 'qSupported'
          feature indicating support.

     'vfork'
          The packet indicates that 'vfork' was called, and R is the
          thread ID of the new child process.  Refer to *note thread-id
          syntax:: for the format of the THREAD-ID field.  This packet
          is only applicable to targets that support vfork events.

          This packet should not be sent by default; older GDB versions
          did not support it.  GDB requests it, by supplying an
          appropriate 'qSupported' feature (*note qSupported::).  The
          remote stub must also supply the appropriate 'qSupported'
          feature indicating support.

     'vforkdone'
          The packet indicates that a child process created by a vfork
          has either called 'exec' or terminated, so that the address
          spaces of the parent and child process are no longer shared.
          The R part is ignored.  This packet is only applicable to
          targets that support vforkdone events.

          This packet should not be sent by default; older GDB versions
          did not support it.  GDB requests it, by supplying an
          appropriate 'qSupported' feature (*note qSupported::).  The
          remote stub must also supply the appropriate 'qSupported'
          feature indicating support.

'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:

'QAgent:1'
'QAgent:0'
     Turn on or off the agent as a helper to perform some debugging
     operations delegated from GDB (*note Control Agent::).

'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.  The error number NN is given as 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.

     _Note: GDB will send the 'qfThreadInfo' query during the initial
     connection with the remote target, and the very first thread ID
     mentioned in the reply will be stopped by GDB in a subsequent
     message.  Therefore, the stub should ensure that the first thread
     ID in the 'qfThreadInfo' reply is suitable for being stopped by
     GDB._

'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.  The error number NN is given as 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, THREADID (eight hex
          digits), from the target.  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.  The error number NN is given as 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.  The error number NN is given as 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::).

'QProgramSignals: SIGNAL [;SIGNAL]...'
     Each listed SIGNAL may be delivered to the inferior process.
     Others should be silently discarded.

     In some cases, the remote stub may need to decide whether to
     deliver a signal to the program or not without GDB involvement.
     One example of that is while detaching -- the program's threads may
     have stopped for signals that haven't yet had a chance of being
     reported to GDB, and so the remote stub can use the signal list
     specified by this packet to know whether to deliver or ignore those
     pending signals.

     This does not influence whether to deliver a signal as requested by
     a resumption packet (*note vCont packet::).

     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.  Multiple
     'QProgramSignals' packets do not combine; any earlier
     'QProgramSignals' list is completely replaced by the new list.

     Reply:
     'OK'
          The request succeeded.

     'E NN'
          An error occurred.  The error number NN is given as hex
          digits.

     ''
          An empty reply indicates that 'QProgramSignals' is not
          supported by the stub.

     Use of this packet is controlled by the 'set remote
     program-signals' command (*note set remote program-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.  Both ADDRESS
     and LENGTH are encoded in hex; SEARCH-PATTERN is a sequence of
     bytes, also 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.).

     'swbreak'
          This feature indicates whether GDB supports the swbreak stop
          reason in stop replies.  *Note swbreak stop reason::, for
          details.

     'hwbreak'
          This feature indicates whether GDB supports the hwbreak stop
          reason in stop replies.  *Note swbreak stop reason::, for
          details.

     'fork-events'
          This feature indicates whether GDB supports fork event
          extensions to the remote protocol.  GDB does not use such
          extensions unless the stub also reports that it supports them
          by including 'fork-events+' in its 'qSupported' reply.

     'vfork-events'
          This feature indicates whether GDB supports vfork event
          extensions to the remote protocol.  GDB does not use such
          extensions unless the stub also reports that it supports them
          by including 'vfork-events+' in its 'qSupported' reply.

     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
                               Required                 Allowed
                                                        
     'PacketSize'              Yes            '-'       No
                                                        
     'qXfer:auxv:read'         No             '-'       Yes
                                                        
     'qXfer:btrace:read'       No             '-'       Yes
                                                        
     'qXfer:btrace-conf:read'  No             '-'       Yes
                                                        
     'qXfer:exec-file:read'    No             '-'       Yes
                                                        
     'qXfer:features:read'     No             '-'       Yes
                                                        
     'qXfer:libraries:read'    No             '-'       Yes
                                                        
     'qXfer:libraries-svr4:read'No            '-'       Yes
                                                        
     'augmented-libraries-svr4-read'No        '-'       No
                                                        
     '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:uib:read'          No             '-'       Yes
                                                        
     'qXfer:fdpic:read'        No             '-'       Yes
                                                        
     'Qbtrace:off'             Yes            '-'       Yes
                                                        
     'Qbtrace:bts'             Yes            '-'       Yes
                                                        
     'Qbtrace:pt'              Yes            '-'       Yes
                                                        
     'Qbtrace-conf:bts:size'   Yes            '-'       Yes
                                                        
     'Qbtrace-conf:pt:size'    Yes            '-'       Yes
                                                        
     'QNonStop'                No             '-'       Yes
                                                        
     'QPassSignals'            No             '-'       Yes
                                                        
     'QStartNoAckMode'         No             '-'       Yes
                                                        
     'multiprocess'            No             '-'       No
                                                        
     'ConditionalBreakpoints'  No             '-'       No
                                                        
     'ConditionalTracepoints'  No             '-'       No
                                                        
     'ReverseContinue'         No             '-'       No
                                                        
     'ReverseStep'             No             '-'       No
                                                        
     'TracepointSource'        No             '-'       No
                                                        
     'QAgent'                  No             '-'       No
                                                        
     'QAllow'                  No             '-'       No
                                                        
     'QDisableRandomization'   No             '-'       No
                                                        
     'EnableDisableTracepoints'No             '-'       No
                                                        
     'QTBuffer:size'           No             '-'       No
                                                        
     'tracenz'                 No             '-'       No
                                                        
     'BreakpointCommands'      No             '-'       No
                                                        
     'swbreak'                 No             '-'       No
                                                        
     'hwbreak'                 No             '-'       No
                                                        
     'fork-events'             No             '-'       No
                                                        
     'vfork-events'            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:btrace:read'
          The remote stub understands the 'qXfer:btrace:read' packet
          (*note qXfer btrace read::).

     'qXfer:btrace-conf:read'
          The remote stub understands the 'qXfer:btrace-conf:read'
          packet (*note qXfer btrace-conf read::).

     'qXfer:exec-file:read'
          The remote stub understands the 'qXfer:exec-file:read' packet
          (*note qXfer executable filename 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::).

     'augmented-libraries-svr4-read'
          The remote stub understands the augmented form of 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:uib:read'
          The remote stub understands the 'qXfer:uib:read' packet (*note
          qXfer unwind info block::).

     '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::).

     'ConditionalBreakpoints'
          The target accepts and implements evaluation of conditional
          expressions defined for breakpoints.  The target will only
          report breakpoint triggers when such conditions are true
          (*note Break Conditions: Conditions.).

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

     'QAgent'
          The remote stub understands the 'QAgent' packet.

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

     'QTBuffer:size'
          The remote stub supports the 'QTBuffer:size' (*note
          QTBuffer-size::) packet that allows to change the size of the
          trace buffer.

     'tracenz'
          The remote stub supports the 'tracenz' bytecode for collecting
          strings.  See *note Bytecode Descriptions:: for details about
          the bytecode.

     'BreakpointCommands'
          The remote stub supports running a breakpoint's command list
          itself, rather than reporting the hit to GDB.

     'Qbtrace:off'
          The remote stub understands the 'Qbtrace:off' packet.

     'Qbtrace:bts'
          The remote stub understands the 'Qbtrace:bts' packet.

     'Qbtrace:pt'
          The remote stub understands the 'Qbtrace:pt' packet.

     'Qbtrace-conf:bts:size'
          The remote stub understands the 'Qbtrace-conf:bts:size'
          packet.

     'Qbtrace-conf:pt:size'
          The remote stub understands the 'Qbtrace-conf:pt:size' packet.

     'swbreak'
          The remote stub reports the 'swbreak' stop reason for memory
          breakpoints.

     'hwbreak'
          The remote stub reports the 'hwbreak' stop reason for hardware
          breakpoints.

     'fork-events'
          The remote stub reports the 'fork' stop reason for fork
          events.

     'vfork-events'
          The remote stub reports the 'vfork' stop reason for vfork
          events and vforkdone events.

'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 from the target OS a printable string description of thread
     attributes for the thread THREAD-ID; see *note thread-id syntax::,
     for the forms of THREAD-ID.  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:btrace:read:ANNEX:OFFSET,LENGTH'

          Return a description of the current branch trace.  *Note
          Branch Trace Format::.  The annex part of the generic 'qXfer'
          packet may have one of the following values:

          'all'
               Returns all available branch trace.

          'new'
               Returns all available branch trace if the branch trace
               changed since the last read request.

          'delta'
               Returns the new branch trace since the last read request.
               Adds a new block to the end of the trace that begins at
               zero and ends at the source location of the first branch
               in the trace buffer.  This extra block is used to stitch
               traces together.

               If the trace buffer overflowed, returns an error
               indicating the overflow.

          This packet is not probed by default; the remote stub must
          request it by supplying an appropriate 'qSupported' response
          (*note qSupported::).

     'qXfer:btrace-conf:read::OFFSET,LENGTH'

          Return a description of the current branch trace
          configuration.  *Note Branch Trace Configuration Format::.

          This packet is not probed by default; the remote stub must
          request it by supplying an appropriate 'qSupported' response
          (*note qSupported::).

     'qXfer:exec-file:read:ANNEX:OFFSET,LENGTH'
          Return the full absolute name of the file that was executed to
          create a process running on the remote system.  The annex
          specifies the numeric process ID of the process to query,
          encoded as a hexadecimal number.  If the annex part is empty
          the remote stub should return the filename corresponding to
          the currently executing process.

          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 unless the remote stub indicated it supports the
          augmented form of this packet by supplying an appropriate
          'qSupported' response (*note qXfer read::, *note
          qSupported::).

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

          If the remote stub indicates it supports the augmented form of
          this packet then the annex part of the generic 'qXfer' packet
          may contain a semicolon-separated list of 'NAME=VALUE'
          arguments.  The currently supported arguments are:

          'start=ADDRESS'
               A hexadecimal number specifying the address of the
               'struct link_map' to start reading the library list from.
               If unset or zero then the first 'struct link_map' in the
               library list will be chosen as the starting point.

          'prev=ADDRESS'
               A hexadecimal number specifying the address of the
               'struct link_map' immediately preceding the 'struct
               link_map' specified by the 'start' argument.  If unset or
               zero then the remote stub will expect that no 'struct
               link_map' exists prior to the starting point.

          Arguments that are not understood by the remote stub will be
          silently ignored.

     '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:uib:read:PC:OFFSET,LENGTH'

          Return the unwind information block for PC.  This packet is
          used on OpenVMS/ia64 to ask the kernel unwind information.

          This packet is not probed by default.

     '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).  It is
          possible for DATA to 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.  It is possible for DATA to
          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.  The NN part 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.  The binary-encoded data (*note Binary Data::) to be written
     is given by 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: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.  The NN part 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.

'Qbtrace:bts'
     Enable branch tracing for the current thread using Branch Trace
     Store.

     Reply:
     'OK'
          Branch tracing has been enabled.
     'E.errtext'
          A badly formed request or an error was encountered.

'Qbtrace:pt'
     Enable branch tracing for the current thread using Intel(R)
     Processor Trace.

     Reply:
     'OK'
          Branch tracing has been enabled.
     'E.errtext'
          A badly formed request or an error was encountered.

'Qbtrace:off'
     Disable branch tracing for the current thread.

     Reply:
     'OK'
          Branch tracing has been disabled.
     'E.errtext'
          A badly formed request or an error was encountered.

'Qbtrace-conf:bts:size=VALUE'
     Set the requested ring buffer size for new threads that use the
     btrace recording method in bts format.

     Reply:
     'OK'
          The ring buffer size has been set.
     'E.errtext'
          A badly formed request or an error was encountered.

'Qbtrace-conf:pt:size=VALUE'
     Set the requested ring buffer size for new threads that use the
     btrace recording method in pt format.

     Reply:
     'OK'
          The ring buffer size has been set.
     'E.errtext'
          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.

* Menu:

* ARM-Specific Protocol Details::
* MIPS-Specific Protocol Details::


File: gdb.info,  Node: ARM-Specific Protocol Details,  Next: MIPS-Specific Protocol Details,  Up: Architecture-Specific Protocol Details

E.5.1 ARM-specific Protocol Details
-----------------------------------

* Menu:

* ARM Breakpoint Kinds::


File: gdb.info,  Node: ARM Breakpoint Kinds,  Up: ARM-Specific Protocol Details

E.5.1.1 ARM 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.


File: gdb.info,  Node: MIPS-Specific Protocol Details,  Prev: ARM-Specific Protocol Details,  Up: Architecture-Specific Protocol Details

E.5.2 MIPS-specific Protocol Details
------------------------------------

* Menu:

* MIPS Register packet Format::
* MIPS Breakpoint Kinds::


File: gdb.info,  Node: MIPS Register packet Format,  Next: MIPS Breakpoint Kinds,  Up: MIPS-Specific Protocol Details

E.5.2.1 MIPS 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: MIPS Breakpoint Kinds,  Prev: MIPS Register packet Format,  Up: MIPS-Specific Protocol Details

E.5.2.2 MIPS Breakpoint Kinds
.............................

These breakpoint kinds are defined for the 'Z0' and 'Z1' packets.

2
     16-bit MIPS16 mode breakpoint.

3
     16-bit microMIPS mode breakpoint.

4
     32-bit standard MIPS mode breakpoint.

5
     32-bit microMIPS mode breakpoint.


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.  The STEP gives the tracepoint's step count, and PASS
     gives 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.  The 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, 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.  The agent expression EXPR is 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.  The 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:BUILTIN:NAME'
     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.  The value BUILTIN should be 1 (one) if the trace
     state variable is builtin and 0 (zero) if it is not builtin.  GDB
     only sets BUILTIN to 1 if a previous 'qTfV' or 'qTsV' packet had it
     set.  The contents of NAME is the hex-encoded name (without the
     leading '$') of the trace state variable.

'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 a
          hexadecimal number greater or equal to 1.  A reply of 1 means
          that a fast tracepoint may be placed on any instruction
          regardless of size.
     '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);
          it 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.  The error number NN is given as hex
          digits.
     ''
          An empty reply indicates that the request is not supported by
          the stub.

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

'QTBuffer:size:SIZE'
     This packet directs the target to make the trace buffer be of size
     SIZE if possible.  A value of '-1' tells the target to use whatever
     size it prefers.

'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.  The 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 specifying 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: FILENAME, FLAGS, MODE'
     Open a file at FILENAME and return a file descriptor for it, or
     return -1 if an error occurs.  The FILENAME 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:fstat: FD'
     Get information about the open file corresponding to FD.  On
     success the information is returned as a binary attachment and the
     return value is the size of this attachment in bytes.  If an error
     occurs the return value is -1.  The format of the returned binary
     attachment is as described in *note struct stat::.

'vFile:unlink: FILENAME'
     Delete the file at FILENAME on the target.  Return 0, or -1 if an
     error occurs.  The FILENAME 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.

'vFile:setfs: PID'
     Select the filesystem on which 'vFile' operations with FILENAME
     arguments will operate.  This is required for GDB to be able to
     access files on remote targets where the remote stub does not share
     a common filesystem with the inferior(s).

     If PID is nonzero, select the filesystem as seen by process PID.
     If PID is zero, select the filesystem as seen by the remote stub.
     Return 0 on success, or -1 if an error occurs.  If 'vFile:setfs:'
     indicates success, the selected filesystem remains selected until
     the next successful 'vFile:setfs:' operation.

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

   Each notification is comprised of three parts:
'NAME:EVENT'
     The notification packet is sent by the side that initiates the
     exchange (currently, only the stub does that), with EVENT carrying
     the specific information about the notification, and NAME
     specifying the name of the notification.
'ACK'
     The acknowledge sent by the other side, usually GDB, to acknowledge
     the exchange and request the event.

   The purpose of an asynchronous notification mechanism is to report to
GDB that something interesting happened in the remote stub.

   The remote stub may send notification NAME:EVENT at any time, but GDB
acknowledges the notification when appropriate.  The notification event
is pending before GDB acknowledges.  Only one notification at a time may
be pending; if additional events occur before GDB has acknowledged the
previous notification, they must be queued by the stub for later
synchronous transmission in response to ACK packets from GDB.  Because
the notification mechanism is unreliable, the stub is permitted to
resend a notification if it believes GDB may not have received it.

   Specifically, notifications 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 notification, GDB shall acknowledge it by sending a
ACK 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 ACK packet, if the stub has other queued events to
report to GDB, it shall respond by sending a normal EVENT.  GDB shall
then send another ACK packet to solicit further responses; again, it is
permitted to send other, unrelated packets as well which the stub should
process normally.

   If the stub receives a ACK packet and there are no additional EVENT
to report, the stub shall return an 'OK' response.  At this point, GDB
has finished processing a notification and the stub has completed
sending any queued events.  GDB won't accept any new notifications until
the final 'OK' is received .  If further notification events occur, the
stub shall send a new notification, GDB shall accept the notification,
and the process shall be repeated.

   The process of asynchronous notification can be illustrated by the
following example:
     <- %%Stop:T0505:98e7ffbf;04:4ce6ffbf;08:b1b6e54c;thread:p7526.7526;core:0;
     ...
     -> vStopped
     <- T0505:68f37db7;04:40f37db7;08:63850408;thread:p7526.7528;core:0;
     -> vStopped
     <- T0505:68e3fdb6;04:40e3fdb6;08:63850408;thread:p7526.7529;core:0;
     -> vStopped
     <- OK

   The following notifications are defined:

NotificationAck     Event                       Description
                                                
Stop      vStopped  REPLY.  The REPLY has the   Report an asynchronous
                    form of a stop reply, as    stop event in non-stop
                    described in *note Stop     mode.
                    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.

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

   If the stub supports non-stop mode, it should also support the
'swbreak' stop reason if software breakpoints are supported, and the
'hwbreak' stop reason if hardware breakpoints are supported (*note
swbreak stop reason::).  This is because given the asynchronous nature
of non-stop mode, between the time a thread hits a breakpoint and the
time the event is finally processed by GDB, the breakpoint may have
already been removed from the target.  Due to this, GDB needs to be able
to tell whether a trap stop was caused by a delayed breakpoint event,
which should be ignored, as opposed to a random trap signal, which
should be reported to the user.  Note the 'swbreak' feature implies that
the target is responsible for adjusting the PC when a software
breakpoint triggers, if necessary, such as on the x86 architecture.


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,  Next: Branch Trace 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"/>

   * A block indicating trace state variable numbered NUMBER has been
     collected:

          <tvar id="NUMBER"/>

   The formal DTD for the traceframe info format is given below:

     <!ELEMENT traceframe-info  (memory | tvar)* >
     <!ATTLIST traceframe-info  version CDATA   #FIXED  "1.0">

     <!ELEMENT memory        EMPTY>
     <!ATTLIST memory        start   CDATA   #REQUIRED
                             length  CDATA   #REQUIRED>
     <!ELEMENT tvar>
     <!ATTLIST tvar          id      CDATA   #REQUIRED>


File: gdb.info,  Node: Branch Trace Format,  Next: Branch Trace Configuration Format,  Prev: Traceframe Info Format,  Up: Remote Protocol

E.19 Branch Trace Format
========================

In order to display the branch trace of an inferior thread, GDB needs to
obtain the list of branches.  This list is represented as list of
sequential code blocks that are connected via branches.  The code in
each block has been executed sequentially.

   This list is obtained using the 'qXfer:btrace:read' (*note qXfer
btrace 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 btrace
               PUBLIC "+//IDN gnu.org//DTD GDB Branch Trace V1.0//EN"
                      "http://sourceware.org/gdb/gdb-btrace.dtd">
     <btrace>
        block...
     </btrace>

   * A block of sequentially executed instructions starting at BEGIN and
     ending at END:

          <block begin="BEGIN" end="END"/>

   The formal DTD for the branch trace format is given below:

     <!ELEMENT btrace  (block* | pt) >
     <!ATTLIST btrace  version CDATA   #FIXED "1.0">

     <!ELEMENT block        EMPTY>
     <!ATTLIST block        begin  CDATA   #REQUIRED
                            end    CDATA   #REQUIRED>

     <!ELEMENT pt (pt-config?, raw?)>

     <!ELEMENT pt-config (cpu?)>

     <!ELEMENT cpu EMPTY>
     <!ATTLIST cpu vendor   CDATA #REQUIRED
                   family   CDATA #REQUIRED
                   model    CDATA #REQUIRED
                   stepping CDATA #REQUIRED>

     <!ELEMENT raw (#PCDATA)>


File: gdb.info,  Node: Branch Trace Configuration Format,  Prev: Branch Trace Format,  Up: Remote Protocol

E.20 Branch Trace Configuration Format
======================================

For each inferior thread, GDB can obtain the branch trace configuration
using the 'qXfer:btrace-conf:read' (*note qXfer btrace-conf read::)
packet.

   The configuration describes the branch trace format and configuration
settings for that format.  The following information is described:

'bts'
     This thread uses the "Branch Trace Store" (BTS) format.
     'size'
          The size of the BTS ring buffer in bytes.
'pt'
     This thread uses the "Intel(R) Processor Trace" (Intel(R) PT)
     format.
     'size'
          The size of the Intel(R) PT ring buffer in bytes.

   GDB must be linked with the Expat library to support XML branch trace
configuration discovery.  *Note Expat::.

   The formal DTD for the branch trace configuration format is given
below:

     <!ELEMENT btrace-conf	(bts?, pt?)>
     <!ATTLIST btrace-conf	version	CDATA	#FIXED "1.0">

     <!ELEMENT bts	EMPTY>
     <!ATTLIST bts	size	CDATA	#IMPLIED>

     <!ELEMENT pt	EMPTY>
     <!ATTLIST pt	size	CDATA	#IMPLIED>

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

'printf' (0x34) NUMARGS STRING =>
     Do a formatted print, in the style of the C function 'printf').
     The value of NUMARGS is the number of arguments to expect on the
     stack, while STRING is the format string, prefixed with a two-byte
     length.  The last byte of the string must be zero, and is included
     in the length.  The format string includes escaped sequences just
     as it appears in C source, so for instance the format string
     '"\t%d\n"' is six characters long, and the output will consist of a
     tab character, a decimal number, and a newline.  At the top of the
     stack, above the values to be printed, this bytecode will pop a
     "function" and "channel".  If the function is nonzero, then the
     target may treat it as a function and call it, passing the channel
     as a first argument, as with the C function 'fprintf'.  If the
     function is zero, then the target may simply call a standard
     formatted print function of its choice.  In all, this bytecode pops
     2 + NUMARGS stack elements, and pushes nothing.

'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.  It 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.  It 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:

* AArch64 Features::
* ARM Features::
* i386 Features::
* MicroBlaze Features::
* MIPS Features::
* M68K Features::
* Nios II Features::
* PowerPC Features::
* S/390 and System z Features::
* TIC6x Features::


File: gdb.info,  Node: AArch64 Features,  Next: ARM Features,  Up: Standard Target Features

G.4.1 AArch64 Features
----------------------

The 'org.gnu.gdb.aarch64.core' feature is required for AArch64 targets.
It should contain registers 'x0' through 'x30', 'sp', 'pc', and 'cpsr'.

   The 'org.gnu.gdb.aarch64.fpu' feature is optional.  If present, it
should contain registers 'v0' through 'v31', 'fpsr', and 'fpcr'.


File: gdb.info,  Node: ARM Features,  Next: i386 Features,  Prev: AArch64 Features,  Up: Standard Target Features

G.4.2 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: MicroBlaze Features,  Prev: ARM Features,  Up: Standard Target Features

G.4.3 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.mpx' is an optional feature representing
Intel(R) Memory Protection Extension (MPX). It should describe the
following registers:

   - 'bnd0raw' through 'bnd3raw' for i386 and amd64.
   - 'bndcfgu' and 'bndstatus' for i386 and amd64.

   The 'org.gnu.gdb.i386.linux' feature is optional.  It should describe
a single register, 'orig_eax'.

   The 'org.gnu.gdb.i386.avx512' feature is optional and requires the
'org.gnu.gdb.i386.avx' feature.  It should describe additional XMM
registers:

   - 'xmm16h' through 'xmm31h', only valid for amd64.

   It should describe the upper 128 bits of additional YMM registers:

   - 'ymm16h' through 'ymm31h', only valid for amd64.

   It should describe the upper 256 bits of ZMM registers:

   - 'zmm0h' through 'zmm7h' for i386.
   - 'zmm0h' through 'zmm15h' for amd64.

   It should describe the additional ZMM registers:

   - 'zmm16h' through 'zmm31h', only valid for amd64.


File: gdb.info,  Node: MicroBlaze Features,  Next: MIPS Features,  Prev: i386 Features,  Up: Standard Target Features

G.4.4 MicroBlaze Features
-------------------------

The 'org.gnu.gdb.microblaze.core' feature is required for MicroBlaze
targets.  It should contain registers 'r0' through 'r31', 'rpc', 'rmsr',
'rear', 'resr', 'rfsr', 'rbtr', 'rpvr', 'rpvr1' through 'rpvr11',
'redr', 'rpid', 'rzpr', 'rtlbx', 'rtlbsx', 'rtlblo', and 'rtlbhi'.

   The 'org.gnu.gdb.microblaze.stack-protect' feature is optional.  If
present, it should contain registers 'rshr' and 'rslr'


File: gdb.info,  Node: MIPS Features,  Next: M68K Features,  Prev: MicroBlaze Features,  Up: Standard Target Features

G.4.5 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.dsp' feature is optional.  It should contain
registers 'hi1' through 'hi3', 'lo1' through 'lo3', and 'dspctl'.  The
'dspctl' register should be 32-bit and the rest 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: Nios II Features,  Prev: MIPS Features,  Up: Standard Target Features

G.4.6 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: Nios II Features,  Next: PowerPC Features,  Prev: M68K Features,  Up: Standard Target Features

G.4.7 Nios II Features
----------------------

The 'org.gnu.gdb.nios2.cpu' feature is required for Nios II targets.  It
should contain the 32 core registers ('zero', 'at', 'r2' through 'r23',
'et' through 'ra'), 'pc', and the 16 control registers ('status' through
'mpuacc').


File: gdb.info,  Node: PowerPC Features,  Next: S/390 and System z Features,  Prev: Nios II Features,  Up: Standard Target Features

G.4.8 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: S/390 and System z Features,  Next: TIC6x Features,  Prev: PowerPC Features,  Up: Standard Target Features

G.4.9 S/390 and System z Features
---------------------------------

The 'org.gnu.gdb.s390.core' feature is required for S/390 and System z
targets.  It should contain the PSW and the 16 general registers.  In
particular, System z targets should provide the 64-bit registers 'pswm',
'pswa', and 'r0' through 'r15'.  S/390 targets should provide the 32-bit
versions of these registers.  A System z target that runs in 31-bit
addressing mode should provide 32-bit versions of 'pswm' and 'pswa', as
well as the general register's upper halves 'r0h' through 'r15h', and
their lower halves 'r0l' through 'r15l'.

   The 'org.gnu.gdb.s390.fpr' feature is required.  It should contain
the 64-bit registers 'f0' through 'f15', and 'fpc'.

   The 'org.gnu.gdb.s390.acr' feature is required.  It should contain
the 32-bit registers 'acr0' through 'acr15'.

   The 'org.gnu.gdb.s390.linux' feature is optional.  It should contain
the register 'orig_r2', which is 64-bit wide on System z targets and
32-bit otherwise.  In addition, the feature may contain the 'last_break'
register, whose width depends on the addressing mode, as well as the
'system_call' register, which is always 32-bit wide.

   The 'org.gnu.gdb.s390.tdb' feature is optional.  It should contain
the 64-bit registers 'tdb0', 'tac', 'tct', 'atia', and 'tr0' through
'tr15'.

   The 'org.gnu.gdb.s390.vx' feature is optional.  It should contain
64-bit wide registers 'v0l' through 'v15l', which will be combined by
GDB with the floating point registers 'f0' through 'f15' to present the
128-bit wide vector registers 'v0' through 'v15'.  In addition, this
feature should contain the 128-bit wide vector registers 'v16' through
'v31'.


File: gdb.info,  Node: TIC6x Features,  Prev: S/390 and System z Features,  Up: Standard Target Features

G.4.10 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: Man Pages,  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 8.  Versions 1, 2 and 3 are
          obsolete.  Version 4 uses a different hashing function from
          versions 5 and 6.  Version 6 includes symbols for inlined
          functions, whereas versions 4 and 5 do not.  Version 7 adds
          attributes to the CU indices in the symbol table.  Version 8
          specifies that symbols from DWARF type units
          ('DW_TAG_type_unit') refer to the type unit's symbol table and
          not the compilation unit ('DW_TAG_comp_unit') using the type.

          GDB will only read version 4, 5, or 6 indices by specifying
          'set use-deprecated-index-sections on'.  GDB has a workaround
          for potentially broken version 7 indices so it is currently
          not flagged as deprecated.

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

     Versions 5 to 7
          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 and symbol attributes of a CU in
     the CU list.  This element in the hash table is used to indicate
     which CUs define the symbol and how the symbol is used.  See below
     for the format of each CU index+attributes entry.

     A string in the constant pool is zero-terminated.

   Attributes were added to CU index values in '.gdb_index' version 7.
If a symbol has multiple uses within a CU then there is one CU
index+attributes value for each use.

   The format of each CU index+attributes entry is as follows (bit 0 =
LSB):

Bits 0-23
     This is the index of the CU in the CU list.
Bits 24-27
     These bits are reserved for future purposes and must be zero.
Bits 28-30
     The kind of the symbol in the CU.

     0
          This value is reserved and should not be used.  By reserving
          zero the full 'offset_type' value is backwards compatible with
          previous versions of the index.
     1
          The symbol is a type.
     2
          The symbol is a variable or an enum value.
     3
          The symbol is a function.
     4
          Any other kind of symbol.
     5,6,7
          These values are reserved.

Bit 31
     This bit is zero if the value is global and one if it is static.

     The determination of whether a symbol is global or static is
     complicated.  The authorative reference is the file 'dwarf2read.c'
     in GDB sources.

   This pseudo-code describes the computation of a symbol's kind and
global/static attributes in the index.

     is_external = get_attribute (die, DW_AT_external);
     language = get_attribute (cu_die, DW_AT_language);
     switch (die->tag)
       {
       case DW_TAG_typedef:
       case DW_TAG_base_type:
       case DW_TAG_subrange_type:
         kind = TYPE;
         is_static = 1;
         break;
       case DW_TAG_enumerator:
         kind = VARIABLE;
         is_static = (language != CPLUS && language != JAVA);
         break;
       case DW_TAG_subprogram:
         kind = FUNCTION;
         is_static = ! (is_external || language == ADA);
         break;
       case DW_TAG_constant:
         kind = VARIABLE;
         is_static = ! is_external;
         break;
       case DW_TAG_variable:
         kind = VARIABLE;
         is_static = ! is_external;
         break;
       case DW_TAG_namespace:
         kind = TYPE;
         is_static = 0;
         break;
       case DW_TAG_class_type:
       case DW_TAG_interface_type:
       case DW_TAG_structure_type:
       case DW_TAG_union_type:
       case DW_TAG_enumeration_type:
         kind = TYPE;
         is_static = (language != CPLUS && language != JAVA);
         break;
       default:
         assert (0);
       }


File: gdb.info,  Node: Man Pages,  Next: Copying,  Prev: Index Section Format,  Up: Top

Appendix K Manual pages
***********************

* Menu:

* gdb man::                     The GNU Debugger man page
* gdbserver man::               Remote Server for the GNU Debugger man page
* gcore man::                   Generate a core file of a running program
* gdbinit man::                 gdbinit scripts


File: gdb.info,  Node: gdb man,  Next: gdbserver man,  Up: Man Pages

gdb man
=======

gdb ['-help'] ['-nh'] ['-nx'] ['-q'] ['-batch'] ['-cd='DIR] ['-f']
['-b' BPS] ['-tty='DEV] ['-s' SYMFILE] ['-e' PROG] ['-se' PROG]
['-c' CORE] ['-p' PROCID] ['-x' CMDS] ['-d' DIR] [PROG|PROG PROCID|PROG
CORE]

   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, C++, Fortran and
Modula-2.

   GDB is invoked with the shell command 'gdb'.  Once started, it reads
commands from the terminal until you tell it to exit with the GDB
command 'quit'.  You can get online help from GDB itself by using the
command 'help'.

   You can run 'gdb' with no arguments or options; but the most usual
way to start GDB is with one argument or two, specifying an executable
program as the argument:

     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
     gdb -p 1234

would attach GDB to process '1234' (unless you also have a file named
'1234'; GDB does check for a core file first).  With option '-p' you can
omit the PROGRAM filename.

   Here are some of the most frequently needed GDB commands:

'break [FILE:]FUNCTIOP'
     Set a breakpoint at FUNCTION (in FILE).

'run [ARGLIST]'
     Start your program (with ARGLIST, if specified).

'bt'
     Backtrace: display the program stack.

'print EXPR'
     Display the value of an expression.

'c'
     Continue running your program (after stopping, e.g.  at a
     breakpoint).

'next'
     Execute next program line (after stopping); step _over_ any
     function calls in the line.

'edit [FILE:]FUNCTION'
     look at the program line where it is presently stopped.

'list [FILE:]FUNCTION'
     type the text of the program in the vicinity of where it is
     presently stopped.

'step'
     Execute next program line (after stopping); step _into_ any
     function calls in the line.

'help [NAME]'
     Show information about GDB command NAME, or general information
     about using GDB.

'quit'
     Exit from GDB.

   Any arguments other than options specify an executable file and core
file (or process ID); that is, the first argument encountered with no
associated option flag is equivalent to a '-se' option, and the second,
if any, is equivalent to a '-c' option if it's the name of a file.  Many
options have both long and short forms; both are shown here.  The long
forms are also recognized if you truncate them, so long as enough of the
option is present to be unambiguous.  (If you prefer, you can flag
option arguments with '+' rather than '-', though we illustrate the more
usual convention.)

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

'-help'
'-h'
     List all options, with brief explanations.

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

'-write'
     Enable writing into executable and core files.

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

'-command=FILE'
'-x FILE'
     Execute GDB commands from file FILE.

'-ex COMMAND'
     Execute given GDB COMMAND.

'-directory=DIRECTORY'
'-d DIRECTORY'
     Add DIRECTORY to the path to search for source files.

'-nh'
     Do not execute commands from '~/.gdbinit'.

'-nx'
'-n'
     Do not execute commands from any '.gdbinit' initialization files.

'-quiet'
'-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 '.gdbinit', if not
     inhibited).  Exit with nonzero status if an error occurs in
     executing the GDB commands in the command files.

     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.

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

'-fullname'
'-f'
     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 the 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.

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

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


File: gdb.info,  Node: gdbserver man,  Next: gcore man,  Prev: gdb man,  Up: Man Pages

gdbserver man
=============

gdbserver COMM PROG [ARGS...]

gdbserver -attach COMM PID

gdbserver -multi COMM

   'gdbserver' is a program that allows you to run GDB on a different
machine than the one which is running the program being debugged.

Usage (server (target) side)
----------------------------

First, you need to have a copy of the program you want to debug put onto
the target system.  The program can be stripped to save space if needed,
as 'gdbserver' doesn't care about symbols.  All symbol handling is taken
care of by the GDB running on the host system.

   To use the server, you log on to the target system, and run the
'gdbserver' program.  You must tell it (a) how to communicate with GDB,
(b) the name of your program, and (c) its arguments.  The general syntax
is:

     target> gdbserver COMM PROGRAM [ARGS ...]

   For example, using a serial port, you might say:

     target> gdbserver /dev/com1 emacs foo.txt

   This tells 'gdbserver' to debug emacs with an argument of foo.txt,
and to communicate with GDB via '/dev/com1'.  'gdbserver' now waits
patiently for the host GDB to communicate with it.

   To use a TCP connection, you could say:

     target> gdbserver host:2345 emacs foo.txt

   This says pretty much the same thing as the last example, except that
we are going to communicate with the 'host' GDB via TCP. The 'host:2345'
argument means that we are expecting to see a TCP connection from '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 existing TCP ports on the target system.  This
same port number must be used in the host GDBs 'target remote' command,
which will be described shortly.  Note that if you chose a port number
that conflicts with another service, 'gdbserver' will print an error
message and exit.

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

   To start 'gdbserver' without supplying an initial command to run or
process ID to attach, use the '--multi' command line option.  In such
case you should connect using 'target extended-remote' to start the
program you want to debug.

     target> gdbserver --multi COMM

Usage (host side)
-----------------

You need an unstripped copy of the target program on your host system,
since GDB needs to examine it's symbol tables and such.  Start up GDB as
you normally would, with the target program as the first argument.  (You
may need to use the '--baud' option if the serial line is running at
anything except 9600 baud.)  That is 'gdb TARGET-PROG', or 'gdb --baud
BAUD TARGET-PROG'.  After that, the only new command you need to know
about is 'target remote' (or 'target extended-remote').  Its argument is
either a device name (usually a serial device, like '/dev/ttyb'), or a
'HOST:PORT' descriptor.  For example:

     (gdb) target remote /dev/ttyb

communicates with the server via serial line '/dev/ttyb', and:

     (gdb) target remote the-target:2345

communicates via a TCP connection to port 2345 on host 'the-target',
where you previously started up 'gdbserver' with the same port number.
Note that for TCP connections, you must start up 'gdbserver' prior to
using the 'target remote' command, otherwise you may get an error that
looks something like 'Connection refused'.

   'gdbserver' can also debug multiple inferiors at once, described in
*note Inferiors and Programs::.  In such case use the 'extended-remote'
GDB command variant:

     (gdb) target extended-remote the-target:2345

   The 'gdbserver' option '--multi' may or may not be used in such case.

   There are three different modes for invoking 'gdbserver':

   * Debug a specific program specified by its program name:

          gdbserver COMM PROG [ARGS...]

     The COMM parameter specifies how should the server communicate with
     GDB; it is either a device name (to use a serial line), a TCP port
     number (':1234'), or '-' or 'stdio' to use stdin/stdout of
     'gdbserver'.  Specify the name of the program to debug in PROG.
     Any remaining arguments will be passed to the program verbatim.
     When the program exits, GDB will close the connection, and
     'gdbserver' will exit.

   * Debug a specific program by specifying the process ID of a running
     program:

          gdbserver --attach COMM PID

     The COMM parameter is as described above.  Supply the process ID of
     a running program in PID; GDB will do everything else.  Like with
     the previous mode, when the process PID exits, GDB will close the
     connection, and 'gdbserver' will exit.

   * Multi-process mode - debug more than one program/process:

          gdbserver --multi COMM

     In this mode, GDB can instruct 'gdbserver' which command(s) to run.
     Unlike the other 2 modes, GDB will not close the connection when a
     process being debugged exits, so you can debug several processes in
     the same session.

   In each of the modes you may specify these options:

'--help'
     List all options, with brief explanations.

'--version'
     This option causes 'gdbserver' to print its version number and
     exit.

'--attach'
     'gdbserver' will attach to a running program.  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.

'--multi'
     To start 'gdbserver' without supplying an initial command to run or
     process ID to attach, use this command line option.  Then you can
     connect using 'target extended-remote' and start the program you
     want to debug.  The syntax is:

          target> gdbserver --multi COMM

'--debug'
     Instruct 'gdbserver' to display extra status information about the
     debugging process.  This option is intended for 'gdbserver'
     development and for bug reports to the developers.

'--remote-debug'
     Instruct 'gdbserver' to display remote protocol debug output.  This
     option is intended for 'gdbserver' development and for bug reports
     to the developers.

'--debug-format=option1[,option2,...]'
     Instruct 'gdbserver' to include extra information in each line of
     debugging output.  *Note Other Command-Line Arguments for
     gdbserver::.

'--wrapper'
     Specify a wrapper to launch programs for debugging.  The option
     should be followed by the name of the wrapper, then any
     command-line arguments to pass to the wrapper, then '--' indicating
     the end of the wrapper arguments.

'--once'
     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.


File: gdb.info,  Node: gcore man,  Next: gdbinit man,  Prev: gdbserver man,  Up: Man Pages

gcore
=====

gcore [-o FILENAME] PID

   Generate a core dump of a running program with process ID PID.
Produced file is equivalent to a kernel produced core file as if the
process crashed (and if 'ulimit -c' were used to set up an appropriate
core dump limit).  Unlike after a crash, after 'gcore' the program
remains running without any change.

'-o FILENAME'
     The optional argument FILENAME specifies the file name where to put
     the core dump.  If not specified, the file name defaults to
     'core.PID', where PID is the running program process ID.


File: gdb.info,  Node: gdbinit man,  Prev: gcore man,  Up: Man Pages

gdbinit
=======


~/.gdbinit

./.gdbinit

   These files contain GDB commands to automatically execute during GDB
startup.  The lines of contents are canned sequences of commands,
described in *note Sequences::.

   Please read more in *note Startup::.

'(not enabled with --with-system-gdbinit during compilation)'
     System-wide initialization file.  It is executed unless user
     specified GDB option '-nx' or '-n'.  See more in *note System-wide
     configuration::.

'~/.gdbinit'
     User initialization file.  It is executed unless user specified GDB
     options '-nx', '-n' or '-nh'.

'./.gdbinit'
     Initialization file for current directory.  It may need to be
     enabled with GDB security command 'set auto-load local-gdbinit'.
     See more in *note Init File in the Current Directory::.


File: gdb.info,  Node: Copying,  Next: GNU Free Documentation License,  Prev: Man Pages,  Up: Top

Appendix L 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 M 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  122)
* '#' in Modula-2:                       GDB/M2.             (line   18)
* '$':                                   Value History.      (line   13)
* '$$':                                  Value History.      (line   13)
* '$_' and 'info breakpoints':           Set Breaks.         (line  126)
* '$_' and 'info line':                  Machine Code.       (line   30)
* '$_', '$__', and value history:        Memory.             (line  105)
* '--annotate':                          Mode Options.       (line  121)
* '--args':                              Mode Options.       (line  134)
* '--attach', 'gdbserver' option:        Server.             (line   86)
* '--batch':                             Mode Options.       (line   44)
* '--batch-silent':                      Mode Options.       (line   62)
* '--baud':                              Mode Options.       (line  140)
* '--cd':                                Mode Options.       (line  101)
* '--command':                           File Options.       (line   51)
* '--configuration':                     Mode Options.       (line  184)
* '--core':                              File Options.       (line   43)
* '--data-directory':                    Mode Options.       (line  106)
* '--debug', 'gdbserver' option:         Server.             (line  166)
* '--debug-format', 'gdbserver' option:  Server.             (line  172)
* '--directory':                         File Options.       (line   77)
* '--eval-command':                      File Options.       (line   57)
* '--exec':                              File Options.       (line   35)
* '--fullname':                          Mode Options.       (line  111)
* '--init-command':                      File Options.       (line   67)
* '--init-eval-command':                 File Options.       (line   72)
* '--interpreter':                       Mode Options.       (line  159)
* '--multi', 'gdbserver' option:         Server.             (line  119)
* '--nh':                                Mode Options.       (line   34)
* '--nowindows':                         Mode Options.       (line   91)
* '--nx':                                Mode Options.       (line   11)
* '--once', 'gdbserver' option:          Server.             (line  151)
* '--pid':                               File Options.       (line   47)
* '--quiet':                             Mode Options.       (line   40)
* '--readnow':                           File Options.       (line   81)
* '--remote-debug', 'gdbserver' option:  Server.             (line  167)
* '--return-child-result':               Mode Options.       (line   74)
* '--se':                                File Options.       (line   39)
* '--silent':                            Mode Options.       (line   40)
* '--statistics':                        Mode Options.       (line  176)
* '--symbols':                           File Options.       (line   31)
* '--tty':                               Mode Options.       (line  149)
* '--tui':                               Mode Options.       (line  152)
* '--version':                           Mode Options.       (line  180)
* '--windows':                           Mode Options.       (line   97)
* '--with-gdb-datadir':                  Data Files.         (line   19)
* '--with-relocated-sources':            Source Path.        (line   88)
* '--with-sysroot':                      Files.              (line  441)
* '--wrapper', 'gdbserver' option:       Server.             (line  185)
* '--write':                             Mode Options.       (line  171)
* '-b':                                  Mode Options.       (line  140)
* '-c':                                  File Options.       (line   43)
* '-d':                                  File Options.       (line   77)
* '-D':                                  Mode Options.       (line  106)
* '-e':                                  File Options.       (line   35)
* '-ex':                                 File Options.       (line   57)
* '-f':                                  Mode Options.       (line  111)
* '-iex':                                File Options.       (line   72)
* '-info-gdb-mi-command':                GDB/MI Support Commands.
                                                             (line   14)
* '-ix':                                 File Options.       (line   67)
* '-l':                                  Mode Options.       (line  144)
* '-n':                                  Mode Options.       (line   11)
* '-nw':                                 Mode Options.       (line   91)
* '-p':                                  File Options.       (line   47)
* '-q':                                  Mode Options.       (line   40)
* '-r':                                  File Options.       (line   81)
* '-s':                                  File Options.       (line   31)
* '-t':                                  Mode Options.       (line  149)
* '-w':                                  Mode Options.       (line   97)
* '-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:          dotdebug_gdb_scripts section.
                                                             (line    6)
* '.gdbinit':                            Startup.            (line   65)
* '.gdb_index' section:                  Index Files.        (line    6)
* .gdb_index section format:             Index Section Format.
                                                             (line    6)
* '.gnu_debugdata' section:              MiniDebugInfo.      (line    6)
* '.gnu_debuglink' sections:             Separate Debug Files.
                                                             (line   76)
* '.note.gnu.build-id' sections:         Separate Debug Files.
                                                             (line   92)
* '.o' files, reading symbols from:      Files.              (line  132)
* /proc:                                 SVR4 Process Information.
                                                             (line    6)
* <architecture>:                        Target Description Format.
                                                             (line   72)
* '<compatible>':                        Target Description Format.
                                                             (line   95)
* <feature>:                             Target Description Format.
                                                             (line  119)
* <flags>:                               Target Description Format.
                                                             (line  185)
* <not saved> values:                    Registers.          (line  101)
* '<osabi>':                             Target Description Format.
                                                             (line   82)
* <reg>:                                 Target Description Format.
                                                             (line  198)
* <struct>:                              Target Description Format.
                                                             (line  163)
* <union>:                               Target Description Format.
                                                             (line  153)
* <vector>:                              Target Description Format.
                                                             (line  146)
* '?' packet:                            Packets.            (line   58)
* '_NSPrintForDebugger', and printing Objective-C objects: The Print Command with Objective-C.
                                                             (line   11)
* {TYPE}:                                Expressions.        (line   41)
* 'A' packet:                            Packets.            (line   65)
* AArch64 support:                       AArch64.            (line    6)
* 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   66)
* Ada mode, general:                     Ada Mode Intro.     (line    6)
* Ada task switching:                    Ada Tasks.          (line  114)
* 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  109)
* address of a symbol:                   Symbols.            (line   74)
* address size for remote targets:       Remote Configuration.
                                                             (line   12)
* addressable memory unit:               Memory.             (line  119)
* ADP (Angel Debugger Protocol) logging: ARM.                (line   84)
* aggregates (Ada):                      Omissions from Ada. (line   44)
* AIX shared library debugging:          Debugging Output.   (line   30)
* AIX threads:                           Debugging Output.   (line   36)
* aliases for commands:                  Aliases.            (line    6)
* alignment of remote memory accesses:   Packets.            (line  248)
* all-stop mode:                         All-Stop Mode.      (line    6)
* Alpha stack:                           MIPS.               (line    6)
* ambiguous expressions:                 Ambiguous Expressions.
                                                             (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  116)
* architecture debugging info:           Debugging Output.   (line   23)
* 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   24)
* ARM AArch64:                           Debugging Output.   (line   17)
* ARM RDI:                               ARM.                (line    6)
* array aggregates (Ada):                Omissions from Ada. (line   44)
* arrays:                                Arrays.             (line    6)
* arrays in expressions:                 Expressions.        (line   13)
* 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   92)
* AT&T disassembly flavor:               Machine Code.       (line  131)
* attach:                                Attach.             (line    6)
* attach to a program, 'gdbserver':      Server.             (line   86)
* auto-loading:                          Auto-loading.       (line    6)
* auto-loading extensions:               Auto-loading extensions.
                                                             (line    6)
* auto-loading init file in the current directory: Init File in the Current Directory.
                                                             (line    6)
* auto-loading libthread_db.so.1:        libthread_db.so.1 file.
                                                             (line    6)
* auto-loading safe-path:                Auto-loading safe path.
                                                             (line    6)
* auto-loading verbose mode:             Auto-loading verbose mode.
                                                             (line    6)
* auto-retry, for remote TCP target:     Remote Configuration.
                                                             (line  124)
* automatic display:                     Auto Display.       (line    6)
* automatic hardware breakpoints:        Set Breaks.         (line  288)
* automatic overlay debugging:           Automatic Overlay Debugging.
                                                             (line    6)
* automatic thread selection:            All-Stop Mode.      (line   28)
* auxiliary vector:                      OS Information.     (line    9)
* AVR:                                   AVR.                (line    6)
* 'b' packet:                            Packets.            (line   76)
* 'B' packet:                            Packets.            (line   91)
* background execution:                  Background Execution.
                                                             (line    6)
* backtrace beyond 'main' function:      Backtrace.          (line  105)
* backtrace limit:                       Backtrace.          (line  142)
* base name differences:                 Files.              (line  508)
* baud rate for remote targets:          Remote Configuration.
                                                             (line   21)
* 'bc' packet:                           Packets.            (line   96)
* bcache statistics:                     Maintenance Commands.
                                                             (line  315)
* bits in remote address:                Remote Configuration.
                                                             (line   12)
* blocks in guile:                       Blocks In Guile.    (line    6)
* blocks in python:                      Blocks In Python.   (line    6)
* bookmark:                              Checkpoint/Restart. (line    6)
* branch trace configuration format:     Branch Trace Configuration Format.
                                                             (line    6)
* branch trace format:                   Branch Trace Format.
                                                             (line    6)
* branch trace store:                    Process Record and Replay.
                                                             (line   61)
* break in overloaded functions:         Debugging C Plus Plus.
                                                             (line    9)
* break on a system call.:               Set Catchpoints.    (line   95)
* break on fork/exec:                    Set Catchpoints.    (line   90)
* BREAK signal instead of Ctrl-C:        Remote Configuration.
                                                             (line   36)
* breakpoint address adjusted:           Breakpoint-related Warnings.
                                                             (line    6)
* breakpoint at static probe point:      Specify Location.   (line   91)
* breakpoint commands:                   Break Commands.     (line    6)
* breakpoint commands for GDB/MI:        GDB/MI Breakpoint Commands.
                                                             (line    6)
* breakpoint commands, in remote protocol: General Query Packets.
                                                             (line  782)
* breakpoint conditions:                 Conditions.         (line    6)
* breakpoint kinds, ARM:                 ARM Breakpoint Kinds.
                                                             (line    6)
* breakpoint kinds, MIPS:                MIPS Breakpoint Kinds.
                                                             (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  134)
* breakpoints and threads:               Thread-Specific Breakpoints.
                                                             (line   10)
* breakpoints at functions matching a regexp: Set Breaks.    (line   90)
* breakpoints in guile:                  Breakpoints In Guile.
                                                             (line    6)
* breakpoints in overlays:               Overlay Commands.   (line   91)
* breakpoints in python:                 Breakpoints In Python.
                                                             (line    6)
* breakpoints, multiple locations:       Set Breaks.         (line  193)
* 'bs' packet:                           Packets.            (line  102)
* 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   92)
* 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)
* builtin Go functions:                  Go.                 (line   31)
* builtin Go types:                      Go.                 (line   28)
* 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  109)
* 'C' packet:                            Packets.            (line  118)
* C++:                                   C.                  (line   10)
* C++ compilers:                         C Plus Plus Expressions.
                                                             (line    8)
* C++ demangling:                        Debugging C Plus Plus.
                                                             (line   36)
* C++ exception handling:                Debugging C Plus Plus.
                                                             (line   20)
* C++ overload debugging info:           Debugging Output.   (line  139)
* C++ scope resolution:                  Variables.          (line   90)
* C++ symbol decoding style:             Print Settings.     (line  427)
* C++ symbol display:                    Debugging C Plus Plus.
                                                             (line   40)
* caching data of targets:               Caching Target Data.
                                                             (line    6)
* call dummy stack unwinding:            Calling.            (line   36)
* call dummy stack unwinding on unhandled exception.: Calling.
                                                             (line   47)
* call overloaded functions:             C Plus Plus Expressions.
                                                             (line   26)
* call stack:                            Stack.              (line    9)
* call stack traces:                     Backtrace.          (line    6)
* call-clobbered registers:              Registers.          (line  101)
* caller-saved registers:                Registers.          (line  101)
* 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   26)
* casts, to view memory:                 Expressions.        (line   41)
* catch Ada exceptions:                  Set Catchpoints.    (line   66)
* 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   76)
* checks, range:                         Type Checking.      (line   44)
* checks, type:                          Checks.             (line   23)
* checksum, for GDB remote:              Overview.           (line   21)
* choosing target byte order:            Byte Order.         (line    6)
* circular trace buffer:                 Starting and Stopping Trace Experiments.
                                                             (line   80)
* 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   84)
* code address and its source line:      Machine Code.       (line   25)
* code compression, MIPS:                MIPS.               (line   49)
* COFF/PE exported symbols:              Debugging Output.   (line   50)
* 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   65)
* command tracing:                       Messages/Warnings.  (line   60)
* commands for C++:                      Debugging C Plus Plus.
                                                             (line    6)
* commands in guile:                     Commands In Guile.  (line    6)
* commands in python:                    Commands In Python. (line    6)
* commands to access guile:              Guile Commands.     (line    6)
* commands to access python:             Python Commands.    (line    6)
* comment:                               Command Syntax.     (line   37)
* '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  106)
* compile command debugging info:        Compiling and Injecting Code.
                                                             (line   81)
* compile command options override:      Compiling and Injecting Code.
                                                             (line  116)
* compiling code:                        Compiling and Injecting Code.
                                                             (line    6)
* compiling, on Sparclet:                Sparclet.           (line   16)
* completion:                            Completion.         (line    6)
* completion of Guile commands:          Commands In Guile.  (line  100)
* completion of Python commands:         Commands In Python. (line   70)
* completion of quoted strings:          Completion.         (line   82)
* completion of structure field names:   Completion.         (line  120)
* completion of union field names:       Completion.         (line  120)
* compressed debug sections:             Requirements.       (line   39)
* conditional breakpoints:               Conditions.         (line    6)
* conditional tracepoints:               Tracepoint Conditions.
                                                             (line    6)
* configuring GDB:                       Running Configure.  (line    6)
* confirmation:                          Messages/Warnings.  (line   49)
* connection timeout, for remote TCP target: Remote Configuration.
                                                             (line  140)
* 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 Funs.   (line    6)
* 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   42)
* 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  136)
* CRC of memory block, remote request:   General Query Packets.
                                                             (line   65)
* 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  104)
* current directory:                     Source Path.        (line  106)
* current Go package:                    Go.                 (line   11)
* current stack frame:                   Frames.             (line   45)
* current thread:                        Threads.            (line   39)
* current thread, remote request:        General Query Packets.
                                                             (line   55)
* custom JIT debug info:                 Custom Debug Info.  (line    6)
* Cygwin DLL, debugging:                 Cygwin Native.      (line   35)
* Cygwin-specific commands:              Cygwin Native.      (line    6)
* D:                                     D.                  (line    6)
* 'd' packet:                            Packets.            (line  127)
* 'D' packet:                            Packets.            (line  134)
* Darwin:                                Darwin.             (line    6)
* data breakpoints:                      Breakpoints.        (line   20)
* data manipulation, in GDB/MI:          GDB/MI Data Manipulation.
                                                             (line    6)
* dcache line-size:                      Caching Target Data.
                                                             (line   60)
* dcache size:                           Caching Target Data.
                                                             (line   57)
* dead names, GNU Hurd:                  Hurd Native.        (line   84)
* debug expression parser:               Debugging Output.   (line  144)
* debug formats and C++:                 C Plus Plus Expressions.
                                                             (line    8)
* debug link sections:                   Separate Debug Files.
                                                             (line   76)
* debug remote protocol:                 Debugging Output.   (line  151)
* debugger crash:                        Bug Criteria.       (line    9)
* debugging agent:                       In-Process Agent.   (line    6)
* 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  211)
* debugging multiple processes:          Forks.              (line   54)
* 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   35)
* decimal floating point format:         Decimal Floating Point.
                                                             (line    6)
* default collection action:             Tracepoint Actions. (line  134)
* default data directory:                Data Files.         (line   19)
* default source path substitution:      Source Path.        (line   88)
* default system root:                   Files.              (line  441)
* define trace state variable, remote request: Tracepoint Packets.
                                                             (line  121)
* 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)
* demangle:                              Symbols.            (line  103)
* demangler crashes:                     Maintenance Commands.
                                                             (line  150)
* demangler crashes <1>:                 Maintenance Commands.
                                                             (line  177)
* demangler crashes <2>:                 Maintenance Commands.
                                                             (line  201)
* demangling C++ names:                  Print Settings.     (line  408)
* deprecated commands:                   Maintenance Commands.
                                                             (line  164)
* derived type of an object, printing:   Print Settings.     (line  460)
* descriptor tables display:             DJGPP Native.       (line   24)
* detach from task, GNU Hurd:            Hurd Native.        (line   59)
* detach from thread, GNU Hurd:          Hurd Native.        (line  109)
* direct memory access (DMA) on MS-DOS:  DJGPP Native.       (line   74)
* directories for source files:          Source Path.        (line    6)
* directory, compilation:                Source Path.        (line  106)
* directory, current:                    Source Path.        (line  106)
* disable address space randomization, remote request: General Query Packets.
                                                             (line   84)
* disconnected tracing:                  Starting and Stopping Trace Experiments.
                                                             (line   45)
* displaced stepping debugging info:     Debugging Output.   (line   75)
* displaced stepping support:            Maintenance Commands.
                                                             (line  116)
* displaced stepping, and process record and replay: Process Record and Replay.
                                                             (line   87)
* display command history:               Command History.    (line   95)
* display derived types:                 Print Settings.     (line  460)
* display disabled out of scope:         Auto Display.       (line   86)
* display GDB copyright:                 Help.               (line  138)
* display of expressions:                Auto Display.       (line    6)
* display remote monitor communications: Target Commands.    (line  107)
* display remote packets:                Debugging Output.   (line  151)
* 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  154)
* documentation:                         Formatting Documentation.
                                                             (line   22)
* don't repeat command:                  Define.             (line   61)
* don't repeat Guile command:            Commands In Guile.  (line   67)
* don't repeat Python command:           Commands In Python. (line   42)
* DOS file-name semantics of file names.: Files.             (line  464)
* DOS serial data link, remote debugging: DJGPP Native.      (line  118)
* DOS serial port status:                DJGPP Native.       (line  139)
* download server address (M32R):        M32R/D.             (line   27)
* download to Sparclet:                  Sparclet Download.  (line    6)
* DPMI:                                  DJGPP Native.       (line    6)
* dprintf:                               Dynamic Printf.     (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 compilation units cache:         Maintenance Commands.
                                                             (line  372)
* DWARF DIEs:                            Debugging Output.   (line   56)
* DWARF Line Tables:                     Debugging Output.   (line   61)
* DWARF Reading:                         Debugging Output.   (line   68)
* DWARF-2 CFI and CRIS:                  CRIS.               (line   18)
* dynamic linking:                       Files.              (line  112)
* dynamic printf:                        Dynamic Printf.     (line    6)
* dynamic varobj:                        GDB/MI Variable Objects.
                                                             (line  166)
* 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  353)
* elaboration phase:                     Starting.           (line   89)
* ELinOS system-wide configuration script: System-wide Configuration Scripts.
                                                             (line   15)
* Emacs:                                 Emacs.              (line    6)
* empty response, for unsupported packets: Overview.         (line   97)
* enable/disable a breakpoint:           Disabling.          (line    6)
* enabling and disabling probes:         Static Probe Points.
                                                             (line   52)
* 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   81)
* 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)
* exceptions, guile:                     Guile Exception Handling.
                                                             (line    6)
* 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   95)
* execute commands from a file:          Command Files.      (line   17)
* execute forward or backward in time:   Reverse Execution.  (line   86)
* execute remote command, remote request: General Query Packets.
                                                             (line  345)
* 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)
* explore type:                          Data.               (line  145)
* explore value:                         Data.               (line  138)
* exploring hierarchical data structures: Data.              (line   36)
* expression debugging info:             Debugging Output.   (line   86)
* expression parser, debugging info:     Debugging Output.   (line  144)
* 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  109)
* extending GDB:                         Extending GDB.      (line    6)
* extra signal information:              Signals.            (line  156)
* 'F' packet:                            Packets.            (line  150)
* '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  398)
* file name canonicalization:            Files.              (line  508)
* 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)
* filename-display:                      Backtrace.          (line  152)
* find downloadable SREC files (M32R):   M32R/D.             (line   15)
* find trace snapshot:                   tfind.              (line    6)
* flinching:                             Messages/Warnings.  (line   49)
* float promotion:                       ABI.                (line   34)
* floating point:                        Floating Point Hardware.
                                                             (line    6)
* floating point registers:              Registers.          (line   15)
* floating point, MIPS remote:           MIPS Embedded.      (line   58)
* focus of debugging:                    Threads.            (line   39)
* foo:                                   Symbol Errors.      (line   54)
* foreground execution:                  Background Execution.
                                                             (line    6)
* fork events, remote reply:             Stop Reply Packets. (line   95)
* 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  164)
* frame debugging info:                  Debugging Output.   (line   92)
* frame decorator api:                   Frame Decorator API.
                                                             (line    6)
* frame filters api:                     Frame Filter API.   (line    6)
* 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 guile:                       Frames In Guile.    (line    6)
* 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   68)
* full symbol tables, listing GDB's internal: Symbols.       (line  390)
* function call arguments, optimized out: Backtrace.         (line   83)
* function entry/exit, wrong values of variables: Variables. (line  106)
* functions without line info, and stepping: Continuing and Stepping.
                                                             (line   92)
* 'g' packet:                            Packets.            (line  155)
* 'G' packet:                            Packets.            (line  184)
* '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  201)
* gdb module:                            Basic Python.       (line   28)
* gdb objects:                           GDB Scheme Data Types.
                                                             (line    6)
* GDB reference card:                    Formatting Documentation.
                                                             (line    6)
* GDB startup:                           Startup.            (line    6)
* GDB version number:                    Help.               (line  128)
* 'gdb.ini':                             Startup.            (line   65)
* 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   23)
* 'GDBHISTFILE', environment variable:   Command History.    (line   26)
* 'GDBHISTSIZE', environment variable:   Command History.    (line   45)
* 'gdbserver', command-line arguments:   Server.             (line   34)
* 'gdbserver', multiple processes:       Server.             (line  106)
* gdbserver, search path for 'libthread_db': Server.         (line  265)
* GDT:                                   DJGPP Native.       (line   24)
* get thread information block address:  General Query Packets.
                                                             (line  180)
* get thread-local storage address, remote request: General Query Packets.
                                                             (line  148)
* gettimeofday, file-i/o system call:    gettimeofday.       (line    6)
* getting structure elements using gdb.Field objects as subscripts: Values From Inferior.
                                                             (line   40)
* global debugging information directories: Separate Debug Files.
                                                             (line    6)
* GNAT descriptive types:                Ada Glitches.       (line   57)
* GNAT encoding:                         Ada Glitches.       (line   57)
* GNU C++:                               C.                  (line   10)
* GNU Emacs:                             Emacs.              (line    6)
* GNU Hurd debugging:                    Hurd Native.        (line    6)
* GNU/Hurd debug messages:               Debugging Output.   (line   97)
* GNU/Linux LWP debug messages:          Debugging Output.   (line  112)
* GNU/Linux namespaces debug messages:   Debugging Output.   (line  117)
* Go (programming language):             Go.                 (line    6)
* guile api:                             Guile API.          (line    6)
* guile architectures:                   Architectures In Guile.
                                                             (line    6)
* guile auto-loading:                    Guile Auto-loading. (line    6)
* guile commands:                        Guile Commands.     (line    6)
* guile commands <1>:                    Commands In Guile.  (line    6)
* guile configuration:                   Guile Configuration.
                                                             (line    6)
* guile exceptions:                      Guile Exception Handling.
                                                             (line    6)
* guile gdb module:                      Basic Guile.        (line   37)
* guile iterators:                       Iterators In Guile. (line    6)
* guile modules:                         Guile Modules.      (line    6)
* guile pagination:                      Basic Guile.        (line    6)
* guile parameters:                      Parameters In Guile.
                                                             (line    6)
* guile pretty printing api:             Guile Pretty Printing API.
                                                             (line    6)
* guile scripting:                       Guile.              (line    6)
* guile scripts directory:               Guile Introduction. (line   16)
* guile stdout:                          Basic Guile.        (line    6)
* guile, working with types:             Types In Guile.     (line    6)
* guile, working with values from inferior: Values From Inferior In Guile.
                                                             (line    6)
* 'H' packet:                            Packets.            (line  194)
* handling signals:                      Signals.            (line   27)
* hardware breakpoints:                  Set Breaks.         (line   61)
* hardware debug registers:              Maintenance Commands.
                                                             (line  398)
* hardware watchpoints:                  Set Watchpoints.    (line   31)
* hash mark while downloading:           Target Commands.    (line   98)
* '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   70)
* 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)
* 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  208)
* 'I' packet:                            Packets.            (line  213)
* i/o:                                   Input/Output.       (line    6)
* I/O registers (Atmel AVR):             AVR.                (line   10)
* i386:                                  Remote Stub.        (line   56)
* 'i386-stub.c':                         Remote Stub.        (line   56)
* IDT:                                   DJGPP Native.       (line   24)
* ignore count (of breakpoint):          Conditions.         (line   79)
* in-process agent protocol:             In-Process Agent Protocol.
                                                             (line    6)
* incomplete type:                       Symbols.            (line  217)
* indentation in structure display:      Print Settings.     (line  329)
* 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  101)
* 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   78)
* info for known .debug_gdb_scripts-loaded scripts: Maintenance Commands.
                                                             (line  308)
* info for known object files:           Maintenance Commands.
                                                             (line  293)
* info proc cmdline:                     SVR4 Process Information.
                                                             (line   35)
* info proc cwd:                         SVR4 Process Information.
                                                             (line   39)
* info proc exe:                         SVR4 Process Information.
                                                             (line   43)
* information about static tracepoint markers: Listing Static Tracepoint Markers.
                                                             (line    6)
* information about tracepoints:         Listing Tracepoints.
                                                             (line    6)
* inheritance:                           Debugging C Plus Plus.
                                                             (line   26)
* init file:                             Startup.            (line   11)
* init file name:                        Startup.            (line   65)
* initial frame:                         Frames.             (line   12)
* initialization file, readline:         Readline Init File. (line    6)
* injecting code:                        Compiling and Injecting Code.
                                                             (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   56)
* Intel disassembly flavor:              Machine Code.       (line  131)
* Intel(R) Memory Protection Extensions (MPX).: i386.        (line   21)
* Intel(R) Processor Trace:              Process Record and Replay.
                                                             (line   66)
* interaction, readline:                 Readline Interaction.
                                                             (line    6)
* internal commands:                     Maintenance Commands.
                                                             (line    6)
* internal errors, control of GDB behavior: Maintenance Commands.
                                                             (line  201)
* internal GDB breakpoints:              Set Breaks.         (line  367)
* interrupt:                             Quitting GDB.       (line   13)
* interrupt debuggee on MS-Windows:      Cygwin Native.      (line    9)
* interrupt remote programs:             Remote Configuration.
                                                             (line   36)
* interrupt remote programs <1>:         Remote Configuration.
                                                             (line  101)
* interrupting remote programs:          Connecting.         (line   82)
* interrupting remote targets:           Bootstrapping.      (line   25)
* interrupts (remote protocol):          Interrupts.         (line    6)
* invalid input:                         Bug Criteria.       (line   16)
* invoke another interpreter:            Interpreters.       (line   36)
* ipa protocol commands:                 IPA Protocol Commands.
                                                             (line    6)
* ipa protocol objects:                  IPA Protocol Objects.
                                                             (line    6)
* 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  108)
* 'k' packet:                            Packets.            (line  217)
* kernel crash dump:                     BSD libkvm Interface.
                                                             (line    6)
* kernel memory image:                   BSD libkvm Interface.
                                                             (line    6)
* kill ring:                             Readline Killing Commands.
                                                             (line   18)
* 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 guile:                 Lazy Strings In Guile.
                                                             (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:  Library List Format.
                                                             (line    6)
* library list format, remote protocol <1>: Library List Format for SVR4 Targets.
                                                             (line    6)
* limit hardware breakpoints and watchpoints: Remote Configuration.
                                                             (line   79)
* limit hardware watchpoints length:     Remote Configuration.
                                                             (line   84)
* limit on number of printed array elements: Print Settings. (line  141)
* limits, in file-i/o protocol:          Limits.             (line    6)
* line tables in python:                 Line Tables In Python.
                                                             (line    6)
* linespec:                              Specify Location.   (line    6)
* Linux lightweight processes:           Debugging Output.   (line  112)
* list active threads, remote request:   General Query Packets.
                                                             (line  115)
* 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  390)
* 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  315)
* load symbols from memory:              Files.              (line  179)
* local variables:                       Symbols.            (line  260)
* 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   12)
* 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  240)
* 'M' packet:                            Packets.            (line  260)
* M32-EVA target board address:          M32R/D.             (line   21)
* M32R/Chaos debugging:                  M32R/D.             (line   50)
* m680x0:                                Remote Stub.        (line   59)
* 'm68k-stub.c':                         Remote Stub.        (line   59)
* Mach-O symbols processing:             Debugging Output.   (line  122)
* 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   34)
* maintenance commands:                  Maintenance Commands.
                                                             (line    6)
* Man pages:                             Man Pages.          (line    6)
* managing frame filters:                Frame Filter Management.
                                                             (line    6)
* manual overlay debugging:              Overlay Commands.   (line   23)
* map an overlay:                        Overlay Commands.   (line   30)
* mapinfo list, QNX Neutrino:            SVR4 Process Information.
                                                             (line   93)
* 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   47)
* 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  459)
* memory used for symbol tables:         Files.              (line  303)
* memory, alignment and size of remote accesses: Packets.    (line  248)
* memory, viewing as typed object:       Expressions.        (line   41)
* mi interpreter:                        Interpreters.       (line   26)
* mi1 interpreter:                       Interpreters.       (line   34)
* mi2 interpreter:                       Interpreters.       (line   31)
* minimal language:                      Unsupported Languages.
                                                             (line    6)
* minimal symbol dump:                   Symbols.            (line  372)
* Minimal symbols and DLLs:              Non-debug DLL Symbols.
                                                             (line    6)
* MIPS addresses, masking:               MIPS.               (line   80)
* MIPS boards:                           MIPS Embedded.      (line    6)
* MIPS remote floating point:            MIPS Embedded.      (line   58)
* 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  114)
* 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  233)
* Motorola 680x0:                        Remote Stub.        (line   59)
* 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  193)
* multiple processes:                    Forks.              (line    6)
* multiple processes with 'gdbserver':   Server.             (line  106)
* multiple targets:                      Active Targets.     (line    6)
* multiple threads:                      Threads.            (line    6)
* multiple threads, backtrace:           Backtrace.          (line   49)
* multiple-symbols menu:                 Ambiguous Expressions.
                                                             (line   51)
* multiprocess extensions, in remote protocol: General Query Packets.
                                                             (line  712)
* name a thread:                         Threads.            (line  127)
* 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)
* native script auto-loading:            Auto-loading sequences.
                                                             (line    6)
* native target:                         Target Commands.    (line   85)
* negative breakpoint numbers:           Set Breaks.         (line  367)
* 'New' SYSTAG message:                  Threads.            (line   45)
* Newlib OS ABI and its influence on the longjmp handling: ABI.
                                                             (line   11)
* Nios II architecture:                  Nios II.            (line    6)
* non-member C++ functions, set breakpoint in: Set Breaks.   (line  106)
* non-stop mode:                         Non-Stop Mode.      (line    6)
* non-stop mode, and process record and replay: Process Record and Replay.
                                                             (line   92)
* non-stop mode, and 'set displaced-stepping': Maintenance Commands.
                                                             (line  133)
* non-stop mode, remote request:         General Query Packets.
                                                             (line  256)
* noninvasive task options:              Hurd Native.        (line   72)
* 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  320)
* number of array elements to print:     Print Settings.     (line  141)
* 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  323)
* Objective-C, print objects:            The Print Command with Objective-C.
                                                             (line    6)
* 'OBJFILE-gdb.gdb':                     objfile-gdbdotext file.
                                                             (line    6)
* 'OBJFILE-gdb.py':                      objfile-gdbdotext file.
                                                             (line    6)
* 'OBJFILE-gdb.scm':                     objfile-gdbdotext file.
                                                             (line    6)
* objfiles in guile:                     Objfiles In Guile.  (line    6)
* objfiles in python:                    Objfiles In Python. (line    6)
* observer debugging info:               Debugging Output.   (line  134)
* octal escapes in strings:              Print Settings.     (line  353)
* online documentation:                  Help.               (line    6)
* opaque data types:                     Symbols.            (line  335)
* 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)
* 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  106)
* optimized out value in guile:          Values From Inferior In Guile.
                                                             (line  102)
* optimized out value in Python:         Values From Inferior.
                                                             (line   70)
* optimized out, in backtrace:           Backtrace.          (line   83)
* optional debugging messages:           Debugging Output.   (line    6)
* optional warnings:                     Messages/Warnings.  (line    6)
* OS ABI:                                ABI.                (line   11)
* OS information:                        OS Information.     (line    6)
* out-of-line single-stepping:           Maintenance Commands.
                                                             (line  116)
* 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   91)
* overloaded functions, calling:         C Plus Plus Expressions.
                                                             (line   26)
* overloaded functions, overload resolution: Debugging C Plus Plus.
                                                             (line   59)
* overloading in C++:                    Debugging C Plus Plus.
                                                             (line   15)
* 'p' packet:                            Packets.            (line  272)
* 'P' packet:                            Packets.            (line  285)
* packet acknowledgment, for GDB remote: Packet Acknowledgment.
                                                             (line    6)
* packet size, remote protocol:          General Query Packets.
                                                             (line  614)
* packets, notification:                 Notification Packets.
                                                             (line    6)
* packets, reporting on stdout:          Debugging Output.   (line  151)
* packets, tracepoint:                   Tracepoint Packets. (line    6)
* page size:                             Screen Size.        (line    6)
* page tables display (MS-DOS):          DJGPP Native.       (line   55)
* pagination:                            Screen Size.        (line    6)
* parameters in guile:                   Parameters In Guile.
                                                             (line    6)
* parameters in python:                  Parameters In Python.
                                                             (line    6)
* partial symbol dump:                   Symbols.            (line  372)
* partial symbol tables, listing GDB's internal: Symbols.    (line  390)
* Pascal:                                Summary.            (line   35)
* Pascal objects, static members display: Print Settings.    (line  489)
* Pascal support in GDB, limitations:    Pascal.             (line    6)
* pass signals to inferior, remote request: General Query Packets.
                                                             (line  277)
* patching binaries:                     Patching.           (line    6)
* patching object files:                 Files.              (line   26)
* pause current task (GNU Hurd):         Hurd Native.        (line   48)
* pause current thread (GNU Hurd):       Hurd Native.        (line   90)
* pauses in output:                      Screen Size.        (line    6)
* pending breakpoints:                   Set Breaks.         (line  237)
* physical address from linear address:  DJGPP Native.       (line   80)
* physname:                              Debugging Output.   (line   41)
* pipe, 'target remote' to:              Connecting.         (line   65)
* pipes:                                 Starting.           (line   61)
* pointer values, in file-i/o protocol:  Pointer Values.     (line    6)
* pointer, finding referent:             Print Settings.     (line   80)
* port rights, GNU Hurd:                 Hurd Native.        (line   84)
* port sets, GNU Hurd:                   Hurd Native.        (line   84)
* PowerPC architecture:                  PowerPC.            (line    6)
* prefix for data files:                 Data Files.         (line    6)
* prefix for executable and 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  115)
* pretty print C++ virtual function tables: Print Settings.  (line  500)
* pretty-printer commands:               Pretty-Printer Commands.
                                                             (line    6)
* print all frame argument values:       Print Settings.     (line  154)
* print an Objective-C object description: The Print Command with Objective-C.
                                                             (line   11)
* print array indexes:                   Print Settings.     (line  125)
* print frame argument values for scalars only: Print Settings.
                                                             (line  154)
* print list of auto-loaded canned sequences of commands scripts: Auto-loading sequences.
                                                             (line   21)
* print list of auto-loaded Guile scripts: Guile Auto-loading.
                                                             (line   23)
* print list of auto-loaded Python scripts: Python Auto-loading.
                                                             (line   23)
* print messages on inferior start and exit: Inferiors and Programs.
                                                             (line  117)
* print messages on thread start and exit: Threads.          (line  152)
* print messages when symbols are loaded: Symbols.           (line  353)
* print settings:                        Print Settings.     (line    6)
* print structures in indented form:     Print Settings.     (line  329)
* 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  154)
* 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   55)
* process ID:                            SVR4 Process Information.
                                                             (line   19)
* process info via '/proc':              SVR4 Process Information.
                                                             (line    6)
* process list, QNX Neutrino:            SVR4 Process Information.
                                                             (line   89)
* 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   68)
* profiling GDB:                         Maintenance Commands.
                                                             (line  382)
* program counter register:              Registers.          (line   26)
* program entry point:                   Backtrace.          (line  105)
* programming in guile:                  Guile API.          (line    6)
* programming in python:                 Python API.         (line    6)
* progspaces in guile:                   Progspaces In Guile.
                                                             (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)
* python api:                            Python API.         (line    6)
* Python architectures:                  Architectures In Python.
                                                             (line    6)
* Python auto-loading:                   Python Auto-loading.
                                                             (line    6)
* python commands:                       Python Commands.    (line    6)
* python commands <1>:                   Commands In Python. (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   28)
* python module:                         Basic Python.       (line   28)
* python modules:                        Python modules.     (line    6)
* python pagination:                     Basic Python.       (line    6)
* python parameters:                     Parameters In Python.
                                                             (line    6)
* python pretty printing api:            Pretty Printing API.
                                                             (line    6)
* python scripting:                      Python.             (line    6)
* python stdout:                         Basic Python.       (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  297)
* 'Q' packet:                            Packets.            (line  297)
* 'QAllow' packet:                       General Query Packets.
                                                             (line   44)
* 'qAttached' packet:                    General Query Packets.
                                                             (line 1188)
* 'qC' packet:                           General Query Packets.
                                                             (line   55)
* 'qCRC' packet:                         General Query Packets.
                                                             (line   65)
* 'QDisableRandomization' packet:        General Query Packets.
                                                             (line   84)
* 'qfThreadInfo' packet:                 General Query Packets.
                                                             (line  115)
* 'qGetTIBAddr' packet:                  General Query Packets.
                                                             (line  180)
* 'qGetTLSAddr' packet:                  General Query Packets.
                                                             (line  148)
* 'QNonStop' packet:                     General Query Packets.
                                                             (line  256)
* 'qOffsets' packet:                     General Query Packets.
                                                             (line  219)
* 'qP' packet:                           General Query Packets.
                                                             (line  246)
* 'QPassSignals' packet:                 General Query Packets.
                                                             (line  277)
* 'QProgramSignals' packet:              General Query Packets.
                                                             (line  306)
* 'qRcmd' packet:                        General Query Packets.
                                                             (line  345)
* 'qSearch memory' packet:               General Query Packets.
                                                             (line  367)
* 'QStartNoAckMode' packet:              General Query Packets.
                                                             (line  384)
* 'qsThreadInfo' packet:                 General Query Packets.
                                                             (line  115)
* 'qSupported' packet:                   General Query Packets.
                                                             (line  398)
* 'qSymbol' packet:                      General Query Packets.
                                                             (line  818)
* 'qTBuffer' packet:                     Tracepoint Packets. (line  393)
* 'QTBuffer size' packet:                Tracepoint Packets. (line  406)
* 'QTDisable' packet:                    Tracepoint Packets. (line  209)
* 'QTDisconnected' packet:               Tracepoint Packets. (line  228)
* 'QTDP' packet:                         Tracepoint Packets. (line   10)
* 'QTDPsrc' packet:                      Tracepoint Packets. (line   90)
* 'QTDV' packet:                         Tracepoint Packets. (line  121)
* 'QTEnable' packet:                     Tracepoint Packets. (line  204)
* 'qTfP' packet:                         Tracepoint Packets. (line  335)
* 'QTFrame' packet:                      Tracepoint Packets. (line  133)
* 'qTfSTM' packet:                       Tracepoint Packets. (line  352)
* 'qTfV' packet:                         Tracepoint Packets. (line  343)
* 'qThreadExtraInfo' packet:             General Query Packets.
                                                             (line  861)
* 'QTinit' packet:                       Tracepoint Packets. (line  214)
* 'qTMinFTPILen' packet:                 Tracepoint Packets. (line  171)
* 'QTNotes' packet:                      Tracepoint Packets. (line  411)
* 'qTP' packet:                          Tracepoint Packets. (line  307)
* 'QTro' packet:                         Tracepoint Packets. (line  217)
* 'QTSave' packet:                       Tracepoint Packets. (line  387)
* 'qTsP' packet:                         Tracepoint Packets. (line  336)
* 'qTsSTM' packet:                       Tracepoint Packets. (line  352)
* 'QTStart' packet:                      Tracepoint Packets. (line  195)
* 'qTStatus' packet:                     Tracepoint Packets. (line  234)
* 'qTSTMat' packet:                      Tracepoint Packets. (line  381)
* 'QTStop' packet:                       Tracepoint Packets. (line  201)
* 'qTsV' packet:                         Tracepoint Packets. (line  344)
* 'qTV' packet:                          Tracepoint Packets. (line  318)
* query attached, remote request:        General Query Packets.
                                                             (line 1188)
* quotes in commands:                    Completion.         (line   82)
* quoting Ada internal identifiers:      Additions to Ada.   (line   76)
* quoting names:                         Symbols.            (line   14)
* 'qXfer' packet:                        General Query Packets.
                                                             (line  898)
* 'r' packet:                            Packets.            (line  301)
* 'R' packet:                            Packets.            (line  306)
* range checking:                        Type Checking.      (line   45)
* range stepping:                        Continuing and Stepping.
                                                             (line  210)
* ranged breakpoint:                     PowerPC Embedded.   (line   33)
* ranges of breakpoints:                 Breakpoints.        (line   48)
* Ravenscar Profile:                     Ravenscar Profile.  (line    6)
* raw printing:                          Output Formats.     (line   76)
* RDI heartbeat:                         ARM.                (line  107)
* read special object, remote request:   General Query Packets.
                                                             (line  898)
* read, file-i/o system call:            read.               (line    6)
* read-only sections:                    Files.              (line  251)
* reading symbols from relocatable object files: Files.      (line  132)
* reading symbols immediately:           Files.              (line   89)
* readline:                              Editing.            (line    6)
* receive rights, GNU Hurd:              Hurd Native.        (line   84)
* 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   64)
* recording a session script:            Bug Reporting.      (line   93)
* 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 packet format, MIPS:          MIPS Register packet Format.
                                                             (line    6)
* registers:                             Registers.          (line    6)
* regular expression:                    Set Breaks.         (line   90)
* reloading the overlay table:           Overlay Commands.   (line   52)
* relocatable object files, reading symbols from: Files.     (line  132)
* remote async notification debugging info: Debugging Output.
                                                             (line  128)
* remote connection without stubs:       Server.             (line    6)
* remote debugging:                      Remote Debugging.   (line    6)
* remote memory comparison:              Memory.             (line  128)
* remote monitor prompt:                 MIPS Embedded.      (line  105)
* remote packets, enabling and disabling: Remote Configuration.
                                                             (line  152)
* remote programs, interrupting:         Connecting.         (line   82)
* remote protocol debugging:             Debugging Output.   (line  151)
* remote protocol, binary data:          Overview.           (line   63)
* remote protocol, field separator:      Overview.           (line   55)
* 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   53)
* 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   79)
* remote target, limit watchpoints length: Remote Configuration.
                                                             (line   84)
* remote timeout:                        Remote Configuration.
                                                             (line   72)
* remove actions from a tracepoint:      Tracepoint Actions. (line   21)
* remove duplicate history:              Command History.    (line   54)
* rename, file-i/o system call:          rename.             (line    6)
* Renesas:                               Remote Stub.        (line   62)
* repeated array elements:               Print Settings.     (line  307)
* repeating command sequences:           Command Syntax.     (line   41)
* 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)
* reprint the last value <1>:            Compiling and Injecting Code.
                                                             (line   73)
* reset SDI connection, M32R:            M32R/D.             (line   44)
* resources used by commands:            Maintenance Commands.
                                                             (line  422)
* response time, MIPS debugging:         MIPS.               (line   10)
* restart:                               Checkpoint/Restart. (line    6)
* restore data from a file:              Dump/Restore Files. (line    6)
* restrictions on Go expressions:        Go.                 (line   35)
* result records in GDB/MI:              GDB/MI Result Records.
                                                             (line    6)
* resume threads of multiple processes simultaneously: All-Stop Mode.
                                                             (line   52)
* resuming execution:                    Continuing and Stepping.
                                                             (line    6)
* 'retransmit-timeout', MIPS protocol:   MIPS Embedded.      (line   81)
* 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   97)
* run to main procedure:                 Starting.           (line   78)
* run until specified location:          Continuing and Stepping.
                                                             (line  117)
* running:                               Starting.           (line    6)
* running and debugging Sparclet programs: Sparclet Execution.
                                                             (line    6)
* running programs backward:             Reverse Execution.  (line    6)
* running, on Sparclet:                  Sparclet.           (line   28)
* 's' packet:                            Packets.            (line  313)
* 'S' packet:                            Packets.            (line  322)
* 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)
* screen size:                           Screen Size.        (line    6)
* scripting commands:                    Command Files.      (line    6)
* scripting with guile:                  Guile.              (line    6)
* scripting with python:                 Python.             (line    6)
* SDS protocol:                          PowerPC Embedded.   (line   82)
* search for a thread:                   Threads.            (line  138)
* search path for 'libthread_db':        Threads.            (line  173)
* searching memory:                      Searching Memory.   (line    6)
* searching memory, in remote debugging: General Query Packets.
                                                             (line  367)
* searching source files:                Search.             (line    6)
* section offsets, remote request:       General Query Packets.
                                                             (line  219)
* segment descriptor tables:             DJGPP Native.       (line   24)
* select Ctrl-C, BREAK or BREAK-g:       Remote Configuration.
                                                             (line  101)
* select trace snapshot:                 tfind.              (line    6)
* selected frame:                        Stack.              (line   19)
* selecting frame silently:              Frames.             (line   51)
* selecting guile pretty-printers:       Selecting Guile Pretty-Printers.
                                                             (line    6)
* selecting python pretty-printers:      Selecting Pretty-Printers.
                                                             (line    6)
* semaphores on static probe points:     Static Probe Points.
                                                             (line   20)
* send command to remote monitor:        Connecting.         (line  109)
* send command to simulator:             Embedded Processors.
                                                             (line    9)
* send interrupt-sequence on start:      Remote Configuration.
                                                             (line  114)
* send PMON command:                     MIPS Embedded.      (line  128)
* send rights, GNU Hurd:                 Hurd Native.        (line   84)
* sending files to remote systems:       File Transfer.      (line    6)
* separate debug sections:               MiniDebugInfo.      (line    6)
* separate debugging information files:  Separate Debug Files.
                                                             (line    6)
* sequence-id, for GDB remote:           Overview.           (line   30)
* serial connections, debugging:         Debugging Output.   (line  151)
* serial line, 'target remote':          Connecting.         (line   22)
* 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   90)
* set breakpoints on all functions:      Set Breaks.         (line  110)
* 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   62)
* 'sh-stub.c':                           Remote Stub.        (line   62)
* shared libraries:                      Files.              (line  273)
* shared library events, remote reply:   Stop Reply Packets. (line   56)
* shell escape:                          Shell Commands.     (line   10)
* show all convenience functions:        Convenience Funs.   (line  138)
* show all user variables and functions: Convenience Vars.   (line   37)
* show last commands:                    Command History.    (line   95)
* show tdesc filename:                   Retrieving Descriptions.
                                                             (line   25)
* signals:                               Signals.            (line    6)
* signals the inferior may see, remote request: General Query Packets.
                                                             (line  306)
* 'SIGQUIT' signal, dump core of GDB:    Maintenance Commands.
                                                             (line  173)
* simulator, Z8000:                      Z8000.              (line    6)
* size of remote memory accesses:        Packets.            (line  248)
* 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   50)
* source line and its code address:      Machine Code.       (line    6)
* source path:                           Source Path.        (line    6)
* Sparc:                                 Remote Stub.        (line   65)
* 'sparc-stub.c':                        Remote Stub.        (line   65)
* 'sparcl-stub.c':                       Remote Stub.        (line   68)
* Sparclet:                              Sparclet.           (line    6)
* SparcLite:                             Remote Stub.        (line   68)
* 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  105)
* stat, file-i/o system call:            stat/fstat.         (line    6)
* static members of C++ objects:         Print Settings.     (line  478)
* static members of Pascal objects:      Print Settings.     (line  489)
* static probe point, DTrace:            Static Probe Points.
                                                             (line    6)
* static probe point, SystemTap:         Static Probe Points.
                                                             (line    6)
* static tracepoints:                    Set Tracepoints.    (line   28)
* static tracepoints, in remote protocol: General Query Packets.
                                                             (line  760)
* 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 and signal handlers:          Signals.            (line  106)
* stepping into functions with no line info: Continuing and Stepping.
                                                             (line   92)
* stop a running trace experiment:       Starting and Stopping Trace Experiments.
                                                             (line   16)
* stop on C++ exceptions:                Set Catchpoints.    (line   16)
* 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  777)
* '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/union returned in registers:    i386.               (line    7)
* structure field name completion:       Completion.         (line  120)
* stub example, remote debugging:        Remote Stub.        (line    6)
* stupid questions:                      Messages/Warnings.  (line   49)
* Super-H:                               Super-H.            (line    6)
* supported GDB/MI features, list:       GDB/MI Support Commands.
                                                             (line   57)
* supported packets, remote query:       General Query Packets.
                                                             (line  398)
* switching threads:                     Threads.            (line    6)
* switching threads automatically:       All-Stop Mode.      (line   28)
* symbol cache size:                     Symbols.            (line  437)
* symbol cache, flushing:                Symbols.            (line  453)
* symbol cache, printing its contents:   Symbols.            (line  445)
* symbol cache, printing usage statistics: Symbols.          (line  449)
* symbol decoding style, C++:            Print Settings.     (line  427)
* symbol dump:                           Symbols.            (line  372)
* symbol file functions:                 Debugging Output.   (line  176)
* symbol from address:                   Symbols.            (line   84)
* symbol lookup:                         Debugging Output.   (line  169)
* symbol lookup, remote request:         General Query Packets.
                                                             (line  818)
* symbol names:                          Symbols.            (line   14)
* symbol table:                          Files.              (line    6)
* symbol table creation:                 Debugging Output.   (line  181)
* symbol tables in guile:                Symbol Tables In Guile.
                                                             (line    6)
* symbol tables in python:               Symbol Tables In Python.
                                                             (line    6)
* symbol tables, listing GDB's internal: Symbols.            (line  390)
* symbol, source file and line:          Print Settings.     (line   50)
* symbols in guile:                      Symbols In Guile.   (line    6)
* symbols in python:                     Symbols In Python.  (line    6)
* symbols, reading from relocatable object files: Files.     (line  132)
* symbols, reading immediately:          Files.              (line   89)
* synchronize with remote MIPS target:   MIPS Embedded.      (line   96)
* 'syscall DSO':                         Files.              (line  179)
* 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 configuration scripts:     System-wide Configuration Scripts.
                                                             (line    6)
* system-wide init file:                 System-wide configuration.
                                                             (line    6)
* 't' packet:                            Packets.            (line  332)
* 'T' packet:                            Packets.            (line  337)
* '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  188)
* target descriptions:                   Target Descriptions.
                                                             (line    6)
* target descriptions, AArch64 features: AArch64 Features.   (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   53)
* target descriptions, M68K features:    M68K Features.      (line    6)
* target descriptions, MicroBlaze features: MicroBlaze Features.
                                                             (line    6)
* target descriptions, MIPS features:    MIPS Features.      (line    6)
* target descriptions, Nios II features: Nios II Features.   (line    6)
* target descriptions, PowerPC features: PowerPC Features.   (line    6)
* target descriptions, predefined types: Predefined Target Types.
                                                             (line    6)
* target descriptions, S/390 features:   S/390 and System z Features.
                                                             (line    6)
* target descriptions, standard features: Standard Target Features.
                                                             (line    6)
* target descriptions, System z features: S/390 and System z 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 memory comparison:              Memory.             (line  128)
* target output in GDB/MI:               GDB/MI Output Syntax.
                                                             (line  110)
* 'target remote':                       Connecting.         (line   15)
* target stack description:              Maintenance Commands.
                                                             (line  328)
* target-assisted range stepping:        Continuing and Stepping.
                                                             (line  210)
* task attributes (GNU Hurd):            Hurd Native.        (line   48)
* task breakpoints, in Ada:              Ada Tasks.          (line  134)
* task exception port, GNU Hurd:         Hurd Native.        (line   67)
* task suspend count:                    Hurd Native.        (line   59)
* task switching with program using Ravenscar Profile: Ravenscar Profile.
                                                             (line   10)
* TCP port, 'target remote':             Connecting.         (line   33)
* terminal:                              Input/Output.       (line    6)
* Text User Interface:                   TUI.                (line    6)
* thread attributes info, remote request: General Query Packets.
                                                             (line  861)
* 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  130)
* thread identifier (GDB):               Threads.            (line   57)
* thread identifier (system):            Threads.            (line   45)
* thread info (Solaris):                 Threads.            (line   92)
* thread information, remote request:    General Query Packets.
                                                             (line  246)
* thread list format:                    Thread List Format. (line    6)
* thread number:                         Threads.            (line   57)
* thread properties, GNU Hurd:           Hurd Native.        (line   90)
* thread suspend count, GNU Hurd:        Hurd Native.        (line  109)
* THREAD-ID, in remote protocol:         Packets.            (line   20)
* threads and watchpoints:               Set Watchpoints.    (line  179)
* 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  463)
* timeout for commands:                  Maintenance Commands.
                                                             (line  484)
* timeout for serial communications:     Remote Configuration.
                                                             (line   72)
* timeout, for remote target connection: Remote Configuration.
                                                             (line  140)
* 'timeout', MIPS protocol:              MIPS Embedded.      (line   81)
* timestampping debugging info:          Debugging Output.   (line  195)
* 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  318)
* 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  307)
* tracepoint variables:                  Tracepoint Variables.
                                                             (line    6)
* tracepoints:                           Tracepoints.        (line    6)
* tracepoints support in 'gdbserver':    Server.             (line  283)
* 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   41)
* type chain of a data type:             Maintenance Commands.
                                                             (line  340)
* type checking:                         Checks.             (line   24)
* type conversions in C++:               C Plus Plus Expressions.
                                                             (line   26)
* type printer:                          Type Printing API.  (line    9)
* type printing API for Python:          Type Printing API.  (line    6)
* types in guile:                        Types In Guile.     (line    6)
* types in Python:                       Types In Python.    (line    6)
* UDP port, 'target remote':             Connecting.         (line   54)
* union field name completion:           Completion.         (line  120)
* unions in structures, printing:        Print Settings.     (line  367)
* 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  336)
* 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   36)
* unwind stack in called functions with unhandled exceptions: Calling.
                                                             (line   47)
* unwinding frames in Python:            Unwinding Frames in Python.
                                                             (line    6)
* use only software watchpoints:         Set Watchpoints.    (line  108)
* user registers:                        Maintenance Commands.
                                                             (line  299)
* 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, in guile:        Values From Inferior In Guile.
                                                             (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  202)
* variable objects in GDB/MI:            GDB/MI Variable Objects.
                                                             (line    9)
* variable values, wrong:                Variables.          (line  106)
* variables, readline:                   Readline Init File Syntax.
                                                             (line   34)
* variables, setting:                    Assignment.         (line   16)
* 'vAttach' packet:                      Packets.            (line  351)
* 'vCont' packet:                        Packets.            (line  369)
* 'vCont?' packet:                       Packets.            (line  428)
* vector unit:                           Vector Unit.        (line    6)
* vector, auxiliary:                     OS Information.     (line    9)
* verbose operation:                     Messages/Warnings.  (line    6)
* verify remote memory image:            Memory.             (line  128)
* verify target memory image:            Memory.             (line  128)
* 'vFile' packet:                        Packets.            (line  438)
* 'vFlashDone' packet:                   Packets.            (line  477)
* 'vFlashErase' packet:                  Packets.            (line  442)
* 'vFlashWrite' packet:                  Packets.            (line  457)
* vfork events, remote reply:            Stop Reply Packets. (line  107)
* vforkdone events, remote reply:        Stop Reply Packets. (line  119)
* virtual functions (C++) display:       Print Settings.     (line  500)
* 'vKill' packet:                        Packets.            (line  484)
* volatile registers:                    Registers.          (line  101)
* 'vRun' packet:                         Packets.            (line  496)
* 'vStopped' packet:                     Packets.            (line  511)
* VTBL display:                          Print Settings.     (line  500)
* watchdog timer:                        Maintenance Commands.
                                                             (line  484)
* watchpoints:                           Breakpoints.        (line   20)
* watchpoints and threads:               Set Watchpoints.    (line  179)
* weak alias functions:                  Calling.            (line   58)
* where to look for shared libraries:    Files.              (line  369)
* wild pointer, interpreting:            Print Settings.     (line   80)
* Wind River Linux system-wide configuration script: System-wide Configuration Scripts.
                                                             (line   22)
* word completion:                       Completion.         (line    6)
* working directory:                     Source Path.        (line  106)
* working directory (of your program):   Working Directory.  (line    6)
* working language:                      Languages.          (line   13)
* write data into object, remote request: General Query Packets.
                                                             (line 1134)
* write, file-i/o system call:           write.              (line    6)
* writing a frame filter:                Writing a Frame Filter.
                                                             (line    6)
* writing a Guile pretty-printer:        Writing a Guile Pretty-Printer.
                                                             (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 into executables <1>:          Compiling and Injecting Code.
                                                             (line    6)
* writing JIT debug info readers:        Writing JIT Debug Info Readers.
                                                             (line    6)
* writing xmethods in Python:            Writing an Xmethod. (line    6)
* wrong values:                          Variables.          (line  106)
* 'x' command, default address:          Machine Code.       (line   30)
* 'X' packet:                            Packets.            (line  514)
* Xilinx MicroBlaze:                     MicroBlaze.         (line    6)
* XInclude:                              Target Description Format.
                                                             (line   53)
* XMD, Xilinx Microprocessor Debugger:   MicroBlaze.         (line    6)
* xmethod API:                           Xmethod API.        (line    6)
* xmethods in Python:                    Xmethods In Python. (line    6)
* XML parser debugging:                  Debugging Output.   (line  208)
* yanking text:                          Readline Killing Commands.
                                                             (line    6)
* 'z' packet:                            Packets.            (line  527)
* 'Z' packets:                           Packets.            (line  527)
* 'z0' packet:                           Packets.            (line  542)
* 'Z0' packet:                           Packets.            (line  542)
* 'z1' packet:                           Packets.            (line  596)
* 'Z1' packet:                           Packets.            (line  596)
* 'z2' packet:                           Packets.            (line  616)
* 'Z2' packet:                           Packets.            (line  616)
* 'z3' packet:                           Packets.            (line  629)
* 'Z3' packet:                           Packets.            (line  629)
* 'z4' packet:                           Packets.            (line  642)
* 'Z4' packet:                           Packets.            (line  642)
* Z8000:                                 Z8000.              (line    6)
* Zilog Z8000 simulator:                 Z8000.              (line    6)


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  37)
* $bpnum, convenience variable:          Set Breaks.          (line   6)
* $cdir, convenience variable:           Source Path.         (line 106)
* $cwd, convenience variable:            Source Path.         (line 106)
* $tpnum:                                Create and Delete Tracepoints.
                                                              (line 123)
* $tracepoint:                           Tracepoint Variables.
                                                              (line  10)
* $trace_file:                           Tracepoint Variables.
                                                              (line  16)
* $trace_frame:                          Tracepoint Variables.
                                                              (line   6)
* $trace_func:                           Tracepoint Variables.
                                                              (line  19)
* $trace_line:                           Tracepoint Variables.
                                                              (line  13)
* $_, convenience variable:              Convenience Vars.    (line  65)
* $_any_caller_is, convenience function: Convenience Funs.    (line 111)
* $_any_caller_matches, convenience function: Convenience Funs.
                                                              (line 123)
* $_caller_is, convenience function:     Convenience Funs.    (line  81)
* $_caller_matches, convenience function: Convenience Funs.   (line 104)
* $_exception, convenience variable:     Set Catchpoints.     (line  21)
* $_exitcode, convenience variable:      Convenience Vars.    (line  80)
* $_exitsignal, convenience variable:    Convenience Vars.    (line  85)
* $_isvoid, convenience function:        Convenience Funs.    (line  15)
* $_memeq, convenience function:         Convenience Funs.    (line  65)
* $_probe_arg, convenience variable:     Static Probe Points. (line  77)
* $_regex, convenience function:         Convenience Funs.    (line  69)
* $_sdata, collect:                      Tracepoint Actions.  (line  78)
* $_sdata, inspect, convenience variable: Convenience Vars.   (line 142)
* $_siginfo, convenience variable:       Convenience Vars.    (line 148)
* $_streq, convenience function:         Convenience Funs.    (line  74)
* $_strlen, convenience function:        Convenience Funs.    (line  78)
* $_thread, convenience variable:        Threads.             (line 110)
* $_tlb, convenience variable:           Convenience Vars.    (line 154)
* $__, convenience variable:             Convenience Vars.    (line  74)
* (make-command:                         Commands In Guile.   (line  15)
* (make-parameter:                       Parameters In Guile. (line  22)
* -ada-task-info:                        GDB/MI Ada Tasking Commands.
                                                              (line   9)
* -add-inferior:                         GDB/MI Miscellaneous Commands.
                                                              (line 295)
* -break-after:                          GDB/MI Breakpoint Commands.
                                                              (line  11)
* -break-commands:                       GDB/MI Breakpoint Commands.
                                                              (line  56)
* -break-condition:                      GDB/MI Breakpoint Commands.
                                                              (line  90)
* -break-delete:                         GDB/MI Breakpoint Commands.
                                                              (line 127)
* -break-disable:                        GDB/MI Breakpoint Commands.
                                                              (line 161)
* -break-enable:                         GDB/MI Breakpoint Commands.
                                                              (line 197)
* -break-info:                           GDB/MI Breakpoint Commands.
                                                              (line 232)
* -break-insert:                         GDB/MI Breakpoint Commands.
                                                              (line 256)
* -break-list:                           GDB/MI Breakpoint Commands.
                                                              (line 409)
* -break-passcount:                      GDB/MI Breakpoint Commands.
                                                              (line 481)
* -break-watch:                          GDB/MI Breakpoint Commands.
                                                              (line 493)
* -catch-assert:                         Ada Exception GDB/MI Catchpoint Commands.
                                                              (line  12)
* -catch-exception:                      Ada Exception GDB/MI Catchpoint Commands.
                                                              (line  46)
* -catch-load:                           Shared Library GDB/MI Catchpoint Commands.
                                                              (line   9)
* -catch-unload:                         Shared Library GDB/MI Catchpoint Commands.
                                                              (line  36)
* -data-disassemble:                     GDB/MI Data Manipulation.
                                                              (line  15)
* -data-evaluate-expression:             GDB/MI Data Manipulation.
                                                              (line 177)
* -data-list-changed-registers:          GDB/MI Data Manipulation.
                                                              (line 215)
* -data-list-register-names:             GDB/MI Data Manipulation.
                                                              (line 251)
* -data-list-register-values:            GDB/MI Data Manipulation.
                                                              (line 291)
* -data-read-memory:                     GDB/MI Data Manipulation.
                                                              (line 378)
* -data-read-memory-bytes:               GDB/MI Data Manipulation.
                                                              (line 485)
* -data-write-memory-bytes:              GDB/MI Data Manipulation.
                                                              (line 560)
* -dprintf-insert:                       GDB/MI Breakpoint Commands.
                                                              (line 342)
* -enable-frame-filters:                 GDB/MI Stack Manipulation.
                                                              (line   9)
* -enable-pretty-printing:               GDB/MI Variable Objects.
                                                              (line 118)
* -enable-timings:                       GDB/MI Miscellaneous Commands.
                                                              (line 392)
* -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  53)
* -exec-interrupt:                       GDB/MI Program Execution.
                                                              (line  96)
* -exec-jump:                            GDB/MI Program Execution.
                                                              (line 146)
* -exec-next:                            GDB/MI Program Execution.
                                                              (line 170)
* -exec-next-instruction:                GDB/MI Program Execution.
                                                              (line 201)
* -exec-return:                          GDB/MI Program Execution.
                                                              (line 237)
* -exec-run:                             GDB/MI Program Execution.
                                                              (line 280)
* -exec-step:                            GDB/MI Program Execution.
                                                              (line 350)
* -exec-step-instruction:                GDB/MI Program Execution.
                                                              (line 392)
* -exec-until:                           GDB/MI Program Execution.
                                                              (line 433)
* -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 343)
* -inferior-tty-show:                    GDB/MI Miscellaneous Commands.
                                                              (line 366)
* -info-ada-exceptions:                  GDB/MI Ada Exceptions Commands.
                                                              (line   9)
* -info-gdb-mi-command:                  GDB/MI Support Commands.
                                                              (line  14)
* -info-os:                              GDB/MI Miscellaneous Commands.
                                                              (line 221)
* -interpreter-exec:                     GDB/MI Miscellaneous Commands.
                                                              (line 317)
* -list-features:                        GDB/MI Support Commands.
                                                              (line  57)
* -list-target-features:                 GDB/MI Support Commands.
                                                              (line 112)
* -list-thread-groups:                   GDB/MI Miscellaneous Commands.
                                                              (line 111)
* -stack-info-depth:                     GDB/MI Stack Manipulation.
                                                              (line  50)
* -stack-info-frame:                     GDB/MI Stack Manipulation.
                                                              (line  24)
* -stack-list-arguments:                 GDB/MI Stack Manipulation.
                                                              (line  88)
* -stack-list-frames:                    GDB/MI Stack Manipulation.
                                                              (line 182)
* -stack-list-locals:                    GDB/MI Stack Manipulation.
                                                              (line 281)
* -stack-list-variables:                 GDB/MI Stack Manipulation.
                                                              (line 327)
* -stack-select-frame:                   GDB/MI Stack Manipulation.
                                                              (line 355)
* -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 192)
* -thread-info:                          GDB/MI Thread Commands.
                                                              (line   9)
* -thread-list-ids:                      GDB/MI Thread Commands.
                                                              (line  88)
* -thread-select:                        GDB/MI Thread Commands.
                                                              (line 116)
* -trace-define-variable:                GDB/MI Tracepoint Commands.
                                                              (line  80)
* -trace-find:                           GDB/MI Tracepoint Commands.
                                                              (line  12)
* -trace-frame-collected:                GDB/MI Tracepoint Commands.
                                                              (line  97)
* -trace-list-variables:                 GDB/MI Tracepoint Commands.
                                                              (line 204)
* -trace-save:                           GDB/MI Tracepoint Commands.
                                                              (line 246)
* -trace-start:                          GDB/MI Tracepoint Commands.
                                                              (line 263)
* -trace-status:                         GDB/MI Tracepoint Commands.
                                                              (line 279)
* -trace-stop:                           GDB/MI Tracepoint Commands.
                                                              (line 350)
* -var-assign:                           GDB/MI Variable Objects.
                                                              (line 492)
* -var-create:                           GDB/MI Variable Objects.
                                                              (line 136)
* -var-delete:                           GDB/MI Variable Objects.
                                                              (line 224)
* -var-evaluate-expression:              GDB/MI Variable Objects.
                                                              (line 471)
* -var-info-expression:                  GDB/MI Variable Objects.
                                                              (line 408)
* -var-info-num-children:                GDB/MI Variable Objects.
                                                              (line 273)
* -var-info-path-expression:             GDB/MI Variable Objects.
                                                              (line 433)
* -var-info-type:                        GDB/MI Variable Objects.
                                                              (line 395)
* -var-list-children:                    GDB/MI Variable Objects.
                                                              (line 289)
* -var-set-format:                       GDB/MI Variable Objects.
                                                              (line 237)
* -var-set-frozen:                       GDB/MI Variable Objects.
                                                              (line 636)
* -var-set-update-range:                 GDB/MI Variable Objects.
                                                              (line 662)
* -var-set-visualizer:                   GDB/MI Variable Objects.
                                                              (line 685)
* -var-show-attributes:                  GDB/MI Variable Objects.
                                                              (line 457)
* -var-show-format:                      GDB/MI Variable Objects.
                                                              (line 260)
* -var-update:                           GDB/MI Variable Objects.
                                                              (line 516)
* <gdb:arch>:                            Architectures In Guile.
                                                              (line   6)
* <gdb:block>:                           Blocks In Guile.     (line   6)
* <gdb:breakpoint>:                      Breakpoints In Guile.
                                                              (line   6)
* <gdb:iterator>:                        Iterators In Guile.  (line   6)
* <gdb:lazy-string>:                     Lazy Strings In Guile.
                                                              (line   6)
* <gdb:objfile>:                         Objfiles In Guile.   (line   6)
* <gdb:progspace>:                       Progspaces In Guile. (line   6)
* <gdb:sal>:                             Symbol Tables In Guile.
                                                              (line   6)
* <gdb:symbol>:                          Symbols In Guile.    (line   6)
* <gdb:symtab>:                          Symbol Tables In Guile.
                                                              (line   6)
* <gdb:type>:                            Types In Guile.      (line   6)
* '<gdb:value>':                         Values From Inferior In Guile.
                                                              (line   6)
* @, 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  36)
* ^running:                              GDB/MI Result Records.
                                                              (line  14)
* __init__ on TypePrinter:               gdb.types.           (line  82)
* abort (C-g):                           Miscellaneous Commands.
                                                              (line  10)
* accept-line (Newline or Return):       Commands For History.
                                                              (line   6)
* actions:                               Tracepoint Actions.  (line   6)
* ada-task-info:                         GDB/MI Support Commands.
                                                              (line  94)
* add-auto-load-safe-path:               Auto-loading safe path.
                                                              (line  50)
* add-auto-load-scripts-directory:       objfile-gdbdotext file.
                                                              (line  64)
* add-inferior:                          Inferiors and Programs.
                                                              (line  60)
* add-symbol-file:                       Files.               (line 112)
* add-symbol-file-from-memory:           Files.               (line 179)
* advance LOCATION:                      Continuing and Stepping.
                                                              (line 180)
* alias:                                 Aliases.             (line  21)
* append:                                Dump/Restore Files.  (line  34)
* append-pretty-printer!:                Guile Printing Module.
                                                              (line  18)
* apropos:                               Help.                (line  62)
* arch-bool-type:                        Architectures In Guile.
                                                              (line  84)
* arch-char-type:                        Architectures In Guile.
                                                              (line  36)
* arch-charset:                          Architectures In Guile.
                                                              (line  23)
* arch-disassemble:                      Disassembly In Guile.
                                                              (line  10)
* arch-double-type:                      Architectures In Guile.
                                                              (line  76)
* arch-float-type:                       Architectures In Guile.
                                                              (line  72)
* arch-int-type:                         Architectures In Guile.
                                                              (line  44)
* arch-int16-type:                       Architectures In Guile.
                                                              (line 104)
* arch-int32-type:                       Architectures In Guile.
                                                              (line 112)
* arch-int64-type:                       Architectures In Guile.
                                                              (line 120)
* arch-int8-type:                        Architectures In Guile.
                                                              (line  96)
* arch-long-type:                        Architectures In Guile.
                                                              (line  48)
* arch-longdouble-type:                  Architectures In Guile.
                                                              (line  80)
* arch-longlong-type:                    Architectures In Guile.
                                                              (line  88)
* arch-name:                             Architectures In Guile.
                                                              (line  20)
* arch-schar-type:                       Architectures In Guile.
                                                              (line  52)
* arch-short-type:                       Architectures In Guile.
                                                              (line  40)
* arch-uchar-type:                       Architectures In Guile.
                                                              (line  56)
* arch-uint-type:                        Architectures In Guile.
                                                              (line  64)
* arch-uint16-type:                      Architectures In Guile.
                                                              (line 108)
* arch-uint32-type:                      Architectures In Guile.
                                                              (line 116)
* arch-uint64-type:                      Architectures In Guile.
                                                              (line 124)
* arch-uint8-type:                       Architectures In Guile.
                                                              (line 100)
* arch-ulong-type:                       Architectures In Guile.
                                                              (line  68)
* arch-ulonglong-type:                   Architectures In Guile.
                                                              (line  92)
* arch-ushort-type:                      Architectures In Guile.
                                                              (line  60)
* arch-void-type:                        Architectures In Guile.
                                                              (line  32)
* arch-wide-charset:                     Architectures In Guile.
                                                              (line  26)
* arch?:                                 Architectures In Guile.
                                                              (line  13)
* Architecture.disassemble:              Architectures In Python.
                                                              (line  15)
* Architecture.name:                     Architectures In Python.
                                                              (line  12)
* attach:                                Attach.              (line   6)
* attach&:                               Background Execution.
                                                              (line  25)
* 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 Guile.     (line  70)
* block-function:                        Blocks In Guile.     (line  73)
* block-global-block:                    Blocks In Guile.     (line  87)
* block-global?:                         Blocks In Guile.     (line  93)
* block-start:                           Blocks In Guile.     (line  67)
* block-static-block:                    Blocks In Guile.     (line  90)
* block-static?:                         Blocks In Guile.     (line  97)
* block-superblock:                      Blocks In Guile.     (line  83)
* block-symbols:                         Blocks In Guile.     (line 101)
* block-symbols-progress?:               Blocks In Guile.     (line 112)
* block-valid?:                          Blocks In Guile.     (line  59)
* Block.end:                             Blocks In Python.    (line  81)
* Block.function:                        Blocks In Python.    (line  84)
* Block.global_block:                    Blocks In Python.    (line  99)
* Block.is_global:                       Blocks In Python.    (line 107)
* Block.is_static:                       Blocks In Python.    (line 111)
* Block.is_valid:                        Blocks In Python.    (line  68)
* Block.start:                           Blocks In Python.    (line  78)
* Block.static_block:                    Blocks In Python.    (line 103)
* Block.superblock:                      Blocks In Python.    (line  94)
* block?:                                Blocks In Guile.     (line  55)
* BP_ACCESS_WATCHPOINT:                  Breakpoints In Python.
                                                              (line 153)
* BP_ACCESS_WATCHPOINT <1>:              Breakpoints In Guile.
                                                              (line  71)
* BP_BREAKPOINT:                         Breakpoints In Python.
                                                              (line 141)
* BP_BREAKPOINT <1>:                     Breakpoints In Guile.
                                                              (line  57)
* BP_HARDWARE_WATCHPOINT:                Breakpoints In Python.
                                                              (line 147)
* BP_HARDWARE_WATCHPOINT <1>:            Breakpoints In Guile.
                                                              (line  63)
* BP_READ_WATCHPOINT:                    Breakpoints In Python.
                                                              (line 150)
* BP_READ_WATCHPOINT <1>:                Breakpoints In Guile.
                                                              (line  67)
* BP_WATCHPOINT:                         Breakpoints In Python.
                                                              (line 144)
* BP_WATCHPOINT <1>:                     Breakpoints In Guile.
                                                              (line  60)
* break:                                 Set Breaks.          (line   6)
* break ... task TASKNO (Ada):           Ada Tasks.           (line 134)
* 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-commands:                   Breakpoints In Guile.
                                                              (line 235)
* breakpoint-condition:                  Breakpoints In Guile.
                                                              (line 193)
* breakpoint-enabled?:                   Breakpoints In Guile.
                                                              (line 144)
* breakpoint-expression:                 Breakpoints In Guile.
                                                              (line 139)
* breakpoint-hit-count:                  Breakpoints In Guile.
                                                              (line 169)
* breakpoint-ignore-count:               Breakpoints In Guile.
                                                              (line 163)
* breakpoint-location:                   Breakpoints In Guile.
                                                              (line 134)
* breakpoint-notifications:              GDB/MI Support Commands.
                                                              (line  91)
* breakpoint-number:                     Breakpoints In Guile.
                                                              (line 122)
* breakpoint-silent?:                    Breakpoints In Guile.
                                                              (line 151)
* breakpoint-stop:                       Breakpoints In Guile.
                                                              (line 201)
* breakpoint-task:                       Breakpoints In Guile.
                                                              (line 184)
* breakpoint-thread:                     Breakpoints In Guile.
                                                              (line 176)
* breakpoint-type:                       Breakpoints In Guile.
                                                              (line 126)
* breakpoint-valid?:                     Breakpoints In Guile.
                                                              (line 112)
* breakpoint-visible?:                   Breakpoints In Guile.
                                                              (line 130)
* Breakpoint.commands:                   Breakpoints In Python.
                                                              (line 178)
* Breakpoint.condition:                  Breakpoints In Python.
                                                              (line 173)
* Breakpoint.delete:                     Breakpoints In Python.
                                                              (line  81)
* Breakpoint.enabled:                    Breakpoints In Python.
                                                              (line  86)
* Breakpoint.expression:                 Breakpoints In Python.
                                                              (line 167)
* Breakpoint.hit_count:                  Breakpoints In Python.
                                                              (line 156)
* Breakpoint.ignore_count:               Breakpoints In Python.
                                                              (line 110)
* Breakpoint.is_valid:                   Breakpoints In Python.
                                                              (line  73)
* Breakpoint.location:                   Breakpoints In Python.
                                                              (line 161)
* Breakpoint.number:                     Breakpoints In Python.
                                                              (line 114)
* Breakpoint.silent:                     Breakpoints In Python.
                                                              (line  91)
* Breakpoint.stop:                       Breakpoints In Python.
                                                              (line  30)
* Breakpoint.task:                       Breakpoints In Python.
                                                              (line 104)
* Breakpoint.temporary:                  Breakpoints In Python.
                                                              (line 129)
* Breakpoint.thread:                     Breakpoints In Python.
                                                              (line  99)
* Breakpoint.type:                       Breakpoints In Python.
                                                              (line 119)
* Breakpoint.visible:                    Breakpoints In Python.
                                                              (line 124)
* Breakpoint.__init__:                   Breakpoints In Python.
                                                              (line   8)
* breakpoint?:                           Breakpoints In Guile.
                                                              (line 108)
* BreakpointEvent.breakpoint:            Events In Python.    (line 105)
* BreakpointEvent.breakpoints:           Events In Python.    (line 101)
* breakpoints:                           Breakpoints In Guile.
                                                              (line 104)
* breakpoints-invalid annotation:        Invalidation.        (line  14)
* bt ('backtrace'):                      Backtrace.           (line  11)
* c ('continue'):                        Continuing and Stepping.
                                                              (line  16)
* 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  11)
* C-x A:                                 TUI Keys.            (line  12)
* 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  11)
* 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)
* catch assert:                          Set Catchpoints.     (line  87)
* catch catch:                           Set Catchpoints.     (line  16)
* catch exception:                       Set Catchpoints.     (line  66)
* catch exception unhandled:             Set Catchpoints.     (line  83)
* catch exec:                            Set Catchpoints.     (line  90)
* catch fork:                            Set Catchpoints.     (line 212)
* catch load:                            Set Catchpoints.     (line 221)
* catch rethrow:                         Set Catchpoints.     (line  16)
* catch signal:                          Set Catchpoints.     (line 226)
* catch syscall:                         Set Catchpoints.     (line  95)
* catch throw:                           Set Catchpoints.     (line  16)
* catch unload:                          Set Catchpoints.     (line 221)
* catch vfork:                           Set Catchpoints.     (line 216)
* cd:                                    Working Directory.   (line  16)
* cdir:                                  Source Path.         (line 106)
* 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)
* ClearObjFilesEvent.progspace:          Events In Python.    (line 125)
* clone-inferior:                        Inferiors and Programs.
                                                              (line  67)
* collect (tracepoints):                 Tracepoint Actions.  (line  49)
* colon-colon, in Modula-2:              M2 Scope.            (line   6)
* Command.complete:                      Commands In Python.  (line  70)
* Command.dont_repeat:                   Commands In Python.  (line  42)
* Command.invoke:                        Commands In Python.  (line  48)
* Command.__init__:                      Commands In Python.  (line  10)
* command?:                              Commands In Guile.   (line  63)
* commands:                              Break Commands.      (line  11)
* commands annotation:                   Prompting.           (line  27)
* COMMAND_BREAKPOINTS:                   Commands In Python.  (line 142)
* COMMAND_BREAKPOINTS <1>:               Commands In Guile.   (line 177)
* COMMAND_DATA:                          Commands In Python.  (line 113)
* COMMAND_DATA <1>:                      Commands In Guile.   (line 148)
* COMMAND_FILES:                         Commands In Python.  (line 124)
* COMMAND_FILES <1>:                     Commands In Guile.   (line 159)
* COMMAND_MAINTENANCE:                   Commands In Python.  (line 166)
* COMMAND_MAINTENANCE <1>:               Commands In Guile.   (line 201)
* COMMAND_NONE:                          Commands In Python.  (line 103)
* COMMAND_NONE <1>:                      Commands In Guile.   (line 137)
* COMMAND_OBSCURE:                       Commands In Python.  (line 160)
* COMMAND_OBSCURE <1>:                   Commands In Guile.   (line 195)
* COMMAND_RUNNING:                       Commands In Python.  (line 107)
* COMMAND_RUNNING <1>:                   Commands In Guile.   (line 142)
* COMMAND_STACK:                         Commands In Python.  (line 118)
* COMMAND_STACK <1>:                     Commands In Guile.   (line 153)
* COMMAND_STATUS:                        Commands In Python.  (line 136)
* COMMAND_STATUS <1>:                    Commands In Guile.   (line 171)
* COMMAND_SUPPORT:                       Commands In Python.  (line 129)
* COMMAND_SUPPORT <1>:                   Commands In Guile.   (line 164)
* COMMAND_TRACEPOINTS:                   Commands In Python.  (line 148)
* COMMAND_TRACEPOINTS <1>:               Commands In Guile.   (line 183)
* COMMAND_USER:                          Commands In Python.  (line 154)
* COMMAND_USER <1>:                      Commands In Guile.   (line 189)
* comment-begin:                         Readline Init File Syntax.
                                                              (line  47)
* compare-sections:                      Memory.              (line 135)
* compile code:                          Compiling and Injecting Code.
                                                              (line  11)
* compile file:                          Compiling and Injecting Code.
                                                              (line  56)
* complete:                              Help.                (line  77)
* complete (<TAB>):                      Commands For Completion.
                                                              (line   6)
* COMPLETE_COMMAND:                      Commands In Python.  (line 187)
* COMPLETE_COMMAND <1>:                  Commands In Guile.   (line 222)
* COMPLETE_EXPRESSION:                   Commands In Python.  (line 195)
* COMPLETE_EXPRESSION <1>:               Commands In Guile.   (line 230)
* COMPLETE_FILENAME:                     Commands In Python.  (line 180)
* COMPLETE_FILENAME <1>:                 Commands In Guile.   (line 215)
* COMPLETE_LOCATION:                     Commands In Python.  (line 183)
* COMPLETE_LOCATION <1>:                 Commands In Guile.   (line 218)
* COMPLETE_NONE:                         Commands In Python.  (line 177)
* COMPLETE_NONE <1>:                     Commands In Guile.   (line 212)
* COMPLETE_SYMBOL:                       Commands In Python.  (line 191)
* COMPLETE_SYMBOL <1>:                   Commands In Guile.   (line 226)
* 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  58)
* continue:                              Continuing and Stepping.
                                                              (line  16)
* continue&:                             Background Execution.
                                                              (line  40)
* 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  96)
* ctf:                                   Trace Files.         (line  28)
* Ctrl-o (operate-and-get-next):         Command Syntax.      (line  41)
* current-arch:                          Architectures In Guile.
                                                              (line  17)
* current-objfile:                       Objfiles In Guile.   (line  46)
* current-progspace:                     Progspaces In Guile. (line  26)
* cwd:                                   Source Path.         (line 106)
* d ('delete'):                          Delete Breaks.       (line  41)
* d (SingleKey TUI key):                 TUI Single Key Mode. (line  13)
* data-directory:                        Guile Configuration. (line   9)
* data-read-memory-bytes:                GDB/MI Support Commands.
                                                              (line  88)
* debug_chaos:                           M32R/D.              (line  50)
* default-visualizer:                    Guile Pretty Printing API.
                                                              (line 126)
* define:                                Define.              (line  37)
* delete:                                Delete Breaks.       (line  41)
* delete checkpoint CHECKPOINT-ID:       Checkpoint/Restart.  (line  53)
* 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-breakpoint!:                    Breakpoints In Guile.
                                                              (line  95)
* 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)
* demangle:                              Symbols.             (line 103)
* detach:                                Attach.              (line  36)
* detach (remote):                       Connecting.          (line  95)
* detach inferiors INFNO...:             Inferiors and Programs.
                                                              (line  96)
* digit-argument ('M-0', 'M-1', ... 'M--'): Numeric Arguments.
                                                              (line   6)
* dir:                                   Source Path.         (line  38)
* directory:                             Source Path.         (line  38)
* dis ('disable'):                       Disabling.           (line  37)
* disable:                               Disabling.           (line  37)
* disable display:                       Auto Display.        (line  56)
* disable frame-filter:                  Frame Filter Management.
                                                              (line  16)
* disable mem:                           Memory Region Attributes.
                                                              (line  38)
* disable pretty-printer:                Pretty-Printer Commands.
                                                              (line  20)
* disable probes:                        Static Probe Points. (line  73)
* disable tracepoint:                    Enable and Disable Tracepoints.
                                                              (line   9)
* disable type-printer:                  Symbols.             (line 256)
* disable-completion:                    Readline Init File Syntax.
                                                              (line  93)
* disassemble:                           Machine Code.        (line  36)
* disconnect:                            Connecting.          (line 102)
* display:                               Auto Display.        (line  23)
* do ('down'):                           Selection.           (line  32)
* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands.
                                                              (line  14)
* document:                              Define.              (line  49)
* dont-repeat:                           Commands In Guile.   (line  67)
* dont-repeat <1>:                       Define.              (line  61)
* down:                                  Selection.           (line  32)
* Down:                                  TUI Keys.            (line  56)
* down-silently:                         Selection.           (line  56)
* downcase-word (M-l):                   Commands For Text.   (line  45)
* dprintf:                               Dynamic Printf.      (line  26)
* dprintf-style agent:                   Dynamic Printf.      (line  46)
* dprintf-style call:                    Dynamic Printf.      (line  42)
* dprintf-style gdb:                     Dynamic Printf.      (line  39)
* dump:                                  Dump/Restore Files.  (line  13)
* dump-functions ():                     Miscellaneous Commands.
                                                              (line  69)
* dump-macros ():                        Miscellaneous Commands.
                                                              (line  81)
* dump-variables ():                     Miscellaneous Commands.
                                                              (line  75)
* 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  74)
* emacs-editing-mode (C-e):              Miscellaneous Commands.
                                                              (line  87)
* enable:                                Disabling.           (line  44)
* enable display:                        Auto Display.        (line  65)
* enable frame-filter:                   Frame Filter Management.
                                                              (line  26)
* enable mem:                            Memory Region Attributes.
                                                              (line  42)
* enable pretty-printer:                 Pretty-Printer Commands.
                                                              (line  25)
* enable probes:                         Static Probe Points. (line  60)
* enable tracepoint:                     Enable and Disable Tracepoints.
                                                              (line  19)
* enable type-printer:                   Symbols.             (line 256)
* enable-keypad:                         Readline Init File Syntax.
                                                              (line 109)
* enabled:                               Xmethod API.         (line  18)
* enabled of type_printer:               Type Printing API.   (line  13)
* end (breakpoint commands):             Break Commands.      (line  11)
* end (if/else/while commands):          Command Files.       (line 103)
* 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-iteration:                      Iterators In Guile.  (line  70)
* end-of-iteration?:                     Iterators In Guile.  (line  73)
* end-of-line (C-e):                     Commands For Moving. (line   9)
* error annotation:                      Errors.              (line  10)
* error-begin annotation:                Errors.              (line  22)
* error-port:                            I/O Ports in Guile.  (line  12)
* eval:                                  Output.              (line 117)
* EventRegistry.connect:                 Events In Python.    (line  19)
* EventRegistry.disconnect:              Events In Python.    (line  23)
* exception-args:                        Guile Exception Handling.
                                                              (line 103)
* exception-key:                         Guile Exception Handling.
                                                              (line 100)
* exception?:                            Guile Exception Handling.
                                                              (line  96)
* exceptionHandler:                      Bootstrapping.       (line  38)
* exchange-point-and-mark (C-x C-x):     Miscellaneous Commands.
                                                              (line  36)
* exec-file:                             Files.               (line  39)
* exec-run-start-option:                 GDB/MI Support Commands.
                                                              (line 105)
* execute:                               Basic Guile.         (line  68)
* exited annotation:                     Annotations for Running.
                                                              (line  18)
* ExitedEvent:                           Events In Python.    (line  72)
* ExitedEvent.exit_code:                 Events In Python.    (line  67)
* expand-tilde:                          Readline Init File Syntax.
                                                              (line 120)
* explore:                               Data.                (line  36)
* f ('frame'):                           Selection.           (line  11)
* f (SingleKey TUI key):                 TUI Single Key Mode. (line  16)
* fg (resume foreground execution):      Continuing and Stepping.
                                                              (line  16)
* field-artificial?:                     Types In Guile.      (line 262)
* field-base-class?:                     Types In Guile.      (line 266)
* field-bitpos:                          Types In Guile.      (line 253)
* field-bitsize:                         Types In Guile.      (line 257)
* field-enumval:                         Types In Guile.      (line 250)
* field-name:                            Types In Guile.      (line 243)
* field-type:                            Types In Guile.      (line 246)
* field?:                                Types In Guile.      (line 239)
* file:                                  Files.               (line  16)
* fin ('finish'):                        Continuing and Stepping.
                                                              (line 109)
* find:                                  Searching Memory.    (line   9)
* find-pc-line:                          Symbol Tables In Guile.
                                                              (line  71)
* finish:                                Continuing and Stepping.
                                                              (line 109)
* finish&:                               Background Execution.
                                                              (line  43)
* FinishBreakpoint.out_of_scope:         Finish Breakpoints in Python.
                                                              (line  21)
* FinishBreakpoint.return_value:         Finish Breakpoints in Python.
                                                              (line  38)
* FinishBreakpoint.__init__:             Finish Breakpoints in Python.
                                                              (line  14)
* flushregs:                             Maintenance Commands.
                                                              (line 290)
* flush_i_cache:                         Bootstrapping.       (line  60)
* fo ('forward-search'):                 Search.              (line   9)
* focus:                                 TUI Commands.        (line  48)
* 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-arch:                            Frames In Guile.     (line  35)
* frame-block:                           Frames In Guile.     (line 121)
* frame-function:                        Frames In Guile.     (line 125)
* frame-name:                            Frames In Guile.     (line  32)
* frame-newer:                           Frames In Guile.     (line 133)
* frame-older:                           Frames In Guile.     (line 130)
* frame-pc:                              Frames In Guile.     (line 118)
* frame-read-register:                   Frames In Guile.     (line 140)
* frame-read-var:                        Frames In Guile.     (line 144)
* frame-sal:                             Frames In Guile.     (line 136)
* frame-select:                          Frames In Guile.     (line 152)
* frame-type:                            Frames In Guile.     (line  39)
* frame-unwind-stop-reason:              Frames In Guile.     (line  67)
* frame-valid?:                          Frames In Guile.     (line  26)
* Frame.architecture:                    Frames In Python.    (line  46)
* Frame.block:                           Frames In Python.    (line 132)
* Frame.find_sal:                        Frames In Python.    (line 145)
* Frame.function:                        Frames In Python.    (line 135)
* Frame.is_valid:                        Frames In Python.    (line  36)
* Frame.name:                            Frames In Python.    (line  42)
* Frame.newer:                           Frames In Python.    (line 142)
* Frame.older:                           Frames In Python.    (line 139)
* Frame.pc:                              Frames In Python.    (line 129)
* Frame.read_register:                   Frames In Python.    (line 149)
* Frame.read_var:                        Frames In Python.    (line 154)
* Frame.select:                          Frames In Python.    (line 162)
* Frame.type:                            Frames In Python.    (line  50)
* Frame.unwind_stop_reason:              Frames In Python.    (line  77)
* frame?:                                Frames In Guile.     (line  22)
* FrameDecorator.address:                Frame Decorator API. (line  56)
* FrameDecorator.elided:                 Frame Decorator API. (line  25)
* FrameDecorator.filename:               Frame Decorator API. (line  66)
* FrameDecorator.frame_args:             Frame Decorator API. (line  87)
* FrameDecorator.frame_locals:           Frame Decorator API. (line 139)
* FrameDecorator.function:               Frame Decorator API. (line  45)
* FrameDecorator.inferior_frame:         Frame Decorator API. (line 172)
* FrameDecorator.line:                   Frame Decorator API. (line  77)
* FrameFilter.enabled:                   Frame Filter API.    (line 122)
* FrameFilter.filter:                    Frame Filter API.    (line  75)
* FrameFilter.name:                      Frame Filter API.    (line 115)
* FrameFilter.priority:                  Frame Filter API.    (line 131)
* frames-invalid annotation:             Invalidation.        (line   9)
* frozen-varobjs:                        GDB/MI Support Commands.
                                                              (line  75)
* ftrace:                                Create and Delete Tracepoints.
                                                              (line  51)
* Function:                              Functions In Python. (line   6)
* Function.invoke:                       Functions In Python. (line  19)
* Function.__init__:                     Functions In Python. (line  10)
* gcore:                                 Core File Generation.
                                                              (line  17)
* gdb-object-kind:                       GDB Scheme Data Types.
                                                              (line  10)
* gdb-version:                           Guile Configuration. (line  17)
* gdb.Block:                             Blocks In Python.    (line   6)
* gdb.block_for_pc:                      Blocks In Python.    (line  61)
* gdb.block_for_pc <1>:                  Blocks In Python.    (line  61)
* gdb.BP_ACCESS_WATCHPOINT:              Breakpoints In Python.
                                                              (line 153)
* gdb.BP_BREAKPOINT:                     Breakpoints In Python.
                                                              (line 141)
* gdb.BP_HARDWARE_WATCHPOINT:            Breakpoints In Python.
                                                              (line 147)
* gdb.BP_READ_WATCHPOINT:                Breakpoints In Python.
                                                              (line 150)
* gdb.BP_WATCHPOINT:                     Breakpoints In Python.
                                                              (line 144)
* gdb.Breakpoint:                        Breakpoints In Python.
                                                              (line   6)
* gdb.breakpoints:                       Basic Python.        (line  55)
* gdb.breakpoints <1>:                   Basic Python.        (line  55)
* gdb.COMMAND_BREAKPOINTS:               Commands In Python.  (line 142)
* gdb.COMMAND_DATA:                      Commands In Python.  (line 113)
* gdb.COMMAND_FILES:                     Commands In Python.  (line 124)
* gdb.COMMAND_MAINTENANCE:               Commands In Python.  (line 166)
* gdb.COMMAND_NONE:                      Commands In Python.  (line 103)
* gdb.COMMAND_OBSCURE:                   Commands In Python.  (line 160)
* gdb.COMMAND_RUNNING:                   Commands In Python.  (line 107)
* gdb.COMMAND_STACK:                     Commands In Python.  (line 118)
* gdb.COMMAND_STATUS:                    Commands In Python.  (line 136)
* gdb.COMMAND_SUPPORT:                   Commands In Python.  (line 129)
* gdb.COMMAND_TRACEPOINTS:               Commands In Python.  (line 148)
* gdb.COMMAND_USER:                      Commands In Python.  (line 154)
* gdb.COMPLETE_COMMAND:                  Commands In Python.  (line 187)
* gdb.COMPLETE_EXPRESSION:               Commands In Python.  (line 195)
* gdb.COMPLETE_FILENAME:                 Commands In Python.  (line 180)
* gdb.COMPLETE_LOCATION:                 Commands In Python.  (line 183)
* gdb.COMPLETE_NONE:                     Commands In Python.  (line 177)
* gdb.COMPLETE_SYMBOL:                   Commands In Python.  (line 191)
* gdb.current_objfile:                   Objfiles In Python.  (line  15)
* gdb.current_objfile <1>:               Objfiles In Python.  (line  15)
* gdb.current_progspace:                 Progspaces In Python.
                                                              (line  14)
* gdb.current_progspace <1>:             Progspaces In Python.
                                                              (line  14)
* gdb.decode_line:                       Basic Python.        (line 187)
* gdb.decode_line <1>:                   Basic Python.        (line 187)
* gdb.default_visualizer:                Pretty Printing API. (line  85)
* gdb.default_visualizer <1>:            Pretty Printing API. (line  85)
* gdb.error:                             Exception Handling.  (line  22)
* gdb.execute:                           Basic Python.        (line  36)
* gdb.execute <1>:                       Basic Python.        (line  36)
* gdb.find_pc_line:                      Basic Python.        (line  94)
* gdb.find_pc_line <1>:                  Basic Python.        (line  94)
* gdb.FinishBreakpoint:                  Finish Breakpoints in Python.
                                                              (line   6)
* gdb.flush:                             Basic Python.        (line 153)
* gdb.flush <1>:                         Basic Python.        (line 153)
* gdb.frame_stop_reason_string:          Frames In Python.    (line  29)
* gdb.Function:                          Functions In Python. (line   6)
* gdb.GdbError:                          Exception Handling.  (line  42)
* gdb.history:                           Basic Python.        (line  70)
* gdb.history <1>:                       Basic Python.        (line  70)
* gdb.Inferior:                          Inferiors In Python. (line   6)
* gdb.inferiors:                         Inferiors In Python. (line  14)
* gdb.InferiorThread:                    Threads In Python.   (line   6)
* gdb.LazyString:                        Lazy Strings In Python.
                                                              (line   6)
* gdb.LineTable:                         Line Tables In Python.
                                                              (line   6)
* gdb.lookup_global_symbol:              Symbols In Python.   (line  33)
* gdb.lookup_global_symbol <1>:          Symbols In Python.   (line  33)
* gdb.lookup_objfile:                    Objfiles In Python.  (line  25)
* gdb.lookup_objfile <1>:                Objfiles In Python.  (line  25)
* gdb.lookup_symbol:                     Symbols In Python.   (line  13)
* gdb.lookup_symbol <1>:                 Symbols In Python.   (line  13)
* gdb.lookup_type:                       Types In Python.     (line  11)
* gdb.lookup_type <1>:                   Types In Python.     (line  11)
* gdb.MemoryError:                       Exception Handling.  (line  30)
* gdb.newest_frame:                      Frames In Python.    (line  26)
* gdb.newest_frame <1>:                  Frames In Python.    (line  26)
* gdb.Objfile:                           Objfiles In Python.  (line   6)
* gdb.objfiles:                          Objfiles In Python.  (line  21)
* gdb.objfiles <1>:                      Objfiles In Python.  (line  21)
* gdb.Parameter:                         Parameters In Python.
                                                              (line   6)
* gdb.parameter:                         Basic Python.        (line  59)
* gdb.parameter <1>:                     Basic Python.        (line  59)
* 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.parse_and_eval:                    Basic Python.        (line  83)
* gdb.parse_and_eval <1>:                Basic Python.        (line  83)
* gdb.post_event:                        Basic Python.        (line 101)
* gdb.post_event <1>:                    Basic Python.        (line 101)
* gdb.Progspace:                         Progspaces In Python.
                                                              (line   6)
* gdb.progspaces:                        Progspaces In Python.
                                                              (line  18)
* gdb.progspaces <1>:                    Progspaces In Python.
                                                              (line  18)
* gdb.prompt_hook:                       Basic Python.        (line 199)
* gdb.PYTHONDIR:                         Basic Python.        (line  33)
* gdb.PYTHONDIR <1>:                     Basic Python.        (line  33)
* gdb.search_memory:                     Inferiors In Python. (line  61)
* gdb.selected_frame:                    Frames In Python.    (line  22)
* gdb.selected_frame <1>:                Frames In Python.    (line  22)
* gdb.selected_inferior:                 Inferiors In Python. (line  17)
* gdb.selected_thread:                   Threads In Python.   (line  13)
* gdb.selected_thread <1>:               Threads In Python.   (line  13)
* gdb.solib_name:                        Basic Python.        (line 183)
* gdb.solib_name <1>:                    Basic Python.        (line 183)
* gdb.STDERR:                            Basic Python.        (line 143)
* gdb.STDERR <1>:                        Basic Python.        (line 163)
* gdb.STDLOG:                            Basic Python.        (line 146)
* gdb.STDLOG <1>:                        Basic Python.        (line 166)
* gdb.STDOUT:                            Basic Python.        (line 140)
* gdb.STDOUT <1>:                        Basic Python.        (line 160)
* gdb.string_to_argv:                    Commands In Python.  (line  61)
* gdb.Symbol:                            Symbols In Python.   (line   6)
* gdb.SYMBOL_FUNCTION_DOMAIN:            Symbols In Python.   (line 134)
* gdb.SYMBOL_LABEL_DOMAIN:               Symbols In Python.   (line 127)
* gdb.SYMBOL_LOC_ARG:                    Symbols In Python.   (line 156)
* gdb.SYMBOL_LOC_BLOCK:                  Symbols In Python.   (line 177)
* gdb.SYMBOL_LOC_COMPUTED:               Symbols In Python.   (line 191)
* gdb.SYMBOL_LOC_CONST:                  Symbols In Python.   (line 147)
* gdb.SYMBOL_LOC_CONST_BYTES:            Symbols In Python.   (line 180)
* gdb.SYMBOL_LOC_LOCAL:                  Symbols In Python.   (line 170)
* gdb.SYMBOL_LOC_OPTIMIZED_OUT:          Symbols In Python.   (line 188)
* gdb.SYMBOL_LOC_REF_ARG:                Symbols In Python.   (line 160)
* gdb.SYMBOL_LOC_REGISTER:               Symbols In Python.   (line 153)
* gdb.SYMBOL_LOC_REGPARM_ADDR:           Symbols In Python.   (line 165)
* gdb.SYMBOL_LOC_STATIC:                 Symbols In Python.   (line 150)
* gdb.SYMBOL_LOC_TYPEDEF:                Symbols In Python.   (line 173)
* gdb.SYMBOL_LOC_UNDEF:                  Symbols In Python.   (line 143)
* gdb.SYMBOL_LOC_UNRESOLVED:             Symbols In Python.   (line 183)
* gdb.SYMBOL_STRUCT_DOMAIN:              Symbols In Python.   (line 124)
* gdb.SYMBOL_TYPES_DOMAIN:               Symbols In Python.   (line 137)
* gdb.SYMBOL_UNDEF_DOMAIN:               Symbols In Python.   (line 115)
* gdb.SYMBOL_VARIABLES_DOMAIN:           Symbols In Python.   (line 130)
* gdb.SYMBOL_VAR_DOMAIN:                 Symbols In Python.   (line 120)
* gdb.Symtab:                            Symbol Tables In Python.
                                                              (line   6)
* gdb.Symtab_and_line:                   Symbol Tables In Python.
                                                              (line   6)
* gdb.target_charset:                    Basic Python.        (line 172)
* gdb.target_charset <1>:                Basic Python.        (line 172)
* gdb.target_wide_charset:               Basic Python.        (line 177)
* gdb.target_wide_charset <1>:           Basic Python.        (line 177)
* gdb.Type:                              Types In Python.     (line   6)
* gdb.TYPE_CODE_ARRAY:                   Types In Python.     (line 192)
* gdb.TYPE_CODE_BITSTRING:               Types In Python.     (line 230)
* gdb.TYPE_CODE_BOOL:                    Types In Python.     (line 251)
* gdb.TYPE_CODE_CHAR:                    Types In Python.     (line 248)
* gdb.TYPE_CODE_COMPLEX:                 Types In Python.     (line 254)
* gdb.TYPE_CODE_DECFLOAT:                Types In Python.     (line 263)
* gdb.TYPE_CODE_ENUM:                    Types In Python.     (line 201)
* gdb.TYPE_CODE_ERROR:                   Types In Python.     (line 233)
* gdb.TYPE_CODE_FLAGS:                   Types In Python.     (line 204)
* gdb.TYPE_CODE_FLT:                     Types In Python.     (line 213)
* gdb.TYPE_CODE_FUNC:                    Types In Python.     (line 207)
* gdb.TYPE_CODE_INT:                     Types In Python.     (line 210)
* gdb.TYPE_CODE_INTERNAL_FUNCTION:       Types In Python.     (line 266)
* gdb.TYPE_CODE_MEMBERPTR:               Types In Python.     (line 242)
* gdb.TYPE_CODE_METHOD:                  Types In Python.     (line 236)
* gdb.TYPE_CODE_METHODPTR:               Types In Python.     (line 239)
* gdb.TYPE_CODE_NAMESPACE:               Types In Python.     (line 260)
* gdb.TYPE_CODE_PTR:                     Types In Python.     (line 189)
* gdb.TYPE_CODE_RANGE:                   Types In Python.     (line 222)
* gdb.TYPE_CODE_REF:                     Types In Python.     (line 245)
* gdb.TYPE_CODE_SET:                     Types In Python.     (line 219)
* gdb.TYPE_CODE_STRING:                  Types In Python.     (line 225)
* gdb.TYPE_CODE_STRUCT:                  Types In Python.     (line 195)
* gdb.TYPE_CODE_TYPEDEF:                 Types In Python.     (line 257)
* gdb.TYPE_CODE_UNION:                   Types In Python.     (line 198)
* gdb.TYPE_CODE_VOID:                    Types In Python.     (line 216)
* gdb.unwinder.register_unwinder:        Unwinding Frames in Python.
                                                              (line 122)
* gdb.UnwindInfo.add_saved_register:     Unwinding Frames in Python.
                                                              (line  72)
* gdb.WP_ACCESS:                         Breakpoints In Python.
                                                              (line  70)
* gdb.WP_READ:                           Breakpoints In Python.
                                                              (line  64)
* gdb.WP_WRITE:                          Breakpoints In Python.
                                                              (line  67)
* gdb.write:                             Basic Python.        (line 135)
* gdb.write <1>:                         Basic Python.        (line 135)
* gdb:error:                             Guile Exception Handling.
                                                              (line  69)
* gdb:invalid-object:                    Guile Exception Handling.
                                                              (line  72)
* gdb:memory-error:                      Guile Exception Handling.
                                                              (line  80)
* gdb:pp-type-error:                     Guile Exception Handling.
                                                              (line  84)
* gdbserver:                             Server.              (line   6)
* gdb_init_reader:                       Writing JIT Debug Info Readers.
                                                              (line  20)
* generate-core-file:                    Core File Generation.
                                                              (line  17)
* get-basic-type:                        Guile Types Module.  (line  13)
* getDebugChar:                          Bootstrapping.       (line  14)
* gnu_debuglink_crc32:                   Separate Debug Files.
                                                              (line 159)
* gr:                                    Guile Commands.      (line   8)
* gu:                                    Guile Commands.      (line  15)
* guile:                                 Guile Commands.      (line  15)
* guile-data-directory:                  Guile Configuration. (line  13)
* guile-repl:                            Guile Commands.      (line   8)
* h ('help'):                            Help.                (line   9)
* handle:                                Signals.             (line  49)
* handle_exception:                      Stub Contents.       (line  15)
* hbreak:                                Set Breaks.          (line  61)
* help:                                  Help.                (line   6)
* help function:                         Convenience Funs.    (line 138)
* help target:                           Target Commands.     (line  19)
* help user-defined:                     Define.              (line  66)
* history-append!:                       Basic Guile.         (line 105)
* history-preserve-point:                Readline Init File Syntax.
                                                              (line 124)
* history-ref:                           Basic Guile.         (line  87)
* 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)
* host-config:                           Guile Configuration. (line  20)
* i ('info'):                            Help.                (line 100)
* if:                                    Command Files.       (line  74)
* ignore:                                Conditions.          (line  90)
* inferior INFNO:                        Inferiors and Programs.
                                                              (line  48)
* Inferior.is_valid:                     Inferiors In Python. (line  35)
* Inferior.num:                          Inferiors In Python. (line  22)
* Inferior.pid:                          Inferiors In Python. (line  25)
* Inferior.read_memory:                  Inferiors In Python. (line  47)
* Inferior.read_memory <1>:              Inferiors In Python. (line  47)
* Inferior.search_memory:                Inferiors In Python. (line  61)
* Inferior.threads:                      Inferiors In Python. (line  42)
* Inferior.was_attached:                 Inferiors In Python. (line  29)
* Inferior.write_memory:                 Inferiors In Python. (line  54)
* Inferior.write_memory <1>:             Inferiors In Python. (line  54)
* InferiorCallPostEvent.address:         Events In Python.    (line 146)
* InferiorCallPostEvent.ptid:            Events In Python.    (line 143)
* InferiorCallPreEvent.address:          Events In Python.    (line 136)
* InferiorCallPreEvent.ptid:             Events In Python.    (line 133)
* InferiorThread.is_exited:              Threads In Python.   (line  59)
* InferiorThread.is_running:             Threads In Python.   (line  56)
* InferiorThread.is_stopped:             Threads In Python.   (line  53)
* InferiorThread.is_valid:               Threads In Python.   (line  42)
* InferiorThread.name:                   Threads In Python.   (line  19)
* InferiorThread.num:                    Threads In Python.   (line  29)
* InferiorThread.ptid:                   Threads In Python.   (line  32)
* InferiorThread.switch:                 Threads In Python.   (line  49)
* info:                                  Help.                (line 100)
* info address:                          Symbols.             (line  74)
* info all-registers:                    Registers.           (line  15)
* info args:                             Frame Info.          (line  44)
* info auto-load:                        Auto-loading.        (line  60)
* info auto-load gdb-scripts:            Auto-loading sequences.
                                                              (line  21)
* info auto-load guile-scripts:          Guile Auto-loading.  (line  23)
* info auto-load libthread-db:           libthread_db.so.1 file.
                                                              (line  29)
* info auto-load local-gdbinit:          Init File in the Current Directory.
                                                              (line  22)
* info auto-load python-scripts:         Python Auto-loading. (line  23)
* info auxv:                             OS Information.      (line  20)
* info breakpoints:                      Set Breaks.          (line 126)
* info checkpoints:                      Checkpoint/Restart.  (line  31)
* info classes:                          Symbols.             (line 323)
* info common:                           Special Fortran Commands.
                                                              (line   9)
* info copying:                          Help.                (line 138)
* info dcache:                           Caching Target Data. (line  46)
* info display:                          Auto Display.        (line  78)
* info dll:                              Files.               (line 324)
* info dos:                              DJGPP Native.        (line  15)
* info exceptions:                       Ada Exceptions.      (line   8)
* info extensions:                       Show.                (line  34)
* info f ('info frame'):                 Frame Info.          (line  17)
* info files:                            Files.               (line 197)
* info float:                            Floating Point Hardware.
                                                              (line   9)
* info frame:                            Frame Info.          (line  17)
* info frame, show the source language:  Show.                (line  15)
* info frame-filter:                     Frame Filter Management.
                                                              (line  12)
* info functions:                        Symbols.             (line 303)
* 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  48)
* info macro:                            Macros.              (line  47)
* info macros:                           Macros.              (line  54)
* info mem:                              Memory Region Attributes.
                                                              (line  45)
* info meminfo:                          SVR4 Process Information.
                                                              (line  93)
* info os:                               OS Information.      (line  37)
* info os cpus:                          OS Information.      (line  43)
* info os files:                         OS Information.      (line  51)
* info os modules:                       OS Information.      (line  57)
* info os msg:                           OS Information.      (line  64)
* info os processes:                     OS Information.      (line  75)
* info os procgroups:                    OS Information.      (line  84)
* info os semaphores:                    OS Information.      (line  94)
* info os shm:                           OS Information.      (line 102)
* info os sockets:                       OS Information.      (line 112)
* info os threads:                       OS Information.      (line 119)
* info pidlist:                          SVR4 Process Information.
                                                              (line  89)
* info pretty-printer:                   Pretty-Printer Commands.
                                                              (line   6)
* info probes:                           Static Probe Points. (line  32)
* info proc:                             SVR4 Process Information.
                                                              (line  19)
* info program:                          Stopping.            (line  18)
* info record:                           Process Record and Replay.
                                                              (line 260)
* info registers:                        Registers.           (line  11)
* info scope:                            Symbols.             (line 260)
* info selectors:                        Symbols.             (line 329)
* info serial:                           DJGPP Native.        (line 139)
* info set:                              Help.                (line 121)
* info share:                            Files.               (line 318)
* info sharedlibrary:                    Files.               (line 318)
* info signals:                          Signals.             (line  33)
* info skip:                             Skipping Over Functions and Files.
                                                              (line  56)
* info source:                           Symbols.             (line 281)
* info source, show the source language: Show.                (line  21)
* info sources:                          Symbols.             (line 297)
* info spu:                              SPU.                 (line  10)
* info stack:                            Backtrace.           (line  46)
* info static-tracepoint-markers:        Listing Static Tracepoint Markers.
                                                              (line   6)
* info symbol:                           Symbols.             (line  84)
* info target:                           Files.               (line 197)
* info task TASKNO:                      Ada Tasks.           (line  88)
* info tasks:                            Ada Tasks.           (line   9)
* info terminal:                         Input/Output.        (line  12)
* info threads:                          Threads.             (line  60)
* info tp [N...]:                        Listing Tracepoints. (line   6)
* info tracepoints [N...]:               Listing Tracepoints. (line   6)
* info tvariables:                       Trace State Variables.
                                                              (line  37)
* info type-printers:                    Symbols.             (line 248)
* info types:                            Symbols.             (line 234)
* info variables:                        Symbols.             (line 314)
* info vector:                           Vector Unit.         (line   9)
* info w32:                              Cygwin Native.       (line  19)
* info warranty:                         Help.                (line 142)
* info watchpoints [N...]:               Set Watchpoints.     (line  87)
* info win:                              TUI Commands.        (line  26)
* info-gdb-mi-command:                   GDB/MI Support Commands.
                                                              (line  99)
* init-if-undefined:                     Convenience Vars.    (line  42)
* input-meta:                            Readline Init File Syntax.
                                                              (line 142)
* input-port:                            I/O Ports in Guile.  (line   6)
* insert-comment (M-#):                  Miscellaneous Commands.
                                                              (line  60)
* insert-completions (M-*):              Commands For Completion.
                                                              (line  18)
* inspect:                               Data.                (line   6)
* instantiate on type_printer:           Type Printing API.   (line  22)
* interpreter-exec:                      Interpreters.        (line  42)
* interrupt:                             Background Execution.
                                                              (line  59)
* isearch-terminators:                   Readline Init File Syntax.
                                                              (line 149)
* iterator->list:                        Iterators In Guile.  (line  83)
* iterator-filter:                       Iterators In Guile.  (line  94)
* iterator-for-each:                     Iterators In Guile.  (line  90)
* iterator-map:                          Iterators In Guile.  (line  86)
* iterator-next!:                        Iterators In Guile.  (line  63)
* iterator-object:                       Iterators In Guile.  (line  53)
* iterator-progress:                     Iterators In Guile.  (line  57)
* iterator-until:                        Iterators In Guile.  (line  98)
* iterator?:                             Iterators In Guile.  (line  49)
* j ('jump'):                            Jumping.             (line  10)
* 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 102)
* 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)
* language-option:                       GDB/MI Support Commands.
                                                              (line  96)
* layout:                                TUI Commands.        (line  29)
* lazy-string->value:                    Lazy Strings In Guile.
                                                              (line  46)
* lazy-string-address:                   Lazy Strings In Guile.
                                                              (line  26)
* lazy-string-encoding:                  Lazy Strings In Guile.
                                                              (line  34)
* lazy-string-length:                    Lazy Strings In Guile.
                                                              (line  29)
* lazy-string-type:                      Lazy Strings In Guile.
                                                              (line  40)
* lazy-string?:                          Lazy Strings In Guile.
                                                              (line  22)
* LazyString.address:                    Lazy Strings In Python.
                                                              (line  26)
* LazyString.encoding:                   Lazy Strings In Python.
                                                              (line  36)
* LazyString.length:                     Lazy Strings In Python.
                                                              (line  30)
* LazyString.type:                       Lazy Strings In Python.
                                                              (line  43)
* LazyString.value:                      Lazy Strings In Python.
                                                              (line  20)
* Left:                                  TUI Keys.            (line  59)
* LineTable.has_line:                    Line Tables In Python.
                                                              (line  57)
* LineTable.line:                        Line Tables In Python.
                                                              (line  51)
* LineTable.source_lines:                Line Tables In Python.
                                                              (line  62)
* LineTableEntry.line:                   Line Tables In Python.
                                                              (line  16)
* LineTableEntry.pc:                     Line Tables In Python.
                                                              (line  21)
* list:                                  List.                (line   6)
* list, and Objective-C:                 Method Names in Commands.
                                                              (line   9)
* load FILENAME:                         Target Commands.     (line 114)
* lookup-block:                          Blocks In Guile.     (line 117)
* lookup-global-symbol:                  Symbols In Guile.    (line  99)
* lookup-symbol:                         Symbols In Guile.    (line  79)
* lookup-type:                           Types In Guile.      (line  15)
* loop_break:                            Command Files.       (line  93)
* loop_continue:                         Command Files.       (line  97)
* 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 ada set ignore-descriptive-types: Ada Glitches.       (line  73)
* maint ada show ignore-descriptive-types: Ada Glitches.      (line  77)
* maint agent:                           Maintenance Commands.
                                                              (line  11)
* maint agent-eval:                      Maintenance Commands.
                                                              (line  11)
* maint agent-printf:                    Maintenance Commands.
                                                              (line  26)
* maint btrace clear:                    Maintenance Commands.
                                                              (line 103)
* maint btrace clear-packet-history:     Maintenance Commands.
                                                              (line  98)
* maint btrace packet-history:           Maintenance Commands.
                                                              (line  69)
* maint check-psymtabs:                  Maintenance Commands.
                                                              (line 138)
* maint check-symtabs:                   Maintenance Commands.
                                                              (line 143)
* maint cplus first_component:           Maintenance Commands.
                                                              (line 158)
* maint cplus namespace:                 Maintenance Commands.
                                                              (line 161)
* maint demangler-warning:               Maintenance Commands.
                                                              (line 177)
* maint deprecate:                       Maintenance Commands.
                                                              (line 164)
* maint dump-me:                         Maintenance Commands.
                                                              (line 172)
* maint expand-symtabs:                  Maintenance Commands.
                                                              (line 146)
* maint flush-symbol-cache:              Symbols.             (line 453)
* maint info bfds:                       Maintenance Commands.
                                                              (line  62)
* maint info breakpoints:                Maintenance Commands.
                                                              (line  32)
* maint info btrace:                     Maintenance Commands.
                                                              (line  66)
* maint info program-spaces:             Inferiors and Programs.
                                                              (line 139)
* maint info psymtabs:                   Symbols.             (line 390)
* maint info sections:                   Files.               (line 206)
* maint info sol-threads:                Threads.             (line  92)
* maint info symtabs:                    Symbols.             (line 390)
* maint internal-error:                  Maintenance Commands.
                                                              (line 177)
* maint internal-warning:                Maintenance Commands.
                                                              (line 177)
* maint packet:                          Maintenance Commands.
                                                              (line 224)
* maint print architecture:              Maintenance Commands.
                                                              (line 230)
* maint print c-tdesc:                   Maintenance Commands.
                                                              (line 234)
* maint print cooked-registers:          Maintenance Commands.
                                                              (line 255)
* maint print dummy-frames:              Maintenance Commands.
                                                              (line 239)
* maint print msymbols:                  Symbols.             (line 372)
* maint print objfiles:                  Maintenance Commands.
                                                              (line 293)
* maint print psymbols:                  Symbols.             (line 372)
* maint print raw-registers:             Maintenance Commands.
                                                              (line 255)
* maint print reggroups:                 Maintenance Commands.
                                                              (line 274)
* maint print register-groups:           Maintenance Commands.
                                                              (line 255)
* maint print registers:                 Maintenance Commands.
                                                              (line 255)
* maint print remote-registers:          Maintenance Commands.
                                                              (line 255)
* maint print section-scripts:           Maintenance Commands.
                                                              (line 308)
* maint print statistics:                Maintenance Commands.
                                                              (line 315)
* maint print symbol-cache:              Symbols.             (line 445)
* maint print symbol-cache-statistics:   Symbols.             (line 449)
* maint print symbols:                   Symbols.             (line 372)
* maint print target-stack:              Maintenance Commands.
                                                              (line 328)
* maint print type:                      Maintenance Commands.
                                                              (line 340)
* maint print unwind, HPPA:              HPPA.                (line  17)
* maint print user-registers:            Maintenance Commands.
                                                              (line 299)
* maint set btrace pt skip-pad:          Maintenance Commands.
                                                              (line 111)
* maint set catch-demangler-crashes:     Maintenance Commands.
                                                              (line 150)
* maint set demangler-warning:           Maintenance Commands.
                                                              (line 201)
* maint set dwarf always-disassemble:    Maintenance Commands.
                                                              (line 347)
* maint set dwarf max-cache-age:         Maintenance Commands.
                                                              (line 368)
* maint set internal-error:              Maintenance Commands.
                                                              (line 201)
* maint set internal-warning:            Maintenance Commands.
                                                              (line 201)
* maint set per-command:                 Maintenance Commands.
                                                              (line 420)
* maint set profile:                     Maintenance Commands.
                                                              (line 382)
* maint set show-all-tib:                Maintenance Commands.
                                                              (line 406)
* maint set show-debug-regs:             Maintenance Commands.
                                                              (line 398)
* maint set symbol-cache-size:           Symbols.             (line 437)
* maint set target-async:                Maintenance Commands.
                                                              (line 412)
* maint show btrace pt skip-pad:         Maintenance Commands.
                                                              (line 112)
* maint show catch-demangler-crashes:    Maintenance Commands.
                                                              (line 150)
* maint show demangler-warning:          Maintenance Commands.
                                                              (line 201)
* maint show dwarf always-disassemble:   Maintenance Commands.
                                                              (line 347)
* maint show dwarf max-cache-age:        Maintenance Commands.
                                                              (line 368)
* maint show internal-error:             Maintenance Commands.
                                                              (line 201)
* maint show internal-warning:           Maintenance Commands.
                                                              (line 201)
* maint show per-command:                Maintenance Commands.
                                                              (line 420)
* maint show profile:                    Maintenance Commands.
                                                              (line 382)
* maint show show-all-tib:               Maintenance Commands.
                                                              (line 406)
* maint show show-debug-regs:            Maintenance Commands.
                                                              (line 398)
* maint show symbol-cache-size:          Symbols.             (line 442)
* maint show target-async:               Maintenance Commands.
                                                              (line 412)
* maint space:                           Maintenance Commands.
                                                              (line 459)
* maint time:                            Maintenance Commands.
                                                              (line 463)
* maint translate-address:               Maintenance Commands.
                                                              (line 467)
* maint undeprecate:                     Maintenance Commands.
                                                              (line 164)
* make:                                  Shell Commands.      (line  21)
* make-block-symbols-iterator:           Blocks In Guile.     (line 105)
* make-breakpoint:                       Breakpoints In Guile.
                                                              (line  19)
* make-enum-hashtable:                   Guile Types Module.  (line  37)
* make-exception:                        Guile Exception Handling.
                                                              (line  91)
* make-field-iterator:                   Types In Guile.      (line 125)
* make-iterator:                         Iterators In Guile.  (line  11)
* make-lazy-value:                       Values From Inferior In Guile.
                                                              (line 327)
* make-list-iterator:                    Iterators In Guile.  (line  80)
* make-pretty-printer:                   Guile Pretty Printing API.
                                                              (line  15)
* make-pretty-printer-worker:            Guile Pretty Printing API.
                                                              (line  42)
* make-value:                            Values From Inferior In Guile.
                                                              (line  45)
* 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)
* memory-port-range:                     Memory Ports in Guile.
                                                              (line  33)
* memory-port-read-buffer-size:          Memory Ports in Guile.
                                                              (line  37)
* memory-port-write-buffer-size:         Memory Ports in Guile.
                                                              (line  45)
* memory-port?:                          Memory Ports in Guile.
                                                              (line  29)
* MemoryChangedEvent.address:            Events In Python.    (line 156)
* MemoryChangedEvent.length:             Events In Python.    (line 159)
* 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)
* methods:                               Xmethod API.         (line  22)
* monitor:                               Connecting.          (line 109)
* n ('next'):                            Continuing and Stepping.
                                                              (line  77)
* n (SingleKey TUI key):                 TUI Single Key Mode. (line  19)
* name:                                  Xmethod API.         (line  15)
* name of type_printer:                  Type Printing API.   (line  18)
* newest-frame:                          Frames In Guile.     (line 160)
* NewObjFileEvent.new_objfile:           Events In Python.    (line 115)
* next:                                  Continuing and Stepping.
                                                              (line  77)
* next&:                                 Background Execution.
                                                              (line  34)
* next-history (C-n):                    Commands For History.
                                                              (line  16)
* nexti:                                 Continuing and Stepping.
                                                              (line 202)
* nexti&:                                Background Execution.
                                                              (line  37)
* ni ('nexti'):                          Continuing and Stepping.
                                                              (line 202)
* 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 336)
* Objfile:                               Objfiles In Python.  (line   6)
* objfile-filename:                      Objfiles In Guile.   (line  28)
* objfile-pretty-printers:               Objfiles In Guile.   (line  36)
* objfile-progspace:                     Objfiles In Guile.   (line  32)
* objfile-valid?:                        Objfiles In Guile.   (line  21)
* Objfile.add_separate_debug_file:       Objfiles In Python.  (line 125)
* Objfile.build_id:                      Objfiles In Python.  (line  67)
* Objfile.filename:                      Objfiles In Python.  (line  47)
* Objfile.frame_filters:                 Objfiles In Python.  (line  93)
* Objfile.is_valid:                      Objfiles In Python.  (line 118)
* Objfile.owner:                         Objfiles In Python.  (line  60)
* Objfile.pretty_printers:               Objfiles In Python.  (line  81)
* Objfile.progspace:                     Objfiles In Python.  (line  77)
* Objfile.type_printers:                 Objfiles In Python.  (line  89)
* Objfile.username:                      Objfiles In Python.  (line  54)
* objfile?:                              Objfiles In Guile.   (line  17)
* objfiles:                              Objfiles In Guile.   (line  52)
* observer:                              Observer Mode.       (line  22)
* open-memory:                           Memory Ports in Guile.
                                                              (line  11)
* output:                                Output.              (line  35)
* output-meta:                           Readline Init File Syntax.
                                                              (line 191)
* output-port:                           I/O Ports in Guile.  (line   9)
* 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)
* Parameter:                             Parameters In Python.
                                                              (line   6)
* Parameter <1>:                         Parameters In Guile. (line   6)
* parameter-value:                       Parameters In Guile. (line 103)
* Parameter.get_set_string:              Parameters In Python.
                                                              (line  73)
* Parameter.get_show_string:             Parameters In Python.
                                                              (line  79)
* Parameter.set_doc:                     Parameters In Python.
                                                              (line  53)
* Parameter.show_doc:                    Parameters In Python.
                                                              (line  59)
* Parameter.value:                       Parameters In Python.
                                                              (line  65)
* Parameter.__init__:                    Parameters In Python.
                                                              (line  18)
* parameter?:                            Parameters In Guile. (line  99)
* PARAM_AUTO_BOOLEAN:                    Parameters In Python.
                                                              (line  93)
* PARAM_AUTO_BOOLEAN <1>:                Parameters In Guile. (line 120)
* PARAM_BOOLEAN:                         Parameters In Python.
                                                              (line  89)
* PARAM_BOOLEAN <1>:                     Parameters In Guile. (line 116)
* PARAM_ENUM:                            Parameters In Python.
                                                              (line 127)
* PARAM_ENUM <1>:                        Parameters In Guile. (line 156)
* PARAM_FILENAME:                        Parameters In Python.
                                                              (line 119)
* PARAM_FILENAME <1>:                    Parameters In Guile. (line 152)
* PARAM_INTEGER:                         Parameters In Python.
                                                              (line 102)
* PARAM_OPTIONAL_FILENAME:               Parameters In Python.
                                                              (line 116)
* PARAM_OPTIONAL_FILENAME <1>:           Parameters In Guile. (line 149)
* PARAM_STRING:                          Parameters In Python.
                                                              (line 106)
* PARAM_STRING <1>:                      Parameters In Guile. (line 139)
* PARAM_STRING_NOESCAPE:                 Parameters In Python.
                                                              (line 112)
* PARAM_STRING_NOESCAPE <1>:             Parameters In Guile. (line 145)
* PARAM_UINTEGER:                        Parameters In Python.
                                                              (line  98)
* PARAM_UINTEGER <1>:                    Parameters In Guile. (line 125)
* PARAM_ZINTEGER:                        Parameters In Python.
                                                              (line 123)
* PARAM_ZINTEGER <1>:                    Parameters In Guile. (line 129)
* PARAM_ZUINTEGER:                       Parameters In Guile. (line 132)
* PARAM_ZUINTEGER_UNLIMITED:             Parameters In Guile. (line 135)
* parse-and-eval:                        Basic Guile.         (line 113)
* passcount:                             Tracepoint Passcounts.
                                                              (line   6)
* path:                                  Environment.         (line  14)
* pending-breakpoints:                   GDB/MI Support Commands.
                                                              (line  79)
* PendingFrame.create_unwind_info:       Unwinding Frames in Python.
                                                              (line  46)
* PendingFrame.read_register:            Unwinding Frames in Python.
                                                              (line  36)
* PgDn:                                  TUI Keys.            (line  50)
* PgUp:                                  TUI Keys.            (line  47)
* pi:                                    Python Commands.     (line   9)
* pmon, MIPS remote:                     MIPS Embedded.       (line 128)
* 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)
* prepend-pretty-printer!:               Guile Printing Module.
                                                              (line  13)
* pretty-printer-enabled?:               Guile Pretty Printing API.
                                                              (line  28)
* pretty-printer?:                       Guile Pretty Printing API.
                                                              (line  24)
* pretty-printers:                       Guile Pretty Printing API.
                                                              (line  35)
* pretty_printer.children:               Pretty Printing API. (line  11)
* pretty_printer.display_hint:           Pretty Printing API. (line  24)
* pretty_printer.to_string:              Pretty Printing API. (line  53)
* 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  85)
* proc-trace-exit:                       SVR4 Process Information.
                                                              (line  85)
* proc-untrace-entry:                    SVR4 Process Information.
                                                              (line  85)
* proc-untrace-exit:                     SVR4 Process Information.
                                                              (line  85)
* Progspace:                             Progspaces In Python.
                                                              (line   6)
* progspace-filename:                    Progspaces In Guile. (line  34)
* progspace-objfiles:                    Progspaces In Guile. (line  44)
* progspace-pretty-printers:             Progspaces In Guile. (line  52)
* progspace-valid?:                      Progspaces In Guile. (line  21)
* Progspace.filename:                    Progspaces In Python.
                                                              (line  24)
* Progspace.frame_filters:               Progspaces In Python.
                                                              (line  39)
* Progspace.pretty_printers:             Progspaces In Python.
                                                              (line  27)
* Progspace.type_printers:               Progspaces In Python.
                                                              (line  35)
* progspace?:                            Progspaces In Guile. (line  17)
* progspaces:                            Progspaces In Guile. (line  31)
* prompt annotation:                     Prompting.           (line  24)
* prompt-for-continue annotation:        Prompting.           (line  40)
* ptype:                                 Symbols.             (line 169)
* putDebugChar:                          Bootstrapping.       (line  20)
* pwd:                                   Working Directory.   (line  20)
* py:                                    Python Commands.     (line  23)
* python:                                GDB/MI Support Commands.
                                                              (line  82)
* python <1>:                            Python Commands.     (line  23)
* python-interactive:                    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)
* queue-signal:                          Signaling.           (line  36)
* quit annotation:                       Errors.              (line   6)
* quit [EXPRESSION]:                     Quitting GDB.        (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  90)
* rc ('reverse-continue'):               Reverse Execution.   (line  30)
* rdilogenable:                          ARM.                 (line  90)
* rdilogfile:                            ARM.                 (line  84)
* re-read-init-file (C-x C-r):           Miscellaneous Commands.
                                                              (line   6)
* readnow:                               Files.               (line  89)
* rec:                                   Process Record and Replay.
                                                              (line  38)
* rec btrace:                            Process Record and Replay.
                                                              (line  38)
* rec btrace bts:                        Process Record and Replay.
                                                              (line  38)
* rec btrace pt:                         Process Record and Replay.
                                                              (line  38)
* rec bts:                               Process Record and Replay.
                                                              (line  38)
* rec del:                               Process Record and Replay.
                                                              (line 294)
* rec full:                              Process Record and Replay.
                                                              (line  38)
* rec function-call-history:             Process Record and Replay.
                                                              (line 341)
* rec instruction-history:               Process Record and Replay.
                                                              (line 300)
* rec pt:                                Process Record and Replay.
                                                              (line  38)
* rec s:                                 Process Record and Replay.
                                                              (line  97)
* recognize on type_recognizer:          Type Printing API.   (line  42)
* record:                                Process Record and Replay.
                                                              (line  38)
* record btrace:                         Process Record and Replay.
                                                              (line  38)
* record btrace bts:                     Process Record and Replay.
                                                              (line  38)
* record btrace pt:                      Process Record and Replay.
                                                              (line  38)
* record bts:                            Process Record and Replay.
                                                              (line  38)
* record delete:                         Process Record and Replay.
                                                              (line 294)
* record full:                           Process Record and Replay.
                                                              (line  38)
* record function-call-history:          Process Record and Replay.
                                                              (line 341)
* record goto:                           Process Record and Replay.
                                                              (line 120)
* record instruction-history:            Process Record and Replay.
                                                              (line 300)
* record pt:                             Process Record and Replay.
                                                              (line  38)
* record restore:                        Process Record and Replay.
                                                              (line 141)
* record save:                           Process Record and Replay.
                                                              (line 134)
* record stop:                           Process Record and Replay.
                                                              (line  97)
* redraw-current-line ():                Commands For Moving. (line  30)
* refresh:                               TUI Commands.        (line  66)
* register-breakpoint!:                  Breakpoints In Guile.
                                                              (line  87)
* register-command!:                     Commands In Guile.   (line  58)
* register-parameter!:                   Parameters In Guile. (line  94)
* RegisterChangedEvent.frame:            Events In Python.    (line 166)
* RegisterChangedEvent.regnum:           Events In Python.    (line 169)
* register_xmethod_matcher:              Xmethod API.         (line  82)
* 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)
* remove-symbol-file:                    Files.               (line 160)
* restart CHECKPOINT-ID:                 Checkpoint/Restart.  (line  41)
* restore:                               Dump/Restore Files.  (line  40)
* 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  21)
* rwatch:                                Set Watchpoints.     (line  79)
* s (SingleKey TUI key):                 TUI Single Key Mode. (line  28)
* s ('step'):                            Continuing and Stepping.
                                                              (line  45)
* sal-last:                              Symbol Tables In Guile.
                                                              (line  68)
* sal-line:                              Symbol Tables In Guile.
                                                              (line  62)
* sal-pc:                                Symbol Tables In Guile.
                                                              (line  65)
* sal-symtab:                            Symbol Tables In Guile.
                                                              (line  59)
* sal-valid?:                            Symbol Tables In Guile.
                                                              (line  53)
* sal?:                                  Symbol Tables In Guile.
                                                              (line  49)
* 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  93)
* search:                                Search.              (line   9)
* section:                               Files.               (line 189)
* select-frame:                          Frames.              (line  51)
* selected-frame:                        Frames In Guile.     (line 156)
* self:                                  Commands In Guile.   (line 100)
* self-insert (a, b, A, 1, !, ...):      Commands For Text.   (line  27)
* set:                                   Help.                (line 109)
* set ada trust-PAD-over-XVS:            Ada Glitches.        (line  42)
* set agent off:                         In-Process Agent.    (line  47)
* set agent on:                          In-Process Agent.    (line  38)
* set annotate:                          Annotations Overview.
                                                              (line  29)
* set architecture:                      Targets.             (line  21)
* set args:                              Arguments.           (line  21)
* set arm:                               ARM.                 (line  17)
* set auto-connect-native-target:        Starting.            (line 157)
* set auto-load gdb-scripts:             Auto-loading sequences.
                                                              (line  13)
* set auto-load guile-scripts:           Guile Auto-loading.  (line  17)
* set auto-load libthread-db:            libthread_db.so.1 file.
                                                              (line  21)
* set auto-load local-gdbinit:           Init File in the Current Directory.
                                                              (line  14)
* set auto-load off:                     Auto-loading.        (line  32)
* set auto-load python-scripts:          Python Auto-loading. (line  17)
* set auto-load safe-path:               Auto-loading safe path.
                                                              (line  32)
* set auto-load scripts-directory:       objfile-gdbdotext file.
                                                              (line  37)
* set auto-solib-add:                    Files.               (line 295)
* set backtrace:                         Backtrace.           (line 116)
* set basenames-may-differ:              Files.               (line 524)
* set board-address:                     M32R/D.              (line  21)
* set breakpoint always-inserted:        Set Breaks.          (line 318)
* set breakpoint auto-hw:                Set Breaks.          (line 298)
* set breakpoint condition-evaluation:   Set Breaks.          (line 339)
* set breakpoint pending:                Set Breaks.          (line 267)
* 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  35)
* set circular-trace-buffer:             Starting and Stopping Trace Experiments.
                                                              (line  93)
* set code-cache:                        Caching Target Data. (line  36)
* set coerce-float-to-double:            ABI.                 (line  45)
* set com1base:                          DJGPP Native.        (line 122)
* set com1irq:                           DJGPP Native.        (line 122)
* set com2base:                          DJGPP Native.        (line 122)
* set com2irq:                           DJGPP Native.        (line 122)
* set com3base:                          DJGPP Native.        (line 122)
* set com3irq:                           DJGPP Native.        (line 122)
* set com4base:                          DJGPP Native.        (line 122)
* set com4irq:                           DJGPP Native.        (line 122)
* set complaints:                        Messages/Warnings.   (line  29)
* set confirm:                           Messages/Warnings.   (line  49)
* set cp-abi:                            ABI.                 (line  57)
* set cygwin-exceptions:                 Cygwin Native.       (line  35)
* set data-directory:                    Data Files.          (line  12)
* set dcache line-size:                  Caching Target Data. (line  60)
* set dcache size:                       Caching Target Data. (line  57)
* set debug:                             Debugging Output.    (line  17)
* set debug aarch64:                     AArch64.             (line  10)
* set debug auto-load:                   Auto-loading verbose mode.
                                                              (line  27)
* set debug darwin:                      Darwin.              (line   9)
* set debug entry-values:                Tail Call Frames.    (line  47)
* set debug hppa:                        HPPA.                (line  10)
* set debug libthread-db:                Threads.             (line 211)
* set debug mach-o:                      Darwin.              (line  16)
* set debug mips:                        MIPS.                (line 100)
* set debug monitor:                     Target Commands.     (line 107)
* set debug nios2:                       Nios II.             (line  10)
* set debug-file-directory:              Separate Debug Files.
                                                              (line  67)
* set debugevents:                       Cygwin Native.       (line  64)
* set debugexceptions:                   Cygwin Native.       (line  75)
* set debugexec:                         Cygwin Native.       (line  71)
* set debugmemory:                       Cygwin Native.       (line  79)
* set default-collect:                   Tracepoint Actions.  (line 134)
* set demangle-style:                    Print Settings.      (line 427)
* set detach-on-fork:                    Forks.               (line  57)
* set directories:                       Source Path.         (line 118)
* set disable-randomization:             Starting.            (line 201)
* set disassemble-next-line:             Machine Code.        (line 143)
* set disassembly-flavor:                Machine Code.        (line 131)
* set disconnected-dprintf:              Dynamic Printf.      (line  83)
* set disconnected-tracing:              Starting and Stopping Trace Experiments.
                                                              (line  55)
* set displaced-stepping:                Maintenance Commands.
                                                              (line 116)
* 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  39)
* set exec-direction:                    Reverse Execution.   (line  83)
* set exec-done-display:                 Debugging Output.    (line  11)
* set exec-wrapper:                      Starting.            (line 109)
* set extended-prompt:                   Prompt.              (line  25)
* set extension-language:                Show.                (line  30)
* set follow-exec-mode:                  Forks.               (line 104)
* set follow-fork-mode:                  Forks.               (line  38)
* set frame-filter priority:             Frame Filter Management.
                                                              (line  84)
* set gnutarget:                         Target Commands.     (line  28)
* set guile print-stack:                 Guile Exception Handling.
                                                              (line   6)
* set hash, for remote monitors:         Target Commands.     (line  98)
* set height:                            Screen Size.         (line  20)
* set history expansion:                 Command History.     (line  82)
* set history filename:                  Command History.     (line  26)
* set history remove-duplicates:         Command History.     (line  54)
* 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 173)
* set listsize:                          List.                (line  33)
* set logging:                           Logging Output.      (line   9)
* set mach-exceptions:                   Darwin.              (line  27)
* set max-completions:                   Completion.          (line  69)
* set max-user-call-depth:               Define.              (line  78)
* set mem inaccessible-by-default:       Memory Region Attributes.
                                                              (line 123)
* set mips abi:                          MIPS.                (line  32)
* set mips compression:                  MIPS.                (line  49)
* set mips mask-address:                 MIPS.                (line  80)
* set mipsfpu:                           MIPS Embedded.       (line  58)
* set monitor-prompt, MIPS remote:       MIPS Embedded.       (line 105)
* set monitor-warnings, MIPS remote:     MIPS Embedded.       (line 119)
* set mpx bound:                         i386.                (line  60)
* set multiple-symbols:                  Ambiguous Expressions.
                                                              (line  50)
* set new-console:                       Cygwin Native.       (line  47)
* set new-group:                         Cygwin Native.       (line  56)
* set non-stop:                          Non-Stop Mode.       (line  35)
* set opaque-type-resolution:            Symbols.             (line 335)
* set osabi:                             ABI.                 (line  11)
* set output-radix:                      Numbers.             (line  30)
* set overload-resolution:               Debugging C Plus Plus.
                                                              (line  59)
* set pagination:                        Screen Size.         (line  39)
* set powerpc:                           PowerPC Embedded.    (line  51)
* set print:                             Print Settings.      (line  11)
* set print entry-values:                Print Settings.      (line 206)
* set print frame-arguments:             Print Settings.      (line 154)
* set print inferior-events:             Inferiors and Programs.
                                                              (line 117)
* set print symbol-loading:              Symbols.             (line 353)
* set print thread-events:               Threads.             (line 152)
* set print type methods:                Symbols.             (line  44)
* set print type typedefs:               Symbols.             (line  57)
* set processor:                         Targets.             (line  31)
* set procfs-file:                       SVR4 Process Information.
                                                              (line  74)
* set procfs-trace:                      SVR4 Process Information.
                                                              (line  68)
* set prompt:                            Prompt.              (line  16)
* set python print-stack:                Python Commands.     (line  46)
* set radix:                             Numbers.             (line  43)
* set range-stepping:                    Continuing and Stepping.
                                                              (line 221)
* set ravenscar task-switching off:      Ravenscar Profile.   (line  14)
* set ravenscar task-switching on:       Ravenscar Profile.   (line  10)
* set rdiheartbeat:                      ARM.                 (line 107)
* set rdiromatzero:                      ARM.                 (line  97)
* set record:                            Process Record and Replay.
                                                              (line 331)
* set record btrace:                     Process Record and Replay.
                                                              (line 195)
* set record btrace bts:                 Process Record and Replay.
                                                              (line 214)
* set record btrace pt:                  Process Record and Replay.
                                                              (line 237)
* set record full:                       Process Record and Replay.
                                                              (line 145)
* set remote:                            Remote Configuration.
                                                              (line   6)
* set remote system-call-allowed:        system.              (line  37)
* set remote-mips64-transfers-32bit-regs: MIPS.               (line  90)
* set remotecache:                       Caching Target Data. (line  20)
* set remoteflow:                        Remote Configuration.
                                                              (line  48)
* set retransmit-timeout:                MIPS Embedded.       (line  81)
* set schedule-multiple:                 All-Stop Mode.       (line  65)
* set script-extension:                  Extending GDB.       (line  29)
* set sdstimeout:                        PowerPC Embedded.    (line  86)
* set server-address:                    M32R/D.              (line  27)
* set sh calling-convention:             Super-H.             (line   9)
* set shell:                             Cygwin Native.       (line  83)
* 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 450)
* set spu:                               SPU.                 (line  38)
* set stack-cache:                       Caching Target Data. (line  28)
* set startup-with-shell:                Starting.            (line 134)
* set step-mode:                         Continuing and Stepping.
                                                              (line  91)
* set stop-on-solib-events:              Files.               (line 351)
* set stopped, Hurd command:             Hurd Native.         (line  31)
* set struct-convention:                 i386.                (line   7)
* set substitute-path:                   Source Path.         (line 125)
* set syn-garbage-limit, MIPS remote:    MIPS Embedded.       (line  96)
* set sysroot:                           Files.               (line 374)
* set target-charset:                    Character Sets.      (line  28)
* set target-file-system-kind (unix|dos-based|auto): Files.   (line 464)
* set target-wide-charset:               Character Sets.      (line  61)
* set task, Hurd commands:               Hurd Native.         (line  48)
* set tcp:                               Remote Configuration.
                                                              (line 123)
* set thread, Hurd command:              Hurd Native.         (line  90)
* set timeout:                           MIPS Embedded.       (line  81)
* set trace-buffer-size:                 Starting and Stopping Trace Experiments.
                                                              (line 107)
* set trace-commands:                    Messages/Warnings.   (line  65)
* set trace-notes:                       Starting and Stopping Trace Experiments.
                                                              (line 126)
* set trace-stop-notes:                  Starting and Stopping Trace Experiments.
                                                              (line 132)
* set trace-user:                        Starting and Stopping Trace Experiments.
                                                              (line 122)
* set trust-readonly-sections:           Files.               (line 251)
* 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  47)
* set unwindonsignal:                    Calling.             (line  36)
* set use-coredump-filter:               Core File Generation.
                                                              (line  31)
* set variable:                          Assignment.          (line  16)
* set verbose:                           Messages/Warnings.   (line  15)
* set watchdog:                          Maintenance Commands.
                                                              (line 484)
* set width:                             Screen Size.         (line  20)
* set write:                             Patching.            (line  15)
* set-breakpoint-condition!:             Breakpoints In Guile.
                                                              (line 197)
* set-breakpoint-enabled!:               Breakpoints In Guile.
                                                              (line 147)
* set-breakpoint-hit-count!:             Breakpoints In Guile.
                                                              (line 172)
* set-breakpoint-ignore-count!:          Breakpoints In Guile.
                                                              (line 166)
* set-breakpoint-silent!:                Breakpoints In Guile.
                                                              (line 158)
* set-breakpoint-stop!:                  Breakpoints In Guile.
                                                              (line 205)
* set-breakpoint-task!:                  Breakpoints In Guile.
                                                              (line 189)
* set-breakpoint-thread!:                Breakpoints In Guile.
                                                              (line 180)
* set-iterator-progress!:                Iterators In Guile.  (line  60)
* set-mark (C-@):                        Miscellaneous Commands.
                                                              (line  32)
* set-memory-port-read-buffer-size!:     Memory Ports in Guile.
                                                              (line  41)
* set-memory-port-write-buffer-size!:    Memory Ports in Guile.
                                                              (line  49)
* set-objfile-pretty-printers!:          Objfiles In Guile.   (line  40)
* set-parameter-value!:                  Parameters In Guile. (line 107)
* set-pretty-printer-enabled!:           Guile Pretty Printing API.
                                                              (line  31)
* set-pretty-printers!:                  Guile Pretty Printing API.
                                                              (line  38)
* set-progspace-pretty-printers!:        Progspaces In Guile. (line  57)
* set_debug_traps:                       Stub Contents.       (line  10)
* share:                                 Files.               (line 327)
* sharedlibrary:                         Files.               (line 327)
* shell:                                 Shell Commands.      (line  10)
* show:                                  Help.                (line 114)
* show ada trust-PAD-over-XVS:           Ada Glitches.        (line  42)
* show agent:                            In-Process Agent.    (line  51)
* show annotate:                         Annotations Overview.
                                                              (line  34)
* show architecture:                     Targets.             (line  21)
* show args:                             Arguments.           (line  28)
* show arm:                              ARM.                 (line  21)
* show auto-load:                        Auto-loading.        (line  45)
* show auto-load gdb-scripts:            Auto-loading sequences.
                                                              (line  17)
* show auto-load guile-scripts:          Guile Auto-loading.  (line  20)
* show auto-load libthread-db:           libthread_db.so.1 file.
                                                              (line  25)
* show auto-load local-gdbinit:          Init File in the Current Directory.
                                                              (line  18)
* show auto-load python-scripts:         Python Auto-loading. (line  20)
* show auto-load safe-path:              Auto-loading safe path.
                                                              (line  46)
* show auto-load scripts-directory:      objfile-gdbdotext file.
                                                              (line  61)
* show auto-solib-add:                   Files.               (line 312)
* show backtrace:                        Backtrace.           (line 123)
* show basenames-may-differ:             Files.               (line 527)
* show board-address:                    M32R/D.              (line  24)
* show breakpoint always-inserted:       Set Breaks.          (line 318)
* show breakpoint auto-hw:               Set Breaks.          (line 298)
* show breakpoint condition-evaluation:  Set Breaks.          (line 339)
* show breakpoint pending:               Set Breaks.          (line 267)
* 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  35)
* show circular-trace-buffer:            Starting and Stopping Trace Experiments.
                                                              (line 100)
* show code-cache:                       Caching Target Data. (line  42)
* show coerce-float-to-double:           ABI.                 (line  54)
* show com1base:                         DJGPP Native.        (line 134)
* show com1irq:                          DJGPP Native.        (line 134)
* show com2base:                         DJGPP Native.        (line 134)
* show com2irq:                          DJGPP Native.        (line 134)
* show com3base:                         DJGPP Native.        (line 134)
* show com3irq:                          DJGPP Native.        (line 134)
* show com4base:                         DJGPP Native.        (line 134)
* show com4irq:                          DJGPP Native.        (line 134)
* show commands:                         Command History.     (line  95)
* show complaints:                       Messages/Warnings.   (line  35)
* show configuration:                    Help.                (line 147)
* show confirm:                          Messages/Warnings.   (line  57)
* show convenience:                      Convenience Vars.    (line  37)
* show copying:                          Help.                (line 138)
* show cp-abi:                           ABI.                 (line  57)
* show cygwin-exceptions:                Cygwin Native.       (line  43)
* show data-directory:                   Data Files.          (line  16)
* show dcache line-size:                 Caching Target Data. (line  68)
* show dcache size:                      Caching Target Data. (line  64)
* show debug:                            Debugging Output.    (line  20)
* show debug auto-load:                  Auto-loading verbose mode.
                                                              (line  30)
* show debug darwin:                     Darwin.              (line  13)
* show debug entry-values:               Tail Call Frames.    (line  55)
* show debug libthread-db:               Threads.             (line 211)
* show debug mach-o:                     Darwin.              (line  23)
* show debug mips:                       MIPS.                (line 104)
* show debug monitor:                    Target Commands.     (line 111)
* show debug nios2:                      Nios II.             (line  14)
* show debug-file-directory:             Separate Debug Files.
                                                              (line  72)
* show default-collect:                  Tracepoint Actions.  (line 142)
* show detach-on-fork:                   Forks.               (line  72)
* show directories:                      Source Path.         (line 122)
* show disassemble-next-line:            Machine Code.        (line 143)
* show disassembly-flavor:               Machine Code.        (line 140)
* show disconnected-dprintf:             Dynamic Printf.      (line  88)
* show disconnected-tracing:             Starting and Stopping Trace Experiments.
                                                              (line  62)
* show displaced-stepping:               Maintenance Commands.
                                                              (line 116)
* show download-path:                    M32R/D.              (line  18)
* show editing:                          Editing.             (line  22)
* show environment:                      Environment.         (line  33)
* show exceptions, Hurd command:         Hurd Native.         (line  45)
* show exec-done-display:                Debugging Output.    (line  14)
* show extended-prompt:                  Prompt.              (line  39)
* show follow-fork-mode:                 Forks.               (line  51)
* show frame-filter priority:            Frame Filter Management.
                                                              (line  91)
* show gnutarget:                        Target Commands.     (line  40)
* show hash, for remote monitors:        Target Commands.     (line 104)
* show height:                           Screen Size.         (line  20)
* show history:                          Command History.     (line  87)
* show host-charset:                     Character Sets.      (line  55)
* show inferior-tty:                     Input/Output.        (line  52)
* show input-radix:                      Numbers.             (line  35)
* show interactive-mode:                 Other Misc Settings. (line  20)
* show language:                         Show.                (line  10)
* show libthread-db-search-path:         Threads.             (line 208)
* show listsize:                         List.                (line  39)
* show logging:                          Logging Output.      (line  22)
* show mach-exceptions:                  Darwin.              (line  34)
* show max-completions:                  Completion.          (line  77)
* show max-user-call-depth:              Define.              (line  78)
* show mem inaccessible-by-default:      Memory Region Attributes.
                                                              (line 129)
* show mips abi:                         MIPS.                (line  46)
* show mips compression:                 MIPS.                (line  72)
* show mips mask-address:                MIPS.                (line  86)
* show mipsfpu:                          MIPS Embedded.       (line  58)
* show monitor-prompt, MIPS remote:      MIPS Embedded.       (line 115)
* show monitor-warnings, MIPS remote:    MIPS Embedded.       (line 125)
* show mpx bound:                        i386.                (line  57)
* show multiple-symbols:                 Ambiguous Expressions.
                                                              (line  70)
* show new-console:                      Cygwin Native.       (line  52)
* show new-group:                        Cygwin Native.       (line  61)
* show non-stop:                         Non-Stop Mode.       (line  38)
* show opaque-type-resolution:           Symbols.             (line 350)
* show osabi:                            ABI.                 (line  11)
* show output-radix:                     Numbers.             (line  38)
* show overload-resolution:              Debugging C Plus Plus.
                                                              (line  76)
* show pagination:                       Screen Size.         (line  45)
* show paths:                            Environment.         (line  29)
* show print:                            Print Settings.      (line  39)
* show print inferior-events:            Inferiors and Programs.
                                                              (line 125)
* show print symbol-loading:             Symbols.             (line 368)
* show print thread-events:              Threads.             (line 162)
* show print type methods:               Symbols.             (line  53)
* show print type typedefs:              Symbols.             (line  70)
* show processor:                        Targets.             (line  31)
* show procfs-file:                      SVR4 Process Information.
                                                              (line  79)
* show procfs-trace:                     SVR4 Process Information.
                                                              (line  71)
* show prompt:                           Prompt.              (line  19)
* show radix:                            Numbers.             (line  43)
* show range-stepping:                   Continuing and Stepping.
                                                              (line 221)
* show ravenscar task-switching:         Ravenscar Profile.   (line  22)
* show rdiheartbeat:                     ARM.                 (line 112)
* show rdiromatzero:                     ARM.                 (line 104)
* show record:                           Process Record and Replay.
                                                              (line 337)
* show record btrace:                    Process Record and Replay.
                                                              (line 211)
* show record full:                      Process Record and Replay.
                                                              (line 163)
* show remote:                           Remote Configuration.
                                                              (line   6)
* show remote system-call-allowed:       system.              (line  41)
* show remote-mips64-transfers-32bit-regs: MIPS.              (line  96)
* show remotecache:                      Caching Target Data. (line  25)
* show remoteflow:                       Remote Configuration.
                                                              (line  52)
* show retransmit-timeout:               MIPS Embedded.       (line  81)
* show script-extension:                 Extending GDB.       (line  29)
* show sdstimeout:                       PowerPC Embedded.    (line  90)
* show server-address:                   M32R/D.              (line  31)
* show sh calling-convention:            Super-H.             (line  22)
* show shell:                            Cygwin Native.       (line  87)
* show signal-thread:                    Hurd Native.         (line  27)
* show signals, Hurd command:            Hurd Native.         (line  17)
* show sigs, Hurd command:               Hurd Native.         (line  17)
* show sigthread:                        Hurd Native.         (line  27)
* show solib-search-path:                Files.               (line 461)
* show spu:                              SPU.                 (line  43)
* show stack-cache:                      Caching Target Data. (line  33)
* show stop-on-solib-events:             Files.               (line 357)
* show stopped, Hurd command:            Hurd Native.         (line  36)
* show struct-convention:                i386.                (line  15)
* show substitute-path:                  Source Path.         (line 162)
* show syn-garbage-limit, MIPS remote:   MIPS Embedded.       (line 101)
* show sysroot:                          Files.               (line 447)
* show target-charset:                   Character Sets.      (line  58)
* show target-file-system-kind:          Files.               (line 464)
* show target-wide-charset:              Character Sets.      (line  67)
* show task, Hurd commands:              Hurd Native.         (line  56)
* show tcp:                              Remote Configuration.
                                                              (line 123)
* show thread, Hurd command:             Hurd Native.         (line 100)
* show timeout:                          MIPS Embedded.       (line  81)
* show trace-buffer-size:                Starting and Stopping Trace Experiments.
                                                              (line 114)
* show trace-notes:                      Starting and Stopping Trace Experiments.
                                                              (line 129)
* show trace-stop-notes:                 Starting and Stopping Trace Experiments.
                                                              (line 137)
* show trace-user:                       Starting and Stopping Trace Experiments.
                                                              (line 124)
* show unwind-on-terminating-exception:  Calling.             (line  55)
* show unwindonsignal:                   Calling.             (line  43)
* show user:                             Define.              (line  71)
* show values:                           Value History.       (line  47)
* show verbose:                          Messages/Warnings.   (line  21)
* show version:                          Help.                (line 128)
* show warranty:                         Help.                (line 142)
* show width:                            Screen Size.         (line  20)
* 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 189)
* 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  91)
* 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  82)
* skip disable:                          Skipping Over Functions and Files.
                                                              (line  90)
* skip enable:                           Skipping Over Functions and Files.
                                                              (line  86)
* 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)
* start:                                 Starting.            (line  77)
* start-kbd-macro (C-x ():               Keyboard Macros.     (line   6)
* starting annotation:                   Annotations for Running.
                                                              (line   6)
* STDERR:                                Basic Python.        (line 143)
* STDERR <1>:                            Basic Python.        (line 163)
* stdio-port?:                           I/O Ports in Guile.  (line  15)
* STDLOG:                                Basic Python.        (line 146)
* STDLOG <1>:                            Basic Python.        (line 166)
* STDOUT:                                Basic Python.        (line 140)
* STDOUT <1>:                            Basic Python.        (line 160)
* step:                                  Continuing and Stepping.
                                                              (line  45)
* step&:                                 Background Execution.
                                                              (line  28)
* stepi:                                 Continuing and Stepping.
                                                              (line 189)
* stepi&:                                Background Execution.
                                                              (line  31)
* stop, a pseudo-command:                Hooks.               (line  21)
* stopping annotation:                   Annotations for Running.
                                                              (line   6)
* strace:                                Create and Delete Tracepoints.
                                                              (line  76)
* string->argv:                          Commands In Guile.   (line  73)
* symbol-addr-class:                     Symbols In Guile.    (line  48)
* symbol-argument?:                      Symbols In Guile.    (line  58)
* symbol-constant?:                      Symbols In Guile.    (line  62)
* symbol-file:                           Files.               (line  45)
* symbol-function?:                      Symbols In Guile.    (line  65)
* symbol-line:                           Symbols In Guile.    (line  32)
* symbol-linkage-name:                   Symbols In Guile.    (line  39)
* symbol-name:                           Symbols In Guile.    (line  36)
* symbol-needs-frame?:                   Symbols In Guile.    (line  53)
* symbol-print-name:                     Symbols In Guile.    (line  43)
* symbol-symtab:                         Symbols In Guile.    (line  28)
* symbol-type:                           Symbols In Guile.    (line  24)
* symbol-valid?:                         Symbols In Guile.    (line  17)
* symbol-value:                          Symbols In Guile.    (line  72)
* symbol-variable?:                      Symbols In Guile.    (line  69)
* Symbol.addr_class:                     Symbols In Python.   (line  74)
* Symbol.is_argument:                    Symbols In Python.   (line  84)
* Symbol.is_constant:                    Symbols In Python.   (line  87)
* Symbol.is_function:                    Symbols In Python.   (line  90)
* Symbol.is_valid:                       Symbols In Python.   (line  98)
* Symbol.is_variable:                    Symbols In Python.   (line  93)
* Symbol.line:                           Symbols In Python.   (line  57)
* Symbol.linkage_name:                   Symbols In Python.   (line  65)
* Symbol.name:                           Symbols In Python.   (line  61)
* Symbol.needs_frame:                    Symbols In Python.   (line  79)
* Symbol.print_name:                     Symbols In Python.   (line  69)
* Symbol.symtab:                         Symbols In Python.   (line  52)
* Symbol.type:                           Symbols In Python.   (line  47)
* Symbol.value:                          Symbols In Python.   (line 105)
* symbol?:                               Symbols In Guile.    (line  13)
* SYMBOL_FUNCTIONS_DOMAIN:               Symbols In Python.   (line 134)
* SYMBOL_FUNCTION_DOMAIN:                Symbols In Guile.    (line 133)
* SYMBOL_LABEL_DOMAIN:                   Symbols In Python.   (line 127)
* SYMBOL_LABEL_DOMAIN <1>:               Symbols In Guile.    (line 126)
* SYMBOL_LOC_ARG:                        Symbols In Python.   (line 156)
* SYMBOL_LOC_ARG <1>:                    Symbols In Guile.    (line 155)
* SYMBOL_LOC_BLOCK:                      Symbols In Python.   (line 177)
* SYMBOL_LOC_BLOCK <1>:                  Symbols In Guile.    (line 176)
* SYMBOL_LOC_COMPUTED:                   Symbols In Python.   (line 191)
* SYMBOL_LOC_COMPUTED <1>:               Symbols In Guile.    (line 190)
* SYMBOL_LOC_CONST:                      Symbols In Python.   (line 147)
* SYMBOL_LOC_CONST <1>:                  Symbols In Guile.    (line 146)
* SYMBOL_LOC_CONST_BYTES:                Symbols In Python.   (line 180)
* SYMBOL_LOC_CONST_BYTES <1>:            Symbols In Guile.    (line 179)
* SYMBOL_LOC_LOCAL:                      Symbols In Python.   (line 170)
* SYMBOL_LOC_LOCAL <1>:                  Symbols In Guile.    (line 169)
* SYMBOL_LOC_OPTIMIZED_OUT:              Symbols In Python.   (line 188)
* SYMBOL_LOC_OPTIMIZED_OUT <1>:          Symbols In Guile.    (line 187)
* SYMBOL_LOC_REF_ARG:                    Symbols In Python.   (line 160)
* SYMBOL_LOC_REF_ARG <1>:                Symbols In Guile.    (line 159)
* SYMBOL_LOC_REGISTER:                   Symbols In Python.   (line 153)
* SYMBOL_LOC_REGISTER <1>:               Symbols In Guile.    (line 152)
* SYMBOL_LOC_REGPARM_ADDR:               Symbols In Python.   (line 165)
* SYMBOL_LOC_REGPARM_ADDR <1>:           Symbols In Guile.    (line 164)
* SYMBOL_LOC_STATIC:                     Symbols In Python.   (line 150)
* SYMBOL_LOC_STATIC <1>:                 Symbols In Guile.    (line 149)
* SYMBOL_LOC_TYPEDEF:                    Symbols In Python.   (line 173)
* SYMBOL_LOC_TYPEDEF <1>:                Symbols In Guile.    (line 172)
* SYMBOL_LOC_UNDEF:                      Symbols In Python.   (line 143)
* SYMBOL_LOC_UNDEF <1>:                  Symbols In Guile.    (line 142)
* SYMBOL_LOC_UNRESOLVED:                 Symbols In Python.   (line 183)
* SYMBOL_LOC_UNRESOLVED <1>:             Symbols In Guile.    (line 182)
* SYMBOL_STRUCT_DOMAIN:                  Symbols In Python.   (line 124)
* SYMBOL_STRUCT_DOMAIN <1>:              Symbols In Guile.    (line 123)
* SYMBOL_TYPES_DOMAIN:                   Symbols In Python.   (line 137)
* SYMBOL_TYPES_DOMAIN <1>:               Symbols In Guile.    (line 136)
* SYMBOL_UNDEF_DOMAIN:                   Symbols In Python.   (line 115)
* SYMBOL_UNDEF_DOMAIN <1>:               Symbols In Guile.    (line 114)
* SYMBOL_VARIABLES_DOMAIN:               Symbols In Python.   (line 130)
* SYMBOL_VARIABLES_DOMAIN <1>:           Symbols In Guile.    (line 129)
* SYMBOL_VAR_DOMAIN:                     Symbols In Python.   (line 120)
* SYMBOL_VAR_DOMAIN <1>:                 Symbols In Guile.    (line 119)
* symtab-filename:                       Symbol Tables In Guile.
                                                              (line  28)
* symtab-fullname:                       Symbol Tables In Guile.
                                                              (line  31)
* symtab-global-block:                   Symbol Tables In Guile.
                                                              (line  38)
* symtab-objfile:                        Symbol Tables In Guile.
                                                              (line  34)
* symtab-static-block:                   Symbol Tables In Guile.
                                                              (line  42)
* symtab-valid?:                         Symbol Tables In Guile.
                                                              (line  21)
* Symtab.filename:                       Symbol Tables In Python.
                                                              (line  43)
* Symtab.fullname:                       Symbol Tables In Python.
                                                              (line  66)
* Symtab.global_block:                   Symbol Tables In Python.
                                                              (line  69)
* Symtab.is_valid:                       Symbol Tables In Python.
                                                              (line  59)
* Symtab.linetable:                      Symbol Tables In Python.
                                                              (line  77)
* Symtab.objfile:                        Symbol Tables In Python.
                                                              (line  47)
* Symtab.producer:                       Symbol Tables In Python.
                                                              (line  51)
* Symtab.static_block:                   Symbol Tables In Python.
                                                              (line  73)
* symtab?:                               Symbol Tables In Guile.
                                                              (line  17)
* Symtab_and_line.is_valid:              Symbol Tables In Python.
                                                              (line  34)
* Symtab_and_line.last:                  Symbol Tables In Python.
                                                              (line  24)
* Symtab_and_line.line:                  Symbol Tables In Python.
                                                              (line  28)
* Symtab_and_line.pc:                    Symbol Tables In Python.
                                                              (line  20)
* Symtab_and_line.symtab:                Symbol Tables In Python.
                                                              (line  16)
* sysinfo:                               DJGPP Native.        (line  19)
* tab-insert (M-<TAB>):                  Commands For Text.   (line  24)
* tabset:                                TUI Commands.        (line 106)
* target:                                Target Commands.     (line  49)
* target array:                          MIPS Embedded.       (line  48)
* target ctf:                            Trace Files.         (line  28)
* target dbug:                           M68K.                (line   9)
* target ddb PORT:                       MIPS Embedded.       (line  40)
* target dink32:                         PowerPC Embedded.    (line  72)
* target lsi PORT:                       MIPS Embedded.       (line  43)
* 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  37)
* target ppcbug:                         PowerPC Embedded.    (line  75)
* target ppcbug1:                        PowerPC Embedded.    (line  76)
* target r3900:                          MIPS Embedded.       (line  45)
* target rdi:                            ARM.                 (line   6)
* target rdp:                            ARM.                 (line  11)
* target record:                         Process Record and Replay.
                                                              (line  38)
* target record-btrace:                  Process Record and Replay.
                                                              (line  38)
* target record-full:                    Process Record and Replay.
                                                              (line  38)
* target sds:                            PowerPC Embedded.    (line  79)
* target sim, with Z8000:                Z8000.               (line  15)
* target sparclite:                      Sparclite.           (line   6)
* target tfile:                          Trace Files.         (line  28)
* target w89k:                           PA.                  (line   9)
* target-config:                         Guile Configuration. (line  24)
* task (Ada):                            Ada Tasks.           (line 104)
* tbreak:                                Set Breaks.          (line  54)
* tcatch:                                Set Catchpoints.     (line 251)
* tdump:                                 tdump.               (line   6)
* teval (tracepoints):                   Tracepoint Actions.  (line 110)
* tfile:                                 Trace Files.         (line  28)
* tfind:                                 tfind.               (line   6)
* thbreak:                               Set Breaks.          (line  80)
* this, inside C++ member functions:     C Plus Plus Expressions.
                                                              (line  20)
* thread apply:                          Threads.             (line 116)
* thread find:                           Threads.             (line 138)
* thread name:                           Threads.             (line 127)
* thread THREADNO:                       Threads.             (line  94)
* thread-info:                           GDB/MI Support Commands.
                                                              (line  86)
* ThreadEvent.inferior_thread:           Events In Python.    (line  54)
* throw-user-error:                      Commands In Guile.   (line  81)
* tilde-expand (M-~):                    Miscellaneous Commands.
                                                              (line  29)
* 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 disable:                           TUI Commands.        (line  23)
* tui enable:                            TUI Commands.        (line  18)
* tui reg:                               TUI Commands.        (line  69)
* tvariable:                             Trace State Variables.
                                                              (line  26)
* type-array:                            Types In Guile.      (line  52)
* type-code:                             Types In Guile.      (line  25)
* type-const:                            Types In Guile.      (line  99)
* type-field:                            Types In Guile.      (line 129)
* type-fields:                           Types In Guile.      (line 115)
* type-has-field-deep?:                  Guile Types Module.  (line  32)
* type-has-field?:                       Types In Guile.      (line 142)
* type-name:                             Types In Guile.      (line  34)
* type-num-fields:                       Types In Guile.      (line 112)
* type-pointer:                          Types In Guile.      (line  73)
* type-print-name:                       Types In Guile.      (line  38)
* type-range:                            Types In Guile.      (line  77)
* type-reference:                        Types In Guile.      (line  81)
* type-sizeof:                           Types In Guile.      (line  43)
* type-strip-typedefs:                   Types In Guile.      (line  48)
* type-tag:                              Types In Guile.      (line  29)
* type-target:                           Types In Guile.      (line  85)
* type-unqualified:                      Types In Guile.      (line 107)
* type-vector:                           Types In Guile.      (line  60)
* type-volatile:                         Types In Guile.      (line 103)
* Type.array:                            Types In Python.     (line 102)
* Type.code:                             Types In Python.     (line  32)
* Type.const:                            Types In Python.     (line 123)
* Type.fields:                           Types In Python.     (line  53)
* Type.name:                             Types In Python.     (line  36)
* Type.optimized_out:                    Types In Python.     (line 180)
* Type.pointer:                          Types In Python.     (line 146)
* Type.range:                            Types In Python.     (line 136)
* Type.reference:                        Types In Python.     (line 142)
* Type.sizeof:                           Types In Python.     (line  40)
* Type.strip_typedefs:                   Types In Python.     (line 150)
* Type.tag:                              Types In Python.     (line  45)
* Type.target:                           Types In Python.     (line 154)
* Type.template_argument:                Types In Python.     (line 168)
* Type.unqualified:                      Types In Python.     (line 131)
* Type.vector:                           Types In Python.     (line 110)
* Type.volatile:                         Types In Python.     (line 127)
* type?:                                 Types In Guile.      (line  11)
* TYPE_CODE_ARRAY:                       Types In Python.     (line 192)
* TYPE_CODE_ARRAY <1>:                   Types In Guile.      (line 153)
* TYPE_CODE_BITSTRING:                   Types In Python.     (line 230)
* TYPE_CODE_BITSTRING <1>:               Types In Guile.      (line 191)
* TYPE_CODE_BOOL:                        Types In Python.     (line 251)
* TYPE_CODE_BOOL <1>:                    Types In Guile.      (line 212)
* TYPE_CODE_CHAR:                        Types In Python.     (line 248)
* TYPE_CODE_CHAR <1>:                    Types In Guile.      (line 209)
* TYPE_CODE_COMPLEX:                     Types In Python.     (line 254)
* TYPE_CODE_COMPLEX <1>:                 Types In Guile.      (line 215)
* TYPE_CODE_DECFLOAT:                    Types In Python.     (line 263)
* TYPE_CODE_DECFLOAT <1>:                Types In Guile.      (line 224)
* TYPE_CODE_ENUM:                        Types In Python.     (line 201)
* TYPE_CODE_ENUM <1>:                    Types In Guile.      (line 162)
* TYPE_CODE_ERROR:                       Types In Python.     (line 233)
* TYPE_CODE_ERROR <1>:                   Types In Guile.      (line 194)
* TYPE_CODE_FLAGS:                       Types In Python.     (line 204)
* TYPE_CODE_FLAGS <1>:                   Types In Guile.      (line 165)
* TYPE_CODE_FLT:                         Types In Python.     (line 213)
* TYPE_CODE_FLT <1>:                     Types In Guile.      (line 174)
* TYPE_CODE_FUNC:                        Types In Python.     (line 207)
* TYPE_CODE_FUNC <1>:                    Types In Guile.      (line 168)
* TYPE_CODE_INT:                         Types In Python.     (line 210)
* TYPE_CODE_INT <1>:                     Types In Guile.      (line 171)
* TYPE_CODE_INTERNAL_FUNCTION:           Types In Python.     (line 266)
* TYPE_CODE_INTERNAL_FUNCTION <1>:       Types In Guile.      (line 227)
* TYPE_CODE_MEMBERPTR:                   Types In Python.     (line 242)
* TYPE_CODE_MEMBERPTR <1>:               Types In Guile.      (line 203)
* TYPE_CODE_METHOD:                      Types In Python.     (line 236)
* TYPE_CODE_METHOD <1>:                  Types In Guile.      (line 197)
* TYPE_CODE_METHODPTR:                   Types In Python.     (line 239)
* TYPE_CODE_METHODPTR <1>:               Types In Guile.      (line 200)
* TYPE_CODE_NAMESPACE:                   Types In Python.     (line 260)
* TYPE_CODE_NAMESPACE <1>:               Types In Guile.      (line 221)
* TYPE_CODE_PTR:                         Types In Python.     (line 189)
* TYPE_CODE_PTR <1>:                     Types In Guile.      (line 150)
* TYPE_CODE_RANGE:                       Types In Python.     (line 222)
* TYPE_CODE_RANGE <1>:                   Types In Guile.      (line 183)
* TYPE_CODE_REF:                         Types In Python.     (line 245)
* TYPE_CODE_REF <1>:                     Types In Guile.      (line 206)
* TYPE_CODE_SET:                         Types In Python.     (line 219)
* TYPE_CODE_SET <1>:                     Types In Guile.      (line 180)
* TYPE_CODE_STRING:                      Types In Python.     (line 225)
* TYPE_CODE_STRING <1>:                  Types In Guile.      (line 186)
* TYPE_CODE_STRUCT:                      Types In Python.     (line 195)
* TYPE_CODE_STRUCT <1>:                  Types In Guile.      (line 156)
* TYPE_CODE_TYPEDEF:                     Types In Python.     (line 257)
* TYPE_CODE_TYPEDEF <1>:                 Types In Guile.      (line 218)
* TYPE_CODE_UNION:                       Types In Python.     (line 198)
* TYPE_CODE_UNION <1>:                   Types In Guile.      (line 159)
* TYPE_CODE_VOID:                        Types In Python.     (line 216)
* TYPE_CODE_VOID <1>:                    Types In Guile.      (line 177)
* u (SingleKey TUI key):                 TUI Single Key Mode. (line  31)
* u ('until'):                           Continuing and Stepping.
                                                              (line 117)
* undefined-command-error-code:          GDB/MI Support Commands.
                                                              (line 101)
* 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  61)
* unset substitute-path:                 Source Path.         (line 154)
* until:                                 Continuing and Stepping.
                                                              (line 117)
* until&:                                Background Execution.
                                                              (line  46)
* unwind-stop-reason-string:             Frames In Guile.     (line 163)
* up:                                    Selection.           (line  27)
* Up:                                    TUI Keys.            (line  53)
* up-silently:                           Selection.           (line  56)
* upcase-word (M-u):                     Commands For Text.   (line  41)
* update:                                TUI Commands.        (line  95)
* 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->bool:                           Values From Inferior In Guile.
                                                              (line 234)
* value->bytevector:                     Values From Inferior In Guile.
                                                              (line 246)
* value->integer:                        Values From Inferior In Guile.
                                                              (line 238)
* value->lazy-string:                    Values From Inferior In Guile.
                                                              (line 291)
* value->real:                           Values From Inferior In Guile.
                                                              (line 242)
* value->string:                         Values From Inferior In Guile.
                                                              (line 250)
* value-abs:                             Arithmetic In Guile. (line  35)
* value-add:                             Arithmetic In Guile. (line  15)
* value-address:                         Values From Inferior In Guile.
                                                              (line 106)
* value-call:                            Values From Inferior In Guile.
                                                              (line 228)
* value-cast:                            Values From Inferior In Guile.
                                                              (line 129)
* value-dereference:                     Values From Inferior In Guile.
                                                              (line 143)
* value-div:                             Arithmetic In Guile. (line  21)
* value-dynamic-cast:                    Values From Inferior In Guile.
                                                              (line 135)
* value-dynamic-type:                    Values From Inferior In Guile.
                                                              (line 114)
* value-fetch-lazy!:                     Values From Inferior In Guile.
                                                              (line 333)
* value-field:                           Values From Inferior In Guile.
                                                              (line 221)
* value-lazy?:                           Values From Inferior In Guile.
                                                              (line 316)
* value-logand:                          Arithmetic In Guile. (line  47)
* value-logior:                          Arithmetic In Guile. (line  49)
* value-lognot:                          Arithmetic In Guile. (line  45)
* value-logxor:                          Arithmetic In Guile. (line  51)
* value-lsh:                             Arithmetic In Guile. (line  37)
* value-max:                             Arithmetic In Guile. (line  43)
* value-min:                             Arithmetic In Guile. (line  41)
* value-mod:                             Arithmetic In Guile. (line  25)
* value-mul:                             Arithmetic In Guile. (line  19)
* value-neg:                             Arithmetic In Guile. (line  31)
* value-not:                             Arithmetic In Guile. (line  29)
* value-optimized-out?:                  Values From Inferior In Guile.
                                                              (line 102)
* value-pos:                             Arithmetic In Guile. (line  33)
* value-pow:                             Arithmetic In Guile. (line  27)
* value-print:                           Values From Inferior In Guile.
                                                              (line 342)
* value-referenced-value:                Values From Inferior In Guile.
                                                              (line 196)
* value-reinterpret-cast:                Values From Inferior In Guile.
                                                              (line 139)
* value-rem:                             Arithmetic In Guile. (line  23)
* value-rsh:                             Arithmetic In Guile. (line  39)
* value-sub:                             Arithmetic In Guile. (line  17)
* value-subscript:                       Values From Inferior In Guile.
                                                              (line 224)
* value-type:                            Values From Inferior In Guile.
                                                              (line 110)
* Value.address:                         Values From Inferior.
                                                              (line  65)
* Value.cast:                            Values From Inferior.
                                                              (line 141)
* Value.const_value:                     Values From Inferior.
                                                              (line 229)
* Value.dereference:                     Values From Inferior.
                                                              (line 147)
* Value.dynamic_cast:                    Values From Inferior.
                                                              (line 233)
* Value.dynamic_type:                    Values From Inferior.
                                                              (line  79)
* Value.fetch_lazy:                      Values From Inferior.
                                                              (line 295)
* Value.is_lazy:                         Values From Inferior.
                                                              (line  94)
* Value.is_optimized_out:                Values From Inferior.
                                                              (line  70)
* Value.lazy_string:                     Values From Inferior.
                                                              (line 273)
* Value.referenced_value:                Values From Inferior.
                                                              (line 200)
* Value.reference_value:                 Values From Inferior.
                                                              (line 225)
* Value.reinterpret_cast:                Values From Inferior.
                                                              (line 237)
* Value.string:                          Values From Inferior.
                                                              (line 241)
* Value.type:                            Values From Inferior.
                                                              (line  75)
* Value.__init__:                        Values From Inferior.
                                                              (line 107)
* value<=?:                              Arithmetic In Guile. (line  57)
* value<?:                               Arithmetic In Guile. (line  55)
* value=?:                               Arithmetic In Guile. (line  53)
* value>=?:                              Arithmetic In Guile. (line  61)
* value>?:                               Arithmetic In Guile. (line  59)
* value?:                                Values From Inferior In Guile.
                                                              (line  41)
* vi-editing-mode (M-C-j):               Miscellaneous Commands.
                                                              (line  91)
* visible-stats:                         Readline Init File Syntax.
                                                              (line 240)
* 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 114)
* where:                                 Backtrace.           (line  46)
* while:                                 Command Files.       (line  85)
* while-stepping (tracepoints):          Tracepoint Actions.  (line 118)
* winheight:                             TUI Commands.        (line  99)
* WP_ACCESS:                             Breakpoints In Python.
                                                              (line  70)
* WP_ACCESS <1>:                         Breakpoints In Guile.
                                                              (line  84)
* WP_READ:                               Breakpoints In Python.
                                                              (line  64)
* WP_READ <1>:                           Breakpoints In Guile.
                                                              (line  78)
* WP_WRITE:                              Breakpoints In Python.
                                                              (line  67)
* WP_WRITE <1>:                          Breakpoints In Guile.
                                                              (line  81)
* x (examine memory):                    Memory.              (line   9)
* x(examine), and info line:             Machine Code.        (line  30)
* XMethod.__init__:                      Xmethod API.         (line  38)
* XMethodMatcher.match:                  Xmethod API.         (line  47)
* XMethodMatcher.__init__:               Xmethod API.         (line  43)
* XMethodWorker.get_arg_types:           Xmethod API.         (line  60)
* XMethodWorker.get_result_type:         Xmethod API.         (line  67)
* XMethodWorker.__call__:                Xmethod API.         (line  73)
* 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1731
Node: Summary5218
Node: Free Software7079
Node: Free Documentation7819
Node: Contributors12753
Node: Sample Session20851
Node: Invocation27703
Node: Invoking GDB28246
Node: File Options30580
Node: Mode Options33637
Ref: -nx33864
Ref: -nh34948
Node: Startup41266
Ref: Home Directory Init File41817
Ref: Option -init-eval-command41927
Ref: Init File in the Current Directory during Startup42267
Ref: Startup-Footnote-144463
Node: Quitting GDB44572
Node: Shell Commands45469
Node: Logging Output46396
Node: Commands47233
Node: Command Syntax47871
Node: Completion50037
Ref: Completion-Footnote-156425
Node: Help56585
Node: Running62336
Node: Compilation63565
Node: Starting65649
Ref: set exec-wrapper70917
Ref: set auto-connect-native-target73071
Node: Arguments77467
Node: Environment78736
Node: Working Directory82470
Node: Input/Output83622
Node: Attach85593
Node: Kill Process88059
Node: Inferiors and Programs89040
Node: Threads96283
Ref: set libthread-db-search-path103834
Node: Forks105888
Node: Checkpoint/Restart112334
Ref: Checkpoint/Restart-Footnote-1116862
Node: Stopping116897
Node: Breakpoints118160
Node: Set Breaks121699
Node: Set Watchpoints140120
Node: Set Catchpoints149524
Node: Delete Breaks160398
Node: Disabling162338
Node: Conditions165723
Node: Break Commands171370
Node: Dynamic Printf174591
Node: Save Breakpoints178850
Node: Static Probe Points180025
Ref: Static Probe Points-Footnote-1184203
Ref: Static Probe Points-Footnote-2184363
Node: Error in Breakpoints184503
Node: Breakpoint-related Warnings185239
Node: Continuing and Stepping187566
Ref: range stepping197029
Node: Skipping Over Functions and Files198109
Node: Signals201681
Ref: stepping and signal handlers206115
Ref: stepping into signal handlers206911
Ref: extra signal information208144
Node: Thread Stops209648
Node: All-Stop Mode210747
Node: Non-Stop Mode214558
Node: Background Execution217971
Node: Thread-Specific Breakpoints220187
Node: Interrupted System Calls222205
Node: Observer Mode223719
Node: Reverse Execution227155
Ref: Reverse Execution-Footnote-1231780
Ref: Reverse Execution-Footnote-2232407
Node: Process Record and Replay232457
Node: Stack250179
Node: Frames251727
Node: Backtrace254494
Ref: backtrace-command254845
Ref: Backtrace-Footnote-1260615
Node: Frame Filter Management260803
Ref: disable frame-filter all261347
Node: Selection265655
Node: Frame Info268284
Node: Source270271
Node: List271337
Node: Specify Location274039
Node: Edit278642
Ref: Edit-Footnote-1280118
Node: Search280353
Node: Source Path281161
Ref: set substitute-path287527
Node: Machine Code289747
Node: Data296648
Node: Expressions304312
Node: Ambiguous Expressions306415
Node: Variables309645
Node: Arrays315711
Node: Output Formats318242
Ref: Output Formats-Footnote-1321615
Node: Memory321772
Ref: addressable memory unit327230
Node: Auto Display328724
Node: Print Settings333266
Ref: set print entry-values341428
Node: Pretty Printing352742
Node: Pretty-Printer Introduction353256
Node: Pretty-Printer Example355011
Node: Pretty-Printer Commands355789
Node: Value History358213
Node: Convenience Vars360635
Node: Convenience Funs367117
Node: Registers372246
Ref: standard registers373228
Ref: Registers-Footnote-1378179
Node: Floating Point Hardware378574
Node: Vector Unit379106
Node: OS Information379493
Ref: linux info os infotypes381517
Node: Memory Region Attributes386108
Node: Dump/Restore Files390772
Node: Core File Generation393175
Ref: set use-coredump-filter394579
Node: Character Sets396027
Node: Caching Target Data402392
Ref: Caching Target Data-Footnote-1405120
Node: Searching Memory405358
Node: Optimized Code408236
Node: Inline Functions409913
Node: Tail Call Frames412540
Ref: set debug entry-values414680
Node: Macros418754
Ref: Macros-Footnote-1426330
Node: Tracepoints426483
Node: Set Tracepoints428545
Node: Create and Delete Tracepoints431483
Node: Enable and Disable Tracepoints437884
Node: Tracepoint Passcounts439124
Node: Tracepoint Conditions440535
Node: Trace State Variables442229
Node: Tracepoint Actions444424
Node: Listing Tracepoints450727
Node: Listing Static Tracepoint Markers452429
Node: Starting and Stopping Trace Experiments454277
Ref: disconnected tracing456022
Node: Tracepoint Restrictions460442
Node: Analyze Collected Data464211
Node: tfind465517
Node: tdump469939
Node: save tracepoints472454
Node: Tracepoint Variables472950
Node: Trace Files474078
Node: Overlays476454
Node: How Overlays Work477174
Ref: A code overlay479729
Node: Overlay Commands483142
Node: Automatic Overlay Debugging487324
Node: Overlay Sample Program489463
Node: Languages491200
Node: Setting492363
Node: Filenames494064
Node: Manually494875
Node: Automatically496084
Node: Show497145
Ref: show language497433
Node: Checks498467
Node: Type Checking499472
Node: Range Checking501301
Node: Supported Languages503702
Node: C505002
Node: C Operators505966
Node: C Constants510305
Node: C Plus Plus Expressions513184
Node: C Defaults516527
Node: C Checks517195
Node: Debugging C517755
Node: Debugging C Plus Plus518239
Node: Decimal Floating Point521832
Node: D523102
Node: Go523360
Node: Objective-C524454
Node: Method Names in Commands524917
Node: The Print Command with Objective-C526608
Node: OpenCL C527259
Node: OpenCL C Datatypes527534
Node: OpenCL C Expressions527909
Node: OpenCL C Operators528266
Node: Fortran528498
Node: Fortran Operators529219
Node: Fortran Defaults530075
Node: Special Fortran Commands530460
Node: Pascal530966
Node: Modula-2531481
Node: M2 Operators532456
Node: Built-In Func/Proc535454
Node: M2 Constants538368
Node: M2 Types539969
Node: M2 Defaults543187
Node: Deviations543788
Node: M2 Checks544889
Node: M2 Scope545706
Node: GDB/M2546730
Node: Ada547643
Node: Ada Mode Intro548753
Node: Omissions from Ada550664
Node: Additions to Ada555017
Node: Stopping Before Main Program558944
Node: Ada Exceptions559478
Node: Ada Tasks560675
Node: Ada Tasks and Core Files567097
Node: Ravenscar Profile567942
Node: Ada Glitches569011
Node: Unsupported Languages573020
Node: Symbols573710
Node: Altering593380
Node: Assignment594418
Node: Jumping597524
Node: Signaling599686
Node: Returning602615
Node: Calling605966
Node: Patching609008
Node: Compiling and Injecting Code610122
Ref: set debug compile613579
Node: GDB Files622626
Node: Files623346
Ref: Shared Libraries636420
Ref: Files-Footnote-1648705
Node: Separate Debug Files648834
Ref: debug-file-directory651937
Node: MiniDebugInfo660551
Node: Index Files663002
Node: Symbol Errors665064
Node: Data Files668680
Node: Targets669636
Node: Active Targets671116
Node: Target Commands672190
Ref: load676572
Node: Byte Order677553
Node: Remote Debugging678527
Node: Connecting679789
Node: File Transfer685011
Node: Server685950
Ref: Other Command-Line Arguments for gdbserver693541
Ref: Monitor Commands for gdbserver696655
Ref: Server-Footnote-1701830
Node: Remote Configuration701950
Ref: set remotebreak703210
Ref: set remote hardware-watchpoint-limit704673
Ref: set remote hardware-breakpoint-limit704673
Ref: set remote hardware-watchpoint-length-limit704899
Ref: set remote exec-file705314
Node: Remote Stub715552
Node: Stub Contents718447
Node: Bootstrapping720554
Node: Debug Session724369
Node: Configurations726410
Node: Native727179
Node: HP-UX727748
Node: BSD libkvm Interface728037
Node: SVR4 Process Information729108
Node: DJGPP Native732883
Node: Cygwin Native739442
Node: Non-debug DLL Symbols743182
Node: Hurd Native747335
Node: Darwin752591
Node: Embedded OS753852
Node: Embedded Processors754263
Node: ARM755396
Node: M32R/D759532
Node: M68K761234
Node: MicroBlaze761526
Node: MIPS Embedded762975
Node: PowerPC Embedded767912
Node: PA771692
Node: Sparclet771975
Node: Sparclet File773444
Node: Sparclet Connection774324
Node: Sparclet Download774802
Node: Sparclet Execution775850
Node: Sparclite776441
Node: Z8000776813
Node: AVR778195
Node: CRIS778558
Node: Super-H779536
Node: Architectures780595
Node: AArch64781032
Node: i386781438
Ref: i386-Footnote-1784370
Node: Alpha784456
Node: MIPS784589
Node: HPPA788483
Node: SPU789001
Node: PowerPC791187
Node: Nios II791922
Node: Controlling GDB792311
Node: Prompt793207
Node: Editing794925
Node: Command History795868
Node: Screen Size800174
Node: Numbers802108
Node: ABI804087
Node: Auto-loading807260
Ref: set auto-load off808635
Ref: show auto-load809271
Ref: info auto-load810050
Node: Init File in the Current Directory813107
Ref: set auto-load local-gdbinit813682
Ref: show auto-load local-gdbinit813864
Ref: info auto-load local-gdbinit814028
Node: libthread_db.so.1 file814176
Ref: set auto-load libthread-db815115
Ref: show auto-load libthread-db815246
Ref: info auto-load libthread-db815383
Node: Auto-loading safe path815567
Ref: set auto-load safe-path816873
Ref: show auto-load safe-path817612
Ref: add-auto-load-safe-path817735
Node: Auto-loading verbose mode820637
Ref: set debug auto-load821800
Ref: show debug auto-load821901
Node: Messages/Warnings822023
Ref: confirmation requests823457
Node: Debugging Output824661
Node: Other Misc Settings833897
Node: Extending GDB834921
Node: Sequences836774
Node: Define837435
Node: Hooks841246
Node: Command Files843612
Node: Output848685
Node: Auto-loading sequences853649
Ref: set auto-load gdb-scripts854144
Ref: show auto-load gdb-scripts854268
Ref: info auto-load gdb-scripts854398
Node: Python854629
Node: Python Commands855802
Node: Python API858130
Node: Basic Python860669
Ref: prompt_hook869331
Node: Exception Handling869929
Node: Values From Inferior872425
Node: Types In Python885622
Node: Pretty Printing API895129
Node: Selecting Pretty-Printers899025
Node: Writing a Pretty-Printer901358
Node: Type Printing API906680
Node: Frame Filter API909296
Node: Frame Decorator API916577
Ref: frame_args920161
Node: Writing a Frame Filter923491
Node: Unwinding Frames in Python934965
Node: Xmethods In Python940421
Node: Xmethod API943317
Node: Writing an Xmethod947129
Node: Inferiors In Python952964
Node: Events In Python955873
Node: Threads In Python962953
Node: Commands In Python965393
Node: Parameters In Python974803
Node: Functions In Python980263
Node: Progspaces In Python982480
Node: Objfiles In Python985981
Node: Frames In Python991760
Node: Blocks In Python998315
Node: Symbols In Python1002677
Node: Symbol Tables In Python1009904
Node: Line Tables In Python1013127
Node: Breakpoints In Python1015964
Node: Finish Breakpoints in Python1023953
Node: Lazy Strings In Python1026059
Node: Architectures In Python1028293
Node: Python Auto-loading1030482
Ref: set auto-load python-scripts1031111
Ref: show auto-load python-scripts1031211
Ref: info auto-load python-scripts1031317
Node: Python modules1032451
Node: gdb.printing1032837
Node: gdb.types1034264
Node: gdb.prompt1037276
Node: Guile1038925
Node: Guile Introduction1039584
Node: Guile Commands1040455
Node: Guile API1042309
Node: Basic Guile1044306
Node: Guile Configuration1049988
Node: GDB Scheme Data Types1050964
Node: Guile Exception Handling1052796
Node: Values From Inferior In Guile1056830
Node: Arithmetic In Guile1072365
Node: Types In Guile1073996
Ref: Fields of a type in Guile1081945
Node: Guile Pretty Printing API1083341
Node: Selecting Guile Pretty-Printers1088943
Node: Writing a Guile Pretty-Printer1091319
Node: Commands In Guile1096504
Node: Parameters In Guile1107284
Ref: Parameters In Guile-Footnote-11114165
Node: Progspaces In Guile1114281
Node: Objfiles In Guile1116869
Node: Frames In Guile1119150
Node: Blocks In Guile1125728
Node: Symbols In Guile1130536
Node: Symbol Tables In Guile1137870
Node: Breakpoints In Guile1140833
Node: Lazy Strings In Guile1151064
Node: Architectures In Guile1153358
Node: Disassembly In Guile1157665
Node: I/O Ports in Guile1160867
Node: Memory Ports in Guile1161423
Node: Iterators In Guile1164689
Node: Guile Auto-loading1168978
Ref: set auto-load guile-scripts1169601
Ref: show auto-load guile-scripts1169699
Ref: info auto-load guile-scripts1169803
Node: Guile Modules1170762
Node: Guile Printing Module1171084
Node: Guile Types Module1171903
Node: Auto-loading extensions1173196
Node: objfile-gdbdotext file1174394
Ref: set auto-load scripts-directory1175830
Ref: with-auto-load-dir1176206
Ref: show auto-load scripts-directory1177024
Ref: add-auto-load-scripts-directory1177104
Node: dotdebug_gdb_scripts section1177580
Node: Which flavor to choose?1181330
Node: Multiple Extension Languages1183151
Node: Aliases1184215
Node: Interpreters1187080
Node: TUI1189178
Node: TUI Overview1190176
Node: TUI Keys1192609
Node: TUI Single Key Mode1194913
Node: TUI Commands1195788
Node: TUI Configuration1199191
Node: Emacs1200497
Node: GDB/MI1205934
Node: GDB/MI General Design1207908
Node: Context management1210428
Node: Asynchronous and non-stop modes1214256
Node: Thread groups1217230
Node: GDB/MI Command Syntax1219508
Node: GDB/MI Input Syntax1219751
Node: GDB/MI Output Syntax1221301
Node: GDB/MI Compatibility with CLI1224886
Node: GDB/MI Development and Front Ends1225623
Node: GDB/MI Output Records1227277
Node: GDB/MI Result Records1227683
Node: GDB/MI Stream Records1229033
Node: GDB/MI Async Records1230298
Node: GDB/MI Breakpoint Information1239924
Node: GDB/MI Frame Information1243875
Node: GDB/MI Thread Information1244961
Node: GDB/MI Ada Exception Information1245941
Node: GDB/MI Simple Examples1246364
Node: GDB/MI Command Description Format1248572
Node: GDB/MI Breakpoint Commands1249452
Node: GDB/MI Catchpoint Commands1269298
Node: Shared Library GDB/MI Catchpoint Commands1269666
Node: Ada Exception GDB/MI Catchpoint Commands1271324
Node: GDB/MI Program Context1273728
Node: GDB/MI Thread Commands1277996
Node: GDB/MI Ada Tasking Commands1281952
Node: GDB/MI Program Execution1284205
Node: GDB/MI Stack Manipulation1296239
Ref: -stack-list-arguments1298138
Ref: -stack-list-frames1301843
Ref: -stack-list-locals1305706
Ref: -stack-list-variables1307196
Node: GDB/MI Variable Objects1308730
Ref: -var-set-format1318688
Ref: -var-list-children1319806
Ref: -var-update1328598
Ref: -var-set-frozen1331596
Ref: -var-set-update-range1332393
Ref: -var-set-visualizer1332922
Node: GDB/MI Data Manipulation1334412
Node: GDB/MI Tracepoint Commands1354221
Node: GDB/MI Symbol Query1365806
Node: GDB/MI File Commands1366495
Node: GDB/MI Target Manipulation1369790
Node: GDB/MI File Transfer Commands1376005
Node: GDB/MI Ada Exceptions Commands1377328
Node: GDB/MI Support Commands1378681
Node: GDB/MI Miscellaneous Commands1383254
Ref: -interpreter-exec1393588
Node: Annotations1395928
Node: Annotations Overview1396847
Node: Server Prefix1399310
Node: Prompting1400044
Node: Errors1401561
Node: Invalidation1402457
Node: Annotations for Running1402936
Node: Source Annotations1404470
Node: JIT Interface1405399
Node: Declarations1407198
Node: Registering Code1408585
Node: Unregistering Code1409557
Node: Custom Debug Info1410184
Node: Using JIT Debug Info Readers1411480
Node: Writing JIT Debug Info Readers1412492
Node: In-Process Agent1414687
Ref: Control Agent1416630
Node: In-Process Agent Protocol1417497
Node: IPA Protocol Objects1418288
Ref: agent expression object1419286
Ref: tracepoint action object1419491
Ref: tracepoint object1419571
Node: IPA Protocol Commands1422147
Node: GDB Bugs1423617
Node: Bug Criteria1424349
Node: Bug Reporting1425226
Node: Command Line Editing1432202
Node: Introduction and Notation1432854
Node: Readline Interaction1434475
Node: Readline Bare Essentials1435664
Node: Readline Movement Commands1437445
Node: Readline Killing Commands1438403
Node: Readline Arguments1440319
Node: Searching1441361
Node: Readline Init File1443511
Node: Readline Init File Syntax1444662
Node: Conditional Init Constructs1459761
Node: Sample Init File1462284
Node: Bindable Readline Commands1465398
Node: Commands For Moving1466450
Node: Commands For History1467308
Node: Commands For Text1470703
Node: Commands For Killing1473426
Node: Numeric Arguments1475566
Node: Commands For Completion1476702
Node: Keyboard Macros1478668
Node: Miscellaneous Commands1479236
Node: Readline vi Mode1483084
Node: Using History Interactively1483994
Node: History Interaction1484509
Node: Event Designators1485931
Node: Word Designators1487068
Node: Modifiers1488703
Node: In Memoriam1489924
Node: Formatting Documentation1490807
Ref: Formatting Documentation-Footnote-11494183
Node: Installing GDB1494279
Node: Requirements1494851
Ref: Expat1495420
Node: Running Configure1498040
Node: Separate Objdir1501819
Node: Config Names1504798
Node: Configure Options1506275
Node: System-wide configuration1508646
Node: System-wide Configuration Scripts1510606
Node: Maintenance Commands1511790
Ref: maint info breakpoints1513445
Node: Remote Protocol1532605
Node: Overview1533297
Ref: Binary Data1535842
Node: Packets1538367
Ref: thread-id syntax1539267
Ref: extended mode1540712
Ref: ? packet1540970
Ref: bc1542436
Ref: bs1542646
Ref: read registers packet1544263
Ref: cycle step packet1546199
Ref: write register packet1548910
Ref: step with signal packet1549889
Ref: vCont packet1551365
Ref: vKill packet1556253
Ref: X packet1557183
Ref: insert breakpoint or watchpoint packet1557552
Node: Stop Reply Packets1561725
Ref: swbreak stop reason1564662
Node: General Query Packets1569559
Ref: qCRC packet1572389
Ref: QNonStop1580212
Ref: QPassSignals1580874
Ref: QProgramSignals1582081
Ref: qSearch memory1584596
Ref: QStartNoAckMode1585104
Ref: qSupported1585635
Ref: multiprocess extensions1600615
Ref: install tracepoint in tracing1602645
Ref: qXfer read1606781
Ref: qXfer auxiliary vector read1607276
Ref: qXfer btrace read1607624
Ref: qXfer btrace-conf read1608689
Ref: qXfer executable filename read1609040
Ref: qXfer target description read1609655
Ref: qXfer library list read1610089
Ref: qXfer svr4 library list read1610745
Ref: qXfer memory map read1612598
Ref: qXfer sdata read1612985
Ref: qXfer siginfo read1613451
Ref: qXfer spu read1613848
Ref: qXfer threads read1614372
Ref: qXfer traceframe info read1614775
Ref: qXfer unwind info block1615193
Ref: qXfer fdpic loadmap read1615427
Ref: qXfer osdata read1615843
Ref: qXfer write1617105
Ref: qXfer siginfo write1617672
Ref: qXfer spu write1618069
Ref: General Query Packets-Footnote-11621449
Node: Architecture-Specific Protocol Details1621776
Node: ARM-Specific Protocol Details1622285
Node: ARM Breakpoint Kinds1622533
Node: MIPS-Specific Protocol Details1622864
Node: MIPS Register packet Format1623147
Node: MIPS Breakpoint Kinds1624074
Node: Tracepoint Packets1624492
Ref: QTEnable1633806
Ref: QTDisable1634002
Ref: qTfSTM1639539
Ref: qTsSTM1639539
Ref: qTSTMat1640616
Ref: QTBuffer-size1641767
Node: Host I/O Packets1643740
Node: Interrupts1649320
Node: Notification Packets1651223
Node: Remote Non-Stop1656643
Node: Packet Acknowledgment1659759
Node: Examples1661874
Node: File-I/O Remote Protocol Extension1662468
Node: File-I/O Overview1662930
Node: Protocol Basics1665129
Node: The F Request Packet1667358
Node: The F Reply Packet1668259
Node: The Ctrl-C Message1669177
Node: Console I/O1670803
Node: List of Supported Calls1672019
Node: open1672381
Node: close1674889
Node: read1675272
Node: write1675881
Node: lseek1676652
Node: rename1677536
Node: unlink1678943
Node: stat/fstat1679890
Node: gettimeofday1680783
Node: isatty1681219
Node: system1681815
Node: Protocol-specific Representation of Datatypes1683357
Node: Integral Datatypes1683734
Node: Pointer Values1684541
Node: Memory Transfer1685245
Node: struct stat1685865
Node: struct timeval1688067
Node: Constants1688584
Node: Open Flags1689033
Node: mode_t Values1689374
Node: Errno Values1689866
Node: Lseek Flags1690676
Node: Limits1690861
Node: File-I/O Examples1691221
Node: Library List Format1692309
Node: Library List Format for SVR4 Targets1695091
Node: Memory Map Format1697558
Node: Thread List Format1700133
Node: Traceframe Info Format1700951
Node: Branch Trace Format1702637
Node: Branch Trace Configuration Format1704337
Node: Agent Expressions1705525
Node: General Bytecode Design1708346
Node: Bytecode Descriptions1713140
Node: Using Agent Expressions1726573
Node: Varying Target Capabilities1728550
Node: Rationale1729711
Node: Target Descriptions1737100
Node: Retrieving Descriptions1738974
Node: Target Description Format1740059
Node: Predefined Target Types1749102
Node: Standard Target Features1750486
Node: AArch64 Features1752374
Node: ARM Features1752797
Node: i386 Features1754315
Node: MicroBlaze Features1756257
Node: MIPS Features1756834
Node: M68K Features1758025
Node: Nios II Features1758688
Node: PowerPC Features1759086
Node: S/390 and System z Features1760409
Node: TIC6x Features1762233
Node: Operating System Information1762795
Node: Process list1763630
Node: Trace File Format1764693
Node: Index Section Format1766686
Node: Man Pages1774656
Node: gdb man1775062
Node: gdbserver man1781098
Node: gcore man1788295
Node: gdbinit man1788952
Node: Copying1789835
Node: GNU Free Documentation License1827396
Node: Concept Index1852543
Node: Command and Variable Index1984300

End Tag Table
