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

*** Changes since GDB 17

* Support for .gdb_index sections with version less than 7 has been
  removed.

* GDB now accepts --no-escape-args as an alternative to --args on the
  command line.  GDB will not escape special shell characters within
  arguments after --no-escape-args.

* gdbserver now accepts --no-escape-args as a command line flag.  When
  this flag is used gdbserver will not escape special shell characters
  within the inferior arguments.

* The add-inferior, clone-inferior, and MI -add-inferior commands will
  now give a warning, and create the new inferior without a
  connection, when the current inferior's connection, at the time the
  command is given, is unshareable.  For example, the core-file target
  cannot be shared between inferiors, nor can the Window native
  target.  These targets could never really be shared.  Attempting to
  share them would usually lead to GDB crashing.  GDB now prevents
  this invalid sharing.

* When connecting to a remote server, if the server supports the new
  qExecAndArgs packet, then GDB will copy the argument string from the
  server and update the 'args' setting, as if 'set args ...'  had been
  used.  This means that the arguments are visible from GDB using
  'show args', and that, if using the extended-remote protocol,
  subsequent runs of the inferior will use the same arguments as the
  first run.

* Support for stabs debug information has been removed.

* Support for the binary file format dbx has been removed.

* When connected to an extended-remote target GDB can now
  automatically set the 'remote exec-file' in some cases.  GDB will
  auto set the remote exec-file only if the remote wasn't started with
  an executable, and the user hasn't used 'set remote exec-file' to
  set an executable.  GDB will auto set the remote exec-file using the
  current executable if the current executable has a 'target:' prefix,
  or if the current executable is within the sysroot.

* GDB now adds all type symbols to the .gdb_index section.  The index
  version number has not increased as a consequence of this change.
  This fixes an issue where GDB could fail to find a type when relying
  on the index.  Any existing indexes should be regenerated.
* Support for Floating Point Mode Register (FPMR) in AArch64.

* New targets

GNU/Linux/MicroBlaze (gdbserver) microblazeel-*linux*

* New commands

maintenance test-remote-args ARGS
  Test splitting and joining of inferior arguments ARGS as they would
  be split and joined when being passed to a remote target.

* Changed commands

maintenance info program-spaces
  This command no longer displays the core file name.

info inferiors
  If an inferior has a core file loaded, then this will be displayed
  as an additional line under the inferior's table entry in the
  output.

New command class for help
  The new command class "essential" has been added, which is a set of
  commands that we, as developers, believe would be close to a minimal
  set of commands for a new user of GDB.

* Changed remote packets

single-inf-arg in qSupported
  The new single-inf-arg feature within the qSupported packet allows
  GDB to inform the stub that it would like to send the inferior
  arguments as a single string within the vRun packet.  The stub can
  reply with the single-inf-arg feature to indicate that it is able to
  accept arguments as a single string.

* New remote packets

qExecAndArgs
  This packet returns the executable filename and argument string with
  which the server was started.  If no such information was given to
  the server then this is reflected in the reply.

* Python API

  ** New class gdb.Style for representing styles, a collection of
     foreground and background gdb.Color objects, and an intensity.

  ** New constants gdb.INTENSITY_NORMAL, gdb.INTENSITY_BOLD, and
     gdb.INTENSITY_DIM for use with gdb.Style when representing
     intensities.

  ** New gdb.StyleParameterSet for creating custom style settings.
     Use gdb.StyleParameterSet(NAME) to create 'set style NAME ...'
     and 'show style NAME ...' parameters.

  ** The gdb.write() function now takes an additional, optional,
     'style' argument, which can be used to style the output.

  ** New gdb.Corefile class which represents a loaded core file.  This
     has an attribute Corefile.filename, the file name of the loaded
     core file, and a method Corefile.is_valid(), which returns False
     when a Corefile object becomes invalid (e.g. when the core file
     is unloaded).  There is also Corefile.mapped_files() which
     returns a list of CorefileMappedFile objects, representing files
     that were mapped into the core file when it was created.

  ** New gdb.CorefileMappedFile type representing a file that was
     mapped when the core file was created.  Has read-only attributes
     filename (string), build_id (string), is_main_executable
     (boolean), and regions (list of CorefileMappedFileRegion objects).

  ** New gdb.CorefileMappedFileRegion type, which represents a mapped
     region of a file (see gdb.CorefileMappedFile above).  Has
     read-only attributes start, end, and file_offset.

  ** New Inferior.corefile attribute.  This read only attribute
     contains the gdb.Corefile object if a core file is loaded into
     the inferior, otherwise, this contains None.

*** Changes in GDB 17

* Debugging Linux programs that use x86-64 or x86-64 with 32-bit pointer
  size (X32) Shadow Stacks are now supported.

* Support for the shadow stack pointer register on x86-64 or x86-64 with
  32-bit pointer size (X32) GNU/Linux.

* Debugger Adapter Protocol changes

  ** GDB now supports the "completions" request.

* "set style" commands now supports numeric format for basic colors
  from 0 to 255 and #RRGGBB format for TrueColor.

* New built-in convenience variable $_colorsupport provides comma-separated
  list of color space names supported by terminal.  Each color space name is one
  of monochrome, ansi_8color, aixterm_16color, xterm_256color or rgb_24bit.
  It is handy for conditionally using styling colors based on terminal features.
  For example:

  (gdb) if $_regex ($_colorsupport, ".*(^|,)rgb_24bit($|,).*")
   >set style filename background #FACADE
   >else
   >if $_regex ($_colorsupport, ".*(^|,)xterm_256color($|,).*")
    >set style filename background 224
    >else
    >set style filename background red
    >end
   >end

* UST (static tracepoint) support from gdbserver has been removed.

* Linux checkpoint code has been updated to work with multiple inferiors.

* The gcore and gdb-add-index scripts now have a -v or --version
  option, which prints the version number, and then exits.  As well as
  a -h or --help option, which prints each options and a brief
  description.

* The gcore script now has a -g option that lets you specify the GDB
  binary invoked by gcore.

* On systems that support linker namespaces, the output of the command
  "info sharedlibraries" may add one more column, NS, which identifies the
  namespace into which the library was loaded, if more than one namespace
  is active.

* New built-in convenience variables $linker_namespace_count and
  $_linker_namespace.  These show the number of active linker
  namespaces, and the namespace to which the current location belongs to.
  In systems that don't support linker namespaces, or if the inferior hasn't
  started yet, these always return the integer 0.

* The 'org.gnu.gdb.i386.linux' target description feature can now
  contain three additional registers which provide access to the TLS
  related GDT entries on i386 (and x86-64 when compiling with -m32).

* Add record full support for rv64gc architectures

* Debugging Linux programs that use AArch64 Guarded Control Stacks is now
  supported.

* New "--binary-output" command line option instructs GDB to set the
  translation mode of its stdout/stderr to binary mode.  This disables
  Line Feed translation.  MS-Windows only.

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

* New commands

maintenance check psymtabs
  Renamed from maintenance check-psymtabs

maintenance check symtabs
  Renamed from maintenance check-symtabs

maintenance canonicalize
  Show the canonical form of a C++ name.

set riscv numeric-register-names on|off
show riscv numeric-register-names
  Controls whether GDB refers to risc-v registers by their numeric names
  (e.g 'x1') or their abi names (e.g. 'ra').
  Defaults to 'off', matching the old behaviour (abi names).

set style emoji on|off|auto
show style emoji
  Controls whether GDB can display emoji.  The default is "auto",
  which means emoji will be displayed in some situations when
  the host charset is UTF-8.

set style warning-prefix STRING
set style error-prefix STRING
  These commands control the prefix that is printed before warnings
  and errors, respectively.  This functionality is intended for use
  with emoji display, and so the prefixes are only displayed if emoji
  styling is enabled.

