[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