		What has changed in GDB?
	     (Organized release by release)

*** Changes since GDB 11

* New commands

maint set backtrace-on-fatal-signal on|off
maint show backtrace-on-fatal-signal
  This setting is 'on' by default.  When 'on' GDB will print a limited
  backtrace to stderr in the situation where GDB terminates with a
  fatal signal.  This only supported on some platforms where the
  backtrace and backtrace_symbols_fd functions are available.

set source open on|off
show source open
  This setting, which is on by default, controls whether GDB will try
  to open source code files.  Switching this off will stop GDB trying
  to open and read source code files, which can be useful if the files
  are located over a slow network connection.

set varsize-limit
show varsize-limit
  These are now deprecated aliases for "set max-value-size" and
  "show max-value-size".

maint set internal-error backtrace on|off
maint show internal-error backtrace
maint set internal-warning backtrace on|off
maint show internal-warning backtrace
  GDB can now print a backtrace of itself when it encounters either an
  internal-error, or an internal-warning.  This is on by default for
  internal-error and off by default for internal-warning.

* Python API

  ** New function gdb.add_history(), which takes a gdb.Value object
     and adds the value it represents to GDB's history list.  An
     integer, the index of the new item in the history list, is
     returned.

  ** New gdb.events.gdb_exiting event.  This event is called with a
     gdb.GdbExitingEvent object which has the read-only attribute
     'exit_code', which contains the value of the GDB exit code.  This
     event is triggered once GDB decides it is going to exit, but
     before GDB starts to clean up its internal state.

*** Changes in GDB 11

* The 'set disassembler-options' command now supports specifying options
  for the ARC target.

* GDB now supports general memory tagging functionality if the underlying
  architecture supports the proper primitives and hooks.  Currently this is
  enabled only for AArch64 MTE.

  This includes:

  - Additional information when the inferior crashes with a SIGSEGV caused by
    a memory tag violation.

  - A new modifier 'm' for the "x" command, which displays allocation tags for a
    particular memory range.

  - Display of memory tag mismatches by "print", for addresses and
    pointers, if memory tagging is supported by the architecture.

* Building GDB now requires GMP (The GNU Multiple Precision Arithmetic
  Library).

* MI changes

 ** '-break-insert --qualified' and '-dprintf-insert --qualified'

    The MI -break-insert and -dprintf-insert commands now support a
    new "--qualified" option that makes GDB interpret a specified
    function name as a complete fully-qualified name.  This is the
    equivalent of the CLI's "break -qualified" and "dprintf
    -qualified".

 ** '-break-insert --force-condition' and '-dprintf-insert --force-condition'

    The MI -break-insert and -dprintf-insert commands now support a
    '--force-condition' flag to forcibly define a condition even when
    the condition is invalid at all locations of the breakpoint.  This
    is equivalent to the '-force-condition' flag of the CLI's "break"
    command.

 ** '-break-condition --force'

    The MI -break-condition command now supports a '--force' flag to
    forcibly define a condition even when the condition is invalid at
    all locations of the selected breakpoint.  This is equivalent to
    the '-force' flag of the CLI's "cond" command.

 ** '-file-list-exec-source-files [--group-by-objfile]
 	                          [--basename | --dirname]
                                  [--] [REGEXP]'

    The existing -file-list-exec-source-files command now takes an
    optional REGEXP which is used to filter the source files that are
    included in the results.

    By default REGEXP is matched against the full filename of the
    source file. When one of --basename or --dirname is given then
    REGEXP is only matched against the specified part of the full
    source filename.

    When the optional --group-by-objfile flag is used the output
    format is changed, the results are now a list of object files
    (executable and libraries) with the source files that are
    associated with each object file.

    The results from -file-list-exec-source-files now include a
    'debug-fully-read' field which takes the value 'true' or 'false'.
    A 'true' value indicates the source file is from a compilation
    unit that has had its debug information fully read in by GDB, a
    value of 'false' indicates GDB has only performed a partial scan
    of the debug information so far.

* GDB now supports core file debugging for x86_64 Cygwin programs.

* GDB will now look for the .gdbinit file in a config directory before
  looking for ~/.gdbinit.  The file is searched for in the following
  locations: $XDG_CONFIG_HOME/gdb/gdbinit, $HOME/.config/gdb/gdbinit,
  $HOME/.gdbinit.  On Apple hosts the search order is instead:
  $HOME/Library/Preferences/gdb/gdbinit, $HOME/.gdbinit.

* GDB now supports fixed point types which are described in DWARF
  as base types with a fixed-point encoding.  Additionally, support
  for the DW_AT_GNU_numerator and DW_AT_GNU_denominator has also
  been added.

  For Ada, this allows support for fixed point types without requiring
  the use of the GNAT encoding (based on information added to the type's
  name following a GNAT-specific format).

* GDB will now load and process commands from ~/.config/gdb/gdbearlyinit
  or ~/.gdbearlyinit if these files are present.  These files are
  processed earlier than any of the other initialization files and
  can affect parts of GDB's startup that previously had already been
  completed before the initialization files were read, for example
  styling of the initial GDB greeting.

* GDB now has two new options "--early-init-command" and
  "--early-init-eval-command" with corresponding short options "-eix"
  and "-eiex" that allow options (that would normally appear in a
  gdbearlyinit file) to be passed on the command line.

* For RISC-V targets, the target feature "org.gnu.gdb.riscv.vector" is
  now understood by GDB, and can be used to describe the vector
  registers of a target.  The precise requirements of this register
  feature are documented in the GDB manual.

* For ARM targets, the "org.gnu.gdb.arm.m-profile-mve" feature is now
  supported by GDB and describes a new VPR register from the ARM MVE
  (Helium) extension. See the GDB manual for more information.

* TUI improvements

  ** TUI windows now support mouse actions.  The mouse wheel scrolls
     the appropriate window.

  ** Key combinations that do not have a specific action on the
     focused window are passed to GDB.  For example, you now can use
     Ctrl-Left/Ctrl-Right to move between words in the command window
     regardless of which window is in focus.  Previously you would
     need to focus on the command window for such key combinations to
     work.

* New commands

set debug event-loop
show debug event-loop
  Control the display of debug output about GDB's event loop.

set print memory-tag-violations
show print memory-tag-violations
  Control whether to display additional information about memory tag violations
  when printing pointers and addresses.  Architecture support for memory
  tagging is required for this option to have an effect.

maintenance flush symbol-cache
maintenance flush register-cache
  These new commands are equivalent to the already existing commands
  'maintenance flush-symbol-cache' and 'flushregs' respectively.

maintenance flush dcache
  A new command to flush the dcache.

maintenance info target-sections
  Print GDB's internal target sections table.

maintenance info jit
  Print the JIT code objects in the inferior known to GDB.

memory-tag show-logical-tag POINTER
  Print the logical tag for POINTER.
memory-tag with-logical-tag POINTER TAG
  Print POINTER with logical tag TAG.
memory-tag show-allocation-tag ADDRESS
  Print the allocation tag for ADDRESS.
memory-tag set-allocation-tag ADDRESS LENGTH TAGS
  Set the allocation tag for [ADDRESS, ADDRESS + LENGTH) to TAGS.
memory-tag check POINTER
  Validate that POINTER's logical tag matches the allocation tag.

set startup-quietly on|off
show startup-quietly
  When 'on', this causes GDB to act as if "-silent" were passed on the
  command line.  This command needs to be added to an early
  initialization file (e.g. ~/.config/gdb/gdbearlyinit) in order to
  affect GDB.

set print type hex on|off
show print type hex
  When 'on', the 'ptype' command uses hexadecimal notation to print sizes
  and offsets of struct members.  When 'off', decimal notation is used.

set python ignore-environment on|off
show python ignore-environment
  When 'on', this causes GDB's builtin Python to ignore any
  environment variables that would otherwise affect how Python
  behaves.  This command needs to be added to an early initialization
  file (e.g. ~/.config/gdb/gdbearlyinit) in order to affect GDB.

set python dont-write-bytecode auto|on|off
show python dont-write-bytecode
  When 'on', this causes GDB's builtin Python to not write any
  byte-code (.pyc files) to disk.  This command needs to be added to
  an early initialization file (e.g. ~/.config/gdb/gdbearlyinit) in
  order to affect GDB.  When 'off' byte-code will always be written.
  When set to 'auto' (the default) Python will check the
  PYTHONDONTWRITEBYTECODE environment variable.

* Changed commands

break [PROBE_MODIFIER] [LOCATION] [thread THREADNUM]
      [-force-condition] [if CONDITION]
  This command would previously refuse setting a breakpoint if the
  CONDITION expression is invalid at a location.  It now accepts and
  defines the breakpoint if there is at least one location at which
  the CONDITION is valid.  The locations for which the CONDITION is
  invalid, are automatically disabled.  If CONDITION is invalid at all
  of the locations, setting the breakpoint is still rejected.  However,
  the '-force-condition' flag can be used in this case for forcing GDB to
  define the breakpoint, making all the current locations automatically
  disabled.  This may be useful if the user knows the condition will
  become meaningful at a future location, e.g. due to a shared library
  load.

condition [-force] N COND
  The behavior of this command is changed the same way for the 'break'
  command as explained above.  The '-force' flag can be used to force
  GDB into defining the condition even when COND is invalid for all the
  current locations of breakpoint N.

flushregs
maintenance flush-symbol-cache
  These commands are deprecated in favor of the new commands
  'maintenance flush register-cache' and 'maintenance flush
  symbol-cache' respectively.

set style version foreground COLOR
set style version background COLOR
set style version intensity VALUE
  Control the styling of GDB's version number text.

inferior [ID]
  When the ID parameter is omitted, then this command prints information
  about the current inferior.  When the ID parameter is present, the
  behavior of the command is unchanged and have the inferior ID become
  the current inferior.

maintenance info sections
  The ALLOBJ keyword has been replaced with an -all-objects command
  line flag.  It is now possible to filter which sections are printed
  even when -all-objects is passed.

ptype[/FLAGS] TYPE | EXPRESSION
  The 'ptype' command has two new flags.  When '/x' is set, hexadecimal
  notation is used when printing sizes and offsets of struct members.
  When '/d' is set, decimal notation is used when printing sizes and
  offsets of struct members.  Default behavior is given by 'show print
  type hex'.

info sources
  The info sources command output has been restructured.  The results
  are now based around a list of objfiles (executable and libraries),
  and for each objfile the source files that are part of that objfile
  are listed.

* Removed targets and native configurations

ARM Symbian			arm*-*-symbianelf*

* New remote packets

qMemTags
  Request the remote to send allocation tags for a particular memory range.
QMemTags
  Request the remote to store the specified allocation tags to the requested
  memory range.

* Guile API

  ** Improved support for rvalue reference values:
     TYPE_CODE_RVALUE_REF is now exported as part of the API and the
     value-referenced-value procedure now handles rvalue reference
     values.

  ** New procedures for obtaining value variants:
     value-reference-value, value-rvalue-reference-value and
     value-const-value.

  ** Temporary breakpoints can now be created with make-breakpoint and
     tested for using breakpoint-temporary?.

* Python API

  ** Inferior objects now contain a read-only 'connection_num' attribute that
     gives the connection number as seen in 'info connections' and
     'info inferiors'.

  ** New method gdb.Frame.level() which returns the stack level of the
     frame object.

  ** New method gdb.PendingFrame.level() which returns the stack level
     of the frame object.

  ** When hitting a catchpoint, the Python API will now emit a
     gdb.BreakpointEvent rather than a gdb.StopEvent.  The
     gdb.Breakpoint attached to the event will have type BP_CATCHPOINT.

  ** Python TUI windows can now receive mouse click events.  If the
     Window object implements the click method, it is called for each
     mouse click event in this window.

*** Changes in GDB 10

* There are new feature names for ARC targets: "org.gnu.gdb.arc.core"
  and "org.gnu.gdb.arc.aux".  The old names are still supported but
  must be considered obsolete.  They will be deprecated after some
  grace period.

* Help and apropos commands will now show the documentation of a
  command only once, even if that command has one or more aliases.
  These commands now show the command name, then all of its aliases,
  and finally the description of the command.

* 'help aliases' now shows only the user defined aliases.  GDB predefined
  aliases are shown together with their aliased command.

* GDB now supports debuginfod, an HTTP server for distributing ELF/DWARF
  debugging information as well as source code.

  When built with debuginfod, GDB can automatically query debuginfod
  servers for the separate debug files and source code of the executable
  being debugged.

  To build GDB with debuginfod, pass --with-debuginfod to configure (this
  requires libdebuginfod, the debuginfod client library).

  debuginfod is distributed with elfutils, starting with version 0.178.

  You can get the latest version from https://sourceware.org/elfutils.

* Multi-target debugging support

  GDB now supports debugging multiple target connections
  simultaneously.  For example, you can now have each inferior
  connected to different remote servers running in different machines,
  or have one inferior debugging a local native process, an inferior
  debugging a core dump, etc.

  This support is experimental and comes with some limitations -- you
  can only resume multiple targets simultaneously if all targets
  support non-stop mode, and all remote stubs or servers must support
  the same set of remote protocol features exactly.  See also "info
  connections" and "add-inferior -no-connection" below, and "maint set
  target-non-stop" in the user manual.

* New features in the GDB remote stub, GDBserver

  ** GDBserver is now supported on ARC GNU/Linux.

  ** GDBserver is now supported on RISC-V GNU/Linux.

  ** GDBserver no longer supports these host triplets:

    i[34567]86-*-lynxos*
    powerpc-*-lynxos*
    i[34567]86-*-nto*
    bfin-*-*linux*
    crisv32-*-linux*
    cris-*-linux*
    m32r*-*-linux*
    tilegx-*-linux*
    arm*-*-mingw32ce*
    i[34567]86-*-mingw32ce*

* Debugging MS-Windows processes now sets $_exitsignal when the
  inferior is terminated by a signal, instead of setting $_exitcode.

* Multithreaded symbol loading has now been enabled by default on systems
  that support it (see entry for GDB 9, below), providing faster
  performance for programs with many symbols.

* The $_siginfo convenience variable now also works on Windows targets,
  and will display the EXCEPTION_RECORD of the last handled exception.

* TUI windows can now be arranged horizontally.

* The command history filename can now be set to the empty string
  either using 'set history filename' or by setting 'GDBHISTFILE=' in
  the environment.  The effect of setting this filename to the empty
  string is that GDB will not try to load any previous command
  history.

* On Windows targets, it is now possible to debug 32-bit programs with a
  64-bit GDB.

* New commands

set exec-file-mismatch -- Set exec-file-mismatch handling (ask|warn|off).
show exec-file-mismatch -- Show exec-file-mismatch handling (ask|warn|off).
  Set or show the option 'exec-file-mismatch'.  When GDB attaches to a
  running process, this new option indicates whether to detect
  a mismatch between the current executable file loaded by GDB and the
  executable file used to start the process.  If 'ask', the default,
  display a warning and ask the user whether to load the process
  executable file; if 'warn', just display a warning; if 'off', don't
  attempt to detect a mismatch.

tui new-layout NAME WINDOW WEIGHT [WINDOW WEIGHT]...
  Define a new TUI layout, specifying its name and the windows that
  will be displayed.

maintenance print xml-tdesc [FILE]
  Prints the current target description as an XML document.  If the
  optional FILE is provided (which is an XML target description) then
  the target description is read from FILE into GDB, and then
  reprinted.

maintenance print core-file-backed-mappings
  Prints file-backed mappings loaded from a core file's note section.
  Output is expected to be similar to that of "info proc mappings".

set debug fortran-array-slicing on|off
show debug fortran-array-slicing
  Print debugging when taking slices of Fortran arrays.

set fortran repack-array-slices on|off
show fortran repack-array-slices
  When taking slices from Fortran arrays and strings, if the slice is
  non-contiguous within the original value then, when this option is
  on, the new value will be repacked into a single contiguous value.
  When this option is off, then the value returned will consist of a
  descriptor that describes the slice within the memory of the
  original parent value.

* Changed commands

alias [-a] [--] ALIAS = COMMAND [DEFAULT-ARGS...]
  The alias command can now specify default args for an alias.
  GDB automatically prepends the alias default args to the argument list
  provided explicitly by the user.
  For example, to have a backtrace with full details, you can define
  an alias 'bt_ALL' as
  'alias bt_ALL = backtrace -entry-values both -frame-arg all
     -past-main -past-entry -full'.
  Alias default arguments can also use a set of nested 'with' commands,
  e.g. 'alias pp10 = with print pretty -- with print elem 10 -- print'
  defines the alias pp10 that will pretty print a maximum of 10 elements
  of the given expression (if the expression is an array).

* New targets

GNU/Linux/RISC-V (gdbserver)	riscv*-*-linux*
BPF				bpf-unknown-none
Z80				z80-unknown-*

* Python API

  ** gdb.register_window_type can be used to implement new TUI windows
     in Python.

  ** Dynamic types can now be queried.  gdb.Type has a new attribute,
     "dynamic", and gdb.Type.sizeof can be None for a dynamic type.  A
     field of a dynamic type may have None for its "bitpos" attribute
     as well.

  ** Commands written in Python can be in the "TUI" help class by
     registering with the new constant gdb.COMMAND_TUI.

  ** New method gdb.PendingFrame.architecture () to retrieve the
     architecture of the pending frame.

  ** New gdb.Architecture.registers method that returns a
     gdb.RegisterDescriptorIterator object, an iterator that returns
     gdb.RegisterDescriptor objects.  The new RegisterDescriptor is a
     way to query the registers available for an architecture.

  ** New gdb.Architecture.register_groups method that returns a
     gdb.RegisterGroupIterator object, an iterator that returns
     gdb.RegisterGroup objects.  The new RegisterGroup is a way to
     discover the available register groups.

* Guile API

  ** GDB can now be built with GNU Guile 3.0 and 2.2 in addition to 2.0.

  ** Procedures 'memory-port-read-buffer-size',
     'set-memory-port-read-buffer-size!', 'memory-port-write-buffer-size',
     and 'set-memory-port-write-buffer-size!' are deprecated.  When
     using Guile 2.2 and later, users who need to control the size of
     a memory port's internal buffer can use the 'setvbuf' procedure.

*** Changes in GDB 9

* 'thread-exited' event is now available in the annotations interface.

* New built-in convenience variables $_gdb_major and $_gdb_minor
  provide the GDB version.  They are handy for conditionally using
  features available only in or since specific GDB versions, in
  scripts that should work error-free with many different versions,
  such as in system-wide init files.

* New built-in convenience functions $_gdb_setting, $_gdb_setting_str,
  $_gdb_maint_setting and $_gdb_maint_setting_str provide access to values
  of the GDB settings and the GDB maintenance settings.  They are handy
  for changing the logic of user defined commands depending on the
  current GDB settings.

* GDB now supports Thread Local Storage (TLS) variables on several
  FreeBSD architectures (amd64, i386, powerpc, riscv).  Other
  architectures require kernel changes.  TLS is not yet supported for
  amd64 and i386 process core dumps.

* Support for Pointer Authentication (PAC) on AArch64 Linux.  Return
  addresses that required unmasking are shown in the backtrace with the
  postfix [PAC].

* Two new convenience functions $_cimag and $_creal that extract the
  imaginary and real parts respectively from complex numbers.

* New built-in convenience variables $_shell_exitcode and $_shell_exitsignal
  provide the exitcode or exit status of the shell commands launched by
  GDB commands such as "shell", "pipe" and "make".

* The command define-prefix can now define user defined prefix commands.
  User defined commands can now be defined using these user defined prefix
  commands.

* Command names can now use the . character.

* The RX port now supports XML target descriptions.

* GDB now shows the Ada task names at more places, e.g. in task switching
  messages.

* GDB can now be compiled with Python 3 on Windows.

* New convenience variable $_ada_exception holds the address of the
  Ada exception being thrown.  This is set by Ada-related catchpoints.

* GDB can now place breakpoints on nested functions and subroutines in
  Fortran code.  The '::' operator can be used between parent and
  child scopes when placing breakpoints, for example:

    (gdb) break outer_function::inner_function

  The 'outer_function::' prefix is only needed if 'inner_function' is
  not visible in the current scope.

* In addition to the system-wide gdbinit file, if configured with
 --with-system-gdbinit-dir, GDB will now also load files in that directory
 as system gdbinit files, unless the -nx or -n flag is provided.  Files
 with extensions .gdb, .py and .scm are supported as long as GDB was
 compiled with support for that language.

* GDB now supports multithreaded symbol loading for higher performance.
  This feature is still in testing, so it is disabled by default.  You
  can turn it on using 'maint set worker-threads unlimited'.

* Python API

  ** The gdb.Value type has a new method 'format_string' which returns a
     string representing the value.  The formatting is controlled by the
     optional keyword arguments: 'raw', 'pretty_arrays', 'pretty_structs',
     'array_indexes', 'symbols', 'unions', 'deref_refs', 'actual_objects',
     'static_members', 'max_elements', 'repeat_threshold', and 'format'.

  ** gdb.Type has a new property 'objfile' which returns the objfile the
     type was defined in.

  ** The frame information printed by the python frame filtering code
     is now consistent with what the 'backtrace' command prints when
     there are no filters, or when the 'backtrace' '-no-filters' option
     is given.

  ** The new function gdb.lookup_static_symbol can be used to look up
     symbols with static linkage.

  ** The new function gdb.lookup_static_symbols can be used to look up
     all static symbols with static linkage.

  ** gdb.Objfile has new methods 'lookup_global_symbol' and
     'lookup_static_symbol' to lookup a symbol from this objfile only.

  ** gdb.Block now supports the dictionary syntax for accessing symbols in
     this block (e.g. block['local_variable']).

* New commands

| [COMMAND] | SHELL_COMMAND
| -d DELIM COMMAND DELIM SHELL_COMMAND
pipe [COMMAND] | SHELL_COMMAND
pipe -d DELIM COMMAND DELIM SHELL_COMMAND
  Executes COMMAND and sends its output to SHELL_COMMAND.
  With no COMMAND, repeat the last executed command
  and send its output to SHELL_COMMAND.

define-prefix COMMAND
  Define or mark a command as a user-defined prefix command.
  
with SETTING [VALUE] [-- COMMAND]
w SETTING [VALUE] [-- COMMAND]
  Temporarily set SETTING, run COMMAND, and restore SETTING.
  Usage: with SETTING -- COMMAND
  With no COMMAND, repeats the last executed command.
  SETTING is any GDB setting you can change with the "set"
  subcommands.  For example, 'with language c -- print someobj'
  temporarily switches to the C language in order to print someobj.
  Settings can be combined: 'w lang c -- w print elements unlimited --
  usercmd' switches to the C language and runs usercmd with no limit
  of array elements to print.

maint with SETTING [VALUE] [-- COMMAND]
  Like "with", but works with "maintenance set" settings.

set may-call-functions [on|off]
show may-call-functions
  This controls whether GDB will attempt to call functions in
  the program, such as with expressions in the print command.  It
  defaults to on.  Calling functions in the program being debugged
  can have undesired side effects.  It is now possible to forbid
  such function calls.  If function calls are forbidden, GDB will throw
  an error when a command (such as print expression) calls a function
  in the program.