info linker-namespaces
info linker-namespaces [[N]]
  Print information about the given linker namespace (identified as N),
  or about all the namespaces if no argument is given.

* Changed commands

info sharedlibrary
  On Linux and FreeBSD, the addresses shown in the output of this
  command are now for the full memory range allocated to the shared
  library.

info threads [-gid] [-stopped] [-running] [ID]...
  If no threads match the given ID(s) or filter options, GDB now prints

    No threads matched.

  without printing the provided arguments.  The newly added '-stopped'
  option makes GDB list the stopped threads only.  Similarly,
  '-running' makes GDB list the running threads only.  If both options
  are given together, both stopped and running threads are listed.
  These new flags can be useful to get a reduced list when there is a
  large number of threads.

* GDB-internal Thread Local Storage (TLS) support

  ** Linux targets for the x86_64, aarch64, ppc64, s390x, and riscv
     architectures now have GDB-internal support for TLS address
     lookup in addition to that traditionally provided by the
     libthread_db library.  This internal support works for programs
     linked against either the GLIBC or MUSL C libraries.  For
     programs linked against MUSL, this new internal support provides
     new debug functionality, allowing access to TLS variables, due to
     the fact that MUSL does not implement the libthread_db library.
     Internal TLS support is also useful in cross-debugging
     situations, debugging statically linked binaries, and debugging
     programs linked against GLIBC 2.33 and earlier, but which are not
     linked against libpthread.

  ** The command 'maint set force-internal-tls-address-lookup on' may
     be used to force the internal TLS lookup mechanisms to be used.
     Otherwise, TLS lookup via libthread_db will still be preferred,
     when available.

* Python API

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

  ** New class gdb.Color for dealing with colors.

  ** New constant gdb.PARAM_COLOR represents color type of a
     gdb.Parameter.value.  Parameter's value is gdb.Color instance.

  ** The memory_source argument (the second argument) has been removed
     from gdb.disassembler.builtin_disassemble.  This argument was
     never used by GDB, and was added by mistake.  The unused argument
     was never documented in the GDB manual, so users should not have
     been using it.

  ** gdb.execute has an additional 'styling' argument.  When True, then
     output will be styled.  The default for this argument is True
     when output is going to standard output, and False when output is
     going to a string.

  ** Setting the documentation string (__doc__) of a gdb.Parameter
     sub-class to the empty string, means GDB will only display the
     set_doc or show_doc strings in the set/show help output.

  ** New gdb.ParameterPrefix class.  This can be used to create 'set'
     and 'show' gdb.Command prefixes, suitable for use with new
     gdb.Parameters.

  ** Prefix commands (gdb.Command sub-classes) that don't have an
     invoke method will now behave like builtin prefix commands when
     invoked without a sub-command name.  This means printing the help
     text for all sub-commands, unless the prefix command is a 'show'
     command, in which case the value of all sub-commands is printed.

  ** New gdb.warning() function that takes a string and prints it as a
     warning, with GDB's standard 'warning' prefix.

  ** New attribute gdb.Value.is_unavailable, this checks for
     unavailability like gdb.Value.is_optimized_out checks for
     optimized out values.

* Guile API

  ** New type <gdb:color> for dealing with colors.

  ** New constant PARAM_COLOR represents color type of a value
     of a <gdb:parameter> object.  Parameter's value is <gdb::color> instance.

  ** Eliding the #:doc string from make-parameter now means that GDB
     will use a default documentation string.  Setting #:doc to the
     empty string for make-parameter means GDB will only display the
     #:set_doc or #:show_doc strings in the set/show help output.

  ** Prefix commands (using make-command) that don't have a #:invoke
     property will now behave like builtin prefix commands when
     invoked without a sub-command name.  This means printing the help
     text for all sub-commands, unless the prefix command is a 'show'
     command, in which case the value of all sub-commands is printed.

* New remote packets

binary-upload in qSupported reply
  If the stub sends back 'binary-upload+' in it's qSupported reply,
  then GDB will, where possible, make use of the 'x' packet.  If the
  stub doesn't report this feature supported, then GDB will not use
  the 'x' packet.

vFile:lstat
  Return information about files on the remote system.  Like
  vFile:stat but if the filename is a symbolic link, return
  information about the link itself, the file the link refers to.

* Changed remote packets

qXfer:threads:read
  The XML that is sent as a response can now include an "id_str"
  attribute for a thread element.  The attribute indicates what GDB
  should print as the target ID of the thread, for example in the
  "info threads" command or when switching to the thread.

vFile:stat
  Previously, gdbserver incorrectly implemented this packet using
  lstat rather than stat.  This has now been corrected.  The
  documentation has also been clarified.

* MI changes

** The =library-unloaded event now includes the 'ranges' field, which
   has the same meaning as for the =library-loaded event.

