Introduction:
------------

This library is an attempt to support the GDB/MI interface. MI stands for
machine interface. In this mode gdb sends responses that are "machine
readable" instead of "human readable"

Objetive:
--------

To implement a C and C++ interface to talk with gdb using it.

Advantages:
----------

* The responses should be i18n independent and with less problems to be parsed.
* New versions shouldn't break the parser.

Disadvantages:
-------------

* The responses are quite complex.
* The responses can't be easily read by a human.

Motivation:
----------

To add remote debugging to SETEdit. RHIDE lacks it.

Currently supported platcforms:
------------------------------

Currently we support:

* Linux console
* Linux X11

The code should be usable by other systems that provides POSIX API and where
gdb is available.

How to compile and install:
--------------------------

Change to the "src" directory and run "make". Change to root and run "make
install".
The "Makefile" could need changes. The PREFIX is /usr you most probably will
want to change it to /usr/local.

How to run examples:
-------------------

Switch to the "examples" directory and run "make". Read the comments at the
beggining of the examples.
They show how to use the library for different targets.

* linux_test: Linux console. Shows how to set breakpoints and watchpoints.
* remote_test: Remote debugging using TCP/IP connection. Shows breakpoints.
* x11_cpp_test: Shows how to use the C++ wrapper. The examples is for X11.
* x11_fr_test: Linux X11. Shows how to use "frames" and "variable objects".
* x11_test: Linux X11. Shows how to set breakpoints and watchpoints.
* x11_wp_test: Linux X11. Shows how to set watchpoints.

Function reference and help:
---------------------------

An incomplete reference can be found in the "doc" directory. I suggest
looking at the examples with the reference at hand.


Author:
------

Salvador E. Tropea
Email: user: set, server: users.sf.net

     Telephone: (+5411) 4759-0013
     Postal Address:
     Salvador E. Tropea
     Curapaligue 2124
     (1678) Caseros - 3 de Febrero
     Prov: Buenos Aires
     Argentina

-----------------------------------------------------------------------------

Random notes:
------------

Debug strategies:

1) Remote using TCP/IP: This methode is quite limited. One amazing thing I
noticed is that you can't set watchpoints. Other important differences are
that the remote target starts "running", it means you have to use continue
instead of run and it also means that command line arguments must be provided
at the remote end.
The way that's implemented you need a full gdb on the local end. That's ok
when you want to release the remote end from some of the heavy tasks (like
loading all the debug info), but doesn't help if what you want is just
control gdb from a remote machine sending the commands throu TCP/IP. The last
could allow debugging DOS applications under Windows exploting the Windows
multitasking.

2) Local under X: We start an xterm child that runs:

<--- /tmp/xxxxxx.sh
tty > /tmp/yyyyyy
sleep 100d
<---

That's "xterm -e /bin/sh /tmp/xxxxxx.sh &"
Then we read /tmp/yyyyyy file to know the ttyname, delete both files and
tell gdb to use this terminal.
This is implemented by: gmi_start_xterm()

3) Local for Linux console: We can open a new terminal (as X and Allegro
does with tty8 and higher).
This is implemented by: gmi_look_for_free_vt()

4) Local for Linux console, same terminal: We tell gdb to use the current
terminal, but before sending an async command we so Suspend and when we get
an async response "stopped" we Resume. This is less functional and more
complex.