set print finish [on|off]
show print finish
  This controls whether the `finish' command will display the value
  that is returned by the current function.  When `off', the value is
  still entered into the value history, but it is not printed.  The
  default is `on'.

set print max-depth
show print max-depth
  Allows deeply nested structures to be simplified when printing by
  replacing deeply nested parts (beyond the max-depth) with ellipses.
  The default max-depth is 20, but this can be set to unlimited to get
  the old behavior back.

set print raw-values [on|off]
show print raw-values
  By default, GDB applies the enabled pretty printers when printing a
  value.  This allows to ignore the enabled pretty printers for a series
  of commands.  The default is 'off'.

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

set style title foreground COLOR
set style title background COLOR
set style title intensity VALUE
  Control the styling of titles.

set style highlight foreground COLOR
set style highlight background COLOR
set style highlight intensity VALUE
  Control the styling of highlightings.

maint set worker-threads
maint show worker-threads
  Control the number of worker threads that can be used by GDB.  The
  default is 0.  "unlimited" lets GDB choose a number that is
  reasonable.  Currently worker threads are only used when demangling
  the names of linker symbols.

set style tui-border foreground COLOR
set style tui-border background COLOR
  Control the styling of TUI borders.

set style tui-active-border foreground COLOR
set style tui-active-border background COLOR
  Control the styling of the active TUI border.

maint set test-settings KIND
maint show test-settings KIND
  A set of commands used by the testsuite for exercising the settings
  infrastructure.

maint set tui-resize-message [on|off]
maint show tui-resize-message
  Control whether GDB prints a message each time the terminal is
  resized when in TUI mode.  This is primarily useful for testing the
  TUI.

set print frame-info [short-location|location|location-and-address
                        |source-and-location|source-line|auto]
show print frame-info
  This controls what frame information is printed by the commands printing
  a frame.  This setting will e.g. influence the behaviour of 'backtrace',
  'frame', 'stepi'.  The python frame filtering also respect this setting.
  The 'backtrace' '-frame-info' option can override this global setting.

set tui compact-source
show tui compact-source

  Enable the "compact" display mode for the TUI source window.  The
  compact display uses only as much space as is needed for the line
  numbers in the current file, and only a single space to separate the
  line numbers from the source.

info modules [-q] [REGEXP]
  Return a list of Fortran modules matching REGEXP, or all modules if
  no REGEXP is given.

info module functions [-q] [-m MODULE_REGEXP] [-t TYPE_REGEXP] [REGEXP]
  Return a list of functions within all modules, grouped by module.
  The list of functions can be restricted with the optional regular
  expressions.  MODULE_REGEXP matches against the module name,
  TYPE_REGEXP matches against the function type signature, and REGEXP
  matches against the function name.

info module variables [-q] [-m MODULE_REGEXP] [-t TYPE_REGEXP] [REGEXP]
  Return a list of variables within all modules, grouped by module.
  The list of variables can be restricted with the optional regular
  expressions.  MODULE_REGEXP matches against the module name,
  TYPE_REGEXP matches against the variable type, and REGEXP matches
  against the variable name.

set debug remote-packet-max-chars
show debug remote-packet-max-chars
  Controls the number of characters to output in a remote packet when using
  "set debug remote".
  The default is 512 bytes.

info connections
  Lists the target connections currently in use.

* Changed commands

help
  The "help" command uses the title style to enhance the
  readibility of its output by styling the classes and
  command names.

apropos [-v] REGEXP
  Similarly to "help", the "apropos" command also uses the
  title style for the command names.  "apropos" accepts now
  a flag "-v" (verbose) to show the full documentation
  of matching commands and to use the highlight style to mark
  the documentation parts matching REGEXP.

printf
eval
  The GDB printf and eval commands can now print C-style and Ada-style
  string convenience variables without calling functions in the program.
  This allows to do formatted printing of strings without having
  a running inferior, or when debugging a core dump.

info sources [-dirname | -basename] [--] [REGEXP]
  This command has now optional arguments to only print the files
  whose names match REGEXP.  The arguments -dirname and -basename
  allow to restrict matching respectively to the dirname and basename
  parts of the files.

show style
  The "show style" and its subcommands are now styling
  a style name in their output using its own style, to help
  the user visualize the different styles.

set print frame-arguments
  The new value 'presence' indicates to only indicate the presence of
  arguments using ..., instead of printing argument names and values.

set print raw-frame-arguments
show print raw-frame-arguments

  These commands replace the similarly-named "set/show print raw
  frame-arguments" commands (now with a dash instead of a space).  The
  old commands are now deprecated and may be removed in a future
  release.

add-inferior [-no-connection]
  The add-inferior command now supports a "-no-connection" flag that
  makes the new inferior start with no target connection associated.
  By default, the new inferior inherits the target connection of the
  current inferior.  See also "info connections".

info inferior
  This command's output now includes a new "Connection" column
  indicating which target connection an inferior is bound to.  See
  "info connections" above.

maint test-options require-delimiter
maint test-options unknown-is-error
maint test-options unknown-is-operand
maint show test-options-completion-result
  Commands used by the testsuite to validate the command options
  framework.

focus, winheight, +, -, >, <
  These commands are now case-sensitive.

* New command options, command completion

  GDB now has a standard infrastructure to support dash-style command
  options ('-OPT').  One benefit is that commands that use it can
  easily support completion of command line arguments.  Try "CMD
  -[TAB]" or "help CMD" to find options supported by a command.  Over
  time, we intend to migrate most commands to this infrastructure.  A
  number of commands got support for new command options in this
  release:

  ** The "print" and "compile print" commands now support a number of
     options that allow overriding relevant global print settings as
     set by "set print" subcommands:

      -address [on|off]
      -array [on|off]
      -array-indexes [on|off]
      -elements NUMBER|unlimited
      -null-stop [on|off]
      -object [on|off]
      -pretty [on|off]
      -raw-values [on|off]
      -repeats NUMBER|unlimited
      -static-members [on|off]
      -symbol [on|off]
      -union [on|off]
      -vtbl [on|off]

     Note that because the "print"/"compile print" commands accept
     arbitrary expressions which may look like options (including
     abbreviations), if you specify any command option, then you must
     use a double dash ("--") to mark the end of argument processing.

  ** The "backtrace" command now supports a number of options that
     allow overriding relevant global print settings as set by "set
     backtrace" and "set print" subcommands:

      -entry-values no|only|preferred|if-needed|both|compact|default
      -frame-arguments all|scalars|none
      -raw-frame-arguments [on|off]
      -frame-info auto|source-line|location|source-and-location
           |location-and-address|short-location
      -past-main [on|off]
      -past-entry [on|off]

     In addition, the full/no-filters/hide qualifiers are now also
     exposed as command options too:

      -full
      -no-filters
      -hide

  ** The "frame apply", "tfaas" and "faas" commands similarly now
     support the following options:

      -past-main [on|off]
      -past-entry [on|off]

  ** The new "info sources" options -dirname and -basename options
     are using the standard '-OPT' infrastructure.

   All options above can also be abbreviated.  The argument of boolean
   (on/off) options can be 0/1 too, and also the argument is assumed
   "on" if omitted.  This allows writing compact command invocations,
   like for example:

    (gdb) p -ra -p -o 0 -- *myptr

   The above is equivalent to:

    (gdb) print -raw-values -pretty -object off -- *myptr

  ** The "info types" command now supports the '-q' flag to disable
     printing of some header information in a similar fashion to "info
     variables" and "info functions".

  ** The "info variables", "info functions", and "whereis" commands
     now take a '-n' flag that excludes non-debug symbols (symbols
     from the symbol table, not from the debug info such as DWARF)
     from the results.

* Completion improvements

  ** GDB can now complete the options of the "thread apply all" and
     "taas" commands, and their "-ascending" option can now be
     abbreviated.

  ** GDB can now complete the options of the "info threads", "info
     functions", "info variables", "info locals", and "info args"
     commands.

  ** GDB can now complete the options of the "compile file" and
     "compile code" commands.  The "compile file" command now
     completes on filenames.

  ** GDB can now complete the backtrace command's
     "full/no-filters/hide" qualifiers.

* In settings, you can now abbreviate "unlimited".

  E.g., "set print elements u" is now equivalent to "set print
  elements unlimited".

* New MI commands

-complete
  This lists all the possible completions for the rest of the line, if it
  were to be given as a command itself.  This is intended for use by MI
  frontends in cases when separate CLI and MI channels cannot be used.

-catch-throw, -catch-rethrow, and -catch-catch
  These can be used to catch C++ exceptions in a similar fashion to
  the CLI commands 'catch throw', 'catch rethrow', and 'catch catch'.

-symbol-info-functions, -symbol-info-types, and -symbol-info-variables
  These commands are the MI equivalent of the CLI commands 'info
  functions', 'info types', and 'info variables' respectively.

-symbol-info-modules, this is the MI equivalent of the CLI 'info
  modules' command.

-symbol-info-module-functions and -symbol-info-module-variables.
  These commands are the MI equivalent of the CLI commands 'info
  module functions' and 'info module variables'.

* Other MI changes

 ** The default version of the MI interpreter is now 3 (-i=mi3).

  ** The output of information about multi-location breakpoints (which is
     syntactically incorrect in MI 2) has changed in MI 3.  This affects
     the following commands and events:

	- -break-insert
	- -break-info
	- =breakpoint-created
	- =breakpoint-modified

     The -fix-multi-location-breakpoint-output command can be used to enable
     this behavior with previous MI versions.

 ** Backtraces and frames include a new optional field addr_flags which is
    given after the addr field.  On AArch64 this contains PAC if the address
    has been masked in the frame.  On all other targets the field is not
    present.

* Testsuite

  The testsuite now creates the files gdb.cmd (containing the arguments
  used to launch GDB) and gdb.in (containing all the commands sent to
  GDB) in the output directory for each test script.  Multiple invocations
  are appended with .1, .2, .3 etc.

* Building GDB and GDBserver now requires GNU make >= 3.82.

  Using another implementation of the make program or an earlier version of
  GNU make to build GDB or GDBserver is not supported.

* Building GDB now requires GNU readline >= 7.0.

  GDB now bundles GNU readline 8.0, but if you choose to use
  --with-system-readline, only readline >= 7.0 can be used.

* The TUI SingleKey keymap is now named "SingleKey".  This can be used
  from .inputrc to bind keys in this keymap.  This feature is only
  available when gdb is built against GNU readline 8.0 or later.

* Removed targets and native configurations

  GDB no longer supports debugging the Cell Broadband Engine.  This includes
  both debugging standalone Cell/B.E. SPU applications and integrated debugging
  of Cell/B.E. applications that use both the PPU and SPU architectures.

* New Simulators

TI PRU					pru-*-elf

* Removed targets and native configurations

Solaris 10			i?86-*-solaris2.10, x86_64-*-solaris2.10,
				sparc*-*-solaris2.10

*** Changes in GDB 8.3

* GDB and GDBserver now support access to additional registers on
  PowerPC GNU/Linux targets: PPR, DSCR, TAR, EBB/PMU registers, and
  HTM registers.

* GDB now has experimental support for the compilation and injection of
  C++ source code into the inferior.  This beta release does not include
  support for several language features, such as templates, constructors,
  and operators.

  This feature requires GCC 7.1 or higher built with libcp1.so
  (the C++ plug-in).

* GDB and GDBserver now support IPv6 connections.  IPv6 addresses
  can be passed using the '[ADDRESS]:PORT' notation, or the regular
  'ADDRESS:PORT' method.

* DWARF index cache: GDB can now automatically save indices of DWARF
  symbols on disk to speed up further loading of the same binaries.

* Ada task switching is now supported on aarch64-elf targets when
  debugging a program using the Ravenscar Profile.  For more information,
  see the "Tasking Support when using the Ravenscar Profile" section
  in the GDB user manual.

* GDB in batch mode now exits with status 1 if the last command to be
  executed failed.

* The RISC-V target now supports target descriptions.

* System call catchpoints now support system call aliases on FreeBSD.
  When the ABI of a system call changes in FreeBSD, this is
  implemented by leaving a compatibility system call using the old ABI
  at the existing number and allocating a new system call number for
  the new ABI.  For example, FreeBSD 12 altered the layout of 'struct
  kevent' used by the 'kevent' system call.  As a result, FreeBSD 12
  kernels ship with both 'kevent' and 'freebsd11_kevent' system calls.
  The 'freebsd11_kevent' system call is assigned an alias of 'kevent'
  so that a system call catchpoint for the 'kevent' system call will
  catch invocations of both the 'kevent' and 'freebsd11_kevent'
  binaries.  This ensures that 'kevent' system calls are caught for
  binaries using either the old or new ABIs.

* Terminal styling is now available for the CLI and the TUI.  GNU
  Source Highlight can additionally be used to provide styling of
  source code snippets.  See the "set style" commands, below, for more
  information.

* Removed support for old demangling styles arm, edg, gnu, hp and
  lucid.

* New commands

set debug compile-cplus-types
show debug compile-cplus-types
  Control the display of debug output about type conversion in the
  C++ compile feature.  Commands have no effect while compiling
  for other languages.

set debug skip
show debug skip
  Control whether debug output about files/functions skipping is
  displayed.

frame apply [all | COUNT | -COUNT | level LEVEL...] [FLAG]... COMMAND
  Apply a command to some frames.
  FLAG arguments allow to control what output to produce and how to handle
  errors raised when applying COMMAND to a frame.

taas COMMAND
  Apply a command to all threads (ignoring errors and empty output).
  Shortcut for 'thread apply all -s COMMAND'.

faas COMMAND
  Apply a command to all frames (ignoring errors and empty output).
  Shortcut for 'frame apply all -s COMMAND'.

tfaas COMMAND
  Apply a command to all frames of all threads (ignoring errors and empty
  output).
  Shortcut for 'thread apply all -s frame apply all -s COMMAND'.

maint set dwarf unwinders (on|off)
maint show dwarf unwinders
  Control whether DWARF unwinders can be used.

info proc files
  Display a list of open files for a process.

* Changed commands

Changes to the "frame", "select-frame", and "info frame" CLI commands.
  These commands all now take a frame specification which
  is either a frame level, or one of the keywords 'level', 'address',
  'function', or 'view' followed by a parameter.  Selecting a frame by
  address, or viewing a frame outside the current backtrace now
  requires the use of a keyword.  Selecting a frame by level is
  unchanged.  The MI comment "-stack-select-frame" is unchanged.

target remote FILENAME
target extended-remote FILENAME
  If FILENAME is a Unix domain socket, GDB will attempt to connect
  to this socket instead of opening FILENAME as a character device.

info args [-q] [-t TYPEREGEXP] [NAMEREGEXP]
info functions [-q] [-t TYPEREGEXP] [NAMEREGEXP]
info locals [-q] [-t TYPEREGEXP] [NAMEREGEXP]
info variables [-q] [-t TYPEREGEXP] [NAMEREGEXP]
  These commands can now print only the searched entities
  matching the provided regexp(s), giving a condition
  on the entity names or entity types.  The flag -q disables
  printing headers or informations messages.

info functions
info types
info variables
rbreak
  These commands now determine the syntax for the shown entities
  according to the language chosen by `set language'.  In particular,
  `set language auto' means to automatically choose the language of
  the shown entities.

thread apply [all | COUNT | -COUNT] [FLAG]... COMMAND
  The 'thread apply' command accepts new FLAG arguments.
  FLAG arguments allow to control what output to produce and how to handle
  errors raised when applying COMMAND to a thread.

set tui tab-width NCHARS
show tui tab-width NCHARS
  "set tui tab-width" replaces the "tabset" command, which has been deprecated.

set style enabled [on|off]
show style enabled
  Enable or disable terminal styling.  Styling is enabled by default
  on most hosts, but disabled by default when in batch mode.

set style sources [on|off]
show style sources
  Enable or disable source code styling.  Source code styling is
  enabled by default, but only takes effect if styling in general is
  enabled, and if GDB was linked with GNU Source Highlight.

set style filename foreground COLOR
set style filename background COLOR
set style filename intensity VALUE
  Control the styling of file names.

set style function foreground COLOR
set style function background COLOR
set style function intensity VALUE
  Control the styling of function names.

set style variable foreground COLOR
set style variable background COLOR
set style variable intensity VALUE
  Control the styling of variable names.

set style address foreground COLOR
set style address background COLOR
set style address intensity VALUE
  Control the styling of addresses.

* MI changes

  ** The '-data-disassemble' MI command now accepts an '-a' option to
     disassemble the whole function surrounding the given program
     counter value or function name.  Support for this feature can be
     verified by using the "-list-features" command, which should
     contain "data-disassemble-a-option".

  ** Command responses and notifications that include a frame now include
     the frame's architecture in a new "arch" attribute.

* New native configurations

GNU/Linux/RISC-V		riscv*-*-linux*
FreeBSD/riscv			riscv*-*-freebsd*

* New targets

GNU/Linux/RISC-V		riscv*-*-linux*
CSKY ELF			csky*-*-elf
CSKY GNU/LINUX			csky*-*-linux
FreeBSD/riscv			riscv*-*-freebsd*
NXP S12Z			s12z-*-elf
GNU/Linux/OpenRISC		or1k*-*-linux*

* Removed targets

GDB no longer supports native debugging on versions of MS-Windows
before Windows XP.

* Python API

  ** GDB no longer supports Python versions less than 2.6.

  ** The gdb.Inferior type has a new 'progspace' property, which is the program
     space associated to that inferior.

  ** The gdb.Progspace type has a new 'objfiles' method, which returns the list
     of objfiles associated to that program space.

  ** gdb.SYMBOL_LOC_COMMON_BLOCK, gdb.SYMBOL_MODULE_DOMAIN, and
     gdb.SYMBOL_COMMON_BLOCK_DOMAIN were added to reflect changes to
     the gdb core.

  ** gdb.SYMBOL_VARIABLES_DOMAIN, gdb.SYMBOL_FUNCTIONS_DOMAIN, and
     gdb.SYMBOL_TYPES_DOMAIN are now deprecated.  These were never
     correct and did not work properly.

  ** The gdb.Value type has a new constructor, which is used to construct a
     gdb.Value from a Python buffer object and a gdb.Type.

* Configure changes

--enable-ubsan

  Enable or disable the undefined behavior sanitizer.  This is
  disabled by default, but passing --enable-ubsan=yes or
  --enable-ubsan=auto to configure will enable it.  Enabling this can
  cause a performance penalty.  The undefined behavior sanitizer was
  first introduced in GCC 4.9.

*** Changes in GDB 8.2

* The 'set disassembler-options' command now supports specifying options
  for the MIPS target.

* The 'symbol-file' command now accepts an '-o' option to add a relative
  offset to all sections.

* Similarly, the 'add-symbol-file' command also accepts an '-o' option to add
  a relative offset to all sections, but it allows to override the load
  address of individual sections using '-s'.

* The 'add-symbol-file' command no longer requires the second argument
  (address of the text section).

* The endianness used with the 'set endian auto' mode in the absence of
  an executable selected for debugging is now the last endianness chosen
  either by one of the 'set endian big' and 'set endian little' commands
  or by inferring from the last executable used, rather than the startup
  default.

* The pager now allows a "c" response, meaning to disable the pager
  for the rest of the current command.

* The commands 'info variables/functions/types' now show the source line
  numbers of symbol definitions when available.

* 'info proc' now works on running processes on FreeBSD systems and core
  files created on FreeBSD systems.

* C expressions can now use _Alignof, and C++ expressions can now use
  alignof.

* Support for SVE on AArch64 Linux.  Note that GDB does not detect changes to
  the vector length while the process is running.

* New commands

set debug fbsd-nat
show debug fbsd-nat
  Control display of debugging info regarding the FreeBSD native target.

set|show varsize-limit
  This new setting allows the user to control the maximum size of Ada
  objects being printed when those objects have a variable type,
  instead of that maximum size being hardcoded to 65536 bytes.

set|show record btrace cpu
  Controls the processor to be used for enabling errata workarounds for
  branch trace decode.

maint check libthread-db
  Run integrity checks on the current inferior's thread debugging
  library

maint set check-libthread-db (on|off)
maint show check-libthread-db
  Control whether to run integrity checks on inferior specific thread
  debugging libraries as they are loaded.  The default is not to
  perform such checks.

* Python API

  ** Type alignment is now exposed via the "align" attribute of a gdb.Type.

  ** The commands attached to a breakpoint can be set by assigning to
     the breakpoint's "commands" field.

  ** gdb.execute can now execute multi-line gdb commands.

  ** The new functions gdb.convenience_variable and
     gdb.set_convenience_variable can be used to get and set the value
     of convenience variables.

  ** A gdb.Parameter will no longer print the "set" help text on an
     ordinary "set"; instead by default a "set" will be silent unless
     the get_set_string method returns a non-empty string.

* New targets

RiscV ELF			riscv*-*-elf

* Removed targets and native configurations

m88k running OpenBSD  		m88*-*-openbsd*
SH-5/SH64 ELF			sh64-*-elf*, SH-5/SH64 support in sh*
SH-5/SH64 running GNU/Linux	SH-5/SH64 support in sh*-*-linux*
SH-5/SH64 running OpenBSD 	SH-5/SH64 support in sh*-*-openbsd*

* Aarch64/Linux hardware watchpoints improvements

  Hardware watchpoints on unaligned addresses are now properly
  supported when running Linux kernel 4.10 or higher: read and access
  watchpoints are no longer spuriously missed, and all watchpoints
  lengths between 1 and 8 bytes are supported.  On older kernels,
  watchpoints set on unaligned addresses are no longer missed, with
  the tradeoff that there is a possibility of false hits being
  reported.

* Configure changes

--enable-codesign=CERT
  This can be used to invoke "codesign -s CERT" after building gdb.
  This option is useful on macOS, where code signing is required for
  gdb to work properly.

--disable-gdbcli has been removed
  This is now silently accepted, but does nothing.

*** Changes in GDB 8.1

* GDB now supports dynamically creating arbitrary register groups specified
  in XML target descriptions.  This allows for finer grain grouping of
  registers on systems with a large amount of registers.

* The 'ptype' command now accepts a '/o' flag, which prints the
  offsets and sizes of fields in a struct, like the pahole(1) tool.

* New "--readnever" command line option instructs GDB to not read each
  symbol file's symbolic debug information.  This makes startup faster
  but at the expense of not being able to perform symbolic debugging.
  This option is intended for use cases where symbolic debugging will
  not be used, e.g., when you only need to dump the debuggee's core.

* GDB now uses the GNU MPFR library, if available, to emulate target
  floating-point arithmetic during expression evaluation when the target
  uses different floating-point formats than the host.  At least version
  3.1 of GNU MPFR is required.

* GDB now supports access to the guarded-storage-control registers and the
  software-based guarded-storage broadcast control registers on IBM z14.

* On Unix systems, GDB now supports transmitting environment variables
  that are to be set or unset to GDBserver.  These variables will
  affect the environment to be passed to the remote inferior.

  To inform GDB of environment variables that are to be transmitted to
  GDBserver, use the "set environment" command.  Only user set
  environment variables are sent to GDBserver.

  To inform GDB of environment variables that are to be unset before
  the remote inferior is started by the GDBserver, use the "unset
  environment" command.

* Completion improvements

  ** GDB can now complete function parameters in linespecs and
     explicit locations without quoting.  When setting breakpoints,
     quoting around functions names to help with TAB-completion is
     generally no longer necessary.  For example, this now completes
     correctly:

      (gdb) b function(in[TAB]
      (gdb) b function(int)

     Related, GDB is no longer confused with completing functions in
     C++ anonymous namespaces:

      (gdb) b (anon[TAB]
      (gdb) b (anonymous namespace)::[TAB][TAB]
      (anonymous namespace)::a_function()
      (anonymous namespace)::b_function()

  ** GDB now has much improved linespec and explicit locations TAB
     completion support, that better understands what you're
     completing and offers better suggestions.  For example, GDB no
     longer offers data symbols as possible completions when you're
     setting a breakpoint.

  ** GDB now TAB-completes label symbol names.

  ** The "complete" command now mimics TAB completion accurately.

* New command line options (gcore)

-a
  Dump all memory mappings.

* Breakpoints on C++ functions are now set on all scopes by default

  By default, breakpoints on functions/methods are now interpreted as
  specifying all functions with the given name ignoring missing
  leading scopes (namespaces and classes).

  For example, assuming a C++ program with symbols named:

    A::B::func()
    B::func()

  both commands "break func()" and "break B::func()" set a breakpoint
  on both symbols.

  You can use the new flag "-qualified" to override this.  This makes
  GDB interpret the specified function name as a complete
  fully-qualified name instead.  For example, using the same C++
  program, the "break -q B::func" command sets a breakpoint on
  "B::func", only.  A parameter has been added to the Python
  gdb.Breakpoint constructor to achieve the same result when creating
  a breakpoint from Python.

* Breakpoints on functions marked with C++ ABI tags

  GDB can now set breakpoints on functions marked with C++ ABI tags
  (e.g., [abi:cxx11]).  See here for a description of ABI tags:
  https://developers.redhat.com/blog/2015/02/05/gcc5-and-the-c11-abi/

  Functions with a C++11 abi tag are demangled/displayed like this:

    function[abi:cxx11](int)
            ^^^^^^^^^^^

  You can now set a breakpoint on such functions simply as if they had
  no tag, like:

    (gdb) b function(int)

  Or if you need to disambiguate between tags, like:

    (gdb) b function[abi:other_tag](int)

  Tab completion was adjusted accordingly as well.

* Python Scripting

  ** New events gdb.new_inferior, gdb.inferior_deleted, and
     gdb.new_thread are emitted.  See the manual for further
     description of these.

  ** A new function, "gdb.rbreak" has been added to the Python API.
     This function allows the setting of a large number of breakpoints
     via a regex pattern in Python.  See the manual for further details.

  ** Python breakpoints can now accept explicit locations.  See the
     manual for a further description of this feature.


* New features in the GDB remote stub, GDBserver

  ** GDBserver is now able to start inferior processes with a
     specified initial working directory.

     The user can set the desired working directory to be used from
     GDB using the new "set cwd" command.

  ** New "--selftest" command line option runs some GDBserver self
     tests.  These self tests are disabled in releases.

  ** On Unix systems, GDBserver now does globbing expansion and variable
     substitution in inferior command line arguments.

     This is done by starting inferiors using a shell, like GDB does.
     See "set startup-with-shell" in the user manual for how to disable
     this from GDB when using "target extended-remote".  When using
     "target remote", you can disable the startup with shell by using the
     new "--no-startup-with-shell" GDBserver command line option.

  ** On Unix systems, GDBserver now supports receiving environment
     variables that are to be set or unset from GDB.  These variables
     will affect the environment to be passed to the inferior.

* When catching an Ada exception raised with a message, GDB now prints
  the message in the catchpoint hit notification. In GDB/MI mode, that
  information is provided as an extra field named "exception-message"
  in the *stopped notification.

* Trait objects can now be inspected When debugging Rust code.  This
  requires compiler support which will appear in Rust 1.24.

* New remote packets

QEnvironmentHexEncoded
  Inform GDBserver of an environment variable that is to be passed to
  the inferior when starting it.

QEnvironmentUnset
  Inform GDBserver of an environment variable that is to be unset
  before starting the remote inferior.

QEnvironmentReset
  Inform GDBserver that the environment should be reset (i.e.,
  user-set environment variables should be unset).

QStartupWithShell
  Indicates whether the inferior must be started with a shell or not.

QSetWorkingDir
  Tell GDBserver that the inferior to be started should use a specific
  working directory.

* The "maintenance print c-tdesc" command now takes an optional
  argument which is the file name of XML target description.

* The "maintenance selftest" command now takes an optional argument to
  filter the tests to be run.

* The "enable", and "disable" commands now accept a range of
  breakpoint locations, e.g. "enable 1.3-5".

* New commands

set|show cwd
  Set and show the current working directory for the inferior.

set|show compile-gcc
  Set and show compilation command used for compiling and injecting code
  with the 'compile' commands.

set debug separate-debug-file
show debug separate-debug-file
  Control the display of debug output about separate debug file search.

set dump-excluded-mappings
show dump-excluded-mappings
  Control whether mappings marked with the VM_DONTDUMP flag should be
  dumped when generating a core file.

maint info selftests
  List the registered selftests.

starti
  Start the debugged program stopping at the first instruction.

set|show debug or1k
  Control display of debugging messages related to OpenRISC targets.

set|show print type nested-type-limit
  Set and show the limit of nesting level for nested types that the
  type printer will show.

* TUI Single-Key mode now supports two new shortcut keys: `i' for stepi and
  `o' for nexti.

* Safer/improved support for debugging with no debug info

  GDB no longer assumes functions with no debug information return
  'int'.

  This means that GDB now refuses to call such functions unless you
  tell it the function's type, by either casting the call to the
  declared return type, or by casting the function to a function
  pointer of the right type, and calling that:

    (gdb) p getenv ("PATH")
    'getenv' has unknown return type; cast the call to its declared return type
    (gdb) p (char *) getenv ("PATH")
    $1 = 0x7fffffffe "/usr/local/bin:/"...
    (gdb) p ((char * (*) (const char *)) getenv) ("PATH")
    $2 = 0x7fffffffe "/usr/local/bin:/"...

  Similarly, GDB no longer assumes that global variables with no debug
  info have type 'int', and refuses to print the variable's value
  unless you tell it the variable's type:

    (gdb) p var
    'var' has unknown type; cast it to its declared type
    (gdb) p (float) var
    $3 = 3.14

* New native configurations

FreeBSD/aarch64			aarch64*-*-freebsd*
FreeBSD/arm			arm*-*-freebsd*

* New targets

FreeBSD/aarch64			aarch64*-*-freebsd*
FreeBSD/arm			arm*-*-freebsd*
OpenRISC ELF 			or1k*-*-elf

* Removed targets and native configurations

Solaris 2.0-9			i?86-*-solaris2.[0-9], sparc*-*-solaris2.[0-9]

*** Changes in GDB 8.0

* GDB now supports access to the PKU register on GNU/Linux. The register is
  added by the Memory Protection Keys for Userspace feature which will be
  available in future Intel CPUs.

* GDB now supports C++11 rvalue references.

* Python Scripting

  ** New functions to start, stop and access a running btrace recording.
  ** Rvalue references are now supported in gdb.Type.

* GDB now supports recording and replaying rdrand and rdseed Intel 64
  instructions.

* Building GDB and GDBserver now requires a C++11 compiler.

  For example, GCC 4.8 or later.

  It is no longer possible to build GDB or GDBserver with a C
  compiler.  The --disable-build-with-cxx configure option has been
  removed.

* Building GDB and GDBserver now requires GNU make >= 3.81.

  It is no longer supported to build GDB or GDBserver with another
  implementation of the make program or an earlier version of GNU make.

* Native debugging on MS-Windows supports command-line redirection

  Command-line arguments used for starting programs on MS-Windows can
  now include redirection symbols supported by native Windows shells,
  such as '<', '>', '>>', '2>&1', etc.  This affects GDB commands such
  as "run", "start", and "set args", as well as the corresponding MI
  features.

* Support for thread names on MS-Windows.

  GDB now catches and handles the special exception that programs
  running on MS-Windows use to assign names to threads in the
  debugger.

* Support for Java programs compiled with gcj has been removed.

* User commands now accept an unlimited number of arguments.
  Previously, only up to 10 was accepted.

* The "eval" command now expands user-defined command arguments.

  This makes it easier to process a variable number of arguments:

   define mycommand
     set $i = 0
     while $i < $argc
       eval "print $arg%d", $i
       set $i = $i + 1
     end
   end

* Target descriptions can now describe registers for sparc32 and sparc64.

* GDB now supports DWARF version 5 (debug information format).
  Its .debug_names index is not yet supported.

* New native configurations

FreeBSD/mips			mips*-*-freebsd

* New targets

Synopsys ARC			arc*-*-elf32
FreeBSD/mips			mips*-*-freebsd

* Removed targets and native configurations

Alpha running FreeBSD         alpha*-*-freebsd*
Alpha running GNU/kFreeBSD    alpha*-*-kfreebsd*-gnu

* New commands

flash-erase
  Erases all the flash memory regions reported by the target.

maint print arc arc-instruction address
  Print internal disassembler information about instruction at a given address.

* New options

set disassembler-options
show disassembler-options
  Controls the passing of target specific information to the disassembler.
  If it is necessary to specify more than one disassembler option then
  multiple options can be placed together into a comma separated list.
  The default value is the empty string.  Currently, the only supported
  targets are ARM, PowerPC and S/390.

* New MI commands

-target-flash-erase
  Erases all the flash memory regions reported by the target.  This is
  equivalent to the CLI command flash-erase.

-file-list-shared-libraries
  List the shared libraries in the program.  This is
  equivalent to the CLI command "info shared".

-catch-handlers
  Catchpoints stopping the program when Ada exceptions are
  handled.  This is equivalent to the CLI command "catch handlers".

*** Changes in GDB 7.12

* GDB and GDBserver now build with a C++ compiler by default.

  The --enable-build-with-cxx configure option is now enabled by
  default.  One must now explicitly configure with
  --disable-build-with-cxx in order to build with a C compiler.  This
  option will be removed in a future release.

* GDBserver now supports recording btrace without maintaining an active
  GDB connection.

* GDB now supports a negative repeat count in the 'x' command to examine
  memory backward from the given address.  For example:

    (gdb) bt
    #0  Func1 (n=42, p=0x40061c "hogehoge") at main.cpp:4
    #1  0x400580 in main (argc=1, argv=0x7fffffffe5c8) at main.cpp:8
    (gdb) x/-5i 0x0000000000400580
       0x40056a <main(int, char**)+8>:      mov    %edi,-0x4(%rbp)
       0x40056d <main(int, char**)+11>:     mov    %rsi,-0x10(%rbp)
       0x400571 <main(int, char**)+15>:     mov    $0x40061c,%esi
       0x400576 <main(int, char**)+20>:     mov    $0x2a,%edi
       0x40057b <main(int, char**)+25>:
        callq  0x400536 <Func1(int, char const*)>

* Fortran: Support structures with fields of dynamic types and 
  arrays of dynamic types.

* The symbol dumping maintenance commands have new syntax.
maint print symbols [-pc address] [--] [filename]
maint print symbols [-objfile objfile] [-source source] [--] [filename]
maint print psymbols [-objfile objfile] [-pc address] [--] [filename]
maint print psymbols [-objfile objfile] [-source source] [--] [filename]
maint print msymbols [-objfile objfile] [--] [filename]

* GDB now supports multibit bitfields and enums in target register
  descriptions.

* New Python-based convenience function $_as_string(val), which returns
  the textual representation of a value.  This function is especially
  useful to obtain the text label of an enum value.

* Intel MPX bound violation handling.

   Segmentation faults caused by a Intel MPX boundary violation
   now display the kind of violation (upper or lower), the memory
   address accessed and the memory bounds, along with the usual
   signal received and code location.

   For example:

   Program received signal SIGSEGV, Segmentation fault
   Upper bound violation while accessing address 0x7fffffffc3b3
   Bounds: [lower = 0x7fffffffc390, upper = 0x7fffffffc3a3]
   0x0000000000400d7c in upper () at i386-mpx-sigsegv.c:68

* Rust language support.
  GDB now supports debugging programs written in the Rust programming
  language.  See https://www.rust-lang.org/ for more information about
  Rust.

* Support for running interpreters on specified input/output devices

  GDB now supports a new mechanism that allows frontends to provide
  fully featured GDB console views, as a better alternative to
  building such views on top of the "-interpreter-exec console"
  command.  See the new "new-ui" command below.  With that command,
  frontends can now start GDB in the traditional command-line mode
  running in an embedded terminal emulator widget, and create a
  separate MI interpreter running on a specified i/o device.  In this
  way, GDB handles line editing, history, tab completion, etc. in the
  console all by itself, and the GUI uses the separate MI interpreter
  for its own control and synchronization, invisible to the command
  line.

* The "catch syscall" command catches groups of related syscalls.

  The "catch syscall" command now supports catching a group of related
  syscalls using the 'group:' or 'g:' prefix.

* New commands

skip -file file
skip -gfile file-glob-pattern
skip -function function
skip -rfunction regular-expression
  A generalized form of the skip command, with new support for
  glob-style file names and regular expressions for function names.
  Additionally, a file spec and a function spec may now be combined.

maint info line-table REGEXP
  Display the contents of GDB's internal line table data structure.

maint selftest
  Run any GDB unit tests that were compiled in.

new-ui INTERP TTY
  Start a new user interface instance running INTERP as interpreter,
  using the TTY file for input/output.

* Python Scripting

  ** gdb.Breakpoint objects have a new attribute "pending", which
     indicates whether the breakpoint is pending.
  ** Three new breakpoint-related events have been added:
     gdb.breakpoint_created, gdb.breakpoint_modified, and
     gdb.breakpoint_deleted.

signal-event EVENTID
  Signal ("set") the given MS-Windows event object.  This is used in
  conjunction with the Windows JIT debugging (AeDebug) support, where
  the OS suspends a crashing process until a debugger can attach to
  it.  Resuming the crashing process, in order to debug it, is done by
  signalling an event.

* Support for tracepoints and fast tracepoints on s390-linux and s390x-linux
  was added in GDBserver, including JIT compiling fast tracepoint's
  conditional expression bytecode into native code.

* Support for various remote target protocols and ROM monitors has
  been removed:

  target m32rsdi	Remote M32R debugging over SDI
  target mips		MIPS remote debugging protocol
  target pmon		PMON ROM monitor
  target ddb		NEC's DDB variant of PMON for Vr4300
  target rockhopper	NEC RockHopper variant of PMON
  target lsi		LSI variant of PMO

* Support for tracepoints and fast tracepoints on powerpc-linux,
  powerpc64-linux, and powerpc64le-linux was added in GDBserver,
  including JIT compiling fast tracepoint's conditional expression
  bytecode into native code.

* MI async record =record-started now includes the method and format used for
  recording.  For example:

    =record-started,thread-group="i1",method="btrace",format="bts"

* MI async record =thread-selected now includes the frame field.  For example:

     =thread-selected,id="3",frame={level="0",addr="0x00000000004007c0"}

* New targets

Andes NDS32			nds32*-*-elf

*** Changes in GDB 7.11

* GDB now supports debugging kernel-based threads on FreeBSD.

* Per-inferior thread numbers

  Thread numbers are now per inferior instead of global.  If you're
  debugging multiple inferiors, GDB displays thread IDs using a
  qualified INF_NUM.THR_NUM form.  For example:

     (gdb) info threads
       Id   Target Id         Frame
       1.1  Thread 0x7ffff7fc2740 (LWP 8155) (running)
       1.2  Thread 0x7ffff7fc1700 (LWP 8168) (running)
     * 2.1  Thread 0x7ffff7fc2740 (LWP 8157) (running)
       2.2  Thread 0x7ffff7fc1700 (LWP 8190) (running)

  As consequence, thread numbers as visible in the $_thread
  convenience variable and in Python's InferiorThread.num attribute
  are no longer unique between inferiors.

  GDB now maintains a second thread ID per thread, referred to as the
  global thread ID, which is the new equivalent of thread numbers in
  previous releases.  See also $_gthread below.

  For backwards compatibility, MI's thread IDs always refer to global
  IDs.

* Commands that accept thread IDs now accept the qualified
  INF_NUM.THR_NUM form as well.  For example:

     (gdb) thread 2.1
     [Switching to thread 2.1 (Thread 0x7ffff7fc2740 (LWP 8157))] (running)
     (gdb)

* In commands that accept a list of thread IDs, you can now refer to
  all threads of an inferior using a star wildcard.  GDB accepts
  "INF_NUM.*", to refer to all threads of inferior INF_NUM, and "*" to
  refer to all threads of the current inferior.  For example, "info
  threads 2.*".

* You can use "info threads -gid" to display the global thread ID of
  all threads.

* The new convenience variable $_gthread holds the global number of
  the current thread.

* The new convenience variable $_inferior holds the number of the
  current inferior.

* GDB now displays the ID and name of the thread that hit a breakpoint
  or received a signal, if your program is multi-threaded.  For
  example:

   Thread 3 "bar" hit Breakpoint 1 at 0x40087a: file program.c, line 20.
   Thread 1 "main" received signal SIGINT, Interrupt.

* Record btrace now supports non-stop mode.

* Support for tracepoints on aarch64-linux was added in GDBserver.

* The 'record instruction-history' command now indicates speculative execution
  when using the Intel Processor Trace recording format.

* GDB now allows users to specify explicit locations, bypassing
  the linespec parser.  This feature is also available to GDB/MI
  clients.

* Multi-architecture debugging is supported on AArch64 GNU/Linux.
  GDB now is able to debug both AArch64 applications and ARM applications
  at the same time.

* Support for fast tracepoints on aarch64-linux was added in GDBserver,
  including JIT compiling fast tracepoint's conditional expression bytecode
  into native code.

* GDB now supports displaced stepping on AArch64 GNU/Linux.

* "info threads", "info inferiors", "info display", "info checkpoints"
  and "maint info program-spaces" now list the corresponding items in
  ascending ID order, for consistency with all other "info" commands.

* In Ada, the overloads selection menu has been enhanced to display the
  parameter types and the return types for the matching overloaded subprograms.

* New commands

maint set target-non-stop (on|off|auto)
maint show target-non-stop
  Control whether GDB targets always operate in non-stop mode even if
  "set non-stop" is "off".  The default is "auto", meaning non-stop
  mode is enabled if supported by the target.

maint set bfd-sharing
maint show bfd-sharing
  Control the reuse of bfd objects.

set debug bfd-cache
show debug bfd-cache
  Control display of debugging info regarding bfd caching.

set debug fbsd-lwp
show debug fbsd-lwp
  Control display of debugging info regarding FreeBSD threads.

set remote multiprocess-extensions-packet
show remote multiprocess-extensions-packet
  Set/show the use of the remote protocol multiprocess extensions.

set remote thread-events
show remote thread-events
  Set/show the use of thread create/exit events.

set ada print-signatures on|off
show ada print-signatures"
  Control whether parameter types and return types are displayed in overloads
  selection menus.  It is activated (@code{on}) by default.

set max-value-size
show max-value-size
  Controls the maximum size of memory, in bytes, that GDB will
  allocate for value contents.  Prevents incorrect programs from
  causing GDB to allocate overly large buffers.  Default is 64k.

* The "disassemble" command accepts a new modifier: /s.
  It prints mixed source+disassembly like /m with two differences:
  - disassembled instructions are now printed in program order, and
  - and source for all relevant files is now printed.
  The "/m" option is now considered deprecated: its "source-centric"
  output hasn't proved useful in practice.

* The "record instruction-history" command accepts a new modifier: /s.
  It behaves exactly like /m and prints mixed source+disassembly.

* The "set scheduler-locking" command supports a new mode "replay".
  It behaves like "off" in record mode and like "on" in replay mode.

* Support for various ROM monitors has been removed:

  target dbug		dBUG ROM monitor for Motorola ColdFire
  target picobug	Motorola picobug monitor
  target dink32		DINK32 ROM monitor for PowerPC
  target m32r		Renesas M32R/D ROM monitor
  target mon2000	mon2000 ROM monitor
  target ppcbug		PPCBUG ROM monitor for PowerPC

* Support for reading/writing memory and extracting values on architectures
  whose memory is addressable in units of any integral multiple of 8 bits.

catch handlers
  Allows to break when an Ada exception is handled.

* New remote packets

exec stop reason
  Indicates that an exec system call was executed.

exec-events feature in qSupported
  The qSupported packet allows GDB to request support for exec
  events using the new 'gdbfeature' exec-event, and the qSupported
  response can contain the corresponding 'stubfeature'.  Set and
  show commands can be used to display whether these features are enabled.

vCtrlC
  Equivalent to interrupting with the ^C character, but works in
  non-stop mode.

thread created stop reason (T05 create:...)
  Indicates that the thread was just created and is stopped at entry.

thread exit stop reply (w exitcode;tid)
  Indicates that the thread has terminated.

QThreadEvents
  Enables/disables thread create and exit event reporting.  For
  example, this is used in non-stop mode when GDB stops a set of
  threads and synchronously waits for the their corresponding stop
  replies.  Without exit events, if one of the threads exits, GDB
  would hang forever not knowing that it should no longer expect a
  stop for that same thread.

N stop reply
  Indicates that there are no resumed threads left in the target (all
  threads are stopped).  The remote stub reports support for this stop
  reply to GDB's qSupported query.

QCatchSyscalls
  Enables/disables catching syscalls from the inferior process.
  The remote stub reports support for this packet to GDB's qSupported query.

syscall_entry stop reason
  Indicates that a syscall was just called.

syscall_return stop reason
  Indicates that a syscall just returned.

* Extended-remote exec events

  ** GDB now has support for exec events on extended-remote Linux targets.
     For such targets with Linux kernels 2.5.46 and later, this enables
     follow-exec-mode and exec catchpoints.

set remote exec-event-feature-packet
show remote exec-event-feature-packet
  Set/show the use of the remote exec event feature.

 * Thread names in remote protocol

   The reply to qXfer:threads:read may now include a name attribute for each
   thread.

* Target remote mode fork and exec events

  ** GDB now has support for fork and exec events on target remote mode
     Linux targets.  For such targets with Linux kernels 2.5.46 and later,
     this enables follow-fork-mode, detach-on-fork, follow-exec-mode, and
     fork and exec catchpoints.

* Remote syscall events

  ** GDB now has support for catch syscall on remote Linux targets,
     currently enabled on x86/x86_64 architectures.

set remote catch-syscall-packet
show remote catch-syscall-packet
  Set/show the use of the remote catch syscall feature.

* MI changes

  ** The -var-set-format command now accepts the zero-hexadecimal
     format.  It outputs data in hexadecimal format with zero-padding on the
     left.

* Python Scripting

  ** gdb.InferiorThread objects have a new attribute "global_num",
     which refers to the thread's global thread ID.  The existing
     "num" attribute now refers to the thread's per-inferior number.
     See "Per-inferior thread numbers" above.
  ** gdb.InferiorThread objects have a new attribute "inferior", which
     is the Inferior object the thread belongs to.

*** Changes in GDB 7.10

* Support for process record-replay and reverse debugging on aarch64*-linux*
  targets has been added.  GDB now supports recording of A64 instruction set
  including advance SIMD instructions.

* Support for Sun's version of the "stabs" debug file format has been removed.

* GDB now honors the content of the file /proc/PID/coredump_filter
  (PID is the process ID) on GNU/Linux systems.  This file can be used
  to specify the types of memory mappings that will be included in a
  corefile.  For more information, please refer to the manual page of
  "core(5)".  GDB also has a new command: "set use-coredump-filter
  on|off".  It allows to set whether GDB will read the content of the
  /proc/PID/coredump_filter file when generating a corefile.

* The "info os" command on GNU/Linux can now display information on
  cpu information :
    "info os cpus" Listing of all cpus/cores on the system

* GDB has two new commands: "set serial parity odd|even|none" and
  "show serial parity".  These allows to set or show parity for the
  remote serial I/O.

* The "info source" command now displays the producer string if it was
  present in the debug info.  This typically includes the compiler version
  and may include things like its command line arguments.

* The "info dll", an alias of the "info sharedlibrary" command,
  is now available on all platforms.

* Directory names supplied to the "set sysroot" commands may be
  prefixed with "target:" to tell GDB to access shared libraries from
  the target system, be it local or remote.  This replaces the prefix
  "remote:".  The default sysroot has been changed from "" to
  "target:".  "remote:" is automatically converted to "target:" for
  backward compatibility.

* The system root specified by "set sysroot" will be prepended to the
  filename of the main executable (if reported to GDB as absolute by
  the operating system) when starting processes remotely, and when
  attaching to already-running local or remote processes.

* GDB now supports automatic location and retrieval of executable
  files from remote targets.  Remote debugging can now be initiated
  using only a "target remote" or "target extended-remote" command
  (no "set sysroot" or "file" commands are required).  See "New remote
  packets" below.

* The "dump" command now supports verilog hex format.

* GDB now supports the vector ABI on S/390 GNU/Linux targets.

* On GNU/Linux, GDB and gdbserver are now able to access executable
  and shared library files without a "set sysroot" command when
  attaching to processes running in different mount namespaces from
  the debugger.  This makes it possible to attach to processes in
  containers as simply as "gdb -p PID" or "gdbserver --attach PID".
  See "New remote packets" below.

* The "tui reg" command now provides completion for all of the
  available register groups, including target specific groups.

* The HISTSIZE environment variable is no longer read when determining
  the size of GDB's command history.  GDB now instead reads the dedicated
  GDBHISTSIZE environment variable.  Setting GDBHISTSIZE to "-1" or to "" now
  disables truncation of command history.  Non-numeric values of GDBHISTSIZE
  are ignored.

* Guile Scripting

  ** Memory ports can now be unbuffered.

* Python Scripting

  ** gdb.Objfile objects have a new attribute "username",
     which is the name of the objfile as specified by the user,
     without, for example, resolving symlinks.
  ** You can now write frame unwinders in Python.
  ** gdb.Type objects have a new method "optimized_out",
     returning optimized out gdb.Value instance of this type.
  ** gdb.Value objects have new methods "reference_value" and
     "const_value" which return a reference to the value and a
     "const" version of the value respectively.

* New commands

maint print symbol-cache
  Print the contents of the symbol cache.

maint print symbol-cache-statistics
  Print statistics of symbol cache usage.

maint flush-symbol-cache
  Flush the contents of the symbol cache.

record btrace bts
record bts
  Start branch trace recording using Branch Trace Store (BTS) format.

compile print
  Evaluate expression by using the compiler and print result.

tui enable
tui disable
  Explicit commands for enabling and disabling tui mode.

show mpx bound
set mpx bound on i386 and amd64
   Support for bound table investigation on Intel MPX enabled applications.

record btrace pt
record pt
  Start branch trace recording using Intel Processor Trace format.

maint info btrace
  Print information about branch tracing internals.

maint btrace packet-history
  Print the raw branch tracing data.

maint btrace clear-packet-history
  Discard the stored raw branch tracing data.

maint btrace clear
  Discard all branch tracing data.  It will be fetched and processed
  anew by the next "record" command.

* New options

set debug dwarf-die
  Renamed from "set debug dwarf2-die".
show debug dwarf-die
  Renamed from "show debug dwarf2-die".

set debug dwarf-read
  Renamed from "set debug dwarf2-read".
show debug dwarf-read
  Renamed from "show debug dwarf2-read".

maint set dwarf always-disassemble
  Renamed from "maint set dwarf2 always-disassemble".
maint show dwarf always-disassemble
  Renamed from "maint show dwarf2 always-disassemble".

maint set dwarf max-cache-age
  Renamed from "maint set dwarf2 max-cache-age".
maint show dwarf max-cache-age
  Renamed from "maint show dwarf2 max-cache-age".

set debug dwarf-line
show debug dwarf-line
  Control display of debugging info regarding DWARF line processing.

set max-completions
show max-completions
  Set the maximum number of candidates to be considered during
  completion.  The default value is 200.  This limit allows GDB
  to avoid generating large completion lists, the computation of
  which can cause the debugger to become temporarily unresponsive.

set history remove-duplicates
show history remove-duplicates
  Control the removal of duplicate history entries.

maint set symbol-cache-size
maint show symbol-cache-size
  Control the size of the symbol cache.

set|show record btrace bts buffer-size
  Set and show the size of the ring buffer used for branch tracing in
  BTS format.
  The obtained size may differ from the requested size.  Use "info
  record" to see the obtained buffer size.

set debug linux-namespaces
show debug linux-namespaces
  Control display of debugging info regarding Linux namespaces.

set|show record btrace pt buffer-size
  Set and show the size of the ring buffer used for branch tracing in
  Intel Processor Trace format.
  The obtained size may differ from the requested size.  Use "info
  record" to see the obtained buffer size.

maint set|show btrace pt skip-pad
  Set and show whether PAD packets are skipped when computing the
  packet history.

* The command 'thread apply all' can now support new option '-ascending'
  to call its specified command for all threads in ascending order.

* Python/Guile scripting

  ** GDB now supports auto-loading of Python/Guile scripts contained in the
     special section named `.debug_gdb_scripts'.

