[m-rev.] for review: fix conditional breakpoints bug

Julien Fischer juliensf at cs.mu.OZ.AU
Mon Feb 6 13:13:50 AEDT 2006


On Sun, 5 Feb 2006, Ian MacLarty wrote:

> For review by anyone.
>
> Estimated hours taken: 3
> Branches: main
>
> Fix a bug where subterm dependency tracking would break if a conditional
> breakpoint was set.  When the condition of a conditional breakpoint is
> evaluated, some Mercury code is called.  Conditional breakpoints were being
> evaluated outside of the "safe" part of the call graph where the call
> sequence number is saved and restored in case any traced Mercury code
> updates the call sequence number.  This meant that the Mercury code used to
> evaluate conditional breakpoints was updating the call sequence number and
> confusing the declarative debugger.
>
> This type of error, where Mercury code is called and the original sequence
> number is not restored afterwards has occured numerous times in the past
> (for example it occured when Ralph introduced the list command), so I have
> changed the MR_TRACE_CALL_MERCURY macro to save and restore the event,
> sequence and depth numbers to prevent this kind of error in the future.
> Previously the event, sequence and depth numbers were saved in an
> MR_Event_Details structure at the start of MR_trace_event and restored at
> the end.  The MR_Event_Details structure needed to be passed to all the
> command functions in case there was a retry (since then the event, sequence
> and depth numbers must not be restored to their original values, but to new
> values).  This is now all unnecessary, since the event, sequence and depth
> numbers will be restored after any Mercury code is called (as long as it is
> wrapped in MR_TRACE_CALL_MERCURY).
>
> runtime/mercury_trace_base.h:
> 	Save and restore the event, call sequence and depth numbers
> 	when calling Mercury code.
>
> trace/mercury_trace.c:
> trace/mercury_trace.h:
> trace/mercury_trace_declarative.c:
> trace/mercury_trace_declarative.h:
> trace/mercury_trace_external.c:
> trace/mercury_trace_internal.c:
> trace/mercury_trace_spy.c:
> trace/mercury_trace_util.c:
> trace/mercury_trace_util.h:
> 	Do not pass around event_details anymore.  And remove, now redundant,
> 	saving and restoring of the event details before and after calling
> 	Mercury code.
>
> tests/debugger/declarative/Mmakefile:
> tests/debugger/declarative/condition_bug.inp:
> tests/debugger/declarative/condition_bug.m:
> 	Test that tracking of subterms works with conditional breakpoints.
>

...

> Index: trace/mercury_trace_spy.c
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/trace/mercury_trace_spy.c,v
> retrieving revision 1.25
> diff -u -r1.25 mercury_trace_spy.c
> --- trace/mercury_trace_spy.c	11 Jul 2005 07:30:31 -0000	1.25
> +++ trace/mercury_trace_spy.c	4 Feb 2006 17:16:31 -0000
> @@ -361,6 +361,12 @@
>  const char  *MR_spy_point_cond_problem = NULL;
>  MR_Spy_Cond *MR_spy_point_cond_bad = NULL;
>
> +/*
> +** NOTE: MR_spy_cond_is_true may only be called from within MR_trace_event
> +** (or one of its decendents), since it calls Mercury code to evaluate the

s/decendents/descendents/

> +** condition, and the Mercury registers are only saved in MR_trace_event.
> +*/
> +
>  static MR_bool
>  MR_spy_cond_is_true(MR_Spy_Point *point, const MR_Label_Layout *label_layout)
>  {

That looks fine otherwise.

Julien.

--------------------------------------------------------------------------
mercury-reviews mailing list
post:  mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the reviews mailing list