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

*** Changes since GDB-4.18:

* New features

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.

* 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-*-*
Tahoe						tahoe-*-*

* Remote targets can connect to a sub-program

A popen(3) style serial-device has been added.  This device starts a
sub-process (such as a stand-alone simulator) and then communicates
with that.  The sub-program to run is specified using the syntax
``|<program> <args>'' vis:

	(gdb) set remotedebug 1
	(gdb) target extended-remote |mn10300-elf-sim program-args

* MIPS 64 remote protocol

A long standing bug in the mips64 remote protocol where by GDB
expected certain 32 bit registers (ex SR) to be transfered as 32
instead of 64 bits has been fixed.

The command ``set remote-mips64-transfers-32bit-regs on'' has been
added to provide backward compatibility with older versions of GDB.

* ``set remotebinarydownload'' replaced by ``set remote X-packet''

The command ``set remotebinarydownload'' command has been replaced by
``set remote X-packet''.  Other commands in ``set remote'' family
include ``set remote P-packet''.

* Breakpoint commands accept ranges.

The breakpoint commands ``enable'', ``disable'', and ``delete'' now
accept a range of breakpoints, e.g. ``5-7''.  The tracepoint command
``tracepoint passcount'' also accepts a range of tracepoints.

*** Changes in GDB-4.18:

* New native configurations

HP-UX 10.20					hppa*-*-hpux10.20
HP-UX 11.x					hppa*-*-hpux11.0*
M68K Linux					m68*-*-linux*

* New targets

Fujitsu FR30					fr30-*-elf*
Intel StrongARM					strongarm-*-*
Mitsubishi D30V					d30v-*-*

* OBSOLETE configurations

Gould PowerNode, NP1				np1-*-*, pn-*-*

Configurations that have been declared obsolete will be commented out,
but the code will be left in place.  If there is no activity to revive
these configurations before the next release of GDB, the sources will
be permanently REMOVED.

* ANSI/ISO C

As a compatibility experiment, GDB's source files buildsym.h and
buildsym.c have been converted to pure standard C, no longer
containing any K&R compatibility code.  We believe that all systems in
use today either come with a standard C compiler, or have a GCC port
available.  If this is not true, please report the affected
configuration to bug-gdb@gnu.org immediately.  See the README file for
information about getting a standard C compiler if you don't have one
already.

* Readline 2.2

GDB now uses readline 2.2.

* set extension-language

You can now control the mapping between filename extensions and source
languages by using the `set extension-language' command.  For instance,
you can ask GDB to treat .c files as C++ by saying
	set extension-language .c c++
The command `info extensions' lists all of the recognized extensions
and their associated languages.

* Setting processor type for PowerPC and RS/6000

When GDB is configured for a powerpc*-*-* or an rs6000*-*-* target,
you can use the `set processor' command to specify what variant of the
PowerPC family you are debugging.  The command

	set processor NAME

sets the PowerPC/RS6000 variant to NAME.  GDB knows about the
following PowerPC and RS6000 variants:

  ppc-uisa  PowerPC UISA - a PPC processor as viewed by user-level code
  rs6000    IBM RS6000 ("POWER") architecture, user-level view
  403       IBM PowerPC 403
  403GC     IBM PowerPC 403GC
  505       Motorola PowerPC 505
  860       Motorola PowerPC 860 or 850
  601       Motorola PowerPC 601
  602       Motorola PowerPC 602
  603       Motorola/IBM PowerPC 603 or 603e
  604       Motorola PowerPC 604 or 604e
  750       Motorola/IBM PowerPC 750 or 750

At the moment, this command just tells GDB what to name the
special-purpose processor registers.  Since almost all the affected
registers are inaccessible to user-level programs, this command is
only useful for remote debugging in its present form.

* HP-UX support

Thanks to a major code donation from Hewlett-Packard, GDB now has much
more extensive support for HP-UX.  Added features include shared
library support, kernel threads and hardware watchpoints for 11.00,
support for HP's ANSI C and C++ compilers, and a compatibility mode
for xdb and dbx commands.

* Catchpoints

HP's donation includes the new concept of catchpoints, which is a
generalization of the old catch command.  On HP-UX, it is now possible
to catch exec, fork, and vfork, as well as library loading.

This means that the existing catch command has changed; its first
argument now specifies the type of catch to be set up.  See the
output of "help catch" for a list of catchpoint types.

* Debugging across forks

On HP-UX, you can choose which process to debug when a fork() happens
in the inferior.

* TUI

HP has donated a curses-based terminal user interface (TUI).  To get
it, build with --enable-tui.  Although this can be enabled for any
configuration, at present it only works for native HP debugging.

* GDB remote protocol additions

A new protocol packet 'X' that writes binary data is now available.
Default behavior is to try 'X', then drop back to 'M' if the stub
fails to respond.  The settable variable `remotebinarydownload'
allows explicit control over the use of 'X'.

For 64-bit targets, the memory packets ('M' and 'm') can now contain a
full 64-bit address.  The command

	set remoteaddresssize 32

can be used to revert to the old behaviour.  For existing remote stubs
the change should not be noticed, as the additional address information
will be discarded.