* New remote packets

qXfer:btrace-conf:read
  Return the branch trace configuration for the current thread.

Qbtrace-conf:bts:size
  Set the requested ring buffer size for branch tracing in BTS format.

Qbtrace:pt
  Enable Intel Processor Trace-based branch tracing for the current
  process.  The remote stub reports support for this packet to GDB's
  qSupported query.

Qbtrace-conf:pt:size
  Set the requested ring buffer size for branch tracing in Intel Processor
  Trace format.

swbreak stop reason
  Indicates a memory breakpoint instruction was executed, irrespective
  of whether it was GDB that planted the breakpoint or the breakpoint
  is hardcoded in the program.  This is required for correct non-stop
  mode operation.

hwbreak stop reason
  Indicates the target stopped for a hardware breakpoint.  This is
  required for correct non-stop mode operation.

vFile:fstat:
  Return information about files on the remote system.

qXfer:exec-file:read
  Return the full absolute name of the file that was executed to
  create a process running on the remote system.

vFile:setfs:
  Select the filesystem on which vFile: operations with filename
  arguments will operate.  This is required for GDB to be able to
  access files on remote targets where the remote stub does not
  share a common filesystem with the inferior(s).

fork stop reason
  Indicates that a fork system call was executed.

vfork stop reason
  Indicates that a vfork system call was executed.

vforkdone stop reason
  Indicates that a vfork child of the specified process has executed
  an exec or exit, allowing the vfork parent to resume execution.

fork-events and vfork-events features in qSupported
  The qSupported packet allows GDB to request support for fork and 
  vfork events using new 'gdbfeatures' fork-events and vfork-events,
  and the qSupported response can contain the corresponding
  'stubfeatures'.  Set and show commands can be used to display
  whether these features are enabled.

* Extended-remote fork events

  ** GDB now has support for fork events on extended-remote Linux
     targets.  For targets with Linux kernels 2.5.60 and later, this
     enables follow-fork-mode and detach-on-fork for both fork and
     vfork, as well as fork and vfork catchpoints.

* The info record command now shows the recording format and the
  branch tracing configuration for the current thread when using
  the btrace record target.
  For the BTS format, it shows the ring buffer size.

* GDB now has support for DTrace USDT (Userland Static Defined
  Tracing) probes.  The supported targets are x86_64-*-linux-gnu.

* GDB now supports access to vector registers on S/390 GNU/Linux
  targets.

* Removed command line options

-xdb  HP-UX XDB compatibility mode.

* Removed targets and native configurations

HP/PA running HP-UX           hppa*-*-hpux*
Itanium running HP-UX         ia64-*-hpux*

* New configure options

--with-intel-pt
  This configure option allows the user to build GDB with support for
  Intel Processor Trace (default: auto).  This requires libipt.

--with-libipt-prefix=PATH
  Specify the path to the version of libipt that GDB should use.
  $PATH/include should contain the intel-pt.h header and
  $PATH/lib should contain the libipt.so library.

*** Changes in GDB 7.9.1

* Python Scripting

  ** Xmethods can now specify a result type.

*** Changes in GDB 7.9

* GDB now supports hardware watchpoints on x86 GNU Hurd.

* Python Scripting

  ** You can now access frame registers from Python scripts.
  ** New attribute 'producer' for gdb.Symtab objects.
  ** gdb.Objfile objects have a new attribute "progspace",
     which is the gdb.Progspace object of the containing program space.
  ** gdb.Objfile objects have a new attribute "owner".
  ** gdb.Objfile objects have a new attribute "build_id",
     which is the build ID generated when the file was built.
  ** gdb.Objfile objects have a new method "add_separate_debug_file".
  ** A new event "gdb.clear_objfiles" has been added, triggered when
     selecting a new file to debug.
  ** You can now add attributes to gdb.Objfile and gdb.Progspace objects.
  ** New function gdb.lookup_objfile.

  New events which are triggered when GDB modifies the state of the 
  inferior.

  ** gdb.events.inferior_call_pre: Function call is about to be made.
  ** gdb.events.inferior_call_post: Function call has just been made.
  ** gdb.events.memory_changed: A memory location has been altered.
  ** gdb.events.register_changed: A register has been altered.

* New Python-based convenience functions:

  ** $_caller_is(name [, number_of_frames])
  ** $_caller_matches(regexp [, number_of_frames])
  ** $_any_caller_is(name [, number_of_frames])
  ** $_any_caller_matches(regexp [, number_of_frames])

* GDB now supports the compilation and injection of source code into
  the inferior.  GDB will use GCC 5.0 or higher built with libcc1.so
  to compile the source code to object code, and if successful, inject
  and execute that code within the current context of the inferior.
  Currently the C language is supported.  The commands used to
  interface with this new feature are:

     compile code [-raw|-r] [--] [source code]
     compile file [-raw|-r] filename

* New commands

demangle [-l language] [--] name
  Demangle "name" in the specified language, or the current language
  if elided.  This command is renamed from the "maint demangle" command.
  The latter is kept as a no-op to avoid "maint demangle" being interpreted
  as "maint demangler-warning".

queue-signal signal-name-or-number
  Queue a signal to be delivered to the thread when it is resumed.

add-auto-load-scripts-directory directory
  Add entries to the list of directories from which to load auto-loaded
  scripts.

maint print user-registers
  List all currently available "user" registers.

compile code [-r|-raw] [--] [source code]
  Compile, inject, and execute in the inferior the executable object
  code produced by compiling the provided source code.

compile file [-r|-raw] filename
  Compile and inject into the inferior the executable object code
  produced by compiling the source code stored in the filename
  provided.

* On resume, GDB now always passes the signal the program had stopped
  for to the thread the signal was sent to, even if the user changed
  threads before resuming.  Previously GDB would often (but not
  always) deliver the signal to the thread that happens to be current
  at resume time.

* Conversely, the "signal" command now consistently delivers the
  requested signal to the current thread.  GDB now asks for
  confirmation if the program had stopped for a signal and the user
  switched threads meanwhile.

* "breakpoint always-inserted" modes "off" and "auto" merged.

  Now, when 'breakpoint always-inserted mode' is set to "off", GDB
  won't remove breakpoints from the target until all threads stop,
  even in non-stop mode.  The "auto" mode has been removed, and "off"
  is now the default mode.

* New options

set debug symbol-lookup
show debug symbol-lookup
  Control display of debugging info regarding symbol lookup.

* MI changes

  ** The -list-thread-groups command outputs an exit-code field for
     inferiors that have exited.

* New targets

MIPS SDE			mips*-sde*-elf*

* Removed targets

Support for these obsolete configurations has been removed.

Alpha running OSF/1 (or Tru64)		alpha*-*-osf*
SGI Irix-5.x				mips-*-irix5*
SGI Irix-6.x				mips-*-irix6*
VAX running (4.2 - 4.3 Reno) BSD 	vax-*-bsd*
VAX running Ultrix 			vax-*-ultrix*

* The "dll-symbols" command, and its two aliases ("add-shared-symbol-files"
  and "assf"), have been removed.  Use the "sharedlibrary" command, or
  its alias "share", instead.

*** Changes in GDB 7.8

* New command line options

-D data-directory
  This is an alias for the --data-directory option.

* GDB supports printing and modifying of variable length automatic arrays
  as specified in ISO C99.

* The ARM simulator now supports instruction level tracing
  with or without disassembly.

* Guile scripting

  GDB now has support for scripting using Guile.  Whether this is
  available is determined at configure time.
  Guile version 2.0 or greater is required.
  Guile version 2.0.9 is well tested, earlier 2.0 versions are not.

* New commands (for set/show, see "New options" below)

guile [code]
gu [code]
  Invoke CODE by passing it to the Guile interpreter.

guile-repl
gr
  Start a Guile interactive prompt (or "repl" for "read-eval-print loop").

info auto-load guile-scripts [regexp]
  Print the list of automatically loaded Guile scripts.

* The source command is now capable of sourcing Guile scripts.
  This feature is dependent on the debugger being built with Guile support.

* New options

set print symbol-loading (off|brief|full)
show print symbol-loading
  Control whether to print informational messages when loading symbol
  information for a file.  The default is "full", but when debugging
  programs with large numbers of shared libraries the amount of output
  becomes less useful.

set guile print-stack (none|message|full)
show guile print-stack
  Show a stack trace when an error is encountered in a Guile script.

set auto-load guile-scripts (on|off)
show auto-load guile-scripts
  Control auto-loading of Guile script files.

maint ada set ignore-descriptive-types (on|off)
maint ada show ignore-descriptive-types
  Control whether the debugger should ignore descriptive types in Ada
  programs.  The default is not to ignore the descriptive types.  See
  the user manual for more details on descriptive types and the intended
  usage of this option.

set auto-connect-native-target

  Control whether GDB is allowed to automatically connect to the
  native target for the run, attach, etc. commands when not connected
  to any target yet.  See also "target native" below.

set record btrace replay-memory-access (read-only|read-write)
show record btrace replay-memory-access
  Control what memory accesses are allowed during replay.

maint set target-async (on|off)
maint show target-async
  This controls whether GDB targets operate in synchronous or
  asynchronous mode.  Normally the default is asynchronous, if it is
  available; but this can be changed to more easily debug problems
  occurring only in synchronous mode.

set mi-async (on|off)
show mi-async
  Control whether MI asynchronous mode is preferred.  This supersedes
  "set target-async" of previous GDB versions.

* "set target-async" is deprecated as a CLI option and is now an alias
  for "set mi-async" (only puts MI into async mode).

* Background execution commands (e.g., "c&", "s&", etc.) are now
  possible ``out of the box'' if the target supports them.  Previously
  the user would need to explicitly enable the possibility with the
  "set target-async on" command.

* New features in the GDB remote stub, GDBserver

  ** New option --debug-format=option1[,option2,...] allows one to add
     additional text to each output.  At present only timestamps
     are supported: --debug-format=timestamps.
     Timestamps can also be turned on with the
     "monitor set debug-format timestamps" command from GDB.

* The 'record instruction-history' command now starts counting instructions
  at one.  This also affects the instruction ranges reported by the
  'record function-call-history' command when given the /i modifier.

* The command 'record function-call-history' supports a new modifier '/c' to
  indent the function names based on their call stack depth.
  The fields for the '/i' and '/l' modifier have been reordered.
  The source line range is now prefixed with 'at'.
  The instruction range is now prefixed with 'inst'.
  Both ranges are now printed as '<from>, <to>' to allow copy&paste to the
  "record instruction-history" and "list" commands.

* The ranges given as arguments to the 'record function-call-history' and
  'record instruction-history' commands are now inclusive.

* The btrace record target now supports the 'record goto' command.
  For locations inside the execution trace, the back trace is computed
  based on the information stored in the execution trace.

* The btrace record target supports limited reverse execution and replay.
  The target does not record data and therefore does not allow reading
  memory or registers.

* The "catch syscall" command now works on s390*-linux* targets.

* The "compare-sections" command is no longer specific to target
  remote.  It now works with all targets.

* All native targets are now consistently called "native".
  Consequently, the "target child", "target GNU", "target djgpp",
  "target procfs" (Solaris/Irix/OSF/AIX) and "target darwin-child"
  commands have been replaced with "target native".  The QNX/NTO port
  leaves the "procfs" target in place and adds a "native" target for
  consistency with other ports.  The impact on users should be minimal
  as these commands previously either throwed an error, or were
  no-ops.  The target's name is visible in the output of the following
  commands: "help target", "info target", "info files", "maint print
  target-stack".

* The "target native" command now connects to the native target.  This
  can be used to launch native programs even when "set
  auto-connect-native-target" is set to off.

* GDB now supports access to Intel MPX registers on GNU/Linux.

* Support for Intel AVX-512 registers on GNU/Linux.
  Support displaying and modifying Intel AVX-512 registers
  $zmm0 - $zmm31 and $k0 - $k7 on GNU/Linux.

* New remote packets

qXfer:btrace:read's annex
  The qXfer:btrace:read packet supports a new annex 'delta' to read
  branch trace incrementally.

* Python Scripting

  ** Valid Python operations on gdb.Value objects representing
     structs/classes invoke the corresponding overloaded operators if
     available.
  ** New `Xmethods' feature in the Python API.  Xmethods are
     additional methods or replacements for existing methods of a C++
     class.  This feature is useful for those cases where a method
     defined in C++ source code could be inlined or optimized out by
     the compiler, making it unavailable to GDB.

* New targets
PowerPC64 GNU/Linux little-endian	powerpc64le-*-linux*

* The "dll-symbols" command, and its two aliases ("add-shared-symbol-files"
  and "assf"), have been deprecated.  Use the "sharedlibrary" command, or
  its alias "share", instead.

* The commands "set remotebaud" and "show remotebaud" are no longer
  supported.  Use "set serial baud" and "show serial baud" (respectively)
  instead.

* MI changes

  ** A new option "-gdb-set mi-async" replaces "-gdb-set
     target-async".  The latter is left as a deprecated alias of the
     former for backward compatibility.  If the target supports it,
     CLI background execution commands are now always possible by
     default, independently of whether the frontend stated a
     preference for asynchronous execution with "-gdb-set mi-async".
     Previously "-gdb-set target-async off" affected both MI execution
     commands and CLI execution commands.

*** Changes in GDB 7.7

* Improved support for process record-replay and reverse debugging on
  arm*-linux* targets.  Support for thumb32 and syscall instruction
  recording has been added.

* GDB now supports SystemTap SDT probes on AArch64 GNU/Linux.

* GDB now supports Fission DWP file format version 2.
  http://gcc.gnu.org/wiki/DebugFission

* New convenience function "$_isvoid", to check whether an expression
  is void.  A void expression is an expression where the type of the
  result is "void".  For example, some convenience variables may be
  "void" when evaluated (e.g., "$_exitcode" before the execution of
  the program being debugged; or an undefined convenience variable).
  Another example, when calling a function whose return type is
  "void".

* The "maintenance print objfiles" command now takes an optional regexp.

* The "catch syscall" command now works on arm*-linux* targets.

* GDB now consistently shows "<not saved>" when printing values of
  registers the debug info indicates have not been saved in the frame
  and there's nowhere to retrieve them from
  (callee-saved/call-clobbered registers):

    (gdb) p $rax
    $1 = <not saved>

    (gdb) info registers rax
    rax            <not saved>

  Before, the former would print "<optimized out>", and the latter
  "*value not available*".

* New script contrib/gdb-add-index.sh for adding .gdb_index sections
  to binaries.

* Python scripting

  ** Frame filters and frame decorators have been added.
  ** Temporary breakpoints are now supported.
  ** Line tables representation has been added.
  ** New attribute 'parent_type' for gdb.Field objects.
  ** gdb.Field objects can be used as subscripts on gdb.Value objects.
  ** New attribute 'name' for gdb.Type objects.

* New targets

Nios II ELF 			nios2*-*-elf
Nios II GNU/Linux		nios2*-*-linux
Texas Instruments MSP430	msp430*-*-elf

* Removed native configurations

Support for these a.out NetBSD and OpenBSD obsolete configurations has
been removed.  ELF variants of these configurations are kept supported.

arm*-*-netbsd*              but arm*-*-netbsdelf*       is kept supported.
i[34567]86-*-netbsd*        but i[34567]86-*-netbsdelf* is kept supported.
i[34567]86-*-openbsd[0-2].* but i[34567]86-*-openbsd*   is kept supported.
i[34567]86-*-openbsd3.[0-3]
m68*-*-netbsd*              but m68*-*-netbsdelf*       is kept supported.
sparc-*-netbsd*             but sparc-*-netbsdelf*      is kept supported.
vax-*-netbsd*               but vax-*-netbsdelf*        is kept supported.

* New commands:
catch rethrow
  Like "catch throw", but catches a re-thrown exception.
maint check-psymtabs
  Renamed from old "maint check-symtabs".
maint check-symtabs
  Perform consistency checks on symtabs.
maint expand-symtabs
  Expand symtabs matching an optional regexp.

show configuration
  Display the details of GDB configure-time options.

maint set|show per-command
maint set|show per-command space
maint set|show per-command time
maint set|show per-command symtab
  Enable display of per-command gdb resource usage.

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

info exceptions
info exceptions REGEXP
  Display the list of Ada exceptions defined in the program being
  debugged.  If provided, only the exceptions whose names match REGEXP
  are listed.

* New options

set debug symfile off|on
show debug symfile
  Control display of debugging info regarding reading symbol files and
  symbol tables within those files

set print raw frame-arguments
show print raw frame-arguments
  Set/show whether to print frame arguments in raw mode,
  disregarding any defined pretty-printers.

set remote trace-status-packet
show remote trace-status-packet
  Set/show the use of remote protocol qTStatus packet.

set debug nios2
show debug nios2
  Control display of debugging messages related to Nios II targets.

set range-stepping
show range-stepping
  Control whether target-assisted range stepping is enabled.

set startup-with-shell
show startup-with-shell
  Specifies whether Unix child processes are started via a shell or
  directly.

set code-cache
show code-cache
  Use the target memory cache for accesses to the code segment.  This
  improves performance of remote debugging (particularly disassembly).

* You can now use a literal value 'unlimited' for options that
  interpret 0 or -1 as meaning "unlimited".  E.g., "set
  trace-buffer-size unlimited" is now an alias for "set
  trace-buffer-size -1" and "set height unlimited" is now an alias for
  "set height 0".

* The "set debug symtab-create" debugging option of GDB has been changed to
  accept a verbosity level.  0 means "off", 1 provides basic debugging
  output, and values of 2 or greater provides more verbose output.

* New command-line options
--configuration
  Display the details of GDB configure-time options.

* The command 'tsave' can now support new option '-ctf' to save trace
  buffer in Common Trace Format.

* Newly installed $prefix/bin/gcore acts as a shell interface for the
  GDB command gcore.

* GDB now implements the C++ 'typeid' operator.

* The new convenience variable $_exception holds the exception being
  thrown or caught at an exception-related catchpoint.

* The exception-related catchpoints, like "catch throw", now accept a
  regular expression which can be used to filter exceptions by type.

* The new convenience variable $_exitsignal is automatically set to
  the terminating signal number when the program being debugged dies
  due to an uncaught signal.

* MI changes

  ** All MI commands now accept an optional "--language" option.
     Support for this feature can be verified by using the "-list-features"
     command, which should contain "language-option".

  ** The new command -info-gdb-mi-command allows the user to determine
     whether a GDB/MI command is supported or not.

  ** The "^error" result record returned when trying to execute an undefined
     GDB/MI command now provides a variable named "code" whose content is the
     "undefined-command" error code.  Support for this feature can be verified
     by using the "-list-features" command, which should contain
     "undefined-command-error-code".

  ** The -trace-save MI command can optionally save trace buffer in Common
     Trace Format now.

  ** The new command -dprintf-insert sets a dynamic printf breakpoint.

  ** The command -data-list-register-values now accepts an optional
     "--skip-unavailable" option.  When used, only the available registers
     are displayed.

  ** The new command -trace-frame-collected dumps collected variables,
     computed expressions, tvars, memory and registers in a traceframe.

  ** The commands -stack-list-locals, -stack-list-arguments and
     -stack-list-variables now accept an option "--skip-unavailable".
     When used, only the available locals or arguments are displayed.

  ** The -exec-run command now accepts an optional "--start" option.
     When used, the command follows the same semantics as the "start"
     command, stopping the program's execution at the start of its
     main subprogram.  Support for this feature can be verified using
     the "-list-features" command, which should contain
     "exec-run-start-option".

  ** The new commands -catch-assert and -catch-exceptions insert
     catchpoints stopping the program when Ada exceptions are raised.

  ** The new command -info-ada-exceptions provides the equivalent of
     the new "info exceptions" command.

* New system-wide configuration scripts
  A GDB installation now provides scripts suitable for use as system-wide
  configuration scripts for the following systems:
    ** ElinOS
    ** Wind River Linux

* GDB now supports target-assigned range stepping with remote targets.
  This improves the performance of stepping source lines by reducing
  the number of control packets from/to GDB.  See "New remote packets"
  below.

* GDB now understands the element 'tvar' in the XML traceframe info.
  It has the id of the collected trace state variables.

* On S/390 targets that provide the transactional-execution feature,
  the program interruption transaction diagnostic block (TDB) is now
  represented as a number of additional "registers" in GDB.

* New remote packets

vCont;r

  The vCont packet supports a new 'r' action, that tells the remote
  stub to step through an address range itself, without GDB
  involvemement at each single-step.

qXfer:libraries-svr4:read's annex
  The previously unused annex of the qXfer:libraries-svr4:read packet
  is now used to support passing an argument list.  The remote stub
  reports support for this argument list to GDB's qSupported query.
  The defined arguments are "start" and "prev", used to reduce work
  necessary for library list updating, resulting in significant
  speedup.

* New features in the GDB remote stub, GDBserver

  ** GDBserver now supports target-assisted range stepping.  Currently
     enabled on x86/x86_64 GNU/Linux targets.

  ** GDBserver now adds element 'tvar' in the XML in the reply to
     'qXfer:traceframe-info:read'.  It has the id of the collected
     trace state variables.

  ** GDBserver now supports hardware watchpoints on the MIPS GNU/Linux
     target.

* New 'z' formatter for printing and examining memory, this displays the
  value as hexadecimal zero padded on the left to the size of the type.

* GDB can now use Windows x64 unwinding data.

* The "set remotebaud" command has been replaced by "set serial baud".
  Similarly, "show remotebaud" has been replaced by "show serial baud".
  The "set remotebaud" and "show remotebaud" commands are still available
  to provide backward compatibility with older versions of GDB.

*** Changes in GDB 7.6

* Target record has been renamed to record-full.
  Record/replay is now enabled with the "record full" command.
  This also affects settings that are associated with full record/replay
  that have been moved from "set/show record" to "set/show record full":

set|show record full insn-number-max
set|show record full stop-at-limit
set|show record full memory-query

* A new record target "record-btrace" has been added.  The new target
  uses hardware support to record the control-flow of a process.  It
  does not support replaying the execution, but it implements the
  below new commands for investigating the recorded execution log.
  This new recording method can be enabled using:

record btrace

  The "record-btrace" target is only available on Intel Atom processors
  and requires a Linux kernel 2.6.32 or later.

* Two new commands have been added for record/replay to give information
  about the recorded execution without having to replay the execution.
  The commands are only supported by "record btrace".

record instruction-history      prints the execution history at
                                instruction granularity

record function-call-history    prints the execution history at
                                function granularity

* New native configurations

ARM AArch64 GNU/Linux		aarch64*-*-linux-gnu
FreeBSD/powerpc			powerpc*-*-freebsd
x86_64/Cygwin			x86_64-*-cygwin*
Tilera TILE-Gx GNU/Linux	tilegx*-*-linux-gnu

* New targets

ARM AArch64			aarch64*-*-elf
ARM AArch64 GNU/Linux		aarch64*-*-linux
Lynx 178 PowerPC		powerpc-*-lynx*178
x86_64/Cygwin			x86_64-*-cygwin*
Tilera TILE-Gx GNU/Linux	tilegx*-*-linux

* If the configured location of system.gdbinit file (as given by the
  --with-system-gdbinit option at configure time) is in the
  data-directory (as specified by --with-gdb-datadir at configure
  time) or in one of its subdirectories, then GDB will look for the
  system-wide init file in the directory specified by the
  --data-directory command-line option.

* New command line options:

-nh   Disables auto-loading of ~/.gdbinit, but still executes all the
      other initialization files, unlike -nx which disables all of them.

* Removed command line options

-epoch  This was used by the gdb mode in Epoch, an ancient fork of
        Emacs.

* The 'ptype' and 'whatis' commands now accept an argument to control
  type formatting.

* 'info proc' now works on some core files.

* Python scripting

  ** Vectors can be created with gdb.Type.vector.

  ** Python's atexit.register now works in GDB.

  ** Types can be pretty-printed via a Python API.

  ** Python 3 is now supported (in addition to Python 2.4 or later)

  ** New class gdb.Architecture exposes GDB's internal representation
     of architecture in the Python API.

  ** New method Frame.architecture returns the gdb.Architecture object
     corresponding to the frame's architecture.

* New Python-based convenience functions:

  ** $_memeq(buf1, buf2, length)
  ** $_streq(str1, str2)
  ** $_strlen(str)
  ** $_regex(str, regex)

* The 'cd' command now defaults to using '~' (the home directory) if not
  given an argument.

* The C++ ABI now defaults to the GNU v3 ABI.  This has been the
  default for GCC since November 2000.

* The command 'forward-search' can now be abbreviated as 'fo'.

* The command 'info tracepoints' can now display 'installed on target'
  or 'not installed on target' for each non-pending location of tracepoint.

* New configure options

--enable-libmcheck/--disable-libmcheck
  By default, development versions are built with -lmcheck on hosts
  that support it, in order to help track memory corruption issues.
  Release versions, on the other hand, are built without -lmcheck
  by default.  The --enable-libmcheck/--disable-libmcheck configure
  options allow the user to override that default.
--with-babeltrace/--with-babeltrace-include/--with-babeltrace-lib
  This configure option allows the user to build GDB with
  libbabeltrace using which GDB can read Common Trace Format data.

* New commands (for set/show, see "New options" below)

catch signal 
  Catch signals.  This is similar to "handle", but allows commands and
  conditions to be attached.

maint info bfds
  List the BFDs known to GDB.

python-interactive [command]
pi [command]
  Start a Python interactive prompt, or evaluate the optional command
  and print the result of expressions.

py [command]
  "py" is a new alias for "python".

enable type-printer [name]...
disable type-printer [name]...
  Enable or disable type printers.

* Removed commands

  ** For the Renesas Super-H architecture, the "regs" command has been removed
     (has been deprecated in GDB 7.5), and "info all-registers" should be used
     instead.

* New options

set print type methods (on|off)
show print type methods
  Control whether method declarations are displayed by "ptype".
  The default is to show them.

set print type typedefs (on|off)
show print type typedefs
  Control whether typedef definitions are displayed by "ptype".
  The default is to show them.

set filename-display basename|relative|absolute
show filename-display
  Control the way in which filenames is displayed.
  The default is "relative", which preserves previous behavior.

set trace-buffer-size
show trace-buffer-size
  Request target to change the size of trace buffer.

set remote trace-buffer-size-packet auto|on|off
show remote trace-buffer-size-packet
  Control the use of the remote protocol `QTBuffer:size' packet.