** The =library-unloaded event now includes the 'still-in-use' field.
   This field is 'true' when a library is unloaded (removed from the
   inferior's list of loaded libraries), but the mapping within the
   inferior's address space is retained, as the library was mapped
   multiple times, and the same mapping was being reused.  In all
   other cases, this field will have the value 'false'.

* Support for stabs debugging format and the a.out/dbx object format is
  deprecated, and will be removed in GDB 18.

* Configure changes

--enable-binary-file-formats=[FORMAT,...]
--enable-binary-file-formats=all
  A user can now decide to only compile support for certain file formats.
  The available formats at this point are: dbx, coff, xcoff, elf, mach-o
  and mips.  Some targets require specific file formats to be available,
  and in such cases, the configure script will warn the user and add
  support anyway.  By default, all formats will be compiled in, to
  continue the behavior from before adding the switch.

* A new configure option was added, allowing support for the compile
  subsystem to be disabled at configure time, in the form of
  --disable-gdb-compile.

* A new configure option was added, allowing support for DWARF debug
  information to be disabled at configure time.  The flag is
  --disable-gdb-dwarf-support.

* A new configure option was added, allowing support for mdebug/ecoff
  debug information to be disabled at configure time.  The flag to do
  that is --disable-gdb-mdebug-support.

* The Alpha target now supports target descriptions.

*** Changes in GDB 16

* Support for Nios II targets has been removed as this architecture
  has been EOL'ed by Intel.

* GDB now supports watchpoints for tagged data pointers (see
  https://en.wikipedia.org/wiki/Tagged_pointer) on amd64, such as the
  one used by the Linear Address Masking (LAM) feature provided by
  Intel.

* Debugging support for Intel MPX has been removed.  This includes the
  removal of
  ** MPX register support
  ** the commands "show/set mpx bound" (deprecated since GDB 15)
  ** i386 and amd64 implementation of the hooks report_signal_info and
     get_siginfo_type.

* GDB now supports printing of asynchronous events from the Intel Processor
  Trace during 'record instruction-history', 'record function-call-history'
  and all stepping commands.  This can be controlled with the new
  "set record btrace pt event-tracing" command.

* GDB now supports printing of ptwrite payloads from the Intel Processor
  Trace during 'record instruction-history', 'record function-call-history'
  and all stepping commands.  The payload is also accessible in Python as a
  RecordAuxiliary object.  Printing is customizable via a ptwrite filter
  function in Python.  By default, the raw ptwrite payload is printed for
  each ptwrite that is encountered.

* For breakpoints that are created in the 'pending' state, any
  'thread' or 'task' keywords are parsed at the time the breakpoint is
  created, rather than at the time the breakpoint becomes non-pending.

* Thread-specific breakpoints are only inserted into the program space
  in which the thread of interest is running.  In most cases program
  spaces are unique for each inferior, so this means that
  thread-specific breakpoints will usually only be inserted for the
  inferior containing the thread of interest.  The breakpoint will
  be hit no less than before.

* For ARM targets, the offset of the pc in the jmp_buf has been fixed to match
  glibc 2.20 and later.  This should only matter when not using libc probes.
  This may cause breakage when using an incompatible libc, like uclibc or
  newlib, or an older glibc.

* MTE (Memory Tagging Extension) debugging is now supported on AArch64 baremetal
  targets.

* Remove support (native and remote) for QNX Neutrino (triplet
  `i[3456]86-*-nto*`).

* In a record session, when a forward emulation reaches the end of the reverse
  history, the warning message has been changed to indicate that the end of the
  history has been reached.  It also specifies that the forward execution can
  continue, and the recording will also continue.

* The Ada 'Object_Size attribute is now supported.

* Support for process record/replay and reverse debugging on loongarch*-linux*
  targets has been added.

* New bash script gstack uses GDB to print stack traces of running processes.

* Python API

  ** Added gdb.record.clear.  Clears the trace data of the current recording.
     This forces re-decoding of the trace for successive commands.

  ** Added the new event source gdb.tui_enabled.

  ** New module gdb.missing_objfile that facilitates dealing with
     missing objfiles when opening a core-file.

  ** New function gdb.missing_objfile.register_handler that can
     register an instance of a sub-class of
     gdb.missing_debug.MissingObjfileHandler as a handler for missing
     objfiles.

  ** New class gdb.missing_objfile.MissingObjfileHandler which can be
     sub-classed to create handlers for missing objfiles.

  ** The 'signed' argument to gdb.Architecture.integer_type() will no
     longer accept non-bool types.

  ** The gdb.MICommand.installed property can only be set to True or
     False.

  ** The 'qualified' argument to gdb.Breakpoint constructor will no
     longer accept non-bool types.

  ** Added the gdb.Symbol.is_artificial attribute.

  ** Added gdb.Block.subblocks.  Returns a list of blocks contained in that
     block.

  ** Added gdb.Symbol.domain.  Contains the domain of the symbol.

  ** Added gdb.Architecture.void_type. Returns a gdb.Type representing "void"
     type for that architecture.

* Debugger Adapter Protocol changes

  ** The "scopes" request will now return a scope holding global
     variables from the stack frame's compilation unit.

  ** The "scopes" request will return a "returnValue" scope holding
     the return value from the latest "stepOut" command, when
     appropriate.

  ** The "launch" and "attach" requests were rewritten in accordance
     with some clarifications to the spec.  Now they can be sent at
     any time after the "initialized" event, but will not take effect
     (or send a response) until after the "configurationDone" request
     has been sent.

  ** The "variables" request will not return artificial symbols.

* New commands

show jit-reader-directory
  Show the name of the directory that "jit-reader-load" uses for
  relative file names.

set style line-number foreground COLOR
set style line-number background COLOR
set style line-number intensity VALUE
  Control the styling of line numbers printed by GDB.

set style command foreground COLOR
set style command background COLOR
set style command intensity VALUE
  Control the styling of GDB commands when displayed by GDB.

set style title foreground COLOR
set style title background COLOR
set style title intensity VALUE
  This style now applies to the header line of lists, for example the
  first line of the output of "info breakpoints".  Previous uses of
  this style have been replaced with the new "command" style.

set warn-language-frame-mismatch [on|off]
show warn-language-frame-mismatch
  Control the warning that is emitted when specifying a language that
  does not match the current frame's language.

maintenance info inline-frames [ADDRESS]
  New command which displays GDB's inline-frame information for the
  current address, or for ADDRESS if specified.  The output identifies
  inlined frames which start at the specified address.

maintenance info blocks [ADDRESS]
  New command which displays information about all of the blocks at
  ADDRESS, or at the current address if ADDRESS is not given.  Blocks
  are listed starting at the inner global block out to the most inner
  block.

maintenance frame-unwinder disable [-all | -name NAME | [-class] CLASS]
maintenance frame-unwinder enable [-all | -name NAME | [-class] CLASS]
  Enable or disable frame unwinders.  This is only meant to be used when
  testing unwinders themselves, and you want to ensure that a fallback
  algorithm won't obscure a regression.  GDB is not expected to behave
  well if you try to execute the inferior with unwinders disabled.

info missing-objfile-handlers
  List all the registered missing-objfile handlers.

enable missing-objfile-handler LOCUS HANDLER
disable missing-objfile-handler LOCUS HANDLER
  Enable or disable a missing-objfile handler with a name matching the
  regular expression HANDLER, in LOCUS.

  LOCUS can be 'global' to operate on global missing-objfile handler,
  'progspace' to operate on handlers within the current program space,
  or can be a regular expression which is matched against the filename
  of the primary executable in each program space.

* Changed commands

remove-symbol-file
  This command now supports file-name completion.

remove-symbol-file -a ADDRESS
  The ADDRESS expression can now be a full expression consisting of
  multiple terms, e.g. 'function + 0x1000' (without quotes),
  previously only a single term could be given.

target core
target exec
target tfile
target ctf
compile file
maint print c-tdesc
save gdb-index
  These commands now require their filename argument to be quoted if
  it contains white space or quote characters.  If the argument
  contains no such special characters then quoting is not required.

maintenance print remote-registers
  Add an "Expedited" column to the output of the command.  It indicates
  which registers were included in the last stop reply packet received by
  GDB.

maintenance info frame-unwinders
  Add a CLASS column to the output.  This class is a somewhat arbitrary
  grouping of unwinders, based on which area of GDB adds the unwinder.
  Also add an ENABLED column, that will show if the unwinder is enabled
  or not.

maintenance set dwarf unwinders (on|off)
  This command has been removed because the same functionality can be
  achieved with maint frame-unwinder (enable|disable) DEBUGINFO.

maintenance show dwarf unwinders
  This command has been removed since the functionality can be achieved
  by checking the last column of maint info frame-unwinders.

show configuration
  Now includes the version of GNU Readline library that GDB is using.

* New remote packets

vFile:stat
  Return information about files on the remote system.  Like
  vFile:fstat but takes a filename rather than an open file
  descriptor.

x addr,length
  Given ADDR and LENGTH, fetch LENGTH units from the memory at address
  ADDR and send the fetched data in binary format.  This packet is
  equivalent to 'm', except that the data in the response are in
  binary format.

*** Changes in GDB 15

* The MPX commands "show/set mpx bound" have been deprecated, as Intel
  listed MPX as removed in 2019.

* Building GDB and GDBserver now requires a C++17 compiler.
  For example, GCC 9 or later.

* GDB index now contains information about the main function.  This speeds up
  startup when it is being used for some large binaries.

* On hosts where threading is available, DWARF reading is now done in
  the background, resulting in faster startup.  This can be controlled
  using "maint set dwarf synchronous".

* Changed commands

disassemble
  Attempting to use both the 'r' and 'b' flags with the disassemble
  command will now give an error.  Previously the 'b' flag would
  always override the 'r' flag.

gcore
generate-core-file
  GDB now generates sparse core files, on systems that support it.

maintenance info line-table
  Add an EPILOGUE-BEGIN column to the output of the command.  It indicates
  if the line is considered the start of the epilogue, and thus a point at
  which the frame can be considered destroyed.

set unwindonsignal on|off
show unwindonsignal
  These commands are now aliases for the new set/show unwind-on-signal.

target record-full
  This command now gives an error if any unexpected arguments are
  found after the command.

list .
  When using the command "list ." in a location that has no debug information
  or no file loaded, GDB now says that there is no debug information to print
  lines.  This makes it more obvious that there is no information, as opposed
  to implying there is no inferior loaded.

* New commands

info missing-debug-handler
  List all the registered missing debug handlers.

enable missing-debug-handler LOCUS HANDLER
disable missing-debug-handler LOCUS HANDLER
  Enable or disable a missing debug handler with a name matching the
  regular expression HANDLER, in LOCUS.

  LOCUS can be 'global' to operate on global missing debug handler,
  'progspace' to operate on handlers within the current program space,
  or can be a regular expression which is matched against the filename
  of the primary executable in each program space.

maintenance info linux-lwps
  List all LWPs under control of the linux-nat target.

set remote thread-options-packet
show remote thread-options-packet
  Set/show the use of the thread options packet.

set direct-call-timeout SECONDS
show direct-call-timeout
set indirect-call-timeout SECONDS
show indirect-call-timeout
  These new settings can be used to limit how long GDB will wait for
  an inferior function call to complete.  The direct timeout is used
  for inferior function calls from e.g. 'call' and 'print' commands,
  while the indirect timeout is used for inferior function calls from
  within a conditional breakpoint expression.

  The default for the direct timeout is unlimited, while the default
  for the indirect timeout is 30 seconds.

  These timeouts will only have an effect for targets that are
  operating in async mode.  For non-async targets the timeouts are
  ignored, GDB will wait indefinitely for an inferior function to
  complete, unless interrupted by the user using Ctrl-C.

set unwind-on-timeout on|off
show unwind-on-timeout
  These commands control whether GDB should unwind the stack when a
  timeout occurs during an inferior function call.  The default is
  off, in which case the inferior will remain in the frame where the
  timeout occurred.  When on, GDB will unwind the stack removing the
  dummy frame that was added for the inferior call, and restoring the
  inferior state to how it was before the inferior call started.

set unwind-on-signal on|off
show unwind-on-signal
  These new commands replaces the existing set/show unwindonsignal.  The
  old command is maintained as an alias.

* New features in the GDB remote stub, GDBserver

  ** The --remote-debug and --event-loop-debug command line options
     have been removed.

  ** The --debug command line option now takes an optional comma
     separated list of components to emit debug for.  The currently
     supported components are: all, threads, event-loop, and remote.
     If no components are given then threads is assumed.

  ** The 'monitor set remote-debug' and 'monitor set event-loop-debug'
     command have been removed.

  ** The 'monitor set debug 0|1' command has been extended to take a
     component name, e.g.: 'monitor set debug COMPONENT off|on'.
     Possible component names are: all, threads, event-loop, and
     remote.

* Python API

  ** New function gdb.notify_mi(NAME, DATA), that emits custom
     GDB/MI async notification.

  ** New read/write attribute gdb.Value.bytes that contains a bytes
     object holding the contents of this value.

  ** New module gdb.missing_debug that facilitates dealing with
     objfiles that are missing any debug information.

  ** New function gdb.missing_debug.register_handler that can register
     an instance of a sub-class of gdb.missing_debug.MissingDebugInfo
     as a handler for objfiles that are missing debug information.

  ** New class gdb.missing_debug.MissingDebugInfo which can be
     sub-classed to create handlers for objfiles with missing debug
     information.

  ** Stop events now have a "details" attribute that holds a
     dictionary that carries the same information as an MI "*stopped"
     event.

  ** New function gdb.interrupt(), that interrupts GDB as if the user
     typed control-c.

  ** New gdb.InferiorThread.ptid_string attribute.  This read-only
     attribute contains the string that appears in the 'Target Id'
     column of the 'info threads' command output.

  ** It is no longer possible to create new gdb.Progspace object using
     'gdb.Progspace()', this will result in a TypeError.  Progspace
     objects can still be obtained through calling other API
     functions, for example 'gdb.current_progspace()'.

  ** User defined attributes can be added to a gdb.Inferior object,
     these will be stored in the object's new Inferior.__dict__
     attribute.

  ** User defined attributes can be added to a gdb.InferiorThread
     object, these will be stored in the object's new
     InferiorThread.__dict__ attribute.

  ** New constants gdb.SYMBOL_TYPE_DOMAIN, gdb.SYMBOL_FUNCTION_DOMAIN,
     and gdb.SEARCH_*_DOMAIN corresponding to all the existing symbol
     domains.  Symbol lookup can now search in multiple domains at
     once, and can also narrowly search for just a type or function.

* Debugger Adapter Protocol changes

  ** GDB now emits the "process" event.

  ** GDB now supports the "cancel" request.

  ** The "attach" request now supports specifying the program.

  ** New command "set debug dap-log-level" controls DAP logging.

  ** The "set debug dap-log-file" command is now documented.  This
     command was available in GDB 14 but not documented.

* Guile API

  ** New constants SYMBOL_TYPE_DOMAIN, SYMBOL_FUNCTION_DOMAIN, and
     SEARCH_*_DOMAIN corresponding to all the existing symbol domains.
     Symbol lookup can now search in multiple domains at once, and can
     also narrowly search for just a type or function.

* New remote packets

New stop reason: clone
  Indicates that a clone system call was executed.

QThreadOptions
  Enable/disable optional event reporting, on a per-thread basis.
  Currently supported options are GDB_THREAD_OPTION_CLONE, to enable
  clone event reporting, and GDB_THREAD_OPTION_EXIT to enable thread
  exit event reporting.

QThreadOptions in qSupported
  The qSupported packet allows GDB to inform the stub it supports the
  QThreadOptions packet, and the qSupported response can contain the
  set of thread options the remote stub supports.

qIsAddressTagged
  This new packet allows GDB to query the stub about a given address to check
  if it is tagged or not.  Many memory tagging-related GDB commands need to
  perform this check before they read/write the allocation tag related to an
  address.  Currently, however, this is done through a 'vFile' request to read
  the file /proc/<PID>/smaps and check if the address is in a region reported
  as memory tagged.  Since not all targets have a notion of what the smaps
  file is about, this new packet provides a more generic way to perform such
  a check.

*** Changes in GDB 14

* GDB now supports the AArch64 Scalable Matrix Extension 2 (SME2), which
  includes a new 512 bit lookup table register named ZT0.

* GDB now supports the AArch64 Scalable Matrix Extension (SME), which includes
  a new matrix register named ZA, a new thread register TPIDR2 and a new vector
  length register SVG (streaming vector granule).  GDB also supports tracking
  ZA state across signal frames.

  Some features are still under development or are dependent on ABI specs that
  are still in alpha stage.  For example, manual function calls with ZA state
  don't have any special handling, and tracking of SVG changes based on
  DWARF information is still not implemented, but there are plans to do so in
  the future.

* GDB now recognizes the NO_COLOR environment variable and disables
  styling according to the spec.  See https://no-color.org/.
  Styling can be re-enabled with "set style enabled on".

* The AArch64 'org.gnu.gdb.aarch64.pauth' Pointer Authentication feature string
  has been deprecated in favor of the 'org.gnu.gdb.aarch64.pauth_v2' feature
  string.

* GDB now has some support for integer types larger than 64 bits.

* Removed targets and native configurations

  GDB no longer supports AIX 4.x, AIX 5.x and AIX 6.x.  The minimum supported
  AIX version is now AIX 7.1.

* Multi-target feature configuration

  GDB now supports the individual configuration of remote targets' feature
  sets.  Based on the current selection of a target, the commands 'set remote
  <name>-packet (on|off|auto)' and 'show remote <name>-packet' can be used to
  configure a target's feature packet and to display its configuration,
  respectively.

  The individual packet sizes can be configured and shown using the commands
    ** 'set remote memory-read-packet-size (number of bytes|fixed|limit)'
    ** 'set remote memory-write-packet-size (number of bytes|fixed|limit)'
    ** 'show remote memory-read-packet-size'
    ** 'show remote memory-write-packet-size'.

  The configuration of the packet itself, as well as the size of a memory-read
  or memory-write packet applies to the currently selected target (if
  available).  If no target is selected, it applies to future remote
  connections.  Similarly, the show commands print the configuration of the
  currently selected target.  If no remote target is selected, the default
  configuration for future connections is shown.

* GDB has initial built-in support for the Debugger Adapter Protocol.
  This support requires that GDB be built with Python scripting
  enabled.

* For the break command, multiple uses of the 'thread' or 'task'
  keywords will now give an error instead of just using the thread or
  task id from the last instance of the keyword.  E.g.:
    break foo thread 1 thread 2
  will now give an error rather than using 'thread 2'.

* For the watch command, multiple uses of the 'task' keyword will now
  give an error instead of just using the task id from the last
  instance of the keyword.  E.g.:
    watch my_var task 1 task 2
  will now give an error rather than using 'task 2'.  The 'thread'
  keyword already gave an error when used multiple times with the
  watch command, this remains unchanged.

* The 'set print elements' setting now helps when printing large arrays.
  If an array would otherwise exceed max-value-size, but 'print elements'
  is set such that the size of elements to print is less than or equal
  to 'max-value-size', GDB will now still print the array, however only
  'max-value-size' worth of data will be added into the value history.

* For both the break and watch commands, it is now invalid to use both
  the 'thread' and 'task' keywords within the same command.  For
  example the following commands will now give an error:
    break foo thread 1 task 1
    watch var thread 2 task 3

* The printf command now accepts a '%V' output format which will
  format an expression just as the 'print' command would.  Print
  options can be placed within '[...]' after the '%V' to modify how
  the value is printed.  E.g:
    printf "%V", some_array
    printf "%V[-array-indexes on]", some_array
  will print the array without, or with array indexes included, just
  as the array would be printed by the 'print' command.  This
  functionality is also available for dprintf when dprintf-style is
  'gdb'.

* When the printf command requires a string to be fetched from the
  inferior, GDB now uses the existing 'max-value-size' setting to the
  limit the memory allocated within GDB.  The default 'max-value-size'
  is 64k.  To print longer strings you should increase
  'max-value-size'.

* The Ada 2022 Enum_Rep and Enum_Val attributes are now supported.

* The Ada 2022 target name symbol ('@') is now supported by the Ada
  expression parser.

* The 'list' command now accepts '.' as an argument, which tells GDB to
  print the location around the point of execution within the current frame.
  If the inferior hasn't started yet, the command will print around the
  beginning of the 'main' function.

* Using the 'list' command with no arguments in a situation where the
  command would attempt to list past the end of the file now warns the
  user that the end of file has been reached, refers the user to the
  newly added '.' argument

* Breakpoints can now be inferior-specific.  This is similar to the
  existing thread-specific breakpoint support.  Breakpoint conditions
  can include the 'inferior' keyword followed by an inferior id (as
  displayed in the 'info inferiors' output).  It is invalid to use the
  'inferior' keyword with either the 'thread' or 'task' keywords when
  creating a breakpoint.

* New convenience function "$_shell", to execute a shell command and
  return the result.  This lets you run shell commands in expressions.
  Some examples:

   (gdb) p $_shell("true")
   $1 = 0
   (gdb) p $_shell("false")
   $2 = 1
   (gdb) break func if $_shell("some command") == 0

* Configure changes

--additional-debug-dirs=PATHs

  Provide a colon-separated list of additional directories to search for
  separate debug info.  These directories are added to the default value of
  the 'debug-file-directory' GDB parameter.

* New commands

set debug breakpoint on|off
  show debug breakpoint
  Print additional debug messages about breakpoint insertion and removal.

maintenance print record-instruction [ N ]
  Print the recorded information for a given instruction.  If N is not given
  prints how GDB would undo the last instruction executed.  If N is negative,
  prints how GDB would undo the N-th previous instruction, and if N is
  positive, it prints how GDB will redo the N-th following instruction.

maintenance info frame-unwinders
  List the frame unwinders currently in effect, starting with the highest
  priority.

maintenance wait-for-index-cache
  Wait until all pending writes to the index cache have completed.

set always-read-ctf on|off
show always-read-ctf
  When off, CTF is only read if DWARF is not present.  When on, CTF is
  read regardless of whether DWARF is present.  Off by default.

info main
  Get main symbol to identify entry point into program.

set tui mouse-events [on|off]
show tui mouse-events
  When on (default), mouse clicks control the TUI and can be accessed by
  Python extensions.  When off, mouse clicks are handled by the terminal,
  enabling terminal-native text selection.

* MI changes

** MI version 1 has been removed.

** mi now reports 'no-history' as a stop reason when hitting the end of the
   reverse execution history.

** When creating a thread-specific breakpoint using the '-p' option,
   the -break-insert command would report the 'thread' field twice in
   the reply.  The content of both fields was always identical.  This
   has now been fixed; the 'thread' field will be reported just once
   for thread-specific breakpoints, or not at all for breakpoints
   without a thread restriction.  The same is also true for the 'task'
   field of an Ada task-specific breakpoint.

** It is no longer possible to create a thread-specific breakpoint for
   a thread that doesn't exist using '-break-insert -p ID'.  Creating
   breakpoints for non-existent threads is not allowed when using the
   CLI, that the MI allowed it was a long standing bug, which has now
   been fixed.

** The '--simple-values' argument to the '-stack-list-arguments',
   '-stack-list-locals', '-stack-list-variables', and '-var-list-children'
   commands now takes reference types into account: that is, a value is now
   considered simple if it is neither an array, structure, or union, nor a
   reference to an array, structure, or union.  (Previously all references were
   considered simple.)  Support for this feature can be verified by using the
   '-list-features' command, which should contain "simple-values-ref-types".

** The -break-insert command now accepts a '-g thread-group-id' option
   to allow for the creation of inferior-specific breakpoints.

** The bkpt tuple, which appears in breakpoint-created notifications,
   and in the result of the -break-insert command can now include an
   optional 'inferior' field for both the main breakpoint, and each
   location, when the breakpoint is inferior-specific.

* Python API

  ** gdb.ThreadExitedEvent added.  Emits a ThreadEvent.

  ** The gdb.unwinder.Unwinder.name attribute is now read-only.

  ** The name argument passed to gdb.unwinder.Unwinder.__init__ must
     now be of type 'str' otherwise a TypeError will be raised.

  ** The gdb.unwinder.Unwinder.enabled attribute can now only accept
     values of type 'bool'.  Changing this attribute will now
     invalidate GDB's frame-cache, which means GDB will need to
     rebuild its frame-cache when next required - either with, or
     without the particular unwinder, depending on how 'enabled' was
     changed.

  ** New methods added to the gdb.PendingFrame class.  These methods
     have the same behavior as the corresponding methods on
     gdb.Frame.  The new methods are:

     - gdb.PendingFrame.name: Return the name for the frame's
       function, or None.
     - gdb.PendingFrame.is_valid: Return True if the pending frame
       object is valid.
     - gdb.PendingFrame.pc: Return the $pc register value for this
       frame.
     - gdb.PendingFrame.language: Return a string containing the
       language for this frame, or None.
     - gdb.PendingFrame.find_sal: Return a gdb.Symtab_and_line
       object for the current location within the pending frame, or
       None.
     - gdb.PendingFrame.block: Return a gdb.Block for the current
       pending frame, or None.
     - gdb.PendingFrame.function: Return a gdb.Symbol for the
       current pending frame, or None.

  ** The frame-id passed to gdb.PendingFrame.create_unwind_info can
     now use either an integer or a gdb.Value object for each of its
     'sp', 'pc', and 'special' attributes.

  ** A new class gdb.unwinder.FrameId has been added.  Instances of
     this class are constructed with 'sp' (stack-pointer) and 'pc'
     (program-counter) values, and can be used as the frame-id when
     calling gdb.PendingFrame.create_unwind_info.

  ** It is now no longer possible to sub-class the
     gdb.disassembler.DisassemblerResult type.

  ** The Disassembler API from the gdb.disassembler module has been
     extended to include styling support:

     - The DisassemblerResult class can now be initialized with a list
       of parts.  Each part represents part of the disassembled
       instruction along with the associated style information.  This
       list of parts can be accessed with the new
       DisassemblerResult.parts property.

     - New constants gdb.disassembler.STYLE_* representing all the
       different styles part of an instruction might have.

     - New methods DisassembleInfo.text_part and
       DisassembleInfo.address_part which are used to create the new
       styled parts of a disassembled instruction.

     - Changes are backwards compatible, the older API can still be
       used to disassemble instructions without styling.

  ** New function gdb.execute_mi(COMMAND, [ARG]...), that invokes a
     GDB/MI command and returns the output as a Python dictionary.

  ** New function gdb.block_signals().  This returns a context manager
     that blocks any signals that GDB needs to handle itself.

  ** New class gdb.Thread.  This is a subclass of threading.Thread
     that calls gdb.block_signals in its "start" method.

  ** gdb.parse_and_eval now has a new "global_context" parameter.
     This can be used to request that the parse only examine global
     symbols.

  ** gdb.Inferior now has a new "arguments" attribute.  This holds the
     command-line arguments to the inferior, if known.

  ** gdb.Inferior now has a new "main_name" attribute.  This holds the
     name of the inferior's "main", if known.

  ** gdb.Inferior now has new methods "clear_env", "set_env", and
     "unset_env".  These can be used to modify the inferior's
     environment before it is started.

  ** gdb.Value now has the 'assign' method.

  ** gdb.Value now has the 'to_array' method.  This converts an
     array-like Value to an array.

  ** gdb.Progspace now has the new method "objfile_for_address".  This
     returns the gdb.Objfile, if any, that covers a given address.

  ** gdb.Breakpoint now has an "inferior" attribute.  If the
     Breakpoint object is inferior specific then this attribute holds
     the inferior-id (an integer).  If the Breakpoint object is not
     inferior specific, then this field contains None.  This field can
     be written too.

  ** gdb.Type now has the "is_array_like" and "is_string_like"
     methods.  These reflect GDB's internal idea of whether a type
     might be array- or string-like, even if they do not have the
     corresponding type code.

  ** gdb.ValuePrinter is a new class that can be used as the base
     class for the result of applying a pretty-printer.  As a base
     class, it signals to gdb that the printer may implement new
     pretty-printer methods.

  ** New attribute Progspace.symbol_file.  This attribute holds the
     gdb.Objfile that corresponds to Progspace.filename (when
     Progspace.filename is not None), otherwise, this attribute is
     itself None.

  ** New attribute Progspace.executable_filename.  This attribute
     holds a string containing a file name set by the "exec-file" or
     "file" commands, or None if no executable file is set.  This
     isn't the exact string passed by the user to these commands; the
     file name will have been partially resolved to an absolute file
     name.

  ** A new executable_changed event registry is available.  This event
     emits ExecutableChangedEvent objects, which have 'progspace' (a
     gdb.Progspace) and 'reload' (a Boolean) attributes.  This event
     is emitted when gdb.Progspace.executable_filename changes.

  ** New event registries gdb.events.new_progspace and
     gdb.events.free_progspace, these emit NewProgspaceEvent and
     FreeProgspaceEvent event types respectively.  Both of these event
     types have a single 'progspace' attribute, which is the
     gdb.Progspace that is either being added to GDB, or removed from
     GDB.

  ** gdb.LazyString now implements the __str__ method.

  ** New method gdb.Frame.static_link that returns the outer frame
     of a nested function frame.

*** Changes in GDB 13

* MI version 1 is deprecated, and will be removed in GDB 14.

* GDB now supports dumping memory tag data for AArch64 MTE.  It also supports
  reading memory tag data for AArch64 MTE from core files generated by
  the gcore command or the Linux kernel.

  When a process uses memory-mapped pages protected by memory tags (for
  example, AArch64 MTE), this additional information will be recorded in
  the core file in the event of a crash or if GDB generates a core file
  from the current process state.  GDB will show this additional information
  automatically, or through one of the memory-tag subcommands.

* Scheduler-locking and new threads

  When scheduler-locking is in effect, only the current thread may run
  when the inferior is resumed.  However, previously, new threads
  created by the resumed thread would still be able to run free.  Now,
  they are held stopped.

* "info breakpoints" now displays enabled breakpoint locations of
  disabled breakpoints as in the "y-" state.  For example:

   (gdb) info breakpoints
   Num     Type           Disp Enb Address            What
   1       breakpoint     keep n   <MULTIPLE>
   1.1                         y-  0x00000000000011b6 in ...
   1.2                         y-  0x00000000000011c2 in ...
   1.3                         n   0x00000000000011ce in ...

* Support for Thread Local Storage (TLS) variables on FreeBSD arm and
  aarch64 architectures.

* GDB now supports hardware watchpoints on FreeBSD/Aarch64.

* Remove support for building against Python 2, it is now only possible to
  build GDB against Python 3.

* DBX mode has been removed.

* GDB now honours the DWARF prologue_end line-table entry flag the compiler can
  emit to indicate where a breakpoint should be placed to break in a function
  past its prologue.

* Completion now also offers "NUMBER" for "set" commands that accept
  a numeric argument and the "unlimited" keyword.  For example:

   (gdb) set width <TAB>
   NUMBER     unlimited

  and consequently:

   (gdb) complete set width
   set width NUMBER
   set width unlimited

* Disassembler styling using libopcodes.  GDB now supports
  disassembler styling using libopcodes.  This is only available for
  some targets (currently x86 and RISC-V).  For unsupported targets
  Python Pygments is still used.  For supported targets, libopcodes
  styling is used by default.

* The Windows native target now supports target async.

* gdb now supports zstd compressed debug sections (ELFCOMPRESS_ZSTD) for ELF.

* The format of 'disassemble /r' and 'record instruction-history /r'
  has changed.  The instruction bytes could now be grouped together,
  and displayed in the endianness of the instruction.  This is the
  same layout as used by GNU objdump when disassembling.

  There is now 'disassemble /b' and 'record instruction-history /b'
  which will always display the instructions bytes one at a time in
  memory order, that is, the byte at the lowest address first.

  For both /r and /b GDB is now better at using whitespace in order to
  align the disassembled instruction text.

* The TUI no longer styles the source and assembly code highlighted by
  the current position indicator by default.  You can however
  re-enable styling using the new "set style tui-current-position"
  command.

* New convenience variable $_inferior_thread_count contains the number
  of live threads in the current inferior.

* When a breakpoint with multiple code locations is hit, GDB now prints
  the code location using the syntax <breakpoint_number>.<location_number>
  such as in:
     Thread 1 "zeoes" hit Breakpoint 2.3, some_func () at zeoes.c:8

* When a breakpoint is hit, GDB now sets the convenience variables $_hit_bpnum
  and $_hit_locno to the hit breakpoint number and code location number.
  This allows to disable the last hit breakpoint using
     (gdb) disable $_hit_bpnum
   or disable only the specific breakpoint code location using
     (gdb) disable $_hit_bpnum.$_hit_locno
  These commands can be used inside the command list of a breakpoint to
  automatically disable the just encountered breakpoint (or the just
  encountered specific breakpoint code location).
  When a breakpoint has only one location, $_hit_locno is set to 1 so that
     (gdb) disable $_hit_bpnum.$_hit_locno
  and
     (gdb) disable $_hit_bpnum
  are both disabling the breakpoint.

* New commands

maintenance set ignore-prologue-end-flag on|off
maintenance show ignore-prologue-end-flag
  This setting, which is off by default, controls whether GDB ignores the
  PROLOGUE-END flag from the line-table when skipping prologue.  This can be
  used to force GDB to use prologue analyzers if the line-table is constructed
  from erroneous debug information.

set print nibbles [on|off]
show print nibbles
  This controls whether the 'print/t' command will display binary values
  in groups of four bits, known as "nibbles".  The default is 'off'.

maintenance set libopcodes-styling on|off
maintenance show libopcodes-styling
  These can be used to force off libopcodes based styling, the Python
  Pygments styling will then be used instead.

set style disassembler comment
show style disassembler comment
set style disassembler immediate
show style disassembler immediate
set style disassembler mnemonic
show style disassembler mnemonic
set style disassembler register
show style disassembler register
set style disassembler address
show style disassembler address
set style disassembler symbol
show style disassembler symbol
  For targets that support libopcodes based styling, these settings
  control how various aspects of the disassembler output are styled.
  The 'disassembler address' and 'disassembler symbol' styles are
  aliases for the 'address' and 'function' styles respectively.

maintenance print frame-id [ LEVEL ]
  Print GDB's internal frame-id for the frame at LEVEL.  If LEVEL is
  not given, then print the frame-id for the currently selected frame.

set debug infcall on|off
show debug infcall
  Print additional debug messages about inferior function calls.

set debug solib on|off
show debug solib
  Print additional debug messages about shared library handling.

set style tui-current-position [on|off]
  Whether to style the source and assembly code highlighted by the
  TUI's current position indicator.  The default is off.

set print characters LIMIT
show print characters
  This new setting is like 'set print elements', but controls how many
  characters of a string are printed.  This functionality used to be
  covered by 'set print elements', but it can be controlled separately
  now.  LIMIT can be set to a numerical value to request that particular
  character count, to 'unlimited' to print all characters of a string,
  or to 'elements', which is also the default, to follow the setting of
 'set print elements' as it used to be.

print -characters LIMIT
  This new option to the 'print' command has the same effect as a temporary
  use of 'set print characters'.

* Changed commands

document user-defined
  It is now possible to document user-defined aliases.
  When a user-defined alias is documented, the help and apropos commands
  use the provided documentation instead of the documentation of the
  aliased command.
  Documenting a user-defined alias is particularly useful when the alias
  is a set of nested 'with' commands to avoid showing the help of
  the with command for an alias that will in fact launch the
  last command given in the nested commands.

maintenance info line-table
  Add a PROLOGUE-END column to the output which indicates that an
  entry corresponds to an address where a breakpoint should be placed
  to be at the first instruction past a function's prologue.

* Removed commands

set debug aix-solib on|off
show debug aix-solib
set debug solib-frv on|off
show debug solib-frv
  Removed in favor of "set/show debug solib".

maintenance info program-spaces
  This command now includes a 'Core File' column which indicates the
  name of the core file associated with each program space.

* New targets

GNU/Linux/LoongArch (gdbserver)	loongarch*-*-linux*

GNU/Linux/CSKY (gdbserver) csky*-*linux*

AMDGPU amdgcn-*-*

* MI changes

 ** The async record stating the stopped reason 'breakpoint-hit' now
    contains an optional field locno giving the code location number
    when the breakpoint has multiple code locations.

* Python API

  ** GDB will now reformat the doc string for gdb.Command and
     gdb.Parameter sub-classes to remove unnecessary leading
     whitespace from each line before using the string as the help
     output.

  ** New function gdb.format_address(ADDRESS, PROGSPACE, ARCHITECTURE),
     that formats ADDRESS as 'address <symbol+offset>', where symbol is
     looked up in PROGSPACE, and ARCHITECTURE is used to format address.
     This is the same format that GDB uses when printing address, symbol,
     and offset information from the disassembler.

  ** New function gdb.current_language that returns the name of the
     current language.  Unlike gdb.parameter('language'), this will
     never return 'auto'.

  ** New method gdb.Frame.language that returns the name of the
     frame's language.

  ** New Python API for wrapping GDB's disassembler:

     - gdb.disassembler.register_disassembler(DISASSEMBLER, ARCH).
       DISASSEMBLER is a sub-class of gdb.disassembler.Disassembler.
       ARCH is either None or a string containing a bfd architecture
       name.  DISASSEMBLER is registered as a disassembler for
       architecture ARCH, or for all architectures if ARCH is None.
       The previous disassembler registered for ARCH is returned, this
       can be None if no previous disassembler was registered.

     - gdb.disassembler.Disassembler is the class from which all
       disassemblers should inherit.  Its constructor takes a string,
       a name for the disassembler, which is currently only used in
       some debug output.  Sub-classes should override the __call__
       method to perform disassembly, invoking __call__ on this base
       class will raise an exception.

     - gdb.disassembler.DisassembleInfo is the class used to describe
       a single disassembly request from GDB.  An instance of this
       class is passed to the __call__ method of
       gdb.disassembler.Disassembler and has the following read-only
       attributes: 'address', and 'architecture', as well as the
       following method: 'read_memory'.

     - gdb.disassembler.builtin_disassemble(INFO, MEMORY_SOURCE),
       calls GDB's builtin disassembler on INFO, which is a
       gdb.disassembler.DisassembleInfo object.  MEMORY_SOURCE is
       optional, its default value is None.  If MEMORY_SOURCE is not
       None then it must be an object that has a 'read_memory' method.

     - gdb.disassembler.DisassemblerResult is a class that can be used
       to wrap the result of a call to a Disassembler.  It has
       read-only attributes 'length' and 'string'.

  ** gdb.Objfile now has an attribute named "is_file".  This is True
     if the objfile comes from a file, and False otherwise.

  ** New function gdb.print_options that returns a dictionary of the
     prevailing print options, in the form accepted by
     gdb.Value.format_string.

  ** gdb.Value.format_string now uses the format provided by 'print',
     if it is called during a 'print' or other similar operation.

  ** gdb.Value.format_string now accepts the 'summary' keyword.  This
     can be used to request a shorter representation of a value, the
     way that 'set print frame-arguments scalars' does.

  ** New Python type gdb.BreakpointLocation.
     The new attribute 'locations' of gdb.Breakpoint returns a list of
     gdb.BreakpointLocation objects specifying the locations where the
     breakpoint is inserted into the debuggee.

  ** The gdb.register_window_type method now restricts the set of
     acceptable window names.  The first character of a window's name
     must start with a character in the set [a-zA-Z], every subsequent
     character of a window's name must be in the set [-_.a-zA-Z0-9].

* New features in the GDB remote stub, GDBserver

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

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

* LoongArch floating-point support

GDB now supports floating-point on LoongArch GNU/Linux.

* AMD GPU ROCm debugging support

GDB now supports debugging programs offloaded to AMD GPUs using the ROCm
platform.

*** Changes in GDB 12

* DBX mode is deprecated, and will be removed in GDB 13

* GDB 12 is the last release of GDB that will support building against
  Python 2.  From GDB 13, it will only be possible to build GDB itself
  with Python 3 support.

* The disable-randomization setting now works on Windows.

* Improved C++ template support

  GDB now treats functions/types involving C++ templates like it does function
  overloads.  Users may omit parameter lists to set breakpoints on families of
  template functions, including types/functions composed of multiple template types:

  (gdb) break template_func(template_1, int)

  The above will set breakpoints at every function `template_func' where
  the first function parameter is any template type named `template_1' and
  the second function parameter is `int'.

  TAB completion also gains similar improvements.

* The FreeBSD native target now supports async mode.

* Configure changes

--enable-threading

  Enable or disable multithreaded symbol loading.  This is enabled
  by default, but passing --disable-threading or --enable-threading=no
  to configure will disable it.

  Disabling this can cause a performance penalty when there are a lot of
  symbols to load, but is useful for debugging purposes.

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

task apply [all | TASK-IDS...] [FLAG]... COMMAND
  Like "thread apply", but applies COMMAND to Ada tasks.

watch [...] task ID
  Watchpoints can now be restricted to a specific Ada task.

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.

set logging on|off
  Deprecated and replaced by "set logging enabled on|off".

set logging enabled on|off
show logging enabled
  These commands set or show whether logging is enabled or disabled.

exit
  You can now exit GDB by using the new command "exit", in addition to
  the existing "quit" command.

set debug threads on|off
show debug threads
  Print additional debug messages about thread creation and deletion.

set debug linux-nat on|off
show debug linux-nat
  These new commands replaced the old 'set debug lin-lwp' and 'show
  debug lin-lwp' respectively.  Turning this setting on prints debug
  messages relating to GDB's handling of native Linux inferiors.

maint flush source-cache
  Flush the contents of the source code cache.

maint set gnu-source-highlight enabled on|off
maint show gnu-source-highlight enabled
  Whether GDB should use the GNU Source Highlight library for adding
  styling to source code.  When off, the library will not be used, even
  when available.  When GNU Source Highlight isn't used, or can't add
  styling to a particular source file, then the Python Pygments
  library will be used instead.

set suppress-cli-notifications (on|off)
show suppress-cli-notifications
  This controls whether printing the notifications is suppressed for CLI.
  CLI notifications occur when you change the selected context
  (i.e., the current inferior, thread and/or the frame), or when
  the program being debugged stops (e.g., because of hitting a
  breakpoint, completing source-stepping, an interrupt, etc.).

set style disassembler enabled on|off
show style disassembler enabled
  If GDB is compiled with Python support, and the Python Pygments
  package is available, then, when this setting is on, disassembler
  output will have styling applied.

set ada source-charset
show ada source-charset
  Set the character set encoding that is assumed for Ada symbols.  Valid
  values for this follow the values that can be passed to the GNAT
  compiler via the '-gnati' option.  The default is ISO-8859-1.

tui layout
tui focus
tui refresh
tui window height
  These are the new names for the old 'layout', 'focus', 'refresh',
  and 'winheight' tui commands respectively.  The old names still
  exist as aliases to these new commands.

tui window width
winwidth
  The new command 'tui window width', and the alias 'winwidth' allow
  the width of a tui window to be adjusted when windows are laid out
  in horizontal mode.

set debug tui on|off
show debug tui
  Control the display of debug output about GDB's tui.

* Changed commands

print
  Printing of floating-point values with base-modifying formats like
  /x has been changed to display the underlying bytes of the value in
  the desired base.  This was GDB's documented behavior, but was never
  implemented correctly.

maint packet
  This command can now print a reply, if the reply includes
  non-printable characters.  Any non-printable characters are printed
  as escaped hex, e.g. \x?? where '??' is replaces with the value of
  the non-printable character.

clone-inferior
  The clone-inferior command now ensures that the TTY, CMD and ARGS
  settings are copied from the original inferior to the new one.
  All modifications to the environment variables done using the 'set
  environment' or 'unset environment' commands are also copied to the new
  inferior.

set debug lin-lwp on|off
show debug lin-lwp
  These commands have been removed from GDB.  The new command 'set
  debug linux-nat' and 'show debug linux-nat' should be used
  instead.

info win
  This command now includes information about the width of the tui
  windows in its output.

layout
focus
refresh
winheight
  These commands are now aliases for the 'tui layout', 'tui focus',
  'tui refresh', and 'tui window height' commands respectively.

* GDB's Ada parser now supports an extension for specifying the exact
  byte contents of a floating-point literal.  This can be useful for
  setting floating-point registers to a precise value without loss of
  precision.  The syntax is an extension of the based literal syntax.
  Use, e.g., "16lf#0123abcd#" -- the number of "l"s controls the width
  of the floating-point type, and the "f" is the marker for floating
  point.

* MI changes

 ** The '-add-inferior' with no option flags now inherits the
    connection of the current inferior, this restores the behavior of
    GDB as it was prior to GDB 10.

 ** The '-add-inferior' command now accepts a '--no-connection'
    option, which causes the new inferior to start without a
    connection.

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

 ** The "script" field in breakpoint output (which is syntactically
    incorrect in MI 3 and below) has changed in MI 4 to become a list.
    This affects the following commands and events:

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

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

* New targets

GNU/Linux/LoongArch		loongarch*-*-linux*

* Removed targets

S+core				score-*-*

* 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 function gdb.history_count(), which returns the number of
     values in GDB's value history.

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

  ** New function gdb.architecture_names(), which returns a list
     containing all of the possible Architecture.name() values.  Each
     entry is a string.

  ** New function gdb.Architecture.integer_type(), which returns an
     integer type given a size and a signed-ness.

  ** New gdb.TargetConnection object type that represents a connection
     (as displayed by the 'info connections' command).  A sub-class,
     gdb.RemoteTargetConnection, is used to represent 'remote' and
     'extended-remote' connections.

  ** The gdb.Inferior type now has a 'connection' property which is an
     instance of gdb.TargetConnection, the connection used by this
     inferior.  This can be None if the inferior has no connection.

  ** New 'gdb.events.connection_removed' event registry, which emits a
     'gdb.ConnectionEvent' when a connection is removed from GDB.
     This event has a 'connection' property, a gdb.TargetConnection
     object for the connection being removed.

  ** New gdb.connections() function that returns a list of all
     currently active connections.

  ** New gdb.RemoteTargetConnection.send_packet(PACKET) method.  This
     is equivalent to the existing 'maint packet' CLI command; it
     allows a user specified packet to be sent to the remote target.

  ** New function gdb.host_charset(), returns a string, which is the
     name of the current host charset.

  ** New gdb.set_parameter(NAME, VALUE).  This sets the gdb parameter
     NAME to VALUE.

  ** New gdb.with_parameter(NAME, VALUE).  This returns a context
     manager that temporarily sets the gdb parameter NAME to VALUE,
     then resets it when the context is exited.

  ** The gdb.Value.format_string method now takes a 'styling'
     argument, which is a boolean.  When true, the returned string can
     include escape sequences to apply styling.  The styling will only
     be present if styling is otherwise turned on in GDB (see 'help
     set styling').  When false, which is the default if the argument
     is not given, then no styling is applied to the returned string.

  ** New read-only attribute gdb.InferiorThread.details, which is
     either a string, containing additional, target specific thread
     state information, or None, if there is no such additional
     information.

  ** New read-only attribute gdb.Type.is_scalar, which is True for
     scalar types, and False for all other types.

  ** New read-only attribute gdb.Type.is_signed.  This attribute
     should only be read when Type.is_scalar is True, and will be True
     for signed types, and False for all other types.  Attempting to
     read this attribute for non-scalar types will raise a ValueError.

  ** It is now possible to add GDB/MI commands implemented in Python.

* New features in the GDB remote stub, GDBserver

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

* New native configurations

GNU/Linux/OpenRISC		or1k*-*-linux*

*** 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 behavior 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
  readability 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 information 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 threw 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 compile time.

  ** "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
  namespace aliasing has also been added.  So, if a namespace is
  aliased in the current scope (e.g. namespace 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 arm unwind-secure-frames
  Enable unwinding from Non-secure to Secure mode on Cortex-M with
  Security extension.
  This can trigger security exceptions when unwinding exception stacks.

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 auxiliary 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 "usable".

* 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 transferred 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 behavior.  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 publicly 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 required (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 explicitly
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
required (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.
