DDD is a graphical front-end for GDB and other command-line debuggers.

This is the First Edition, 8 Feb, 2009, of `Debugging with DDD' for DDD
Version 3.3.12.

   Copyright (C) 2004 Universität des Saarlandes
Lehrstuhl Softwaretechnik
Postfach 15 11 50
66041 Saarbrücken
GERMANY

Distributed by
Free Software Foundation, Inc.
59 Temple Place - Suite 330
Boston, MA 02111-1307
USA

DDD and this manual are available via the DDD WWW page
(http://www.gnu.org/software/ddd/).

   Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1 or
any later version published by the Free Software Foundation; with no
Invariant Sections, no Front-Cover Texts and no Back-Cover Texts.  A
copy of the license is included in the section entitled "GNU Free
Documentation License".

   Send questions, comments, suggestions, etc. to <ddd@gnu.org>.
Submit bug reports at `http://savannah.gnu.org/bugs/?group=ddd', the
DDD bug tracker. Incoming bug reports are automatically copied to the
developers' mailing list <bug-ddd@gnu.org>.

7.4.8 Animating Plots
---------------------

If you want to see how your data evolves in time, you can set a
breakpoint whose command sequence ends in a `cont' command (see
Breakpoint Commands.  Each time this "continue" breakpoint is
reached, the program stops and DDD updates the displayed values,
including the plots.  Then, DDD executes the breakpoint command
sequence, resuming execution.

   This way, you can set a "continue" breakpoint at some decisive point
within an array-processing algorithm and have DDD display the progress
graphically.  When your program has stopped for good, you can use
`Undo' and `Redo' to redisplay and examine previous program states.
See Undoing Program Execution, for details.

7.4.9 Customizing Plots
-----------------------

You can customize the Gnuplot program to invoke, as well as a number of
basic settings.

7.4.9.1 Gnuplot Invocation
..........................