set debug aarch64
show debug aarch64
  Control display of debugging messages related to ARM AArch64.
  The default is off.

set debug coff-pe-read
show debug coff-pe-read
  Control display of debugging messages related to reading of COFF/PE
  exported symbols.

set debug mach-o
show debug mach-o
  Control display of debugging messages related to Mach-O symbols
  processing.

set debug notification
show debug notification
  Control display of debugging info for async remote notification.

* MI changes

  ** Command parameter changes are now notified using new async record
     "=cmd-param-changed".
  ** Trace frame changes caused by command "tfind" are now notified using
     new async record "=traceframe-changed".
  ** The creation, deletion and modification of trace state variables
     are now notified using new async records "=tsv-created",
     "=tsv-deleted" and "=tsv-modified".
  ** The start and stop of process record are now notified using new
     async record "=record-started" and "=record-stopped".
  ** Memory changes are now notified using new async record
     "=memory-changed".
  ** The data-disassemble command response will include a "fullname" field
     containing the absolute file name when source has been requested.
  ** New optional parameter COUNT added to the "-data-write-memory-bytes" 
     command, to allow pattern filling of memory areas.
  ** New commands "-catch-load"/"-catch-unload" added for intercepting
     library load/unload events.
  ** The response to breakpoint commands and breakpoint async records
     includes an "installed" field containing a boolean state about each
     non-pending tracepoint location is whether installed on target or not.
  ** Output of the "-trace-status" command includes a "trace-file" field 
     containing the name of the trace file being examined.  This field is
     optional, and only present when examining a trace file.
  ** The "fullname" field is now always present along with the "file" field,
     even if the file cannot be found by GDB.

* GDB now supports the "mini debuginfo" section, .gnu_debugdata.
  You must have the LZMA library available when configuring GDB for this
  feature to be enabled.  For more information, see:
      http://fedoraproject.org/wiki/Features/MiniDebugInfo

* New remote packets

QTBuffer:size
   Set the size of trace buffer.  The remote stub reports support for this
   packet to gdb's qSupported query.

Qbtrace:bts
  Enable Branch Trace Store (BTS)-based branch tracing for the current
  thread.  The remote stub reports support for this packet to gdb's
  qSupported query.

Qbtrace:off
  Disable branch tracing for the current thread.  The remote stub reports
  support for this packet to gdb's qSupported query.

qXfer:btrace:read
  Read the traced branches for the current thread.  The remote stub
  reports support for this packet to gdb's qSupported query.

*** Changes in GDB 7.5

* GDB now supports x32 ABI.  Visit <http://sites.google.com/site/x32abi/>
  for more x32 ABI info.

* GDB now supports access to MIPS DSP registers on Linux targets.

* GDB now supports debugging microMIPS binaries.

* The "info os" command on GNU/Linux can now display information on
  several new classes of objects managed by the operating system:
    "info os procgroups" lists process groups
    "info os files" lists file descriptors
    "info os sockets" lists internet-domain sockets
    "info os shm" lists shared-memory regions
    "info os semaphores" lists semaphores
    "info os msg" lists message queues
    "info os modules" lists loaded kernel modules

* GDB now has support for SDT (Static Defined Tracing) probes.  Currently,
  the only implemented backend is for SystemTap probes (<sys/sdt.h>).  You
  can set a breakpoint using the new "-probe, "-pstap" or "-probe-stap"
  options and inspect the probe arguments using the new $_probe_arg family
  of convenience variables.  You can obtain more information about SystemTap
  in <http://sourceware.org/systemtap/>.

* GDB now supports reversible debugging on ARM, it allows you to
  debug basic ARM and THUMB instructions, and provides 
  record/replay support.  

* The option "symbol-reloading" has been deleted as it is no longer used.

* Python scripting

  ** GDB commands implemented in Python can now be put in command class
     "gdb.COMMAND_USER".

  ** The "maint set python print-stack on|off" is now deleted.

  ** A new class, gdb.printing.FlagEnumerationPrinter, can be used to
     apply "flag enum"-style pretty-printing to any enum.

  ** gdb.lookup_symbol can now work when there is no current frame.

  ** gdb.Symbol now has a 'line' attribute, holding the line number in
     the source at which the symbol was defined.

  ** gdb.Symbol now has the new attribute 'needs_frame' and the new
     method 'value'.  The former indicates whether the symbol needs a
     frame in order to compute its value, and the latter computes the
     symbol's value.

  ** A new method 'referenced_value' on gdb.Value objects which can
     dereference pointer as well as C++ reference values.

  ** New methods 'global_block' and 'static_block' on gdb.Symtab objects
     which return the global and static blocks (as gdb.Block objects),
     of the underlying symbol table, respectively.

  ** New function gdb.find_pc_line which returns the gdb.Symtab_and_line
     object associated with a PC value.

  ** gdb.Symtab_and_line has new attribute 'last' which holds the end
     of the address range occupied by code for the current source line.

* Go language support.
  GDB now supports debugging programs written in the Go programming
  language.

* GDBserver now supports stdio connections.
  E.g. (gdb) target remote | ssh myhost gdbserver - hello

* The binary "gdbtui" can no longer be built or installed.
  Use "gdb -tui" instead.

* GDB will now print "flag" enums specially.  A flag enum is one where
  all the enumerator values have no bits in common when pairwise
  "and"ed.  When printing a value whose type is a flag enum, GDB will
  show all the constants, e.g., for enum E { ONE = 1, TWO = 2}:
  (gdb) print (enum E) 3
  $1 = (ONE | TWO)

* The filename part of a linespec will now match trailing components
  of a source file name.  For example, "break gcc/expr.c:1000" will
  now set a breakpoint in build/gcc/expr.c, but not
  build/libcpp/expr.c.

* The "info proc" and "generate-core-file" commands will now also
  work on remote targets connected to GDBserver on Linux.

* The command "info catch" has been removed.  It has been disabled
  since December 2007.

* The "catch exception" and "catch assert" commands now accept
  a condition at the end of the command, much like the "break"
  command does. For instance:

        (gdb) catch exception Constraint_Error if Barrier = True

  Previously, it was possible to add a condition to such catchpoints,
  but it had to be done as a second step, after the catchpoint had been
  created, using the "condition" command.

* The "info static-tracepoint-marker" command will now also work on
  native Linux targets with in-process agent.

* GDB can now set breakpoints on inlined functions.

* The .gdb_index section has been updated to include symbols for
  inlined functions.  GDB will ignore older .gdb_index sections by
  default, which could cause symbol files to be loaded more slowly
  until their .gdb_index sections can be recreated.  The new command
  "set use-deprecated-index-sections on" will cause GDB to use any older
  .gdb_index sections it finds.  This will restore performance, but the
  ability to set breakpoints on inlined functions will be lost in symbol
  files with older .gdb_index sections.

  The .gdb_index section has also been updated to record more information
  about each symbol.  This speeds up the "info variables", "info functions"
  and "info types" commands when used with programs having the .gdb_index
  section, as well as speeding up debugging with shared libraries using
  the .gdb_index section.

* Ada support for GDB/MI Variable Objects has been added.

* GDB can now support 'breakpoint always-inserted mode' in 'record'
  target.

* MI changes

  ** New command -info-os is the MI equivalent of "info os".

  ** Output logs ("set logging" and related) now include MI output.

* New commands

  ** "set use-deprecated-index-sections on|off"
     "show use-deprecated-index-sections on|off"
     Controls the use of deprecated .gdb_index sections.

  ** "catch load" and "catch unload" can be used to stop when a shared
     library is loaded or unloaded, respectively.

  ** "enable count" can be used to auto-disable a breakpoint after
     several hits.

  ** "info vtbl" can be used to show the virtual method tables for
     C++ and Java objects.

  ** "explore" and its sub commands "explore value" and "explore type"
     can be used to recursively explore values and types of
     expressions.  These commands are available only if GDB is
     configured with '--with-python'.

  ** "info auto-load" shows status of all kinds of auto-loaded files,
     "info auto-load gdb-scripts" shows status of auto-loading GDB canned
     sequences of commands files, "info auto-load python-scripts"
     shows status of auto-loading Python script files,
     "info auto-load local-gdbinit" shows status of loading init file
     (.gdbinit) from current directory and "info auto-load libthread-db" shows
     status of inferior specific thread debugging shared library loading.

  ** "info auto-load-scripts", "set auto-load-scripts on|off"
     and "show auto-load-scripts" commands have been deprecated, use their
     "info auto-load python-scripts", "set auto-load python-scripts on|off"
     and "show auto-load python-scripts" counterparts instead.

  ** "dprintf location,format,args..." creates a dynamic printf, which
     is basically a breakpoint that does a printf and immediately
     resumes your program's execution, so it is like a printf that you
     can insert dynamically at runtime instead of at compiletime.

  ** "set print symbol"
     "show print symbol"
     Controls whether GDB attempts to display the symbol, if any,
     corresponding to addresses it prints.  This defaults to "on", but
     you can set it to "off" to restore GDB's previous behavior.

* Deprecated commands

  ** For the Renesas Super-H architecture, the "regs" command has been
     deprecated, and "info all-registers" should be used instead.

* New targets

Renesas RL78			rl78-*-elf
HP OpenVMS ia64			ia64-hp-openvms*

* GDBserver supports evaluation of breakpoint conditions.  When
  support is advertised by GDBserver, GDB may be told to send the
  breakpoint conditions in bytecode form to GDBserver.  GDBserver
  will only report the breakpoint trigger to GDB when its condition
  evaluates to true.

* New options

set mips compression
show mips compression
  Select the compressed ISA encoding used in functions that have no symbol
  information available.  The encoding can be set to either of:
    mips16
    micromips
  and is updated automatically from ELF file flags if available.

set breakpoint condition-evaluation
show breakpoint condition-evaluation
  Control whether breakpoint conditions are evaluated by GDB ("host") or by
  GDBserver ("target").  Default option "auto" chooses the most efficient
  available mode.
  This option can improve debugger efficiency depending on the speed of the
  target.

set auto-load off
  Disable auto-loading globally.

show auto-load
  Show auto-loading setting of all kinds of auto-loaded files.

set auto-load gdb-scripts on|off
show auto-load gdb-scripts
  Control auto-loading of GDB canned sequences of commands files.

set auto-load python-scripts on|off
show auto-load python-scripts
  Control auto-loading of Python script files.

set auto-load local-gdbinit on|off
show auto-load local-gdbinit
  Control loading of init file (.gdbinit) from current directory.

set auto-load libthread-db on|off
show auto-load libthread-db
  Control auto-loading of inferior specific thread debugging shared library.

set auto-load scripts-directory <dir1>[:<dir2>...]
show auto-load scripts-directory
  Set a list of directories from which to load auto-loaded scripts.
  Automatically loaded Python scripts and GDB scripts are located in one
  of the directories listed by this option.
  The delimiter (':' above) may differ according to the host platform.

set auto-load safe-path <dir1>[:<dir2>...]
show auto-load safe-path
  Set a list of directories from which it is safe to auto-load files.
  The delimiter (':' above) may differ according to the host platform.

set debug auto-load on|off
show debug auto-load
  Control display of debugging info for auto-loading the files above.

set dprintf-style gdb|call|agent
show dprintf-style
  Control the way in which a dynamic printf is performed; "gdb"
  requests a GDB printf command, while "call" causes dprintf to call a
  function in the inferior.  "agent" requests that the target agent
  (such as GDBserver) do the printing.

set dprintf-function <expr>
show dprintf-function
set dprintf-channel <expr>
show dprintf-channel
  Set the function and optional first argument to the call when using
  the "call" style of dynamic printf.

set disconnected-dprintf on|off
show disconnected-dprintf
  Control whether agent-style dynamic printfs continue to be in effect
  after GDB disconnects.

* New configure options

--with-auto-load-dir
  Configure default value for the 'set auto-load scripts-directory'
  setting above.  It defaults to '$debugdir:$datadir/auto-load',
  $debugdir representing global debugging info directories (available
  via 'show debug-file-directory') and $datadir representing GDB's data
  directory (available via 'show data-directory').

--with-auto-load-safe-path
  Configure default value for the 'set auto-load safe-path' setting
  above.  It defaults to the --with-auto-load-dir setting.

--without-auto-load-safe-path
  Set 'set auto-load safe-path' to '/', effectively disabling this
  security feature.

* New remote packets

z0/z1 conditional breakpoints extension

  The z0/z1 breakpoint insertion packets have been extended to carry
  a list of conditional expressions over to the remote stub depending on the
  condition evaluation mode.  The use of this extension can be controlled
  via the "set remote conditional-breakpoints-packet" command.

QProgramSignals:

  Specify the signals which the remote stub may pass to the debugged
  program without GDB involvement.

* New command line options

--init-command=FILE, -ix          Like --command, -x but execute it
                                  before loading inferior.
--init-eval-command=COMMAND, -iex Like --eval-command=COMMAND, -ex but
                                  execute it before loading inferior.

*** Changes in GDB 7.4

* GDB now handles ambiguous linespecs more consistently; the existing
  FILE:LINE support has been expanded to other types of linespecs.  A
  breakpoint will now be set on all matching locations in all
  inferiors, and locations will be added or removed according to
  inferior changes.

* GDB now allows you to skip uninteresting functions and files when
  stepping with the "skip function" and "skip file" commands.

* GDB has two new commands: "set remote hardware-watchpoint-length-limit"
  and "show remote hardware-watchpoint-length-limit".  These allows to
  set or show the maximum length limit (in bytes) of a remote
  target hardware watchpoint.

  This allows e.g. to use "unlimited" hardware watchpoints with the
  gdbserver integrated in Valgrind version >= 3.7.0.  Such Valgrind
  watchpoints are slower than real hardware watchpoints but are
  significantly faster than gdb software watchpoints.

* Python scripting

  ** The register_pretty_printer function in module gdb.printing now takes
     an optional `replace' argument.  If True, the new printer replaces any
     existing one.

  ** The "maint set python print-stack on|off" command has been
     deprecated and will be deleted in GDB 7.5.
     A new command: "set python print-stack none|full|message" has
     replaced it.  Additionally, the default for "print-stack" is
     now "message", which just prints the error message without
     the stack trace.
   
  ** A prompt substitution hook (prompt_hook) is now available to the
     Python API.

  ** A new Python module, gdb.prompt has been added to the GDB Python
     modules library.  This module provides functionality for
     escape sequences in prompts (used by set/show
     extended-prompt).  These escape sequences are replaced by their
     corresponding value.

  ** Python commands and convenience-functions located in
    'data-directory'/python/gdb/command and
    'data-directory'/python/gdb/function are now automatically loaded
     on GDB start-up.

  ** Blocks now provide four new attributes.  global_block and
     static_block will return the global and static blocks
     respectively.  is_static and is_global are boolean attributes
     that indicate if the block is one of those two types.

  ** Symbols now provide the "type" attribute, the type of the symbol.

  ** The "gdb.breakpoint" function has been deprecated in favor of
     "gdb.breakpoints".

  ** A new class "gdb.FinishBreakpoint" is provided to catch the return
     of a function.  This class is based on the "finish" command
     available in the CLI. 

  ** Type objects for struct and union types now allow access to
     the fields using standard Python dictionary (mapping) methods.
     For example, "some_type['myfield']" now works, as does
     "some_type.items()".

  ** A new event "gdb.new_objfile" has been added, triggered by loading a
     new object file.

  ** A new function, "deep_items" has been added to the gdb.types
     module in the GDB Python modules library.  This function returns
     an iterator over the fields of a struct or union type.  Unlike
     the standard Python "iteritems" method, it will recursively traverse
     any anonymous fields.

* MI changes

  ** "*stopped" events can report several new "reason"s, such as
     "solib-event".

  ** Breakpoint changes are now notified using new async records, like
     "=breakpoint-modified".

  ** New command -ada-task-info.

* libthread-db-search-path now supports two special values: $sdir and $pdir.
  $sdir specifies the default system locations of shared libraries.
  $pdir specifies the directory where the libpthread used by the application
  lives.

  GDB no longer looks in $sdir and $pdir after it has searched the directories
  mentioned in libthread-db-search-path.  If you want to search those
  directories, they must be specified in libthread-db-search-path.
  The default value of libthread-db-search-path on GNU/Linux and Solaris
  systems is now "$sdir:$pdir".

  $pdir is not supported by gdbserver, it is currently ignored.
  $sdir is supported by gdbserver.

* New configure option --with-iconv-bin.
  When using the internationalization support like the one in the GNU C
  library, GDB will invoke the "iconv" program to get a list of supported
  character sets.  If this program lives in a non-standard location, one can
  use this option to specify where to find it.

* When natively debugging programs on PowerPC BookE processors running
  a Linux kernel version 2.6.34 or later, GDB supports masked hardware
  watchpoints, which specify a mask in addition to an address to watch.
  The mask specifies that some bits of an address (the bits which are
  reset in the mask) should be ignored when matching the address accessed
  by the inferior against the watchpoint address.  See the "PowerPC Embedded"
  section in the user manual for more details.

* The new option --once causes GDBserver to stop listening for connections once
  the first connection is made.  The listening port used by GDBserver will
  become available after that.

* New commands "info macros" and "alias" have been added.

* New function parameters suffix @entry specifies value of function parameter
  at the time the function got called.  Entry values are available only since
  gcc version 4.7.

* New commands

!SHELL COMMAND
  "!" is now an alias of the "shell" command.
  Note that no space is needed between "!" and SHELL COMMAND.

* Changed commands

watch EXPRESSION mask MASK_VALUE
  The watch command now supports the mask argument which allows creation
  of masked watchpoints, if the current architecture supports this feature.

info auto-load-scripts [REGEXP]
  This command was formerly named "maintenance print section-scripts".
  It is now generally useful and is no longer a maintenance-only command.

info macro [-all] [--] MACRO
  The info macro command has new options `-all' and `--'.  The first for
  printing all definitions of a macro.  The second for explicitly specifying
  the end of arguments and the beginning of the macro name in case the macro
  name starts with a hyphen.

collect[/s] EXPRESSIONS
  The tracepoint collect command now takes an optional modifier "/s"
  that directs it to dereference pointer-to-character types and
  collect the bytes of memory up to a zero byte.  The behavior is
  similar to what you see when you use the regular print command on a
  string.  An optional integer following the "/s" sets a bound on the
  number of bytes that will be collected.

tstart [NOTES]
  The trace start command now interprets any supplied arguments as a
  note to be recorded with the trace run, with an effect similar to
  setting the variable trace-notes.

tstop [NOTES]
  The trace stop command now interprets any arguments as a note to be
  mentioned along with the tstatus report that the trace was stopped
  with a command.  The effect is similar to setting the variable
  trace-stop-notes.

* Tracepoints can now be enabled and disabled at any time after a trace
  experiment has been started using the standard "enable" and "disable"
  commands.  It is now possible to start a trace experiment with no enabled
  tracepoints; GDB will display a warning, but will allow the experiment to
  begin, assuming that tracepoints will be enabled as needed while the trace
  is running.

* Fast tracepoints on 32-bit x86-architectures can now be placed at
  locations with 4-byte instructions, when they were previously
  limited to locations with instructions of 5 bytes or longer.

* New options

set debug dwarf2-read
show debug dwarf2-read
  Turns on or off display of debugging messages related to reading
  DWARF debug info.  The default is off.

set debug symtab-create
show debug symtab-create
  Turns on or off display of debugging messages related to symbol table
  creation.  The default is off.

set extended-prompt
show extended-prompt
  Set the GDB prompt, and allow escape sequences to be inserted to
  display miscellaneous information (see 'help set extended-prompt'
  for the list of sequences).  This prompt (and any information
  accessed through the escape sequences) is updated every time the
  prompt is displayed.

set print entry-values (both|compact|default|if-needed|no|only|preferred)
show print entry-values
  Set printing of frame argument values at function entry.  In some cases
  GDB can determine the value of function argument which was passed by the
  function caller, even if the value was modified inside the called function.

set debug entry-values
show debug entry-values
  Control display of debugging info for determining frame argument values at
  function entry and virtual tail call frames.

set basenames-may-differ
show basenames-may-differ
  Set whether a source file may have multiple base names.
  (A "base name" is the name of a file with the directory part removed.
  Example: The base name of "/home/user/hello.c" is "hello.c".)
  If set, GDB will canonicalize file names (e.g., expand symlinks)
  before comparing them.  Canonicalization is an expensive operation,
  but it allows the same file be known by more than one base name.
  If not set (the default), all source files are assumed to have just
  one base name, and gdb will do file name comparisons more efficiently.

set trace-user
show trace-user
set trace-notes
show trace-notes
  Set a user name and notes for the current and any future trace runs.
  This is useful for long-running and/or disconnected traces, to
  inform others (or yourself) as to who is running the trace, supply
  contact information, or otherwise explain what is going on.

set trace-stop-notes
show trace-stop-notes
  Set a note attached to the trace run, that is displayed when the
  trace has been stopped by a tstop command.  This is useful for
  instance as an explanation, if you are stopping a trace run that was
  started by someone else.

* New remote packets

QTEnable
  
  Dynamically enable a tracepoint in a started trace experiment.

QTDisable

  Dynamically disable a tracepoint in a started trace experiment.

QTNotes

  Set the user and notes of the trace run.

qTP

  Query the current status of a tracepoint.

qTMinFTPILen

  Query the minimum length of instruction at which a fast tracepoint may
  be placed.

* Dcache size (number of lines) and line-size are now runtime-configurable
  via "set dcache line" and "set dcache line-size" commands.

* New targets

Texas Instruments TMS320C6x		tic6x-*-*

* New Simulators

Renesas RL78				rl78-*-elf

*** Changes in GDB 7.3.1

* The build failure for NetBSD and OpenBSD targets have now been fixed.

*** Changes in GDB 7.3

* GDB has a new command: "thread find [REGEXP]".
  It finds the thread id whose name, target id, or thread extra info
  matches the given regular expression.

* The "catch syscall" command now works on mips*-linux* targets.

* The -data-disassemble MI command now supports modes 2 and 3 for
  dumping the instruction opcodes.

* New command line options

-data-directory DIR	Specify DIR as the "data-directory".
			This is mostly for testing purposes.

* The "maint set python auto-load on|off" command has been renamed to
  "set auto-load-scripts on|off".

* GDB has a new command: "set directories".
  It is like the "dir" command except that it replaces the
  source path list instead of augmenting it.

* GDB now understands thread names.

  On GNU/Linux, "info threads" will display the thread name as set by
  prctl or pthread_setname_np.

  There is also a new command, "thread name", which can be used to
  assign a name internally for GDB to display.

* OpenCL C
  Initial support for the OpenCL C language (http://www.khronos.org/opencl)
  has been integrated into GDB.

* Python scripting

  ** The function gdb.Write now accepts an optional keyword 'stream'.
     This keyword, when provided, will direct the output to either
     stdout, stderr, or GDB's logging output.

  ** Parameters can now be be sub-classed in Python, and in particular
     you may implement the get_set_doc and get_show_doc functions.
     This improves how Parameter set/show documentation is processed
     and allows for more dynamic content.

  ** Symbols, Symbol Table, Symbol Table and Line, Object Files,
     Inferior, Inferior Thread, Blocks, and Block Iterator APIs now
     have an is_valid method.

  ** Breakpoints can now be sub-classed in Python, and in particular
     you may implement a 'stop' function that is executed each time
     the inferior reaches that breakpoint.   

  ** New function gdb.lookup_global_symbol looks up a global symbol.

  ** GDB values in Python are now callable if the value represents a
     function.  For example, if 'some_value' represents a function that
     takes two integer parameters and returns a value, you can call
     that function like so:

     result = some_value (10,20)

  ** Module gdb.types has been added.
     It contains a collection of utilities for working with gdb.Types objects:
     get_basic_type, has_field, make_enum_dict.

  ** Module gdb.printing has been added.
     It contains utilities for writing and registering pretty-printers.
     New classes: PrettyPrinter,  SubPrettyPrinter,
     RegexpCollectionPrettyPrinter.
     New function: register_pretty_printer.

  ** New commands "info pretty-printers", "enable pretty-printer" and
     "disable pretty-printer" have been added.

  ** gdb.parameter("directories") is now available.

  ** New function gdb.newest_frame returns the newest frame in the
     selected thread.

  ** The gdb.InferiorThread class has a new "name" attribute.  This
     holds the thread's name.

  ** Python Support for Inferior events.
     Python scripts can add observers to be notified of events
     occurring in the process being debugged.
     The following events are currently supported:
     - gdb.events.cont Continue event.
     - gdb.events.exited Inferior exited event.
     - gdb.events.stop Signal received, and Breakpoint hit events.

* C++ Improvements:

  ** GDB now puts template parameters in scope when debugging in an
     instantiation.  For example, if you have:

     template<int X> int func (void) { return X; }

     then if you step into func<5>, "print X" will show "5".  This
     feature requires proper debuginfo support from the compiler; it
     was added to GCC 4.5.

  ** The motion commands "next", "finish", "until", and "advance" now
     work better when exceptions are thrown.  In particular, GDB will
     no longer lose control of the inferior; instead, the GDB will
     stop the inferior at the point at which the exception is caught.
     This functionality requires a change in the exception handling
     code that was introduced in GCC 4.5.

* GDB now follows GCC's rules on accessing volatile objects when
  reading or writing target state during expression evaluation.
  One notable difference to prior behavior is that "print x = 0"
  no longer generates a read of x; the value of the assignment is
  now always taken directly from the value being assigned.

* GDB now has some support for using labels in the program's source in
  linespecs.  For instance, you can use "advance label" to continue
  execution to a label.

* GDB now has support for reading and writing a new .gdb_index
  section.  This section holds a fast index of DWARF debugging
  information and can be used to greatly speed up GDB startup and
  operation.  See the documentation for `save gdb-index' for details.

* The "watch" command now accepts an optional "-location" argument.
  When used, this causes GDB to watch the memory referred to by the
  expression.  Such a watchpoint is never deleted due to it going out
  of scope.

* GDB now supports thread debugging of core dumps on GNU/Linux.

  GDB now activates thread debugging using the libthread_db library
  when debugging GNU/Linux core dumps, similarly to when debugging
  live processes.  As a result, when debugging a core dump file, GDB
  is now able to display pthread_t ids of threads.  For example, "info
  threads" shows the same output as when debugging the process when it
  was live.  In earlier releases, you'd see something like this:

  (gdb) info threads
   * 1 LWP 6780  main () at main.c:10

  While now you see this:

  (gdb) info threads
   * 1 Thread 0x7f0f5712a700 (LWP 6780)  main () at main.c:10

  It is also now possible to inspect TLS variables when debugging core
  dumps.

  When debugging a core dump generated on a machine other than the one
  used to run GDB, you may need to point GDB at the correct
  libthread_db library with the "set libthread-db-search-path"
  command.  See the user manual for more details on this command.

* When natively debugging programs on PowerPC BookE processors running
  a Linux kernel version 2.6.34 or later, GDB supports ranged breakpoints,
  which stop execution of the inferior whenever it executes an instruction
  at any address within the specified range.  See the "PowerPC Embedded"
  section in the user manual for more details.

* New features in the GDB remote stub, GDBserver

  ** GDBserver is now supported on PowerPC LynxOS (versions 4.x and 5.x),
     and i686 LynxOS (version 5.x).

  ** GDBserver is now supported on Blackfin Linux.

* New native configurations

ia64 HP-UX                      ia64-*-hpux*

* New targets:

Analog Devices, Inc. Blackfin Processor	bfin-*

* Ada task switching is now supported on sparc-elf targets when
  debugging a program using the Ravenscar Profile.  For more information,
  see the "Tasking Support when using the Ravenscar Profile" section
  in the GDB user manual.

* Guile support was removed.

* New features in the GNU simulator

  ** The --map-info flag lists all known core mappings.

  ** CFI flashes may be simulated via the "cfi" device.

*** Changes in GDB 7.2

* Shared library support for remote targets by default

  When GDB is configured for a generic, non-OS specific target, like
  for example, --target=arm-eabi or one of the many *-*-elf targets,
  GDB now queries remote stubs for loaded shared libraries using the
  `qXfer:libraries:read' packet.  Previously, shared library support
  was always disabled for such configurations.

* C++ Improvements:

  ** Argument Dependent Lookup (ADL)

  In C++ ADL lookup directs function search to the namespaces of its
  arguments even if the namespace has not been imported.
  For example:
    namespace A
      { 
        class B { }; 
        void foo (B) { }
      }
    ...
    A::B b
    foo(b)
  Here the compiler will search for `foo' in the namespace of 'b'
  and find A::foo.  GDB now supports this.  This construct is commonly
  used in the Standard Template Library for operators.

  ** Improved User Defined Operator Support

  In addition to member operators, GDB now supports lookup of operators
  defined in a namespace and imported with a `using' directive, operators
  defined in the global scope, operators imported implicitly from an
  anonymous namespace, and the ADL operators mentioned in the previous
  entry.
  GDB now also supports proper overload resolution for all the previously
  mentioned flavors of operators.

  ** static const class members

  Printing of static const class members that are initialized in the
  class definition has been fixed.

* Windows Thread Information Block access.

  On Windows targets, GDB now supports displaying the Windows Thread
  Information Block (TIB) structure.  This structure is visible either
  by using the new command `info w32 thread-information-block' or, by
  dereferencing the new convenience variable named `$_tlb', a
  thread-specific pointer to the TIB.  This feature is also supported
  when remote debugging using GDBserver.

* Static tracepoints

  Static tracepoints are calls in the user program into a tracing
  library.  One such library is a port of the LTTng kernel tracer to
  userspace --- UST (LTTng Userspace Tracer, http://lttng.org/ust).
  When debugging with GDBserver, GDB now supports combining the GDB
  tracepoint machinery with such libraries.  For example: the user can
  use GDB to probe a static tracepoint marker (a call from the user
  program into the tracing library) with the new "strace" command (see
  "New commands" below).  This creates a "static tracepoint" in the
  breakpoint list, that can be manipulated with the same feature set
  as fast and regular tracepoints.  E.g., collect registers, local and
  global variables, collect trace state variables, and define
  tracepoint conditions.  In addition, the user can collect extra
  static tracepoint marker specific data, by collecting the new
  $_sdata internal variable.  When analyzing the trace buffer, you can
  inspect $_sdata like any other variable available to GDB.  For more
  information, see the "Tracepoints" chapter in GDB user manual.  New
  remote packets have been defined to support static tracepoints, see
  the "New remote packets" section below.

* Better reconstruction of tracepoints after disconnected tracing

  GDB will attempt to download the original source form of tracepoint
  definitions when starting a trace run, and then will upload these
  upon reconnection to the target, resulting in a more accurate
  reconstruction of the tracepoints that are in use on the target.

* Observer mode

  You can now exercise direct control over the ways that GDB can
  affect your program.  For instance, you can disallow the setting of
  breakpoints, so that the program can run continuously (assuming
  non-stop mode).  In addition, the "observer" variable is available
  to switch all of the different controls; in observer mode, GDB
  cannot affect the target's behavior at all, which is useful for
  tasks like diagnosing live systems in the field.

* The new convenience variable $_thread holds the number of the
  current thread.

* New remote packets

qGetTIBAddr

  Return the address of the Windows Thread Information Block of a given thread.

qRelocInsn

  In response to several of the tracepoint packets, the target may now
  also respond with a number of intermediate `qRelocInsn' request
  packets before the final result packet, to have GDB handle
  relocating an instruction to execute at a different address.  This
  is particularly useful for stubs that support fast tracepoints.  GDB
  reports support for this feature in the qSupported packet.

qTfSTM, qTsSTM

  List static tracepoint markers in the target program.

qTSTMat

  List static tracepoint markers at a given address in the target
  program.

qXfer:statictrace:read

  Read the static trace data collected (by a `collect $_sdata'
  tracepoint action).  The remote stub reports support for this packet
  to gdb's qSupported query.

QAllow

  Send the current settings of GDB's permission flags.

QTDPsrc

  Send part of the source (textual) form of a tracepoint definition,
  which includes location, conditional, and action list.

* The source command now accepts a -s option to force searching for the
  script in the source search path even if the script name specifies
  a directory.

* New features in the GDB remote stub, GDBserver

  - GDBserver now support tracepoints (including fast tracepoints, and
    static tracepoints).  The feature is currently supported by the
    i386-linux and amd64-linux builds.  See the "Tracepoints support
    in gdbserver" section in the manual for more information.

    GDBserver JIT compiles the tracepoint's conditional agent
    expression bytecode into native code whenever possible for low
    overhead dynamic tracepoints conditionals.  For such tracepoints,
    an expression that examines program state is evaluated when the
    tracepoint is reached, in order to determine whether to capture
    trace data.  If the condition is simple and false, processing the
    tracepoint finishes very quickly and no data is gathered.

    GDBserver interfaces with the UST (LTTng Userspace Tracer) library
    for static tracepoints support.

  - GDBserver now supports x86_64 Windows 64-bit debugging.

* GDB now sends xmlRegisters= in qSupported packet to indicate that
  it understands register description.

* The --batch flag now disables pagination and queries.

* X86 general purpose registers

  GDB now supports reading/writing byte, word and double-word x86
  general purpose registers directly.  This means you can use, say,
  $ah or $ax to refer, respectively, to the byte register AH and
  16-bit word register AX that are actually portions of the 32-bit
  register EAX or 64-bit register RAX.

* The `commands' command now accepts a range of breakpoints to modify.
  A plain `commands' following a command that creates multiple
  breakpoints affects all the breakpoints set by that command.  This
  applies to breakpoints set by `rbreak', and also applies when a
  single `break' command creates multiple breakpoints (e.g.,
  breakpoints on overloaded c++ functions).

