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

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

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

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

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

   This file documents the GNU debugger GDB.

   This is the Ninth Edition, of `Debugging with GDB: the GNU
Source-Level Debugger' for GDB (GDB) Version 7.2.

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

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

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


File: gdb.info,  Node: GDB/MI Data Manipulation,  Next: GDB/MI Tracepoint Commands,  Prev: GDB/MI Variable Objects,  Up: GDB/MI

27.14 GDB/MI Data Manipulation
==============================

This section describes the GDB/MI commands that manipulate data:
examine memory and registers, evaluate expressions, etc.

The `-data-disassemble' Command
-------------------------------

Synopsis
........

      -data-disassemble
         [ -s START-ADDR -e END-ADDR ]
       | [ -f FILENAME -l LINENUM [ -n LINES ] ]
       -- MODE

Where:

`START-ADDR'
     is the beginning address (or `$pc')

`END-ADDR'
     is the end address

`FILENAME'
     is the name of the file to disassemble

`LINENUM'
     is the line number to disassemble around

`LINES'
     is the number of disassembly lines to be produced.  If it is -1,
     the whole function will be disassembled, in case no END-ADDR is
     specified.  If END-ADDR is specified as a non-zero value, and
     LINES is lower than the number of disassembly lines between
     START-ADDR and END-ADDR, only LINES lines are displayed; if LINES
     is higher than the number of lines between START-ADDR and
     END-ADDR, only the lines up to END-ADDR are displayed.

`MODE'
     is either 0 (meaning only disassembly) or 1 (meaning mixed source
     and disassembly).

Result
......

The output for each instruction is composed of four fields:

   * Address

   * Func-name

   * Offset

   * Instruction

   Note that whatever included in the instruction field, is not
manipulated directly by GDB/MI, i.e., it is not possible to adjust its
format.

GDB Command
...........

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

Example
.......

Disassemble from the current value of `$pc' to `$pc + 20':

     (gdb)
     -data-disassemble -s $pc -e "$pc + 20" -- 0
     ^done,
     asm_insns=[
     {address="0x000107c0",func-name="main",offset="4",
     inst="mov  2, %o0"},
     {address="0x000107c4",func-name="main",offset="8",
     inst="sethi  %hi(0x11800), %o2"},
     {address="0x000107c8",func-name="main",offset="12",
     inst="or  %o2, 0x140, %o1\t! 0x11940 <_lib_version+8>"},
     {address="0x000107cc",func-name="main",offset="16",
     inst="sethi  %hi(0x11800), %o2"},
     {address="0x000107d0",func-name="main",offset="20",
     inst="or  %o2, 0x168, %o4\t! 0x11968 <_lib_version+48>"}]
     (gdb)

   Disassemble the whole `main' function.  Line 32 is part of `main'.

     -data-disassemble -f basics.c -l 32 -- 0
     ^done,asm_insns=[
     {address="0x000107bc",func-name="main",offset="0",
     inst="save  %sp, -112, %sp"},
     {address="0x000107c0",func-name="main",offset="4",
     inst="mov   2, %o0"},
     {address="0x000107c4",func-name="main",offset="8",
     inst="sethi %hi(0x11800), %o2"},
     [...]
     {address="0x0001081c",func-name="main",offset="96",inst="ret "},
     {address="0x00010820",func-name="main",offset="100",inst="restore "}]
     (gdb)

   Disassemble 3 instructions from the start of `main':

     (gdb)
     -data-disassemble -f basics.c -l 32 -n 3 -- 0
     ^done,asm_insns=[
     {address="0x000107bc",func-name="main",offset="0",
     inst="save  %sp, -112, %sp"},
     {address="0x000107c0",func-name="main",offset="4",
     inst="mov  2, %o0"},
     {address="0x000107c4",func-name="main",offset="8",
     inst="sethi  %hi(0x11800), %o2"}]
     (gdb)

   Disassemble 3 instructions from the start of `main' in mixed mode:

     (gdb)
     -data-disassemble -f basics.c -l 32 -n 3 -- 1
     ^done,asm_insns=[
     src_and_asm_line={line="31",
     file="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb/ \
       testsuite/gdb.mi/basics.c",line_asm_insn=[
     {address="0x000107bc",func-name="main",offset="0",
     inst="save  %sp, -112, %sp"}]},
     src_and_asm_line={line="32",
     file="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb/ \
       testsuite/gdb.mi/basics.c",line_asm_insn=[
     {address="0x000107c0",func-name="main",offset="4",
     inst="mov  2, %o0"},
     {address="0x000107c4",func-name="main",offset="8",
     inst="sethi  %hi(0x11800), %o2"}]}]
     (gdb)

The `-data-evaluate-expression' Command
---------------------------------------

Synopsis
........

      -data-evaluate-expression EXPR

   Evaluate EXPR as an expression.  The expression could contain an
inferior function call.  The function call will execute synchronously.
If the expression contains spaces, it must be enclosed in double quotes.

GDB Command
...........

The corresponding GDB commands are `print', `output', and `call'.  In
`gdbtk' only, there's a corresponding `gdb_eval' command.

Example
.......

In the following example, the numbers that precede the commands are the
"tokens" described in *Note GDB/MI Command Syntax: GDB/MI Command
Syntax.  Notice how GDB/MI returns the same tokens in its output.

     211-data-evaluate-expression A
     211^done,value="1"
     (gdb)
     311-data-evaluate-expression &A
     311^done,value="0xefffeb7c"
     (gdb)
     411-data-evaluate-expression A+3
     411^done,value="4"
     (gdb)
     511-data-evaluate-expression "A + 3"
     511^done,value="4"
     (gdb)

The `-data-list-changed-registers' Command
------------------------------------------

Synopsis
........

      -data-list-changed-registers

   Display a list of the registers that have changed.

GDB Command
...........

GDB doesn't have a direct analog for this command; `gdbtk' has the
corresponding command `gdb_changed_register_list'.

Example
.......

On a PPC MBX board:

     (gdb)
     -exec-continue
     ^running

     (gdb)
     *stopped,reason="breakpoint-hit",disp="keep",bkptno="1",frame={
     func="main",args=[],file="try.c",fullname="/home/foo/bar/try.c",
     line="5"}
     (gdb)
     -data-list-changed-registers
     ^done,changed-registers=["0","1","2","4","5","6","7","8","9",
     "10","11","13","14","15","16","17","18","19","20","21","22","23",
     "24","25","26","27","28","30","31","64","65","66","67","69"]
     (gdb)

The `-data-list-register-names' Command
---------------------------------------

Synopsis
........

      -data-list-register-names [ ( REGNO )+ ]

   Show a list of register names for the current target.  If no
arguments are given, it shows a list of the names of all the registers.
If integer numbers are given as arguments, it will print a list of the
names of the registers corresponding to the arguments.  To ensure
consistency between a register name and its number, the output list may
include empty register names.

GDB Command
...........

GDB does not have a command which corresponds to
`-data-list-register-names'.  In `gdbtk' there is a corresponding
command `gdb_regnames'.

Example
.......

For the PPC MBX board:
     (gdb)
     -data-list-register-names
     ^done,register-names=["r0","r1","r2","r3","r4","r5","r6","r7",
     "r8","r9","r10","r11","r12","r13","r14","r15","r16","r17","r18",
     "r19","r20","r21","r22","r23","r24","r25","r26","r27","r28","r29",
     "r30","r31","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9",
     "f10","f11","f12","f13","f14","f15","f16","f17","f18","f19","f20",
     "f21","f22","f23","f24","f25","f26","f27","f28","f29","f30","f31",
     "", "pc","ps","cr","lr","ctr","xer"]
     (gdb)
     -data-list-register-names 1 2 3
     ^done,register-names=["r1","r2","r3"]
     (gdb)

The `-data-list-register-values' Command
----------------------------------------

Synopsis
........

      -data-list-register-values FMT [ ( REGNO )*]

   Display the registers' contents.  FMT is the format according to
which the registers' contents are to be returned, followed by an
optional list of numbers specifying the registers to display.  A
missing list of numbers indicates that the contents of all the
registers must be returned.

   Allowed formats for FMT are:

`x'
     Hexadecimal

`o'
     Octal

`t'
     Binary

`d'
     Decimal

`r'
     Raw

`N'
     Natural

GDB Command
...........

The corresponding GDB commands are `info reg', `info all-reg', and (in
`gdbtk') `gdb_fetch_registers'.

Example
.......

For a PPC MBX board (note: line breaks are for readability only, they
don't appear in the actual output):

     (gdb)
     -data-list-register-values r 64 65
     ^done,register-values=[{number="64",value="0xfe00a300"},
     {number="65",value="0x00029002"}]
     (gdb)
     -data-list-register-values x
     ^done,register-values=[{number="0",value="0xfe0043c8"},
     {number="1",value="0x3fff88"},{number="2",value="0xfffffffe"},
     {number="3",value="0x0"},{number="4",value="0xa"},
     {number="5",value="0x3fff68"},{number="6",value="0x3fff58"},
     {number="7",value="0xfe011e98"},{number="8",value="0x2"},
     {number="9",value="0xfa202820"},{number="10",value="0xfa202808"},
     {number="11",value="0x1"},{number="12",value="0x0"},
     {number="13",value="0x4544"},{number="14",value="0xffdfffff"},
     {number="15",value="0xffffffff"},{number="16",value="0xfffffeff"},
     {number="17",value="0xefffffed"},{number="18",value="0xfffffffe"},
     {number="19",value="0xffffffff"},{number="20",value="0xffffffff"},
     {number="21",value="0xffffffff"},{number="22",value="0xfffffff7"},
     {number="23",value="0xffffffff"},{number="24",value="0xffffffff"},
     {number="25",value="0xffffffff"},{number="26",value="0xfffffffb"},
     {number="27",value="0xffffffff"},{number="28",value="0xf7bfffff"},
     {number="29",value="0x0"},{number="30",value="0xfe010000"},
     {number="31",value="0x0"},{number="32",value="0x0"},
     {number="33",value="0x0"},{number="34",value="0x0"},
     {number="35",value="0x0"},{number="36",value="0x0"},
     {number="37",value="0x0"},{number="38",value="0x0"},
     {number="39",value="0x0"},{number="40",value="0x0"},
     {number="41",value="0x0"},{number="42",value="0x0"},
     {number="43",value="0x0"},{number="44",value="0x0"},
     {number="45",value="0x0"},{number="46",value="0x0"},
     {number="47",value="0x0"},{number="48",value="0x0"},
     {number="49",value="0x0"},{number="50",value="0x0"},
     {number="51",value="0x0"},{number="52",value="0x0"},
     {number="53",value="0x0"},{number="54",value="0x0"},
     {number="55",value="0x0"},{number="56",value="0x0"},
     {number="57",value="0x0"},{number="58",value="0x0"},
     {number="59",value="0x0"},{number="60",value="0x0"},
     {number="61",value="0x0"},{number="62",value="0x0"},
     {number="63",value="0x0"},{number="64",value="0xfe00a300"},
     {number="65",value="0x29002"},{number="66",value="0x202f04b5"},
     {number="67",value="0xfe0043b0"},{number="68",value="0xfe00b3e4"},
     {number="69",value="0x20002b03"}]
     (gdb)

The `-data-read-memory' Command
-------------------------------

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)


File: gdb.info,  Node: GDB/MI Tracepoint Commands,  Next: GDB/MI Symbol Query,  Prev: GDB/MI Data Manipulation,  Up: GDB/MI

27.15 GDB/MI Tracepoint Commands
================================

The commands defined in this section implement MI support for
tracepoints.  For detailed introduction, see *Note Tracepoints::.

The `-trace-find' Command
-------------------------

Synopsis
........

      -trace-find MODE [PARAMETERS...]

   Find a trace frame using criteria defined by MODE and PARAMETERS.
The following table lists permissible modes and their parameters.  For
details of operation, see *Note tfind::.

`none'
     No parameters are required.  Stops examining trace frames.

`frame-number'
     An integer is required as parameter.  Selects tracepoint frame with
     that index.

`tracepoint-number'
     An integer is required as parameter.  Finds next trace frame that
     corresponds to tracepoint with the specified number.

`pc'
     An address is required as parameter.  Finds next trace frame that
     corresponds to any tracepoint at the specified address.

`pc-inside-range'
     Two addresses are required as parameters.  Finds next trace frame
     that corresponds to a tracepoint at an address inside the
     specified range.  Both bounds are considered to be inside the
     range.

`pc-outside-range'
     Two addresses are required as parameters.  Finds next trace frame
     that corresponds to a tracepoint at an address outside the
     specified range.  Both bounds are considered to be inside the
     range.

`line'
     Line specification is required as parameter.  *Note Specify
     Location::.  Finds next trace frame that corresponds to a
     tracepoint at the specified location.


   If `none' was passed as MODE, the response does not have fields.
Otherwise, the response may have the following fields:

`found'
     This field has either `0' or `1' as the value, depending on
     whether a matching tracepoint was found.

`traceframe'
     The index of the found traceframe.  This field is present iff the
     `found' field has value of `1'.

`tracepoint'
     The index of the found tracepoint.  This field is present iff the
     `found' field has value of `1'.

`frame'
     The information about the frame corresponding to the found trace
     frame.  This field is present only if a trace frame was found.
     *Note GDB/MI Frame Information::, for description of this field.


GDB Command
...........

The corresponding GDB command is `tfind'.

-trace-define-variable
----------------------

Synopsis
........

      -trace-define-variable NAME [ VALUE ]

   Create trace variable NAME if it does not exist.  If VALUE is
specified, sets the initial value of the specified trace variable to
that value.  Note that the NAME should start with the `$' character.

GDB Command
...........

The corresponding GDB command is `tvariable'.

-trace-list-variables
---------------------

Synopsis
........

      -trace-list-variables

   Return a table of all defined trace variables.  Each element of the
table has the following fields:

`name'
     The name of the trace variable.  This field is always present.

`initial'
     The initial value.  This is a 64-bit signed integer.  This field
     is always present.

`current'
     The value the trace variable has at the moment.  This is a 64-bit
     signed integer.  This field is absent iff current value is not
     defined, for example if the trace was never run, or is presently
     running.


GDB Command
...........

The corresponding GDB command is `tvariables'.

Example
.......

     (gdb)
     -trace-list-variables
     ^done,trace-variables={nr_rows="1",nr_cols="3",
     hdr=[{width="15",alignment="-1",col_name="name",colhdr="Name"},
          {width="11",alignment="-1",col_name="initial",colhdr="Initial"},
          {width="11",alignment="-1",col_name="current",colhdr="Current"}],
     body=[variable={name="$trace_timestamp",initial="0"}
           variable={name="$foo",initial="10",current="15"}]}
     (gdb)

-trace-save
-----------

Synopsis
........

      -trace-save [-r ] FILENAME

   Saves the collected trace data to FILENAME.  Without the `-r'
option, the data is downloaded from the target and saved in a local
file.  With the `-r' option the target is asked to perform the save.

GDB Command
...........

The corresponding GDB command is `tsave'.

-trace-start
------------

Synopsis
........

      -trace-start

   Starts a tracing experiments.  The result of this command does not
have any fields.

GDB Command
...........

The corresponding GDB command is `tstart'.

-trace-status
-------------

Synopsis
........

      -trace-status

   Obtains the status of a tracing experiment.  The result may include
the following fields:

`supported'
     May have a value of either `0', when no tracing operations are
     supported, `1', when all tracing operations are supported, or
     `file' when examining trace file.  In the latter case, examining
     of trace frame is possible but new tracing experiement cannot be
     started.  This field is always present.

`running'
     May have a value of either `0' or `1' depending on whether tracing
     experiement is in progress on target.  This field is present if
     `supported' field is not `0'.

`stop-reason'
     Report the reason why the tracing was stopped last time.  This
     field may be absent iff tracing was never stopped on target yet.
     The value of `request' means the tracing was stopped as result of
     the `-trace-stop' command.  The value of `overflow' means the
     tracing buffer is full.  The value of `disconnection' means
     tracing was automatically stopped when GDB has disconnected.  The
     value of `passcount' means tracing was stopped when a tracepoint
     was passed a maximal number of times for that tracepoint.  This
     field is present if `supported' field is not `0'.

`stopping-tracepoint'
     The number of tracepoint whose passcount as exceeded.  This field
     is present iff the `stop-reason' field has the value of
     `passcount'.

`frames'
`frames-created'
     The `frames' field is a count of the total number of trace frames
     in the trace buffer, while `frames-created' is the total created
     during the run, including ones that were discarded, such as when a
     circular trace buffer filled up.  Both fields are optional.

`buffer-size'
`buffer-free'
     These fields tell the current size of the tracing buffer and the
     remaining space.  These fields are optional.

`circular'
     The value of the circular trace buffer flag.  `1' means that the
     trace buffer is circular and old trace frames will be discarded if
     necessary to make room, `0' means that the trace buffer is linear
     and may fill up.

`disconnected'
     The value of the disconnected tracing flag.  `1' means that
     tracing will continue after GDB disconnects, `0' means that the
     trace run will stop.


GDB Command
...........

The corresponding GDB command is `tstatus'.

-trace-stop
-----------

Synopsis
........

      -trace-stop

   Stops a tracing experiment.  The result of this command has the same
fields as `-trace-status', except that the `supported' and `running'
fields are not output.

GDB Command
...........

The corresponding GDB command is `tstop'.


File: gdb.info,  Node: GDB/MI Symbol Query,  Next: GDB/MI File Commands,  Prev: GDB/MI Tracepoint Commands,  Up: GDB/MI

27.16 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.17 GDB/MI File Commands
==========================

This section describes the GDB/MI commands to specify executable file
names and to read in and obtain symbol table information.

The `-file-exec-and-symbols' Command
------------------------------------

Synopsis
........

      -file-exec-and-symbols FILE

   Specify the executable file to be debugged.  This file is the one
from which the symbol table is also read.  If no file is specified, the
command clears the executable and symbol information.  If breakpoints
are set when using this command with no arguments, GDB will produce
error messages.  Otherwise, no output is produced, except a completion
notification.

GDB Command
...........

The corresponding GDB command is `file'.

Example
.......

     (gdb)
     -file-exec-and-symbols /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
     ^done
     (gdb)

The `-file-exec-file' Command
-----------------------------

Synopsis
........

      -file-exec-file FILE

   Specify the executable file to be debugged.  Unlike
`-file-exec-and-symbols', the symbol table is _not_ read from this
file.  If used without argument, GDB clears the information about the
executable file.  No output is produced, except a completion
notification.

GDB Command
...........

The corresponding GDB command is `exec-file'.

Example
.......

     (gdb)
     -file-exec-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
     ^done
     (gdb)

The `-file-list-exec-source-file' Command
-----------------------------------------

Synopsis
........

      -file-list-exec-source-file

   List the line number, the current source file, and the absolute path
to the current source file for the current executable.  The macro
information field has a value of `1' or `0' depending on whether or not
the file includes preprocessor macro information.

GDB Command
...........

The GDB equivalent is `info source'

Example
.......

     (gdb)
     123-file-list-exec-source-file
     123^done,line="1",file="foo.c",fullname="/home/bar/foo.c,macro-info="1"
     (gdb)

The `-file-list-exec-source-files' Command
------------------------------------------

Synopsis
........

      -file-list-exec-source-files

   List the source files for the current executable.

   It will always output the filename, but only when GDB can find the
absolute file name of a source file, will it output the fullname.

GDB Command
...........

The GDB equivalent is `info sources'.  `gdbtk' has an analogous command
`gdb_listfiles'.

Example
.......

     (gdb)
     -file-list-exec-source-files
     ^done,files=[
     {file=foo.c,fullname=/home/foo.c},
     {file=/home/bar.c,fullname=/home/bar.c},
     {file=gdb_could_not_find_fullpath.c}]
     (gdb)

The `-file-symbol-file' Command
-------------------------------

Synopsis
........

      -file-symbol-file FILE

   Read symbol table info from the specified FILE argument.  When used
without arguments, clears GDB's symbol table info.  No output is
produced, except for a completion notification.

GDB Command
...........

The corresponding GDB command is `symbol-file'.

Example
.......

     (gdb)
     -file-symbol-file /kwikemart/marge/ezannoni/TRUNK/mbx/hello.mbx
     ^done
     (gdb)


File: gdb.info,  Node: GDB/MI Target Manipulation,  Next: GDB/MI File Transfer Commands,  Prev: GDB/MI File Commands,  Up: GDB/MI

27.18 GDB/MI Target Manipulation Commands
=========================================

The `-target-attach' Command
----------------------------

Synopsis
........

      -target-attach PID | GID | FILE

   Attach to a process PID or a file FILE outside of GDB, or a thread
group GID.  If attaching to a thread group, the id previously returned
by `-list-thread-groups --available' must be used.

GDB Command
...........

The corresponding GDB command is `attach'.

Example
.......

     (gdb)
     -target-attach 34
     =thread-created,id="1"
     *stopped,thread-id="1",frame={addr="0xb7f7e410",func="bar",args=[]}
     ^done
     (gdb)

The `-target-detach' Command
----------------------------

Synopsis
........

      -target-detach [ PID | GID ]

   Detach from the remote target which normally resumes its execution.
If either PID or GID is specified, detaches from either the specified
process, or specified thread group.  There's no output.

GDB Command
...........

The corresponding GDB command is `detach'.

Example
.......

     (gdb)
     -target-detach
     ^done
     (gdb)

The `-target-disconnect' Command
--------------------------------

Synopsis
........

      -target-disconnect

   Disconnect from the remote target.  There's no output and the target
is generally not resumed.

GDB Command
...........

The corresponding GDB command is `disconnect'.

Example
.......

     (gdb)
     -target-disconnect
     ^done
     (gdb)

The `-target-download' Command
------------------------------

Synopsis
........

      -target-download

   Loads the executable onto the remote target.  It prints out an
update message every half second, which includes the fields:

`section'
     The name of the section.

`section-sent'
     The size of what has been sent so far for that section.

`section-size'
     The size of the section.

`total-sent'
     The total size of what was sent so far (the current and the
     previous sections).

`total-size'
     The size of the overall executable to download.

Each message is sent as status record (*note GDB/MI Output Syntax:
GDB/MI Output Syntax.).

   In addition, it prints the name and size of the sections, as they are
downloaded.  These messages include the following fields:

`section'
     The name of the section.

`section-size'
     The size of the section.

`total-size'
     The size of the overall executable to download.

At the end, a summary is printed.

GDB Command
...........

The corresponding GDB command is `load'.

Example
.......

Note: each status message appears on a single line.  Here the messages
have been broken down so that they can fit onto a page.

     (gdb)
     -target-download
     +download,{section=".text",section-size="6668",total-size="9880"}
     +download,{section=".text",section-sent="512",section-size="6668",
     total-sent="512",total-size="9880"}
     +download,{section=".text",section-sent="1024",section-size="6668",
     total-sent="1024",total-size="9880"}
     +download,{section=".text",section-sent="1536",section-size="6668",
     total-sent="1536",total-size="9880"}
     +download,{section=".text",section-sent="2048",section-size="6668",
     total-sent="2048",total-size="9880"}
     +download,{section=".text",section-sent="2560",section-size="6668",
     total-sent="2560",total-size="9880"}
     +download,{section=".text",section-sent="3072",section-size="6668",
     total-sent="3072",total-size="9880"}
     +download,{section=".text",section-sent="3584",section-size="6668",
     total-sent="3584",total-size="9880"}
     +download,{section=".text",section-sent="4096",section-size="6668",
     total-sent="4096",total-size="9880"}
     +download,{section=".text",section-sent="4608",section-size="6668",
     total-sent="4608",total-size="9880"}
     +download,{section=".text",section-sent="5120",section-size="6668",
     total-sent="5120",total-size="9880"}
     +download,{section=".text",section-sent="5632",section-size="6668",
     total-sent="5632",total-size="9880"}
     +download,{section=".text",section-sent="6144",section-size="6668",
     total-sent="6144",total-size="9880"}
     +download,{section=".text",section-sent="6656",section-size="6668",
     total-sent="6656",total-size="9880"}
     +download,{section=".init",section-size="28",total-size="9880"}
     +download,{section=".fini",section-size="28",total-size="9880"}
     +download,{section=".data",section-size="3156",total-size="9880"}
     +download,{section=".data",section-sent="512",section-size="3156",
     total-sent="7236",total-size="9880"}
     +download,{section=".data",section-sent="1024",section-size="3156",
     total-sent="7748",total-size="9880"}
     +download,{section=".data",section-sent="1536",section-size="3156",
     total-sent="8260",total-size="9880"}
     +download,{section=".data",section-sent="2048",section-size="3156",
     total-sent="8772",total-size="9880"}
     +download,{section=".data",section-sent="2560",section-size="3156",
     total-sent="9284",total-size="9880"}
     +download,{section=".data",section-sent="3072",section-size="3156",
     total-sent="9796",total-size="9880"}
     ^done,address="0x10004",load-size="9880",transfer-rate="6586",
     write-rate="429"
     (gdb)

GDB Command
...........

No equivalent.

Example
.......

N.A.

The `-target-select' Command
----------------------------

Synopsis
........

      -target-select TYPE PARAMETERS ...

   Connect GDB to the remote target.  This command takes two args:

`TYPE'
     The type of target, for instance `remote', etc.

`PARAMETERS'
     Device names, host names and the like.  *Note Commands for
     Managing Targets: Target Commands, for more details.

   The output is a connection notification, followed by the address at
which the target program is, in the following form:

     ^connected,addr="ADDRESS",func="FUNCTION NAME",
       args=[ARG LIST]

GDB Command
...........

The corresponding GDB command is `target'.

Example
.......

     (gdb)
     -target-select remote /dev/ttya
     ^connected,addr="0xfe00a300",func="??",args=[]
     (gdb)


File: gdb.info,  Node: GDB/MI File Transfer Commands,  Next: GDB/MI Miscellaneous Commands,  Prev: GDB/MI Target Manipulation,  Up: GDB/MI

27.19 GDB/MI File Transfer Commands
===================================

The `-target-file-put' Command
------------------------------

Synopsis
........

      -target-file-put HOSTFILE TARGETFILE

   Copy file HOSTFILE from the host system (the machine running GDB) to
TARGETFILE on the target system.

GDB Command
...........

The corresponding GDB command is `remote put'.

Example
.......

     (gdb)
     -target-file-put localfile remotefile
     ^done
     (gdb)

The `-target-file-get' Command
------------------------------

Synopsis
........

      -target-file-get TARGETFILE HOSTFILE

   Copy file TARGETFILE from the target system to HOSTFILE on the host
system.

GDB Command
...........

The corresponding GDB command is `remote get'.

Example
.......

     (gdb)
     -target-file-get remotefile localfile
     ^done
     (gdb)

The `-target-file-delete' Command
---------------------------------

Synopsis
........

      -target-file-delete TARGETFILE

   Delete TARGETFILE from the target system.

GDB Command
...........

The corresponding GDB command is `remote delete'.

Example
.......

     (gdb)
     -target-file-delete remotefile
     ^done
     (gdb)


File: gdb.info,  Node: GDB/MI Miscellaneous Commands,  Prev: GDB/MI File Transfer Commands,  Up: GDB/MI

27.20 Miscellaneous GDB/MI Commands
===================================

The `-gdb-exit' Command
-----------------------

Synopsis
........

      -gdb-exit

   Exit GDB immediately.

GDB Command
...........

Approximately corresponds to `quit'.

Example
.......

     (gdb)
     -gdb-exit
     ^exit

The `-gdb-set' Command
----------------------

Synopsis
........

      -gdb-set

   Set an internal GDB variable.

GDB Command
...........

The corresponding GDB command is `set'.

Example
.......

     (gdb)
     -gdb-set $foo=3
     ^done
     (gdb)

The `-gdb-show' Command
-----------------------

Synopsis
........

      -gdb-show

   Show the current value of a GDB variable.

GDB Command
...........

The corresponding GDB command is `show'.

Example
.......

     (gdb)
     -gdb-show annotate
     ^done,value="0"
     (gdb)

The `-gdb-version' Command
--------------------------

Synopsis
........

      -gdb-version

   Show version information for GDB.  Used mostly in testing.

GDB Command
...........

The GDB equivalent is `show version'.  GDB by default shows this
information when you start an interactive session.

Example
.......

     (gdb)
     -gdb-version
     ~GNU gdb 5.2.1
     ~Copyright 2000 Free Software Foundation, Inc.
     ~GDB is free software, covered by the GNU General Public License, and
     ~you are welcome to change it and/or distribute copies of it under
     ~ certain conditions.
     ~Type "show copying" to see the conditions.
     ~There is absolutely no warranty for GDB.  Type "show warranty" for
     ~ details.
     ~This GDB was configured as
      "--host=sparc-sun-solaris2.5.1 --target=ppc-eabi".
     ^done
     (gdb)

The `-list-features' Command
----------------------------

Returns a list of particular features of the MI protocol that this
version of gdb implements.  A feature can be a command, or a new field
in an output of some command, or even an important bugfix.  While a
frontend can sometimes detect presence of a feature at runtime, it is
easier to perform detection at debugger startup.

   The command returns a list of strings, with each string naming an
available feature.  Each returned string is just a name, it does not
have any internal structure.  The list of possible feature names is
given below.

   Example output:

     (gdb) -list-features
     ^done,result=["feature1","feature2"]

   The current list of features is:

`frozen-varobjs'
     Indicates presence of the `-var-set-frozen' command, as well as
     possible presense of the `frozen' field in the output of
     `-varobj-create'.

`pending-breakpoints'
     Indicates presence of the `-f' option to the `-break-insert'
     command.

`python'
     Indicates presence of 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 presence of the `-thread-info' command.


The `-list-target-features' Command
-----------------------------------

Returns a list of particular features that are supported by the target.
Those features affect the permitted MI commands, but unlike the
features reported by the `-list-features' command, the features depend
on which target GDB is using at the moment.  Whenever a target can
change, due to commands such as `-target-select', `-target-attach' or
`-exec-run', the list of target features may change, and the frontend
should obtain it again.  Example output:

     (gdb) -list-features
     ^done,result=["async"]

   The current list of features is:

`async'
     Indicates that the target is capable of asynchronous command
     execution, which means that GDB will accept further commands while
     the target is running.

`reverse'
     Indicates that the target is capable of reverse execution.  *Note
     Reverse Execution::, for more information.


The `-list-thread-groups' Command
---------------------------------

Synopsis
--------

     -list-thread-groups [ --available ] [ --recurse 1 ] [ GROUP ... ]

   Lists thread groups (*note Thread groups::).  When a single thread
group is passed as the argument, lists the children of that group.
When several thread group are passed, lists information about those
thread groups.  Without any parameters, lists information about all
top-level thread groups.

   Normally, thread groups that are being debugged are reported.  With
the `--available' option, GDB reports thread groups available on the
target.

   The output of this command may have either a `threads' result or a
`groups' result.  The `thread' result has a list of tuples as value,
with each tuple describing a thread (*note GDB/MI Thread
Information::).  The `groups' result has a list of tuples as value,
each tuple describing a thread group.  If top-level groups are
requested (that is, no parameter is passed), or when several groups are
passed, the output always has a `groups' result.  The format of the
`group' result is described below.

   To reduce the number of roundtrips it's possible to list thread
groups together with their children, by passing the `--recurse' option
and the recursion depth.  Presently, only recursion depth of 1 is
permitted.  If this option is present, then every reported thread group
will also include its children, either as `group' or `threads' field.

   In general, any combination of option and parameters is permitted,
with the following caveats:

   * When a single thread group is passed, the output will typically be
     the `threads' result.  Because threads may not contain anything,
     the `recurse' option will be ignored.

   * When the `--available' option is passed, limited information may
     be available.  In particular, the list of threads of a process
     might be inaccessible.  Further, specifying specific thread groups
     might not give any performance advantage over listing all thread
     groups.  The frontend should assume that `-list-thread-groups
     --available' is always an expensive operation and cache the
     results.


   The `groups' result is a list of tuples, where each tuple may have
the following fields:

`id'
     Identifier of the thread group.  This field is always present.
     The identifier is an opaque string; frontends should not try to
     convert it to an integer, even though it might look like one.

`type'
     The type of the thread group.  At present, only `process' is a
     valid type.

`pid'
     The target-specific process identifier.  This field is only present
     for thread groups of type `process' and only if the process exists.

`num_children'
     The number of children this thread group has.  This field may be
     absent for an available thread group.

`threads'
     This field has a list of tuples as value, each tuple describing a
     thread.  It may be present if the `--recurse' option is specified,
     and it's actually possible to obtain the threads.

`cores'
     This field is a list of integers, each identifying a core that one
     thread of the group is running on.  This field may be absent if
     such information is not available.

`executable'
     The name of the executable file that corresponds to this thread
     group.  The field is only present for thread groups of type
     `process', and only if there is a corresponding executable file.


Example
-------

     gdb
     -list-thread-groups
     ^done,groups=[{id="17",type="process",pid="yyy",num_children="2"}]
     -list-thread-groups 17
     ^done,threads=[{id="2",target-id="Thread 0xb7e14b90 (LWP 21257)",
        frame={level="0",addr="0xffffe410",func="__kernel_vsyscall",args=[]},state="running"},
     {id="1",target-id="Thread 0xb7e156b0 (LWP 21254)",
        frame={level="0",addr="0x0804891f",func="foo",args=[{name="i",value="10"}],
                file="/tmp/a.c",fullname="/tmp/a.c",line="158"},state="running"}]]
     -list-thread-groups --available
     ^done,groups=[{id="17",type="process",pid="yyy",num_children="2",cores=[1,2]}]
     -list-thread-groups --available --recurse 1
      ^done,groups=[{id="17", types="process",pid="yyy",num_children="2",cores=[1,2],
                     threads=[{id="1",target-id="Thread 0xb7e14b90",cores=[1]},
                              {id="2",target-id="Thread 0xb7e14b90",cores=[2]}]},..]
     -list-thread-groups --available --recurse 1 17 18
     ^done,groups=[{id="17", types="process",pid="yyy",num_children="2",cores=[1,2],
                    threads=[{id="1",target-id="Thread 0xb7e14b90",cores=[1]},
                             {id="2",target-id="Thread 0xb7e14b90",cores=[2]}]},...]