In order to assist in debugging stubs, you may use the maintenance
command `packet' to send any text string to the stub.  For instance,

	maint packet heythere

sends the packet "$heythere#<checksum>".  Note that it is very easy to
disrupt a debugging session by sending the wrong packet at the wrong
time.

The compare-sections command allows you to compare section data on the
target to what is in the executable file without uploading or
downloading, by comparing CRC checksums.

* Tracing can collect general expressions

You may now collect general expressions at tracepoints.  This requires
further additions to the target-side stub; see tracepoint.c and
doc/agentexpr.texi for further details.

* mask-address variable for Mips

For Mips targets, you may control the zeroing of the upper 32 bits of
a 64-bit address by entering `set mask-address on'.  This is mainly
of interest to users of embedded R4xxx and R5xxx processors.

* Higher serial baud rates

GDB's serial code now allows you to specify baud rates 57600, 115200,
230400, and 460800 baud.  (Note that your host system may not be able
to achieve all of these rates.)

* i960 simulator

The i960 configuration now includes an initial implementation of a
builtin simulator, contributed by Jim Wilson.


*** Changes in GDB-4.17:

* New native configurations

Alpha GNU/Linux					alpha*-*-linux*
Unixware 2.x					i[3456]86-unixware2*
Irix 6.x					mips*-sgi-irix6*
PowerPC GNU/Linux				powerpc-*-linux*
PowerPC Solaris					powerpcle-*-solaris*
Sparc GNU/Linux					sparc-*-linux*
Motorola sysV68 R3V7.1				m68k-motorola-sysv

* New targets

Argonaut Risc Chip (ARC)			arc-*-*
Hitachi H8/300S					h8300*-*-*
Matsushita MN10200 w/simulator			mn10200-*-*
Matsushita MN10300 w/simulator			mn10300-*-*
MIPS NEC VR4100					mips64*vr4100*{,el}-*-elf*
MIPS NEC VR5000					mips64*vr5000*{,el}-*-elf*
MIPS Toshiba TX39				mips64*tx39*{,el}-*-elf*
Mitsubishi D10V w/simulator			d10v-*-*
Mitsubishi M32R/D w/simulator			m32r-*-elf*
Tsqware Sparclet				sparclet-*-*
NEC V850 w/simulator				v850-*-*

* New debugging protocols

ARM with RDI protocol				arm*-*-*
M68K with dBUG monitor				m68*-*-{aout,coff,elf}
DDB and LSI variants of PMON protocol		mips*-*-*
PowerPC with DINK32 monitor			powerpc{,le}-*-eabi
PowerPC with SDS protocol			powerpc{,le}-*-eabi
Macraigor OCD (Wiggler) devices			powerpc{,le}-*-eabi

* DWARF 2

All configurations can now understand and use the DWARF 2 debugging
format.  The choice is automatic, if the symbol file contains DWARF 2
information.

* Java frontend

GDB now includes basic Java language support.  This support is
only useful with Java compilers that produce native machine code.

* solib-absolute-prefix and solib-search-path

For SunOS and SVR4 shared libraries, you may now set the prefix for
loading absolute shared library symbol files, and the search path for
locating non-absolute shared library symbol files.

* Live range splitting

GDB can now effectively debug code for which GCC has performed live
range splitting as part of its optimization.  See gdb/doc/LRS for
more details on the expected format of the stabs information.

* Hurd support

GDB's support for the GNU Hurd, including thread debugging, has been
updated to work with current versions of the Hurd.

* ARM Thumb support

GDB's ARM target configuration now handles the ARM7T (Thumb) 16-bit
instruction set.  ARM GDB automatically detects when Thumb
instructions are in use, and adjusts disassembly and backtracing
accordingly.

* MIPS16 support

GDB's MIPS target configurations now handle the MIP16 16-bit
instruction set.

* Overlay support

GDB now includes support for overlays; if an executable has been
linked such that multiple sections are based at the same address, GDB
will decide which section to use for symbolic info.  You can choose to
control the decision manually, using overlay commands, or implement
additional target-side support and use "overlay load-target" to bring
in the overlay mapping.  Do "help overlay" for more detail.

* info symbol

The command "info symbol <address>" displays information about
the symbol at the specified address.

* Trace support

The standard remote protocol now includes an extension that allows
asynchronous collection and display of trace data.  This requires
extensive support in the target-side debugging stub.  Tracing mode
includes a new interaction mode in GDB and new commands: see the
file tracepoint.c for more details.

* MIPS simulator

Configurations for embedded MIPS now include a simulator contributed
by Cygnus Solutions.  The simulator supports the instruction sets
of most MIPS variants.

* Sparc simulator

Sparc configurations may now include the ERC32 simulator contributed
by the European Space Agency.  The simulator is not built into
Sparc targets by default; configure with --enable-sim to include it.

* set architecture

For target configurations that may include multiple variants of a
basic architecture (such as MIPS and SH), you may now set the
architecture explicitly.  "set arch" sets, "info arch" lists
the possible architectures.

*** Changes in GDB-4.16:

* New native configurations

Windows 95, x86 Windows NT			i[345]86-*-cygwin32
M68K NetBSD					m68k-*-netbsd*
PowerPC AIX 4.x					powerpc-*-aix*
PowerPC MacOS					powerpc-*-macos*
PowerPC Windows NT				powerpcle-*-cygwin32
RS/6000 AIX 4.x					rs6000-*-aix4*

* New targets

ARM with RDP protocol				arm-*-*
I960 with MON960				i960-*-coff
MIPS VxWorks					mips*-*-vxworks*
MIPS VR4300 with PMON				mips64*vr4300{,el}-*-elf*
PowerPC with PPCBUG monitor			powerpc{,le}-*-eabi*
Hitachi SH3					sh-*-*
Matra Sparclet					sparclet-*-*

