Initial implementation of Debugger Adapter Protocol
authorTom Tromey <tromey@adacore.com>
Thu, 23 Jun 2022 17:11:36 +0000 (11:11 -0600)
committerTom Tromey <tromey@adacore.com>
Mon, 2 Jan 2023 16:49:37 +0000 (09:49 -0700)
commitde7d7cb58e6209ed11c31f635545ee2ee6ded307
treed0681c4ad9e7207227166990d6133cca83fae24c
parentc43d829bca5e45c5e6c0255a549abc5766f6de7f
Initial implementation of Debugger Adapter Protocol

The Debugger Adapter Protocol is a JSON-RPC protocol that IDEs can use
to communicate with debuggers.  You can find more information here:

    https://microsoft.github.io/debug-adapter-protocol/

Frequently this is implemented as a shim, but it seemed to me that GDB
could implement it directly, via the Python API.  This patch is the
initial implementation.

DAP is implemented as a new "interp".  This is slightly weird, because
it doesn't act like an ordinary interpreter -- for example it doesn't
implement a command syntax, and doesn't use GDB's ordinary event loop.
However, this seemed like the best approach overall.

To run GDB in this mode, use:

    gdb -i=dap

The DAP code will accept JSON-RPC messages on stdin and print
responses to stdout.  GDB redirects the inferior's stdout to a new
pipe so that output can be encapsulated by the protocol.

The Python code uses multiple threads to do its work.  Separate
threads are used for reading JSON from the client and for writing JSON
to the client.  All GDB work is done in the main thread.  (The first
implementation used asyncio, but this had some limitations, and so I
rewrote it to use threads instead.)

This is not a complete implementation of the protocol, but it does
implement enough to demonstrate that the overall approach works.

There is a rudimentary test suite.  It uses a JSON parser written in
pure Tcl.  This parser is under the same license as Tcl itself, so I
felt it was acceptable to simply import it into the tree.

There is also a bit of documentation -- just documenting the new
interpreter name.
26 files changed:
gdb/Makefile.in
gdb/NEWS
gdb/data-directory/Makefile.in
gdb/doc/gdb.texinfo
gdb/python/lib/gdb/dap/__init__.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/breakpoint.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/bt.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/disassemble.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/evaluate.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/events.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/frames.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/io.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/launch.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/next.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/pause.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/scopes.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/server.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/startup.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/state.py [new file with mode: 0644]
gdb/python/lib/gdb/dap/threads.py [new file with mode: 0644]
gdb/python/py-dap.c [new file with mode: 0644]
gdb/testsuite/gdb.dap/basic-dap.c [new file with mode: 0644]
gdb/testsuite/gdb.dap/basic-dap.exp [new file with mode: 0644]
gdb/testsuite/lib/dap-support.exp [new file with mode: 0644]
gdb/testsuite/lib/mi-support.exp
gdb/testsuite/lib/ton.tcl [new file with mode: 0644]