The `-add-inferior' Command
---------------------------

Synopsis
--------

     -add-inferior

   Creates a new inferior (*note Inferiors and Programs::).  The created
inferior is not associated with any executable.  Such association may
be established with the `-file-exec-and-symbols' command (*note GDB/MI
File Commands::).  The command response has a single field,
`thread-group', whose value is the identifier of the thread group
corresponding to the new inferior.

Example
-------

     gdb
     -add-inferior
     ^done,thread-group="i3"

The `-interpreter-exec' Command
-------------------------------

Synopsis
--------

     -interpreter-exec INTERPRETER COMMAND

   Execute the specified COMMAND in the given INTERPRETER.

GDB Command
-----------

The corresponding GDB command is `interpreter-exec'.

Example
-------

     (gdb)
     -interpreter-exec console "break main"
     &"During symbol reading, couldn't parse type; debugger out of date?.\n"
     &"During symbol reading, bad structure-type format.\n"
     ~"Breakpoint 1 at 0x8074fc6: file ../../src/gdb/main.c, line 743.\n"
     ^done
     (gdb)

The `-inferior-tty-set' Command
-------------------------------

Synopsis
--------

     -inferior-tty-set /dev/pts/1

   Set terminal for future runs of the program being debugged.

GDB Command
-----------

The corresponding GDB command is `set inferior-tty' /dev/pts/1.

Example
-------

     (gdb)
     -inferior-tty-set /dev/pts/1
     ^done
     (gdb)

The `-inferior-tty-show' Command
--------------------------------

Synopsis
--------

     -inferior-tty-show

   Show terminal for future runs of program being debugged.

GDB Command
-----------

The corresponding GDB command is `show inferior-tty'.

Example
-------

     (gdb)
     -inferior-tty-set /dev/pts/1
     ^done
     (gdb)
     -inferior-tty-show
     ^done,inferior_tty_terminal="/dev/pts/1"
     (gdb)

The `-enable-timings' Command
-----------------------------

Synopsis
--------

     -enable-timings [yes | no]

   Toggle the printing of the wallclock, user and system times for an MI
command as a field in its output.  This command is to help frontend
developers optimize the performance of their code.  No argument is
equivalent to `yes'.

GDB Command
-----------

No equivalent.

Example
-------

     (gdb)
     -enable-timings
     ^done
     (gdb)
     -break-insert main
     ^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",
     addr="0x080484ed",func="main",file="myprog.c",
     fullname="/home/nickrob/myprog.c",line="73",times="0"},
     time={wallclock="0.05185",user="0.00800",system="0.00000"}
     (gdb)
     -enable-timings no
     ^done
     (gdb)
     -exec-run
     ^running
     (gdb)
     *stopped,reason="breakpoint-hit",disp="keep",bkptno="1",thread-id="0",
     frame={addr="0x080484ed",func="main",args=[{name="argc",value="1"},
     {name="argv",value="0xbfb60364"}],file="myprog.c",
     fullname="/home/nickrob/myprog.c",line="73"}
     (gdb)


File: gdb.info,  Node: Annotations,  Next: JIT Interface,  Prev: GDB/MI,  Up: Top

28 GDB Annotations
******************

This chapter describes annotations in GDB.  Annotations were designed
to interface GDB to graphical user interfaces or other similar programs
which want to interact with GDB at a relatively high level.

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

* Menu:

* Annotations Overview::  What annotations are; the general syntax.
* Server Prefix::       Issuing a command without affecting user state.
* Prompting::           Annotations marking GDB's need for input.
* Errors::              Annotations for error messages.
* Invalidation::        Some annotations describe things now invalid.
* Annotations for Running::
                        Whether the program is running, how it stopped, etc.
* Source Annotations::  Annotations describing source code.


File: gdb.info,  Node: Annotations Overview,  Next: Server Prefix,  Up: Annotations

28.1 What is an Annotation?
===========================

Annotations start with a newline character, two `control-z' characters,
and the name of the annotation.  If there is no additional information
associated with this annotation, the name of the annotation is followed
immediately by a newline.  If there is additional information, the name
of the annotation is followed by a space, the additional information,
and a newline.  The additional information cannot contain newline
characters.

   Any output not beginning with a newline and two `control-z'
characters denotes literal output from GDB.  Currently there is no need
for GDB to output a newline followed by two `control-z' characters, but
if there was such a need, the annotations could be extended with an
`escape' annotation which means those three characters as output.

   The annotation LEVEL, which is specified using the `--annotate'
command line option (*note Mode Options::), controls how much
information GDB prints together with its prompt, values of expressions,
source lines, and other types of output.  Level 0 is for no
annotations, level 1 is for use when GDB is run as a subprocess of GNU
Emacs, level 3 is the maximum annotation suitable for programs that
control GDB, and level 2 annotations have been made obsolete (*note
Limitations of the Annotation Interface: (annotate)Limitations.).

`set annotate LEVEL'
     The GDB command `set annotate' sets the level of annotations to
     the specified LEVEL.

`show annotate'
     Show the current annotation level.

   This chapter describes level 3 annotations.

   A simple example of starting up GDB with annotations is:

     $ gdb --annotate=3
     GNU gdb 6.0
     Copyright 2003 Free Software Foundation, Inc.
     GDB is free software, covered by the GNU General Public License,
     and you are welcome to change it and/or distribute copies of it
     under certain conditions.
     Type "show copying" to see the conditions.
     There is absolutely no warranty for GDB.  Type "show warranty"
     for details.
     This GDB was configured as "i386-pc-linux-gnu"

     ^Z^Zpre-prompt
     (gdb)
     ^Z^Zprompt
     quit

     ^Z^Zpost-prompt
     $

   Here `quit' is input to GDB; the rest is output from GDB.  The three
lines beginning `^Z^Z' (where `^Z' denotes a `control-z' character) are
annotations; the rest is output from GDB.


File: gdb.info,  Node: Server Prefix,  Next: Prompting,  Prev: Annotations Overview,  Up: Annotations

28.2 The Server Prefix
======================

If you prefix a command with `server ' then it will not affect the
command history, nor will it affect GDB's notion of which command to
repeat if <RET> is pressed on a line by itself.  This means that
commands can be run behind a user's back by a front-end in a
transparent manner.

   The `server ' prefix does not affect the recording of values into
the value history; to print a value without recording it into the value
history, use the `output' command instead of the `print' command.

   Using this prefix also disables confirmation requests (*note
confirmation requests::).


File: gdb.info,  Node: Prompting,  Next: Errors,  Prev: Server Prefix,  Up: Annotations

28.3 Annotation for GDB Input
=============================

When GDB prompts for input, it annotates this fact so it is possible to
know when to send output, when the output from a given command is over,
etc.

   Different kinds of input each have a different "input type".  Each
input type has three annotations: a `pre-' annotation, which denotes
the beginning of any prompt which is being output, a plain annotation,
which denotes the end of the prompt, and then a `post-' annotation
which denotes the end of any echo which may (or may not) be associated
with the input.  For example, the `prompt' input type features the
following annotations:

     ^Z^Zpre-prompt
     ^Z^Zprompt
     ^Z^Zpost-prompt

   The input types are

`prompt'
     When GDB is prompting for a command (the main GDB prompt).

`commands'
     When GDB prompts for a set of commands, like in the `commands'
     command.  The annotations are repeated for each command which is
     input.

`overload-choice'
     When GDB wants the user to select between various overloaded
     functions.

`query'
     When GDB wants the user to confirm a potentially dangerous
     operation.

`prompt-for-continue'
     When GDB is asking the user to press return to continue.  Note:
     Don't expect this to work well; instead use `set height 0' to
     disable prompting.  This is because the counting of lines is buggy
     in the presence of annotations.


File: gdb.info,  Node: Errors,  Next: Invalidation,  Prev: Prompting,  Up: Annotations

28.4 Errors
===========

     ^Z^Zquit

   This annotation occurs right before GDB responds to an interrupt.

     ^Z^Zerror

   This annotation occurs right before GDB responds to an error.

   Quit and error annotations indicate that any annotations which GDB