* PowerPC simulator

The powerpc-eabi configuration now includes the PSIM simulator,
contributed by Andrew Cagney, with assistance from Mike Meissner.
PSIM is a very elaborate model of the PowerPC, including not only
basic instruction set execution, but also details of execution unit
performance and I/O hardware.  See sim/ppc/README for more details.

* Solaris 2.5

GDB now works with Solaris 2.5.

* Windows 95/NT native

GDB will now work as a native debugger on Windows 95 and Windows NT.
To build it from source, you must use the "gnu-win32" environment,
which uses a DLL to emulate enough of Unix to run the GNU tools.
Further information, binaries, and sources are available at
ftp.cygnus.com, under pub/gnu-win32.

* dont-repeat command

If a user-defined command includes the command `dont-repeat', then the
command will not be repeated if the user just types return.  This is
useful if the command is time-consuming to run, so that accidental
extra keystrokes don't run the same command many times.

* Send break instead of ^C

The standard remote protocol now includes an option to send a break
rather than a ^C to the target in order to interrupt it.  By default,
GDB will send ^C; to send a break, set the variable `remotebreak' to 1.

* Remote protocol timeout

The standard remote protocol includes a new variable `remotetimeout'
that allows you to set the number of seconds before GDB gives up trying
to read from the target.  The default value is 2.

* Automatic tracking of dynamic object loading (HPUX and Solaris only)

By default GDB will automatically keep track of objects as they are
loaded and unloaded by the dynamic linker.  By using the command `set
stop-on-solib-events 1' you can arrange for GDB to stop the inferior
when shared library events occur, thus allowing you to set breakpoints
in shared libraries which are explicitly loaded by the inferior.

Note this feature does not work on hpux8.  On hpux9 you must link
/usr/lib/end.o into your program.  This feature should work
automatically on hpux10.

* Irix 5.x hardware watchpoint support

Irix 5 configurations now support the use of hardware watchpoints.

* Mips protocol "SYN garbage limit"

When debugging a Mips target using the `target mips' protocol, you
may set the number of characters that GDB will ignore by setting
the `syn-garbage-limit'.  A value of -1 means that GDB will ignore
every character.  The default value is 1050.

* Recording and replaying remote debug sessions

If you set `remotelogfile' to the name of a file, gdb will write to it
a recording of a remote debug session.  This recording may then be
replayed back to gdb using "gdbreplay".  See gdbserver/README for
details.  This is useful when you have a problem with GDB while doing
remote debugging; you can make a recording of the session and send it
to someone else, who can then recreate the problem.

* Speedups for remote debugging

GDB includes speedups for downloading and stepping MIPS systems using
the IDT monitor, fast downloads to the Hitachi SH E7000 emulator,
and more efficient S-record downloading.

* Memory use reductions and statistics collection

GDB now uses less memory and reports statistics about memory usage.
Try the `maint print statistics' command, for example.

*** Changes in GDB-4.15:

* Psymtabs for XCOFF

The symbol reader for AIX GDB now uses partial symbol tables.  This
can greatly improve startup time, especially for large executables.

* Remote targets use caching