* The `rbreak' command now accepts a filename specification as part of
  its argument, limiting the functions selected by the regex to those
  in the specified file.

* Support for remote debugging Windows and SymbianOS shared libraries
  from Unix hosts has been improved.  Non Windows GDB builds now can
  understand target reported file names that follow MS-DOS based file
  system semantics, such as file names that include drive letters and
  use the backslash character as directory separator.  This makes it
  possible to transparently use the "set sysroot" and "set
  solib-search-path" on Unix hosts to point as host copies of the
  target's shared libraries.  See the new command "set
  target-file-system-kind" described below, and the "Commands to
  specify files" section in the user manual for more information.

* New commands

eval template, expressions...
  Convert the values of one or more expressions under the control
  of the string template to a command line, and call it.

set target-file-system-kind unix|dos-based|auto
show target-file-system-kind
  Set or show the assumed file system kind for target reported file
  names.

save breakpoints <filename>
  Save all current breakpoint definitions to a file suitable for use
  in a later debugging session.  To read the saved breakpoint
  definitions, use the `source' command.

`save tracepoints' is a new alias for `save-tracepoints'.  The latter
is now deprecated.

info static-tracepoint-markers
  Display information about static tracepoint markers in the target.

strace FN | FILE:LINE | *ADDR | -m MARKER_ID
  Define a static tracepoint by probing a marker at the given
  function, line, address, or marker ID.

set observer on|off
show observer
  Enable and disable observer mode.

set may-write-registers on|off
set may-write-memory on|off
set may-insert-breakpoints on|off
set may-insert-tracepoints on|off
set may-insert-fast-tracepoints on|off
set may-interrupt on|off
  Set individual permissions for GDB effects on the target.  Note that
  some of these settings can have undesirable or surprising
  consequences, particularly when changed in the middle of a session.
  For instance, disabling the writing of memory can prevent
  breakpoints from being inserted, cause single-stepping to fail, or
  even crash your program, if you disable after breakpoints have been
  inserted.  However, GDB should not crash.

set record memory-query on|off
show record memory-query
  Control whether to stop the inferior if memory changes caused
  by an instruction cannot be recorded.

* Changed commands

disassemble
  The disassemble command now supports "start,+length" form of two arguments.

* Python scripting

** GDB now provides a new directory location, called the python directory,
   where Python scripts written for GDB can be installed.  The location
   of that directory is <data-directory>/python, where <data-directory>
   is the GDB data directory.  For more details, see section `Scripting
   GDB using Python' in the manual.

** The GDB Python API now has access to breakpoints, symbols, symbol
   tables, program spaces, inferiors, threads and frame's code blocks.
   Additionally, GDB Parameters can now be created from the API, and
   manipulated via set/show in the CLI.

** New functions gdb.target_charset, gdb.target_wide_charset,
   gdb.progspaces, gdb.current_progspace, and gdb.string_to_argv.

** New exception gdb.GdbError.

** Pretty-printers are now also looked up in the current program space.

** Pretty-printers can now be individually enabled and disabled.

** GDB now looks for names of Python scripts to auto-load in a
   special section named `.debug_gdb_scripts', in addition to looking
   for a OBJFILE-gdb.py script when OBJFILE is read by the debugger.

* Tracepoint actions were unified with breakpoint commands. In particular,
there are no longer differences in "info break" output for breakpoints and
tracepoints and the "commands" command can be used for both tracepoints and
regular breakpoints.

* New targets

ARM Symbian			arm*-*-symbianelf*

* D language support.
  GDB now supports debugging programs written in the D programming
  language.

* GDB now supports the extended ptrace interface for PowerPC which is
  available since Linux kernel version 2.6.34.  This automatically enables
  any hardware breakpoints and additional hardware watchpoints available in
  the processor.  The old ptrace interface exposes just one hardware
  watchpoint and no hardware breakpoints.

* GDB is now able to use the Data Value Compare (DVC) register available on
  embedded PowerPC processors to implement in hardware simple watchpoint
  conditions of the form:

  watch ADDRESS|VARIABLE if ADDRESS|VARIABLE == CONSTANT EXPRESSION

  This works in native GDB running on Linux kernels with the extended ptrace
  interface mentioned above.

*** Changes in GDB 7.1

* C++ Improvements

  ** Namespace Support

  GDB now supports importing of namespaces in C++.  This enables the
  user to inspect variables from imported namespaces.  Support for
  namepace aliasing has also been added.  So, if a namespace is 
  aliased in the current scope (e.g. namepace C=A; ) the user can 
  print variables using the alias (e.g. (gdb) print C::x).

  ** Bug Fixes

  All known bugs relating to the printing of virtual base class were
  fixed.  It is now possible to call overloaded static methods using a
  qualified name.

  ** Cast Operators

  The C++ cast operators static_cast<>, dynamic_cast<>, const_cast<>,
  and reinterpret_cast<> are now handled by the C++ expression parser.

* New targets

Xilinx MicroBlaze		microblaze-*-*
Renesas RX			rx-*-elf

* New Simulators

Xilinx MicroBlaze		microblaze
Renesas RX			rx

* Multi-program debugging.

  GDB now has support for multi-program (a.k.a. multi-executable or
  multi-exec) debugging.  This allows for debugging multiple inferiors
  simultaneously each running a different program under the same GDB
  session.  See "Debugging Multiple Inferiors and Programs" in the
  manual for more information.  This implied some user visible changes
  in the multi-inferior support.  For example, "info inferiors" now
  lists inferiors that are not running yet or that have exited
  already.  See also "New commands" and "New options" below.

* New tracing features

  GDB's tracepoint facility now includes several new features:

  ** Trace state variables

  GDB tracepoints now include support for trace state variables, which
  are variables managed by the target agent during a tracing
  experiment.  They are useful for tracepoints that trigger each
  other, so for instance one tracepoint can count hits in a variable,
  and then a second tracepoint has a condition that is true when the
  count reaches a particular value.  Trace state variables share the
  $-syntax of GDB convenience variables, and can appear in both
  tracepoint actions and condition expressions.  Use the "tvariable"
  command to create, and "info tvariables" to view; see "Trace State
  Variables" in the manual for more detail.

  ** Fast tracepoints

  GDB now includes an option for defining fast tracepoints, which
  targets may implement more efficiently, such as by installing a jump
  into the target agent rather than a trap instruction.  The resulting
  speedup can be by two orders of magnitude or more, although the
  tradeoff is that some program locations on some target architectures
  might not allow fast tracepoint installation, for instance if the
  instruction to be replaced is shorter than the jump.  To request a
  fast tracepoint, use the "ftrace" command, with syntax identical to
  the regular trace command.

  ** Disconnected tracing

  It is now possible to detach GDB from the target while it is running
  a trace experiment, then reconnect later to see how the experiment
  is going.  In addition, a new variable disconnected-tracing lets you
  tell the target agent whether to continue running a trace if the
  connection is lost unexpectedly.

  ** Trace files

  GDB now has the ability to save the trace buffer into a file, and
  then use that file as a target, similarly to you can do with
  corefiles.  You can select trace frames, print data that was
  collected in them, and use tstatus to display the state of the
  tracing run at the moment that it was saved.  To create a trace
  file, use "tsave <filename>", and to use it, do "target tfile
  <name>".

  ** Circular trace buffer

  You can ask the target agent to handle the trace buffer as a
  circular buffer, discarding the oldest trace frames to make room for
  newer ones, by setting circular-trace-buffer to on.  This feature may
  not be available for all target agents.

* Changed commands

disassemble
  The disassemble command, when invoked with two arguments, now requires
  the arguments to be comma-separated.

info variables
  The info variables command now displays variable definitions.  Files
  which only declare a variable are not shown.

source
  The source command is now capable of sourcing Python scripts.
  This feature is dependent on the debugger being build with Python
  support.

  Related to this enhancement is also the introduction of a new command
  "set script-extension" (see below).

* New commands (for set/show, see "New options" below)

record save [<FILENAME>]
  Save a file (in core file format) containing the process record 
  execution log for replay debugging at a later time.

record restore <FILENAME>
  Restore the process record execution log that was saved at an
  earlier time, for replay debugging.

add-inferior [-copies <N>] [-exec <FILENAME>]
  Add a new inferior.

clone-inferior [-copies <N>] [ID]
  Make a new inferior ready to execute the same program another
  inferior has loaded.

remove-inferior ID
  Remove an inferior.

maint info program-spaces
  List the program spaces loaded into GDB.

set remote interrupt-sequence [Ctrl-C | BREAK | BREAK-g]
show remote interrupt-sequence
  Allow the user to select one of ^C, a BREAK signal or BREAK-g
  as the sequence to the remote target in order to interrupt the execution.
  Ctrl-C is a default.  Some system prefers BREAK which is high level of
  serial line for some certain time.  Linux kernel prefers BREAK-g, a.k.a
  Magic SysRq g.  It is BREAK signal and character 'g'.

set remote interrupt-on-connect [on | off]
show remote interrupt-on-connect
  When interrupt-on-connect is ON, gdb sends interrupt-sequence to
  remote target when gdb connects to it.  This is needed when you debug
  Linux kernel.

set remotebreak [on | off]
show remotebreak
Deprecated.  Use "set/show remote interrupt-sequence" instead.

tvariable $NAME [ = EXP ]
  Create or modify a trace state variable.

info tvariables
  List trace state variables and their values.

delete tvariable $NAME ...
  Delete one or more trace state variables.

teval EXPR, ...
  Evaluate the given expressions without collecting anything into the
  trace buffer. (Valid in tracepoint actions only.)

ftrace FN / FILE:LINE / *ADDR
  Define a fast tracepoint at the given function, line, or address.

* New expression syntax

  GDB now parses the 0b prefix of binary numbers the same way as GCC does.
  GDB now parses 0b101010 identically with 42.

* New options

set follow-exec-mode new|same
show follow-exec-mode
  Control whether GDB reuses the same inferior across an exec call or
  creates a new one.  This is useful to be able to restart the old
  executable after the inferior having done an exec call.

set default-collect EXPR, ...
show default-collect
   Define a list of expressions to be collected at each tracepoint.
   This is a useful way to ensure essential items are not overlooked,
   such as registers or a critical global variable.

set disconnected-tracing
show disconnected-tracing
   If set to 1, the target is instructed to continue tracing if it
   loses its connection to GDB.  If 0, the target is to stop tracing
   upon disconnection.

set circular-trace-buffer
show circular-trace-buffer
   If set to on, the target is instructed to use a circular trace buffer
   and discard the oldest trace frames instead of stopping the trace due
   to a full trace buffer.  If set to off, the trace stops when the buffer
   fills up.  Some targets may not support this.

set script-extension off|soft|strict
show script-extension
   If set to "off", the debugger does not perform any script language
   recognition, and all sourced files are assumed to be GDB scripts.
   If set to "soft" (the default), files are sourced according to
   filename extension, falling back to GDB scripts if the first
   evaluation failed.
   If set to "strict", files are sourced according to filename extension.

set ada trust-PAD-over-XVS on|off
show ada trust-PAD-over-XVS
   If off, activate a workaround against a bug in the debugging information
   generated by the compiler for PAD types (see gcc/exp_dbug.ads in
   the GCC sources for more information about the GNAT encoding and
   PAD types in particular).  It is always safe to set this option to
   off, but this introduces a slight performance penalty.  The default
   is on.

* Python API Improvements

  ** GDB provides the new class gdb.LazyString.  This is useful in
     some pretty-printing cases.  The new method gdb.Value.lazy_string
     provides a simple way to create objects of this type.

  ** The fields returned by gdb.Type.fields now have an
     `is_base_class' attribute.

  ** The new method gdb.Type.range returns the range of an array type.

  ** The new method gdb.parse_and_eval can be used to parse and
     evaluate an expression.

* New remote packets

QTDV
   Define a trace state variable.

qTV
   Get the current value of a trace state variable.

QTDisconnected
   Set desired tracing behavior upon disconnection.

QTBuffer:circular
   Set the trace buffer to be linear or circular.

qTfP, qTsP
   Get data about the tracepoints currently in use.

* Bug fixes

Process record now works correctly with hardware watchpoints.

Multiple bug fixes have been made to the mips-irix port, making it
much more reliable. In particular:
  - Debugging threaded applications is now possible again.  Previously,
    GDB would hang while starting the program, or while waiting for
    the program to stop at a breakpoint.
  - Attaching to a running process no longer hangs.
  - An error occurring while loading a core file has been fixed.
  - Changing the value of the PC register now works again.  This fixes
    problems observed when using the "jump" command, or when calling
    a function from GDB, or even when assigning a new value to $pc.
  - With the "finish" and "return" commands, the return value for functions
    returning a small array is now correctly printed.
  - It is now possible to break on shared library code which gets executed
    during a shared library init phase (code executed while executing
    their .init section).  Previously, the breakpoint would have no effect.
  - GDB is now able to backtrace through the signal handler for
    non-threaded programs.

PIE (Position Independent Executable) programs debugging is now supported.
This includes debugging execution of PIC (Position Independent Code) shared
libraries although for that, it should be possible to run such libraries as an
executable program.

*** Changes in GDB 7.0

* GDB now has an interface for JIT compilation.  Applications that
dynamically generate code can create symbol files in memory and register
them with GDB.  For users, the feature should work transparently, and
for JIT developers, the interface is documented in the GDB manual in the
"JIT Compilation Interface" chapter.

* Tracepoints may now be conditional.  The syntax is as for
breakpoints; either an "if" clause appended to the "trace" command,
or the "condition" command is available.  GDB sends the condition to
the target for evaluation using the same bytecode format as is used
for tracepoint actions.

* The disassemble command now supports: an optional /r modifier, print the
raw instructions in hex as well as in symbolic form, and an optional /m
modifier to print mixed source+assembly.

* Process record and replay

  In a architecture environment that supports ``process record and
  replay'', ``process record and replay'' target can record a log of
  the process execution, and replay it with both forward and reverse
  execute commands.

* Reverse debugging: GDB now has new commands reverse-continue, reverse-
step, reverse-next, reverse-finish, reverse-stepi, reverse-nexti, and
set execution-direction {forward|reverse}, for targets that support
reverse execution.

* GDB now supports hardware watchpoints on MIPS/Linux systems.  This
feature is available with a native GDB running on kernel version
2.6.28 or later.

* GDB now has support for multi-byte and wide character sets on the
target.  Strings whose character type is wchar_t, char16_t, or
char32_t are now correctly printed.  GDB supports wide- and unicode-
literals in C, that is, L'x', L"string", u'x', u"string", U'x', and
U"string" syntax.  And, GDB allows the "%ls" and "%lc" formats in
`printf'.  This feature requires iconv to work properly; if your
system does not have a working iconv, GDB can use GNU libiconv.  See
the installation instructions for more information.

* GDB now supports automatic retrieval of shared library files from
remote targets.  To use this feature, specify a system root that begins
with the `remote:' prefix, either via the `set sysroot' command or via
the `--with-sysroot' configure-time option.

* "info sharedlibrary" now takes an optional regex of libraries to show,
and it now reports if a shared library has no debugging information.

* Commands `set debug-file-directory', `set solib-search-path' and `set args'
now complete on file names.

* When completing in expressions, gdb will attempt to limit
completions to allowable structure or union fields, where appropriate.
For instance, consider:

    # struct example { int f1; double f2; };
    # struct example variable;
    (gdb) p variable.

If the user types TAB at the end of this command line, the available
completions will be "f1" and "f2".

* Inlined functions are now supported.  They show up in backtraces, and
the "step", "next", and "finish" commands handle them automatically.

* GDB now supports the token-splicing (##) and stringification (#)
operators when expanding macros.  It also supports variable-arity
macros.

* GDB now supports inspecting extra signal information, exported by
the new $_siginfo convenience variable.  The feature is currently
implemented on linux ARM, i386 and amd64.

* GDB can now display the VFP floating point registers and NEON vector
registers on ARM targets.  Both ARM GNU/Linux native GDB and gdbserver
can provide these registers (requires Linux 2.6.30 or later).  Remote
and simulator targets may also provide them.

* New remote packets

qSearch:memory:
  Search memory for a sequence of bytes.

QStartNoAckMode
  Turn off `+'/`-' protocol acknowledgments to permit more efficient
  operation over reliable transport links.  Use of this packet is
  controlled by the `set remote noack-packet' command.

vKill
  Kill the process with the specified process ID.  Use this in preference
  to `k' when multiprocess protocol extensions are supported.

qXfer:osdata:read
  Obtains additional operating system information

qXfer:siginfo:read
qXfer:siginfo:write
  Read or write additional signal information.

* Removed remote protocol undocumented extension

  An undocumented extension to the remote protocol's `S' stop reply
  packet that permitted the stub to pass a process id was removed.
  Remote servers should use the `T' stop reply packet instead.

* GDB now supports multiple function calling conventions according to the
DWARF-2 DW_AT_calling_convention function attribute.
  
* The SH target utilizes the aforementioned change to distinguish between gcc
and Renesas calling convention.  It also adds the new CLI commands
`set/show sh calling-convention'.

* GDB can now read compressed debug sections, as produced by GNU gold
with the --compress-debug-sections=zlib flag.

* 64-bit core files are now supported on AIX.

* Thread switching is now supported on Tru64.

* Watchpoints can now be set on unreadable memory locations, e.g. addresses
which will be allocated using malloc later in program execution.

* The qXfer:libraries:read remote protocol packet now allows passing a
list of section offsets.

* On GNU/Linux, GDB can now attach to stopped processes.  Several race
conditions handling signals delivered during attach or thread creation
have also been fixed.

* GDB now supports the use of DWARF boolean types for Ada's type Boolean.
From the user's standpoint, all unqualified instances of True and False
are treated as the standard definitions, regardless of context.

* GDB now parses C++ symbol and type names more flexibly.  For
example, given:

   template<typename T> class C { };
   C<char const *> c;

GDB will now correctly handle all of:

   ptype C<char const *>
   ptype C<char const*>
   ptype C<const char *>
   ptype C<const char*>

* New features in the GDB remote stub, gdbserver

  - The "--wrapper" command-line argument tells gdbserver to use a
  wrapper program to launch programs for debugging.

  - On PowerPC and S/390 targets, it is now possible to use a single
  gdbserver executable to debug both 32-bit and 64-bit programs.
  (This requires gdbserver itself to be built as a 64-bit executable.)

  - gdbserver uses the new noack protocol mode for TCP connections to
  reduce communications latency, if also supported and enabled in GDB.

  - Support for the sparc64-linux-gnu target is now included in
  gdbserver.

  - The amd64-linux build of gdbserver now supports debugging both
    32-bit and 64-bit programs.

  - The i386-linux, amd64-linux, and i386-win32 builds of gdbserver
    now support hardware watchpoints, and will use them automatically
    as appropriate.

* Python scripting

  GDB now has support for scripting using Python.  Whether this is
  available is determined at configure time.

  New GDB commands can now be written in Python.

* Ada tasking support

  Ada tasks can now be inspected in GDB. The following commands have
  been introduced:

    info tasks
      Print the list of Ada tasks.
    info task N
      Print detailed information about task number N.
    task
      Print the task number of the current task.
    task N
      Switch the context of debugging to task number N.

* Support for user-defined prefixed commands.  The "define" command can
add new commands to existing prefixes, e.g. "target".

* Multi-inferior, multi-process debugging.

  GDB now has generalized support for multi-inferior debugging.  See
  "Debugging Multiple Inferiors" in the manual for more information.
  Although availability still depends on target support, the command
  set is more uniform now.  The GNU/Linux specific multi-forks support
  has been migrated to this new framework.  This implied some user
  visible changes; see "New commands" and also "Removed commands"
  below.

* Target descriptions can now describe the target OS ABI.  See the
"Target Description Format" section in the user manual for more
information.

* Target descriptions can now describe "compatible" architectures
to indicate that the target can execute applications for a different
architecture in addition to those for the main target architecture.
See the "Target Description Format" section in the user manual for
more information.

* Multi-architecture debugging.

  GDB now includes general supports for debugging applications on
  hybrid systems that use more than one single processor architecture
  at the same time.  Each such hybrid architecture still requires
  specific support to be added.  The only hybrid architecture supported
  in this version of GDB is the Cell Broadband Engine.

* GDB now supports integrated debugging of Cell/B.E. applications that
use both the PPU and SPU architectures.  To enable support for hybrid
Cell/B.E. debugging, you need to configure GDB to support both the
powerpc-linux or powerpc64-linux and the spu-elf targets, using the
--enable-targets configure option.

* Non-stop mode debugging.

  For some targets, GDB now supports an optional mode of operation in
  which you can examine stopped threads while other threads continue
  to execute freely.  This is referred to as non-stop mode, with the
  old mode referred to as all-stop mode.  See the "Non-Stop Mode"
  section in the user manual for more information.

  To be able to support remote non-stop debugging, a remote stub needs
  to implement the non-stop mode remote protocol extensions, as
  described in the "Remote Non-Stop" section of the user manual.  The
  GDB remote stub, gdbserver, has been adjusted to support these
  extensions on linux targets.

* New commands (for set/show, see "New options" below)

catch syscall [NAME(S) | NUMBER(S)]
  Catch system calls.  Arguments, which should be names of system
  calls or their numbers, mean catch only those syscalls.  Without
  arguments, every syscall will be caught.  When the inferior issues
  any of the specified syscalls, GDB will stop and announce the system
  call, both when it is called and when its call returns.  This
  feature is currently available with a native GDB running on the
  Linux Kernel, under the following architectures: x86, x86_64,
  PowerPC and PowerPC64.

find [/size-char] [/max-count] start-address, end-address|+search-space-size,
    val1 [, val2, ...]
  Search memory for a sequence of bytes.

maint set python print-stack
maint show python print-stack
  Show a stack trace when an error is encountered in a Python script.

python [CODE]
  Invoke CODE by passing it to the Python interpreter.

macro define
macro list
macro undef
  These allow macros to be defined, undefined, and listed
  interactively.

info os processes
  Show operating system information about processes.

info inferiors
  List the inferiors currently under GDB's control.

inferior NUM
  Switch focus to inferior number NUM.

detach inferior NUM
  Detach from inferior number NUM.

kill inferior NUM
  Kill inferior number NUM.

* New options

set spu stop-on-load
show spu stop-on-load
  Control whether to stop for new SPE threads during Cell/B.E. debugging.

set spu auto-flush-cache
show spu auto-flush-cache
  Control whether to automatically flush the software-managed cache
  during Cell/B.E. debugging.

set sh calling-convention
show sh calling-convention
  Control the calling convention used when calling SH target functions.

set debug timestamp
show debug timestamp
  Control display of timestamps with GDB debugging output.

set disassemble-next-line
show disassemble-next-line
  Control display of disassembled source lines or instructions when
  the debuggee stops.

set remote noack-packet
show remote noack-packet
  Set/show the use of remote protocol QStartNoAckMode packet.  See above
  under "New remote packets."

set remote query-attached-packet
show remote query-attached-packet
  Control use of remote protocol `qAttached' (query-attached) packet.

set remote read-siginfo-object
show remote read-siginfo-object
  Control use of remote protocol `qXfer:siginfo:read' (read-siginfo-object)
  packet.

set remote write-siginfo-object
show remote write-siginfo-object
  Control use of remote protocol `qXfer:siginfo:write' (write-siginfo-object)
  packet.

set remote reverse-continue
show remote reverse-continue
  Control use of remote protocol 'bc' (reverse-continue) packet.

set remote reverse-step
show remote reverse-step
  Control use of remote protocol 'bs' (reverse-step) packet.

set displaced-stepping
show displaced-stepping
  Control displaced stepping mode.  Displaced stepping is a way to
  single-step over breakpoints without removing them from the debuggee.
  Also known as "out-of-line single-stepping".

set debug displaced
show debug displaced
  Control display of debugging info for displaced stepping.

maint set internal-error
maint show internal-error
  Control what GDB does when an internal error is detected.

maint set internal-warning
maint show internal-warning
  Control what GDB does when an internal warning is detected.

set exec-wrapper
show exec-wrapper
unset exec-wrapper
  Use a wrapper program to launch programs for debugging.

set multiple-symbols (all|ask|cancel)
show multiple-symbols
  The value of this variable can be changed to adjust the debugger behavior
  when an expression or a breakpoint location contains an ambiguous symbol
  name (an overloaded function name, for instance).
  
set breakpoint always-inserted
show breakpoint always-inserted
  Keep breakpoints always inserted in the target, as opposed to inserting
  them when resuming the target, and removing them when the target stops.
  This option can improve debugger performance on slow remote targets.

set arm fallback-mode (arm|thumb|auto)
show arm fallback-mode
set arm force-mode (arm|thumb|auto)
show arm force-mode
  These commands control how ARM GDB determines whether instructions
  are ARM or Thumb.  The default for both settings is auto, which uses
  the current CPSR value for instructions without symbols; previous
  versions of GDB behaved as if "set arm fallback-mode arm".

set disable-randomization
show disable-randomization
  Standalone programs run with the virtual address space randomization enabled
  by default on some platforms.  This option keeps the addresses stable across
  multiple debugging sessions.

set non-stop
show non-stop
  Control whether other threads are stopped or not when some thread hits
  a breakpoint.

set target-async
show target-async
  Requests that asynchronous execution is enabled in the target, if available.
  In this case, it's possible to resume target in the background, and interact
  with GDB while the target is running.  "show target-async" displays the
  current state of asynchronous execution of the target.

set target-wide-charset
show target-wide-charset
  The target-wide-charset is the name of the character set that GDB
  uses when printing characters whose type is wchar_t.

set tcp auto-retry (on|off)
show tcp auto-retry
set tcp connect-timeout
show tcp connect-timeout
  These commands allow GDB to retry failed TCP connections to a remote stub
  with a specified timeout period; this is useful if the stub is launched
  in parallel with GDB but may not be ready to accept connections immediately.

set libthread-db-search-path
show libthread-db-search-path
  Control list of directories which GDB will search for appropriate
  libthread_db.

set schedule-multiple (on|off)
show schedule-multiple
  Allow GDB to resume all threads of all processes or only threads of
  the current process.

set stack-cache
show stack-cache
  Use more aggressive caching for accesses to the stack.  This improves
  performance of remote debugging (particularly backtraces) without
  affecting correctness.

set interactive-mode (on|off|auto)
show interactive-mode
  Control whether GDB runs in interactive mode (on) or not (off).
  When in interactive mode, GDB waits for the user to answer all
  queries.  Otherwise, GDB does not wait and assumes the default
  answer.  When set to auto (the default), GDB determines which
  mode to use based on the stdin settings.

* Removed commands

info forks
  For program forks, this is replaced by the new more generic `info
  inferiors' command.  To list checkpoints, you can still use the
  `info checkpoints' command, which was an alias for the `info forks'
  command.

fork NUM
  Replaced by the new `inferior' command.  To switch between
  checkpoints, you can still use the `restart' command, which was an
  alias for the `fork' command.

process PID
  This is removed, since some targets don't have a notion of
  processes.  To switch between processes, you can still use the
  `inferior' command using GDB's own inferior number.

delete fork NUM
  For program forks, this is replaced by the new more generic `kill
  inferior' command.  To delete a checkpoint, you can still use the
  `delete checkpoint' command, which was an alias for the `delete
  fork' command.

detach fork NUM
  For program forks, this is replaced by the new more generic `detach
  inferior' command.  To detach a checkpoint, you can still use the
  `detach checkpoint' command, which was an alias for the `detach
  fork' command.

* New native configurations

x86/x86_64 Darwin		i[34567]86-*-darwin*

x86_64 MinGW			x86_64-*-mingw*

* New targets

Lattice Mico32                  lm32-*
x86 DICOS			i[34567]86-*-dicos*
x86_64 DICOS		        x86_64-*-dicos*
S+core 3			score-*-*

* The GDB remote stub, gdbserver, now supports x86 Windows CE
  (mingw32ce) debugging.

* Removed commands

catch load
catch unload
  These commands were actually not implemented on any target.

*** Changes in GDB 6.8

* New native configurations

NetBSD/hppa			hppa*-*netbsd*
Xtensa GNU/Linux		xtensa*-*-linux*

* New targets

NetBSD/hppa			hppa*-*-netbsd*
Xtensa GNU/Linux		xtensa*-*-linux*

* Change in command line behavior -- corefiles vs. process ids.

  When the '-p NUMBER' or '--pid NUMBER' options are used, and
  attaching to process NUMBER fails, GDB no longer attempts to open a
  core file named NUMBER.  Attaching to a program using the -c option
  is no longer supported.  Instead, use the '-p' or '--pid' options.

* GDB can now be built as a native debugger for debugging Windows x86
(mingw32) Portable Executable (PE) programs.

* Pending breakpoints no longer change their number when their address
is resolved.

* GDB now supports breakpoints with multiple locations,
including breakpoints on C++ constructors, inside C++ templates,
and in inlined functions.

* GDB's ability to debug optimized code has been improved.  GDB more
accurately identifies function bodies and lexical blocks that occupy
more than one contiguous range of addresses.

* Target descriptions can now describe registers for PowerPC.

* The GDB remote stub, gdbserver, now supports the AltiVec and SPE
registers on PowerPC targets.

* The GDB remote stub, gdbserver, now supports thread debugging on GNU/Linux
targets even when the libthread_db library is not available.

* The GDB remote stub, gdbserver, now supports the new file transfer
commands (remote put, remote get, and remote delete).

* The GDB remote stub, gdbserver, now supports run and attach in
extended-remote mode.

* hppa*64*-*-hpux11* target broken
The debugger is unable to start a program and fails with the following
error: "Error trying to get information about dynamic linker".
The gdb-6.7 release is also affected.

* GDB now supports the --enable-targets= configure option to allow
building a single GDB executable that supports multiple remote
target architectures.

* GDB now supports debugging C and C++ programs which use the
Decimal Floating Point extension.  In addition, the PowerPC target
now has a set of pseudo-registers to inspect decimal float values
stored in two consecutive float registers.

* The -break-insert MI command can optionally create pending
breakpoints now.

* Improved support for debugging Ada
Many improvements to the Ada language support have been made.  These
include:
    - Better support for Ada2005 interface types
    - Improved handling of arrays and slices in general
    - Better support for Taft-amendment types
    - The '{type} ADDRESS' expression is now allowed on the left hand-side
      of an assignment
    - Improved command completion in Ada
    - Several bug fixes

* GDB on GNU/Linux and HP/UX can now debug through "exec" of a new
process.

* New commands

set print frame-arguments (all|scalars|none)
show print frame-arguments
  The value of this variable can be changed to control which argument
  values should be printed by the debugger when displaying a frame.

remote put
remote get
remote delete
  Transfer files to and from a remote target, and delete remote files.

* New MI commands

-target-file-put
-target-file-get
-target-file-delete
  Transfer files to and from a remote target, and delete remote files.

* New remote packets

vFile:open:
vFile:close:
vFile:pread:
vFile:pwrite:
vFile:unlink:
  Open, close, read, write, and delete files on the remote system.

vAttach
  Attach to an existing process on the remote system, in extended-remote
  mode.

vRun
  Run a new process on the remote system, in extended-remote mode.

*** Changes in GDB 6.7

