[m-dev.] For review: Stacks dump in the external debugger (round 2)
Erwan Jahier
Erwan.Jahier at irisa.fr
Fri Feb 19 07:56:43 AEDT 1999
| On 16-Feb-1999, Erwan Jahier <Erwan.Jahier at irisa.fr> wrote:
| > | > + if (MR_ENTRY_LAYOUT_COMPILER_GENERATED(entry)) {
| > | > + MR_send_message_to_socket_format(
| > | > + "proc(%s for %s:%s/%ld-%ld).\n",
| > |
| > | That won't be valid syntax for a Prolog term.
| > | I suggest
| > |
| > | "proc('%s for %s:%s'/%ld-%ld).\n"
| > |
| > | which should work OK except when one of the names contains a
| > | single quote ("'").
| >
| > Can it happen?
|
| Yes. (But in practice it is unlikely.)
|
| > Isn't that a problem?
|
| Yes.
|
| To do it properly, you need to escape (with backslashes)
| any single quotes in the predicate or module names.
|
| That's a bit tricky, so an /* XXX ... */ comment might do for now.
OK.
|
| > +/*
| > +** The protocol between the debugged Mercury program and the external debugger
| > +** is the following:
| > +** 1) The debugger sends "stack";
| > +** 2) For each procedure in the stack that is not generated by the compiler, the
| > +** debuggee sends:
| > +** - level(int) (the level of the procedure in the stack)
| > +** - detail(unsigned long, unsigned long, unsigned long) (the call event
| > +** number, call sequence number and depth of the goal of the procedure)
| > +** - the atom 'pred' or 'func' depending if the procedure is a function
| > +** or not
| > +** - proc('string:string'/long-long) (the name of the procedure)
| > +** - det(string) (the determinism of the procedure)
| > +** - def_module(string) (the name of the defining module if different from
| > +** the current one)
|
| Does it send def_module(string) if the name of the defining module
| is the same as the name of the current one?
|
| If not, how does the debugger know when to stop reading from the socket?
Thanks to the "MR_send_message_to_socket("end_stack");" statement at line 485
in mercury_trace_external.c
|
| You need to fix that.
|
| > Index: trace/mercury_trace_internal.h
| > ===================================================================
| > RCS file: /home/mercury1/repository/mercury/trace/mercury_trace_internal.h,v
| > retrieving revision 1.5
| > diff -u -r1.5 mercury_trace_internal.h
| > --- mercury_trace_internal.h 1999/02/10 22:31:22 1.5
| > +++ mercury_trace_internal.h 1999/02/16 20:22:02
| > @@ -48,6 +48,7 @@
| > MR_Trace_Port port, int seqno, int depth,
| > const char *path, int *max_mr_num);
| >
| > +
| > /*
| > ** Debugger I/O streams.
| > ** Replacements for stdin/stdout/stderr respectively.
|
| That change looks unintentional.
|
| Apart from that, it looks fine.
--
R1.
More information about the developers
mailing list