Remote targets now use a data cache to speed up communication with the
remote side.  The data cache could lead to incorrect results because
it doesn't know about volatile variables, thus making it impossible to
debug targets which use memory mapped I/O devices. `set remotecache
off' turns the 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 Linux.
 
* Annotations

Annotations have been added.  These are for use with graphical interfaces,
and are still experimental.  Currently only gdba.el uses these.

* Improved Irix 5 support

GDB now works properly with Irix 5.2.

* Improved HPPA support

GDB now works properly with the latest GCC and GAS.

* New native configurations

Sequent PTX4				i[34]86-sequent-ptx4
HPPA running OSF/1			hppa*-*-osf*
Atari TT running SVR4			m68*-*-sysv4*
RS/6000 LynxOS				rs6000-*-lynxos*

* New targets

OS/9000					i[34]86-*-os9k
MIPS R4000				mips64*{,el}-*-{ecoff,elf}
Sparc64					sparc64-*-*

* Hitachi SH7000 and E7000-PC ICE support

There is now support for communicating with the Hitachi E7000-PC ICE.
This is available automatically when GDB is configured for the SH.

* Fixes

As usual, a variety of small fixes and improvements, both generic
and configuration-specific.  See the ChangeLog for more detail.

*** Changes in GDB-4.12:

* Irix 5 is now supported

* HPPA support

GDB-4.12 on the HPPA has a number of changes which make it unable
to debug the output from the currently released versions of GCC and
GAS (GCC 2.5.8 and GAS-2.2 or PAGAS-1.36).  Until the next major release
of GCC and GAS, versions of these tools designed to work with GDB-4.12
can be retrieved via anonymous ftp from jaguar.cs.utah.edu:/dist.


*** Changes in GDB-4.11:

* User visible changes:

* Remote Debugging

The "set remotedebug" option is now consistent between the mips remote
target, remote targets using the gdb-specific protocol, UDI (AMD's
debug protocol for the 29k) and the 88k bug monitor.  It is now an
integer specifying a debug level (normally 0 or 1, but 2 means more
debugging info for the mips target).

* DEC Alpha native support

GDB now works on the DEC Alpha.  GCC 2.4.5 does not produce usable
debug info, but GDB works fairly well with the DEC compiler and should
work with a future GCC release.  See the README file for a few
Alpha-specific notes.

* Preliminary thread implementation

GDB now has preliminary thread support for both SGI/Irix and LynxOS.

* LynxOS native and target support for 386

This release has been hosted on LynxOS 2.2, and also can be configured
to remotely debug programs running under LynxOS (see gdb/gdbserver/README
for details).

* Improvements in C++ mangling/demangling.

This release has much better g++ debugging, specifically in name 
mangling/demangling, virtual function calls, print virtual table,
call methods, ...etc.

*** Changes in GDB-4.10:

 * User visible changes:

Remote debugging using the GDB-specific (`target remote') protocol now
supports the `load' command.  This is only useful if you have some
other way of getting the stub to the target system, and you can put it
somewhere in memory where it won't get clobbered by the download.

Filename completion now works.

When run under emacs mode, the "info line" command now causes the
arrow to point to the line specified.  Also, "info line" prints
addresses in symbolic form (as well as hex).

All vxworks based targets now support a user settable option, called
vxworks-timeout.  This option represents the number of seconds gdb
should wait for responses to rpc's.  You might want to use this if
your vxworks target is, perhaps, a slow software simulator or happens
to be on the far side of a thin network line.

 * DEC alpha support

This release contains support for using a DEC alpha as a GDB host for
cross debugging.  Native alpha debugging is not supported yet.


*** Changes in GDB-4.9:

 * Testsuite

This is the first GDB release which is accompanied by a matching testsuite.
The testsuite requires installation of dejagnu, which should be available
via ftp from most sites that carry GNU software.

 * C++ demangling

'Cfront' style demangling has had its name changed to 'ARM' style, to
emphasize that it was written from the specifications in the C++ Annotated
Reference Manual, not necessarily to be compatible with AT&T cfront.  Despite
disclaimers, it still generated too much confusion with users attempting to
use gdb with AT&T cfront.

 * Simulators

GDB now uses a standard remote interface to a simulator library.
So far, the library contains simulators for the Zilog Z8001/2, the
Hitachi H8/300, H8/500 and Super-H.

 * New targets supported

H8/300 simulator 			h8300-hitachi-hms or h8300hms
H8/500 simulator 			h8500-hitachi-hms or h8500hms
SH simulator				sh-hitachi-hms    or sh
Z8000 simulator		  		z8k-zilog-none 	  or z8ksim
IDT MIPS board over serial line		mips-idt-ecoff

Cross-debugging to GO32 targets is supported.  It requires a custom
version of the i386-stub.c module which is integrated with the 
GO32 memory extender.

 * New remote protocols

MIPS remote debugging protocol.

 * New source languages supported

This version includes preliminary support for Chill, a Pascal like language
used by telecommunications companies.  Chill support is also being integrated
into the GNU compiler, but we don't know when it will be publically available.


*** Changes in GDB-4.8:

 * HP Precision Architecture supported

GDB now supports HP PA-RISC machines running HPUX.  A preliminary
version of this support was available as a set of patches from the
University of Utah.  GDB does not support debugging of programs
compiled with the HP compiler, because HP will not document their file
format.  Instead, you must use GCC (version 2.3.2 or later) and PA-GAS
(as available from jaguar.cs.utah.edu:/dist/pa-gas.u4.tar.Z).

Many problems in the preliminary version have been fixed.

 * Faster and better demangling

We have improved template demangling and fixed numerous bugs in the GNU style
demangler.  It can now handle type modifiers such as `static' or `const'.  Wide
character types (wchar_t) are now supported.  Demangling of each symbol is now
only done once, and is cached when the symbol table for a file is read in.
This results in a small increase in memory usage for C programs, a moderate
increase in memory usage for C++ programs, and a fantastic speedup in
symbol lookups.

`Cfront' style demangling still doesn't work with AT&T cfront.  It was written
from the specifications in the Annotated Reference Manual, which AT&T's
compiler does not actually implement.

 * G++ multiple inheritance compiler problem

In the 2.3.2 release of gcc/g++, how the compiler resolves multiple
inheritance lattices was reworked to properly discover ambiguities.  We
recently found an example which causes this new algorithm to fail in a
very subtle way, producing bad debug information for those classes.
The file 'gcc.patch' (in this directory) can be applied to gcc to
circumvent the problem.  A future GCC release will contain a complete
fix.

The previous G++ debug info problem (mentioned below for the gdb-4.7
release) is fixed in gcc version 2.3.2.

 * Improved configure script

The `configure' script will now attempt to guess your system type if
you don't supply a host system type.  The old scheme of supplying a
host system triplet is preferable over using this.  All the magic is
done in the new `config.guess' script.  Examine it for details.

We have also brought our configure script much more in line with the FSF's
version.  It now supports the --with-xxx options.  In particular,
`--with-minimal-bfd' can be used to make the GDB binary image smaller.
The resulting GDB will not be able to read arbitrary object file formats --
only the format ``expected'' to be used on the configured target system.
We hope to make this the default in a future release.

 * Documentation improvements

There's new internal documentation on how to modify GDB, and how to
produce clean changes to the code.  We implore people to read it
before submitting changes.

