[m-rev.] Breakpoint added in source-to-source debugger
oan at missioncriticalit.com
oan at missioncriticalit.com
Tue Oct 9 11:04:07 AEST 2007
On 8/10/2007, "Zoltan Somogyi" <zs at csse.unimelb.edu.au> wrote:
>On 08-Oct-2007, Olivier Annet <oan at missioncriticalit.com> wrote:
>> --- compiler/ssdebug.m 4 Oct 2007 01:04:47 -0000 1.3
>> +++ compiler/ssdebug.m 8 Oct 2007 07:28:01 -0000
>> @@ -198,7 +198,7 @@
>> goal_util.generate_simple_call(SSDBModule, "handle_event",
>> pf_predicate, only_mode, detism_det, purity_impure,
>> [ProcIdVar, CallVar],
>> - Features, InstMapSrc, !.ModuleInfo, Context, HandleCallEventGoal),
>> + Features, InstMapSrc, !.ModuleInfo, Context, HandleCallEventGoal),
>> %
>> % Build the following two goals
>> % ExitVar = ssdb_exit,
>> @@ -210,7 +210,7 @@
>> goal_util.generate_simple_call(SSDBModule, "handle_event",
>> pf_predicate, only_mode, detism_det, purity_impure,
>> [ProcIdVar, ExitVar],
>> - Features, InstMapSrc, !.ModuleInfo, Context, HandleExitEventGoal),
>> + Features, InstMapSrc, !.ModuleInfo, Context, HandleExitEventGoal),
>
>What happened to those two lines? In the rare case where you have to change
>white space on a line, you shouldn't bother reviers with it; get your diff
>with diff -ub.
>
>> @@ -247,21 +247,26 @@
>>
>> make_proc_id_construction(PredInfo,
>> _ProcInfo, Goals, ProcIdVar, !Varset, !Vartypes) :-
>> - Name = pred_info_name(PredInfo),
>> + SymModName = pred_info_module(PredInfo),
>> + ModName = sym_name_to_string(SymModName),
>> + PredName = pred_info_name(PredInfo),
>
>Please use ModuleName instead of ModName.
>
>> + % The set of breakpoint added.
>> + ssdb_breakpoints :: set(breakpoint)
>
>This is unnecessarily slow. Using a map from module_name to the set of
>predicate names with breakpoints in that module would be faster, both because
>maps are balanced trees while sets are lists, and because if you have
>breakpoints on more than one predicate in a module other than the current one,
>a single comparison can ignore them all.
I totally agree with you, but as you have to enter the breakpoints by
hand, the set will never contain a million elements because when you are
debugging an application, you are generally interested by the behavior
of one or two (or some at the maximum) predicates/functions. In this
point of view, I don't thing that even a milli-second could be gained
here.
I will think on the case where there is a million breakpoints.
>
>> :- type what_next
>> ---> what_next_step
>> ; what_next_next
>> + ; what_next_continue
>> ; what_next_finish(int).
>>
>>
>> %
>> - % Type filled by the handle_event function to determine the next stop of
>> - % the prompt function
>> + % Type used by the handle_event predicate to determine the next stop of
>> + % the prompt predicate.
>> %
>> :- type next_stop
>> ---> step
>> ; next(int)
>> + ; continue
>> ; final_port(int).
>
>Why the prefixes on one type but not the other? What is the reason for the
>difference between the two?
Good remark, I will change it immediately
>>
>> +:- type breakpoint
>> + ---> breakpoint(
>> + bp_module_name :: string,
>> + bp_pred_name :: string
>> + ).
>
>Both here and in the compiler: did you make a conscious choice to work
>with predicates instead of procedures? If yes, why?
No
>And why do you variable names such as ProcId?
ProcId was choose in common here. As an instantiation of the ssdb_proc_id
type, it looks like logic to call it like that.
But I can easily change the name if you wish.
>
>> handle_event(ProcId, Event) :-
>> impure get_event_num_inc(EventNum),
>> impure update_depth(Event, PrintDepth),
>>
>> - (
>> - Event = ssdb_call,
>> + ( Event = ssdb_call,
>
>Undo this change.
>
>> - E = elem(ProcId, InitialState),
>> - stack.push(InitialState ^ ssdb_stack, E, FinalStack),
>> + Element = elem(ProcId, InitialState),
>> + stack.push(InitialState ^ ssdb_stack, Element, FinalStack),
>
>I don't think "Element" is the description you want here; consider
>"StackFrame".
>
>> NextStop0 = final_port(StopCSN),
>> (
>> Event = ssdb_exit,
>> - is_same_event(StopCSN, PrintCSN, Stop)
>> + is_same_event(StopCSN, CSN, Stop)
>> ;
>> Event = ssdb_call,
>> Stop = no
>> @@ -183,13 +206,15 @@
>> io.write_string(" ", !IO),
>> io.write_int(EventNum, !IO),
>> io.write_string("\t", !IO),
>> + io.write_string(ProcId ^ module_name, !IO),
>> + io.write_string(".", !IO),
>> io.write_string(ProcId ^ proc_name, !IO),
>
>You will need a predicate for printing predicate/procedure ids.
>
>> +
>> + %
>> + % Return the current event number.
>> + %
>> +:- semipure pred get_event_num(int::out) is det.
>
>Please stick to our conventions for comments on predicate/function
>declarations.
>
>> prompt(ShadowStack, Depth, WhatNext, !IO) :-
>> io.write_string("ssdb> ", !IO),
>> - %read a string in input and return a string
>> + % Read a string in input and return a string.
>> io.read_line_as_string(Result, !IO),
>> (
>> Result = ok(String0),
>> - %string minus any single trailing newline character
>> + % String minus any single trailing newline character.
>> String = string.chomp(String0),
>>
>> - (
>> - String = "h" ->
>> + ( String = "h" ->
>> + io.nl(!IO),
>> + io.write_string("s :: step", !IO),
>> io.nl(!IO),
>> - io.write_string("s :: step", !IO),
>> + io.write_string("n :: next", !IO),
>> io.nl(!IO),
>> - io.write_string("n :: next", !IO),
>> + io.write_string("b X Y :: insert breakpoint where :", !IO),
>> + io.write_string(" X = module name", !IO),
>> + io.write_string(" and Y = predicate name", !IO),
>> io.nl(!IO),
>> - io.write_string("f :: finish", !IO),
>> + io.write_string("c :: next", !IO),
>> + io.nl(!IO),
>> + io.write_string("f :: finish", !IO),
>> io.nl(!IO),
>> io.nl(!IO),
>> impure prompt(ShadowStack, Depth, WhatNext, !IO)
>>
>> - ;
>> - String = "n" ->
>> + ; String = "n" ->
>> WhatNext = what_next_next
>> +
>> ;
>> - (
>> - String = "s"
>> - ;
>> - String = ""
>> + ( String = "s"
>> + ; String = ""
>> )
>> - ->
>> + ->
>> WhatNext = what_next_step
>> - ;
>> - String = "f" ->
>> +
>> + ; String = "c" ->
>> + WhatNext = what_next_continue
>> +
>> + ;
>> + Words = string.words(String),
>> + Words = ["b", ModuleName, ProcedureName]
>
>You should break up the line into words *before* you start looking for
>individual commands' names.
>
>If I were you, I would design a Mercury type for commands, and totally separate
>the code for parsing (converting a line into this structure) from the code for
>actually validating and executing the commands.
>
>Otherwise, the diff is fine.
>
>Zoltan.
All other remarks were taken into account
>--------------------------------------------------------------------------
>mercury-reviews mailing list
>Post messages to: mercury-reviews at csse.unimelb.edu.au
>Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
>Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
>--------------------------------------------------------------------------
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to: mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the reviews
mailing list