was in the middle of may end abruptly.  For example, if a
`value-history-begin' annotation is followed by a `error', one cannot
expect to receive the matching `value-history-end'.  One cannot expect
not to receive it either, however; an error annotation does not
necessarily mean that GDB is immediately returning all the way to the
top level.

   A quit or error annotation may be preceded by

     ^Z^Zerror-begin

   Any output between that and the quit or error annotation is the error
message.

   Warning messages are not yet annotated.


File: gdb.info,  Node: Invalidation,  Next: Annotations for Running,  Prev: Errors,  Up: Annotations

28.5 Invalidation Notices
=========================

The following annotations say that certain pieces of state may have
changed.

`^Z^Zframes-invalid'
     The frames (for example, output from the `backtrace' command) may
     have changed.

`^Z^Zbreakpoints-invalid'
     The breakpoints may have changed.  For example, the user just
     added or deleted a breakpoint.


File: gdb.info,  Node: Annotations for Running,  Next: Source Annotations,  Prev: Invalidation,  Up: Annotations

28.6 Running the Program
========================

When the program starts executing due to a GDB command such as `step'
or `continue',

     ^Z^Zstarting

   is output.  When the program stops,

     ^Z^Zstopped

   is output.  Before the `stopped' annotation, a variety of
annotations describe how the program stopped.

`^Z^Zexited EXIT-STATUS'
     The program exited, and EXIT-STATUS is the exit status (zero for
     successful exit, otherwise nonzero).

`^Z^Zsignalled'
     The program exited with a signal.  After the `^Z^Zsignalled', the
     annotation continues:

          INTRO-TEXT
          ^Z^Zsignal-name
          NAME
          ^Z^Zsignal-name-end
          MIDDLE-TEXT
          ^Z^Zsignal-string
          STRING
          ^Z^Zsignal-string-end
          END-TEXT

     where NAME is the name of the signal, such as `SIGILL' or
     `SIGSEGV', and STRING is the explanation of the signal, such as
     `Illegal Instruction' or `Segmentation fault'.  INTRO-TEXT,
     MIDDLE-TEXT, and END-TEXT are for the user's benefit and have no
     particular format.

`^Z^Zsignal'
     The syntax of this annotation is just like `signalled', but GDB is
     just saying that the program received the signal, not that it was
     terminated with it.

`^Z^Zbreakpoint NUMBER'
     The program hit breakpoint number NUMBER.

`^Z^Zwatchpoint NUMBER'
     The program hit watchpoint number NUMBER.


File: gdb.info,  Node: Source Annotations,  Prev: Annotations for Running,  Up: Annotations

28.7 Displaying Source
======================

The following annotation is used instead of displaying source code:

     ^Z^Zsource FILENAME:LINE:CHARACTER:MIDDLE:ADDR

   where FILENAME is an absolute file name indicating which source
file, LINE is the line number within that file (where 1 is the first
line in the file), CHARACTER is the character position within the file
(where 0 is the first character in the file) (for most debug formats
this will necessarily point to the beginning of a line), MIDDLE is
`middle' if ADDR is in the middle of the line, or `beg' if ADDR is at
the beginning of the line, and ADDR is the address in the target
program associated with the source which is being displayed.  ADDR is
in the form `0x' followed by one or more lowercase hex digits (note
that this does not depend on the language).


File: gdb.info,  Node: JIT Interface,  Next: GDB Bugs,  Prev: Annotations,  Up: Top

29 JIT Compilation Interface
****************************

This chapter documents GDB's "just-in-time" (JIT) compilation
interface.  A JIT compiler is a program or library that generates native
executable code at runtime and executes it, usually in order to achieve
good performance while maintaining platform independence.

   Programs that use JIT compilation are normally difficult to debug
because portions of their code are generated at runtime, instead of
being loaded from object files, which is where GDB normally finds the
program's symbols and debug information.  In order to debug programs
that use JIT compilation, GDB has an interface that allows the program
to register in-memory symbol files with GDB at runtime.

   If you are using GDB to debug a program that uses this interface,
then it should work transparently so long as you have not stripped the
binary.  If you are developing a JIT compiler, then the interface is
documented in the rest of this chapter.  At this time, the only known
client of this interface is the LLVM JIT.

   Broadly speaking, the JIT interface mirrors the dynamic loader
interface.  The JIT compiler communicates with GDB by writing data into
a global variable and calling a fuction at a well-known symbol.  When
GDB attaches, it reads a linked list of symbol files from the global
variable to find existing code, and puts a breakpoint in the function
so that it can find out about additional code.

* Menu:

* Declarations::                Relevant C struct declarations
* Registering Code::            Steps to register code
* Unregistering Code::          Steps to unregister code


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,  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: GDB Bugs,  Next: Command Line Editing,  Prev: JIT Interface,  Up: Top

30 Reporting Bugs in GDB
************************

Your bug reports play an essential role in making GDB reliable.

   Reporting a bug may help you by bringing a solution to your problem,
or it may not.  But in any case the principal function of a bug report
is to help the entire community by making the next version of GDB work
better.  Bug reports are your contribution to the maintenance of GDB.

   In order for a bug report to serve its purpose, you must include the
information that enables us to fix the bug.

* Menu:

* Bug Criteria::                Have you found a bug?
* Bug Reporting::               How to report bugs


File: gdb.info,  Node: Bug Criteria,  Next: Bug Reporting,  Up: GDB Bugs

30.1 Have You Found a Bug?
==========================

If you are not sure whether you have found a bug, here are some
guidelines:

   * If the debugger gets a fatal signal, for any input whatever, that
     is a GDB bug.  Reliable debuggers never crash.

   * If GDB produces an error message for valid input, that is a bug.
     (Note that if you're cross debugging, the problem may also be
     somewhere in the connection to the target.)

   * If GDB does not produce an error message for invalid input, that
     is a bug.  However, you should note that your idea of "invalid
     input" might be our idea of "an extension" or "support for
     traditional practice".

   * If you are an experienced user of debugging tools, your suggestions
     for improvement of GDB are welcome in any case.


File: gdb.info,  Node: Bug Reporting,  Prev: Bug Criteria,  Up: GDB Bugs

30.2 How to Report Bugs
=======================

A number of companies and individuals offer support for GNU products.
If you obtained GDB from a support organization, we recommend you
contact that organization first.

   You can find contact information for many support companies and
individuals in the file `etc/SERVICE' in the GNU Emacs distribution.

   In any event, we also recommend that you submit bug reports for GDB.
The preferred method is to submit them directly using GDB's Bugs web
page (http://www.gnu.org/software/gdb/bugs/).  Alternatively, the
e-mail gateway <bug-gdb@gnu.org> can be used.

   *Do not send bug reports to `info-gdb', or to `help-gdb', or to any
newsgroups.*  Most users of GDB do not want to receive bug reports.
Those that do have arranged to receive `bug-gdb'.

   The mailing list `bug-gdb' has a newsgroup `gnu.gdb.bug' which
serves as a repeater.  The mailing list and the newsgroup carry exactly
the same messages.  Often people think of posting bug reports to the
newsgroup instead of mailing them.  This appears to work, but it has one
problem which can be crucial: a newsgroup posting often lacks a mail
path back to the sender.  Thus, if we need to ask for more information,
we may be unable to reach you.  For this reason, it is better to send
bug reports to the mailing list.

   The fundamental principle of reporting bugs usefully is this:
*report all the facts*.  If you are not sure whether to state a fact or
leave it out, state it!

   Often people omit facts because they think they know what causes the
problem and assume that some details do not matter.  Thus, you might
assume that the name of the variable you use in an example does not
matter.  Well, probably it does not, but one cannot be sure.  Perhaps
the bug is a stray memory reference which happens to fetch from the
location where that name is stored in memory; perhaps, if the name were
different, the contents of that location would fool the debugger into
doing the right thing despite the bug.  Play it safe and give a
specific, complete example.  That is the easiest thing for you to do,
and the most helpful.

   Keep in mind that the purpose of a bug report is to enable us to fix
the bug.  It may be that the bug has been reported previously, but
neither you nor we can know that unless your bug report is complete and
self-contained.

   Sometimes people give a few sketchy facts and ask, "Does this ring a
bell?"  Those bug reports are useless, and we urge everyone to _refuse
to respond to them_ except to chide the sender to report bugs properly.

   To enable us to fix the bug, you should include all these things:

   * The version of GDB.  GDB announces it if you start with no
     arguments; you can also print it at any time using `show version'.

     Without this, we will not know whether there is any point in
     looking for the bug in the current version of GDB.

   * The type of machine you are using, and the operating system name
     and version number.

   * What compiler (and its version) was used to compile GDB--e.g.
     "gcc-2.8.1".

   * What compiler (and its version) was used to compile the program
     you are debugging--e.g.  "gcc-2.8.1", or "HP92453-01 A.10.32.03 HP
     C Compiler".  For GCC, you can say `gcc --version' to get this
     information; for other compilers, see the documentation for those
     compilers.

   * The command arguments you gave the compiler to compile your
     example and observe the bug.  For example, did you use `-O'?  To
     guarantee you will not omit something important, list them all.  A
     copy of the Makefile (or the output from make) is sufficient.

     If we were to try to guess the arguments, we would probably guess
     wrong and then we might not encounter the bug.

   * A complete input script, and all necessary source files, that will
     reproduce the bug.

   * A description of what behavior you observe that you believe is
     incorrect.  For example, "It gets a fatal signal."

     Of course, if the bug is that GDB gets a fatal signal, then we
     will certainly notice it.  But if the bug is incorrect output, we
     might not notice unless it is glaringly wrong.  You might as well
     not give us a chance to make a mistake.

     Even if the problem you experience is a fatal signal, you should
     still say so explicitly.  Suppose something strange is going on,
     such as, your copy of GDB is out of synch, or you have encountered
     a bug in the C library on your system.  (This has happened!)  Your
     copy might crash and ours would not.  If you told us to expect a
     crash, then when ours fails to crash, we would know that the bug
     was not happening for us.  If you had not told us to expect a
     crash, then we would not be able to draw any conclusion from our
     observations.

     To collect all this information, you can use a session recording
     program such as `script', which is available on many Unix systems.
     Just run your GDB session inside `script' and then include the
     `typescript' file with your bug report.

     Another way to record a GDB session is to run GDB inside Emacs and
     then save the entire buffer to a file.

   * If you wish to suggest changes to the GDB source, send us context
     diffs.  If you even discuss something in the GDB source, refer to
     it by context, not by line number.

     The line numbers in our development sources will not match those
     in your sources.  Your line numbers would convey no useful
     information to us.


   Here are some things that are not necessary:

   * A description of the envelope of the bug.

     Often people who encounter a bug spend a lot of time investigating
     which changes to the input file will make the bug go away and which
     changes will not affect it.

     This is often time consuming and not very useful, because the way
     we will find the bug is by running a single example under the
     debugger with breakpoints, not by pure deduction from a series of
     examples.  We recommend that you save your time for something else.

     Of course, if you can find a simpler example to report _instead_
     of the original one, that is a convenience for us.  Errors in the
     output will be easier to spot, running under the debugger will take
     less time, and so on.

     However, simplification is not vital; if you do not want to do
     this, report the bug anyway and send us the entire test case you
     used.

   * A patch for the bug.

     A patch for the bug does help us if it is a good one.  But do not
     omit the necessary information, such as the test case, on the
     assumption that a patch is all we need.  We might see problems
     with your patch and decide to fix the problem another way, or we
     might not understand it at all.

     Sometimes with a program as complicated as GDB it is very hard to
     construct an example that will make the program follow a certain
     path through the code.  If you do not send us the example, we will
     not be able to construct one, so we will not be able to verify
     that the bug is fixed.

     And if we cannot understand what bug you are trying to fix, or why
     your patch should be an improvement, we will not install it.  A
     test case will help us to understand.

   * A guess about what the bug is or what it depends on.

     Such guesses are usually wrong.  Even we cannot guess right about
     such things without first using the debugger to find the facts.


File: gdb.info,  Node: Command Line Editing,  Next: Using History Interactively,  Prev: GDB Bugs,  Up: Top

31 Command Line Editing
***********************

This chapter describes the basic features of the GNU command line
editing interface.

* Menu:

* Introduction and Notation::	Notation used in this text.
* Readline Interaction::	The minimum set of commands for editing a line.
* Readline Init File::		Customizing Readline from a user's view.
* Bindable Readline Commands::	A description of most of the Readline commands
				available for binding
* Readline vi Mode::		A short description of how to make Readline
				behave like the vi editor.


File: gdb.info,  Node: Introduction and Notation,  Next: Readline Interaction,  Up: Command Line Editing

31.1 Introduction to Line Editing
=================================

The following paragraphs describe the notation used to represent
keystrokes.

   The text `C-k' is read as `Control-K' and describes the character
produced when the <k> key is pressed while the Control key is depressed.

   The text `M-k' is read as `Meta-K' and describes the character
produced when the Meta key (if you have one) is depressed, and the <k>
key is pressed.  The Meta key is labeled <ALT> on many keyboards.  On
keyboards with two keys labeled <ALT> (usually to either side of the
space bar), the <ALT> on the left side is generally set to work as a
Meta key.  The <ALT> key on the right may also be configured to work as
a Meta key or may be configured as some other modifier, such as a
Compose key for typing accented characters.

   If you do not have a Meta or <ALT> key, or another key working as a
Meta key, the identical keystroke can be generated by typing <ESC>
_first_, and then typing <k>.  Either process is known as "metafying"
the <k> key.

   The text `M-C-k' is read as `Meta-Control-k' and describes the
character produced by "metafying" `C-k'.

   In addition, several keys have their own names.  Specifically,
<DEL>, <ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves
when seen in this text, or in an init file (*note Readline Init File::).
If your keyboard lacks a <LFD> key, typing <C-j> will produce the
desired character.  The <RET> key may be labeled <Return> or <Enter> on
some keyboards.


File: gdb.info,  Node: Readline Interaction,  Next: Readline Init File,  Prev: Introduction and Notation,  Up: Command Line Editing

31.2 Readline Interaction
=========================

Often during an interactive session you type in a long line of text,
only to notice that the first word on the line is misspelled.  The
Readline library gives you a set of commands for manipulating the text
as you type it in, allowing you to just fix your typo, and not forcing
you to retype the majority of the line.  Using these editing commands,
you move the cursor to the place that needs correction, and delete or
insert the text of the corrections.  Then, when you are satisfied with
the line, you simply press <RET>.  You do not have to be at the end of
the line to press <RET>; the entire line is accepted regardless of the
location of the cursor within the line.

* Menu:

* Readline Bare Essentials::	The least you need to know about Readline.
* Readline Movement Commands::	Moving about the input line.
* Readline Killing Commands::	How to delete text, and how to get it back!
* Readline Arguments::		Giving numeric arguments to commands.
* Searching::			Searching through previous lines.


File: gdb.info,  Node: Readline Bare Essentials,  Next: Readline Movement Commands,  Up: Readline Interaction

31.2.1 Readline Bare Essentials
-------------------------------

In order to enter characters into the line, simply type them.  The typed
character appears where the cursor was, and then the cursor moves one
space to the right.  If you mistype a character, you can use your erase
character to back up and delete the mistyped character.

   Sometimes you may mistype a character, and not notice the error
until you have typed several other characters.  In that case, you can
type `C-b' to move the cursor to the left, and then correct your
mistake.  Afterwards, you can move the cursor to the right with `C-f'.

   When you add text in the middle of a line, you will notice that
characters to the right of the cursor are `pushed over' to make room
for the text that you have inserted.  Likewise, when you delete text
behind the cursor, characters to the right of the cursor are `pulled
back' to fill in the blank space created by the removal of the text.  A
list of the bare essentials for editing the text of an input line
follows.

`C-b'
     Move back one character.

`C-f'
     Move forward one character.

<DEL> or <Backspace>
     Delete the character to the left of the cursor.

`C-d'
     Delete the character underneath the cursor.

Printing characters
     Insert the character into the line at the cursor.

`C-_' or `C-x C-u'
     Undo the last editing command.  You can undo all the way back to an
     empty line.

(Depending on your configuration, the <Backspace> key be set to delete
the character to the left of the cursor and the <DEL> key set to delete
the character underneath the cursor, like `C-d', rather than the
character to the left of the cursor.)


File: gdb.info,  Node: Readline Movement Commands,  Next: Readline Killing Commands,  Prev: Readline Bare Essentials,  Up: Readline Interaction

31.2.2 Readline Movement Commands
---------------------------------

The above table describes the most basic keystrokes that you need in
order to do editing of the input line.  For your convenience, many
other commands have been added in addition to `C-b', `C-f', `C-d', and
<DEL>.  Here are some commands for moving more rapidly about the line.

`C-a'
     Move to the start of the line.

`C-e'
     Move to the end of the line.

`M-f'
     Move forward a word, where a word is composed of letters and
     digits.

`M-b'
     Move backward a word.

`C-l'
     Clear the screen, reprinting the current line at the top.

   Notice how `C-f' moves forward a character, while `M-f' moves
forward a word.  It is a loose convention that control keystrokes
operate on characters while meta keystrokes operate on words.


File: gdb.info,  Node: Readline Killing Commands,  Next: Readline Arguments,  Prev: Readline Movement Commands,  Up: Readline Interaction

31.2.3 Readline Killing Commands
--------------------------------

"Killing" text means to delete the text from the line, but to save it
away for later use, usually by "yanking" (re-inserting) it back into
the line.  (`Cut' and `paste' are more recent jargon for `kill' and
`yank'.)

   If the description for a command says that it `kills' text, then you
can be sure that you can get the text back in a different (or the same)
place later.

   When you use a kill command, the text is saved in a "kill-ring".
Any number of consecutive kills save all of the killed text together, so
that when you yank it back, you get it all.  The kill ring is not line
specific; the text that you killed on a previously typed line is
available to be yanked back later, when you are typing another line.  

   Here is the list of commands for killing text.

`C-k'
     Kill the text from the current cursor position to the end of the
     line.

`M-d'
     Kill from the cursor to the end of the current word, or, if between
     words, to the end of the next word.  Word boundaries are the same
     as those used by `M-f'.

`M-<DEL>'
     Kill from the cursor the start of the current word, or, if between
     words, to the start of the previous word.  Word boundaries are the
     same as those used by `M-b'.

`C-w'
     Kill from the cursor to the previous whitespace.  This is
     different than `M-<DEL>' because the word boundaries differ.


   Here is how to "yank" the text back into the line.  Yanking means to
copy the most-recently-killed text from the kill buffer.

`C-y'
     Yank the most recently killed text back into the buffer at the
     cursor.

`M-y'
     Rotate the kill-ring, and yank the new top.  You can only do this
     if the prior command is `C-y' or `M-y'.


File: gdb.info,  Node: Readline Arguments,  Next: Searching,  Prev: Readline Killing Commands,  Up: Readline Interaction

31.2.4 Readline Arguments
-------------------------

You can pass numeric arguments to Readline commands.  Sometimes the
argument acts as a repeat count, other times it is the sign of the
argument that is significant.  If you pass a negative argument to a
command which normally acts in a forward direction, that command will
act in a backward direction.  For example, to kill text back to the
start of the line, you might type `M-- C-k'.

   The general way to pass numeric arguments to a command is to type
meta digits before the command.  If the first `digit' typed is a minus
sign (`-'), then the sign of the argument will be negative.  Once you
have typed one meta digit to get the argument started, you can type the
remainder of the digits, and then the command.  For example, to give
the `C-d' command an argument of 10, you could type `M-1 0 C-d', which
will delete the next ten characters on the input line.


File: gdb.info,  Node: Searching,  Prev: Readline Arguments,  Up: Readline Interaction

31.2.5 Searching for Commands in the History
--------------------------------------------

Readline provides commands for searching through the command history
for lines containing a specified string.  There are two search modes:
"incremental" and "non-incremental".

   Incremental searches begin before the user has finished typing the
search string.  As each character of the search string is typed,
Readline displays the next entry from the history matching the string
typed so far.  An incremental search requires only as many characters
as needed to find the desired history entry.  To search backward in the
history for a particular string, type `C-r'.  Typing `C-s' searches
forward through the history.  The characters present in the value of
the `isearch-terminators' variable are used to terminate an incremental
search.  If that variable has not been assigned a value, the <ESC> and
`C-J' characters will terminate an incremental search.  `C-g' will
abort an incremental search and restore the original line.  When the
search is terminated, the history entry containing the search string
becomes the current line.

   To find other matching entries in the history list, type `C-r' or
`C-s' as appropriate.  This will search backward or forward in the
history for the next entry matching the search string typed so far.
Any other key sequence bound to a Readline command will terminate the
search and execute that command.  For instance, a <RET> will terminate
the search and accept the line, thereby executing the command from the
history list.  A movement command will terminate the search, make the
last line found the current line, and begin editing.

   Readline remembers the last incremental search string.  If two
`C-r's are typed without any intervening characters defining a new
search string, any remembered search string is used.

   Non-incremental searches read the entire search string before
starting to search for matching history lines.  The search string may be
typed by the user or be part of the contents of the current line.


File: gdb.info,  Node: Readline Init File,  Next: Bindable Readline Commands,  Prev: Readline Interaction,  Up: Command Line Editing

31.3 Readline Init File
=======================

Although the Readline library comes with a set of Emacs-like
keybindings installed by default, it is possible to use a different set
of keybindings.  Any user can customize programs that use Readline by
putting commands in an "inputrc" file, conventionally in his home
directory.  The name of this file is taken from the value of the
environment variable `INPUTRC'.  If that variable is unset, the default
is `~/.inputrc'.

   When a program which uses the Readline library starts up, the init
file is read, and the key bindings are set.

   In addition, the `C-x C-r' command re-reads this init file, thus
incorporating any changes that you might have made to it.

* Menu:

* Readline Init File Syntax::	Syntax for the commands in the inputrc file.

* Conditional Init Constructs::	Conditional key bindings in the inputrc file.

* Sample Init File::		An example inputrc file.


File: gdb.info,  Node: Readline Init File Syntax,  Next: Conditional Init Constructs,  Up: Readline Init File

31.3.1 Readline Init File Syntax
--------------------------------

There are only a few basic constructs allowed in the Readline init
file.  Blank lines are ignored.  Lines beginning with a `#' are
comments.  Lines beginning with a `$' indicate conditional constructs
(*note Conditional Init Constructs::).  Other lines denote variable
settings and key bindings.

Variable Settings
     You can modify the run-time behavior of Readline by altering the
     values of variables in Readline using the `set' command within the
     init file.  The syntax is simple:

          set VARIABLE VALUE

     Here, for example, is how to change from the default Emacs-like
     key binding to use `vi' line editing commands:

          set editing-mode vi

     Variable names and values, where appropriate, are recognized
     without regard to case.  Unrecognized variable names are ignored.

     Boolean variables (those that can be set to on or off) are set to
     on if the value is null or empty, ON (case-insensitive), or 1.
     Any other value results in the variable being set to off.

     A great deal of run-time behavior is changeable with the following
     variables.

    `bell-style'
          Controls what happens when Readline wants to ring the
          terminal bell.  If set to `none', Readline never rings the
          bell.  If set to `visible', Readline uses a visible bell if
          one is available.  If set to `audible' (the default),
          Readline attempts to ring the terminal's bell.

    `bind-tty-special-chars'
          If set to `on', Readline attempts to bind the control
          characters treated specially by the kernel's terminal driver
          to their Readline equivalents.

    `comment-begin'
          The string to insert at the beginning of the line when the
          `insert-comment' command is executed.  The default value is
          `"#"'.

    `completion-ignore-case'
          If set to `on', Readline performs filename matching and
          completion in a case-insensitive fashion.  The default value
          is `off'.

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

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

    `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 point at
          the same location on each history line retrieved with
          `previous-history' or `next-history'.  The default is `off'.

    `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, unless the leading `.' is
          supplied by the user in the filename to be completed.  This
          variable is `on' by default.

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

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

    `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.  The name of the key
     can be expressed in different ways, depending on what you find most
     comfortable.

     In addition to command names, readline allows keys to be bound to
     a string that is inserted when the key is pressed (a MACRO).

    KEYNAME: FUNCTION-NAME or MACRO
          KEYNAME is the name of a key spelled out in English.  For
          example:
               Control-u: universal-argument
               Meta-Rubout: backward-kill-word
               Control-o: "> output"

          In the above example, `C-u' is bound to the function
          `universal-argument', `M-DEL' is bound to the function
          `backward-kill-word', and `C-o' is bound to run the macro
          expressed on the right hand side (that is, to insert the text
          `> output' into the line).

          A number of symbolic character names are recognized while
          processing this key binding syntax: DEL, ESC, ESCAPE, LFD,
          NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB.

    "KEYSEQ": FUNCTION-NAME or MACRO
          KEYSEQ differs from KEYNAME above in that strings denoting an
          entire key sequence can be specified, by placing the key
          sequence in double quotes.  Some GNU Emacs style key escapes
          can be used, as in the following example, but the special
          character names are not recognized.

               "\C-u": universal-argument
               "\C-x\C-r": re-read-init-file
               "\e[11~": "Function Key 1"

          In the above example, `C-u' is again bound to the function
          `universal-argument' (just as it was in the first example),
          `C-x C-r' is bound to the function `re-read-init-file', and
          `<ESC> <[> <1> <1> <~>' is bound to insert the text `Function
          Key 1'.


     The following GNU Emacs style escape sequences are available when
     specifying key sequences:

    `\C-'
          control prefix

    `\M-'
          meta prefix

    `\e'
          an escape character

    `\\'
          backslash

    `\"'
          <">, a double quotation mark

    `\''
          <'>, a single quote or apostrophe

     In addition to the GNU Emacs style escape sequences, a second set
     of backslash escapes is available:

    `\a'
          alert (bell)

    `\b'
          backspace

    `\d'
          delete

    `\f'
          form feed

    `\n'
          newline

    `\r'
          carriage return

    `\t'
          horizontal tab

    `\v'
          vertical tab

    `\NNN'
          the eight-bit character whose value is the octal value NNN
          (one to three digits)

    `\xHH'
          the eight-bit character whose value is the hexadecimal value
          HH (one or two hex digits)

     When entering the text of a macro, single or double quotes must be
     used to indicate a macro definition.  Unquoted text is assumed to
     be a function name.  In the macro body, the backslash escapes
     described above are expanded.  Backslash will quote any other
     character in the macro text, including `"' and `''.  For example,
     the following binding will make `C-x \' insert a single `\' into
     the line:
          "\C-x\\": "\\"



File: gdb.info,  Node: Conditional Init Constructs,  Next: Sample Init File,  Prev: Readline Init File Syntax,  Up: Readline Init File

31.3.2 Conditional Init Constructs
----------------------------------

Readline implements a facility similar in spirit to the conditional
compilation features of the C preprocessor which allows key bindings
and variable settings to be performed as the result of tests.  There
are four parser directives used.

`$if'
     The `$if' construct allows bindings to be made based on the
     editing mode, the terminal being used, or the application using
     Readline.  The text of the test extends to the end of the line; no
     characters are required to isolate it.

    `mode'
          The `mode=' form of the `$if' directive is used to test
          whether Readline is in `emacs' or `vi' mode.  This may be
          used in conjunction with the `set keymap' command, for
          instance, to set bindings in the `emacs-standard' and
          `emacs-ctlx' keymaps only if Readline is starting out in
          `emacs' mode.

    `term'
          The `term=' form may be used to include terminal-specific key
          bindings, perhaps to bind the key sequences output by the
          terminal's function keys.  The word on the right side of the
          `=' is tested against both the full name of the terminal and
          the portion of the terminal name before the first `-'.  This
          allows `sun' to match both `sun' and `sun-cmd', for instance.

    `application'
          The APPLICATION construct is used to include
          application-specific settings.  Each program using the
          Readline library sets the APPLICATION NAME, and you can test
          for a particular value.  This could be used to bind key
          sequences to functions useful for a specific program.  For
          instance, the following command adds a key sequence that
          quotes the current or previous word in Bash:
               $if Bash
               # Quote the current or previous word
               "\C-xq": "\eb\"\ef\""
               $endif

`$endif'
     This command, as seen in the previous example, terminates an `$if'
     command.

`$else'
     Commands in this branch of the `$if' directive are executed if the
     test fails.

`$include'
     This directive takes a single filename as an argument and reads
     commands and bindings from that file.  For example, the following
     directive reads from `/etc/inputrc':
          $include /etc/inputrc


File: gdb.info,  Node: Sample Init File,  Prev: Conditional Init Constructs,  Up: Readline Init File

31.3.3 Sample Init File
-----------------------

Here is an example of an INPUTRC file.  This illustrates key binding,
variable assignment, and conditional syntax.


     # This file controls the behaviour of line input editing for
     # programs that use the GNU Readline library.  Existing
     # programs include FTP, Bash, and GDB.
     #
     # You can re-read the inputrc file with C-x C-r.
     # Lines beginning with '#' are comments.
     #
     # First, include any systemwide bindings and variable
     # assignments from /etc/Inputrc
     $include /etc/Inputrc

     #
     # Set various bindings for emacs mode.

     set editing-mode emacs

     $if mode=emacs

     Meta-Control-h:	backward-kill-word	Text after the function name is ignored

     #
     # Arrow keys in keypad mode
     #
     #"\M-OD":        backward-char
     #"\M-OC":        forward-char
     #"\M-OA":        previous-history
     #"\M-OB":        next-history
     #
     # Arrow keys in ANSI mode
     #
     "\M-[D":        backward-char
     "\M-[C":        forward-char
     "\M-[A":        previous-history
     "\M-[B":        next-history
     #
     # Arrow keys in 8 bit keypad mode
     #
     #"\M-\C-OD":       backward-char
     #"\M-\C-OC":       forward-char
     #"\M-\C-OA":       previous-history
     #"\M-\C-OB":       next-history
     #
     # Arrow keys in 8 bit ANSI mode
     #
     #"\M-\C-[D":       backward-char
     #"\M-\C-[C":       forward-char
     #"\M-\C-[A":       previous-history
     #"\M-\C-[B":       next-history

     C-q: quoted-insert

     $endif

     # An old-style binding.  This happens to be the default.
     TAB: complete

     # Macros that are convenient for shell interaction
     $if Bash
     # edit the path
     "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
     # prepare to type a quoted word --
     # insert open and close double quotes
     # and move to just after the open quote
     "\C-x\"": "\"\"\C-b"
     # insert a backslash (testing backslash escapes
     # in sequences and macros)
     "\C-x\\": "\\"
     # Quote the current or previous word
     "\C-xq": "\eb\"\ef\""
     # Add a binding to refresh the line, which is unbound
     "\C-xr": redraw-current-line
     # Edit variable on current line.
     "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
     $endif

     # use a visible bell if one is available
     set bell-style visible

     # don't strip characters to 7 bits when reading
     set input-meta on

     # allow iso-latin1 characters to be inserted rather
     # than converted to prefix-meta sequences
     set convert-meta off

     # display characters with the eighth bit set directly
     # rather than as meta-prefixed characters
     set output-meta on

     # if there are more than 150 possible completions for
     # a word, ask the user if he wants to see all of them
     set completion-query-items 150

     # For FTP
     $if Ftp
     "\C-xg": "get \M-?"
     "\C-xt": "put \M-?"
     "\M-.": yank-last-arg
     $endif


File: gdb.info,  Node: Bindable Readline Commands,  Next: Readline vi Mode,  Prev: Readline Init File,  Up: Command Line Editing

31.4 Bindable Readline Commands
===============================

* Menu:

* Commands For Moving::		Moving about the line.
* Commands For History::	Getting at previous lines.
* Commands For Text::		Commands for changing text.
* Commands For Killing::	Commands for killing and yanking.
* Numeric Arguments::		Specifying numeric arguments, repeat counts.
* Commands For Completion::	Getting Readline to do the typing for you.
* Keyboard Macros::		Saving and re-executing typed characters
* Miscellaneous Commands::	Other miscellaneous commands.

   This section describes Readline commands that may be bound to key
sequences.  Command names without an accompanying key sequence are
unbound by default.

   In the following descriptions, "point" refers to the current cursor
position, and "mark" refers to a cursor position saved by the
`set-mark' command.  The text between the point and mark is referred to
as the "region".


File: gdb.info,  Node: Commands For Moving,  Next: Commands For History,  Up: Bindable Readline Commands

31.4.1 Commands For Moving
--------------------------

`beginning-of-line (C-a)'
     Move to the start of the current line.

`end-of-line (C-e)'
     Move to the end of the line.

`forward-char (C-f)'
     Move forward a character.

`backward-char (C-b)'
     Move back a character.

`forward-word (M-f)'
     Move forward to the end of the next word.  Words are composed of
     letters and digits.

`backward-word (M-b)'
     Move back to the start of the current or previous word.  Words are
     composed of letters and digits.

`clear-screen (C-l)'
     Clear the screen and redraw the current line, leaving the current
     line at the top of the screen.

`redraw-current-line ()'
     Refresh the current line.  By default, this is unbound.



File: gdb.info,  Node: Commands For History,  Next: Commands For Text,  Prev: Commands For Moving,  Up: Bindable Readline Commands

31.4.2 Commands For Manipulating The History
--------------------------------------------

`accept-line (Newline or Return)'
     Accept the line regardless of where the cursor is.  If this line is
     non-empty, it may be added to the history list for future recall
     with `add_history()'.  If this line is a modified history line,
     the history line is restored to its original state.

`previous-history (C-p)'
     Move `back' through the history list, fetching the previous
     command.

`next-history (C-n)'
     Move `forward' through the history list, fetching the next command.

`beginning-of-history (M-<)'
     Move to the first line in the history.

`end-of-history (M->)'
     Move to the end of the input history, i.e., the line currently
     being entered.

`reverse-search-history (C-r)'
     Search backward starting at the current line and moving `up'
     through the history as necessary.  This is an incremental search.

`forward-search-history (C-s)'
     Search forward starting at the current line and moving `down'
     through the the history as necessary.  This is an incremental
     search.

`non-incremental-reverse-search-history (M-p)'
     Search backward starting at the current line and moving `up'
     through the history as necessary using a non-incremental search
     for a string supplied by the user.

`non-incremental-forward-search-history (M-n)'
     Search forward starting at the current line and moving `down'
     through the the history as necessary using a non-incremental search
     for a string supplied by the user.

`history-search-forward ()'
     Search forward through the history for the string of characters
     between the start of the current line and the point.  This is a
     non-incremental search.  By default, this command is unbound.

`history-search-backward ()'
     Search backward through the history for the string of characters
     between the start of the current line and the point.  This is a
     non-incremental search.  By default, this command is unbound.

`yank-nth-arg (M-C-y)'
     Insert the first argument to the previous command (usually the
     second word on the previous line) at point.  With an argument N,
     insert the Nth word from the previous command (the words in the
     previous command begin with word 0).  A negative argument inserts
     the Nth word from the end of the previous command.  Once the
     argument N is computed, the argument is extracted as if the `!N'
     history expansion had been specified.

`yank-last-arg (M-. or M-_)'
     Insert last argument to the previous command (the last word of the
     previous history entry).  With an argument, behave exactly like
     `yank-nth-arg'.  Successive calls to `yank-last-arg' move back
     through the history list, inserting the last argument of each line
     in turn.  The history expansion facilities are used to extract the
     last argument, as if the `!$' history expansion had been specified.



File: gdb.info,  Node: Commands For Text,  Next: Commands For Killing,  Prev: Commands For History,  Up: Bindable Readline Commands

31.4.3 Commands For Changing Text
---------------------------------

`delete-char (C-d)'
     Delete the character at point.  If point is at the beginning of
     the line, there are no characters in the line, and the last
     character typed was not bound to `delete-char', then return EOF.

`backward-delete-char (Rubout)'
     Delete the character behind the cursor.  A numeric argument means
     to kill the characters instead of deleting them.

`forward-backward-delete-char ()'
     Delete the character under the cursor, unless the cursor is at the
     end of the line, in which case the character behind the cursor is
     deleted.  By default, this is not bound to a key.

`quoted-insert (C-q or C-v)'
     Add the next character typed to the line verbatim.  This is how to
     insert key sequences like `C-q', for example.

`tab-insert (M-<TAB>)'
     Insert a tab character.

`self-insert (a, b, A, 1, !, ...)'
     Insert yourself.

`transpose-chars (C-t)'
     Drag the character before the cursor forward over the character at
     the cursor, moving the cursor forward as well.  If the insertion
     point is at the end of the line, then this transposes the last two
     characters of the line.  Negative arguments have no effect.

`transpose-words (M-t)'
     Drag the word before point past the word after point, moving point
     past that word as well.  If the insertion point is at the end of
     the line, this transposes the last two words on the line.

`upcase-word (M-u)'
     Uppercase the current (or following) word.  With a negative
     argument, uppercase the previous word, but do not move the cursor.

`downcase-word (M-l)'
     Lowercase the current (or following) word.  With a negative
     argument, lowercase the previous word, but do not move the cursor.

`capitalize-word (M-c)'
     Capitalize the current (or following) word.  With a negative
     argument, capitalize the previous word, but do not move the cursor.

`overwrite-mode ()'
     Toggle overwrite mode.  With an explicit positive numeric argument,
     switches to overwrite mode.  With an explicit non-positive numeric
     argument, switches to insert mode.  This command affects only
     `emacs' mode; `vi' mode does overwrite differently.  Each call to
     `readline()' starts in insert mode.

     In overwrite mode, characters bound to `self-insert' replace the
     text at point rather than pushing the text to the right.
     Characters bound to `backward-delete-char' replace the character
     before point with a space.

     By default, this command is unbound.



File: gdb.info,  Node: Commands For Killing,  Next: Numeric Arguments,  Prev: Commands For Text,  Up: Bindable Readline Commands

31.4.4 Killing And Yanking
--------------------------

`kill-line (C-k)'
     Kill the text from point to the end of the line.

`backward-kill-line (C-x Rubout)'
     Kill backward to the beginning of the line.

`unix-line-discard (C-u)'
     Kill backward from the cursor to the beginning of the current line.

`kill-whole-line ()'
     Kill all characters on the current line, no matter where point is.
     By default, this is unbound.

`kill-word (M-d)'
     Kill from point to the end of the current word, or if between
     words, to the end of the next word.  Word boundaries are the same
     as `forward-word'.

`backward-kill-word (M-<DEL>)'
     Kill the word behind point.  Word boundaries are the same as
     `backward-word'.

`unix-word-rubout (C-w)'
     Kill the word behind point, using white space as a word boundary.
     The killed text is saved on the kill-ring.

`unix-filename-rubout ()'
     Kill the word behind point, using white space and the slash
     character as the word boundaries.  The killed text is saved on the
     kill-ring.

`delete-horizontal-space ()'
     Delete all spaces and tabs around point.  By default, this is
     unbound.

`kill-region ()'
     Kill the text in the current region.  By default, this command is
     unbound.

`copy-region-as-kill ()'
     Copy the text in the region to the kill buffer, so it can be yanked
     right away.  By default, this command is unbound.

`copy-backward-word ()'
     Copy the word before point to the kill buffer.  The word
     boundaries are the same as `backward-word'.  By default, this
     command is unbound.

`copy-forward-word ()'
     Copy the word following point to the kill buffer.  The word
     boundaries are the same as `forward-word'.  By default, this
     command is unbound.

`yank (C-y)'
     Yank the top of the kill ring into the buffer at point.

`yank-pop (M-y)'
     Rotate the kill-ring, and yank the new top.  You can only do this
     if the prior command is `yank' or `yank-pop'.


File: gdb.info,  Node: Numeric Arguments,  Next: Commands For Completion,  Prev: Commands For Killing,  Up: Bindable Readline Commands

31.4.5 Specifying Numeric Arguments
-----------------------------------

`digit-argument (M-0, M-1, ... M--)'
     Add this digit to the argument already accumulating, or start a new
     argument.  `M--' starts a negative argument.

`universal-argument ()'
     This is another way to specify an argument.  If this command is
     followed by one or more digits, optionally with a leading minus
     sign, those digits define the argument.  If the command is
     followed by digits, executing `universal-argument' again ends the
     numeric argument, but is otherwise ignored.  As a special case, if
     this command is immediately followed by a character that is
     neither a digit or minus sign, the argument count for the next
     command is multiplied by four.  The argument count is initially
     one, so executing this function the first time makes the argument
     count four, a second time makes the argument count sixteen, and so
     on.  By default, this is not bound to a key.


File: gdb.info,  Node: Commands For Completion,  Next: Keyboard Macros,  Prev: Numeric Arguments,  Up: Bindable Readline Commands

31.4.6 Letting Readline Type For You
------------------------------------

`complete (<TAB>)'
     Attempt to perform completion on the text before point.  The
     actual completion performed is application-specific.  The default
     is filename completion.

`possible-completions (M-?)'
     List the possible completions of the text before point.

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

`delete-char-or-list ()'
     Deletes the character under the cursor if not at the beginning or
     end of the line (like `delete-char').  If at the end of the line,
     behaves identically to `possible-completions'.  This command is
     unbound by default.



File: gdb.info,  Node: Keyboard Macros,  Next: Miscellaneous Commands,  Prev: Commands For Completion,  Up: Bindable Readline Commands

31.4.7 Keyboard Macros
----------------------

`start-kbd-macro (C-x ()'
     Begin saving the characters typed into the current keyboard macro.

`end-kbd-macro (C-x ))'
     Stop saving the characters typed into the current keyboard macro
     and save the definition.

`call-last-kbd-macro (C-x e)'
     Re-execute the last keyboard macro defined, by making the
     characters in the macro appear as if typed at the keyboard.



File: gdb.info,  Node: Miscellaneous Commands,  Prev: Keyboard Macros,  Up: Bindable Readline Commands

31.4.8 Some Miscellaneous Commands
----------------------------------

`re-read-init-file (C-x C-r)'
     Read in the contents of the INPUTRC file, and incorporate any
     bindings or variable assignments found there.

`abort (C-g)'
     Abort the current editing command and ring the terminal's bell
     (subject to the setting of `bell-style').

`do-uppercase-version (M-a, M-b, M-X, ...)'
     If the metafied character X is lowercase, run the command that is
     bound to the corresponding uppercase character.

`prefix-meta (<ESC>)'
     Metafy the next character typed.  This is for keyboards without a
     meta key.  Typing `<ESC> f' is equivalent to typing `M-f'.

`undo (C-_ or C-x C-u)'
     Incremental undo, separately remembered for each line.

`revert-line (M-r)'
     Undo all changes made to this line.  This is like executing the
     `undo' command enough times to get back to the beginning.

`tilde-expand (M-~)'
     Perform tilde expansion on the current word.

`set-mark (C-@)'
     Set the mark to the point.  If a numeric argument is supplied, the
     mark is set to that position.

`exchange-point-and-mark (C-x C-x)'
     Swap the point with the mark.  The current cursor position is set
     to the saved position, and the old cursor position is saved as the
     mark.

`character-search (C-])'
     A character is read and point is moved to the next occurrence of
     that character.  A negative count searches for previous
     occurrences.

`character-search-backward (M-C-])'
     A character is read and point is moved to the previous occurrence
     of that character.  A negative count searches for subsequent
     occurrences.

`insert-comment (M-#)'
     Without a numeric argument, the value of the `comment-begin'
     variable is inserted at the beginning of the current line.  If a
     numeric argument is supplied, this command acts as a toggle:  if
     the characters at the beginning of the line do not match the value
     of `comment-begin', the value is inserted, otherwise the
     characters in `comment-begin' are deleted from the beginning of
     the line.  In either case, the line is accepted as if a newline
     had been typed.

`dump-functions ()'
     Print all of the functions and their key bindings to the Readline
     output stream.  If a numeric argument is supplied, the output is
     formatted in such a way that it can be made part of an INPUTRC
     file.  This command is unbound by default.

`dump-variables ()'
     Print all of the settable variables and their values to the
     Readline output stream.  If a numeric argument is supplied, the
     output is formatted in such a way that it can be made part of an
     INPUTRC file.  This command is unbound by default.

`dump-macros ()'
     Print all of the Readline key sequences bound to macros and the
     strings they output.  If a numeric argument is supplied, the
     output is formatted in such a way that it can be made part of an
     INPUTRC file.  This command is unbound by default.

`emacs-editing-mode (C-e)'
     When in `vi' command mode, this causes a switch to `emacs' editing
     mode.

`vi-editing-mode (M-C-j)'
     When in `emacs' editing mode, this causes a switch to `vi' editing
     mode.



File: gdb.info,  Node: Readline vi Mode,  Prev: Bindable Readline Commands,  Up: Command Line Editing

31.5 Readline vi Mode
=====================

While the Readline library does not have a full set of `vi' editing
functions, it does contain enough to allow simple editing of the line.
The Readline `vi' mode behaves as specified in the POSIX 1003.2
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: Formatting Documentation,  Prev: Command Line Editing,  Up: Top

32 Using History Interactively
******************************

This chapter describes how to use the GNU History Library interactively,
from a user's standpoint.  It should be considered a user's guide.  For
information on using the GNU History Library in other programs, see the
GNU Readline Library Manual.

* Menu:

* History Interaction::		What it feels like using History as a user.


File: gdb.info,  Node: History Interaction,  Up: Using History Interactively

32.1 History Expansion
======================

The History library provides a history expansion feature that is similar
to the history expansion provided by `csh'.  This section describes the
syntax used to manipulate the history information.

   History expansions introduce words from the history list into the
input stream, making it easy to repeat commands, insert the arguments
to a previous command into the current input line, or fix errors in
previous commands quickly.

   History expansion takes place in two parts.  The first is to
determine which line from the history list should be used during
substitution.  The second is to select portions of that line for
inclusion into the current one.  The line selected from the history is
called the "event", and the portions of that line that are acted upon
are called "words".  Various "modifiers" are available to manipulate
the selected words.  The line is broken into words in the same fashion
that Bash does, so that several words surrounded by quotes are
considered one word.  History expansions are introduced by the
appearance of the history expansion character, which is `!' by default.

* Menu:

* Event Designators::	How to specify which history line to use.
* Word Designators::	Specifying which words are of interest.
* Modifiers::		Modifying the results of substitution.


File: gdb.info,  Node: Event Designators,  Next: Word Designators,  Up: History Interaction

32.1.1 Event Designators
------------------------

An event designator is a reference to a command line entry in the
history list.  

`!'
     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 starting with STRING.

`!?STRING[?]'
     Refer to the most recent command containing STRING.  The trailing
     `?' may be omitted if the STRING is followed immediately by a
     newline.

`^STRING1^STRING2^'
     Quick Substitution.  Repeat the last command, replacing STRING1
     with STRING2.  Equivalent to `!!:s/STRING1/STRING2/'.

`!#'
     The entire command line typed so far.



File: gdb.info,  Node: Word Designators,  Next: Modifiers,  Prev: Event Designators,  Up: History Interaction

32.1.2 Word Designators
-----------------------

Word designators are used to select desired words from the event.  A
`:' separates the event specification from the word designator.  It may
be omitted if the word designator begins with a `^', `$', `*', `-', or
`%'.  Words are numbered from the beginning of the line, with the first
word being denoted by 0 (zero).  Words are inserted into the current
line separated by single spaces.

   For example,

`!!'
     designates the preceding command.  When you type this, the
     preceding command is repeated in toto.

`!!:$'
     designates the last argument of the preceding command.  This may be
     shortened to `!$'.

`!fi:2'
     designates the second argument of the most recent command starting
     with the letters `fi'.

   Here are the word designators:

`0 (zero)'
     The `0'th word.  For many applications, this is the command word.

`N'
     The Nth word.

`^'
     The first argument; that is, word 1.

`$'
     The last argument.

`%'
     The word matched by the most recent `?STRING?' search.

`X-Y'
     A range of words; `-Y' abbreviates `0-Y'.

`*'
     All of the words, except the `0'th.  This is a synonym for `1-$'.
     It is not an error to use `*' if there is just one word in the
     event; the empty string is returned in that case.

`X*'
     Abbreviates `X-$'

`X-'
     Abbreviates `X-$' like `X*', but omits the last word.


   If a word designator is supplied without an event specification, the
previous command is used as the event.


File: gdb.info,  Node: Modifiers,  Prev: Word Designators,  Up: History Interaction

32.1.3 Modifiers
----------------

After the optional word designator, you can add a sequence of one or
more of the following modifiers, each preceded by a `:'.

`h'
     Remove a trailing pathname component, leaving only the head.

`t'
     Remove all leading  pathname  components, leaving the tail.

`r'
     Remove a trailing suffix of the form `.SUFFIX', leaving the
     basename.

`e'
     Remove all but the trailing suffix.

`p'
     Print the new command but do not execute it.

`s/OLD/NEW/'
     Substitute NEW for the first occurrence of OLD in the event line.
     Any delimiter may be used in place of `/'.  The delimiter may be
     quoted in OLD and NEW with a single backslash.  If `&' appears in
     NEW, it is replaced by OLD.  A single backslash will quote the
     `&'.  The final delimiter is optional if it is the last character
     on the input line.

`&'
     Repeat the previous substitution.

`g'
`a'
     Cause changes to be applied over the entire event line.  Used in
     conjunction with `s', as in `gs/OLD/NEW/', or with `&'.

`G'
     Apply the following `s' modifier once to each word in the event.



File: gdb.info,  Node: Formatting Documentation,  Next: Installing GDB,  Prev: Using History Interactively,  Up: Top

Appendix A 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.2/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.2', in the case of version 7.2), 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.2/gdb') and type:

     make gdb.dvi

   Then give `gdb.dvi' to your DVI printing program.

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

   (1) In `gdb-7.2/gdb/refcard.ps' of the version 7.2 release.


File: gdb.info,  Node: Installing GDB,  Next: Maintenance Commands,  Prev: Formatting Documentation,  Up: Top

Appendix B 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

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

        * MS-Windows shared libraries (*note Shared Libraries::)

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

     On systems with `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

B.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.2 distribution is in the `gdb-7.2'
directory.  That directory contains:

`gdb-7.2/configure (and supporting files)'
     script for configuring GDB and all its supporting libraries

`gdb-7.2/gdb'
     the source specific to GDB itself

`gdb-7.2/bfd'
     source for the Binary File Descriptor library

`gdb-7.2/include'
     GNU include files

`gdb-7.2/libiberty'
     source for the `-liberty' free software library

`gdb-7.2/opcodes'
     source for the library of opcode tables and disassemblers

`gdb-7.2/readline'
     source for the GNU command-line interface

`gdb-7.2/glob'
     source for the GNU filename pattern-matching subroutine

`gdb-7.2/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.2' 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.2
     ./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.2'
source directory for version 7.2, `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

B.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.2, you can build GDB in a separate
directory for a Sun 4 like this:

     cd gdb-7.2
     mkdir ../gdb-sun4
     cd ../gdb-sun4
     ../gdb-7.2/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.2/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.2' (or in a separate configured directory configured with
`--srcdir=DIRNAME/gdb-7.2'), 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

B.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.2', for version 7.2).


File: gdb.info,  Node: Configure Options,  Next: System-wide configuration,  Prev: Config Names,  Up: Installing GDB

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

B.6 System-wide configuration and settings
==========================================

GDB can be configured to have a system-wide init file; this file will
be read and executed at startup (*note What GDB does during startup:
Startup.).

   Here is the corresponding configure option:

`--with-system-gdbinit=FILE'
     Specify that the default location of the system-wide init file is
     FILE.

   If GDB has been configured with the option `--prefix=$prefix', it
may be subject to relocation.  Two possible cases:

   * If the default location of this init file contains `$prefix', it
     will be subject to relocation.  Suppose that the configure options
     are `--prefix=$prefix --with-system-gdbinit=$prefix/etc/gdbinit';
     if GDB is moved from `$prefix' to `$install', the system init file
     is looked for as `$install/etc/gdbinit' instead of
     `$prefix/etc/gdbinit'.

   * By contrast, if the default location does not contain the prefix,
     it will not be relocated.  E.g. if GDB has been configured with
     `--prefix=/usr/local --with-system-gdbinit=/usr/share/gdb/gdbinit',
     then GDB will always look for `/usr/share/gdb/gdbinit', wherever
     GDB is installed.


File: gdb.info,  Node: Maintenance Commands,  Next: Remote Protocol,  Prev: Installing GDB,  Up: Top

Appendix C Maintenance Commands
*******************************

In addition to commands intended for GDB users, GDB includes a number
of commands intended for GDB developers, that are not documented
elsewhere in this manual.  These commands are provided here for
reference.  (For commands that turn on debugging messages, see *Note
Debugging Output::.)

`maint agent EXPRESSION'
`maint agent-eval EXPRESSION'
     Translate the given EXPRESSION into remote agent bytecodes.  This
     command is useful for debugging the Agent Expression mechanism
     (*note Agent Expressions::).  The `agent' version produces an
     expression useful for data collection, such as by tracepoints,
     while `maint agent-eval' produces an expression that evaluates
     directly to a result.  For instance, a collection expression for
     `globa + globb' will include bytecodes to record four bytes of
     memory at each of the addresses of `globa' and `globb', while
     discarding the result of the addition, while an evaluation
     expression will do the addition and return the sum.

`maint info breakpoints'
     Using the same format as `info breakpoints', display both the
     breakpoints you've set explicitly, and those GDB is using for
     internal purposes.  Internal breakpoints are shown with negative
     breakpoint numbers.  The type column identifies what kind of
     breakpoint is shown:

    `breakpoint'
          Normal, explicitly set breakpoint.

    `watchpoint'
          Normal, explicitly set watchpoint.

    `longjmp'
          Internal breakpoint, used to handle correctly stepping through
          `longjmp' calls.

    `longjmp resume'
          Internal breakpoint at the target of a `longjmp'.

    `until'
          Temporary internal breakpoint used by the GDB `until' command.

    `finish'
          Temporary internal breakpoint used by the GDB `finish'
          command.

    `shlib events'
          Shared library events.


`set displaced-stepping'
`show displaced-stepping'
     Control whether or not GDB will do "displaced stepping" if the
     target supports it.  Displaced stepping is a way to single-step
     over breakpoints without removing them from the inferior, by
     executing an out-of-line copy of the instruction that was
     originally at the breakpoint location.  It is also known as
     out-of-line single-stepping.

    `set displaced-stepping on'
          If the target architecture supports it, GDB will use
          displaced stepping to step over breakpoints.

    `set displaced-stepping off'
          GDB will not use displaced stepping to step over breakpoints,
          even if such is supported by the target architecture.

    `set displaced-stepping auto'
          This is the default mode.  GDB will use displaced stepping
          only if non-stop mode is active (*note Non-Stop Mode::) and
          the target architecture supports displaced stepping.

`maint check-symtabs'
     Check the consistency of psymtabs and symtabs.

`maint cplus first_component NAME'
     Print the first C++ class/namespace component of NAME.

`maint cplus namespace'
     Print the list of possible C++ namespaces.

`maint demangle NAME'
     Demangle a C++ or Objective-C mangled NAME.

`maint deprecate COMMAND [REPLACEMENT]'
`maint undeprecate COMMAND'
     Deprecate or undeprecate the named COMMAND.  Deprecated commands
     cause GDB to issue a warning when you use them.  The optional
     argument REPLACEMENT says which newer command should be used in
     favor of the deprecated one; if it is given, GDB will mention the
     replacement as part of the warning.

`maint dump-me'
     Cause a fatal signal in the debugger and force it to dump its core.
     This is supported only on systems which support aborting a program
     with the `SIGQUIT' signal.

`maint internal-error [MESSAGE-TEXT]'
`maint internal-warning [MESSAGE-TEXT]'
     Cause GDB to call the internal function `internal_error' or
     `internal_warning' and hence behave as though an internal error or
     internal warning has been detected.  In addition to reporting the
     internal problem, these functions give the user the opportunity to
     either quit GDB or create a core file of the current GDB session.

     These commands take an optional parameter MESSAGE-TEXT that is
     used as the text of the error or warning message.

     Here's an example of using `internal-error':

          (gdb) maint internal-error testing, 1, 2
          .../maint.c:121: internal-error: testing, 1, 2
          A problem internal to GDB has been detected.  Further
          debugging may prove unreliable.
          Quit this debugging session? (y or n) n
          Create a core file? (y or n) n
          (gdb)

`maint set internal-error ACTION [ask|yes|no]'
`maint show internal-error ACTION'
`maint set internal-warning ACTION [ask|yes|no]'
`maint show internal-warning ACTION'
     When GDB reports an internal problem (error or warning) it gives
     the user the opportunity to both quit GDB and create a core file
     of the current GDB session.  These commands let you override the
     default behaviour for each particular ACTION, described in the
     table below.

    `quit'
          You can specify that GDB should always (yes) or never (no)
          quit.  The default is to ask the user what to do.

    `corefile'
          You can specify that GDB should always (yes) or never (no)
          create a core file.  The default is to ask the user what to
          do.

`maint packet TEXT'
     If GDB is talking to an inferior via the serial protocol, then
     this command sends the string TEXT to the inferior, and displays
     the response packet.  GDB supplies the initial `$' character, the
     terminating `#' character, and the checksum.

`maint print architecture [FILE]'
     Print the entire architecture configuration.  The optional argument
     FILE names the file where the output goes.

`maint print c-tdesc'
     Print the current target description (*note Target Descriptions::)
     as a C source file.  The created source file can be used in GDB
     when an XML parser is not available to parse the description.

`maint print dummy-frames'
     Prints the contents of GDB's internal dummy-frame stack.

          (gdb) b add
          ...
          (gdb) print add(2,3)
          Breakpoint 2, add (a=2, b=3) at ...
          58	  return (a + b);
          The program being debugged stopped while in a function called from GDB.
          ...
          (gdb) maint print dummy-frames
          0x1a57c80: pc=0x01014068 fp=0x0200bddc sp=0x0200bdd6
           top=0x0200bdd4 id={stack=0x200bddc,code=0x101405c}
           call_lo=0x01014000 call_hi=0x01014001
          (gdb)

     Takes an optional file parameter.

`maint print registers [FILE]'
`maint print raw-registers [FILE]'
`maint print cooked-registers [FILE]'
`maint print register-groups [FILE]'
     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; and the
     command `maint print register-groups' includes the groups that each
     register is a member of.  *Note Registers: (gdbint)Registers.

     These commands take an optional parameter, a file name to which to
     write the information.

`maint print reggroups [FILE]'
     Print GDB's internal register group data structures.  The optional
     argument FILE tells to what file to write the information.

     The register groups info looks like this:

          (gdb) maint print reggroups
           Group      Type
           general    user
           float      user
           all        user
           vector     user
           system     user
           save       internal
           restore    internal

`flushregs'
     This command forces GDB to flush its internal register cache.

`maint print objfiles'
     Print a dump of all known object files.  For each object file, this
     command prints its name, address in memory, and all of its psymtabs
     and symtabs.

`maint print section-scripts [REGEXP]'
     Print a dump of scripts specified in the `.debug_gdb_section'
     section.  If REGEXP is specified, only print scripts loaded by
     object files matching REGEXP.  For each script, this command
     prints its name as specified in the objfile, and the full path if
     known.  *Note .debug_gdb_scripts section::.

`maint print statistics'
     This command prints, for each object file in the program, various
     data about that object file followed by the byte cache ("bcache")
     statistics for the object file.  The objfile data includes the
     number of minimal, partial, full, and stabs symbols, the number of
     types defined by the objfile, the number of as yet unexpanded psym
     tables, the number of line tables and string tables, and the
     amount of memory used by the various tables.  The bcache
     statistics include the counts, sizes, and counts of duplicates of
     all and unique objects, max, average, and median entry size, total
     memory used and its overhead and savings, and various measures of
     the hash table size and chain lengths.

`maint print target-stack'
     A "target" is an interface between the debugger and a particular
     kind of file or process.  Targets can be stacked in "strata", so
     that more than one target can potentially respond to a request.
     In particular, memory accesses will walk down the stack of targets
     until they find a target that is interested in handling that
     particular address.

     This command prints a short description of each layer that was
     pushed on the "target stack", starting from the top layer down to
     the bottom one.

`maint print type EXPR'
     Print the type chain for a type specified by EXPR.  The argument
     can be either a type name or a symbol.  If it is a symbol, the
     type of that symbol is described.  The type chain produced by this
     command is a recursive definition of the data type as stored in
     GDB's data structures, including its flags and contained types.

`maint set dwarf2 always-disassemble'

`maint show dwarf2 always-disassemble'
     Control the behavior of `info address' when using DWARF debugging
     information.

     The default is `off', which means that GDB should try to describe
     a variable's location in an easily readable format.  When `on',
     GDB will instead display the DWARF location expression in an
     assembly-like format.  Note that some locations are too complex
     for GDB to describe simply; in this case you will always see the
     disassembly form.

     Here is an example of the resulting disassembly:

          (gdb) info addr argc
          Symbol "argc" is a complex DWARF expression:
               1: DW_OP_fbreg 0

     For more information on these expressions, see the DWARF standard
     (http://www.dwarfstd.org/).

`maint set dwarf2 max-cache-age'
`maint show dwarf2 max-cache-age'
     Control the DWARF 2 compilation unit cache.

     In object files with inter-compilation-unit references, such as
     those produced by the GCC option `-feliminate-dwarf2-dups', the
     DWARF 2 reader needs to frequently refer to previously read
     compilation units.  This setting controls how long a compilation
     unit will remain in the cache if it is not referenced.  A higher
     limit means that cached compilation units will be stored in memory
     longer, and more total memory will be used.  Setting it to zero
     disables caching, which will slow down GDB startup, but reduce
     memory consumption.

`maint set profile'
`maint show profile'
     Control profiling of GDB.

     Profiling will be disabled until you use the `maint set profile'
     command to enable it.  When you enable profiling, the system will
     begin collecting timing and execution count data; when you disable
     profiling or exit GDB, the results will be written to a log file.
     Remember that if you use profiling, GDB will overwrite the
     profiling log file (often called `gmon.out').  If you have a
     record of important profiling data in a `gmon.out' file, be sure
     to move it to a safe location.

     Configuring with `--enable-profiling' arranges for GDB to be
     compiled with the `-pg' compiler option.

`maint set show-debug-regs'
`maint show show-debug-regs'
     Control whether to show variables that mirror the hardware debug
     registers.  Use `ON' to enable, `OFF' to disable.  If enabled, the
     debug registers values are shown when GDB inserts or removes a
     hardware breakpoint or watchpoint, and when the inferior triggers
     a hardware-assisted breakpoint or watchpoint.

`maint set show-all-tib'
`maint show show-all-tib'
     Control whether to show all non zero areas within a 1k block
     starting at thread local base, when using the `info w32
     thread-information-block' command.

`maint space'
     Control whether to display memory usage for each command.  If set
     to a nonzero value, GDB will display how much memory each command
     took, following the command's own output.  This can also be
     requested by invoking GDB with the `--statistics' command-line
     switch (*note Mode Options::).

`maint time'
     Control whether to display the execution time for each command.  If
     set to a nonzero value, GDB will display how much time it took to
     execute each command, following the command's own output.  The
     time is not printed for the commands that run the target, since
     there's no mechanism currently to compute how much time was spend
     by GDB and how much time was spend by the program been debugged.
     it's not possibly currently This can also be requested by invoking
     GDB with the `--statistics' command-line switch (*note Mode
     Options::).

`maint translate-address [SECTION] ADDR'
     Find the symbol stored at the location specified by the address
     ADDR and an optional section name SECTION.  If found, GDB prints
     the name of the closest symbol and an offset from the symbol's
     location to the specified address.  This is similar to the `info
     address' command (*note Symbols::), except that this command also
     allows to find symbols in other sections.

     If section was not specified, the section in which the symbol was
     found is also printed.  For dynamically linked executables, the
     name of executable or shared library containing the symbol is
     printed as well.


   The following command is useful for non-interactive invocations of
GDB, such as in the test suite.

`set watchdog NSEC'
     Set the maximum number of seconds GDB will wait for the target
     operation to finish.  If this time expires, GDB reports and error
     and the command is aborted.

`show watchdog'
     Show the current setting of the target wait timeout.


File: gdb.info,  Node: Remote Protocol,  Next: Agent Expressions,  Prev: Maintenance Commands,  Up: Top

Appendix D 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::
* Memory Map Format::
* Thread List Format::


File: gdb.info,  Node: Overview,  Next: Packets,  Up: Remote Protocol

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

   A stub is required to support the `g', `G', `m', `M', `c', and `s'
COMMANDs.  All other COMMANDs are optional.


File: gdb.info,  Node: Packets,  Next: Stop Reply Packets,  Prev: Overview,  Up: Remote Protocol

D.2 Packets
===========

The following table provides a complete list of all currently defined
COMMANDs and their corresponding response DATA.  *Note File-I/O Remote
Protocol Extension::, for details about the File I/O extension of the
remote protocol.

   Each packet's description has a template showing the packet's overall
syntax, followed by an explanation of the packet's meaning.  We include
spaces in some of the templates for clarity; these are not part of the
packet's syntax.  No GDB packet uses spaces to separate its components.
For example, a template like `foo BAR BAZ' describes a packet
beginning with the three ASCII bytes `foo', followed by a BAR, followed
directly by a BAZ.  GDB does not transmit a space character between the
`foo' and the BAR, or between the BAR and the BAZ.

   Several packets and replies include a THREAD-ID field to identify a
thread.  Normally these are positive numbers with a target-specific
interpretation, formatted as big-endian hex strings.  A THREAD-ID can
also be a literal `-1' to indicate all threads, or `0' to pick any
thread.

   In addition, the remote protocol supports a multiprocess feature in
which the THREAD-ID syntax is extended to optionally include both
process and thread ID fields, as `pPID.TID'.  The PID (process) and TID
(thread) components each have the format described above: a positive
number with target-specific interpretation formatted as a big-endian
hex string, literal `-1' to indicate all processes or threads
(respectively), or `0' to indicate an arbitrary process or thread.
Specifying just a process, as `pPID', is equivalent to `pPID.-1'.  It
is an error to specify all processes but a specific thread, such as
`p-1.TID'.  Note that the `p' prefix is _not_ used for those packets
and replies explicitly documented to include a process ID, rather than
a THREAD-ID.

   The multiprocess THREAD-ID syntax extensions are only used if both
GDB and the stub report support for the `multiprocess' feature using
`qSupported'.  *Note multiprocess extensions::, for more information.

   Note that all packet forms beginning with an upper- or lower-case
letter, other than those described here, are reserved for future use.

   Here are the packet descriptions.

`!'
     Enable extended mode.  In extended mode, the remote server is made
     persistent.  The `R' packet is used to restart the program being
     debugged.

     Reply:
    `OK'
          The remote target both supports and has enabled extended mode.

`?'
     Indicate the reason the target halted.  The reply is the same as
     for step and continue.  This packet has a special interpretation
     when the target is in non-stop mode; see *Note Remote Non-Stop::.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`A ARGLEN,ARGNUM,ARG,...'
     Initialized `argv[]' array passed into program. ARGLEN specifies
     the number of bytes in the hex encoded byte stream ARG.  See
     `gdbserver' for more details.

     Reply:
    `OK'
          The arguments were set.

    `E NN'
          An error occurred.

`b BAUD'
     (Don't use this packet; its behavior is not well-defined.)  Change
     the serial line speed to BAUD.

     JTC: _When does the transport layer state change?  When it's
     received, or after the ACK is transmitted.  In either case, there
     are problems if the command or the acknowledgment packet is
     dropped._

     Stan: _If people really wanted to add something like this, and get
     it working for the first time, they ought to modify ser-unix.c to
     send some kind of out-of-band message to a specially-setup stub
     and have the switch happen "in between" packets, so that from
     remote protocol's point of view, nothing actually happened._

`B ADDR,MODE'
     Set (MODE is `S') or clear (MODE is `C') a breakpoint at ADDR.

     Don't use this packet.  Use the `Z' and `z' packets instead (*note
     insert breakpoint or watchpoint packet::).

`bc'
     Backward continue.  Execute the target system in reverse.  No
     parameter.  *Note Reverse Execution::, for more information.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`bs'
     Backward single step.  Execute one instruction in reverse.  No
     parameter.  *Note Reverse Execution::, for more information.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`c [ADDR]'
     Continue.  ADDR is address to resume.  If ADDR is omitted, resume
     at current address.

     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.

     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.

    `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 C THREAD-ID'
     Set thread for subsequent operations (`m', `M', `g', `G', et.al.).
     C depends on the operation to be performed: it should be `c' for
     step and continue operations, `g' for other operations.  The
     thread designator THREAD-ID has the format and interpretation
     described in *Note thread-id syntax::.

     Reply:
    `OK'
          for success

    `E NN'
          for an error

`i [ADDR[,NNN]]'
     Step the remote target by a single clock cycle.  If `,NNN' is
     present, cycle step NNN cycles.  If ADDR is present, cycle step
     starting at that address.

`I'
     Signal, then cycle step.  *Note step with signal packet::.  *Note
     cycle step packet::.

`k'
     Kill request.

     FIXME: _There is no description of how to operate when a specific
     thread context has been selected (i.e. does 'k' kill only that
     thread?)_.

`m ADDR,LENGTH'
     Read LENGTH bytes of memory starting at address ADDR.  Note that
     ADDR may not be aligned to any particular boundary.

     The stub need not use any particular size or alignment when
     gathering data from memory for the response; even if ADDR is
     word-aligned and LENGTH is a multiple of the word size, the stub
     is free to use byte accesses, or not.  For this reason, this
     packet may not be suitable for accessing memory-mapped I/O devices.  

     Reply:
    `XX...'
          Memory contents; each byte is transmitted as a two-digit
          hexadecimal number.  The reply may contain fewer bytes than
          requested if the server was able to read only part of the
          region of memory.

    `E NN'
          NN is errno

`M ADDR,LENGTH:XX...'
     Write LENGTH bytes of memory starting at address ADDR.  XX... is
     the data; each byte is transmitted as a two-digit hexadecimal
     number.

     Reply:
    `OK'
          for success

    `E NN'
          for an error (this includes the case where only part of the
          data was written).

`p N'
     Read the value of register N; N is in hex.  *Note read registers
     packet::, for a description of how the returned register value is
     encoded.

     Reply:
    `XX...'
          the register's value

    `E NN'
          for an error

    `'
          Indicating an unrecognized QUERY.

`P N...=R...'
     Write register N... with value R....  The register number N is in
     hexadecimal, and R... contains two hex digits for each byte in the
     register (target byte order).

     Reply:
    `OK'
          for success

    `E NN'
          for an error

`q NAME PARAMS...'
`Q NAME PARAMS...'
     General query (`q') and set (`Q').  These packets are described
     fully in *Note General Query Packets::.

`r'
     Reset the entire system.

     Don't use this packet; use the `R' packet instead.

`R XX'
     Restart the program being debugged.  XX, while needed, is ignored.
     This packet is only available in extended mode (*note extended
     mode::).

     The `R' packet has no reply.

`s [ADDR]'
     Single step.  ADDR is the address at which to resume.  If ADDR is
     omitted, resume at same address.

     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.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`t ADDR:PP,MM'
     Search backwards starting at address ADDR for a match with pattern
     PP and mask MM.  PP and MM are 4 bytes.  ADDR must be at least 3
     digits.

`T THREAD-ID'
     Find out if the thread THREAD-ID is alive.  *Note thread-id
     syntax::.

     Reply:
    `OK'
          thread is still alive

    `E NN'
          thread is dead

`v'
     Packets starting with `v' are identified by a multi-letter name,
     up to the first `;' or `?' (or the end of the packet).

`vAttach;PID'
     Attach to a new process with the specified process ID PID.  The
     process ID is a hexadecimal integer identifying the process.  In
     all-stop mode, all threads in the attached process are stopped; in
     non-stop mode, it may be attached without being stopped if that is
     supported by the target.

     This packet is only available in extended mode (*note extended
     mode::).

     Reply:
    `E NN'
          for an error

    `Any stop packet'
          for success in all-stop mode (*note Stop Reply Packets::)

    `OK'
          for success in non-stop mode (*note Remote Non-Stop::)

`vCont[;ACTION[:THREAD-ID]]...'
     Resume the inferior, specifying different actions for each thread.
     If an action is specified with no THREAD-ID, then it is applied to
     any threads that don't have a specific action specified; if no
     default action is specified then other threads should remain
     stopped in all-stop mode and in their current state in non-stop
     mode.  Specifying multiple default actions is an error; specifying
     no actions is also an error.  Thread IDs are specified using the
     syntax described in *Note thread-id syntax::.

     Currently supported actions are:

    `c'
          Continue.

    `C SIG'
          Continue with signal SIG.  The signal SIG should be two hex
          digits.

    `s'
          Step.

    `S SIG'
          Step with signal SIG.  The signal SIG should be two hex
          digits.

    `t'
          Stop.

     The optional argument ADDR normally associated with the `c', `C',
     `s', and `S' packets is not supported in `vCont'.

     The `t' action is only relevant in non-stop mode (*note Remote
     Non-Stop::) and may be ignored by the stub otherwise.  A stop
     reply should be generated for any affected thread not already
     stopped.  When a thread is stopped by means of a `t' action, the
     corresponding stop reply should indicate that the thread has
     stopped with signal `0', regardless of whether the target uses
     some other signal as an implementation detail.

     Reply: *Note Stop Reply Packets::, for the reply specifications.

`vCont?'
     Request a list of actions supported by the `vCont' packet.

     Reply:
    `vCont[;ACTION...]'
          The `vCont' packet is supported.  Each ACTION is a supported
          command in the `vCont' packet.

    `'
          The `vCont' packet is not supported.

`vFile:OPERATION:PARAMETER...'
     Perform a file operation on the target system.  For details, see
     *Note Host I/O Packets::.

`vFlashErase:ADDR,LENGTH'
     Direct the stub to erase LENGTH bytes of flash starting at ADDR.
     The region may enclose any number of flash blocks, but its start
     and end must fall on block boundaries, as indicated by the flash
     block size appearing in the memory map (*note Memory Map
     Format::).  GDB groups flash memory programming operations
     together, and sends a `vFlashDone' request after each group; the
     stub is allowed to delay erase operation until the `vFlashDone'
     packet is received.

     The stub must support `vCont' if it reports support for
     multiprocess extensions (*note multiprocess extensions::).  Note
     that in this case `vCont' actions can be specified to apply to all
     threads in a process by using the `pPID.-1' form of the THREAD-ID.

     Reply:
    `OK'
          for success

    `E NN'
          for an error

`vFlashWrite:ADDR:XX...'
     Direct the stub to write data to flash address ADDR.  The data is
     passed in binary form using the same encoding as for the `X'
     packet (*note Binary Data::).  The memory ranges specified by
     `vFlashWrite' packets preceding a `vFlashDone' packet must not
     overlap, and must appear in order of increasing addresses
     (although `vFlashErase' packets for higher addresses may already
     have been received; the ordering is guaranteed only between
     `vFlashWrite' packets).  If a packet writes to an address that was
     neither erased by a preceding `vFlashErase' packet nor by some
     other target-specific method, the results are unpredictable.

     Reply:
    `OK'
          for success

    `E.memtype'
          for vFlashWrite addressing non-flash memory

    `E NN'
          for an error

`vFlashDone'
     Indicate to the stub that flash programming operation is finished.
     The stub is permitted to delay or batch the effects of a group of
     `vFlashErase' and `vFlashWrite' packets until a `vFlashDone'
     packet is received.  The contents of the affected regions of flash
     memory are unpredictable until the `vFlashDone' request is
     completed.

`vKill;PID'
     Kill the process with the specified process ID.  PID is a
     hexadecimal integer identifying the process.  This packet is used
     in preference to `k' when multiprocess protocol extensions are
     supported; see *Note multiprocess extensions::.

     Reply:
    `E NN'
          for an error

    `OK'
          for success

`vRun;FILENAME[;ARGUMENT]...'
     Run the program FILENAME, passing it each ARGUMENT on its command
     line.  The file and arguments are hex-encoded strings.  If
     FILENAME is an empty string, the stub may use a default program
     (e.g. the last program run).  The program is created in the stopped
     state.

     This packet is only available in extended mode (*note extended
     mode::).

     Reply:
    `E NN'
          for an error

    `Any stop packet'
          for success (*note Stop Reply Packets::)

`vStopped'
     In non-stop mode (*note Remote Non-Stop::), acknowledge a previous
     stop reply and prompt for the stub to report another one.

     Reply:
    `Any stop packet'
          if there is another unreported stop event (*note Stop Reply
          Packets::)

    `OK'
          if there are no unreported stop events

`X ADDR,LENGTH:XX...'
     Write data to memory, where the data is transmitted in binary.
     ADDR is address, LENGTH is number of bytes, `XX...' is binary data
     (*note Binary Data::).

     Reply:
    `OK'
          for success

    `E NN'
          for an error

`z TYPE,ADDR,KIND'
`Z TYPE,ADDR,KIND'
     Insert (`Z') or remove (`z') a TYPE breakpoint or watchpoint
     starting at address ADDRESS of kind KIND.

     Each breakpoint and watchpoint packet TYPE is documented
     separately.

     _Implementation notes: A remote target shall return an empty string
     for an unrecognized breakpoint or watchpoint packet TYPE.  A
     remote target shall support either both or neither of a given
     `ZTYPE...' and `zTYPE...' packet pair.  To avoid potential
     problems with duplicate packets, the operations should be
     implemented in an idempotent way._

`z0,ADDR,KIND'
`Z0,ADDR,KIND'
     Insert (`Z0') or remove (`z0') a memory breakpoint at address ADDR
     of type KIND.

     A memory breakpoint is implemented by replacing the instruction at
     ADDR with a software breakpoint or trap instruction.  The KIND is
     target-specific and typically indicates the size of the breakpoint
     in bytes that should be inserted.  E.g., the ARM and MIPS can
     insert either a 2 or 4 byte breakpoint.  Some architectures have
     additional meanings for KIND; see *Note Architecture-Specific
     Protocol Details::.

     _Implementation note: It is possible for a target to copy or move
     code that contains memory breakpoints (e.g., when implementing
     overlays).  The behavior of this packet, in the presence of such a
     target, is not defined._

     Reply:
    `OK'
          success

    `'
          not supported

    `E NN'
          for an error

`z1,ADDR,KIND'
`Z1,ADDR,KIND'
     Insert (`Z1') or remove (`z1') a hardware breakpoint at address
     ADDR.

     A hardware breakpoint is implemented using a mechanism that is not
     dependant on being able to modify the target's memory.  KIND has
     the same meaning as in `Z0' packets.

     _Implementation note: A hardware breakpoint is not affected by code
     movement._

     Reply:
    `OK'
          success

    `'
          not supported

    `E NN'
          for an error

`z2,ADDR,KIND'
`Z2,ADDR,KIND'
     Insert (`Z2') or remove (`z2') a write watchpoint at ADDR.  KIND
     is interpreted as the number of bytes to watch.

     Reply:
    `OK'
          success

    `'
          not supported

    `E NN'
          for an error

`z3,ADDR,KIND'
`Z3,ADDR,KIND'
     Insert (`Z3') or remove (`z3') a read watchpoint at ADDR.  KIND is
     interpreted as the number of bytes to watch.

     Reply:
    `OK'
          success

    `'
          not supported

    `E NN'
          for an error

`z4,ADDR,KIND'
`Z4,ADDR,KIND'
     Insert (`Z4') or remove (`z4') an access watchpoint at ADDR.  KIND
     is interpreted as the number of bytes to watch.

     Reply:
    `OK'
          success

    `'
          not supported

    `E NN'
          for an error



File: gdb.info,  Node: Stop Reply Packets,  Next: General Query Packets,  Prev: Packets,  Up: Remote Protocol

D.3 Stop Reply Packets
======================

The `C', `c', `S', `s', `vCont', `vAttach', `vRun', `vStopped', and `?'
packets can receive any of the below as a reply.  Except for `?' and
`vStopped', that reply is only returned when the target halts.  In the
below the exact meaning of "signal number" is defined by the header
`include/gdb/signals.h' in the GDB source code.

   As in the description of request packets, we include spaces in the
reply templates for clarity; these are not part of the reply packet's
syntax.  No GDB stop reply packet uses spaces to separate its
components.

`S AA'
     The program received signal number AA (a two-digit hexadecimal
     number).  This is equivalent to a `T' response with no N:R pairs.

`T AA N1:R1;N2:R2;...'
     The program received signal number AA (a two-digit hexadecimal
     number).  This is equivalent to an `S' response, except that the
     `N:R' pairs can carry values of important registers and other
     information directly in the stop reply packet, reducing round-trip
     latency.  Single-step and breakpoint traps are reported this way.
     Each `N:R' pair is interpreted as follows:

        * If N is a hexadecimal number, it is a register number, and the
          corresponding R gives that register's value.  R is a series
          of bytes in target byte order, with each byte given by a
          two-digit hex number.

        * If N is `thread', then R is the THREAD-ID of the stopped
          thread, as specified in *Note thread-id syntax::.

        * If N is `core', then R is the hexadecimal number of the core
          on which the stop event was detected.

        * If N is a recognized "stop reason", it describes a more
          specific event that stopped the target.  The currently
          defined stop reasons are listed below.  AA should be `05',
          the trap signal.  At most one stop reason should be present.

        * Otherwise, GDB should ignore this `N:R' pair and go on to the
          next; this allows us to extend the protocol in the future.

     The currently defined stop reasons are:

    `watch'
    `rwatch'
    `awatch'
          The packet indicates a watchpoint hit, and R is the data
          address, in hex.

    `library'
          The packet indicates that the loaded libraries have changed.
          GDB should use `qXfer:libraries:read' to fetch a new list of
          loaded libraries.  R is ignored.

    `replaylog'
          The packet indicates that the target cannot continue replaying
          logged execution events, because it has reached the end (or
          the beginning when executing backward) of the log.  The value
          of R will be either `begin' or `end'.  *Note Reverse
          Execution::, for more information.

`W AA'
`W AA ; process:PID'
     The process exited, and AA is the exit status.  This is only
     applicable to certain targets.

     The second form of the response, including the process ID of the
     exited process, can be used only when GDB has reported support for
     multiprocess protocol extensions; see *Note multiprocess
     extensions::.  The PID is formatted as a big-endian hex string.

`X AA'
`X AA ; process:PID'
     The process terminated with signal AA.

     The second form of the response, including the process ID of the
     terminated process, can be used only when GDB has reported support
     for multiprocess protocol extensions; see *Note multiprocess
     extensions::.  The PID is formatted as a big-endian hex string.

`O XX...'
     `XX...' is hex encoding of ASCII data, to be written as the
     program's console output.  This can happen at any time while the
     program is running and the debugger should continue to wait for
     `W', `T', etc.  This reply is not permitted in non-stop mode.

`F CALL-ID,PARAMETER...'
     CALL-ID is the identifier which says which host system call should
     be called.  This is just the name of the function.  Translation
     into the correct system call is only applicable as it's defined in
     GDB.  *Note File-I/O Remote Protocol Extension::, for a list of
     implemented system calls.

     `PARAMETER...' is a list of parameters as defined for this very
     system call.

     The target replies with this packet when it expects GDB to call a
     host system call on behalf of the target.  GDB replies with an
     appropriate `F' packet and keeps up waiting for the next reply
     packet from the target.  The latest `C', `c', `S' or `s' action is
     expected to be continued.  *Note File-I/O Remote Protocol
     Extension::, for more details.



File: gdb.info,  Node: General Query Packets,  Next: Architecture-Specific Protocol Details,  Prev: Stop Reply Packets,  Up: Remote Protocol

D.4 General Query Packets
=========================

Packets starting with `q' are "general query packets"; packets starting
with `Q' are "general set packets".  General query and set packets are
a semi-unified form for retrieving and sending information to and from
the stub.

   The initial letter of a query or set packet is followed by a name
indicating what sort of thing the packet applies to.  For example, GDB
may use a `qSymbol' packet to exchange symbol definitions with the
stub.  These packet names follow some conventions:

   * The name must not contain commas, colons or semicolons.

   * Most GDB query and set packets have a leading upper case letter.

   * The names of custom vendor packets should use a company prefix, in
     lower case, followed by a period.  For example, packets designed at
     the Acme Corporation might begin with `qacme.foo' (for querying
     foos) or `Qacme.bar' (for setting bars).

   The name of a query or set packet should be separated from any
parameters by a `:'; the parameters themselves should be separated by
`,' or `;'.  Stubs must be careful to match the full packet name, and
check for a separator or the end of the packet, in case two packet
names share a common prefix.  New packets should not begin with `qC',
`qP', or `qL'(1).

   Like the descriptions of the other packets, each description here
has a template showing the packet's overall syntax, followed by an
explanation of the packet's meaning.  We include spaces in some of the
templates for clarity; these are not part of the packet's syntax.  No
GDB packet uses spaces to separate its components.

   Here are the currently defined query and set packets:

`QAllow:OP:VAL...'
     Specify which operations GDB expects to request of the target, as
     a semicolon-separated list of operation name and value pairs.
     Possible values for OP include `WriteReg', `WriteMem',
     `InsertBreak', `InsertTrace', `InsertFastTrace', and `Stop'. VAL
     is either 0, indicating that GDB will not request the operation,
     or 1, indicating that it may.  (The target can then use this to
     set up its own internals optimally, for instance if the debugger
     never expects to insert breakpoints, it may not need to install
     its own trap handler.)

`qC'
     Return the current thread ID.

     Reply:
    `QC THREAD-ID'
          Where THREAD-ID is a thread ID as documented in *Note
          thread-id syntax::.

    `(anything else)'
          Any other reply implies the old thread ID.

`qCRC:ADDR,LENGTH'
     Compute the CRC checksum of a block of memory using CRC-32 defined
     in IEEE 802.3.  The CRC is computed byte at a time, taking the most
     significant bit of each byte first.  The initial pattern code
     `0xffffffff' is used to ensure leading zeros affect the CRC.

     _Note:_ This is the same CRC used in validating separate debug
     files (*note Debugging Information in Separate Files: Separate
     Debug Files.).  However the algorithm is slightly different.  When
     validating separate debug files, the CRC is computed taking the
     _least_ significant bit of each byte first, and the final result
     is inverted to detect trailing zeros.

     Reply:
    `E NN'
          An error (such as memory fault)

    `C CRC32'
          The specified memory region's checksum is CRC32.

`qfThreadInfo'
`qsThreadInfo'
     Obtain a list of all active thread IDs from the target (OS).
     Since there may be too many active threads to fit into one reply
     packet, this query works iteratively: it may require more than one
     query/reply sequence to obtain the entire list of threads.  The
     first query of the sequence will be the `qfThreadInfo' query;
     subsequent queries in the sequence will be the `qsThreadInfo'
     query.

     NOTE: This packet replaces the `qL' query (see below).

     Reply:
    `m THREAD-ID'
          A single thread ID

    `m THREAD-ID,THREAD-ID...'
          a comma-separated list of thread IDs

    `l'
          (lower case letter `L') denotes end of list.

     In response to each query, the target will reply with a list of
     one or more thread IDs, separated by commas.  GDB will respond to
     each reply with a request for more thread ids (using the `qs' form
     of the query), until the target responds with `l' (lower-case ell,
     for "last").  Refer to *Note thread-id syntax::, for the format of
     the THREAD-ID fields.

`qGetTLSAddr:THREAD-ID,OFFSET,LM'
     Fetch the address associated with thread local storage specified
     by THREAD-ID, OFFSET, and LM.

     THREAD-ID is the thread ID associated with the thread for which to
     fetch the TLS address.  *Note thread-id syntax::.

     OFFSET is the (big endian, hex encoded) offset associated with the
     thread local variable.  (This offset is obtained from the debug
     information associated with the variable.)

     LM is the (big endian, hex encoded) OS/ABI-specific encoding of the
     the load module associated with the thread local storage.  For
     example, a GNU/Linux system will pass the link map address of the
     shared object associated with the thread local storage under
     consideration.  Other operating environments may choose to
     represent the load module differently, so the precise meaning of
     this parameter will vary.

     Reply:
    `XX...'
          Hex encoded (big endian) bytes representing the address of
          the thread local storage requested.

    `E NN'
          An error occurred.  NN are hex digits.

    `'
          An empty reply indicates that `qGetTLSAddr' is not supported
          by the stub.

`qGetTIBAddr:THREAD-ID'
     Fetch address of the Windows OS specific Thread Information Block.

     THREAD-ID is the thread ID associated with the thread.

     Reply:
    `XX...'
          Hex encoded (big endian) bytes representing the linear
          address of the thread information block.

    `E NN'
          An error occured.  This means that either the thread was not
          found, or the address could not be retrieved.

    `'
          An empty reply indicates that `qGetTIBAddr' is not supported
          by the stub.

`qL STARTFLAG THREADCOUNT NEXTTHREAD'
     Obtain thread information from RTOS.  Where: STARTFLAG (one hex
     digit) is one to indicate the first query and zero to indicate a
     subsequent query; THREADCOUNT (two hex digits) is the maximum
     number of threads the response packet can contain; and NEXTTHREAD
     (eight hex digits), for subsequent queries (STARTFLAG is zero), is
     returned in the response as ARGTHREAD.

     Don't use this packet; use the `qfThreadInfo' query instead (see
     above).

     Reply:
    `qM COUNT DONE ARGTHREAD THREAD...'
          Where: COUNT (two hex digits) is the number of threads being
          returned; DONE (one hex digit) is zero to indicate more
          threads and one indicates no further threads; ARGTHREADID
          (eight hex digits) is NEXTTHREAD from the request packet;
          THREAD...  is a sequence of thread IDs from the target.
          THREADID (eight hex digits).  See
          `remote.c:parse_threadlist_response()'.

`qOffsets'
     Get section offsets that the target used when relocating the
     downloaded image.

     Reply:
    `Text=XXX;Data=YYY[;Bss=ZZZ]'
          Relocate the `Text' section by XXX from its original address.
          Relocate the `Data' section by YYY from its original address.
          If the object file format provides segment information (e.g.
          ELF `PT_LOAD' program headers), GDB will relocate entire
          segments by the supplied offsets.

          _Note: while a `Bss' offset may be included in the response,
          GDB ignores this and instead applies the `Data' offset to the
          `Bss' section._

    `TextSeg=XXX[;DataSeg=YYY]'
          Relocate the first segment of the object file, which
          conventionally contains program code, to a starting address
          of XXX.  If `DataSeg' is specified, relocate the second
          segment, which conventionally contains modifiable data, to a
          starting address of YYY.  GDB will report an error if the
          object file does not contain segment information, or does not
          contain at least as many segments as mentioned in the reply.
          Extra segments are kept at fixed offsets relative to the last
          relocated segment.

`qP MODE THREAD-ID'
     Returns information on THREAD-ID.  Where: MODE is a hex encoded 32
     bit mode; THREAD-ID is a thread ID (*note thread-id syntax::).

     Don't use this packet; use the `qThreadExtraInfo' query instead
     (see below).

     Reply: see `remote.c:remote_unpack_thread_info_response()'.

`QNonStop:1'

`QNonStop:0'
     Enter non-stop (`QNonStop:1') or all-stop (`QNonStop:0') mode.
     *Note Remote Non-Stop::, for more information.

     Reply:
    `OK'
          The request succeeded.

    `E NN'
          An error occurred.  NN are hex digits.

    `'
          An empty reply indicates that `QNonStop' is not supported by
          the stub.

     This packet is not probed by default; the remote stub must request
     it, by supplying an appropriate `qSupported' response (*note
     qSupported::).  Use of this packet is controlled by the `set
     non-stop' command; *note Non-Stop Mode::.

`QPassSignals: SIGNAL [;SIGNAL]...'
     Each listed SIGNAL should be passed directly to the inferior
     process.  Signals are numbered identically to continue packets and
     stop replies (*note Stop Reply Packets::).  Each SIGNAL list item
     should be strictly greater than the previous item.  These signals
     do not need to stop the inferior, or be reported to GDB.  All
     other signals should be reported to GDB.  Multiple `QPassSignals'
     packets do not combine; any earlier `QPassSignals' list is
     completely replaced by the new list.  This packet improves
     performance when using `handle SIGNAL nostop noprint pass'.

     Reply:
    `OK'
          The request succeeded.

    `E NN'
          An error occurred.  NN are hex digits.

    `'
          An empty reply indicates that `QPassSignals' is not supported
          by the stub.

     Use of this packet is controlled by the `set remote pass-signals'
     command (*note set remote pass-signals: Remote Configuration.).
     This packet is not probed by default; the remote stub must request
     it, by supplying an appropriate `qSupported' response (*note
     qSupported::).

`qRcmd,COMMAND'
     COMMAND (hex encoded) is passed to the local interpreter for
     execution.  Invalid commands should be reported using the output
     string.  Before the final result packet, the target may also
     respond with a number of intermediate `OOUTPUT' console output
     packets.  _Implementors should note that providing access to a
     stubs's interpreter may have security implications_.

     Reply:
    `OK'
          A command response with no output.

    `OUTPUT'
          A command response with the hex encoded output string OUTPUT.

    `E NN'
          Indicate a badly formed request.

    `'
          An empty reply indicates that `qRcmd' is not recognized.

     (Note that the `qRcmd' packet's name is separated from the command
     by a `,', not a `:', contrary to the naming conventions above.
     Please don't use this packet as a model for new packets.)

`qSearch:memory:ADDRESS;LENGTH;SEARCH-PATTERN'
     Search LENGTH bytes at ADDRESS for SEARCH-PATTERN.  ADDRESS and
     LENGTH are encoded in hex.  SEARCH-PATTERN is a sequence of bytes,
     hex encoded.

     Reply:
    `0'
          The pattern was not found.

    `1,address'
          The pattern was found at ADDRESS.

    `E NN'
          A badly formed request or an error was encountered while
          searching memory.

    `'
          An empty reply indicates that `qSearch:memory' is not
          recognized.

`QStartNoAckMode'
     Request that the remote stub disable the normal `+'/`-' protocol
     acknowledgments (*note Packet Acknowledgment::).

     Reply:
    `OK'
          The stub has switched to no-acknowledgment mode.  GDB
          acknowledges this reponse, but neither the stub nor GDB shall
          send or expect further `+'/`-' acknowledgments in the current
          connection.

    `'
          An empty reply indicates that the stub does not support
          no-acknowledgment mode.

`qSupported [:GDBFEATURE [;GDBFEATURE]... ]'
     Tell the remote stub about features supported by GDB, and query
     the stub for features it supports.  This packet allows GDB and the
     remote stub to take advantage of each others' features.
     `qSupported' also consolidates multiple feature probes at startup,
     to improve GDB performance--a single larger packet performs better
     than multiple smaller probe packets on high-latency links.  Some
     features may enable behavior which must not be on by default, e.g.
     because it would confuse older clients or stubs.  Other features
     may describe packets which could be automatically probed for, but
     are not.  These features must be reported before GDB will use
     them.  This "default unsupported" behavior is not appropriate for
     all packets, but it helps to keep the initial connection time
     under control with new versions of GDB which support increasing
     numbers of packets.

     Reply:
    `STUBFEATURE [;STUBFEATURE]...'
          The stub supports or does not support each returned
          STUBFEATURE, depending on the form of each STUBFEATURE (see
          below for the possible forms).

    `'
          An empty reply indicates that `qSupported' is not recognized,
          or that no features needed to be reported to GDB.

     The allowed forms for each feature (either a GDBFEATURE in the
     `qSupported' packet, or a STUBFEATURE in the response) are:

    `NAME=VALUE'
          The remote protocol feature NAME is supported, and associated
          with the specified VALUE.  The format of VALUE depends on the
          feature, but it must not include a semicolon.

    `NAME+'
          The remote protocol feature NAME is supported, and does not
          need an associated value.

    `NAME-'
          The remote protocol feature NAME is not supported.

    `NAME?'
          The remote protocol feature NAME may be supported, and GDB
          should auto-detect support in some other way when it is
          needed.  This form will not be used for GDBFEATURE
          notifications, but may be used for STUBFEATURE responses.

     Whenever the stub receives a `qSupported' request, the supplied
     set of GDB features should override any previous request.  This
     allows GDB to put the stub in a known state, even if the stub had
     previously been communicating with a different version of GDB.

     The following values of GDBFEATURE (for the packet sent by GDB)
     are defined:

    `multiprocess'
          This feature indicates whether GDB supports multiprocess
          extensions to the remote protocol.  GDB does not use such
          extensions unless the stub also reports that it supports them
          by including `multiprocess+' in its `qSupported' reply.
          *Note multiprocess extensions::, for details.

    `xmlRegisters'
          This feature indicates that GDB supports the XML target
          description.  If the stub sees `xmlRegisters=' with target
          specific strings separated by a comma, it will report register
          description.

    `qRelocInsn'
          This feature indicates whether GDB supports the `qRelocInsn'
          packet (*note Relocate instruction reply packet: Tracepoint
          Packets.).

     Stubs should ignore any unknown values for GDBFEATURE.  Any GDB
     which sends a `qSupported' packet supports receiving packets of
     unlimited length (earlier versions of GDB may reject overly long
     responses).  Additional values for GDBFEATURE may be defined in
     the future to let the stub take advantage of new features in GDB,
     e.g. incompatible improvements in the remote protocol--the
     `multiprocess' feature is an example of such a feature.  The
     stub's reply should be independent of the GDBFEATURE entries sent
     by GDB; first GDB describes all the features it supports, and then
     the stub replies with all the features it supports.

     Similarly, GDB will silently ignore unrecognized stub feature
     responses, as long as each response uses one of the standard forms.

     Some features are flags.  A stub which supports a flag feature
     should respond with a `+' form response.  Other features require
     values, and the stub should respond with an `=' form response.

     Each feature has a default value, which GDB will use if
     `qSupported' is not available or if the feature is not mentioned
     in the `qSupported' response.  The default values are fixed; a
     stub is free to omit any feature responses that match the defaults.

     Not all features can be probed, but for those which can, the
     probing mechanism is useful: in some cases, a stub's internal
     architecture may not allow the protocol layer to know some
     information about the underlying target in advance.  This is
     especially common in stubs which may be configured for multiple
     targets.

     These are the currently defined stub features and their properties:

     Feature Name            Value         Default  Probe Allowed
                             Required               
     `PacketSize'            Yes           `-'      No
     `qXfer:auxv:read'       No            `-'      Yes
     `qXfer:features:read'   No            `-'      Yes
     `qXfer:libraries:read'  No            `-'      Yes
     `qXfer:memory-map:read' No            `-'      Yes
     `qXfer:sdata:read'      No            `-'      Yes
     `qXfer:spu:read'        No            `-'      Yes
     `qXfer:spu:write'       No            `-'      Yes
     `qXfer:siginfo:read'    No            `-'      Yes
     `qXfer:siginfo:write'   No            `-'      Yes
     `qXfer:threads:read'    No            `-'      Yes
     `QNonStop'              No            `-'      Yes
     `QPassSignals'          No            `-'      Yes
     `QStartNoAckMode'       No            `-'      Yes
     `multiprocess'          No            `-'      No
     `ConditionalTracepoints'No            `-'      No
     `ReverseContinue'       No            `-'      No
     `ReverseStep'           No            `-'      No
     `TracepointSource'      No            `-'      No
     `QAllow'                No            `-'      No

     These are the currently defined stub features, in more detail:

    `PacketSize=BYTES'
          The remote stub can accept packets up to at least BYTES in
          length.  GDB will send packets up to this size for bulk
          transfers, and will never send larger packets.  This is a
          limit on the data characters in the packet, including the
          frame and checksum.  There is no trailing NUL byte in a
          remote protocol packet; if the stub stores packets in a
          NUL-terminated format, it should allow an extra byte in its
          buffer for the NUL.  If this stub feature is not supported,
          GDB guesses based on the size of the `g' packet response.

    `qXfer:auxv:read'
          The remote stub understands the `qXfer:auxv:read' packet
          (*note qXfer auxiliary vector read::).

    `qXfer:features:read'
          The remote stub understands the `qXfer:features:read' packet
          (*note qXfer target description read::).

    `qXfer:libraries:read'
          The remote stub understands the `qXfer:libraries:read' packet
          (*note qXfer library list read::).

    `qXfer: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::).

    `QNonStop'
          The remote stub understands the `QNonStop' packet (*note
          QNonStop::).

    `QPassSignals'
          The remote stub understands the `QPassSignals' packet (*note
          QPassSignals::).

    `QStartNoAckMode'
          The remote stub understands the `QStartNoAckMode' packet and
          prefers to operate in no-acknowledgment mode.  *Note Packet
          Acknowledgment::.

    `multiprocess'
          The remote stub understands the multiprocess extensions to
          the remote protocol syntax.  The multiprocess extensions
          affect the syntax of thread IDs in both packets and replies
          (*note thread-id syntax::), and add process IDs to the `D'
          packet and `W' and `X' replies.  Note that reporting this
          feature indicates support for the syntactic extensions only,
          not that the stub necessarily supports debugging of more than
          one process at a time.  The stub must not use multiprocess
          extensions in packet replies unless GDB has also indicated it
          supports them in its `qSupported' request.

    `qXfer:osdata:read'
          The remote stub understands the `qXfer:osdata:read' packet
          ((*note qXfer osdata read::).

    `ConditionalTracepoints'
          The remote stub accepts and implements conditional
          expressions defined for tracepoints (*note Tracepoint
          Conditions::).

    `ReverseContinue'
          The remote stub accepts and implements the reverse continue
          packet (*note bc::).

    `ReverseStep'
          The remote stub accepts and implements the reverse step packet
          (*note bs::).

    `TracepointSource'
          The remote stub understands the `QTDPsrc' packet that supplies
          the source form of tracepoint definitions.

    `QAllow'
          The remote stub understands the `QAllow' packet.

    `StaticTracepoint'
          The remote stub supports static tracepoints.


`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'
     *Note Tracepoint Packets::.

`qThreadExtraInfo,THREAD-ID'
     Obtain a printable string description of a thread's attributes from
     the target OS.  THREAD-ID is a thread ID; see *Note thread-id
     syntax::.  This string may contain anything that the target OS
     thinks is interesting for GDB to tell the user about the thread.
     The string is displayed in GDB's `info threads' display.  Some
     examples of possible thread extra info strings are `Runnable', or
     `Blocked on Mutex'.

     Reply:
    `XX...'
          Where `XX...' is a hex encoding of ASCII data, comprising the
          printable string containing the extra information about the
          thread's attributes.

     (Note that the `qThreadExtraInfo' packet's name is separated from
     the command by a `,', not a `:', contrary to the naming
     conventions above.  Please don't use this packet as a model for new
     packets.)

`QTSave'

`qTsP'

`qTsV'
`QTStart'
`QTStop'
`QTinit'
`QTro'
`qTStatus'
`qTV'
`qTfSTM'
`qTsSTM'
`qTSTMat'
     *Note Tracepoint Packets::.

`qXfer:OBJECT:read:ANNEX:OFFSET,LENGTH'
     Read uninterpreted bytes from the target's special data area
     identified by the keyword OBJECT.  Request LENGTH bytes starting
     at OFFSET bytes into the data.  The content and encoding of ANNEX
     is specific to OBJECT; it can supply additional details about what
     data to access.

     Here are the specific requests of this form defined so far.  All
     `qXfer:OBJECT:read:...' requests use the same reply formats,
     listed below.

    `qXfer:auxv:read::OFFSET,LENGTH'
          Access the target's "auxiliary vector".  *Note auxiliary
          vector: OS Information.  Note ANNEX must be empty.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:features:read:ANNEX:OFFSET,LENGTH'
          Access the "target description".  *Note Target
          Descriptions::.  The annex specifies which XML document to
          access.  The main description is always loaded from the
          `target.xml' annex.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:libraries:read:ANNEX:OFFSET,LENGTH'
          Access the target's list of loaded libraries.  *Note Library
          List Format::.  The annex part of the generic `qXfer' packet
          must be empty (*note qXfer read::).

          Targets which maintain a list of libraries in the program's
          memory do not need to implement this packet; it is designed
          for platforms where the operating system manages the list of
          loaded libraries.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer: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:osdata:read::OFFSET,LENGTH'
          Access the target's "operating system information".  *Note
          Operating System Information::.


     Reply:
    `m DATA'
          Data DATA (*note Binary Data::) has been read from the
          target.  There may be more data at a higher address (although
          it is permitted to return `m' even for the last valid block
          of data, as long as at least one byte of data was read).
          DATA may have fewer bytes than the LENGTH in the request.

    `l DATA'
          Data DATA (*note Binary Data::) has been read from the target.
          There is no more data to be read.  DATA may have fewer bytes
          than the LENGTH in the request.

    `l'
          The OFFSET in the request is at the end of the data.  There
          is no more data to be read.

    `E00'
          The request was malformed, or ANNEX was invalid.

    `E NN'
          The offset was invalid, or there was an error encountered
          reading the data.  NN is a hex-encoded `errno' value.

    `'
          An empty reply indicates the OBJECT string was not recognized
          by the stub, or that the object does not support reading.

`qXfer:OBJECT:write:ANNEX:OFFSET:DATA...'
     Write uninterpreted bytes into the target's special data area
     identified by the keyword OBJECT, starting at OFFSET bytes into
     the data.  DATA... is the binary-encoded data (*note Binary
     Data::) to be written.  The content and encoding of ANNEX is
     specific to OBJECT; it can supply additional details about what
     data to access.

     Here are the specific requests of this form defined so far.  All
     `qXfer:OBJECT:write:...' requests use the same reply formats,
     listed below.

    `qXfer:siginfo:write::OFFSET:DATA...'
          Write DATA to the extra signal information on the target
          system.  The annex part of the generic `qXfer' packet must be
          empty (*note qXfer write::).

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

    `qXfer:spu:write:ANNEX:OFFSET:DATA...'
          Write DATA to an `spufs' file on the target system.  The
          annex specifies which file to write; it must be of the form
          `ID/NAME', where ID specifies an SPU context ID in the target
          process, and NAME identifes the `spufs' file in that context
          to be accessed.

          This packet is not probed by default; the remote stub must
          request it, by supplying an appropriate `qSupported' response
          (*note qSupported::).

     Reply:
    `NN'
          NN (hex encoded) is the number of bytes written.  This may be
          fewer bytes than supplied in the request.

    `E00'
          The request was malformed, or ANNEX was invalid.

    `E NN'
          The offset was invalid, or there was an error encountered
          writing the data.  NN is a hex-encoded `errno' value.

    `'
          An empty reply indicates the OBJECT string was not recognized
          by the stub, or that the object does not support writing.

`qXfer:OBJECT:OPERATION:...'
     Requests of this form may be added in the future.  When a stub does
     not recognize the OBJECT keyword, or its support for OBJECT does
     not recognize the OPERATION keyword, the stub must respond with an
     empty packet.

`qAttached:PID'
     Return an indication of whether the remote server attached to an
     existing process or created a new process.  When the multiprocess
     protocol extensions are supported (*note multiprocess
     extensions::), PID is an integer in hexadecimal format identifying
     the target process.  Otherwise, GDB will omit the PID field and
     the query packet will be simplified as `qAttached'.

     This query is used, for example, to know whether the remote process
     should be detached or killed when a GDB session is ended with the
     `quit' command.

     Reply:
    `1'
          The remote server attached to an existing process.

    `0'
          The remote server created a new process.

    `E NN'
          A badly formed request or an error was encountered.


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

   (1) The `qP' and `qL' packets predate these conventions, and have
arguments without any terminator for the packet name; we suspect they
are in widespread use in places that are difficult to upgrade.  The
`qC' packet has no arguments, but some existing stubs (e.g. RedBoot)
are known to not check for the end of the packet.


File: gdb.info,  Node: Architecture-Specific Protocol Details,  Next: Tracepoint Packets,  Prev: General Query Packets,  Up: Remote Protocol

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

D.5.1 ARM
---------

D.5.1.1 Breakpoint Kinds
........................

These breakpoint kinds are defined for the `Z0' and `Z1' packets.

2
     16-bit Thumb mode breakpoint.

3
     32-bit Thumb mode (Thumb-2) breakpoint.

4
     32-bit ARM mode breakpoint.


D.5.2 MIPS
----------

D.5.2.1 Register Packet Format
..............................

The following `g'/`G' packets have previously been defined.  In the
below, some thirty-two bit registers are transferred as sixty-four
bits.  Those registers should be zero/sign extended (which?)  to fill
the space allocated.  Register bytes are transferred in target byte
order.  The two nibbles within a register byte are transferred
most-significant - least-significant.

MIPS32
     All registers are transferred as thirty-two bit quantities in the
     order: 32 general-purpose; sr; lo; hi; bad; cause; pc; 32
     floating-point registers; fsr; fir; fp.

MIPS64
     All registers are transferred as sixty-four bit quantities
     (including thirty-two bit registers such as `sr').  The ordering
     is the same as `MIPS32'.



File: gdb.info,  Node: Tracepoint Packets,  Next: Host I/O Packets,  Prev: Architecture-Specific Protocol Details,  Up: Remote Protocol

D.6 Tracepoint Packets
======================

Here we describe the packets GDB uses to implement tracepoints (*note
Tracepoints::).

`QTDP:N:ADDR:ENA:STEP:PASS[:FFLEN][:XLEN,BYTES][-]'
     Create a new tracepoint, number N, at ADDR.  If ENA is `E', then
     the tracepoint is enabled; if it is `D', then the tracepoint is
     disabled.  STEP is the tracepoint's step count, and PASS is its
     pass count.  If an `F' is present, then the tracepoint is to be a
     fast tracepoint, and the FLEN is the number of bytes that the
     target should copy elsewhere to make room for the tracepoint.  If
     an `X' is present, it introduces a tracepoint condition, which
     consists of a hexadecimal length, followed by a comma and
     hex-encoded bytes, in a manner similar to action encodings as
     described below.  If the trailing `-' is present, further `QTDP'
     packets will follow to specify this tracepoint's actions.

     Replies:
    `OK'
          The packet was understood and carried out.

    `qRelocInsn'
          *Note Relocate instruction reply packet: Tracepoint Packets.

    `'
          The packet was not recognized.

`QTDP:-N:ADDR:[S]ACTION...[-]'
     Define actions to be taken when a tracepoint is hit.  N and ADDR
     must be the same as in the initial `QTDP' packet for this
     tracepoint.  This packet may only be sent immediately after
     another `QTDP' packet that ended with a `-'.  If the trailing `-'
     is present, further `QTDP' packets will follow, specifying more
     actions for this tracepoint.

     In the series of action packets for a given tracepoint, at most one
     can have an `S' before its first ACTION.  If such a packet is
     sent, it and the following packets define "while-stepping"
     actions.  Any prior packets define ordinary actions -- that is,
     those taken when the tracepoint is first hit.  If no action packet
     has an `S', then all the packets in the series specify ordinary
     tracepoint actions.

     The `ACTION...' portion of the packet is a series of actions,
     concatenated without separators.  Each action has one of the
     following forms:

    `R MASK'
          Collect the registers whose bits are set in MASK.  MASK is a
          hexadecimal number whose I'th bit is set if register number I
          should be collected.  (The least significant bit is numbered
          zero.)  Note that MASK may be any number of digits long; it
          may not fit in a 32-bit word.

    `M BASEREG,OFFSET,LEN'
          Collect LEN bytes of memory starting at the address in
          register number BASEREG, plus OFFSET.  If BASEREG is `-1',
          then the range has a fixed address: OFFSET is the address of
          the lowest byte to collect.  The BASEREG, OFFSET, and LEN
          parameters are all unsigned hexadecimal values (the `-1'
          value for BASEREG is a special case).

    `X LEN,EXPR'
          Evaluate EXPR, whose length is LEN, and collect memory as it
          directs.  EXPR is an agent expression, as described in *Note
          Agent Expressions::.  Each byte of the expression is encoded
          as a two-digit hex number in the packet; LEN is the number of
          bytes in the expression (and thus one-half the number of hex
          digits in the packet).


     Any number of actions may be packed together in a single `QTDP'
     packet, as long as the packet does not exceed the maximum packet
     length (400 bytes, for many stubs).  There may be only one `R'
     action per tracepoint, and it must precede any `M' or `X' actions.
     Any registers referred to by `M' and `X' actions must be
     collected by a preceding `R' action.  (The "while-stepping"
     actions are treated as if they were attached to a separate
     tracepoint, as far as these restrictions are concerned.)

     Replies:
    `OK'
          The packet was understood and carried out.

    `qRelocInsn'
          *Note Relocate instruction reply packet: Tracepoint Packets.

    `'
          The packet was not recognized.

`QTDPsrc:N:ADDR:TYPE:START:SLEN:BYTES'
     Specify a source string of tracepoint N at address ADDR.  This is
     useful to get accurate reproduction of the tracepoints originally
     downloaded at the beginning of the trace run.  TYPE is the name of
     the tracepoint part, such as `cond' for the tracepoint's
     conditional expression (see below for a list of types), while
     BYTES is the string, encoded in hexadecimal.

     START is the offset of the BYTES within the overall source string,
     while SLEN is the total length of the source string.  This is
     intended for handling source strings that are longer than will fit
     in a single packet.

     The available string types are `at' for the location, `cond' for
     the conditional, and `cmd' for an action command.  GDB sends a
     separate packet for each command in the action list, in the same
     order in which the commands are stored in the list.

     The target does not need to do anything with source strings except
     report them back as part of the replies to the `qTfP'/`qTsP' query
     packets.

     Although this packet is optional, and GDB will only send it if the
     target replies with `TracepointSource' *Note General Query
     Packets::, it makes both disconnected tracing and trace files much
     easier to use.  Otherwise the user must be careful that the
     tracepoints in effect while looking at trace frames are identical
     to the ones in effect during the trace run; even a small
     discrepancy could cause `tdump' not to work, or a particular trace
     frame not be found.

`QTDV:N:VALUE'
     Create a new trace state variable, number N, with an initial value
     of VALUE, which is a 64-bit signed integer.  Both N and VALUE are
     encoded as hexadecimal values. GDB has the option of not using
     this packet for initial values of zero; the target should simply
     create the trace state variables as they are mentioned in
     expressions.

`QTFrame:N'
     Select the N'th tracepoint frame from the buffer, and use the
     register and memory contents recorded there to answer subsequent
     request packets from GDB.

     A successful reply from the stub indicates that the stub has found
     the requested frame.  The response is a series of parts,
     concatenated without separators, describing the frame we selected.
     Each part has one of the following forms:

    `F F'
          The selected frame is number N in the trace frame buffer; F
          is a hexadecimal number.  If F is `-1', then there was no
          frame matching the criteria in the request packet.

    `T T'
          The selected trace frame records a hit of tracepoint number T;
          T is a hexadecimal number.


`QTFrame:pc:ADDR'
     Like `QTFrame:N', but select the first tracepoint frame after the
     currently selected frame whose PC is ADDR; ADDR is a hexadecimal
     number.

`QTFrame:tdp:T'
     Like `QTFrame:N', but select the first tracepoint frame after the
     currently selected frame that is a hit of tracepoint T; T is a
     hexadecimal number.

`QTFrame:range:START:END'
     Like `QTFrame:N', but select the first tracepoint frame after the
     currently selected frame whose PC is between START (inclusive) and
     END (inclusive); START and END are hexadecimal numbers.

`QTFrame:outside:START:END'
     Like `QTFrame:range:START:END', but select the first frame
     _outside_ the given range of addresses (exclusive).

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

`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:0'
          The trace was stopped by a user-originated stop command.

    `tfull:0'
          The trace stopped because the trace buffer filled up.

    `tdisconnected:0'
          The trace stopped because GDB disconnected from the target.

    `tpasscount:TPNUM'
          The trace stopped because tracepoint TPNUM exceeded its pass
          count.

    `terror:TEXT:TPNUM'
          The trace stopped because tracepoint TPNUM had an error.  The
          string TEXT is available to describe the nature of the error
          (for instance, a divide by zero in the condition expression).
          TEXT is hex encoded.

    `tunknown:0'
          The trace stopped for some other reason.


     Additional optional fields supply statistical and other
     information.  Although not required, they are extremely useful for
     users monitoring the progress of a trace run.  If a trace has
     stopped, and these numbers are reported, they must reflect the
     state of the just-stopped trace.

    `tframes:N'
          The number of trace frames in the buffer.

    `tcreated:N'
          The total number of trace frames created during the run. This
          may be larger than the trace frame count, if the buffer is
          circular.

    `tsize:N'
          The total size of the trace buffer, in bytes.

    `tfree:N'
          The number of bytes still unused in the buffer.

    `circular:N'
          The value of the circular trace buffer flag.  `1' means that
          the trace buffer is circular and old trace frames will be
          discarded if necessary to make room, `0' means that the trace
          buffer is linear and may fill up.

    `disconn:N'
          The value of the disconnected tracing flag.  `1' means that
          tracing will continue after GDB disconnects, `0' means that
          the trace run will stop.


`qTV:VAR'
     Ask the stub for the value of the trace state variable number VAR.

     Replies:
    `VVALUE'
          The value of the variable is VALUE.  This will be the current
          value of the variable if the user is examining a running
          target, or a saved value if the variable was collected in the
          trace frame that the user is looking at.  Note that multiple
          requests may result in different reply values, such as when
          requesting values while the program is running.

    `U'
          The value of the variable is unknown.  This would occur, for
          example, if the user is examining a trace frame in which the
          requested variable was not collected.

`qTfP'
`qTsP'
     These packets request data about tracepoints that are being used by
     the target.  GDB sends `qTfP' to get the first piece of data, and
     multiple `qTsP' to get additional pieces.  Replies to these
     packets generally take the form of the `QTDP' packets that define
     tracepoints. (FIXME add detailed syntax)

`qTfV'
`qTsV'
     These packets request data about trace state variables that are on
     the target.  GDB sends `qTfV' to get the first vari of data, and
     multiple `qTsV' to get additional variables.  Replies to these
     packets follow the syntax of the `QTDV' packets that define trace
     state variables.

`qTfSTM'
`qTsSTM'
     These packets request data about static tracepoint markers that
     exist in the target program.  GDB sends `qTfSTM' to get the first
     piece of data, and multiple `qTsSTM' to get additional pieces.
     Replies to these packets take the following form:

     Reply:
    `m ADDRESS:ID:EXTRA'
          A single marker

    `m ADDRESS:ID:EXTRA,ADDRESS:ID:EXTRA...'
          a comma-separated list of markers

    `l'
          (lower case letter `L') denotes end of list.

    `E NN'
          An error occurred.  NN are hex digits.

    `'
          An empty reply indicates that the request is not supported by
          the stub.

     ADDRESS is encoded in hex.  ID and EXTRA are strings encoded in
     hex.

     In response to each query, the target will reply with a list of
     one or more markers, separated by commas.  GDB will respond to each
     reply with a request for more markers (using the `qs' form of the
     query), until the target responds with `l' (lower-case ell, for
     "last").

`qTSTMat:ADDRESS'
     This packets requests data about static tracepoint markers in the
     target program at ADDRESS.  Replies to this packet follow the
     syntax of the `qTfSTM' and `qTsSTM' packets that list static
     tracepoint markers.

`QTSave:FILENAME'
     This packet directs the target to save trace data to the file name
     FILENAME in the target's filesystem.  FILENAME is encoded as a hex
     string; the interpretation of the file name (relative vs absolute,
     wild cards, etc) is up to the target.

`qTBuffer:OFFSET,LEN'
     Return up to LEN bytes of the current contents of trace buffer,
     starting at OFFSET.  The trace buffer is treated as if it were a
     contiguous collection of traceframes, as per the trace file format.
     The reply consists as many hex-encoded bytes as the target can
     deliver in a packet; it is not an error to return fewer than were
     asked for.  A reply consisting of just `l' indicates that no bytes
     are available.

`QTBuffer:circular:VALUE'
     This packet directs the target to use a circular trace buffer if
     VALUE is 1, or a linear buffer if the value is 0.


D.6.1 Relocate instruction reply packet
---------------------------------------

When installing fast tracepoints in memory, the target may need to
relocate the instruction currently at the tracepoint address to a
different address in memory.  For most instructions, a simple copy is
enough, but, for example, call instructions that implicitly push the
return address on the stack, and relative branches or other PC-relative
instructions require offset adjustment, so that the effect of executing
the instruction at a different address is the same as if it had
executed in the original location.

   In response to several of the tracepoint packets, the target may also
respond with a number of intermediate `qRelocInsn' request packets
before the final result packet, to have GDB handle this relocation
operation.  If a packet supports this mechanism, its documentation will
explicitly say so.  See for example the above descriptions for the
`QTStart' and `QTDP' packets.  The format of the request is:

`qRelocInsn:FROM;TO'
     This requests GDB to copy instruction at address FROM to address
     TO, possibly adjusted so that executing the instruction at TO has
     the same effect as executing it at FROM.  GDB writes the adjusted
     instruction to target memory starting at TO.

   Replies:
`qRelocInsn:ADJUSTED_SIZE'
     Informs the stub the relocation is complete.  ADJUSTED_SIZE is the
     length in bytes of resulting relocated instruction sequence.

`E NN'
     A badly formed request was detected, or an error was encountered
     while relocating the instruction.


File: gdb.info,  Node: Host I/O Packets,  Next: Interrupts,  Prev: Tracepoint Packets,  Up: Remote Protocol

D.7 Host I/O Packets
====================

The "Host I/O" packets allow GDB to perform I/O operations on the far
side of a remote link.  For example, Host I/O is used to upload and
download files to a remote target with its own filesystem.  Host I/O
uses the same constant values and data structure layout as the
target-initiated File-I/O protocol.  However, the Host I/O packets are
structured differently.  The target-initiated protocol relies on target
memory to store parameters and buffers.  Host I/O requests are
initiated by GDB, and the target's memory is not involved.  *Note
File-I/O Remote Protocol Extension::, for more details on the
target-initiated protocol.

   The Host I/O request packets all encode a single operation along with
its arguments.  They have this format:

`vFile:OPERATION: PARAMETER...'
     OPERATION is the name of the particular request; the target should
     compare the entire packet name up to the second colon when checking
     for a supported operation.  The format of PARAMETER depends on the
     operation.  Numbers are always passed in hexadecimal.  Negative
     numbers have an explicit minus sign (i.e. two's complement is not
     used).  Strings (e.g. filenames) are encoded as a series of
     hexadecimal bytes.  The last argument to a system call may be a
     buffer of escaped binary data (*note Binary Data::).


   The valid responses to Host I/O packets are:

`F RESULT [, ERRNO] [; ATTACHMENT]'
     RESULT is the integer value returned by this operation, usually
     non-negative for success and -1 for errors.  If an error has
     occured, ERRNO will be included in the result.  ERRNO will have a
     value defined by the File-I/O protocol (*note Errno Values::).  For
     operations which return data, ATTACHMENT supplies the data as a
     binary buffer.  Binary buffers in response packets are escaped in
     the normal way (*note Binary Data::).  See the individual packet
     documentation for the interpretation of RESULT and ATTACHMENT.

`'
     An empty response indicates that this operation is not recognized.


   These are the supported Host I/O operations:

`vFile:open: PATHNAME, FLAGS, MODE'
     Open a file at PATHNAME and return a file descriptor for it, or
     return -1 if an error occurs.  PATHNAME is a string, FLAGS is an
     integer indicating a mask of open flags (*note Open Flags::), and
     MODE is an integer indicating a mask of mode bits to use if the
     file is created (*note mode_t Values::).  *Note open::, for
     details of the open flags and mode values.

`vFile:close: FD'
     Close the open file corresponding to FD and return 0, or -1 if an
     error occurs.

`vFile:pread: FD, COUNT, OFFSET'
     Read data from the open file corresponding to FD.  Up to COUNT
     bytes will be read from the file, starting at OFFSET relative to
     the start of the file.  The target may read fewer bytes; common
     reasons include packet size limits and an end-of-file condition.
     The number of bytes read is returned.  Zero should only be
     returned for a successful read at the end of the file, or if COUNT
     was zero.

     The data read should be returned as a binary attachment on success.
     If zero bytes were read, the response should include an empty
     binary attachment (i.e. a trailing semicolon).  The return value
     is the number of target bytes read; the binary attachment may be
     longer if some characters were escaped.

`vFile:pwrite: FD, OFFSET, DATA'
     Write DATA (a binary buffer) to the open file corresponding to FD.
     Start the write at OFFSET from the start of the file.  Unlike
     many `write' system calls, there is no separate COUNT argument;
     the length of DATA in the packet is used.  `vFile:write' returns
     the number of bytes written, which may be shorter than the length
     of DATA, or -1 if an error occurred.

`vFile:unlink: PATHNAME'
     Delete the file at PATHNAME on the target.  Return 0, or -1 if an
     error occurs.  PATHNAME is a string.



File: gdb.info,  Node: Interrupts,  Next: Notification Packets,  Prev: Host I/O Packets,  Up: Remote Protocol

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

D.9 Notification Packets
========================

The GDB remote serial protocol includes "notifications", packets that
require no acknowledgment.  Both the GDB and the stub may send
notifications (although the only notifications defined at present are
sent by the stub).  Notifications carry information without incurring
the round-trip latency of an acknowledgment, and so are useful for
low-impact communications where occasional packet loss is not a problem.

   A notification packet has the form `% DATA # CHECKSUM', where DATA
is the content of the notification, and CHECKSUM is a checksum of DATA,
computed and formatted as for ordinary GDB packets.  A notification's
DATA never contains `$', `%' or `#' characters.  Upon receiving a
notification, the recipient sends no `+' or `-' to acknowledge the
notification's receipt or to report its corruption.

   Every notification's DATA begins with a name, which contains no
colon characters, followed by a colon character.

   Recipients should silently ignore corrupted notifications and
notifications they do not understand.  Recipients should restart
timeout periods on receipt of a well-formed notification, whether or
not they understand it.

   Senders should only send the notifications described here when this
protocol description specifies that they are permitted.  In the future,
we may extend the protocol to permit existing notifications in new
contexts; this rule helps older senders avoid confusing newer
recipients.

   (Older versions of GDB ignore bytes received until they see the `$'
byte that begins an ordinary packet, so new stubs may transmit
notifications without fear of confusing older clients.  There are no
notifications defined for GDB to send at the moment, but we assume that
most older stubs would ignore them, as well.)

   The following notification packets from the stub to GDB are defined:

`Stop: REPLY'
     Report an asynchronous stop event in non-stop mode.  The REPLY has
     the form of a stop reply, as described in *Note Stop Reply
     Packets::.  Refer to *Note Remote Non-Stop::, for information on
     how these notifications are acknowledged by GDB.


File: gdb.info,  Node: Remote Non-Stop,  Next: Packet Acknowledgment,  Prev: Notification Packets,  Up: Remote Protocol

D.10 Remote Protocol Support for Non-Stop Mode
==============================================

GDB's remote protocol supports non-stop debugging of multi-threaded
programs, as described in *Note Non-Stop Mode::.  If the stub supports
non-stop mode, it should report that to GDB by including `QNonStop+' in
its `qSupported' response (*note qSupported::).

   GDB typically sends a `QNonStop' packet only when establishing a new
connection with the stub.  Entering non-stop mode does not alter the
state of any currently-running threads, but targets must stop all
threads in any already-attached processes when entering all-stop mode.
GDB uses the `?' packet as necessary to probe the target state after a
mode change.

   In non-stop mode, when an attached process encounters an event that
would otherwise be reported with a stop reply, it uses the asynchronous
notification mechanism (*note Notification Packets::) to inform GDB.
In contrast to all-stop mode, where all threads in all processes are
stopped when a stop reply is sent, in non-stop mode only the thread
reporting the stop event is stopped.  That is, when reporting a `S' or
`T' response to indicate completion of a step operation, hitting a
breakpoint, or a fault, only the affected thread is stopped; any other
still-running threads continue to run.  When reporting a `W' or `X'
response, all running threads belonging to other attached processes
continue to run.

   Only one stop reply notification at a time may be pending; if
additional stop events occur before GDB has acknowledged the previous
notification, they must be queued by the stub for later synchronous
transmission in response to `vStopped' packets from GDB.  Because the
notification mechanism is unreliable, the stub is permitted to resend a
stop reply notification if it believes GDB may not have received it.
GDB ignores additional stop reply notifications received before it has
finished processing a previous notification and the stub has completed
sending any queued stop events.

   Otherwise, GDB must be prepared to receive a stop reply notification
at any time.  Specifically, they may appear when GDB is not otherwise
reading input from the stub, or when GDB is expecting to read a normal
synchronous response or a `+'/`-' acknowledgment to a packet it has
sent.  Notification packets are distinct from any other communication
from the stub so there is no ambiguity.

   After receiving a stop reply notification, GDB shall acknowledge it
by sending a `vStopped' packet (*note vStopped packet::) as a regular,
synchronous request to the stub.  Such acknowledgment is not required
to happen immediately, as GDB is permitted to send other, unrelated
packets to the stub first, which the stub should process normally.

   Upon receiving a `vStopped' packet, if the stub has other queued
stop events to report to GDB, it shall respond by sending a normal stop
reply response.  GDB shall then send another `vStopped' packet to
solicit further responses; again, it is permitted to send other,
unrelated packets as well which the stub should process normally.

   If the stub receives a `vStopped' packet and there are no additional
stop events to report, the stub shall return an `OK' response.  At this
point, if further stop events occur, the stub shall send a new stop
reply notification, GDB shall accept the notification, and the process
shall be repeated.

   In non-stop mode, the target shall respond to the `?' packet as
follows.  First, any incomplete stop reply notification/`vStopped'
sequence in progress is abandoned.  The target must begin a new
sequence reporting stop events for all stopped threads, whether or not
it has previously reported those events to GDB.  The first stop reply
is sent as a synchronous reply to the `?' packet, and subsequent stop
replies are sent as responses to `vStopped' packets using the mechanism
described above.  The target must not send asynchronous stop reply
notifications until the sequence is complete.  If all threads are
running when the target receives the `?' packet, or if the target is
not attached to any process, it shall respond `OK'.


File: gdb.info,  Node: Packet Acknowledgment,  Next: Examples,  Prev: Remote Non-Stop,  Up: Remote Protocol

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

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

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

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

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

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

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

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

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

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

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

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

D.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: Memory Map Format,  Prev: File-I/O Remote Protocol Extension,  Up: Remote Protocol

D.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: Memory Map Format,  Next: Thread List Format,  Prev: Library List Format,  Up: Remote Protocol

D.15 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,  Prev: Memory Map Format,  Up: Remote Protocol

D.16 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: Agent Expressions,  Next: Target Descriptions,  Prev: Remote Protocol,  Up: Top

Appendix E 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

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