The GDB manual uses new, sexy Texinfo conditionals, rather than arcane
M4 macros.  The new texinfo.tex is provided in this release.  Pre-built
`info' files are also provided.  To build `info' files from scratch,
you will need the latest `makeinfo' release, which will be available in
a future texinfo-X.Y release.

*NOTE*  The new texinfo.tex can cause old versions of TeX to hang.
We're not sure exactly which versions have this problem, but it has
been seen in 3.0.  We highly recommend upgrading to TeX version 3.141
or better.  If that isn't possible, there is a patch in
`texinfo/tex3patch' that will modify `texinfo/texinfo.tex' to work
around this problem.

 * New features

GDB now supports array constants that can be used in expressions typed in by
the user.  The syntax is `{element, element, ...}'.  Ie: you can now type
`print {1, 2, 3}', and it will build up an array in memory malloc'd in
the target program.

The new directory `gdb/sparclite' contains a program that demonstrates
how the sparc-stub.c remote stub runs on a Fujitsu SPARClite processor.

 * New native hosts supported

HP/PA-RISC under HPUX using GNU tools	hppa1.1-hp-hpux
386 CPUs running SCO Unix 3.2v4		i386-unknown-sco3.2v4

 * New targets supported

AMD 29k family via UDI			a29k-amd-udi  or  udi29k

 * New file formats supported

BFD now supports reading HP/PA-RISC executables (SOM file format?),
HPUX core files, and SCO 3.2v2 core files.

 * Major bug fixes

Attaching to processes now works again; thanks for the many bug reports.

We have also stomped on a bunch of core dumps caused by
printf_filtered("%s") problems.

We eliminated a copyright problem on the rpc and ptrace header files
for VxWorks, which was discovered at the last minute during the 4.7
release.  You should now be able to build a VxWorks GDB.

You can now interrupt gdb while an attached process is running.  This
will cause the attached process to stop, and give control back to GDB.

We fixed problems caused by using too many file descriptors
for reading symbols from object files and libraries.  This was
especially a problem for programs that used many (~100) shared
libraries.

The `step' command now only enters a subroutine if there is line number
information for the subroutine.  Otherwise it acts like the `next'
command.  Previously, `step' would enter subroutines if there was
any debugging information about the routine.  This avoids problems
when using `cc -g1' on MIPS machines.

 * Internal improvements

GDB's internal interfaces have been improved to make it easier to support
debugging of multiple languages in the future.

GDB now uses a common structure for symbol information internally.
Minimal symbols (derived from linkage symbols in object files), partial
symbols (from a quick scan of debug information), and full symbols
contain a common subset of information, making it easier to write
shared code that handles any of them.

 * New command line options

We now accept --silent as an alias for --quiet.

 * Mmalloc licensing

The memory-mapped-malloc library is now licensed under the GNU Library
General Public License.

*** Changes in GDB-4.7:

 * Host/native/target split

GDB has had some major internal surgery to untangle the support for
hosts and remote targets.  Now, when you configure GDB for a remote
target, it will no longer load in all of the support for debugging
local programs on the host.  When fully completed and tested, this will
ensure that arbitrary host/target combinations are possible.

The primary conceptual shift is to separate the non-portable code in
GDB into three categories.  Host specific code is required any time GDB
is compiled on that host, regardless of the target.  Target specific
code relates to the peculiarities of the target, but can be compiled on
any host.  Native specific code is everything else:  it can only be
built when the host and target are the same system.  Child process
handling and core file support are two common `native' examples.

GDB's use of /proc for controlling Unix child processes is now cleaner.
It has been split out into a single module under the `target_ops' vector,
plus two native-dependent functions for each system that uses /proc.

 * New hosts supported

HP/Apollo 68k (under the BSD domain)	m68k-apollo-bsd  or  apollo68bsd
386 CPUs running various BSD ports	i386-unknown-bsd  or  386bsd
386 CPUs running SCO Unix		i386-unknown-scosysv322  or  i386sco

 * New targets supported

Fujitsu SPARClite 			sparclite-fujitsu-none  or  sparclite
68030 and CPU32				m68030-*-*, m68332-*-*

 * New native hosts supported

386 CPUs running various BSD ports	i386-unknown-bsd  or  386bsd
    (386bsd is not well tested yet)
386 CPUs running SCO Unix		i386-unknown-scosysv322  or  sco

 * New file formats supported

BFD now supports COFF files for the Zilog Z8000 microprocessor.  It
supports reading of `a.out.adobe' object files, which are an a.out
format extended with minimal information about multiple sections.

 * New commands

`show copying' is the same as the old `info copying'.
`show warranty' is the same as `info warrantee'.
These were renamed for consistency.  The old commands continue to work.

`info handle' is a new alias for `info signals'.

You can now define pre-command hooks, which attach arbitrary command
scripts to any command.  The commands in the hook will be executed
prior to the user's command.  You can also create a hook which will be
executed whenever the program stops.  See gdb.texinfo.

 * C++ improvements

We now deal with Cfront style name mangling, and can even extract type
info from mangled symbols.  GDB can automatically figure out which
symbol mangling style your C++ compiler uses.

Calling of methods and virtual functions has been improved as well.

 * Major bug fixes

The crash that occured 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 compling 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

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 mutiple heaps of memory.  It is also
capable of saving a heap to a file, and then mapping it back in later.
This can be used to greatly speedup the startup of GDB by using a
pre-parsed symbol table which lives in a mmalloc managed heap.  For
more details, please read mmalloc/mmalloc.texi.

 * info proc

The 'info proc' command (SVR4 only) has been enhanced quite a bit.  See
'help info proc' for details.

 * MIPS ecoff symbol table format