Using `Edit => Preferences => Helpers => Plot', you can choose the
Gnuplot program to invoke.  This is tied to the following resource:

 -- Resource: plotCommand (class PlotCommand)
     The name of a Gnuplot executable.  Default is `gnuplot', followed
     by some options to set up colors and the initial geometry.

   Using `Edit => Preferences => Helpers => Plot Window', you can
choose whether to use the Gnuplot plot window (`External') or to use
the plot window supplied by DDD (`builtin').  This is tied to the
following resource:

 -- Resource: plotTermType (class PlotTermType)
     The Gnuplot terminal type.  Can have one of two values:
        * If this is `x11', DDD "swallows" the _external_ Gnuplot
          output window into its own user interface.  Some window
          managers, notably `mwm', have trouble with swallowing
          techniques.

        * Setting this resource to `xlib' (default) makes DDD provide a
          _builtin plot window_ instead.  In this mode, plots work well
          with any window manager, but are less customizable (Gnuplot
          resources are not understood).

   You can further control interaction with the external plot window:

 -- Resource: plotWindowClass (class PlotWindowClass)
     The class of the Gnuplot output window.  When invoking Gnuplot,
     DDD waits for a window with this class and incorporates it into
     its own user interface (unless `plotTermType' is `xlib'; see
     above).  Default is `Gnuplot'.

 -- Resource: plotWindowDelay (class WindowDelay)
     The time (in ms) to wait for the creation of the Gnuplot window.
     Before this delay, DDD looks at each newly created window to see
     whether this is the plot window to swallow.  This is cheap, but
     unfortunately, some window managers do not pass the creation event
     to DDD.  If this delay has passed, and DDD has not found the plot
     window, DDD searches _all_ existing windows, which is pretty
     expensive.  Default time is `2000'.

7.4.9.2 Gnuplot Settings
........................

To change Gnuplot settings, use these resources:

 -- Resource: plotInitCommands (class PlotInitCommands)
     The initial Gnuplot commands issued by DDD.  Default is:

          set parametric
          set urange [0:1]
          set vrange [0:1]
          set trange [0:1]

     The `parametric' setting is required to make Gnuplot understand the
     data files as generated DDD.  The range commands are used to plot
     scalars.

   See the Gnuplot documentation for additional commands.

 -- Resource: plot2dSettings (class PlotSettings)
     Additional initial settings for 2-D plots.  Default is `set
     noborder'.  Feel free to customize these settings as desired.

 -- Resource: plot3dSettings (class PlotSettings)
     Additional initial settings for 3-D plots.  Default is `set
     border'.  Feel free to customize these settings as desired.

7.5 Examining Memory
====================

Using GDB or DBX, you can examine memory in any of several formats,
independently of your program's data types.  The item `Data => Memory'
pops up a panel where you can choose the format to be shown.

   In the panel, you can enter

   * a "repeat count", a decimal integer that specifies how much memory
     (counting by units) to display

   * a "display format"--one of

    `octal'
          Print as integer in octal

    `hex'
          Regard the bits of the value as an integer, and print the
          integer in hexadecimal.

    `decimal'
          Print as integer in signed decimal.

    `unsigned'
          Print as integer in unsigned decimal.

    `binary'
          Print as integer in binary.

    `float'
          Regard the bits of the value as a floating point number and
          print using typical floating point syntax.

    `address'
          Print as an address, both absolute in hexadecimal and as an
          offset from the nearest preceding symbol.

    `instruction'
          Print as machine instructions.  The unit size is ignored for
          this display format.

    `char'
          Regard as an integer and print it as a character constant.

    `string'
          Print as null-terminated string.  The unit size is ignored
          for this display format.

   * a "unit size"--one of

    `bytes'
          Bytes.

    `halfwords'
          Halfwords (two bytes).

    `words'
          Words (four bytes).

    `giants'
          Giant words (eight bytes).

   * an "address"--the starting display address.  The expression need
     not have a pointer value (though it may); it is always interpreted
     as an integer address of a byte of memory.

   There are two ways to examine the values:

   * You can dump the memory in the debugger console (using `Print').
     If you repeat the resulting `x' command by pressing <Return> in
     the debugger console (see Command History), the following area
     of memory is shown.

   * You can also display the memory dump in the data window (using
     `Display').  If you choose to display the values, the values will
     be updated automatically each time the program stop.

8 Machine-Level Debugging
*************************

Sometimes, it is desirable to examine a program not only at the source
level, but also at the machine level.  DDD provides special machine
code and register windows for this task.

8.1 Examining Machine Code
==========================

To enable machine-level support, select `Source => Display Machine
Code'.  With machine code enabled, an additional _machine code window_
shows up, displaying the machine code of the current function.(1)  By
moving the sash at the right of the separating line between source and
machine code, you can resize the source and machine code windows.

   The machine code window works very much like the source window.  You
can set, clear, and change breakpoints by selecting the address and
pressing a `Break' or `Clear' button; the usual popup menus are also
available.  Breakpoints and the current execution position are displayed
simultaneously in both source and machine code.

   The `Lookup' button can be used to look up the machine code for a
specific function--or the function for a specific address.  Just click
on the location in one window and press `Lookup' to see the
corresponding code in the other window.

   If source code is not available, only the machine code window is
updated.

   You can customize various aspects of the disassembling window.
See Customizing Machine Code, for details.

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

   (1) The machine code window is available with GDB and some DBX
variants only.

8.2 Machine Code Execution
==========================

All execution facilities available in the source code window are
available in the machine code window as well.  Two special facilities
are convenient for machine-level debugging:

   To execute just one machine instruction, click on the `Stepi' button
or select `Program => Step Instruction'.

   To continue to the next instruction in the current function, click on
the `Nexti' button select `Program => Next Instruction'..  This is
similar to `Stepi', but any subroutine calls are executed without
stopping.

   Using GDB, it is often useful to do

     graph display /i $pc

when stepping by machine instructions.  This makes DDD automatically
display the next instruction to be executed, each time your program
stops.

8.3 Examining Registers
=======================

DDD provides a _register window_ showing the machine register values
after each program stop.  To enable the register window, select `Status
=> Registers'.(1)

   By selecting one of the registers, its name is copied to the argument
field.  You can use it as value for `Display', for instance, to have
its value displayed in the data window.

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

   (1) The machine code window is available with GDB and some DBX
variants only.

8.4 Customizing Machine Code
============================

Enabling machine code via `Source => Display Machine Code' (see
Machine Code) toggles the following resource:

 -- Resource: disassemble (class Disassemble)
     If this is `on', the source code is automatically disassembled.
     The default is `off'.  See Options, for the `--disassemble'
     and `--no-disassemble' options.

   You can keep disassembled code in memory, using `Edit => Preferences
=> Source => Cache Machine Code':

 -- Resource: cacheMachineCode (class CacheMachineCode)
     Whether to cache disassembled machine code (`on', default) or not
     (`off').  Caching machine code requires more memory, but makes DDD
     run faster.

   You can control the indentation of machine code, using `Edit =>
Preferences => Source => Machine Code Indentation':

 -- Resource: indentCode (class Indent)
     The number of columns to indent the machine code, such that there
     is enough place to display breakpoint locations.  Default: `4'.

   The `maxDisassemble' resource controls how much is to be
disassembled.  If `maxDisassemble' is set to 256 (default) and the
current function is larger than 256 bytes, DDD only disassembles the
first 256 bytes below the current location.  You can set the
`maxDisassemble' resource to a larger value if you prefer to have a
larger machine code view.

 -- Resource: maxDisassemble (class MaxDisassemble)
     Maximum number of bytes to disassemble (default: `256').  If this
     is zero, the entire current function is disassembled.

9 Changing the Program
**********************

DDD offers some basic facilities to edit and recompile the source code,
as well as patching executables and core files.

9.1 Editing Source Code
=======================

In DDD itself, you cannot change the source file currently displayed.
Instead, DDD allows you to invoke a _text editor_.  To invoke a text
editor for the current source file, select the `Edit' button or `Source
=> Edit Source'.

   By default, DDD tries a number of common editors.  You can customize
DDD to use your favorite editor; see Customizing Editing, for
details.

   After the editor has exited, the source code shown is automatically
updated.

   If you have DDD and an editor running in parallel, you can also
update the source code manually via `Source => Reload Source'.  This
reloads the source code shown from the source file.  Since DDD
automatically reloads the source code if the debugged program has been
recompiled, this should seldom be necessary.

9.1.1 Customizing Editing
-------------------------

You can customize the editor to be used via `Edit => Preferences =>
Helpers => Edit Sources'.  This is tied to the following resource:

 -- Resource: editCommand (class EditCommand)
     A command string to invoke an editor on the specific file.
     `@LINE@' is replaced by the current line number, `@FILE@' by the
     file name.  The default is to invoke `$XEDITOR' first, then
     `$EDITOR', then `vi':

          Ddd*editCommand: \
          ${XEDITOR-false} +@LINE@ @FILE@ || \
          xterm -e ${EDITOR-vi} +@LINE@ @FILE@

   This `~/.ddd/init' setting invokes an editing session for an XEmacs
editor running `gnuserv':

     Ddd*editCommand: gnuclient +@LINE@ @FILE@

   This `~/.ddd/init' setting invokes an editing session for an Emacs
editor running `emacsserver':

     Ddd*editCommand: emacsclient +@LINE@ @FILE@

9.1.2 In-Place Editing
----------------------

This resource is experimental:

 -- Resource: sourceEditing (class SourceEditing)
     If this is `on', the displayed source code becomes editable.  This
     is an experimental feature; Default is `off'.

9.2 Recompiling
===============

To recompile the source code using `make', you can select `File =>
Make'.  This pops up a dialog where you can enter a _Make
Target_--typically the name of the executable.  Clicking on the `Make'
button invokes the `make' program with the given target.

   The `Make' button on the command tool re-invokes `make' with the
most recently given arguments.

9.3 Patching
============

Using GDB, you can open your program's executable code (and the core
file) for both reading and writing.  This allows alterations to machine
code, such that you can intentionally patch your program's binary.  For
example, you might want to turn on internal debugging flags, or even to
make emergency repairs.

   Note that depending on your operating system, special preparation
steps, such as setting permissions, may be needed before you can change
executable files.

   To patch the binary, enable `Edit => GDB Settings => Writing into
executable and core files'.  This makes GDB open executable and core
files for both reading and writing.  If you have already loaded a file,
you must load it again (using `Edit => Open File' or `Edit => Open
Core'), for your new setting to take effect.

   Be sure to turn off `Writing into executable and core files' as soon
as possible, to prevent accidental alterations to machine code.

10 The Command-Line Interface
*****************************

All the buttons you click within DDD get eventually translated into
some debugger command, shown in the debugger console.  You can also
type in and edit these commands directly.

10.1 Entering Commands
======================

In the _debugger console_, you can interact with the command interface
of the inferior debugger.  Enter commands at the _debugger
prompt_--that is, `(gdb)' for GDB, `bashdb<>' for Bash, `(dbx)' for DBX,
`>' `THREAD[DEPTH]' for JDB, `(ladebug)' for Ladebug, `mdb<>' for the
GNU Make debugger, `DB<>' for Perl, `(Pydb)' for `pydb', or `>' for XDB.
You can use arbitrary debugger commands; use the <Return> key to enter
them.

10.1.1 Command Completion
-------------------------

When using GDB or Perl, you can use the <TAB> key for _completing_
commands and arguments.  This works in the debugger console as well as
in all other text windows.

   GDB can fill in the rest of a word in a command for you, if there is
only one possibility; it can also show you what the valid possibilities
are for the next word in a command, at any time.  This works for GDB
commands, GDB subcommands, and the names of symbols in your program.

   Press the <TAB> key whenever you want GDB to fill out the rest of a
word.  If there is only one possibility, GDB fills in the word, and
waits for you to finish the command (or press <RET> to enter it).  For
example, if you type
     (gdb) info bre_<TAB>

GDB fills in the rest of the word `breakpoints', since that is the only
`info' subcommand beginning with `bre':

     (gdb) info breakpoints

You can either press <RET> at this point, to run the `info breakpoints'
command, or backspace and enter something else, if `breakpoints' does
not look like the command you expected.  (If you were sure you wanted
`info breakpoints' in the first place, you might as well just type
<RET> immediately after `info bre', to exploit command abbreviations
rather than command completion).

   If there is more than one possibility for the next word when you
press <TAB>, DDD sounds a bell.  You can either supply more characters
and try again, or just press <TAB> a second time; GDB displays all the
possible completions for that word.  For example, you might want to set
a breakpoint on a subroutine whose name begins with `make_', but when
you type `b make_<TAB>', DDD just sounds the bell.  Typing <TAB> again
displays all the function names in your program that begin with those
characters.  If you type <TAB> again, you cycle through the list of
completions, for example:

     (gdb) b make_ <TAB>
DDD sounds bell; press <TAB> again, to see:
     make_a_section_from_file     make_environ
     make_abs_section             make_function_type
     make_blockvector             make_pointer_type
     make_cleanup                 make_reference_type
     make_command                 make_symbol_completion_list
     (gdb) b make_ <TAB>
DDD presents one expansion after the other:
     (gdb) b make_a_section_from_file <TAB>
     (gdb) b make_abs_section <TAB>
     (gdb) b make_blockvector <TAB>

After displaying the available possibilities, GDB copies your partial
input (`b make_' in the example) so you can finish the command--by
pressing <TAB> again, or by entering the remainder manually.

   Sometimes the string you need, while logically a "word", may contain
parentheses or other characters that GDB normally excludes from its
notion of a word.  To permit word completion to work in this situation,
you may enclose words in `'' (single quote marks) in GDB commands.

   The most likely situation where you might need this is in typing the
name of a C++ function.  This is because C++ allows function overloading
(multiple definitions of the same function, distinguished by argument
type).  For example, when you want to set a breakpoint you may need to
distinguish whether you mean the version of `name' that takes an `int'
parameter, `name(int)', or the version that takes a `float' parameter,
`name(float)'.  To use the word-completion facilities in this
situation, type a single quote `'' at the beginning of the function
name.  This alerts GDB that it may need to consider more information
than usual when you press <TAB> to request word completion:

     (gdb) b 'bubble(_<TAB>
     bubble(double,double)    bubble(int,int)
     (gdb) b 'bubble(_

   In some cases, DDD can tell that completing a name requires using
quotes.  When this happens, DDD inserts the quote for you (while
completing as much as it can) if you do not type the quote in the first
place:

     (gdb) b bub_<TAB>
DDD alters your input line to the following, and rings a bell:
     (gdb) b 'bubble(_

In general, DDD can tell that a quote is needed (and inserts it) if you
have not yet started typing the argument list when you ask for
completion on an overloaded symbol.

   If you prefer to use the <TAB> key for switching between items,
unset `Edit => Preferences => General => TAB Key completes in All
Windows'.  This is useful if you have pointer-driven keyboard focus
(see below) and no special usage for the <TAB> key.  If the option is
set, the <TAB> key completes in the debugger console only.

   This option is tied to the following resource:

 -- Resource: globalTabCompletion (class GlobalTabCompletion)
     If this is `on' (default), the <TAB> key completes arguments in
     all windows.  If this is `off', the <TAB> key completes arguments
     in the debugger console only.

10.1.2 Command History
----------------------

You can _repeat_ previous and next commands by pressing the <Up> and
<Down> arrow keys, respectively.  This presents you previous and later
commands on the command line; use <Return> to apply the current command.

   If you enter an empty line (just use <Return> at the debugger
prompt), the last command is repeated as well.

   `Commands => Command History' shows the command history.

   You can _search_ for previous commands by pressing <Ctrl+B>.  This
invokes _incremental search mode,_ where you can enter a string to be
searched in previous commands.  Press <Ctrl+B> again to repeat the
search, or <Ctrl+F> to search in the reverse direction.  To return to
normal mode, press <ESC>, or use any cursor command.

   The command history is automatically saved when exiting DDD.  You
can turn off this feature by setting the following resource to `off':

 -- Resource: saveHistoryOnExit (class SaveOnExit)
     If `on' (default), the command history is automatically saved when
     DDD exits.

10.1.3 Typing in the Source Window
----------------------------------

As a special convenience, anything you type into the source window is
automatically forwarded to the debugger console.  Thus, you don't have
to change the keyboard focus explicitly in order to enter commands.

   You can change this behaviour using the following resource:

 -- Resource: consoleHasFocus (class ConsoleHasFocus)
     If `on' (default), all keyboard events in the source window are
     automatically forwarded to the debugger console.  If `off',
     keyboard events are not forwarded.  If `auto', keyboard events
     forwarded only if the debugger console is open.

10.2 Entering Commands at the TTY
=================================

Rather than entering commands at the debugger console, you may prefer to
enter commands at the terminal window DDD was invoked from.

   When DDD is invoked using the `--tty' option, it enables its _TTY
interface_, taking additional debugger commands from standard input and
forwarding debugger output to standard output, just as if the inferior
debugger had been invoked directly.  All remaining DDD functionality
stays unchanged.

   By default, the debugger console remains closed if DDD is invoked
using the `--tty' option.  Use `View => Debugger Console' to open it.

   DDD can be configured to use the `readline' library for reading in
commands from standard input.  This GNU library provides consistent
behavior for programs which provide a command line interface to the
user.  Advantages are GNU Emacs-style or "vi"-style inline editing of
commands, `csh'-like history substitution, and a storage and recall of
command history across debugging sessions.  See Command Line Editing (gdb),
for details on command-line editing via the
TTY interface.

10.3 Integrating DDD
====================

You can run DDD as an inferior debugger in other debugger front-ends,
combining their special abilities with those of DDD.

   To have DDD run as an inferior debugger in other front-ends, the
general idea is to set up your debugger front-end such that `ddd --tty'
is invoked instead of the inferior debugger.  When DDD is invoked using
the `--tty' option, it enables its _TTY interface_, taking additional
debugger commands from standard input and forwarding debugger output to
standard output, just as if the inferior debugger had been invoked
directly.  All remaining DDD functionality stays unchanged.

   In case your debugger front-end uses the GDB `-fullname' option to
have GDB report source code positions, the `--tty' option is not
required.  DDD recognizes the `-fullname' option, finds that it has
been invoked from a debugger front-end and automatically enables the
TTY interface.

   If DDD is invoked with the `-fullname' option, the debugger console
and the source window are initially disabled, as their facilities are
supposed to be provided by the integrating front-end.  In case of need,
you can use the `View' menu to re-enable these windows.

10.3.1 Using DDD with Emacs
---------------------------

To integrate DDD with Emacs, use `M-x gdb' or `M-x dbx' in Emacs to
start a debugging session.  At the prompt, enter `ddd --tty' (followed
by `--dbx' or `--gdb', if required), and the name of the program to be
debugged.  Proceed as usual.

10.3.2 Using DDD with XEmacs
----------------------------

To integrate DDD with XEmacs, set the variable `gdb-command-name' to
`"ddd"', by inserting the following line in your `~/.emacs' file:

     (setq gdb-command-name "ddd")

   You can also evaluate this expression by pressing <ESC> <:> and
entering it directly (<ESC> <ESC> for XEmacs 19.13 and earlier).

   To start a DDD debugging session in XEmacs, use `M-x gdb' or `M-x
gdbsrc'.  Proceed as usual.

10.3.3 Using DDD with XXGDB
---------------------------

To integrate DDD with XXGDB, invoke `xxgdb' as

     xxgdb -db_name ddd -db_prompt '(gdb) '

10.4 Defining Buttons
=====================

To facilitate interaction, you can add own command buttons to DDD.
These buttons can be added below the debugger console (`Console
Buttons'), the source window (`Source Buttons'), or the data window
(`Data Buttons').

   To define individual buttons, use the _Button Editor_, invoked via
`Commands => Edit Buttons'.  The button editor displays a text, where
each line contains the command for exactly one button.  Clicking on
`OK' creates the appropriate buttons from the text.  If the text is
empty (the default), no button is created.

   As a simple example, assume you want to create a `print i' button.
Invoke `Commands => Edit Buttons' and enter a line saying `print i' in
the button editor.  Then click on `OK'.  A button named `Print i' will
now appear below the debugger console--try it!  To remove the button,
reopen the button editor, clear the `print i' line and press `OK' again.

   If a button command contains `()', the string `()' will
automatically be replaced by the contents of the argument field.  For
instance, a button named `return ()' will execute the GDB `return'
command with the current content of the argument field as argument.

   By default, DDD disables buttons whose commands are not supported by
the inferior debugger.  To enable such buttons, unset the `Enable
supported buttons only' toggle in the button editor.

   DDD also allows you to specify control sequences and special labels
for user-defined buttons.  See Customizing Buttons, for details.

10.4.1 Customizing Buttons
--------------------------

DDD allows defining additional command buttons; see Defining Buttons,
for doing this interactively.  This section describes the
resources that control user-defined buttons.

 -- Resource: consoleButtons (class Buttons)
     A newline-separated list of buttons to be added under the debugger
     console.  Each button issues the command given by its name.

     The following characters have special meanings:
        * Commands ending with `...' insert their name, followed by a
          space, in the debugger console.

        * Commands ending with a control character (that is, `^'
          followed by a letter or `?') insert the given control
          character.

        * The string `()' is replaced by the current contents of the
          argument field `()'.

        * The string specified in the `labelDelimiter' resource (usually
          `//') separates the command name from the button label.  If no
          button label is specified, the capitalized command will be
          used as button label.

     The following button names are reserved:

    `Apply'
          Send the given command to the debugger.

    `Back'
          Lookup previously selected source position.

    `Clear'
          Clear current command

    `Complete'
          Complete current command.

    `Edit'
          Edit current source file.

    `Forward'
          Lookup next selected source position.

    `Make'
          Invoke the `make' program, using the most recently given
          arguments.

    `Next'
          Show next command

    `No'
          Answer current debugger prompt with `no'.  This button is
          visible only if the debugger asks a yes/no question.

    `Prev'
          Show previous command

    `Reload'
          Reload source file.

    `Yes'
          Answer current debugger prompt with `yes'.  This button is
          visible only if the debugger asks a yes/no question.

     The default resource value is empty--no console buttons are
     created.

     Here are some examples to insert into your `~/.ddd/init' file.
     These are the settings of DDD 1.x:
          Ddd*consoleButtons: Yes\nNo\nbreak^C

     This setting creates some more buttons:
            Ddd*consoleButtons: \
            Yes\nNo\nrun\nClear\nPrev\nNext\nApply\nbreak^C

     See also the `dataButtons', `sourceButtons' and `toolButtons'
     resources.

 -- Resource: dataButtons (class Buttons)
     A newline-separated list of buttons to be added under the data
     display.  Each button issues the command given by its name.  See
     the `consoleButtons' resource, above, for details on button syntax.

     The default resource value is empty--no source buttons are created.

 -- Resource: sourceButtons (class Buttons)
     A newline-separated list of buttons to be added under the debugger
     console.  Each button issues the command given by its name.  See
     the `consoleButtons' resource, above, for details on button syntax.

     The default resource value is empty--no source buttons are created.

     Here are some example to insert into your `~/.ddd/init' file.
     These are the settings of DDD 1.x:

          Ddd*sourceButtons: \
            run\nstep\nnext\nstepi\nnexti\ncont\n\
            finish\nkill\nup\ndown\n\
            Back\nForward\nEdit\ninterrupt^C

     This setting creates some buttons which are not found on the
     command tool:

            Ddd*sourceButtons: \
            print *()\ngraph display *()\nprint /x ()\n\
            whatis ()\nptype ()\nwatch ()\nuntil\nshell

     An even more professional setting uses customized button labels.

            Ddd*sourceButtons: \
            print *(()) // Print *()\n\
            graph display *(()) // Display *()\n\
            print /x ()\n\
            whatis () // What is ()\n\
            ptype ()\n\
            watch ()\n\
            until\n\
            shell

     See also the `consoleButtons' and `dataButtons' resources, above,
     and the `toolButtons' resource, below.

 -- Resource: toolButtons (class Buttons)
     A newline-separated list of buttons to be included in the command
     tool or the command tool bar (see Disabling the Command Tool).
     Each button issues the command given by its name.  See Defining Buttons,
     for details on button syntax.

     The default resource value is

          Ddd*toolButtons: \
          run\nbreak^C\nstep\nstepi\nnext\nnexti\n\
          until\nfinish\ncont\n\kill\n\
          up\ndown\nBack\nForward\nEdit\nMake

     For each button, its location in the command tool must be specified
     using `XmForm' constraint resources.  See the `Ddd' application
     defaults file for instructions.

     If the `toolButtons' resource value is empty, the command tool is
     not created.

   The following resources set up button details:

 -- Resource: labelDelimiter (class LabelDelimiter)
     The string used to separate labels from commands and shortcuts.
     Default is `//'.

 -- Resource: verifyButtons (class VerifyButtons)
     If `on' (default), verify for each button whether its command is
     actually supported by the inferior debugger.  If the command is
     unknown, the button is disabled.  If this resource is `off', no
     checking is done: all commands are accepted "as is".

10.5 Defining Commands
======================

Aside from breakpoint commands (see Breakpoint Commands), DDD also
allows you to define user-defined commands.  A _user-defined command_
is a sequence of commands to which you assign a new name as a command.
This new command can be entered at the debugger prompt or invoked via a
button.

10.5.1 Defining Simple Commands using GDB
-----------------------------------------

Aside from breakpoint commands (see `Breakpoint commands', above), DDD
also allows you to store sequences of commands as a user-defined GDB
command.  A _user-defined command_ is a sequence of GDB commands to
which you assign a new name as a command.  Using DDD, this is done via
the _Command Editor_, invoked via `Commands => Define Command'.

   A GDB command is created in five steps:

  1. Enter the name of the command in the `Command' field.  Use the
     drop-down list on the right to select from already defined
     commands.

  2. Click on `Record' to begin the recording of the command sequence.

  3. Now interact with DDD.  While recording, DDD does not execute
     commands, but simply records them to be executed when the
     breakpoint is hit.  The recorded debugger commands are shown in the
     debugger console.

  4. To stop the recording, click on `End' or enter `end' at the GDB
     prompt.  To _cancel_ the recording, click on `Interrupt' or press
     <ESC>.

  5. Click on `Edit >>' to edit the recorded commands.  When done with
     editing, click on `Edit <<' to close the commands editor.

   After the command is defined, you can enter it at the GDB prompt.
You may also click on `Execute' to test the given user-defined command.

   For convenience, you can assign a button to the defined command.
Enabling one of the `Button' locations will add a button with the given
command to the specified location.  If you want to edit the button,
select `Commands => Edit Buttons'.  See Defining Buttons, for a
discussion.

   When user-defined GDB commands are executed, the commands of the
definition are not printed.  An error in any command stops execution of
the user-defined command.(1)

   If used interactively, commands that would ask for confirmation
proceed without asking when used inside a user-defined command.  Many
GDB commands that normally print messages to say what they are doing
omit the messages when used in a user-defined command.

   Command definitions are saved across DDD sessions.

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

   (1) If you use DDD commands within command definitions, or if you
include debugger commands that resume execution, these commands will be
realized transparently as "auto-commands"--that is, they won't be
executed directly by the inferior debugger, but result in a command
string being sent to DDD.  This command string is then interpreted by
DDD and sent back to the inferior debugger, possibly prefixed by some
other commands such that DDD can update its state.  See Commands with Other Debuggers,
for a discussion.

10.5.2 Defining Argument Commands using GDB
-------------------------------------------

If you want to pass arguments to user-defined commands, you can enable
the `()' toggle button in the Command Editor.  Enabling `()' has two
effects:

   * While recording commands, all references to the argument field are
     taken _symbolically_ instead of literally.  The argument field
     value is frozen to `$arg0', which is how GDB denotes the argument
     of a user-defined command.  When GDB executes the command, it will
     replace `$arg0' by the current command argument.

   * When assigning a button to the command, the command will be
     suffixed by the current contents of the argument field.

   While defining a command, you can toggle the `()' button as you wish
to switch between using the argument field symbolically and literally.

   As an example, let us define a command `contuntil' that will set a
breakpoint in the given argument and continue execution.

  1. Enter `contuntil' in the `Command' field.

  2. Enable the `()' toggle button.

  3. Now click on `Record' to start recording.  Note that the contents
     of the argument field change to `$arg0'.

  4. Click on `Break at ()' to create a breakpoint.  Note that the
     recorded breakpoint command refers to `$arg0'.

  5. Click on `Cont' to continue execution.

  6. Click on `End' to end recording.  Note that the argument field is
     restored to its original value.

  7. Finally, click on one of the `Button' locations.  This creates a
     `Contuntil ()' button where `()' will be replaced by the current
     contents of the argument field--and thus passed to the `contuntil'
     command.

  8. You can now either use the `Contuntil ()' button or enter a
     `contuntil' command at the GDB prompt.  (If you plan to use the
     command frequently, you may wish to define a `cu' command, which
     again calls `contuntil' with its argument.  This is a nice
     exercise.)

   There is a little drawback with argument commands: a user-defined
command in GDB has no means to access the argument list as a whole; only
the first argument (up to whitespace) is processed.  This may change in
future GDB releases.

10.5.3 Defining Commands using Other Debuggers
----------------------------------------------

If your inferior debugger allows you to define own command sequences,
you can also use these user-defined commands within DDD; just enter
them at the debugger prompt.

   However, you may encounter some problems:

   * In contrast to the well-documented commands of the inferior
     debugger, DDD does not know what a user-defined command does.
     This may lead to inconsistencies between DDD and the inferior
     debugger.  For instance, if your the user-defined command `bp'
     sets a breakpoint, DDD may not display it immediately, because DDD
     does not know that `bp' changes the breakpoint state.

   * You cannot use DDD `graph' commands within user-defined commands.
     This is only natural, because user-defined commands are
     interpreted by the inferior debugger, which does not know about
     DDD commands.

   As a solution, DDD provides a simple facility called
"auto-commands".  If DDD receives any output from the inferior debugger
in the form `PREFIX COMMAND', it will interpret COMMAND as if it had
been entered at the debugger prompt.  PREFIX is a user-defined string,
for example `ddd: '.

   Suppose you want to define a command `gd' that serves as
abbreviation for `graph display'.  All the command `gd' has to do is to
issue a string

     ddd: graph display ARGUMENT

   where ARGUMENT is the argument given to `gd'.  Using GDB, this can
be achieved using the `echo' command.  In your `~/.gdbinit' file,
insert the lines

     define gd
       echo ddd: graph display $arg0\n
     end

   To complete the setting, you must also set the `autoCommandPrefix'
resource to the `ddd: ' prefix you gave in your command.  In
`~/.ddd/init', write:

     Ddd*autoCommandPrefix: ddd:\

(Be sure to leave a space after the trailing backslash.)

   Entering `gd foo' will now have the same effect as entering `graph
display foo' at the debugger prompt.

   Please note: In your commands, you should choose some other prefix
than `ddd: '.  This is because auto-commands raise a security problem,
since arbitrary commands can be executed.  Just imagine some malicious
program issuing a string like `PREFIX shell rm -fr ~' when being
debugged!  As a consequence, be sure to choose your own PREFIX; it must
be at least three characters long.

Appendix A Application Defaults
*******************************

Like any good X citizen, DDD comes with a large application-defaults
file named `Ddd'.  This appendix documents the actions and images
referenced in `Ddd', such that you can easily modify them.

A.1 Actions
===========

The following DDD actions may be used in translation tables.

A.1.1 General Actions
---------------------

 -- Action: ddd-get-focus ()
     Assign focus to the element that just received input.

 -- Action: ddd-next-tab-group ()
     Assign focus to the next tab group.

 -- Action: ddd-prev-tab-group ()
     Assign focus to the previous tab group.

 -- Action: ddd-previous-tab-group ()
     Assign focus to the previous tab group.

A.1.2 Data Display Actions
--------------------------

These actions are used in the DDD graph editor.

 -- Action: end ()
     End the action initiated by `select'.  Bound to a button up event.

 -- Action: extend ()
     Extend the current selection.  Bound to a button down event.

 -- Action: extend-or-move ()
     Extend the current selection.  Bound to a button down event.  If
     the pointer is dragged, move the selection.

 -- Action: follow ()
     Continue the action initiated by `select'.  Bound to a pointer
     motion event.

 -- Action: graph-select ()
     Equivalent to `select', but also updates the current argument.

 -- Action: graph-select-or-move ()
     Equivalent to `select-or-move', but also updates the current
     argument.

 -- Action: graph-extend ()
     Equivalent to `extend', but also updates the current argument.

 -- Action: graph-extend-or-move ()
     Equivalent to `extend-or-move', but also updates the current
     argument.

 -- Action: graph-toggle ()
     Equivalent to `toggle', but also updates the current argument.

 -- Action: graph-toggle-or-move ()
     Equivalent to `toggle-or-move', but also updates the current
     argument.

 -- Action: graph-popup-menu ([`graph'|`node'|`shortcut'])
     Pops up a menu.  `graph' pops up a menu with global graph
     operations, `node' pops up a menu with node operations, and
     `shortcut' pops up a menu with display shortcuts.

     If no argument is given, pops up a menu depending on the context:
     when pointing on a node with the <Shift> key pressed, behaves like
     `shortcut'; when pointing on a without the <Shift> key pressed,
     behaves like `node'; otherwise, behaves as if `graph' was given.

 -- Action: graph-dereference ()
     Dereference the selected display.

 -- Action: graph-detail ()
     Show or hide detail of the selected display.

 -- Action: graph-rotate ()
     Rotate the selected display.

 -- Action: graph-dependent ()
     Pop up a dialog to create a dependent display.

 -- Action: hide-edges ([`any'|`both'|`from'|`to'])
     Hide some edges.  `any' means to process all edges where either
     source or target node are selected. `both' means to process all
     edges where both nodes are selected. `from' means to process all
     edges where at least the source node is selected. `to' means to
     process all edges where at least the target node is selected.
     Default is `any'.

 -- Action: layout ([`regular'|`compact'], [[`+'|`-'] degrees])
     Layout the graph.  `regular' means to use the regular layout
     algorithm; `compact' uses an alternate layout algorithm, where
     successors are placed next to their parents.  Default is
     `regular'.  DEGREES indicates in which direction the graph should
     be layouted.  Default is the current graph direction.

 -- Action: move-selected (x-offset, y-offset)
     Move all selected nodes in the direction given by X-OFFSET and
     Y-OFFSET.  X-OFFSET and Y-OFFSET is either given as a numeric
     pixel value, or as `+grid', or `-grid', meaning the current grid
     size.

 -- Action: normalize ()
     Place all nodes on their positions and redraw the graph.

 -- Action: rotate ([[`+'|`-']degrees])
     Rotate the graph around DEGREES degrees.  DEGREES must be a
     multiple of 90.  Default is `+90'.

 -- Action: select ()
     Select the node pointed at.  Clear all other selections.  Bound to
     a button down event.

 -- Action: select-all ()
     Select all nodes in the graph.

 -- Action: select-first ()
     Select the first node in the graph.

 -- Action: select-next ()
     Select the next node in the graph.

 -- Action: select-or-move ()
     Select the node pointed at.  Clear all other selections.  Bound to
     a button down event. If the pointer is dragged, move the selected
     node.

 -- Action: select-prev ()
     Select the previous node in the graph.

 -- Action: show-edges ([`any'|`both'|`from'|`to'])
     Show some edges.  `any' means to process all edges where either
     source or target node are selected. `both' means to process all
     edges where both nodes are selected. `from' means to process all
     edges where at least the source node is selected. `to' means to
     process all edges where at least the target node is selected.
     Default is `any'.

 -- Action: snap-to-grid ()
     Place all nodes on the nearest grid position.

 -- Action: toggle ()
     Toggle the current selection--if the node pointed at is selected,
     it will be unselected, and vice versa.  Bound to a button down
     event.

 -- Action: toggle-or-move ()
     Toggle the current selection--if the node pointed at is selected,
     it will be unselected, and vice versa.  Bound to a button down
     event.  If the pointer is dragged, move the selection.

 -- Action: unselect-all ()
     Clear the selection.

A.1.3 Debugger Console Actions
------------------------------

These actions are used in the debugger console and other text fields.

 -- Action: gdb-backward-character ()
     Move one character to the left.  Bound to `Left'.

 -- Action: gdb-beginning-of-line ()
     Move cursor to the beginning of the current line, after the prompt.
     Bound to `HOME'.

 -- Action: gdb-control (control-character)
     Send the given CONTROL-CHARACTER to the inferior debugger.
     CONTROL-CHARACTER must be specified in the form `^X', where X is
     an upper-case letter, or `?'.

 -- Action: gdb-command (command)
     Execute COMMAND in the debugger console.  The following
     replacements are performed on COMMAND:

        * If COMMAND has the form `NAME...', insert NAME, followed by a
          space, in the debugger console.

        * All occurrences of `()' are replaced by the current contents
          of the argument field `()'.

 -- Action: gdb-complete-arg (command)
     Complete current argument as if COMMAND was prepended.  Bound to
     <Ctrl+T>.

 -- Action: gdb-complete-command ()
     Complete current command line in the debugger console.  Bound to
     <TAB>.

 -- Action: gdb-complete-tab (command)
     If global <TAB> completion is enabled, complete current argument
     as if COMMAND was prepended.  Otherwise, proceed as if the <TAB>
     key was hit.  Bound to <TAB>.

 -- Action: gdb-delete-or-control (control-character)
     Like `gdb-control', but effective only if the cursor is at the end
     of a line.  Otherwise, CONTROL-CHARACTER is ignored and the
     character following the cursor is deleted.  Bound to <Ctrl+D>.

 -- Action: gdb-end-of-line ()
     Move cursor to the end of the current line.  Bound to `End'.

 -- Action: gdb-forward-character ()
     Move one character to the right.  Bound to `Right'.

 -- Action: gdb-insert-graph-arg ()
     Insert the contents of the data display argument field `()'.

 -- Action: gdb-insert-source-arg ()
     Insert the contents of the source argument field `()'.

 -- Action: gdb-interrupt ()
     If DDD is in incremental search mode, exit it; otherwise call
     `gdb-control(^C)'.

 -- Action: gdb-isearch-prev ()
     Enter reverse incremental search mode.  Bound to <Ctrl+B>.

 -- Action: gdb-isearch-next ()
     Enter incremental search mode.  Bound to <Ctrl+F>.

 -- Action: gdb-isearch-exit ()
     Exit incremental search mode.  Bound to <ESC>.

 -- Action: gdb-next-history ()
     Recall next command from history.  Bound to `Down'.

 -- Action: gdb-prev-history ()
     Recall previous command from history.  Bound to `Up'.

 -- Action: gdb-previous-history ()
     Recall previous command from history.  Bound to `Up'.

 -- Action: gdb-process ([action [, args...]])
     Process the given event in the debugger console.  Bound to key
     events in the source and data window.  If this action is bound to
     the source window, and the source window is editable, perform
     `ACTION(ARGS...)' on the source window instead; if ACTION is not
     given, perform `self-insert()'.

 -- Action: gdb-select-all ()
     If the `selectAllBindings' resource is set to `Motif', perform
     `beginning-of-line'.  Otherwise, perform `select-all'.  Bound to
     <Ctrl+A>.

 -- Action: gdb-set-line (value)
     Set the current line to VALUE.  Bound to <Ctrl+U>.

A.1.4 Source Window Actions
---------------------------

These actions are used in the source and code windows.

 -- Action: source-delete-glyph ()
     Delete the breakpoint related to the glyph at cursor position.

 -- Action: source-double-click ([text-action [, line-action [,
          function-action]]])
     The double-click action in the source window.

        * If this action is taken on a breakpoint glyph, edit the
          breakpoint properties.

        * If this action is taken in the breakpoint area, invoke
          `gdb-command(LINE-ACTION)'.  If LINE-ACTION is not given, it
          defaults to `break ()'.

        * If this action is taken in the source text, and the next
          character following the current selection is `(', invoke
          `gdb-command(FUNCTION-ACTION)'.  If FUNCTION-ACTION is not
          given, it defaults to `list ()'.

        * Otherwise, invoke `gdb-command(TEXT-ACTION)'.  If TEXT-ACTION
          is not given, it defaults to `graph display ()'.

 -- Action: source-drag-glyph ()
     Initiate a drag on the glyph at cursor position.

 -- Action: source-drop-glyph ([action])
     Drop the dragged glyph at cursor position.  ACTION is either
     `move', meaning to move the dragged glyph, or `copy', meaning to
     copy the dragged glyph.  If no ACTION is given, `move' is assumed.

 -- Action: source-end-select-word ()
     End selecting a word.

 -- Action: source-follow-glyph ()
     Continue a drag on the glyph at cursor position.  Usually bound to
     some motion event.

 -- Action: source-popup-menu ()
     Pop up a menu, depending on the location.

 -- Action: source-set-arg ()
     Set the argument field to the current selection.  Typically bound
     to some selection operation.

 -- Action: source-start-select-word ()
     Start selecting a word.

 -- Action: source-update-glyphs ()
     Update all visible glyphs.  Usually invoked after a scrolling
     operation.

A.2 Images
==========

DDD installs a number of images that may be used as pixmap resources,
simply by giving a symbolic name.  For button images, three variants
are installed as well:

   * The suffix `-hi' indicates a highlighted variant (Button is
     entered).

   * The suffix `-arm' indicates an armed variant (Button is pushed).

   * The suffix `-xx' indicates a disabled (insensitive) variant.

 -- Image: break_at
     `Break at ()' button.

 -- Image: clear_at
     `Clear at ()' button.

 -- Image: ddd
     DDD icon.

 -- Image: delete
     `Delete ()' button.

 -- Image: disable
     `Disable' button.

 -- Image: dispref
     `Display * ()' button.

 -- Image: display
     `Display ()' button.

 -- Image: drag_arrow
     The execution pointer (being dragged).

 -- Image: drag_cond
     A conditional breakpoint (being dragged).

 -- Image: drag_stop
     A breakpoint (being dragged).

 -- Image: drag_temp
     A temporary breakpoint (being dragged).

 -- Image: enable
     `Enable' button.

 -- Image: find_forward
     `Find>> ()' button.

 -- Image: find_backward
     `Find<< ()' button.

 -- Image: grey_arrow
     The execution pointer (not in lowest frame).

 -- Image: grey_cond
     A conditional breakpoint (disabled).

 -- Image: grey_stop
     A breakpoint (disabled).

 -- Image: grey_temp
     A temporary breakpoint (disabled).

 -- Image: hide
     `Hide ()' button.

 -- Image: lookup
     `Lookup ()' button.

 -- Image: maketemp
     `Make Temporary' button.

 -- Image: new_break
     `New Breakpoint' button.

 -- Image: new_display
     `New Display' button.

 -- Image: new_watch
     `New Watchpoint' button.

 -- Image: plain_arrow
     The execution pointer.

 -- Image: plain_cond
     A conditional breakpoint (enabled).

 -- Image: plain_stop
     A breakpoint (enabled).

 -- Image: plain_temp
     A temporary breakpoint (enabled).

 -- Image: print
     `Print ()' button.

 -- Image: properties
     `Properties' button.

 -- Image: rotate
     `Rotate ()' button.

 -- Image: set
     `Set ()' button.

 -- Image: show
     `Show ()' button.

 -- Image: signal_arrow
     The execution pointer (stopped by signal).

 -- Image: undisplay
     `Undisplay ()' button.

 -- Image: unwatch
     `Unwatch ()' button.

 -- Image: watch
     `Watch ()' button.

Appendix B Bugs and How To Report Them
**************************************

Sometimes you will encounter a bug in DDD.  Although we cannot promise
we can or will fix the bug, and we might not even agree that it is a
bug, we want to hear about bugs you encounter in case we do want to fix
them.

   To make it possible for us to fix a bug, you must report it.  In
order to do so effectively, you must know when and how to do it.

B.1 Where to Send Bug Reports
=============================

Submit bug reports for DDD at
`http://savannah.gnu.org/bugs/?group=ddd', the DDD bug tracker.
Incoming bug reports are automatically copied to the developers'
mailing list <bug-ddd@gnu.org>.

B.2 Is it a DDD Bug?
====================

Before sending in a bug report, try to find out whether the problem
cause really lies within DDD.  A common cause of problems are
incomplete or missing X or M*tif installations, for instance, or bugs
in the X server or M*tif itself.  Running DDD as

     $ ddd --check-configuration

   checks for common problems and gives hints on how to repair them.

   Another potential cause of problems is the inferior debugger;
occasionally, they show bugs, too.  To find out whether a bug was
caused by the inferior debugger, run DDD as

     $ ddd --trace

   This shows the interaction between DDD and the inferior debugger on
standard error while DDD is running.  (If `--trace' is not given, this
interaction is logged in the file `~/.ddd/log'; see Logging)
Compare the debugger output to the output of DDD and determine which
one is wrong.

B.3 How to Report Bugs
======================

Here are some guidelines for bug reports:

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

   * Keep in mind that the purpose of a bug report is to enable someone
     to fix the bug if it is not known.  It is not very important what
     happens if the bug is already known.  Therefore, always write your
     bug reports on the assumption that the bug is not known.

   * Your bug report should be self-contained.  Do not refer to
     information sent in previous mails; your previous mail may have
     been forwarded to somebody else.

   * Please report each bug in a separate message.  This makes it easier
     for us to track which bugs have been fixed and to forward your bugs
     reports to the appropriate maintainer.

   * Please report bugs in English; this increases the chances of
     finding someone who can fix the bug.  Do not assume one particular
     person will receive your bug report.

B.4 What to Include in a Bug Report
===================================

To enable us to fix a DDD bug, you _must_ include the following
information:

   * Your DDD configuration.  Invoke DDD as

          $ ddd --configuration

     to get the configuration information.  If this does not work,
     please include at least the DDD version, the type of machine you
     are using, and its operating system name and version number.

   * The debugger you are using and its version (e.g., `gdb-4.17' or
     `dbx as shipped with Solaris 2.6').

   * The compiler you used to compile DDD and its version (e.g.,
     `gcc-2.8.1').

   * A description of what behavior you observe that you believe is
     incorrect.  For example, "DDD gets a fatal signal" or "DDD exits
     immediately after attempting to create the data window".

   * A _log file_ showing the interaction between DDD and the inferior
     debugger.  By default, this interaction is logged in the file
     `~/.ddd/log'.  Include all trace output from the DDD invocation up
     to the first bug occurrence; insert own comments where necessary.

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

   Be sure to include this information in _every_ single bug report.

B.5 Getting Diagnostics
=======================

B.5.1 Logging
-------------

If things go wrong, the first and most important information source is
the "DDD log file".  This file, created in `~/.ddd/log' (`~' stands for
your home directory), records the following information:

   * Your DDD configuration (at the top)

   * All programs invoked by DDD, shown as `$ PROGRAM ARGS...'

   * All DDD messages, shown as `#  MESSAGE'.

   * All information sent from DDD to the inferior debugger, shown as
     `-> TEXT'.

   * All information sent from the inferior debugger standard output to
     DDD, shown as `<- TEXT'.

   * All information sent from the inferior debugger standard error to
     DDD, shown as `<= TEXT'.(1)

   * All information sent from DDD to Gnuplot, shown as `>> TEXT'.

   * All information sent from Gnuplot standard output to DDD, shown as
     `<< TEXT'.

   * All information sent from Gnuplot standard error to DDD, shown as
     `<= TEXT'.

   * If DDD crashes, a GDB backtrace of the DDD core dump is included
     at the end.

   This information, all in one place, should give you (and anyone
maintaining DDD) a first insight of what's going wrong.

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

   (1) Since the inferior debugger is invoked through a virtual TTY,
standard error is normally redirected to standard output, so DDD never
receives standard error from the inferior debugger.

B.5.1.1 Disabling Logging
.........................

The log files created by DDD can become quite large, so you might want
to turn off logging.  There is no explicit DDD feature that allows you
to do that.  However, you can easily create a _symbolic link_ from
`~/.ddd/log' to `/dev/null', such that logging information is lost.
Enter the following commands at the shell prompt:

     $ cd
     $ rm .ddd/log
     $ ln -s /dev/null .ddd/log
     $ _

   Be aware, though, that having logging turned off makes diagnostics
much more difficult; in case of trouble, it may be hard to reproduce the
error.

B.5.2 Debugging DDD
-------------------

As long as DDD is compiled with `-g' (see Compiling for Debugging),
you can invoke a debugger on DDD--even DDD itself, if you wish.  From
within DDD, a special `Maintenance' menu is provided that invokes GDB
on the running DDD process.  See Maintenance Menu, for details.

   The DDD distribution comes with a `.gdbinit' file that is suitable
for debugging DDD.  Among others, this defines a `ddd' command that
sets up an environment for debugging DDD and a `string' command that
lets you print the contents of DDD `string' variables; just use `print
VAR' followed by `string'.

   You can cause DDD to dump core at any time by sending it a `SIGUSR1'
signal.  DDD resumes execution while you can examine the core file with
GDB.

   When debugging DDD, it can be useful to make DDD not catch fatal
errors.  This can be achieved by setting the environment variable
`DDD_NO_SIGNAL_HANDLERS' before invoking DDD.

B.5.3 Customizing Diagnostics
-----------------------------

You can use these additional resources to obtain diagnostics about DDD.
Most of them are tied to a particular invocation option.

 -- Resource: appDefaultsVersion (class Version)
     The version of the DDD app-defaults file.  If this string does not
     match the version of the current DDD executable, DDD issues a
     warning.

 -- Resource: checkConfiguration (class CheckConfiguration)
     If `on', check the DDD environment (in particular, the X
     configuration), report any possible problem causes and exit.
     See Options, for the `--check-configuration' option.

 -- Resource: dddinitVersion (class Version)
     The version of the DDD executable that last wrote the
     `~/.ddd/init' file.  If this string does not match the version of
     the current DDD executable, DDD issues a warning.

 -- Resource: debugCoreDumps (class DebugCoreDumps)
     If `on', DDD invokes a debugger on itself when receiving a fatal
     signal.  See Maintenance Menu, for setting this resource.

 -- Resource: dumpCore (class DumpCore)
     If `on' (default), DDD dumps core when receiving a fatal signal.
     See Maintenance Menu, for setting this resource.

 -- Resource: maintenance (class Maintenance)
     If `on', enables the top-level `Maintenance' menu (see
     Maintenance Menu) with additional options.  See Options, for
     the `--maintenance' option.

 -- Resource: showConfiguration (class ShowConfiguration)
     If `on', show the DDD configuration on standard output and exit.
     See Options, for the `--configuration' option.

 -- Resource: showFonts (class ShowFonts)
     If `on', show the DDD font definitions on standard output and
     exit.  See Options, for the `--fonts' option.

 -- Resource: showInvocation (class ShowInvocation)
     If `on', show the DDD invocation options on standard output and
     exit.  See Options, for the `--help' option.

 -- Resource: showLicense (class ShowLicense)
     If `on', show the DDD license on standard output and exit.  See
     Options, for the `--license' option.

 -- Resource: showManual (class ShowManual)
     If `on', show this DDD manual page on standard output and exit.
     If the standard output is a terminal, the manual page is shown in a
     pager (`$PAGER', `less' or `more').  See Options, for the
     `--manual' option.

 -- Resource: showNews (class ShowNews)
     If `on', show the DDD news on standard output and exit.  See
     Options, for the `--news' option.

 -- Resource: showVersion (class ShowVersion)
     If `on', show the DDD version on standard output and exit.  See
     Options, for the `--version' option.

 -- Resource: suppressWarnings (class SuppressWarnings)
     If `on', X warnings are suppressed.  This is sometimes useful for
     executables that were built on a machine with a different X or
     M*tif configuration.  By default, this is `off'.  See X Warnings,
     for details.

 -- Resource: trace (class Trace)
     If `on', show the dialog between DDD and the inferior debugger on
     standard output.  Default is `off'.  See Options, for the
     `--trace' option.

Appendix C Configuration Notes
******************************

C.1 Using DDD with GDB
======================

Some GDB settings are essential for DDD to work correctly.  These
settings with their correct values are:
     set height 0
     set width 0
     set verbose off
     set annotate 1
     set prompt (gdb)

   DDD sets these values automatically when invoking GDB; if these
values are changed, there may be some malfunctions, especially in the
data display.

   When debugging at the machine level with GDB 4.12 and earlier as
inferior debugger, use a `display /x $pc' command to ensure the program
counter value is updated correctly at each stop.  You may also enter
the command in `~/.gdbinit' or (better yet) upgrade to the most recent
GDB version.

   Further information is available on the following GDB variants:

C.1.1 Using DDD with WDB
------------------------

HP's WildeBeest (WDB) is essentially a variant of GDB.  To start DDD
with WDB as inferior debugger, use

     ddd --wdb PROGRAM

   See GDB, for further configuration notes.

C.1.2 Using DDD with WindRiver GDB (Tornado)
--------------------------------------------

DDD now supports WindRiver's version of GDB.(1) DDD can be integrated
into the `Launch' window by placing the `launch.tcl' script (see below)
into the the directory `~/.wind'.

   Currently, DDD only supports the PowerPC and has been only tested on
a Solaris 2.6 host.

   DDD launches the version of GDB that is either in the current path,
or the one specified on the command line using the `--debugger' command.

   Normally, the Tornado environment is set up by sourcing a script file
which, among other things, sets up the PATH variable.

   It is suggested that a soft link for the version of GDB used for the
target (i.e. `gdbppc') be made in the same directory:

     bin>ls -l gdb*
     39 Mar  6 16:14 gdb -> /usr/wind/host/sun4-solaris2/bin/gdbppc*
     1619212 Mar 11  1997 gdbppc*
     bin>_

   This way DDD will start the correct version of GDB automatically.

   It is also suggested that you use DDD's execution window to
facilitate parsing of GDB output.  See Debugger Communication, for
details.

   Tornado reads the default TCL scripts first, then the ones in the
users `.wind' directory.  The following procedures can be cut and
pasted into the user's `launch.tcl' file:

     # Launch.tcl - Launch application Tcl user customization file.
     #

     ######
     #
     # setupDDD - sets up DDD for use by the launcher
     #
     # This routine adds the DDD to the application bar
     #
     # SYNOPSIS:
     # setupDDD
     #
     # PARAMETERS: N/A
     #
     # RETURNS: N/A
     #
     # ERRORS: N/A
     #

     proc setupDDD {} {
         # Add to the default application bar
         objectCreate app ddd DDD {launchDDD}
     }

     ######
     #
     # launchDDD - launch the DDD debugger
     #
     # SYNOPSIS:
     # launchDDD
     #
     # PARAMETERS: N/A
     #
     # RETURNS: N/A
     #
     # ERRORS: N/A
     #

     proc launchDDD {} {

         global tgtsvr_selected
         global tgtsvr_cpuid

         if {$tgtsvr_selected == "" || $tgtsvr_cpuid == 0} {
             noticePost error "Select an attached target first."
             return
         }

         set startFileName /tmp/dddstartup.[pid]

         if [catch {open $startFileName w} file] {
              # couldn't create a startup file.  Oh, well.
              exec ddd --gdb &
         }
         else
         {
              # write out a little /tmp file that attaches to the
              # selected target server and then deletes itself.
              puts $file "set wtx-tool-name ddd"
              puts $file "target wtx $tgtsvr_selected"
              puts $file "tcl exec rm $startFileName"
              close $file
              exec ddd --gdb --command=$startFileName &
         }
     }

     ######
     #
     # Launch.tcl - Initialization
     #
     # The user's resource file sourced from the initial Launch.tcl
     #

     # Add DDD to the laucher
       setupDDD

   In order for DDD to automatically display the source of a previously
loaded file, the entry point must be named either `vxworks_main' or
`main_vxworks'.

   See GDB, for further configuration notes.

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

   (1) This section was contributed by Gary Cliff from Computing
Devices Canada Ltd., <gary.cliff@cdott.com>.

C.2 Using DDD with Bash
=======================

BASH support is rather new. As a programming language, BASH is not
feature rich: there are no record structures or hash tables (yet), no
pointers, package variable scoping or methods. So much of the data
display and visualization features of DDD are disabled.

   As with any scripting or interpreted language like Perl, stepping a
machine-language instructions (commands Stepi/Nexti) doesn't exist.

   Some BASH settings are essential for DDD to work correctly.  These
settings with their correct values are:

     set annotate 1
     set prompt set prompt bashdb$_Dbg_less$_Dbg_greater$_Dbg_space

   DDD sets these values automatically when invoking BASH; if these
values are changed, there may be some malfunctions.

   Pay special attention when the prompt has extra angle brackets (a
nested shell) or has any parenthesis (is in a subshell). Quitting may
merely exit out of one of these nested (sub)shells rather than leave
the program.

C.3 Using DDD with DBX
======================

When used for debugging Pascal-like programs, DDD does not infer
correct array subscripts and always starts to count with 1.

   With some DBX versions (notably Solaris DBX), DDD strips C-style and
C++-style comments from the DBX output in order to interpret it
properly.  This also affects the output of the debugged program when
sent to the debugger console.  Using the separate execution window
avoids these problems.

   In some DBX versions (notably DEC DBX and AIX DBX), there is no
automatic data display.  As an alternative, DDD uses the DBX `print'
command to access data values.  This means that variable names are
interpreted according to the current frame; variables outside the
current frame cannot be displayed.

C.4 Using DDD with Ladebug
==========================

All DBX limitations (see DBX) apply to Ladebug as well.

C.5 Using DDD with JDB
======================

There is no automatic data display in JDB.  As a workaround, DDD uses
the `dump' command to access data values.  This means that variable
names are interpreted according to the current frame; variables outside
the current frame cannot be displayed.

   In JDB 1.1, the `dump' and `print' commands do not support
expression evaluation.  Hence, you cannot display arbitrary expressions.

   Parsing of JDB output is quite CPU-intensive, due to the recognition
of asynchronous prompts (any thread may output anything at any time,
including prompts).  Hence, a program producing much console output is
likely to slow down DDD considerably.  In such a case, have the program
run with `-debug' in a separate window and attach JDB to it using the
`-passwd' option.

C.6 Using DDD with GNU Make
===========================

GNU Make support is rather new. As a programming language, GNU Make is
a bit of a stretch for DDD. There are no record structures or hash
tables, no pointers. Well, actually this does exist, but the records,
pointers and hash tables are fixed into the system.  There are Makefile
variables, "targets" (which sometimes refer to files), dependencies,
and commands. There is sort of an "scope" that for variables too.

   But much of the data display and visualization features of DDD are
disabled. However `info locals' does work and you can hover over a
variable and see its value.

   As with any scripting or interpreted language like Perl, stepping a
machine-language instructions (commands Stepi/Nexti) doesn't exist.

   Pay special attention when the prompt has extra angle
brackets--nested invocation of GNU MAKE. Quitting may merely exit out
of one of these nested invocations rather than leave the program.

C.7 Using DDD with Perl
=======================

There is no automatic data display in Perl.  As a workaround, DDD uses
the `x' command to access data values.  This means that variable names
are interpreted according to the current frame; variables outside the
current frame cannot be displayed.

C.8 Using DDD with Python
=========================

In short, make sure you use a newer version of `pydb', one from
`http://bashdb.sourceforge.net/pydb'. Older versions that had been
supplied with DDD will no longer work.

   History: Up to around 1999 there was parallel development that went
on between DDD's Python debugger `pydb' and the stock python debugger
`pdb'. These were not necessarily _competing_ efforts, just parallel.
In fact the same person worked a little bit on both.

   One feature that `pydb' supported that wasn't in `pdb' was GDB's
`display' command.

   After 1999, maintaining `pydb' more or less fell into disuse and
`pdb' sort of inched ahead with bug fixes and redisigned interaces.
Around the beginning of 2006, new work was started to enhance pdb and
to make it more like GDB. Since DDD already understands a large set of
GDB commands, many of these enhancements were immediately realizable by
DDD. These things include command completion, restarting the debugger,
and using set/show/info commands.

   With the blessing of the original author of `pydb', the new effort
took over the name of the old one, Although it did not actually start
out from the `pydb' base but from pdb adding the old `pydb' features.

C.9 Using DDD with XDB
======================

There is no automatic data display in XDB.  As a workaround, DDD uses
the `p' command to access data values.  This means that variable names
are interpreted according to the current frame; variables outside the
current frame cannot be displayed.

C.10 Using DDD with LessTif
===========================

DDD includes a number of hacks that make DDD run with _LessTif,_ a free
M*tif library without loss of functionality.  Since a DDD binary may be
dynamically bound and used with either an OSF/Motif or LessTif library,
these _lesstif hacks_ can be enabled and disabled at run time.

   Whether the _lesstif hacks_ are included at run-time depends on the
setting of the `lessTifVersion' resource:

 -- Resource: lessTifVersion (class LessTifVersion)
     Indicates the LessTif version DDD is running against.  For LessTif
     version X.Y, the value is X multiplied by 1000 plus Y--for
     instance, the value `79' stands for LessTif 0.79 and the value
     `1005' stands for LessTif 1.5.

     If the value of this resource is less than 1000, indicating LessTif
     0.99 or earlier, DDD enables version-specific hacks to make DDD
     work around LessTif bugs and deficiencies.

     If DDD was compiled against LessTif, the default value is the
     value of the `LessTifVersion' macro in `<Xm/Xm.h>'.  If DDD was
     compiled against OSF/Motif, the default value is `1000', disabling
     all LessTif-specific hacks.

   To set the `lessTifVersion' resource at DDD invocation and to
specify the version number of the LessTif library, you can also use the
option `--lesstif-version' VERSION.

   The default value of the `lessTifVersion' resource is derived from
the LessTif library DDD was compiled against (or `1000' when compiled
against OSF/Motif).  Hence, you normally don't need to worry about the
value of this resource.  However, if you use a dynamically linked DDD
binary with a library other than the one DDD was compiled against, you
must specify the version number of the library using this resource.
(Unfortunately, DDD cannot detect this at run-time.)

   Here are a few scenarios to illustrate this scheme:
   * Your DDD binary was compiled against OSF/Motif, but you use a
     LessTif 0.88 dynamic library instead.  Invoke DDD with
     `--lesstif-version 88'.

   * Your DDD binary was compiled against LessTif, but you use a
     OSF/Motif dynamic library instead.    Invoke DDD with
     `--lesstif-version 1000'.

   * Your DDD binary was compiled against LessTif 0.85, and you have
     upgraded to LessTif 0.90.  Invoke DDD with `--lesstif-version 90'.

   To find out the LessTif or OSF/Motif version DDD was compiled
against, invoke DDD with the `--configuration' option.

   In the DDD source, LessTif-specific hacks are controlled by the
string `lesstif_version'.

Appendix D Dirty Tricks
***********************

Do you miss anything in this manual?  Do you have any material that
should be added?  Please send any contributions to <ddd@gnu.org>.

Appendix E Extending DDD
************************

If you have any contributions to be incorporated into DDD, please send
them to <ddd@gnu.org>.  For suggestions on what might be done, see the
file `TODO' in the DDD distribution.

Appendix F Frequently Answered Questions
****************************************

See the DDD WWW page (http://www.gnu.org/software/ddd/) for frequently
answered questions not covered in this manual.

Appendix G GNU General Public License
*************************************

                        Version 3, 29 June 2007

     Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/'

     Everyone is permitted to copy and distribute verbatim copies of this
     license document, but changing it is not allowed.

Preamble
========

The GNU General Public License is a free, copyleft license for software
and other kinds of works.

   The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains
free software for all its users.  We, the Free Software Foundation, use
the GNU General Public License for most of our software; it applies
also to any other work released this way by its authors.  You can apply
it to your programs, too.

   When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

   To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you
have certain responsibilities if you distribute copies of the software,
or if you modify it: responsibilities to respect the freedom of others.

   For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

   Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

   For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

   Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the
manufacturer can do so.  This is fundamentally incompatible with the
aim of protecting users' freedom to change the software.  The
systematic pattern of such abuse occurs in the area of products for
individuals to use, which is precisely where it is most unacceptable.
Therefore, we have designed this version of the GPL to prohibit the
practice for those products.  If such problems arise substantially in
other domains, we stand ready to extend this provision to those domains
in future versions of the GPL, as needed to protect the freedom of
users.

   Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

   The precise terms and conditions for copying, distribution and
modification follow.

TERMS AND CONDITIONS
====================

  0. Definitions.

     "This License" refers to version 3 of the GNU General Public
     License.

     "Copyright" also means copyright-like laws that apply to other
     kinds of works, such as semiconductor masks.

     "The Program" refers to any copyrightable work licensed under this
     License.  Each licensee is addressed as "you".  "Licensees" and
     "recipients" may be individuals or organizations.

     To "modify" a work means to copy from or adapt all or part of the
     work in a fashion requiring copyright permission, other than the
     making of an exact copy.  The resulting work is called a "modified
     version" of the earlier work or a work "based on" the earlier work.

     A "covered work" means either the unmodified Program or a work
     based on the Program.

     To "propagate" a work means to do anything with it that, without
     permission, would make you directly or secondarily liable for
     infringement under applicable copyright law, except executing it
     on a computer or modifying a private copy.  Propagation includes
     copying, distribution (with or without modification), making
     available to the public, and in some countries other activities as
     well.

     To "convey" a work means any kind of propagation that enables other
     parties to make or receive copies.  Mere interaction with a user
     through a computer network, with no transfer of a copy, is not
     conveying.

     An interactive user interface displays "Appropriate Legal Notices"
     to the extent that it includes a convenient and prominently visible
     feature that (1) displays an appropriate copyright notice, and (2)
     tells the user that there is no warranty for the work (except to
     the extent that warranties are provided), that licensees may
     convey the work under this License, and how to view a copy of this
     License.  If the interface presents a list of user commands or
     options, such as a menu, a prominent item in the list meets this
     criterion.

  1. Source Code.

     The "source code" for a work means the preferred form of the work
     for making modifications to it.  "Object code" means any
     non-source form of a work.

     A "Standard Interface" means an interface that either is an
     official standard defined by a recognized standards body, or, in
     the case of interfaces specified for a particular programming
     language, one that is widely used among developers working in that
     language.

     The "System Libraries" of an executable work include anything,
     other than the work as a whole, that (a) is included in the normal
     form of packaging a Major Component, but which is not part of that
     Major Component, and (b) serves only to enable use of the work
     with that Major Component, or to implement a Standard Interface
     for which an implementation is available to the public in source
     code form.  A "Major Component", in this context, means a major
     essential component (kernel, window system, and so on) of the
     specific operating system (if any) on which the executable work
     runs, or a compiler used to produce the work, or an object code
     interpreter used to run it.

     The "Corresponding Source" for a work in object code form means all
     the source code needed to generate, install, and (for an executable
     work) run the object code and to modify the work, including
     scripts to control those activities.  However, it does not include
     the work's System Libraries, or general-purpose tools or generally
     available free programs which are used unmodified in performing
     those activities but which are not part of the work.  For example,
     Corresponding Source includes interface definition files
     associated with source files for the work, and the source code for
     shared libraries and dynamically linked subprograms that the work
     is specifically designed to require, such as by intimate data
     communication or control flow between those subprograms and other
     parts of the work.

     The Corresponding Source need not include anything that users can
     regenerate automatically from other parts of the Corresponding
     Source.

     The Corresponding Source for a work in source code form is that
     same work.

  2. Basic Permissions.

     All rights granted under this License are granted for the term of
     copyright on the Program, and are irrevocable provided the stated
     conditions are met.  This License explicitly affirms your unlimited
     permission to run the unmodified Program.  The output from running
     a covered work is covered by this License only if the output,
     given its content, constitutes a covered work.  This License
     acknowledges your rights of fair use or other equivalent, as
     provided by copyright law.

     You may make, run and propagate covered works that you do not
     convey, without conditions so long as your license otherwise
     remains in force.  You may convey covered works to others for the
     sole purpose of having them make modifications exclusively for
     you, or provide you with facilities for running those works,
     provided that you comply with the terms of this License in
     conveying all material for which you do not control copyright.
     Those thus making or running the covered works for you must do so
     exclusively on your behalf, under your direction and control, on
     terms that prohibit them from making any copies of your
     copyrighted material outside their relationship with you.

     Conveying under any other circumstances is permitted solely under
     the conditions stated below.  Sublicensing is not allowed; section
     10 makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

     No covered work shall be deemed part of an effective technological
     measure under any applicable law fulfilling obligations under
     article 11 of the WIPO copyright treaty adopted on 20 December
     1996, or similar laws prohibiting or restricting circumvention of
     such measures.

     When you convey a covered work, you waive any legal power to forbid
     circumvention of technological measures to the extent such
     circumvention is effected by exercising rights under this License
     with respect to the covered work, and you disclaim any intention
     to limit operation or modification of the work as a means of
     enforcing, against the work's users, your or third parties' legal
     rights to forbid circumvention of technological measures.

  4. Conveying Verbatim Copies.

     You may convey verbatim copies of the Program's source code as you
     receive it, in any medium, provided that you conspicuously and
     appropriately publish on each copy an appropriate copyright notice;
     keep intact all notices stating that this License and any
     non-permissive terms added in accord with section 7 apply to the
     code; keep intact all notices of the absence of any warranty; and
     give all recipients a copy of this License along with the Program.

     You may charge any price or no price for each copy that you convey,
     and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

     You may convey a work based on the Program, or the modifications to
     produce it from the Program, in the form of source code under the
     terms of section 4, provided that you also meet all of these
     conditions:

       a. The work must carry prominent notices stating that you
          modified it, and giving a relevant date.

       b. The work must carry prominent notices stating that it is
          released under this License and any conditions added under
          section 7.  This requirement modifies the requirement in
          section 4 to "keep intact all notices".

       c. You must license the entire work, as a whole, under this
          License to anyone who comes into possession of a copy.  This
          License will therefore apply, along with any applicable
          section 7 additional terms, to the whole of the work, and all
          its parts, regardless of how they are packaged.  This License
          gives no permission to license the work in any other way, but
          it does not invalidate such permission if you have separately
          received it.

       d. If the work has interactive user interfaces, each must display
          Appropriate Legal Notices; however, if the Program has
          interactive interfaces that do not display Appropriate Legal
          Notices, your work need not make them do so.

     A compilation of a covered work with other separate and independent
     works, which are not by their nature extensions of the covered
     work, and which are not combined with it such as to form a larger
     program, in or on a volume of a storage or distribution medium, is
     called an "aggregate" if the compilation and its resulting
     copyright are not used to limit the access or legal rights of the
     compilation's users beyond what the individual works permit.
     Inclusion of a covered work in an aggregate does not cause this
     License to apply to the other parts of the aggregate.

  6. Conveying Non-Source Forms.

     You may convey a covered work in object code form under the terms
     of sections 4 and 5, provided that you also convey the
     machine-readable Corresponding Source under the terms of this
     License, in one of these ways:

       a. Convey the object code in, or embodied in, a physical product
          (including a physical distribution medium), accompanied by the
          Corresponding Source fixed on a durable physical medium
          customarily used for software interchange.

       b. Convey the object code in, or embodied in, a physical product
          (including a physical distribution medium), accompanied by a
          written offer, valid for at least three years and valid for
          as long as you offer spare parts or customer support for that
          product model, to give anyone who possesses the object code
          either (1) a copy of the Corresponding Source for all the
          software in the product that is covered by this License, on a
          durable physical medium customarily used for software
          interchange, for a price no more than your reasonable cost of
          physically performing this conveying of source, or (2) access
          to copy the Corresponding Source from a network server at no
          charge.

       c. Convey individual copies of the object code with a copy of
          the written offer to provide the Corresponding Source.  This
          alternative is allowed only occasionally and noncommercially,
          and only if you received the object code with such an offer,
          in accord with subsection 6b.

       d. Convey the object code by offering access from a designated
          place (gratis or for a charge), and offer equivalent access
          to the Corresponding Source in the same way through the same
          place at no further charge.  You need not require recipients
          to copy the Corresponding Source along with the object code.
          If the place to copy the object code is a network server, the
          Corresponding Source may be on a different server (operated
          by you or a third party) that supports equivalent copying
          facilities, provided you maintain clear directions next to
          the object code saying where to find the Corresponding Source.
          Regardless of what server hosts the Corresponding Source, you
          remain obligated to ensure that it is available for as long
          as needed to satisfy these requirements.

       e. Convey the object code using peer-to-peer transmission,
          provided you inform other peers where the object code and
          Corresponding Source of the work are being offered to the
          general public at no charge under subsection 6d.

     A separable portion of the object code, whose source code is
     excluded from the Corresponding Source as a System Library, need
     not be included in conveying the object code work.

     A "User Product" is either (1) a "consumer product", which means
     any tangible personal property which is normally used for personal,
     family, or household purposes, or (2) anything designed or sold for
     incorporation into a dwelling.  In determining whether a product
     is a consumer product, doubtful cases shall be resolved in favor of
     coverage.  For a particular product received by a particular user,
     "normally used" refers to a typical or common use of that class of
     product, regardless of the status of the particular user or of the
     way in which the particular user actually uses, or expects or is
     expected to use, the product.  A product is a consumer product
     regardless of whether the product has substantial commercial,
     industrial or non-consumer uses, unless such uses represent the
     only significant mode of use of the product.

     "Installation Information" for a User Product means any methods,
     procedures, authorization keys, or other information required to
     install and execute modified versions of a covered work in that
     User Product from a modified version of its Corresponding Source.
     The information must suffice to ensure that the continued
     functioning of the modified object code is in no case prevented or
     interfered with solely because modification has been made.

     If you convey an object code work under this section in, or with,
     or specifically for use in, a User Product, and the conveying
     occurs as part of a transaction in which the right of possession
     and use of the User Product is transferred to the recipient in
     perpetuity or for a fixed term (regardless of how the transaction
     is characterized), the Corresponding Source conveyed under this
     section must be accompanied by the Installation Information.  But
     this requirement does not apply if neither you nor any third party
     retains the ability to install modified object code on the User
     Product (for example, the work has been installed in ROM).

     The requirement to provide Installation Information does not
     include a requirement to continue to provide support service,
     warranty, or updates for a work that has been modified or
     installed by the recipient, or for the User Product in which it
     has been modified or installed.  Access to a network may be denied
     when the modification itself materially and adversely affects the
     operation of the network or violates the rules and protocols for
     communication across the network.

     Corresponding Source conveyed, and Installation Information
     provided, in accord with this section must be in a format that is
     publicly documented (and with an implementation available to the
     public in source code form), and must require no special password
     or key for unpacking, reading or copying.

  7. Additional Terms.

     "Additional permissions" are terms that supplement the terms of
     this License by making exceptions from one or more of its
     conditions.  Additional permissions that are applicable to the
     entire Program shall be treated as though they were included in
     this License, to the extent that they are valid under applicable
     law.  If additional permissions apply only to part of the Program,
     that part may be used separately under those permissions, but the
     entire Program remains governed by this License without regard to
     the additional permissions.

     When you convey a copy of a covered work, you may at your option
     remove any additional permissions from that copy, or from any part
     of it.  (Additional permissions may be written to require their own
     removal in certain cases when you modify the work.)  You may place
     additional permissions on material, added by you to a covered work,
     for which you have or can give appropriate copyright permission.

     Notwithstanding any other provision of this License, for material
     you add to a covered work, you may (if authorized by the copyright
     holders of that material) supplement the terms of this License
     with terms:

       a. Disclaiming warranty or limiting liability differently from
          the terms of sections 15 and 16 of this License; or

       b. Requiring preservation of specified reasonable legal notices
          or author attributions in that material or in the Appropriate
          Legal Notices displayed by works containing it; or

       c. Prohibiting misrepresentation of the origin of that material,
          or requiring that modified versions of such material be
          marked in reasonable ways as different from the original
          version; or

       d. Limiting the use for publicity purposes of names of licensors
          or authors of the material; or

       e. Declining to grant rights under trademark law for use of some
          trade names, trademarks, or service marks; or

       f. Requiring indemnification of licensors and authors of that
          material by anyone who conveys the material (or modified
          versions of it) with contractual assumptions of liability to
          the recipient, for any liability that these contractual
          assumptions directly impose on those licensors and authors.

     All other non-permissive additional terms are considered "further
     restrictions" within the meaning of section 10.  If the Program as
     you received it, or any part of it, contains a notice stating that
     it is governed by this License along with a term that is a further
     restriction, you may remove that term.  If a license document
     contains a further restriction but permits relicensing or
     conveying under this License, you may add to a covered work
     material governed by the terms of that license document, provided
     that the further restriction does not survive such relicensing or
     conveying.

     If you add terms to a covered work in accord with this section, you
     must place, in the relevant source files, a statement of the
     additional terms that apply to those files, or a notice indicating
     where to find the applicable terms.

     Additional terms, permissive or non-permissive, may be stated in
     the form of a separately written license, or stated as exceptions;
     the above requirements apply either way.

  8. Termination.

     You may not propagate or modify a covered work except as expressly
     provided under this License.  Any attempt otherwise to propagate or
     modify it is void, and will automatically terminate your rights
     under this License (including any patent licenses granted under
     the third paragraph of section 11).

     However, if you cease all violation of this License, then your
     license from a particular copyright holder is reinstated (a)
     provisionally, unless and until the copyright holder explicitly
     and finally terminates your license, and (b) permanently, if the
     copyright holder fails to notify you of the violation by some
     reasonable means prior to 60 days after the cessation.

     Moreover, your license from a particular copyright holder is
     reinstated permanently if the copyright holder notifies you of the
     violation by some reasonable means, this is the first time you have
     received notice of violation of this License (for any work) from
     that copyright holder, and you cure the violation prior to 30 days
     after your receipt of the notice.

     Termination of your rights under this section does not terminate
     the licenses of parties who have received copies or rights from
     you under this License.  If your rights have been terminated and
     not permanently reinstated, you do not qualify to receive new
     licenses for the same material under section 10.

  9. Acceptance Not Required for Having Copies.

     You are not required to accept this License in order to receive or
     run a copy of the Program.  Ancillary propagation of a covered work
     occurring solely as a consequence of using peer-to-peer
     transmission to receive a copy likewise does not require
     acceptance.  However, nothing other than this License grants you
     permission to propagate or modify any covered work.  These actions
     infringe copyright if you do not accept this License.  Therefore,
     by modifying or propagating a covered work, you indicate your
     acceptance of this License to do so.

 10. Automatic Licensing of Downstream Recipients.

     Each time you convey a covered work, the recipient automatically
     receives a license from the original licensors, to run, modify and
     propagate that work, subject to this License.  You are not
     responsible for enforcing compliance by third parties with this
     License.

     An "entity transaction" is a transaction transferring control of an
     organization, or substantially all assets of one, or subdividing an
     organization, or merging organizations.  If propagation of a
     covered work results from an entity transaction, each party to that
     transaction who receives a copy of the work also receives whatever
     licenses to the work the party's predecessor in interest had or
     could give under the previous paragraph, plus a right to
     possession of the Corresponding Source of the work from the
     predecessor in interest, if the predecessor has it or can get it
     with reasonable efforts.

     You may not impose any further restrictions on the exercise of the
     rights granted or affirmed under this License.  For example, you
     may not impose a license fee, royalty, or other charge for
     exercise of rights granted under this License, and you may not
     initiate litigation (including a cross-claim or counterclaim in a
     lawsuit) alleging that any patent claim is infringed by making,
     using, selling, offering for sale, or importing the Program or any
     portion of it.

 11. Patents.

     A "contributor" is a copyright holder who authorizes use under this
     License of the Program or a work on which the Program is based.
     The work thus licensed is called the contributor's "contributor
     version".

     A contributor's "essential patent claims" are all patent claims
     owned or controlled by the contributor, whether already acquired or
     hereafter acquired, that would be infringed by some manner,
     permitted by this License, of making, using, or selling its
     contributor version, but do not include claims that would be
     infringed only as a consequence of further modification of the
     contributor version.  For purposes of this definition, "control"
     includes the right to grant patent sublicenses in a manner
     consistent with the requirements of this License.

     Each contributor grants you a non-exclusive, worldwide,
     royalty-free patent license under the contributor's essential
     patent claims, to make, use, sell, offer for sale, import and
     otherwise run, modify and propagate the contents of its
     contributor version.

     In the following three paragraphs, a "patent license" is any
     express agreement or commitment, however denominated, not to
     enforce a patent (such as an express permission to practice a
     patent or covenant not to sue for patent infringement).  To
     "grant" such a patent license to a party means to make such an
     agreement or commitment not to enforce a patent against the party.

     If you convey a covered work, knowingly relying on a patent
     license, and the Corresponding Source of the work is not available
     for anyone to copy, free of charge and under the terms of this
     License, through a publicly available network server or other
     readily accessible means, then you must either (1) cause the
     Corresponding Source to be so available, or (2) arrange to deprive
     yourself of the benefit of the patent license for this particular
     work, or (3) arrange, in a manner consistent with the requirements
     of this License, to extend the patent license to downstream
     recipients.  "Knowingly relying" means you have actual knowledge
     that, but for the patent license, your conveying the covered work
     in a country, or your recipient's use of the covered work in a
     country, would infringe one or more identifiable patents in that
     country that you have reason to believe are valid.

     If, pursuant to or in connection with a single transaction or
     arrangement, you convey, or propagate by procuring conveyance of, a
     covered work, and grant a patent license to some of the parties
     receiving the covered work authorizing them to use, propagate,
     modify or convey a specific copy of the covered work, then the
     patent license you grant is automatically extended to all
     recipients of the covered work and works based on it.

     A patent license is "discriminatory" if it does not include within
     the scope of its coverage, prohibits the exercise of, or is
     conditioned on the non-exercise of one or more of the rights that
     are specifically granted under this License.  You may not convey a
     covered work if you are a party to an arrangement with a third
     party that is in the business of distributing software, under
     which you make payment to the third party based on the extent of
     your activity of conveying the work, and under which the third
     party grants, to any of the parties who would receive the covered
     work from you, a discriminatory patent license (a) in connection
     with copies of the covered work conveyed by you (or copies made
     from those copies), or (b) primarily for and in connection with
     specific products or compilations that contain the covered work,
     unless you entered into that arrangement, or that patent license
     was granted, prior to 28 March 2007.

     Nothing in this License shall be construed as excluding or limiting
     any implied license or other defenses to infringement that may
     otherwise be available to you under applicable patent law.

 12. No Surrender of Others' Freedom.

     If conditions are imposed on you (whether by court order,
     agreement or otherwise) that contradict the conditions of this
     License, they do not excuse you from the conditions of this
     License.  If you cannot convey a covered work so as to satisfy
     simultaneously your obligations under this License and any other
     pertinent obligations, then as a consequence you may not convey it
     at all.  For example, if you agree to terms that obligate you to
     collect a royalty for further conveying from those to whom you
     convey the Program, the only way you could satisfy both those
     terms and this License would be to refrain entirely from conveying
     the Program.

 13. Use with the GNU Affero General Public License.

     Notwithstanding any other provision of this License, you have
     permission to link or combine any covered work with a work licensed
     under version 3 of the GNU Affero General Public License into a
     single combined work, and to convey the resulting work.  The terms
     of this License will continue to apply to the part which is the
     covered work, but the special requirements of the GNU Affero
     General Public License, section 13, concerning interaction through
     a network will apply to the combination as such.

 14. Revised Versions of this License.

     The Free Software Foundation may publish revised and/or new
     versions of the GNU General Public License from time to time.
     Such new versions will be similar in spirit to the present
     version, but may differ in detail to address new problems or
     concerns.

     Each version is given a distinguishing version number.  If the
     Program specifies that a certain numbered version of the GNU
     General Public License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that numbered version or of any later version published by the
     Free Software Foundation.  If the Program does not specify a
     version number of the GNU General Public License, you may choose
     any version ever published by the Free Software Foundation.

     If the Program specifies that a proxy can decide which future
     versions of the GNU General Public License can be used, that
     proxy's public statement of acceptance of a version permanently
     authorizes you to choose that version for the Program.

     Later license versions may give you additional or different
     permissions.  However, no additional obligations are imposed on any
     author or copyright holder as a result of your choosing to follow a
     later version.

 15. Disclaimer of Warranty.

     THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
     APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE
     COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE
     RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
     SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
     NECESSARY SERVICING, REPAIR OR CORRECTION.

 16. Limitation of Liability.

     IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
     WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
     AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
     FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
     CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
     THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
     BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
     PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
     PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
     THE POSSIBILITY OF SUCH DAMAGES.

 17. Interpretation of Sections 15 and 16.

     If the disclaimer of warranty and limitation of liability provided
     above cannot be given local legal effect according to their terms,
     reviewing courts shall apply local law that most closely
     approximates an absolute waiver of all civil liability in
     connection with the Program, unless a warranty or assumption of
     liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS
===========================

How to Apply These Terms to Your New Programs
=============================================

If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.

   To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

     ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
     Copyright (C) YEAR NAME OF AUTHOR

     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 3 of the License, or (at
     your option) any later version.

     This program is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     General Public License for more details.

     You should have received a copy of the GNU General Public License
     along with this program.  If not, see `http://www.gnu.org/licenses/'.

   Also add information on how to contact you by electronic and paper
mail.

   If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

     PROGRAM Copyright (C) YEAR NAME OF AUTHOR
     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
     This is free software, and you are welcome to redistribute it
     under certain conditions; type `show c' for details.

   The hypothetical commands `show w' and `show c' should show the
appropriate parts of the General Public License.  Of course, your
program's commands might be different; for a GUI interface, you would
use an "about box".

   You should also get your employer (if you work as a programmer) or
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  For more information on this, and how to apply and follow
the GNU GPL, see `http://www.gnu.org/licenses/'.

   The GNU General Public License does not permit incorporating your
program into proprietary programs.  If your program is a subroutine
library, you may consider it more useful to permit linking proprietary
applications with the library.  If this is what you want to do, use the
GNU Lesser General Public License instead of this License.  But first,
please read `http://www.gnu.org/philosophy/why-not-lgpl.html'.

Appendix H Help and Assistance
******************************

We have set up a _mailing list_ for general DDD discussions.  If you
need help and assistance for solving a DDD problem, you find the right
people here.

   Send message to all receivers of the mailing list to:

     <ddd@gnu.org>

   This mailing list is also the place where new DDD releases are
announced.  If you want to subscribe the list, or get more information,
send a mail to

     <ddd-request@gnu.org>

   See also the DDD WWW page (http://www.gnu.org/software/ddd/) for
recent announcements and other news related to DDD.

Appendix I GNU Free Documentation License
*****************************************

                        Version 1.1, March 2000

     Copyright (C) 2000  Free Software Foundation, Inc.
     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.

  0. PREAMBLE

     The purpose of this License is to make a manual, textbook, or other
     written document "free" in the sense of freedom: to assure everyone
     the effective freedom to copy and redistribute it, with or without
     modifying it, either commercially or noncommercially.  Secondarily,
     this License preserves for the author and publisher a way to get
     credit for their work, while not being considered responsible for
     modifications made by others.

     This License is a kind of "copyleft", which means that derivative
     works of the document must themselves be free in the same sense.
     It complements the GNU General Public License, which is a copyleft
     license designed for free software.

     We have designed this License in order to use it for manuals for
     free software, because free software needs free documentation: a
     free program should come with manuals providing the same freedoms
     that the software does.  But this License is not limited to
     software manuals; it can be used for any textual work, regardless
     of subject matter or whether it is published as a printed book.
     We recommend this License principally for works whose purpose is
     instruction or reference.

  1. APPLICABILITY AND DEFINITIONS

     This License applies to any manual or other work that contains a
     notice placed by the copyright holder saying it can be distributed
     under the terms of this License.  The "Document", below, refers to
     any such manual or work.  Any member of the public is a licensee,
     and is addressed as "you".

     A "Modified Version" of the Document means any work containing the
     Document or a portion of it, either copied verbatim, or with
     modifications and/or translated into another language.

     A "Secondary Section" is a named appendix or a front-matter
     section of the Document that deals exclusively with the
     relationship of the publishers or authors of the Document to the
     Document's overall subject (or to related matters) and contains
     nothing that could fall directly within that overall subject.
     (For example, if the Document is in part a textbook of
     mathematics, a Secondary Section may not explain any mathematics.)
     The relationship could be a matter of historical connection with
     the subject or with related matters, or of legal, commercial,
     philosophical, ethical or political position regarding them.

     The "Invariant Sections" are certain Secondary Sections whose
     titles are designated, as being those of Invariant Sections, in
     the notice that says that the Document is released under this
     License.

     The "Cover Texts" are certain short passages of text that are
     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
     that says that the Document is released under this License.

     A "Transparent" copy of the Document means a machine-readable copy,
     represented in a format whose specification is available to the
     general public, whose contents can be viewed and edited directly
     and straightforwardly with generic text editors or (for images
     composed of pixels) generic paint programs or (for drawings) some
     widely available drawing editor, and that is suitable for input to
     text formatters or for automatic translation to a variety of
     formats suitable for input to text formatters.  A copy made in an
     otherwise Transparent file format whose markup has been designed
     to thwart or discourage subsequent modification by readers is not
     Transparent.  A copy that is not "Transparent" is called "Opaque".

     Examples of suitable formats for Transparent copies include plain
     ASCII without markup, Texinfo input format, LaTeX input format,
     SGML or XML using a publicly available DTD, and
     standard-conforming simple HTML designed for human modification.
     Opaque formats include PostScript, PDF, proprietary formats that
     can be read and edited only by proprietary word processors, SGML
     or XML for which the DTD and/or processing tools are not generally
     available, and the machine-generated HTML produced by some word
     processors for output purposes only.

     The "Title Page" means, for a printed book, the title page itself,
     plus such following pages as are needed to hold, legibly, the
     material this License requires to appear in the title page.  For
     works in formats which do not have any title page as such, "Title
     Page" means the text near the most prominent appearance of the
     work's title, preceding the beginning of the body of the text.

  2. VERBATIM COPYING

     You may copy and distribute the Document in any medium, either
     commercially or noncommercially, provided that this License, the
     copyright notices, and the license notice saying this License
     applies to the Document are reproduced in all copies, and that you
     add no other conditions whatsoever to those of this License.  You
     may not use technical measures to obstruct or control the reading
     or further copying of the copies you make or distribute.  However,
     you may accept compensation in exchange for copies.  If you
     distribute a large enough number of copies you must also follow
     the conditions in section 3.

     You may also lend copies, under the same conditions stated above,
     and you may publicly display copies.

  3. COPYING IN QUANTITY

     If you publish printed copies of the Document numbering more than
     100, and the Document's license notice requires Cover Texts, you
     must enclose the copies in covers that carry, clearly and legibly,
     all these Cover Texts: Front-Cover Texts on the front cover, and
     Back-Cover Texts on the back cover.  Both covers must also clearly
     and legibly identify you as the publisher of these copies.  The
     front cover must present the full title with all words of the
     title equally prominent and visible.  You may add other material
     on the covers in addition.  Copying with changes limited to the
     covers, as long as they preserve the title of the Document and
     satisfy these conditions, can be treated as verbatim copying in
     other respects.

     If the required texts for either cover are too voluminous to fit
     legibly, you should put the first ones listed (as many as fit
     reasonably) on the actual cover, and continue the rest onto
     adjacent pages.

     If you publish or distribute Opaque copies of the Document
     numbering more than 100, you must either include a
     machine-readable Transparent copy along with each Opaque copy, or
     state in or with each Opaque copy a publicly-accessible
     computer-network location containing a complete Transparent copy
     of the Document, free of added material, which the general
     network-using public has access to download anonymously at no
     charge using public-standard network protocols.  If you use the
     latter option, you must take reasonably prudent steps, when you
     begin distribution of Opaque copies in quantity, to ensure that
     this Transparent copy will remain thus accessible at the stated
     location until at least one year after the last time you
     distribute an Opaque copy (directly or through your agents or
     retailers) of that edition to the public.

     It is requested, but not required, that you contact the authors of
     the Document well before redistributing any large number of
     copies, to give them a chance to provide you with an updated
     version of the Document.

  4. MODIFICATIONS

     You may copy and distribute a Modified Version of the Document
     under the conditions of sections 2 and 3 above, provided that you
     release the Modified Version under precisely this License, with
     the Modified Version filling the role of the Document, thus
     licensing distribution and modification of the Modified Version to
     whoever possesses a copy of it.  In addition, you must do these
     things in the Modified Version:

     A. Use in the Title Page (and on the covers, if any) a title
     distinct    from that of the Document, and from those of previous
     versions    (which should, if there were any, be listed in the
     History section    of the Document).  You may use the same title
     as a previous version    if the original publisher of that version
     gives permission.
     B. List on the Title Page, as authors, one or more persons or
     entities    responsible for authorship of the modifications in the
     Modified    Version, together with at least five of the principal
     authors of the    Document (all of its principal authors, if it
     has less than five).
     C. State on the Title page the name of the publisher of the
     Modified Version, as the publisher.
     D. Preserve all the copyright notices of the Document.
     E. Add an appropriate copyright notice for your modifications
     adjacent to the other copyright notices.
     F. Include, immediately after the copyright notices, a license
     notice    giving the public permission to use the Modified Version
     under the    terms of this License, in the form shown in the
     Addendum below.
     G. Preserve in that license notice the full lists of Invariant
     Sections    and required Cover Texts given in the Document's
     license notice.
     H. Include an unaltered copy of this License.
     I. Preserve the section entitled "History", and its title, and add
     to    it an item stating at least the title, year, new authors, and
       publisher of the Modified Version as given on the Title Page.  If
       there is no section entitled "History" in the Document, create
     one    stating the title, year, authors, and publisher of the
     Document as    given on its Title Page, then add an item
     describing the Modified    Version as stated in the previous
     sentence.
     J. Preserve the network location, if any, given in the Document for
       public access to a Transparent copy of the Document, and likewise
       the network locations given in the Document for previous versions
       it was based on.  These may be placed in the "History" section.
       You may omit a network location for a work that was published at
       least four years before the Document itself, or if the original
      publisher of the version it refers to gives permission.
     K. In any section entitled "Acknowledgements" or "Dedications",
     preserve the section's title, and preserve in the section all the
      substance and tone of each of the contributor acknowledgements
     and/or dedications given therein.
     L. Preserve all the Invariant Sections of the Document,
     unaltered in their text and in their titles.  Section numbers
     or the equivalent are not considered part of the section titles.
     M. Delete any section entitled "Endorsements".  Such a section
     may not be included in the Modified Version.
     N. Do not retitle any existing section as "Endorsements"    or to
     conflict in title with any Invariant Section.

     If the Modified Version includes new front-matter sections or
     appendices that qualify as Secondary Sections and contain no
     material copied from the Document, you may at your option
     designate some or all of these sections as invariant.  To do this,
     add their titles to the list of Invariant Sections in the Modified
     Version's license notice.  These titles must be distinct from any
     other section titles.

     You may add a section entitled "Endorsements", provided it contains
     nothing but endorsements of your Modified Version by various
     parties-for example, statements of peer review or that the text has
     been approved by an organization as the authoritative definition
     of a standard.

     You may add a passage of up to five words as a Front-Cover Text,
     and a passage of up to 25 words as a Back-Cover Text, to the end
     of the list of Cover Texts in the Modified Version.  Only one
     passage of Front-Cover Text and one of Back-Cover Text may be
     added by (or through arrangements made by) any one entity.  If the
     Document already includes a cover text for the same cover,
     previously added by you or by arrangement made by the same entity
     you are acting on behalf of, you may not add another; but you may
     replace the old one, on explicit permission from the previous
     publisher that added the old one.

     The author(s) and publisher(s) of the Document do not by this
     License give permission to use their names for publicity for or to
     assert or imply endorsement of any Modified Version.

  5. COMBINING DOCUMENTS

     You may combine the Document with other documents released under
     this License, under the terms defined in section 4 above for
     modified versions, provided that you include in the combination
     all of the Invariant Sections of all of the original documents,
     unmodified, and list them all as Invariant Sections of your
     combined work in its license notice.

     The combined work need only contain one copy of this License, and
     multiple identical Invariant Sections may be replaced with a single
     copy.  If there are multiple Invariant Sections with the same name
     but different contents, make the title of each such section unique
     by adding at the end of it, in parentheses, the name of the
     original author or publisher of that section if known, or else a
     unique number.  Make the same adjustment to the section titles in
     the list of Invariant Sections in the license notice of the
     combined work.

     In the combination, you must combine any sections entitled
     "History" in the various original documents, forming one section
     entitled "History"; likewise combine any sections entitled
     "Acknowledgements", and any sections entitled "Dedications".  You
     must delete all sections entitled "Endorsements."

  6. COLLECTIONS OF DOCUMENTS

     You may make a collection consisting of the Document and other
     documents released under this License, and replace the individual
     copies of this License in the various documents with a single copy
     that is included in the collection, provided that you follow the
     rules of this License for verbatim copying of each of the
     documents in all other respects.

     You may extract a single document from such a collection, and
     distribute it individually under this License, provided you insert
     a copy of this License into the extracted document, and follow
     this License in all other respects regarding verbatim copying of
     that document.

  7. AGGREGATION WITH INDEPENDENT WORKS

     A compilation of the Document or its derivatives with other
     separate and independent documents or works, in or on a volume of
     a storage or distribution medium, does not as a whole count as a
     Modified Version of the Document, provided no compilation
     copyright is claimed for the compilation.  Such a compilation is
     called an "aggregate", and this License does not apply to the
     other self-contained works thus compiled with the Document, on
     account of their being thus compiled, if they are not themselves
     derivative works of the Document.

     If the Cover Text requirement of section 3 is applicable to these
     copies of the Document, then if the Document is less than one
     quarter of the entire aggregate, the Document's Cover Texts may be
     placed on covers that surround only the Document within the
     aggregate.  Otherwise they must appear on covers around the whole
     aggregate.

  8. TRANSLATION

     Translation is considered a kind of modification, so you may
     distribute translations of the Document under the terms of section
     4.  Replacing Invariant Sections with translations requires special
     permission from their copyright holders, but you may include
     translations of some or all Invariant Sections in addition to the
     original versions of these Invariant Sections.  You may include a
     translation of this License provided that you also include the
     original English version of this License.  In case of a
     disagreement between the translation and the original English
     version of this License, the original English version will prevail.

  9. TERMINATION

     You may not copy, modify, sublicense, or distribute the Document
     except as expressly provided for under this License.  Any other
     attempt to copy, modify, sublicense or distribute the Document is
     void, and will automatically terminate your rights under this
     License.  However, parties who have received copies, or rights,
     from you under this License will not have their licenses
     terminated so long as such parties remain in full compliance.

 10. FUTURE REVISIONS OF THIS LICENSE

     The Free Software Foundation may publish new, revised versions of
     the GNU Free Documentation License from time to time.  Such new
     versions will be similar in spirit to the present version, but may
     differ in detail to address new problems or concerns.  See
     http://www.gnu.org/copyleft/.

     Each version of the License is given a distinguishing version
     number.  If the Document specifies that a particular numbered
     version of this License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that specified version or of any later version that has been
     published (not as a draft) by the Free Software Foundation.  If
     the Document does not specify a version number of this License,
     you may choose any version ever published (not as a draft) by the
     Free Software Foundation.

ADDENDUM: How to use this License for your documents
====================================================

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:

       Copyright (C)  YEAR  YOUR NAME.
       Permission is granted to copy, distribute and/or modify this document
       under the terms of the GNU Free Documentation License, Version 1.1
       or any later version published by the Free Software Foundation;
       with the Invariant Sections being LIST THEIR TITLES, with the
       Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
       A copy of the license is included in the section entitled ``GNU
       Free Documentation License''.
If you have no Invariant Sections, write "with no Invariant Sections"
instead of saying which ones are invariant.  If you have no Front-Cover
Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being
LIST"; likewise for Back-Cover Texts.

   If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License, to
permit their use in free software.