* Resolved 101 resource leaks, null pointer dereferences, etc. in gdb, 
bfd, libiberty and opcodes, as revealed by static analysis donated by
Coverity, Inc. (http://scan.coverity.com).

* When looking up multiply-defined global symbols, GDB will now prefer the
symbol definition in the current shared library if it was built using the
-Bsymbolic linker option.

* When the Text User Interface (TUI) is not configured, GDB will now
recognize the -tui command-line option and print a message that the TUI
is not supported.

* The GDB remote stub, gdbserver, now has lower overhead for high 
frequency signals (e.g. SIGALRM) via the QPassSignals packet.

* GDB for MIPS targets now autodetects whether a remote target provides
32-bit or 64-bit register values.

* Support for C++ member pointers has been improved.

* GDB now understands XML target descriptions, which specify the
target's overall architecture.  GDB can read a description from
a local file or over the remote serial protocol.

* Vectors of single-byte data use a new integer type which is not
automatically displayed as character or string data.

* The /s format now works with the print command.  It displays
arrays of single-byte integers and pointers to single-byte integers
as strings.

* Target descriptions can now describe target-specific registers,
for architectures which have implemented the support (currently
only ARM, M68K, and MIPS).

* GDB and the GDB remote stub, gdbserver, now support the XScale
iWMMXt coprocessor.

* The GDB remote stub, gdbserver, has been updated to support
ARM Windows CE (mingw32ce) debugging, and GDB Windows CE support
has been rewritten to use the standard GDB remote protocol.

* GDB can now step into C++ functions which are called through thunks.

* GDB for the Cell/B.E. SPU now supports overlay debugging.

* The GDB remote protocol "qOffsets" packet can now honor ELF segment
layout.  It also supports a TextSeg= and DataSeg= response when only
segment base addresses (rather than offsets) are available.

* The /i format now outputs any trailing branch delay slot instructions 
immediately following the last instruction within the count specified.

* The GDB remote protocol "T" stop reply packet now supports a
"library" response.  Combined with the new "qXfer:libraries:read"
packet, this response allows GDB to debug shared libraries on targets
where the operating system manages the list of loaded libraries (e.g.
Windows and SymbianOS).

* The GDB remote stub, gdbserver, now supports dynamic link libraries
(DLLs) on Windows and Windows CE targets.

* GDB now supports a faster verification that a .debug file matches its binary
according to its build-id signature, if the signature is present.

* New commands

set remoteflow
show remoteflow
  Enable or disable hardware flow control (RTS/CTS) on the serial port
  when debugging using remote targets.

set mem inaccessible-by-default
show mem inaccessible-by-default
  If the target supplies a memory map, for instance via the remote
  protocol's "qXfer:memory-map:read" packet, setting this variable
  prevents GDB from accessing memory outside the memory map.  This
  is useful for targets with memory mapped registers or which react
  badly to accesses of unmapped address space.

set breakpoint auto-hw
show breakpoint auto-hw
  If the target supplies a memory map, for instance via the remote
  protocol's "qXfer:memory-map:read" packet, setting this variable
  lets GDB use hardware breakpoints automatically for memory regions
  where it can not use software breakpoints.  This covers both the
  "break" command and internal breakpoints used for other commands
  including "next" and "finish".

catch exception
catch exception unhandled
  Stop the program execution when Ada exceptions are raised.

catch assert
  Stop the program execution when an Ada assertion failed.

set sysroot
show sysroot
  Set an alternate system root for target files.  This is a more
  general version of "set solib-absolute-prefix", which is now
  an alias to "set sysroot".

info spu
  Provide extended SPU facility status information.  This set of
  commands is available only when debugging the Cell/B.E. SPU
  architecture.

* New native configurations

OpenBSD/sh			sh*-*openbsd*

set tdesc filename
unset tdesc filename
show tdesc filename
  Use the specified local file as an XML target description, and do
  not query the target for its built-in description.

* New targets

OpenBSD/sh			sh*-*-openbsd*
MIPS64 GNU/Linux (gdbserver)	mips64-linux-gnu
Toshiba Media Processor		mep-elf

* New remote packets

QPassSignals:
  Ignore the specified signals; pass them directly to the debugged program
  without stopping other threads or reporting them to GDB.

qXfer:features:read:
  Read an XML target description from the target, which describes its
  features.

qXfer:spu:read:
qXfer:spu:write:
  Read or write contents of an spufs file on the target system.  These
  packets are available only on the Cell/B.E. SPU architecture.

qXfer:libraries:read:
  Report the loaded shared libraries.  Combined with new "T" packet
  response, this packet allows GDB to debug shared libraries on
  targets where the operating system manages the list of loaded
  libraries (e.g. Windows and SymbianOS).

* Removed targets

Support for these obsolete configurations has been removed.

alpha*-*-osf1*
alpha*-*-osf2*
d10v-*-*
hppa*-*-hiux*
i[34567]86-ncr-*
i[34567]86-*-dgux*
i[34567]86-*-lynxos*
i[34567]86-*-netware*
i[34567]86-*-sco3.2v5*
i[34567]86-*-sco3.2v4*
i[34567]86-*-sco*
i[34567]86-*-sysv4.2*
i[34567]86-*-sysv4*
i[34567]86-*-sysv5*
i[34567]86-*-unixware2*
i[34567]86-*-unixware*
i[34567]86-*-sysv*
i[34567]86-*-isc*
m68*-cisco*-*
m68*-tandem-*
mips*-*-pe
rs6000-*-lynxos*
sh*-*-pe

* Other removed features

target abug
target cpu32bug
target est
target rom68k

	Various m68k-only ROM monitors.

target hms
target e7000
target sh3
target sh3e

	Various Renesas ROM monitors and debugging interfaces for SH and
	H8/300.

target ocd

	Support for a Macraigor serial interface to on-chip debugging.
	GDB does not directly support the newer parallel or USB
	interfaces.

DWARF 1 support

	A debug information format.  The predecessor to DWARF 2 and 
	DWARF 3, which are still supported.

Support for the HP aCC compiler on HP-UX/PA-RISC

	SOM-encapsulated symbolic debugging information, automatic
	invocation of pxdb, and the aCC custom C++ ABI.  This does not
	affect HP-UX for Itanium or GCC for HP-UX/PA-RISC.  Code compiled
	with aCC can still be debugged on an assembly level.

MIPS ".pdr" sections

	A MIPS-specific format used to describe stack frame layout
	in debugging information.

Scheme support

	GDB could work with an older version of Guile to debug
	the interpreter and Scheme programs running in it.

set mips stack-arg-size
set mips saved-gpreg-size

	Use "set mips abi" to control parameter passing for MIPS.

*** Changes in GDB 6.6

* New targets

Xtensa				xtensa-elf
Cell Broadband Engine SPU	spu-elf

* GDB can now be configured as a cross-debugger targeting native Windows
(mingw32) or Cygwin.  It can communicate with a remote debugging stub
running on a Windows system over TCP/IP to debug Windows programs.

* The GDB remote stub, gdbserver, has been updated to support Windows and
Cygwin debugging.  Both single-threaded and multi-threaded programs are
supported.

* The "set trust-readonly-sections" command works again.  This command was
broken in GDB 6.3, 6.4, and 6.5.

* The "load" command now supports writing to flash memory, if the remote
stub provides the required support.

* Support for GNU/Linux Thread Local Storage (TLS, per-thread variables) no
longer requires symbolic debug information (e.g. DWARF-2).

* New commands

set substitute-path
unset substitute-path
show substitute-path
  Manage a list of substitution rules that GDB uses to rewrite the name
  of the directories where the sources are located. This can be useful
  for instance when the sources were moved to a different location
  between compilation and debugging.

set trace-commands
show trace-commands
  Print each CLI command as it is executed.  Each command is prefixed with
  a number of `+' symbols representing the nesting depth.
  The source command now has a `-v' option to enable the same feature.

* REMOVED features

The ARM Demon monitor support (RDP protocol, "target rdp").

Kernel Object Display, an embedded debugging feature which only worked with
an obsolete version of Cisco IOS.

The 'set download-write-size' and 'show download-write-size' commands.

* New remote packets

qSupported:
  Tell a stub about GDB client features, and request remote target features.
  The first feature implemented is PacketSize, which allows the target to
  specify the size of packets it can handle - to minimize the number of
  packets required and improve performance when connected to a remote
  target.

qXfer:auxv:read:
  Fetch an OS auxilliary vector from the remote stub.  This packet is a
  more efficient replacement for qPart:auxv:read.

qXfer:memory-map:read:
  Fetch a memory map from the remote stub, including information about
  RAM, ROM, and flash memory devices.

vFlashErase:
vFlashWrite:
vFlashDone:
  Erase and program a flash memory device.

* Removed remote packets

qPart:auxv:read:
  This packet has been replaced by qXfer:auxv:read.  Only GDB 6.4 and 6.5
  used it, and only gdbserver implemented it.

*** Changes in GDB 6.5

* New targets

Renesas M32C/M16C		m32c-elf

Morpho Technologies ms1		ms1-elf

* New commands

init-if-undefined		Initialize a convenience variable, but
				only if it doesn't already have a value.

The following commands are presently only implemented for native GNU/Linux:

checkpoint			Save a snapshot of the program state.

restart	<n>			Return the program state to a 
				previously saved state.

info checkpoints		List currently saved checkpoints.

delete-checkpoint <n>		Delete a previously saved checkpoint.

set|show detach-on-fork		Tell gdb whether to detach from a newly
				forked process, or to keep debugging it.

info forks			List forks of the user program that
				are available to be debugged.

fork <n>			Switch to debugging one of several
				forks of the user program that are
				available to be debugged.

delete-fork <n>			Delete a fork from the list of forks
				that are available to be debugged (and
				kill the forked process).

detach-fork <n>			Delete a fork from the list of forks
				that are available to be debugged (and
				allow the process to continue).

* New architecture

Morpho Technologies ms2		ms1-elf

* Improved Windows host support

GDB now builds as a cross debugger hosted on i686-mingw32, including
native console support, and remote communications using either
network sockets or serial ports.

* Improved Modula-2 language support

GDB can now print most types in the Modula-2 syntax.  This includes:
basic types, set types, record types, enumerated types, range types,
pointer types and ARRAY types.  Procedure var parameters are correctly
printed and hexadecimal addresses and character constants are also
written in the Modula-2 syntax.  Best results can be obtained by using
GNU Modula-2 together with the -gdwarf-2 command line option.

* REMOVED features

The ARM rdi-share module.

The Netware NLM debug server.

*** Changes in GDB 6.4

* New native configurations

OpenBSD/arm			arm*-*-openbsd*
OpenBSD/mips64			mips64-*-openbsd*

* New targets

Morpho Technologies ms1		ms1-elf

* New command line options

--batch-silent			As for --batch, but totally silent.
--return-child-result		The debugger will exist with the same value
				the child (debugged) program exited with.
--eval-command COMMAND, -ex COMMAND
				Execute a single GDB CLI command. This may be
				specified multiple times and in conjunction
				with the --command (-x) option.

* Deprecated commands removed

The following commands, that were deprecated in 2000, have been
removed:

  Command				Replacement
  set|show arm disassembly-flavor	set|show arm disassembler
  othernames				set arm disassembler
  set|show remotedebug			set|show debug remote
  set|show archdebug			set|show debug arch
  set|show eventdebug			set|show debug event
  regs					info registers

* New BSD user-level threads support

It is now possible to debug programs using the user-level threads
library on OpenBSD and FreeBSD.  Currently supported (target)
configurations are:

FreeBSD/amd64			x86_64-*-freebsd*
FreeBSD/i386			i386-*-freebsd*
OpenBSD/i386			i386-*-openbsd*

Note that the new kernel threads libraries introduced in FreeBSD 5.x
are not yet supported.

* New support for Matsushita MN10300 w/sim added
(Work in progress).  mn10300-elf.

* REMOVED configurations and files

VxWorks and the XDR protocol			*-*-vxworks
Motorola MCORE                                  mcore-*-*
National Semiconductor NS32000			ns32k-*-*

* New "set print array-indexes" command

After turning this setting "on", GDB prints the index of each element
when displaying arrays.  The default is "off" to preserve the previous
behavior.

* VAX floating point support

GDB now supports the not-quite-ieee VAX F and D floating point formats.

* User-defined command support

In addition to using $arg0..$arg9 for argument passing, it is now possible
to use $argc to determine now many arguments have been passed.  See the
section on user-defined commands in the user manual for more information.

*** Changes in GDB 6.3:

* New command line option

GDB now accepts -l followed by a number to set the timeout for remote
debugging.

* GDB works with GCC -feliminate-dwarf2-dups

GDB now supports a more compact representation of DWARF-2 debug
information using DW_FORM_ref_addr references.  These are produced
by GCC with the option -feliminate-dwarf2-dups and also by some
proprietary compilers.  With GCC, you must use GCC 3.3.4 or later
to use -feliminate-dwarf2-dups.

* Internationalization

When supported by the host system, GDB will be built with
internationalization (libintl).  The task of marking up the sources is
continued, we're looking forward to our first translation.

* Ada

Initial support for debugging programs compiled with the GNAT 
implementation of the Ada programming language has been integrated 
into GDB.  In this release, support is limited to expression evaluation.

* New native configurations

GNU/Linux/m32r					m32r-*-linux-gnu

* Remote 'p' packet

GDB's remote protocol now includes support for the 'p' packet.  This
packet is used to fetch individual registers from a remote inferior.

* END-OF-LIFE registers[] compatibility module

GDB's internal register infrastructure has been completely rewritten.
The new infrastructure making possible the implementation of key new
features including 32x64 (e.g., 64-bit amd64 GDB debugging a 32-bit
i386 application).

GDB 6.3 will be the last release to include the registers[]
compatibility module that allowed out-of-date configurations to
continue to work.  This change directly impacts the following
configurations:

hppa-*-hpux
ia64-*-aix
mips-*-irix*
*-*-lynx
mips-*-linux-gnu
sds protocol
xdr protocol
powerpc bdm protocol

Unless there is activity to revive these configurations, they will be
made OBSOLETE in GDB 6.4, and REMOVED from GDB 6.5.

* OBSOLETE configurations and files

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

h8300-*-*
mcore-*-*
mn10300-*-*
ns32k-*-*
sh64-*-*
v850-*-*

*** Changes in GDB 6.2.1:

* MIPS `break main; run' gave an heuristic-fence-post warning

When attempting to run even a simple program, a warning about
heuristic-fence-post being hit would be reported.  This problem has
been fixed.

* MIPS IRIX 'long double' crashed GDB

When examining a long double variable, GDB would get a segmentation
fault.  The crash has been fixed (but GDB 6.2 cannot correctly examine
IRIX long double values).

* VAX and "next"

A bug in the VAX stack code was causing problems with the "next"
command.  This problem has been fixed.

*** Changes in GDB 6.2:

* Fix for ``many threads''

On GNU/Linux systems that use the NPTL threads library, a program
rapidly creating and deleting threads would confuse GDB leading to the
error message:

	ptrace: No such process.
	thread_db_get_info: cannot get thread info: generic error

This problem has been fixed.

* "-async" and "-noasync" options removed.

Support for the broken "-noasync" option has been removed (it caused
GDB to dump core).

* New ``start'' command.

This command runs the program until the beginning of the main procedure.

* New BSD Kernel Data Access Library (libkvm) interface

Using ``target kvm'' it is now possible to debug kernel core dumps and
live kernel memory images on various FreeBSD, NetBSD and OpenBSD
platforms.  Currently supported (native-only) configurations are:

FreeBSD/amd64			x86_64-*-freebsd*
FreeBSD/i386			i?86-*-freebsd*
NetBSD/i386			i?86-*-netbsd*
NetBSD/m68k			m68*-*-netbsd*
NetBSD/sparc			sparc-*-netbsd*
OpenBSD/amd64			x86_64-*-openbsd*
OpenBSD/i386			i?86-*-openbsd*
OpenBSD/m68k			m68*-openbsd*
OpenBSD/sparc			sparc-*-openbsd*

* Signal trampoline code overhauled

Many generic problems with GDB's signal handling code have been fixed.
These include: backtraces through non-contiguous stacks; recognition
of sa_sigaction signal trampolines; backtrace from a NULL pointer
call; backtrace through a signal trampoline; step into and out of
signal handlers; and single-stepping in the signal trampoline.

Please note that kernel bugs are a limiting factor here.  These
features have been shown to work on an s390 GNU/Linux system that
include a 2.6.8-rc1 kernel.  Ref PR breakpoints/1702.

* Cygwin support for DWARF 2 added.

* New native configurations

GNU/Linux/hppa					hppa*-*-linux*
OpenBSD/hppa					hppa*-*-openbsd*
OpenBSD/m68k					m68*-*-openbsd*
OpenBSD/m88k					m88*-*-openbsd*
OpenBSD/powerpc					powerpc-*-openbsd*
NetBSD/vax					vax-*-netbsd*
OpenBSD/vax					vax-*-openbsd*

* END-OF-LIFE frame compatibility module

GDB's internal frame infrastructure has been completely rewritten.
The new infrastructure making it possible to support key new features
including DWARF 2 Call Frame Information.  To aid in the task of
migrating old configurations to this new infrastructure, a
compatibility module, that allowed old configurations to continue to
work, was also included.

GDB 6.2 will be the last release to include this frame compatibility
module.  This change directly impacts the following configurations:

h8300-*-*
mcore-*-*
mn10300-*-*
ns32k-*-*
sh64-*-*
v850-*-*
xstormy16-*-*

Unless there is activity to revive these configurations, they will be
made OBSOLETE in GDB 6.3, and REMOVED from GDB 6.4.

* REMOVED configurations and files

Sun 3, running SunOS 3				m68*-*-sunos3*
Sun 3, running SunOS 4				m68*-*-sunos4*
Sun 2, running SunOS 3				m68000-*-sunos3*
Sun 2, running SunOS 4				m68000-*-sunos4*
Motorola 680x0 running LynxOS			m68*-*-lynxos*
AT&T 3b1/Unix pc				m68*-att-*
Bull DPX2 (68k, System V release 3)		m68*-bull-sysv*
decstation					mips-dec-* mips-little-*
riscos						mips-*-riscos* mips-*-sysv*
sonymips					mips-sony-*
sysv					mips*-*-sysv4* (IRIX 5/6 not included)

*** Changes in GDB 6.1.1:

* TUI (Text-mode User Interface) built-in (also included in GDB 6.1)

The TUI (Text-mode User Interface) is now built as part of a default
GDB configuration.  It is enabled by either selecting the TUI with the
command line option "-i=tui" or by running the separate "gdbtui"
program.  For more information on the TUI, see the manual "Debugging
with GDB".

* Pending breakpoint support (also included in GDB 6.1)

Support has been added to allow you to specify breakpoints in shared
libraries that have not yet been loaded.  If a breakpoint location
cannot be found, and the "breakpoint pending" option is set to auto,
GDB queries you if you wish to make the breakpoint pending on a future
shared-library load.  If and when GDB resolves the breakpoint symbol,
the pending breakpoint is removed as one or more regular breakpoints
are created.

Pending breakpoints are very useful for GCJ Java debugging.

* Fixed ISO-C build problems

The files bfd/elf-bfd.h, gdb/dictionary.c and gdb/types.c contained
non ISO-C code that stopped them being built using a more strict ISO-C
compiler (e.g., IBM's C compiler).

* Fixed build problem on IRIX 5

Due to header problems with <sys/proc.h>, the file gdb/proc-api.c
wasn't able to compile compile on an IRIX 5 system.

* Added execute permission to gdb/gdbserver/configure

The shell script gdb/testsuite/gdb.stabs/configure lacked execute
permission.  This bug would cause configure to fail on a number of
systems (Solaris, IRIX).  Ref: server/519.

* Fixed build problem on hpux2.0w-hp-hpux11.00 using the HP ANSI C compiler

Older HPUX ANSI C compilers did not accept variable array sizes.  somsolib.c
has been updated to use constant array sizes.

* Fixed a panic in the DWARF Call Frame Info code on Solaris 2.7

GCC 3.3.2, on Solaris 2.7, includes the DW_EH_PE_funcrel encoding in
its generated DWARF Call Frame Info.  This encoding was causing GDB to
panic, that panic has been fixed.  Ref: gdb/1628.

* Fixed a problem when examining parameters in shared library code.

When examining parameters in optimized shared library code generated
by a mainline GCC, GDB would incorrectly report ``Variable "..." is
not available''.  GDB now correctly displays the variable's value.

*** Changes in GDB 6.1:

* Removed --with-mmalloc

Support for the mmalloc memory manager has been removed, as it
conflicted with the internal gdb byte cache.

* Changes in AMD64 configurations

The AMD64 target now includes the %cs and %ss registers.  As a result
the AMD64 remote protocol has changed; this affects the floating-point
and SSE registers.  If you rely on those registers for your debugging,
you should upgrade gdbserver on the remote side.

* Revised SPARC target

The SPARC target has been completely revised, incorporating the
FreeBSD/sparc64 support that was added for GDB 6.0.  As a result
support for LynxOS and SunOS 4 has been dropped.  Calling functions
from within GDB on operating systems with a non-executable stack
(Solaris, OpenBSD) now works.

* New C++ demangler

GDB has a new C++ demangler which does a better job on the mangled
names generated by current versions of g++.  It also runs faster, so
with this and other changes gdb should now start faster on large C++
programs.

* DWARF 2 Location Expressions

GDB support for location expressions has been extended to support function
arguments and frame bases.  Older versions of GDB could crash when they
encountered these.

* C++ nested types and namespaces

GDB's support for nested types and namespaces in C++ has been
improved, especially if you use the DWARF 2 debugging format.  (This
is the default for recent versions of GCC on most platforms.)
Specifically, if you have a class "Inner" defined within a class or
namespace "Outer", then GDB realizes that the class's name is
"Outer::Inner", not simply "Inner".  This should greatly reduce the
frequency of complaints about not finding RTTI symbols.  In addition,
if you are stopped at inside of a function defined within a namespace,
GDB modifies its name lookup accordingly.

* New native configurations

NetBSD/amd64					x86_64-*-netbsd*
OpenBSD/amd64					x86_64-*-openbsd*
OpenBSD/alpha					alpha*-*-openbsd*
OpenBSD/sparc					sparc-*-openbsd*
OpenBSD/sparc64					sparc64-*-openbsd*

* New debugging protocols

M32R with SDI protocol				m32r-*-elf*

* "set prompt-escape-char" command deleted.

The command "set prompt-escape-char" has been deleted.  This command,
and its very obscure effect on GDB's prompt, was never documented,
tested, nor mentioned in the NEWS file.

* OBSOLETE configurations and files

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

Sun 3, running SunOS 3				m68*-*-sunos3*
Sun 3, running SunOS 4				m68*-*-sunos4*
Sun 2, running SunOS 3				m68000-*-sunos3*
Sun 2, running SunOS 4				m68000-*-sunos4*
Motorola 680x0 running LynxOS			m68*-*-lynxos*
AT&T 3b1/Unix pc				m68*-att-*
Bull DPX2 (68k, System V release 3)		m68*-bull-sysv*
decstation					mips-dec-* mips-little-*
riscos						mips-*-riscos* mips-*-sysv*
sonymips					mips-sony-*
sysv					mips*-*-sysv4* (IRIX 5/6 not included)

* REMOVED configurations and files

SGI Irix-4.x				mips-sgi-irix4	or iris4
SGI Iris (MIPS) running Irix V3:  	mips-sgi-irix   or  iris
Z8000 simulator		  		z8k-zilog-none 	  or z8ksim
Matsushita MN10200 w/simulator			mn10200-*-*
H8/500 simulator 			h8500-hitachi-hms or h8500hms
HP/PA running BSD				hppa*-*-bsd*
HP/PA running OSF/1				hppa*-*-osf*
HP/PA Pro target				hppa*-*-pro*
PMAX (MIPS) running Mach 3.0			mips*-*-mach3*
386BSD						i[3456]86-*-bsd*
Sequent family					i[3456]86-sequent-sysv4*
						i[3456]86-sequent-sysv*
						i[3456]86-sequent-bsd*
SPARC running LynxOS				sparc-*-lynxos*
SPARC running SunOS 4				sparc-*-sunos4*
Tsqware Sparclet				sparclet-*-*
Fujitsu SPARClite 			sparclite-fujitsu-none  or  sparclite

*** Changes in GDB 6.0:

* Objective-C

Support for debugging the Objective-C programming language has been
integrated into GDB.

* New backtrace mechanism (includes DWARF 2 Call Frame Information).

DWARF 2's Call Frame Information makes available compiler generated
information that more exactly describes the program's run-time stack.
By using this information, GDB is able to provide more robust stack
backtraces.

The i386, amd64 (nee, x86-64), Alpha, m68hc11, ia64, and m32r targets
have been updated to use a new backtrace mechanism which includes
DWARF 2 CFI support.

* Hosted file I/O.

GDB's remote protocol has been extended to include support for hosted
file I/O (where the remote target uses GDB's file system).  See GDB's
remote protocol documentation for details.

* All targets using the new architecture framework.

All of GDB's targets have been updated to use the new internal
architecture framework.  The way is now open for future GDB releases
to include cross-architecture native debugging support (i386 on amd64,
ppc32 on ppc64).

* GNU/Linux's Thread Local Storage (TLS)

GDB now includes support for for the GNU/Linux implementation of
per-thread variables.

* GNU/Linux's Native POSIX Thread Library (NPTL)

GDB's thread code has been updated to work with either the new
GNU/Linux NPTL thread library or the older "LinuxThreads" library.

* Separate debug info.

GDB, in conjunction with BINUTILS, now supports a mechanism for
automatically loading debug information from a separate file.  Instead
of shipping full debug and non-debug versions of system libraries,
system integrators can now instead ship just the stripped libraries
and optional debug files.

* DWARF 2 Location Expressions

DWARF 2 Location Expressions allow the compiler to more completely
describe the location of variables (even in optimized code) to the
debugger.

GDB now includes preliminary support for location expressions (support
for DW_OP_piece is still missing).

* Java

A number of long standing bugs that caused GDB to die while starting a
Java application have been fixed.  GDB's Java support is now
considered "useable".

* GNU/Linux support for fork, vfork, and exec.

The "catch fork", "catch exec", "catch vfork", and "set follow-fork-mode"
commands are now implemented for GNU/Linux.  They require a 2.5.x or later
kernel.

* GDB supports logging output to a file

There are two new commands, "set logging" and "show logging", which can be
used to capture GDB's output to a file.

* The meaning of "detach" has changed for gdbserver

The "detach" command will now resume the application, as documented.  To
disconnect from gdbserver and leave it stopped, use the new "disconnect"
command.

* d10v, m68hc11 `regs' command deprecated

The `info registers' command has been updated so that it displays the
registers using a format identical to the old `regs' command.

* Profiling support

A new command, "maint set profile on/off", has been added.  This command can
be used to enable or disable profiling while running GDB, to profile a
session or a set of commands.  In addition there is a new configure switch,
"--enable-profiling", which will cause GDB to be compiled with profiling
data, for more informative profiling results.

* Default MI syntax changed to "mi2".

The default MI (machine interface) syntax, enabled by the command line
option "-i=mi", has been changed to "mi2".  The previous MI syntax,
"mi1", can be enabled by specifying the option "-i=mi1".

Support for the original "mi0" syntax (included in GDB 5.0) has been
removed.

Fix for gdb/192: removed extraneous space when displaying frame level.
Fix for gdb/672: update changelist is now output in mi list format.
Fix for gdb/702: a -var-assign that updates the value now shows up
                 in a subsequent -var-update.

* New native configurations.

FreeBSD/amd64					x86_64-*-freebsd*

* Multi-arched targets.

HP/PA HPUX11                                    hppa*-*-hpux*
Renesas M32R/D w/simulator			m32r-*-elf*

* OBSOLETE configurations and files

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

Z8000 simulator		  		z8k-zilog-none 	  or z8ksim
Matsushita MN10200 w/simulator			mn10200-*-*
H8/500 simulator 			h8500-hitachi-hms or h8500hms
HP/PA running BSD				hppa*-*-bsd*
HP/PA running OSF/1				hppa*-*-osf*
HP/PA Pro target				hppa*-*-pro*
PMAX (MIPS) running Mach 3.0			mips*-*-mach3*
Sequent family					i[3456]86-sequent-sysv4*
						i[3456]86-sequent-sysv*
						i[3456]86-sequent-bsd*
Tsqware Sparclet				sparclet-*-*
Fujitsu SPARClite 			sparclite-fujitsu-none  or  sparclite

* REMOVED configurations and files

V850EA ISA				
Motorola Delta 88000 running Sys V		m88k-motorola-sysv  or  delta88
IBM AIX PS/2					i[3456]86-*-aix
i386 running Mach 3.0				i[3456]86-*-mach3*
i386 running Mach				i[3456]86-*-mach*
i386 running OSF/1				i[3456]86-*osf1mk*
HP/Apollo 68k Family				m68*-apollo*-sysv*,
						m68*-apollo*-bsd*,
						m68*-hp-bsd*, m68*-hp-hpux*
Argonaut Risc Chip (ARC)			arc-*-*
Mitsubishi D30V					d30v-*-*
Fujitsu FR30					fr30-*-elf*
OS/9000						i[34]86-*-os9k
I960 with MON960				i960-*-coff

* MIPS $fp behavior changed

The convenience variable $fp, for the MIPS, now consistently returns
the address of the current frame's base.  Previously, depending on the
context, $fp could refer to either $sp or the current frame's base
address.  See ``8.10 Registers'' in the manual ``Debugging with GDB:
The GNU Source-Level Debugger''.

*** Changes in GDB 5.3:

* GNU/Linux shared library multi-threaded performance improved.

When debugging a multi-threaded application on GNU/Linux, GDB now uses
`/proc', in preference to `ptrace' for memory reads.  This may result
in an improvement in the start-up time of multi-threaded, shared
library applications when run under GDB.  One GDB user writes: ``loads
shared libs like mad''.

* ``gdbserver'' now supports multi-threaded applications on some targets

Support for debugging multi-threaded applications which use  
the GNU/Linux LinuxThreads package has been added for
arm*-*-linux*-gnu*, i[3456]86-*-linux*-gnu*, mips*-*-linux*-gnu*,
powerpc*-*-linux*-gnu*, and sh*-*-linux*-gnu*.

* GDB now supports C/C++ preprocessor macros.

GDB now expands preprocessor macro invocations in C/C++ expressions,
and provides various commands for showing macro definitions and how
they expand.

The new command `macro expand EXPRESSION' expands any macro
invocations in expression, and shows the result.

The new command `show macro MACRO-NAME' shows the definition of the
macro named MACRO-NAME, and where it was defined.

Most compilers don't include information about macros in the debugging
information by default.  In GCC 3.1, for example, you need to compile
your program with the options `-gdwarf-2 -g3'.  If the macro
information is present in the executable, GDB will read it.

* Multi-arched targets.

DEC Alpha (partial)				alpha*-*-*
DEC VAX (partial)				vax-*-*
NEC V850					v850-*-*
National Semiconductor NS32000 (partial)	ns32k-*-*
Motorola 68000 (partial)                        m68k-*-*
Motorola MCORE                                  mcore-*-*

* New targets.

Fujitsu FRV architecture added by Red Hat	frv*-*-*


* New native configurations

Alpha NetBSD					alpha*-*-netbsd*
SH NetBSD					sh*-*-netbsdelf*
MIPS NetBSD					mips*-*-netbsd*
UltraSPARC NetBSD				sparc64-*-netbsd*

* OBSOLETE configurations and files

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

Mitsubishi D30V					d30v-*-*
OS/9000						i[34]86-*-os9k
IBM AIX PS/2					i[3456]86-*-aix
Fujitsu FR30					fr30-*-elf*
Motorola Delta 88000 running Sys V		m88k-motorola-sysv  or  delta88
Argonaut Risc Chip (ARC)			arc-*-*
i386 running Mach 3.0				i[3456]86-*-mach3*
i386 running Mach				i[3456]86-*-mach*
i386 running OSF/1				i[3456]86-*osf1mk*
HP/Apollo 68k Family				m68*-apollo*-sysv*,
						m68*-apollo*-bsd*,
						m68*-hp-bsd*, m68*-hp-hpux*
I960 with MON960				i960-*-coff

* OBSOLETE languages

CHILL, a Pascal like language used by telecommunications companies.

* REMOVED configurations and files

AMD 29k family via UDI				a29k-amd-udi, udi29k
A29K VxWorks					a29k-*-vxworks
AMD 29000 embedded, using EBMON			a29k-none-none
AMD 29000 embedded with COFF			a29k-none-coff
AMD 29000 embedded with a.out			a29k-none-aout

testsuite/gdb.hp/gdb.threads-hp/		directory

* New command "set max-user-call-depth <nnn>"

This command allows the user to limit the call depth of user-defined
commands.  The default is 1024.

* Changes in FreeBSD/i386 native debugging.

Support for the "generate-core-file" has been added.

* New commands "dump", "append", and "restore".

These commands allow data to be copied from target memory
to a bfd-format or binary file (dump and append), and back
from a file into memory (restore).

* Improved "next/step" support on multi-processor Alpha Tru64.

The previous single-step mechanism could cause unpredictable problems,
including the random appearance of SIGSEGV or SIGTRAP signals. The use
of a software single-step mechanism prevents this.

*** Changes in GDB 5.2.1:

* New targets.

Atmel AVR					avr*-*-*

* Bug fixes

gdb/182: gdb/323: gdb/237: On alpha, gdb was reporting:
mdebugread.c:2443: gdb-internal-error: sect_index_data not initialized
Fix, by Joel Brobecker imported from mainline.

gdb/439: gdb/291: On some ELF object files, gdb was reporting:
dwarf2read.c:1072: gdb-internal-error: sect_index_text not initialize
Fix, by Fred Fish, imported from mainline.

Dwarf2 .debug_frame & .eh_frame handler improved in many ways. 
Surprisingly enough, it works now.
By Michal Ludvig, imported from mainline.

i386 hardware watchpoint support: 
avoid misses on second run for some targets.
By Pierre Muller, imported from mainline.

*** Changes in GDB 5.2:

* New command "set trust-readonly-sections on[off]".

This command is a hint that tells gdb that read-only sections
really are read-only (ie. that their contents will not change).
In this mode, gdb will go to the object file rather than the
target to read memory from read-only sections (such as ".text").
This can be a significant performance improvement on some
(notably embedded) targets.

* New command "generate-core-file" (or "gcore").

This new gdb command allows the user to drop a core file of the child
process state at any time.  So far it's been implemented only for
GNU/Linux and Solaris, but should be relatively easily ported to other
hosts.  Argument is core file name (defaults to core.<pid>).

* New command line option

GDB now accepts --pid or -p followed by a process id.  

* Change in command line behavior -- corefiles vs. process ids.

There is a subtle behavior in the way in which GDB handles 
command line arguments.  The first non-flag argument is always
a program to debug, but the second non-flag argument may either
be a corefile or a process id.  Previously, GDB would attempt to
open the second argument as a corefile, and if that failed, would
issue a superfluous error message and then attempt to attach it as
a process.  Now, if the second argument begins with a non-digit, 
it will be treated as a corefile.  If it begins with a digit, 
GDB will attempt to attach it as a process, and if no such process
is found, will then attempt to open it as a corefile.

* Changes in ARM configurations.

Multi-arch support is enabled for all ARM configurations.  The ARM/NetBSD
configuration is fully multi-arch.

* New native configurations

ARM NetBSD					arm*-*-netbsd*
x86 OpenBSD					i[3456]86-*-openbsd*
AMD x86-64 running GNU/Linux			x86_64-*-linux-*
Sparc64 running FreeBSD				sparc64-*-freebsd*

* New targets

Sanyo XStormy16					xstormy16-elf

* OBSOLETE configurations and files

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

AMD 29k family via UDI				a29k-amd-udi, udi29k
A29K VxWorks					a29k-*-vxworks
AMD 29000 embedded, using EBMON			a29k-none-none
AMD 29000 embedded with COFF			a29k-none-coff
AMD 29000 embedded with a.out			a29k-none-aout

testsuite/gdb.hp/gdb.threads-hp/		directory

* REMOVED configurations and files

TI TMS320C80					tic80-*-*
WDC 65816					w65-*-*
PowerPC Solaris					powerpcle-*-solaris*
PowerPC Windows NT				powerpcle-*-cygwin32
PowerPC Netware					powerpc-*-netware*
Harris/CXUX m88k				m88*-harris-cxux*
Most ns32k hosts and targets			ns32k-*-mach3* ns32k-umax-*
						ns32k-utek-sysv* ns32k-utek-*
SunOS 4.0.Xi on i386				i[3456]86-*-sunos*
Ultracomputer (29K) running Sym1		a29k-nyu-sym1 a29k-*-kern*
Sony NEWS (68K) running NEWSOS 3.x		m68*-sony-sysv news
ISI Optimum V (3.05) under 4.3bsd.		m68*-isi-*
Apple Macintosh (MPW) host and target		N/A host, powerpc-*-macos*

* Changes to command line processing

The new `--args' feature can be used to specify command-line arguments
for the inferior from gdb's command line.

* Changes to key bindings

There is a new `operate-and-get-next' function bound to `C-o'.

*** Changes in GDB 5.1.1 

Fix compile problem on DJGPP.

Fix a problem with floating-point registers on the i386 being
corrupted.

Fix to stop GDB crashing on .debug_str debug info.

Numerous documentation fixes.

Numerous testsuite fixes.

*** Changes in GDB 5.1:

* New native configurations

Alpha FreeBSD					alpha*-*-freebsd*
x86 FreeBSD 3.x and 4.x				i[3456]86*-freebsd[34]*
MIPS GNU/Linux					mips*-*-linux*
MIPS SGI Irix 6.x				mips*-sgi-irix6*
ia64 AIX					ia64-*-aix*
s390 and s390x GNU/Linux			{s390,s390x}-*-linux*

* New targets

Motorola 68HC11 and 68HC12			m68hc11-elf
CRIS						cris-axis
UltraSparc running GNU/Linux			sparc64-*-linux*

* OBSOLETE configurations and files

x86 FreeBSD before 2.2				i[3456]86*-freebsd{1,2.[01]}*, 
Harris/CXUX m88k				m88*-harris-cxux*
Most ns32k hosts and targets			ns32k-*-mach3* ns32k-umax-*
						ns32k-utek-sysv* ns32k-utek-*
TI TMS320C80					tic80-*-*
WDC 65816					w65-*-*
Ultracomputer (29K) running Sym1		a29k-nyu-sym1 a29k-*-kern*
PowerPC Solaris					powerpcle-*-solaris*
PowerPC Windows NT				powerpcle-*-cygwin32
PowerPC Netware					powerpc-*-netware*
SunOS 4.0.Xi on i386				i[3456]86-*-sunos*
Sony NEWS (68K) running NEWSOS 3.x		m68*-sony-sysv news
ISI Optimum V (3.05) under 4.3bsd.		m68*-isi-*
Apple Macintosh (MPW) host			N/A

stuff.c (Program to stuff files into a specially prepared space in kdb)
kdb-start.c (Main loop for the standalone kernel debugger)

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

* REMOVED configurations and files

Altos 3068					m68*-altos-*
Convex						c1-*-*, c2-*-*
Pyramid						pyramid-*-*
ARM RISCix					arm-*-* (as host)
Tahoe						tahoe-*-*
ser-ocd.c					*-*-*

* GDB has been converted to ISO C.

GDB's source code has been converted to ISO C.  In particular, the
sources are fully protoized, and rely on standard headers being
present.

* Other news:

* "info symbol" works on platforms which use COFF, ECOFF, XCOFF, and NLM.

* The MI enabled by default.

The new machine oriented interface (MI) introduced in GDB 5.0 has been
revised and enabled by default.  Packages which use GDB as a debugging
engine behind a UI or another front end are encouraged to switch to
using the GDB/MI interface, instead of the old annotations interface
which is now deprecated.

* Support for debugging Pascal programs.

GDB now includes support for debugging Pascal programs.  The following
main features are supported:

    - Pascal-specific data types such as sets;

    - automatic recognition of Pascal sources based on file-name
      extension;

    - Pascal-style display of data types, variables, and functions;

    - a Pascal expression parser.

However, some important features are not yet supported.

    - Pascal string operations are not supported at all;

    - there are some problems with boolean types;

    - Pascal type hexadecimal constants are not supported
      because they conflict with the internal variables format;

    - support for Pascal objects and classes is not full yet;

    - unlike Pascal, GDB is case-sensitive for symbol names.

* Changes in completion.

Commands such as `shell', `run' and `set args', which pass arguments
to inferior programs, now complete on file names, similar to what
users expect at the shell prompt.

Commands which accept locations, such as `disassemble', `print',
`breakpoint', `until', etc. now complete on filenames as well as
program symbols.  Thus, if you type "break foob TAB", and the source
files linked into the programs include `foobar.c', that file name will
be one of the candidates for completion.  However, file names are not
considered for completion after you typed a colon that delimits a file
name from a name of a function in that file, as in "break foo.c:bar".

`set demangle-style' completes on available demangling styles.

* New platform-independent commands:

It is now possible to define a post-hook for a command as well as a
hook that runs before the command.  For more details, see the
documentation of `hookpost' in the GDB manual.

* Changes in GNU/Linux native debugging.

Support for debugging multi-threaded programs has been completely
revised for all platforms except m68k and sparc.  You can now debug as
many threads as your system allows you to have.

Attach/detach is supported for multi-threaded programs.

Support for SSE registers was added for x86.  This doesn't work for
multi-threaded programs though.

* Changes in MIPS configurations.

Multi-arch support is enabled for all MIPS configurations.

GDB can now be built as native debugger on SGI Irix 6.x systems for
debugging n32 executables.  (Debugging 64-bit executables is not yet
supported.)

* Unified support for hardware watchpoints in all x86 configurations.

Most (if not all) native x86 configurations support hardware-assisted
breakpoints and watchpoints in a unified manner.  This support
implements debug register sharing between watchpoints, which allows to
put a virtually infinite number of watchpoints on the same address,
and also supports watching regions up to 16 bytes with several debug
registers.

The new maintenance command `maintenance show-debug-regs' toggles
debugging print-outs in functions that insert, remove, and test
watchpoints and hardware breakpoints.

* Changes in the DJGPP native configuration.

New command ``info dos sysinfo'' displays assorted information about
the CPU, OS, memory, and DPMI server.

New commands ``info dos gdt'', ``info dos ldt'', and ``info dos idt''
display information about segment descriptors stored in GDT, LDT, and
IDT.

New commands ``info dos pde'' and ``info dos pte'' display entries
from Page Directory and Page Tables (for now works with CWSDPMI only).
New command ``info dos address-pte'' displays the Page Table entry for
a given linear address.

GDB can now pass command lines longer than 126 characters to the
program being debugged (requires an update to the libdbg.a library
which is part of the DJGPP development kit).

DWARF2 debug info is now supported.

It is now possible to `step' and `next' through calls to `longjmp'.

* Changes in documentation.

All GDB documentation was converted to GFDL, the GNU Free
Documentation License.

Tracepoints-related commands are now fully documented in the GDB
manual.

TUI, the Text-mode User Interface, is now documented in the manual.

Tracepoints-related commands are now fully documented in the GDB
manual.

The "GDB Internals" manual now has an index.  It also includes
documentation of `ui_out' functions, GDB coding standards, x86
hardware watchpoints, and memory region attributes.

* GDB's version number moved to ``version.in''

The Makefile variable VERSION has been replaced by the file
``version.in''.  People creating GDB distributions should update the
contents of this file.

* gdba.el deleted

GUD support is now a standard part of the EMACS distribution.

*** Changes in GDB 5.0:

* Improved support for debugging FP programs on x86 targets

Unified and much-improved support for debugging floating-point
programs on all x86 targets.  In particular, ``info float'' now
displays the FP registers in the same format on all x86 targets, with
greater level of detail.

* Improvements and bugfixes in hardware-assisted watchpoints

It is now possible to watch array elements, struct members, and
bitfields with hardware-assisted watchpoints.  Data-read watchpoints
on x86 targets no longer erroneously trigger when the address is
written.

* Improvements in the native DJGPP version of GDB

The distribution now includes all the scripts and auxiliary files
necessary to build the native DJGPP version on MS-DOS/MS-Windows
machines ``out of the box''.

The DJGPP version can now debug programs that use signals.  It is
possible to catch signals that happened in the debuggee, deliver
signals to it, interrupt it with Ctrl-C, etc.  (Previously, a signal
would kill the program being debugged.)  Programs that hook hardware
interrupts (keyboard, timer, etc.) can also be debugged.

It is now possible to debug DJGPP programs that redirect their
standard handles or switch them to raw (as opposed to cooked) mode, or
even close them.  The command ``run < foo > bar'' works as expected,
and ``info terminal'' reports useful information about the debuggee's
terminal, including raw/cooked mode, redirection, etc.

The DJGPP version now uses termios functions for console I/O, which
enables debugging graphics programs.  Interrupting GDB with Ctrl-C
also works.

DOS-style file names with drive letters are now fully supported by
GDB.

It is now possible to debug DJGPP programs that switch their working
directory.  It is also possible to rerun the debuggee any number of
times without restarting GDB; thus, you can use the same setup,
breakpoints, etc. for many debugging sessions.

* New native configurations

ARM GNU/Linux					arm*-*-linux*
PowerPC GNU/Linux				powerpc-*-linux*

* New targets

Motorola MCore					mcore-*-*
x86 VxWorks					i[3456]86-*-vxworks*
PowerPC VxWorks					powerpc-*-vxworks*
TI TMS320C80					tic80-*-*

* OBSOLETE configurations

Altos 3068					m68*-altos-*
Convex						c1-*-*, c2-*-*
Pyramid						pyramid-*-*
ARM RISCix					arm-*-* (as host)
Tahoe						tahoe-*-*

Configurations that have been declared obsolete will be commented out,
but the code will be left in place.  If there is no activity to revive
these configurations before the next release of GDB, the sources will
be permanently REMOVED.

* Gould support removed

Support for the Gould PowerNode and NP1 has been removed.

* New features for SVR4

On SVR4 native platforms (such as Solaris), if you attach to a process
without first loading a symbol file, GDB will now attempt to locate and
load symbols from the running process's executable file.

* Many C++ enhancements

C++ support has been greatly improved. Overload resolution now works properly
in almost all cases. RTTI support is on the way.

* Remote targets can connect to a sub-program

A popen(3) style serial-device has been added.  This device starts a
sub-process (such as a stand-alone simulator) and then communicates
with that.  The sub-program to run is specified using the syntax
``|<program> <args>'' vis:

	(gdb) set remotedebug 1
	(gdb) target extended-remote |mn10300-elf-sim program-args

* MIPS 64 remote protocol

A long standing bug in the mips64 remote protocol where by GDB
expected certain 32 bit registers (ex SR) to be transfered as 32
instead of 64 bits has been fixed.

The command ``set remote-mips64-transfers-32bit-regs on'' has been
added to provide backward compatibility with older versions of GDB.

* ``set remotebinarydownload'' replaced by ``set remote X-packet''

The command ``set remotebinarydownload'' command has been replaced by
``set remote X-packet''.  Other commands in ``set remote'' family
include ``set remote P-packet''.

* Breakpoint commands accept ranges.

The breakpoint commands ``enable'', ``disable'', and ``delete'' now
accept a range of breakpoints, e.g. ``5-7''.  The tracepoint command
``tracepoint passcount'' also accepts a range of tracepoints.

* ``apropos'' command added.

The ``apropos'' command searches through command names and
documentation strings, printing out matches, making it much easier to
try to find a command that does what you are looking for.

* New MI interface

A new machine oriented interface (MI) has been added to GDB.  This
interface is designed for debug environments running GDB as a separate
process.  This is part of the long term libGDB project.  See the
"GDB/MI" chapter of the GDB manual for further information.  It can be
enabled by configuring with:

	.../configure --enable-gdbmi

*** Changes in GDB-4.18:

* New native configurations

HP-UX 10.20					hppa*-*-hpux10.20
HP-UX 11.x					hppa*-*-hpux11.0*
M68K GNU/Linux					m68*-*-linux*

* New targets

Fujitsu FR30					fr30-*-elf*
Intel StrongARM					strongarm-*-*
Mitsubishi D30V					d30v-*-*

* OBSOLETE configurations

Gould PowerNode, NP1				np1-*-*, pn-*-*

Configurations that have been declared obsolete will be commented out,
but the code will be left in place.  If there is no activity to revive
these configurations before the next release of GDB, the sources will
be permanently REMOVED.

* ANSI/ISO C

As a compatibility experiment, GDB's source files buildsym.h and
buildsym.c have been converted to pure standard C, no longer
containing any K&R compatibility code.  We believe that all systems in
use today either come with a standard C compiler, or have a GCC port
available.  If this is not true, please report the affected
configuration to bug-gdb@gnu.org immediately.  See the README file for
information about getting a standard C compiler if you don't have one
already.

* Readline 2.2

GDB now uses readline 2.2.

* set extension-language

You can now control the mapping between filename extensions and source
languages by using the `set extension-language' command.  For instance,
you can ask GDB to treat .c files as C++ by saying
	set extension-language .c c++
The command `info extensions' lists all of the recognized extensions
and their associated languages.

* Setting processor type for PowerPC and RS/6000

When GDB is configured for a powerpc*-*-* or an rs6000*-*-* target,
you can use the `set processor' command to specify what variant of the
PowerPC family you are debugging.  The command

	set processor NAME

sets the PowerPC/RS6000 variant to NAME.  GDB knows about the
following PowerPC and RS6000 variants:

  ppc-uisa  PowerPC UISA - a PPC processor as viewed by user-level code
  rs6000    IBM RS6000 ("POWER") architecture, user-level view
  403       IBM PowerPC 403
  403GC     IBM PowerPC 403GC
  505       Motorola PowerPC 505
  860       Motorola PowerPC 860 or 850
  601       Motorola PowerPC 601
  602       Motorola PowerPC 602
  603       Motorola/IBM PowerPC 603 or 603e
  604       Motorola PowerPC 604 or 604e
  750       Motorola/IBM PowerPC 750 or 750

At the moment, this command just tells GDB what to name the
special-purpose processor registers.  Since almost all the affected
registers are inaccessible to user-level programs, this command is
only useful for remote debugging in its present form.

* HP-UX support

Thanks to a major code donation from Hewlett-Packard, GDB now has much
more extensive support for HP-UX.  Added features include shared
library support, kernel threads and hardware watchpoints for 11.00,
support for HP's ANSI C and C++ compilers, and a compatibility mode
for xdb and dbx commands.

* Catchpoints

HP's donation includes the new concept of catchpoints, which is a
generalization of the old catch command.  On HP-UX, it is now possible
to catch exec, fork, and vfork, as well as library loading.

This means that the existing catch command has changed; its first
argument now specifies the type of catch to be set up.  See the
output of "help catch" for a list of catchpoint types.

* Debugging across forks

On HP-UX, you can choose which process to debug when a fork() happens
in the inferior.

* TUI

HP has donated a curses-based terminal user interface (TUI).  To get
it, build with --enable-tui.  Although this can be enabled for any
configuration, at present it only works for native HP debugging.

* GDB remote protocol additions

A new protocol packet 'X' that writes binary data is now available.
Default behavior is to try 'X', then drop back to 'M' if the stub
fails to respond.  The settable variable `remotebinarydownload'
allows explicit control over the use of 'X'.

For 64-bit targets, the memory packets ('M' and 'm') can now contain a
full 64-bit address.  The command

	set remoteaddresssize 32

can be used to revert to the old behaviour.  For existing remote stubs
the change should not be noticed, as the additional address information
will be discarded.

In order to assist in debugging stubs, you may use the maintenance
command `packet' to send any text string to the stub.  For instance,

	maint packet heythere

sends the packet "$heythere#<checksum>".  Note that it is very easy to
disrupt a debugging session by sending the wrong packet at the wrong
time.

The compare-sections command allows you to compare section data on the
target to what is in the executable file without uploading or
downloading, by comparing CRC checksums.

* Tracing can collect general expressions

You may now collect general expressions at tracepoints.  This requires
further additions to the target-side stub; see tracepoint.c and
doc/agentexpr.texi for further details.

* mask-address variable for Mips

For Mips targets, you may control the zeroing of the upper 32 bits of
a 64-bit address by entering `set mask-address on'.  This is mainly
of interest to users of embedded R4xxx and R5xxx processors.

* Higher serial baud rates

GDB's serial code now allows you to specify baud rates 57600, 115200,
230400, and 460800 baud.  (Note that your host system may not be able
to achieve all of these rates.)

* i960 simulator

The i960 configuration now includes an initial implementation of a
builtin simulator, contributed by Jim Wilson.


*** Changes in GDB-4.17:

* New native configurations

Alpha GNU/Linux					alpha*-*-linux*
Unixware 2.x					i[3456]86-unixware2*
Irix 6.x					mips*-sgi-irix6*
PowerPC GNU/Linux				powerpc-*-linux*
PowerPC Solaris					powerpcle-*-solaris*
Sparc GNU/Linux					sparc-*-linux*
Motorola sysV68 R3V7.1				m68k-motorola-sysv

* New targets

Argonaut Risc Chip (ARC)			arc-*-*
Hitachi H8/300S					h8300*-*-*
Matsushita MN10200 w/simulator			mn10200-*-*
Matsushita MN10300 w/simulator			mn10300-*-*
MIPS NEC VR4100					mips64*vr4100*{,el}-*-elf*
MIPS NEC VR5000					mips64*vr5000*{,el}-*-elf*
MIPS Toshiba TX39				mips64*tx39*{,el}-*-elf*
Mitsubishi D10V w/simulator			d10v-*-*
Mitsubishi M32R/D w/simulator			m32r-*-elf*
Tsqware Sparclet				sparclet-*-*
NEC V850 w/simulator				v850-*-*

* New debugging protocols

ARM with RDI protocol				arm*-*-*
M68K with dBUG monitor				m68*-*-{aout,coff,elf}
DDB and LSI variants of PMON protocol		mips*-*-*
PowerPC with DINK32 monitor			powerpc{,le}-*-eabi
PowerPC with SDS protocol			powerpc{,le}-*-eabi
Macraigor OCD (Wiggler) devices			powerpc{,le}-*-eabi

* DWARF 2

All configurations can now understand and use the DWARF 2 debugging
format.  The choice is automatic, if the symbol file contains DWARF 2
information.

* Java frontend

GDB now includes basic Java language support.  This support is
only useful with Java compilers that produce native machine code.

* solib-absolute-prefix and solib-search-path

For SunOS and SVR4 shared libraries, you may now set the prefix for
loading absolute shared library symbol files, and the search path for
locating non-absolute shared library symbol files.

* Live range splitting

GDB can now effectively debug code for which GCC has performed live
range splitting as part of its optimization.  See gdb/doc/LRS for
more details on the expected format of the stabs information.

* Hurd support

GDB's support for the GNU Hurd, including thread debugging, has been
updated to work with current versions of the Hurd.

* ARM Thumb support

GDB's ARM target configuration now handles the ARM7T (Thumb) 16-bit
instruction set.  ARM GDB automatically detects when Thumb
instructions are in use, and adjusts disassembly and backtracing
accordingly.

* MIPS16 support

GDB's MIPS target configurations now handle the MIP16 16-bit
instruction set.

* Overlay support

GDB now includes support for overlays; if an executable has been
linked such that multiple sections are based at the same address, GDB
will decide which section to use for symbolic info.  You can choose to
control the decision manually, using overlay commands, or implement
additional target-side support and use "overlay load-target" to bring
in the overlay mapping.  Do "help overlay" for more detail.

* info symbol

The command "info symbol <address>" displays information about
the symbol at the specified address.

* Trace support

The standard remote protocol now includes an extension that allows
asynchronous collection and display of trace data.  This requires
extensive support in the target-side debugging stub.  Tracing mode
includes a new interaction mode in GDB and new commands: see the
file tracepoint.c for more details.

* MIPS simulator

Configurations for embedded MIPS now include a simulator contributed
by Cygnus Solutions.  The simulator supports the instruction sets
of most MIPS variants.

* Sparc simulator

Sparc configurations may now include the ERC32 simulator contributed
by the European Space Agency.  The simulator is not built into
Sparc targets by default; configure with --enable-sim to include it.

* set architecture

For target configurations that may include multiple variants of a
basic architecture (such as MIPS and SH), you may now set the
architecture explicitly.  "set arch" sets, "info arch" lists
the possible architectures.

*** Changes in GDB-4.16:

* New native configurations

Windows 95, x86 Windows NT			i[345]86-*-cygwin32
M68K NetBSD					m68k-*-netbsd*
PowerPC AIX 4.x					powerpc-*-aix*
PowerPC MacOS					powerpc-*-macos*
PowerPC Windows NT				powerpcle-*-cygwin32
RS/6000 AIX 4.x					rs6000-*-aix4*

* New targets

ARM with RDP protocol				arm-*-*
I960 with MON960				i960-*-coff
MIPS VxWorks					mips*-*-vxworks*
MIPS VR4300 with PMON				mips64*vr4300{,el}-*-elf*
PowerPC with PPCBUG monitor			powerpc{,le}-*-eabi*
Hitachi SH3					sh-*-*
Matra Sparclet					sparclet-*-*

* PowerPC simulator

The powerpc-eabi configuration now includes the PSIM simulator,
contributed by Andrew Cagney, with assistance from Mike Meissner.
PSIM is a very elaborate model of the PowerPC, including not only
basic instruction set execution, but also details of execution unit
performance and I/O hardware.  See sim/ppc/README for more details.

* Solaris 2.5

GDB now works with Solaris 2.5.

* Windows 95/NT native

GDB will now work as a native debugger on Windows 95 and Windows NT.
To build it from source, you must use the "gnu-win32" environment,
which uses a DLL to emulate enough of Unix to run the GNU tools.
Further information, binaries, and sources are available at
ftp.cygnus.com, under pub/gnu-win32.

* dont-repeat command

If a user-defined command includes the command `dont-repeat', then the
command will not be repeated if the user just types return.  This is
useful if the command is time-consuming to run, so that accidental
extra keystrokes don't run the same command many times.

* Send break instead of ^C

The standard remote protocol now includes an option to send a break
rather than a ^C to the target in order to interrupt it.  By default,
GDB will send ^C; to send a break, set the variable `remotebreak' to 1.

* Remote protocol timeout

The standard remote protocol includes a new variable `remotetimeout'
that allows you to set the number of seconds before GDB gives up trying
to read from the target.  The default value is 2.

* Automatic tracking of dynamic object loading (HPUX and Solaris only)

By default GDB will automatically keep track of objects as they are
loaded and unloaded by the dynamic linker.  By using the command `set
stop-on-solib-events 1' you can arrange for GDB to stop the inferior
when shared library events occur, thus allowing you to set breakpoints
in shared libraries which are explicitly loaded by the inferior.

Note this feature does not work on hpux8.  On hpux9 you must link
/usr/lib/end.o into your program.  This feature should work
automatically on hpux10.

* Irix 5.x hardware watchpoint support

Irix 5 configurations now support the use of hardware watchpoints.

* Mips protocol "SYN garbage limit"

When debugging a Mips target using the `target mips' protocol, you
may set the number of characters that GDB will ignore by setting
the `syn-garbage-limit'.  A value of -1 means that GDB will ignore
every character.  The default value is 1050.

* Recording and replaying remote debug sessions

If you set `remotelogfile' to the name of a file, gdb will write to it
a recording of a remote debug session.  This recording may then be
replayed back to gdb using "gdbreplay".  See gdbserver/README for
details.  This is useful when you have a problem with GDB while doing
remote debugging; you can make a recording of the session and send it
to someone else, who can then recreate the problem.

* Speedups for remote debugging

GDB includes speedups for downloading and stepping MIPS systems using
the IDT monitor, fast downloads to the Hitachi SH E7000 emulator,
and more efficient S-record downloading.

* Memory use reductions and statistics collection

GDB now uses less memory and reports statistics about memory usage.
Try the `maint print statistics' command, for example.

*** Changes in GDB-4.15:

* Psymtabs for XCOFF

The symbol reader for AIX GDB now uses partial symbol tables.  This
can greatly improve startup time, especially for large executables.

* Remote targets use caching

Remote targets now use a data cache to speed up communication with the
remote side.  The data cache could lead to incorrect results because
it doesn't know about volatile variables, thus making it impossible to
debug targets which use memory mapped I/O devices. `set remotecache
off' turns the data cache off.

* Remote targets may have threads

The standard remote protocol now includes support for multiple threads
in the target system, using new protocol commands 'H' and 'T'.  See
gdb/remote.c for details.

* NetROM support

If GDB is configured with `--enable-netrom', then it will include
support for the NetROM ROM emulator from XLNT Designs.  The NetROM
acts as though it is a bank of ROM on the target board, but you can
write into it over the network.  GDB's support consists only of
support for fast loading into the emulated ROM; to debug, you must use
another protocol, such as standard remote protocol.  The usual
sequence is something like

	target nrom <netrom-hostname>
	load <prog>
	target remote <netrom-hostname>:1235

* Macintosh host

GDB now includes support for the Apple Macintosh, as a host only.  It
may be run as either an MPW tool or as a standalone application, and
it can debug through the serial port.  All the usual GDB commands are
available, but to the target command, you must supply "serial" as the
device type instead of "/dev/ttyXX".  See mpw-README in the main
directory for more information on how to build.  The MPW configuration
scripts */mpw-config.in support only a few targets, and only the
mips-idt-ecoff target has been tested.

* Autoconf

GDB configuration now uses autoconf.  This is not user-visible,
but does simplify configuration and building.

* hpux10

GDB now supports hpux10.

*** Changes in GDB-4.14:

* New native configurations

x86 FreeBSD					i[345]86-*-freebsd
x86 NetBSD					i[345]86-*-netbsd
NS32k NetBSD					ns32k-*-netbsd
Sparc NetBSD					sparc-*-netbsd

* New targets

A29K VxWorks					a29k-*-vxworks
HP PA PRO embedded (WinBond W89K & Oki OP50N)	hppa*-*-pro*
CPU32 EST-300 emulator				m68*-*-est*
PowerPC ELF					powerpc-*-elf
WDC 65816					w65-*-*

* Alpha OSF/1 support for procfs

GDB now supports procfs under OSF/1-2.x and higher, which makes it
possible to attach to running processes.  As the mounting of the /proc
filesystem is optional on the Alpha, GDB automatically determines
the availability of /proc during startup.  This can lead to problems
if /proc is unmounted after GDB has been started.

* Arguments to user-defined commands

User commands may accept up to 10 arguments separated by whitespace.
Arguments are accessed within the user command via $arg0..$arg9.  A
trivial example:
define adder
  print $arg0 + $arg1 + $arg2

To execute the command use:
adder 1 2 3

Defines the command "adder" which prints the sum of its three arguments.
Note the arguments are text substitutions, so they may reference variables,
use complex expressions, or even perform inferior function calls.

* New `if' and `while' commands

This makes it possible to write more sophisticated user-defined
commands.  Both commands take a single argument, which is the
expression to evaluate, and must be followed by the commands to
execute, one per line, if the expression is nonzero, the list being
terminated by the word `end'.  The `if' command list may include an
`else' word, which causes the following commands to be executed only
if the expression is zero.

* Fortran source language mode

GDB now includes partial support for Fortran 77.  It will recognize
Fortran programs and can evaluate a subset of Fortran expressions, but
variables and functions may not be handled correctly.  GDB will work
with G77, but does not yet know much about symbols emitted by other
Fortran compilers.

* Better HPUX support

Most debugging facilities now work on dynamic executables for HPPAs
running hpux9 or later.  You can attach to running dynamically linked
processes, but by default the dynamic libraries will be read-only, so
for instance you won't be able to put breakpoints in them.  To change
that behavior do the following before running the program:

	adb -w a.out
	__dld_flags?W 0x5
	control-d

This will cause the libraries to be mapped private and read-write.
To revert to the normal behavior, do this:

	adb -w a.out
	__dld_flags?W 0x4
	control-d

You cannot set breakpoints or examine data in the library until after
the library is loaded if the function/data symbols do not have
external linkage.

GDB can now also read debug symbols produced by the HP C compiler on
HPPAs (sorry, no C++, Fortran or 68k support).

* Target byte order now dynamically selectable

You can choose which byte order to use with a target system, via the
commands "set endian big" and "set endian little", and you can see the
current setting by using "show endian".  You can also give the command
"set endian auto", in which case GDB will use the byte order
associated with the executable.  Currently, only embedded MIPS
configurations support dynamic selection of target byte order.

* New DOS host serial code

This version uses DPMI interrupts to handle buffered I/O, so you
no longer need to run asynctsr when debugging boards connected to
a PC's serial port.

*** Changes in GDB-4.13:

* New "complete" command

This lists all the possible completions for the rest of the line, if it
were to be given as a command itself.  This is intended for use by emacs.

* Trailing space optional in prompt

"set prompt" no longer adds a space for you after the prompt you set.  This
allows you to set a prompt which ends in a space or one that does not.

* Breakpoint hit counts

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

* Ability to stop printing at NULL character

"set print null-stop" will cause GDB to stop printing the characters of
an array when the first NULL is encountered.  This is useful when large
arrays actually contain only short strings.

* Shared library breakpoints

In SunOS 4.x, SVR4, and Alpha OSF/1 configurations, you can now set
breakpoints in shared libraries before the executable is run.

* Hardware watchpoints

There is a new hardware breakpoint for the watch command for sparclite
targets.  See gdb/sparclite/hw_breakpoint.note.

Hardware watchpoints are also now supported under GNU/Linux.
 
* Annotations

Annotations have been added.  These are for use with graphical interfaces,
and are still experimental.  Currently only gdba.el uses these.

* Improved Irix 5 support

GDB now works properly with Irix 5.2.

* Improved HPPA support

GDB now works properly with the latest GCC and GAS.

* New native configurations

Sequent PTX4				i[34]86-sequent-ptx4
HPPA running OSF/1			hppa*-*-osf*
Atari TT running SVR4			m68*-*-sysv4*
RS/6000 LynxOS				rs6000-*-lynxos*

* New targets

OS/9000					i[34]86-*-os9k
MIPS R4000				mips64*{,el}-*-{ecoff,elf}
Sparc64					sparc64-*-*

* Hitachi SH7000 and E7000-PC ICE support

There is now support for communicating with the Hitachi E7000-PC ICE.
This is available automatically when GDB is configured for the SH.

* Fixes

As usual, a variety of small fixes and improvements, both generic
and configuration-specific.  See the ChangeLog for more detail.

*** Changes in GDB-4.12:

* Irix 5 is now supported

* HPPA support

GDB-4.12 on the HPPA has a number of changes which make it unable
to debug the output from the currently released versions of GCC and
GAS (GCC 2.5.8 and GAS-2.2 or PAGAS-1.36).  Until the next major release
of GCC and GAS, versions of these tools designed to work with GDB-4.12
can be retrieved via anonymous ftp from jaguar.cs.utah.edu:/dist.


*** Changes in GDB-4.11:

* User visible changes:

* Remote Debugging

The "set remotedebug" option is now consistent between the mips remote
target, remote targets using the gdb-specific protocol, UDI (AMD's
debug protocol for the 29k) and the 88k bug monitor.  It is now an
integer specifying a debug level (normally 0 or 1, but 2 means more
debugging info for the mips target).

* DEC Alpha native support

GDB now works on the DEC Alpha.  GCC 2.4.5 does not produce usable
debug info, but GDB works fairly well with the DEC compiler and should
work with a future GCC release.  See the README file for a few
Alpha-specific notes.

* Preliminary thread implementation

GDB now has preliminary thread support for both SGI/Irix and LynxOS.

* LynxOS native and target support for 386

This release has been hosted on LynxOS 2.2, and also can be configured
to remotely debug programs running under LynxOS (see gdb/gdbserver/README
for details).

* Improvements in C++ mangling/demangling.

This release has much better g++ debugging, specifically in name 
mangling/demangling, virtual function calls, print virtual table,
call methods, ...etc.

*** Changes in GDB-4.10:

 * User visible changes:

Remote debugging using the GDB-specific (`target remote') protocol now
supports the `load' command.  This is only useful if you have some
other way of getting the stub to the target system, and you can put it
somewhere in memory where it won't get clobbered by the download.

Filename completion now works.

When run under emacs mode, the "info line" command now causes the
arrow to point to the line specified.  Also, "info line" prints
addresses in symbolic form (as well as hex).

All vxworks based targets now support a user settable option, called
vxworks-timeout.  This option represents the number of seconds gdb
should wait for responses to rpc's.  You might want to use this if
your vxworks target is, perhaps, a slow software simulator or happens
to be on the far side of a thin network line.

 * DEC alpha support

This release contains support for using a DEC alpha as a GDB host for
cross debugging.  Native alpha debugging is not supported yet.


*** Changes in GDB-4.9:

 * Testsuite

This is the first GDB release which is accompanied by a matching testsuite.
The testsuite requires installation of dejagnu, which should be available
via ftp from most sites that carry GNU software.

 * C++ demangling

'Cfront' style demangling has had its name changed to 'ARM' style, to
emphasize that it was written from the specifications in the C++ Annotated
Reference Manual, not necessarily to be compatible with AT&T cfront.  Despite
disclaimers, it still generated too much confusion with users attempting to
use gdb with AT&T cfront.

 * Simulators

GDB now uses a standard remote interface to a simulator library.
So far, the library contains simulators for the Zilog Z8001/2, the
Hitachi H8/300, H8/500 and Super-H.

 * New targets supported

H8/300 simulator 			h8300-hitachi-hms or h8300hms
H8/500 simulator 			h8500-hitachi-hms or h8500hms
SH simulator				sh-hitachi-hms    or sh
Z8000 simulator		  		z8k-zilog-none 	  or z8ksim
IDT MIPS board over serial line		mips-idt-ecoff

Cross-debugging to GO32 targets is supported.  It requires a custom
version of the i386-stub.c module which is integrated with the 
GO32 memory extender.

 * New remote protocols

MIPS remote debugging protocol.

 * New source languages supported

This version includes preliminary support for Chill, a Pascal like language
used by telecommunications companies.  Chill support is also being integrated
into the GNU compiler, but we don't know when it will be publically available.


*** Changes in GDB-4.8:

 * HP Precision Architecture supported

GDB now supports HP PA-RISC machines running HPUX.  A preliminary
version of this support was available as a set of patches from the
University of Utah.  GDB does not support debugging of programs
compiled with the HP compiler, because HP will not document their file
format.  Instead, you must use GCC (version 2.3.2 or later) and PA-GAS
(as available from jaguar.cs.utah.edu:/dist/pa-gas.u4.tar.Z).

Many problems in the preliminary version have been fixed.

 * Faster and better demangling

We have improved template demangling and fixed numerous bugs in the GNU style
demangler.  It can now handle type modifiers such as `static' or `const'.  Wide
character types (wchar_t) are now supported.  Demangling of each symbol is now
only done once, and is cached when the symbol table for a file is read in.
This results in a small increase in memory usage for C programs, a moderate
increase in memory usage for C++ programs, and a fantastic speedup in
symbol lookups.

`Cfront' style demangling still doesn't work with AT&T cfront.  It was written
from the specifications in the Annotated Reference Manual, which AT&T's
compiler does not actually implement.

 * G++ multiple inheritance compiler problem

In the 2.3.2 release of gcc/g++, how the compiler resolves multiple
inheritance lattices was reworked to properly discover ambiguities.  We
recently found an example which causes this new algorithm to fail in a
very subtle way, producing bad debug information for those classes.
The file 'gcc.patch' (in this directory) can be applied to gcc to
circumvent the problem.  A future GCC release will contain a complete
fix.

The previous G++ debug info problem (mentioned below for the gdb-4.7
release) is fixed in gcc version 2.3.2.

 * Improved configure script

The `configure' script will now attempt to guess your system type if
you don't supply a host system type.  The old scheme of supplying a
host system triplet is preferable over using this.  All the magic is
done in the new `config.guess' script.  Examine it for details.

We have also brought our configure script much more in line with the FSF's
version.  It now supports the --with-xxx options.  In particular,
`--with-minimal-bfd' can be used to make the GDB binary image smaller.
The resulting GDB will not be able to read arbitrary object file formats --
only the format ``expected'' to be used on the configured target system.
We hope to make this the default in a future release.

 * Documentation improvements

There's new internal documentation on how to modify GDB, and how to
produce clean changes to the code.  We implore people to read it
before submitting changes.

The GDB manual uses new, sexy Texinfo conditionals, rather than arcane
M4 macros.  The new texinfo.tex is provided in this release.  Pre-built
`info' files are also provided.  To build `info' files from scratch,
you will need the latest `makeinfo' release, which will be available in
a future texinfo-X.Y release.

*NOTE*  The new texinfo.tex can cause old versions of TeX to hang.
We're not sure exactly which versions have this problem, but it has
been seen in 3.0.  We highly recommend upgrading to TeX version 3.141
or better.  If that isn't possible, there is a patch in
`texinfo/tex3patch' that will modify `texinfo/texinfo.tex' to work
around this problem.

 * New features

GDB now supports array constants that can be used in expressions typed in by
the user.  The syntax is `{element, element, ...}'.  Ie: you can now type
`print {1, 2, 3}', and it will build up an array in memory malloc'd in
the target program.

The new directory `gdb/sparclite' contains a program that demonstrates
how the sparc-stub.c remote stub runs on a Fujitsu SPARClite processor.

 * New native hosts supported

HP/PA-RISC under HPUX using GNU tools	hppa1.1-hp-hpux
386 CPUs running SCO Unix 3.2v4		i386-unknown-sco3.2v4

 * New targets supported

AMD 29k family via UDI			a29k-amd-udi  or  udi29k

 * New file formats supported

BFD now supports reading HP/PA-RISC executables (SOM file format?),
HPUX core files, and SCO 3.2v2 core files.

 * Major bug fixes

Attaching to processes now works again; thanks for the many bug reports.

We have also stomped on a bunch of core dumps caused by
printf_filtered("%s") problems.

We eliminated a copyright problem on the rpc and ptrace header files
for VxWorks, which was discovered at the last minute during the 4.7
release.  You should now be able to build a VxWorks GDB.

You can now interrupt gdb while an attached process is running.  This
will cause the attached process to stop, and give control back to GDB.

We fixed problems caused by using too many file descriptors
for reading symbols from object files and libraries.  This was
especially a problem for programs that used many (~100) shared
libraries.

The `step' command now only enters a subroutine if there is line number
information for the subroutine.  Otherwise it acts like the `next'
command.  Previously, `step' would enter subroutines if there was
any debugging information about the routine.  This avoids problems
when using `cc -g1' on MIPS machines.

 * Internal improvements

GDB's internal interfaces have been improved to make it easier to support
debugging of multiple languages in the future.

GDB now uses a common structure for symbol information internally.
Minimal symbols (derived from linkage symbols in object files), partial
symbols (from a quick scan of debug information), and full symbols
contain a common subset of information, making it easier to write
shared code that handles any of them.

 * New command line options

We now accept --silent as an alias for --quiet.

 * Mmalloc licensing

The memory-mapped-malloc library is now licensed under the GNU Library
General Public License.

*** Changes in GDB-4.7:

 * Host/native/target split

GDB has had some major internal surgery to untangle the support for
hosts and remote targets.  Now, when you configure GDB for a remote
target, it will no longer load in all of the support for debugging
local programs on the host.  When fully completed and tested, this will
ensure that arbitrary host/target combinations are possible.

The primary conceptual shift is to separate the non-portable code in
GDB into three categories.  Host specific code is required any time GDB
is compiled on that host, regardless of the target.  Target specific
code relates to the peculiarities of the target, but can be compiled on
any host.  Native specific code is everything else:  it can only be
built when the host and target are the same system.  Child process
handling and core file support are two common `native' examples.

GDB's use of /proc for controlling Unix child processes is now cleaner.
It has been split out into a single module under the `target_ops' vector,
plus two native-dependent functions for each system that uses /proc.

 * New hosts supported

HP/Apollo 68k (under the BSD domain)	m68k-apollo-bsd  or  apollo68bsd
386 CPUs running various BSD ports	i386-unknown-bsd  or  386bsd
386 CPUs running SCO Unix		i386-unknown-scosysv322  or  i386sco

 * New targets supported

Fujitsu SPARClite 			sparclite-fujitsu-none  or  sparclite
68030 and CPU32				m68030-*-*, m68332-*-*

 * New native hosts supported

386 CPUs running various BSD ports	i386-unknown-bsd  or  386bsd
    (386bsd is not well tested yet)
386 CPUs running SCO Unix		i386-unknown-scosysv322  or  sco

 * New file formats supported

BFD now supports COFF files for the Zilog Z8000 microprocessor.  It
supports reading of `a.out.adobe' object files, which are an a.out
format extended with minimal information about multiple sections.

 * New commands

`show copying' is the same as the old `info copying'.
`show warranty' is the same as `info warrantee'.
These were renamed for consistency.  The old commands continue to work.

`info handle' is a new alias for `info signals'.

You can now define pre-command hooks, which attach arbitrary command
scripts to any command.  The commands in the hook will be executed
prior to the user's command.  You can also create a hook which will be
executed whenever the program stops.  See gdb.texinfo.

 * C++ improvements

We now deal with Cfront style name mangling, and can even extract type
info from mangled symbols.  GDB can automatically figure out which
symbol mangling style your C++ compiler uses.

Calling of methods and virtual functions has been improved as well.

 * Major bug fixes

The crash that occurred when debugging Sun Ansi-C compiled binaries is
fixed.  This was due to mishandling of the extra N_SO stabs output
by the compiler.

We also finally got Ultrix 4.2 running in house, and fixed core file
support, with help from a dozen people on the net.

John M. Farrell discovered that the reason that single-stepping was so
slow on all of the Mips based platforms (primarily SGI and DEC) was
that we were trying to demangle and lookup a symbol used for internal
purposes on every instruction that was being stepped through.  Changing
the name of that symbol so that it couldn't be mistaken for a C++
mangled symbol sped things up a great deal.

Rich Pixley sped up symbol lookups in general by getting much smarter
about when C++ symbol mangling is necessary.  This should make symbol
completion (TAB on the command line) much faster.  It's not as fast as
we'd like, but it's significantly faster than gdb-4.6.

 * AMD 29k support

A new user controllable variable 'call_scratch_address' can
specify the location of a scratch area to be used when GDB
calls a function in the target.  This is necessary because the
usual method of putting the scratch area on the stack does not work
in systems that have separate instruction and data spaces.

We integrated changes to support the 29k UDI (Universal Debugger
Interface), but discovered at the last minute that we didn't have all
of the appropriate copyright paperwork.  We are working with AMD to
resolve this, and hope to have it available soon.

 * Remote interfaces

We have sped up the remote serial line protocol, especially for targets
with lots of registers.  It now supports a new `expedited status' ('T')
message which can be used in place of the existing 'S' status message.
This allows the remote stub to send only the registers that GDB
needs to make a quick decision about single-stepping or conditional
breakpoints, eliminating the need to fetch the entire register set for
each instruction being stepped through.

The GDB remote serial protocol now implements a write-through cache for
registers, only re-reading the registers if the target has run.

There is also a new remote serial stub for SPARC processors.  You can
find it in gdb-4.7/gdb/sparc-stub.c.  This was written to support the
Fujitsu SPARClite processor, but will run on any stand-alone SPARC
processor with a serial port.

 * Configuration

Configure.in files have become much easier to read and modify.  A new
`table driven' format makes it more obvious what configurations are
supported, and what files each one uses.

 * Library changes

There is a new opcodes library which will eventually contain all of the
disassembly routines and opcode tables.  At present, it only contains
Sparc and Z8000 routines.  This will allow the assembler, debugger, and
disassembler (binutils/objdump) to share these routines.

The libiberty library is now copylefted under the GNU Library General
Public License.  This allows more liberal use, and was done so libg++
can use it.  This makes no difference to GDB, since the Library License
grants all the rights from the General Public License.

 * Documentation

The file gdb-4.7/gdb/doc/stabs.texinfo is a (relatively) complete
reference to the stabs symbol info used by the debugger.  It is (as far
as we know) the only published document on this fascinating topic.  We
encourage you to read it, compare it to the stabs information on your
system, and send improvements on the document in general (to
bug-gdb@prep.ai.mit.edu).

And, of course, many bugs have been fixed.


*** Changes in GDB-4.6:

 * Better support for C++ function names

GDB now accepts as input the "demangled form" of C++ overloaded function
names and member function names, and can do command completion on such names
(using TAB, TAB-TAB, and ESC-?).  The names have to be quoted with a pair of
single quotes.  Examples are 'func (int, long)' and 'obj::operator==(obj&)'.
Make use of command completion, it is your friend.

GDB also now accepts a variety of C++ mangled symbol formats.  They are
the GNU g++ style, the Cfront (ARM) style, and the Lucid (lcc) style.
You can tell GDB which format to use by doing a 'set demangle-style {gnu,
lucid, cfront, auto}'.  'gnu' is the default.  Do a 'set demangle-style foo'
for the list of formats.

 * G++ symbol mangling problem