The code that reads MIPS symbol table format is now supported on all hosts.
Thanks to MIPS for releasing the sym.h and symconst.h files to make this
possible.

 * File name changes for MS-DOS

Many files in the config directories have been renamed to make it easier to
support GDB on MS-DOSe systems (which have very restrictive file name
conventions :-( ).  MS-DOSe host support (under DJ Delorie's GO32
environment) is close to working but has some remaining problems.  Note
that debugging of DOS programs is not supported, due to limitations
in the ``operating system'', but it can be used to host cross-debugging.

 * Cross byte order fixes

Many fixes have been made to support cross debugging of Sparc and MIPS
targets from hosts whose byte order differs.

 * New -mapped and -readnow options

If memory-mapped files are available on your system through the 'mmap'
system call, you can use the -mapped option on the `file' or
`symbol-file' commands to cause GDB to write the symbols from your
program into a reusable file.  If the program you are debugging is
called `/path/fred', the mapped symbol file will be `./fred.syms'.
Future GDB debugging sessions will notice the presence of this file,
and will quickly map in symbol information from it, rather than reading
the symbol table from the executable program.  Using the '-mapped'
option in a GDB `file' or `symbol-file' command has the same effect as
starting GDB with the '-mapped' command-line option.

You can cause GDB to read the entire symbol table immediately by using
the '-readnow' option with any of the commands that load symbol table
information (or on the GDB command line).  This makes the command
slower, but makes future operations faster.

The -mapped and -readnow options are typically combined in order to
build a `fred.syms' file that contains complete symbol information.
A simple GDB invocation to do nothing but build a `.syms' file for future
use is:

	gdb -batch -nx -mapped -readnow programname

The `.syms' file is specific to the host machine on which GDB is run.
It holds an exact image of GDB's internal symbol table.  It cannot be
shared across multiple host platforms.

 * longjmp() handling

GDB is now capable of stepping and nexting over longjmp(), _longjmp(), and
siglongjmp() without losing control.  This feature has not yet been ported to
all systems.  It currently works on many 386 platforms, all MIPS-based
platforms (SGI, DECstation, etc), and Sun3/4.

 * Solaris 2.0

Preliminary work has been put in to support the new Solaris OS from Sun.  At
this time, it can control and debug processes, but it is not capable of
reading symbols.

 * Bug fixes

As always, many many bug fixes.  The major areas were with g++, and mipsread.
People using the MIPS-based platforms should experience fewer mysterious
crashes and trashed symbol tables.

*** Changes in GDB-4.4:

 * New machines supported (host and target)

SCO Unix on i386 IBM PC clones		i386-sco-sysv	or  i386sco
	(except core files)
BSD Reno on Vax				vax-dec-bsd
Ultrix on Vax				vax-dec-ultrix

 * New machines supported (target)

AMD 29000 embedded, using EBMON		a29k-none-none

 * C++ support

GDB continues to improve its handling of C++.  `References' work better.
The demangler has also been improved, and now deals with symbols mangled as
per the Annotated C++ Reference Guide.

GDB also now handles `stabs' symbol information embedded in MIPS
`ecoff' symbol tables.  Since the ecoff format was not easily
extensible to handle new languages such as C++, this appeared to be a
good way to put C++ debugging info into MIPS binaries.  This option
will be supported in the GNU C compiler, version 2, when it is
released.

 * New features for SVR4

GDB now handles SVR4 shared libraries, in the same fashion as SunOS
shared libraries.  Debugging dynamically linked programs should present
only minor differences from debugging statically linked programs.

The `info proc' command will print out information about any process
on an SVR4 system (including the one you are debugging).  At the moment,
it prints the address mappings of the process.

If you bring up GDB on another SVR4 system, please send mail to
bug-gdb@prep.ai.mit.edu to let us know what changes were reqired (if any).

 * Better dynamic linking support in SunOS

Reading symbols from shared libraries which contain debugging symbols
now works properly.  However, there remain issues such as automatic
skipping of `transfer vector' code during function calls, which
make it harder to debug code in a shared library, than to debug the
same code linked statically.

 * New Getopt

GDB is now using the latest `getopt' routines from the FSF.  This
version accepts the -- prefix for options with long names.  GDB will
continue to accept the old forms (-option and +option) as well.
Various single letter abbreviations for options have been explicity
added to the option table so that they won't get overshadowed in the
future by other options that begin with the same letter.

 * Bugs fixed

The `cleanup_undefined_types' bug that many of you noticed has been squashed.
Many assorted bugs have been handled.  Many more remain to be handled.
See the various ChangeLog files (primarily in gdb and bfd) for details.


*** Changes in GDB-4.3:

 * New machines supported (host and target)

Amiga 3000 running Amix			m68k-cbm-svr4	or  amix
NCR 3000 386 running SVR4		i386-ncr-svr4	or  ncr3000
Motorola Delta 88000 running Sys V	m88k-motorola-sysv  or  delta88

 * Almost SCO Unix support

We had hoped to support:
SCO Unix on i386 IBM PC clones		i386-sco-sysv	or  i386sco
(except for core file support), but we discovered very late in the release
that it has problems with process groups that render gdb unusable.  Sorry
about that.  I encourage people to fix it and post the fixes.

 * Preliminary ELF and DWARF support

GDB can read ELF object files on System V Release 4, and can handle
debugging records for C, in DWARF format, in ELF files.  This support
is preliminary.  If you bring up GDB on another SVR4 system, please
send mail to bug-gdb@prep.ai.mit.edu to let us know what changes were
reqired (if any).

 * New Readline

GDB now uses the latest `readline' library.  One user-visible change
is that two tabs will list possible command completions, which previously
required typing M-? (meta-question mark, or ESC ?).

 * Bugs fixed

The `stepi' bug that many of you noticed has been squashed.
Many bugs in C++ have been handled.  Many more remain to be handled.
See the various ChangeLog files (primarily in gdb and bfd) for details.

 * State of the MIPS world (in case you wondered):

GDB can understand the symbol tables emitted by the compilers
supplied by most vendors of MIPS-based machines, including DEC.  These
symbol tables are in a format that essentially nobody else uses.

Some versions of gcc come with an assembler post-processor called
mips-tfile.  This program is required if you want to do source-level
debugging of gcc-compiled programs.  I believe FSF does not ship
mips-tfile with gcc version 1, but it will eventually come with gcc
version 2.

Debugging of g++ output remains a problem.  g++ version 1.xx does not
really support it at all.  (If you're lucky, you should be able to get
line numbers and stack traces to work, but no parameters or local
variables.)  With some work it should be possible to improve the
situation somewhat.

When gcc version 2 is released, you will have somewhat better luck.
However, even then you will get confusing results for inheritance and
methods.

We will eventually provide full debugging of g++ output on
DECstations.  This will probably involve some kind of stabs-in-ecoff
encapulation, but the details have not been worked out yet.


*** Changes in GDB-4.2:

 *  Improved configuration

Only one copy of `configure' exists now, and it is not self-modifying.
Porting BFD is simpler.  

 *  Stepping improved

The `step' and `next' commands now only stop at the first instruction
of a source line.  This prevents the multiple stops that used to occur
in switch statements, for-loops, etc.  `Step' continues to stop if a
function that has debugging information is called within the line.

 *  Bug fixing

Lots of small bugs fixed.  More remain.

 *  New host supported (not target)

Intel 386 PC clone running Mach		i386-none-mach


*** Changes in GDB-4.1:

 *  Multiple source language support

GDB now has internal scaffolding to handle several source languages.
It determines the type of each source file from its filename extension,
and will switch expression parsing and number formatting to match the
language of the function in the currently selected stack frame.
You can also specifically set the language to be used, with
`set language c' or `set language modula-2'.

 *  GDB and Modula-2

GDB now has preliminary support for the GNU Modula-2 compiler,
currently under development at the State University of New York at
Buffalo.  Development of both GDB and the GNU Modula-2 compiler will
continue through the fall of 1991 and into 1992.

Other Modula-2 compilers are currently not supported, and attempting to
debug programs compiled with them will likely result in an error as the
symbol table is read.  Feel free to work on it, though!

There are hooks in GDB for strict type checking and range checking,
in the `Modula-2 philosophy', but they do not currently work.

 * set write on/off

GDB can now write to executable and core files (e.g. patch
a variable's value).   You must turn this switch on, specify
the file ("exec foo" or "core foo"), *then* modify it, e.g.
by assigning a new value to a variable.  Modifications take
effect immediately.

 * Automatic SunOS shared library reading

When you run your program, GDB automatically determines where its
shared libraries (if any) have been loaded, and reads their symbols.
The `share' command is no longer needed.  This also works when
examining core files.

 * set listsize

You can specify the number of lines that the `list' command shows.
The default is 10.

 * New machines supported (host and target)

SGI Iris (MIPS) running Irix V3:  	mips-sgi-irix   or  iris
Sony NEWS (68K) running NEWSOS 3.x:	m68k-sony-sysv	or  news
Ultracomputer (29K) running Sym1:	a29k-nyu-sym1	or  ultra3

 * New hosts supported (not targets)

IBM RT/PC:				romp-ibm-aix 	or  rtpc

 * New targets supported (not hosts)

AMD 29000 embedded with COFF		a29k-none-coff
AMD 29000 embedded with a.out		a29k-none-aout
Ultracomputer remote kernel debug	a29k-nyu-kern

 * New remote interfaces

AMD 29000 Adapt
AMD 29000 Minimon


*** Changes in GDB-4.0:

 *  New Facilities

Wide output is wrapped at good places to make the output more readable.

Gdb now supports cross-debugging from a host machine of one type to a
target machine of another type.  Communication with the target system
is over serial lines.  The ``target'' command handles connecting to the
remote system; the ``load'' command will download a program into the
remote system.  Serial stubs for the m68k and i386 are provided.  Gdb
also supports debugging of realtime processes running under VxWorks,
using SunRPC Remote Procedure Calls over TCP/IP to talk to a debugger
stub on the target system.

New CPUs supported include the AMD 29000 and Intel 960.

GDB now reads object files and symbol tables via a ``binary file'' 
library, which allows a single copy of GDB to debug programs of multiple
object file types such as a.out and coff.

There is now a GDB reference card in "doc/refcard.tex".  (Make targets
refcard.dvi and refcard.ps are available to format it).


 *  Control-Variable user interface simplified

All variables that control the operation of the debugger can be set
by the ``set'' command, and displayed by the ``show'' command.

For example, ``set prompt new-gdb=>'' will change your prompt to new-gdb=>.
``Show prompt'' produces the response:
Gdb's prompt is new-gdb=>.

What follows are the NEW set commands.  The command ``help set'' will
print a complete list of old and new set commands.  ``help set FOO''
will give a longer description of the variable FOO.  ``show'' will show
all of the variable descriptions and their current settings.

confirm on/off:  Enables warning questions for operations that are
		 hard to recover from, e.g. rerunning the program while
		 it is already running.  Default is ON.

editing on/off:  Enables EMACS style command line editing 
                 of input.  Previous lines can be recalled with 
		 control-P, the current line can be edited with control-B,
		 you can search for commands with control-R, etc.
		 Default is ON.

history filename NAME:  NAME is where the gdb command history 
			will be stored.  The default is .gdb_history,
			or the value of the environment variable
			GDBHISTFILE.

history size N:  The size, in commands, of the command history.  The 
		 default is 256, or the value of the environment variable
		 HISTSIZE.

history save on/off: If this value is set to ON, the history file will
		      be saved after exiting gdb.  If set to OFF, the 
		      file will not be saved.  The default is OFF.

history expansion on/off: If this value is set to ON, then csh-like 
			  history expansion will be performed  on 
			  command line input.  The default is OFF.

radix N:  Sets the default radix for input and output.  It can be set
	  to 8, 10, or 16.  Note that the argument to "radix" is interpreted
	  in the current radix, so "set radix 10" is always a no-op.

height N: This integer value is the number of lines on a page. Default
          is 24, the current `stty rows'' setting, or the ``li#''
	  setting from the termcap entry matching the environment
	  variable TERM.

width N:  This integer value is the number of characters on a line.
	  Default is 80, the current `stty cols'' setting, or the ``co#''
	  setting from the termcap entry matching the environment
	  variable TERM.

Note: ``set screensize'' is obsolete. Use ``set height'' and
``set width'' instead.

print address on/off:  Print memory addresses in various command displays,
		      such as stack traces and structure values.  Gdb looks
		      more ``symbolic'' if you turn this off; it looks more
		      ``machine level'' with it on.  Default is ON.

print array on/off:  Prettyprint arrays.  New convenient format!  Default 
                    is OFF.

print demangle on/off:   Print C++ symbols in "source" form if on,
			"raw" form if off.

print asm-demangle on/off:  Same, for assembler level printouts
			like instructions.

print vtbl on/off:  Prettyprint C++ virtual function tables.  Default is OFF.


 *  Support for Epoch Environment.

The epoch environment is a version of Emacs v18 with windowing.  One
new command, ``inspect'', is identical to ``print'', except that if you
are running in the epoch environment, the value is printed in its own
window.


 *  Support for Shared Libraries

GDB can now debug programs and core files that use SunOS shared libraries.
Symbols from a shared library cannot be referenced
before the shared library has been linked with the program (this
happens after you type ``run'' and before the function main() is entered).
At any time after this linking (including when examining core files
from dynamically linked programs), gdb reads the symbols from each
shared library when you type the ``sharedlibrary'' command.
It can be abbreviated ``share''.

sharedlibrary REGEXP:  Load shared object library symbols for files 
                       matching a unix regular expression.  No argument
		       indicates to load symbols for all shared libraries.

info sharedlibrary:  Status of loaded shared libraries.


 *  Watchpoints

A watchpoint stops execution of a program whenever the value of an
expression changes.  Checking for this slows down execution
tremendously whenever you are in the scope of the expression, but is
quite useful for catching tough ``bit-spreader'' or pointer misuse
problems.  Some machines such as the 386 have hardware for doing this
more quickly, and future versions of gdb will use this hardware.

watch EXP:  Set a watchpoint (breakpoint) for an expression.

info watchpoints:  Information about your watchpoints.

delete N:   Deletes watchpoint number N (same as breakpoints).
disable N:  Temporarily turns off watchpoint number N (same as breakpoints).
enable N:   Re-enables watchpoint number N (same as breakpoints).


 *  C++ multiple inheritance

When used with a GCC version 2 compiler, GDB supports multiple inheritance
for C++ programs.

 *  C++ exception handling

Gdb now supports limited C++ exception handling.  Besides the existing
ability to breakpoint on an exception handler, gdb can breakpoint on
the raising of an exception (before the stack is peeled back to the
handler's context).

catch FOO:  If there is a FOO exception handler in the dynamic scope,
	    set a breakpoint to catch exceptions which may be raised there.
	    Multiple exceptions (``catch foo bar baz'') may be caught.

info catch:  Lists all exceptions which may be caught in the
             current stack frame.


 *  Minor command changes

The command ``call func (arg, arg, ...)'' now acts like the print
command, except it does not print or save a value if the function's result
is void.  This is similar to dbx usage.

The ``up'' and ``down'' commands now always print the frame they end up
at; ``up-silently'' and `down-silently'' can be used in scripts to change
frames without printing.

 *  New directory command

'dir' now adds directories to the FRONT of the source search path.
The path starts off empty.  Source files that contain debug information
about the directory in which they were compiled can be found even
with an empty path; Sun CC and GCC include this information.  If GDB can't
find your source file in the current directory, type "dir .".

 * Configuring GDB for compilation

For normal use, type ``./configure host''.  See README or gdb.texinfo
for more details.

GDB now handles cross debugging.  If you are remotely debugging between 
two different machines, type ``./configure host -target=targ''.
Host is the machine where GDB will run; targ is the machine
where the program that you are debugging will run.
