The Question is:
I am trying to do "just in time" debugging for a
detachable process. If a detachable process is
in a LEF state and I want to know where in
the code it is at, is there any to do this
"on the fly"? I seem to remember hearing about
some way to attach the debugger to the process
after it has been running for a long time in
the background. I do not remember specifically
which version of VMS this first became possible,
but it was about three years back.
The Answer is :
One could use a kernel debugger (such as delta or xdelta) for basic
debugging of a "non-debugger-cooperating" application, but this takes
a fair amount of effort and knowledge to accomplish.
For best self-debugging, the application need be compiled and linked with
debug (though it can be set to not invoke the debugger when it first starts
up with an image header patch, or it can start up and pick up a "go" command
via the use of a debugger initialization file, or invoked with /NODEBUG
if a CLI is available in the process), and the image can then be requested
to issue a call to lib$signal() specifying SS$_DEBUG and an ASCIC string
of debugger command(s) -- via interprocess command, via a timer, or other
mechanism. This assumes that DBG$INPUT and DBG$OUTPUT are accessable to
the debugger in the detached process and that they reference an accessable
terminal device, or that the detached process has an accessable affiliated
WSAn: device -- this can be passed in via the sys$error specification.
(The multiprocessor debugger also requires that a CLI be present in the
detached process -- otherwise the full debugger must operate in the same
process context as the application.)
Remote debugging gets rather easier with the new remote multiprocessing
debugger support present in OpenVMS V7.2 -- currently in field test -- as
one can perform collaborative debugging, and one can perform debugging
from clients on remote systems.
One of the best solutions for debugging these sorts of problems in large
or complex applications involves integrated debugging support -- this is
application-specific debugging code incorporated directly into the
application. This can involve the use of a circular buffer in a global
section -- there are examples of code that works with global sections
available in the various example programs posted at the main page of
the Ask The Wizard website.
The application then has integrated calls that deposit indications of
activity into the buffer (or into a file), and a client can read these
indications as required.
For remotely-triggered debugging, the debugger CONNECT command could also
be quite useful, depending on the particular situation.