Recent versions of gcc have a bug in how they emit debugging information for
C++ methods (when using dbx-style stabs).  The file 'gcc.patch' (in this
directory) can be applied to gcc to fix the problem.  Alternatively, if you
can't fix gcc, you can #define GCC_MANGLE_BUG when compiling gdb/symtab.c. The
usual symptom is difficulty with setting breakpoints on methods.  GDB complains
about the method being non-existent.  (We believe that version 2.2.2 of GCC has
this problem.)

 * New 'maintenance' command

All of the commands related to hacking GDB internals have been moved out of
the main command set, and now live behind the 'maintenance' command.  This
can also be abbreviated as 'mt'.  The following changes were made:

	dump-me ->		maintenance dump-me
	info all-breakpoints ->	maintenance info breakpoints
	printmsyms ->		maintenance print msyms
	printobjfiles ->	maintenance print objfiles
	printpsyms ->		maintenance print psymbols
	printsyms ->		maintenance print symbols

The following commands are new:

	maintenance demangle	Call internal GDB demangler routine to
				demangle a C++ link name and prints the result.
	maintenance print type	Print a type chain for a given symbol

 * Change to .gdbinit file processing

We now read the $HOME/.gdbinit file before processing the argv arguments
(e.g. reading symbol files or core files).  This allows global parameters to
be set, which will apply during the symbol reading.  The ./.gdbinit is still
read after argv processing.

 * New hosts supported

