"Mark Cave-Ayland" <[EMAIL PROTECTED]> writes:
> The most important question to answer in my mind is how should the
> debugger communicate with the server?
 
>       1) Use the existing FE/BE protocol to allow the user to control
>       the debugging session using stored procedures/pseudo-tables, e.g.
 
>               SELECT pg_debug_enable('myfunction');
>               INSERT INTO pg_debug_breakpoints (function, line) VALUES
>               ('myfunction', 2);
>               SELECT pg_debug_step('myfunction');
 
I think this approach is utterly unworkable: it assumes that the
client application is cooperative, and it ignores the fact that the
operations you need to step through are inside a SQL command, which
is not a place where you can easily issue more SQL commands ---
certainly not without horrid damage to the FE/BE protocol.

You mustn't assume a cooperative application, either.  Suppose that
you need to debug what your PL functions are doing when driven by a
complicated web application.  Injecting debug commands through the
application would require the cooperation of quite a few layers of
code (eg, JDBC, a couple of levels of middleware, etc) and is just
not going to happen.
 
>       2) Spawn a separate debugger process listening on another port to
>       allow OOB communication with the server. This would involve the
> design
>       and implementation of a debug FE/BE protocol, unless there is a
>       standard that already exists.

The way I usually debug server problems is to attach with GDB to an
already-started server process.  This is fairly convenient and requires
no special client support, but it's less than desirable from a security
point of view: you have to be on the server's machine and be the same
user (or root) to be allowed to attach.  I would imagine any
direct-attach protocol we might invent would have to have comparable
restrictions, because it's just too hard to tell whether someone
knocking on the door should actually be allowed to debug that specific
session over there.

>       3) Extend the existing FE/BE protocol to allow transmission of an
> OOB
>       debug channel.

We could get around both the security and the application-cooperation
problems if we design the debugger as an intermediate process that sits
between the application and the server.  To debug an app, you tell it to
connect to a host/port where the debugger is listening, and then the
debugger turns around and forwards the connection to the real database.
Now the debugger can watch the FE/BE messages going by, and can inject
debug commands into the data stream and read debug responses without
the application being any the wiser.  So basically yeah, what we need
is a debug subchannel in the FE/BE protocol.  I'd suggest inventing
a single Debug message type (sendable in both directions) with the
contents being specified by a separate protocol definition.  Or perhaps
invert that and imagine the FE/BE protocol as embedded in a debug
protocol.

We might want to play the same game on the server side; that is, the
communication structure is
        client <-> debugger user interface process <------>
                debugger control process <-> backend
The advantage of this is the backend doesn't need to be explicitly
aware of debug operations, which would be a Good Thing because we
don't want it constantly checking the client port during queries
to see if messages have arrived.  The control process would then
have both access to the message stream, and the ability to invoke
trace/step facilities on the backend process.

As far as the debug protocol details go, it'd be worth looking at the
GDB host protocol to see if it's usable; even if not directly usable
(it's probably too low-level) it would give ideas about the functions
you need to provide.  It'd also be smart to understand how debugging is
commonly done in Perl, Python, etc, with an eye to being able to
piggyback on existing tools instead of inventing our own.

                        regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to