Solaris-2.0 !!!				sparc-sun-solaris2  or  sun4sol2

GNU/Linux support			i386-unknown-linux  or  linux

We are also including code to support the HP/PA running BSD and HPUX.  This
is almost guaranteed not to work, as we didn't have time to test or build it
for this release.  We are including it so that the more adventurous (or
masochistic) of you can play with it.  We also had major problems with the
fact that the compiler that we got from HP doesn't support the -g option.
It costs extra.

 * New targets supported

Hitachi H8/300				h8300-hitachi-hms  or  h8300hms

 * More smarts about finding #include files

GDB now remembers the compilation directory for all include files, and for
all files from which C is generated (like yacc and lex sources).  This
greatly improves GDB's ability to find yacc/lex sources, and include files,
especially if you are debugging your program from a directory different from
the one that contains your sources.

We also fixed a bug which caused difficulty with listing and setting
breakpoints in include files which contain C code.  (In the past, you had to
try twice in order to list an include file that you hadn't looked at before.)

 * Interesting infernals change

GDB now deals with arbitrary numbers of sections, where the symbols for each
section must be relocated relative to that section's landing place in the
target's address space.  This work was needed to support ELF with embedded
stabs used by Solaris-2.0.

 * Bug fixes (of course!)

There have been loads of fixes for the following things:
	mips, rs6000, 29k/udi, m68k, g++, type handling, elf/dwarf, m88k,
	i960, stabs, DOS(GO32), procfs, etc...

See the ChangeLog for details.

*** Changes in GDB-4.5:

 * New machines supported (host and target)

IBM RS6000 running AIX			rs6000-ibm-aix	or rs6000

SGI Irix-4.x				mips-sgi-irix4	or iris4

 * New malloc package

GDB now uses a new memory manager called mmalloc, based on gmalloc.
Mmalloc is capable of handling multiple heaps of memory.  It is also
capable of saving a heap to a file, and then mapping it back in later.
This can be used to greatly speedup the startup of GDB by using a
pre-parsed symbol table which lives in a mmalloc managed heap.  For
more details, please read mmalloc/mmalloc.texi.

 * info proc

The 'info proc' command (SVR4 only) has been enhanced quite a bit.  See
'help info proc' for details.

 * MIPS ecoff symbol table format

The code that reads MIPS symbol table format is now supported on all hosts.
Thanks to MIPS for releasing the sym.h and symconst.h files to make this
possible.

 * File name changes for MS-DOS

Many files in the config directories have been renamed to make it easier to
support GDB on MS-DOSe systems (which have very restrictive file name
conventions :-( ).  MS-DOSe host support (under DJ Delorie's GO32
environment) is close to working but has some remaining problems.  Note
that debugging of DOS programs is not supported, due to limitations
in the ``operating system'', but it can be used to host cross-debugging.

 * Cross byte order fixes

Many fixes have been made to support cross debugging of Sparc and MIPS
targets from hosts whose byte order differs.

 * New -mapped and -readnow options

If memory-mapped files are available on your system through the 'mmap'
system call, you can use the -mapped option on the `file' or
`symbol-file' commands to cause GDB to write the symbols from your
program into a reusable file.  If the program you are debugging is
called `/path/fred', the mapped symbol file will be `./fred.syms'.
Future GDB debugging sessions will notice the presence of this file,
and will quickly map in symbol information from it, rather than reading
the symbol table from the executable program.  Using the '-mapped'
option in a GDB `file' or `symbol-file' command has the same effect as
starting GDB with the '-mapped' command-line option.

You can cause GDB to read the entire symbol table immediately by using
the '-readnow' option with any of the commands that load symbol table
information (or on the GDB command line).  This makes the command
slower, but makes future operations faster.

The -mapped and -readnow options are typically combined in order to
build a `fred.syms' file that contains complete symbol information.
A simple GDB invocation to do nothing but build a `.syms' file for future
use is:

	gdb -batch -nx -mapped -readnow programname

The `.syms' file is specific to the host machine on which GDB is run.
It holds an exact image of GDB's internal symbol table.  It cannot be
shared across multiple host platforms.

 * longjmp() handling

GDB is now capable of stepping and nexting over longjmp(), _longjmp(), and
siglongjmp() without losing control.  This feature has not yet been ported to
all systems.  It currently works on many 386 platforms, all MIPS-based
platforms (SGI, DECstation, etc), and Sun3/4.

 * Solaris 2.0

Preliminary work has been put in to support the new Solaris OS from Sun.  At
this time, it can control and debug processes, but it is not capable of
reading symbols.

 * Bug fixes

As always, many many bug fixes.  The major areas were with g++, and mipsread.
People using the MIPS-based platforms should experience fewer mysterious
crashes and trashed symbol tables.

*** Changes in GDB-4.4:

 * New machines supported (host and target)

SCO Unix on i386 IBM PC clones		i386-sco-sysv	or  i386sco
	(except core files)
BSD Reno on Vax				vax-dec-bsd
Ultrix on Vax				vax-dec-ultrix

 * New machines supported (target)

AMD 29000 embedded, using EBMON		a29k-none-none

 * C++ support

GDB continues to improve its handling of C++.  `References' work better.
The demangler has also been improved, and now deals with symbols mangled as
per the Annotated C++ Reference Guide.

GDB also now handles `stabs' symbol information embedded in MIPS
`ecoff' symbol tables.  Since the ecoff format was not easily
extensible to handle new languages such as C++, this appeared to be a
good way to put C++ debugging info into MIPS binaries.  This option
will be supported in the GNU C compiler, version 2, when it is
released.

 * New features for SVR4

GDB now handles SVR4 shared libraries, in the same fashion as SunOS
shared libraries.  Debugging dynamically linked programs should present
only minor differences from debugging statically linked programs.

The `info proc' command will print out information about any process
on an SVR4 system (including the one you are debugging).  At the moment,
it prints the address mappings of the process.

If you bring up GDB on another SVR4 system, please send mail to
bug-gdb@prep.ai.mit.edu to let us know what changes were reqired (if any).

 * Better dynamic linking support in SunOS

Reading symbols from shared libraries which contain debugging symbols
now works properly.  However, there remain issues such as automatic
skipping of `transfer vector' code during function calls, which
make it harder to debug code in a shared library, than to debug the
same code linked statically.

 * New Getopt

GDB is now using the latest `getopt' routines from the FSF.  This
version accepts the -- prefix for options with long names.  GDB will
continue to accept the old forms (-option and +option) as well.
Various single letter abbreviations for options have been explicity
added to the option table so that they won't get overshadowed in the
future by other options that begin with the same letter.

 * Bugs fixed

The `cleanup_undefined_types' bug that many of you noticed has been squashed.
Many assorted bugs have been handled.  Many more remain to be handled.
See the various ChangeLog files (primarily in gdb and bfd) for details.


*** Changes in GDB-4.3:

 * New machines supported (host and target)

Amiga 3000 running Amix			m68k-cbm-svr4	or  amix
NCR 3000 386 running SVR4		i386-ncr-svr4	or  ncr3000
Motorola Delta 88000 running Sys V	m88k-motorola-sysv  or  delta88

 * Almost SCO Unix support

We had hoped to support:
SCO Unix on i386 IBM PC clones		i386-sco-sysv	or  i386sco
(except for core file support), but we discovered very late in the release
that it has problems with process groups that render gdb unusable.  Sorry
about that.  I encourage people to fix it and post the fixes.

 * Preliminary ELF and DWARF support

GDB can read ELF object files on System V Release 4, and can handle
debugging records for C, in DWARF format, in ELF files.  This support
is preliminary.  If you bring up GDB on another SVR4 system, please
send mail to bug-gdb@prep.ai.mit.edu to let us know what changes were
reqired (if any).

 * New Readline

GDB now uses the latest `readline' library.  One user-visible change
is that two tabs will list possible command completions, which previously
required typing M-? (meta-question mark, or ESC ?).

 * Bugs fixed

The `stepi' bug that many of you noticed has been squashed.
Many bugs in C++ have been handled.  Many more remain to be handled.
See the various ChangeLog files (primarily in gdb and bfd) for details.

 * State of the MIPS world (in case you wondered):

GDB can understand the symbol tables emitted by the compilers
supplied by most vendors of MIPS-based machines, including DEC.  These
symbol tables are in a format that essentially nobody else uses.

Some versions of gcc come with an assembler post-processor called
mips-tfile.  This program is required if you want to do source-level
debugging of gcc-compiled programs.  I believe FSF does not ship
mips-tfile with gcc version 1, but it will eventually come with gcc
version 2.

Debugging of g++ output remains a problem.  g++ version 1.xx does not
really support it at all.  (If you're lucky, you should be able to get
line numbers and stack traces to work, but no parameters or local
variables.)  With some work it should be possible to improve the
situation somewhat.

When gcc version 2 is released, you will have somewhat better luck.
However, even then you will get confusing results for inheritance and
methods.

We will eventually provide full debugging of g++ output on
DECstations.  This will probably involve some kind of stabs-in-ecoff
encapulation, but the details have not been worked out yet.


*** Changes in GDB-4.2:

 *  Improved configuration

Only one copy of `configure' exists now, and it is not self-modifying.
Porting BFD is simpler.  

 *  Stepping improved

The `step' and `next' commands now only stop at the first instruction
of a source line.  This prevents the multiple stops that used to occur
in switch statements, for-loops, etc.  `Step' continues to stop if a
function that has debugging information is called within the line.

 *  Bug fixing

Lots of small bugs fixed.  More remain.

 *  New host supported (not target)

Intel 386 PC clone running Mach		i386-none-mach


*** Changes in GDB-4.1:

 *  Multiple source language support

GDB now has internal scaffolding to handle several source languages.
It determines the type of each source file from its filename extension,
and will switch expression parsing and number formatting to match the
language of the function in the currently selected stack frame.
You can also specifically set the language to be used, with
`set language c' or `set language modula-2'.

 *  GDB and Modula-2

GDB now has preliminary support for the GNU Modula-2 compiler,
currently under development at the State University of New York at
Buffalo.  Development of both GDB and the GNU Modula-2 compiler will
continue through the fall of 1991 and into 1992.

Other Modula-2 compilers are currently not supported, and attempting to
debug programs compiled with them will likely result in an error as the
symbol table is read.  Feel free to work on it, though!

There are hooks in GDB for strict type checking and range checking,
in the `Modula-2 philosophy', but they do not currently work.

 * set write on/off

GDB can now write to executable and core files (e.g. patch
a variable's value).   You must turn this switch on, specify
the file ("exec foo" or "core foo"), *then* modify it, e.g.
by assigning a new value to a variable.  Modifications take
effect immediately.

 * Automatic SunOS shared library reading

When you run your program, GDB automatically determines where its
shared libraries (if any) have been loaded, and reads their symbols.
The `share' command is no longer needed.  This also works when
examining core files.

 * set listsize

You can specify the number of lines that the `list' command shows.
The default is 10.

 * New machines supported (host and target)

SGI Iris (MIPS) running Irix V3:  	mips-sgi-irix   or  iris
Sony NEWS (68K) running NEWSOS 3.x:	m68k-sony-sysv	or  news
Ultracomputer (29K) running Sym1:	a29k-nyu-sym1	or  ultra3

 * New hosts supported (not targets)

IBM RT/PC:				romp-ibm-aix 	or  rtpc

 * New targets supported (not hosts)

AMD 29000 embedded with COFF		a29k-none-coff
AMD 29000 embedded with a.out		a29k-none-aout
Ultracomputer remote kernel debug	a29k-nyu-kern

 * New remote interfaces

AMD 29000 Adapt
AMD 29000 Minimon


*** Changes in GDB-4.0:

 *  New Facilities

Wide output is wrapped at good places to make the output more readable.

Gdb now supports cross-debugging from a host machine of one type to a
target machine of another type.  Communication with the target system
is over serial lines.  The ``target'' command handles connecting to the
remote system; the ``load'' command will download a program into the
remote system.  Serial stubs for the m68k and i386 are provided.  Gdb
also supports debugging of realtime processes running under VxWorks,
using SunRPC Remote Procedure Calls over TCP/IP to talk to a debugger
stub on the target system.

New CPUs supported include the AMD 29000 and Intel 960.

GDB now reads object files and symbol tables via a ``binary file'' 
library, which allows a single copy of GDB to debug programs of multiple
object file types such as a.out and coff.

There is now a GDB reference card in "doc/refcard.tex".  (Make targets
refcard.dvi and refcard.ps are available to format it).


 *  Control-Variable user interface simplified

All variables that control the operation of the debugger can be set
by the ``set'' command, and displayed by the ``show'' command.

For example, ``set prompt new-gdb=>'' will change your prompt to new-gdb=>.
``Show prompt'' produces the response:
Gdb's prompt is new-gdb=>.

What follows are the NEW set commands.  The command ``help set'' will
print a complete list of old and new set commands.  ``help set FOO''
will give a longer description of the variable FOO.  ``show'' will show
all of the variable descriptions and their current settings.

confirm on/off:  Enables warning questions for operations that are
		 hard to recover from, e.g. rerunning the program while
		 it is already running.  Default is ON.

editing on/off:  Enables EMACS style command line editing 
                 of input.  Previous lines can be recalled with 
		 control-P, the current line can be edited with control-B,
		 you can search for commands with control-R, etc.
		 Default is ON.

history filename NAME:  NAME is where the gdb command history 
			will be stored.  The default is .gdb_history,
			or the value of the environment variable
			GDBHISTFILE.

history size N:  The size, in commands, of the command history.  The 
		 default is 256, or the value of the environment variable
		 HISTSIZE.

history save on/off: If this value is set to ON, the history file will
		      be saved after exiting gdb.  If set to OFF, the 
		      file will not be saved.  The default is OFF.

history expansion on/off: If this value is set to ON, then csh-like 
			  history expansion will be performed  on 
			  command line input.  The default is OFF.

radix N:  Sets the default radix for input and output.  It can be set
	  to 8, 10, or 16.  Note that the argument to "radix" is interpreted
	  in the current radix, so "set radix 10" is always a no-op.

height N: This integer value is the number of lines on a page. Default
          is 24, the current `stty rows'' setting, or the ``li#''
	  setting from the termcap entry matching the environment
	  variable TERM.

width N:  This integer value is the number of characters on a line.
	  Default is 80, the current `stty cols'' setting, or the ``co#''
	  setting from the termcap entry matching the environment
	  variable TERM.

Note: ``set screensize'' is obsolete. Use ``set height'' and
``set width'' instead.

print address on/off:  Print memory addresses in various command displays,
		      such as stack traces and structure values.  Gdb looks
		      more ``symbolic'' if you turn this off; it looks more
		      ``machine level'' with it on.  Default is ON.

print array on/off:  Prettyprint arrays.  New convenient format!  Default 
                    is OFF.

print demangle on/off:   Print C++ symbols in "source" form if on,
			"raw" form if off.

print asm-demangle on/off:  Same, for assembler level printouts
			like instructions.

print vtbl on/off:  Prettyprint C++ virtual function tables.  Default is OFF.


 *  Support for Epoch Environment.

The epoch environment is a version of Emacs v18 with windowing.  One
new command, ``inspect'', is identical to ``print'', except that if you
are running in the epoch environment, the value is printed in its own
window.


 *  Support for Shared Libraries

GDB can now debug programs and core files that use SunOS shared libraries.
Symbols from a shared library cannot be referenced
before the shared library has been linked with the program (this
happens after you type ``run'' and before the function main() is entered).
At any time after this linking (including when examining core files
from dynamically linked programs), gdb reads the symbols from each
shared library when you type the ``sharedlibrary'' command.
It can be abbreviated ``share''.

sharedlibrary REGEXP:  Load shared object library symbols for files 
                       matching a unix regular expression.  No argument
		       indicates to load symbols for all shared libraries.

info sharedlibrary:  Status of loaded shared libraries.


 *  Watchpoints

A watchpoint stops execution of a program whenever the value of an
expression changes.  Checking for this slows down execution
tremendously whenever you are in the scope of the expression, but is
quite useful for catching tough ``bit-spreader'' or pointer misuse
problems.  Some machines such as the 386 have hardware for doing this
more quickly, and future versions of gdb will use this hardware.

watch EXP:  Set a watchpoint (breakpoint) for an expression.

info watchpoints:  Information about your watchpoints.

delete N:   Deletes watchpoint number N (same as breakpoints).
disable N:  Temporarily turns off watchpoint number N (same as breakpoints).
enable N:   Re-enables watchpoint number N (same as breakpoints).


 *  C++ multiple inheritance

When used with a GCC version 2 compiler, GDB supports multiple inheritance
for C++ programs.

 *  C++ exception handling

Gdb now supports limited C++ exception handling.  Besides the existing
ability to breakpoint on an exception handler, gdb can breakpoint on
the raising of an exception (before the stack is peeled back to the
handler's context).

catch FOO:  If there is a FOO exception handler in the dynamic scope,
	    set a breakpoint to catch exceptions which may be raised there.
	    Multiple exceptions (``catch foo bar baz'') may be caught.

info catch:  Lists all exceptions which may be caught in the
             current stack frame.


 *  Minor command changes

The command ``call func (arg, arg, ...)'' now acts like the print
command, except it does not print or save a value if the function's result
is void.  This is similar to dbx usage.

The ``up'' and ``down'' commands now always print the frame they end up
at; ``up-silently'' and `down-silently'' can be used in scripts to change
frames without printing.

 *  New directory command

'dir' now adds directories to the FRONT of the source search path.
The path starts off empty.  Source files that contain debug information
about the directory in which they were compiled can be found even
with an empty path; Sun CC and GCC include this information.  If GDB can't
find your source file in the current directory, type "dir .".

 * Configuring GDB for compilation

For normal use, type ``./configure host''.  See README or gdb.texinfo
for more details.

GDB now handles cross debugging.  If you are remotely debugging between 
two different machines, type ``./configure host -target=targ''.
Host is the machine where GDB will run; targ is the machine
where the program that you are debugging will run.
