Hi Thomas,

> On May 29, 2017, at 7:41 AM, Ben Coman <[email protected]> wrote:
> 
> 
> 
>> On Mon, May 29, 2017 at 9:34 PM, <[email protected]> wrote:
>> Hi,
>> 
>> I'm working with DebugSession to see if I can implement something that would 
>> step into an execution until a given expression evaluates to a different 
>> value than the value it had at the beginning to quickly localise the precise 
>> point where an invariant is broken.
>> 
>> But it appears that if the expression always evaluate to the same value, 
>> then the VM freezes.
>> 
>> I simplified my program to just stepInto a debugSession indefinitely, and it 
>> makes the VM freeze, while I would rather expect an exception to be raised 
>> (something like "ReachedEndOfExecution").
>> 
>> Here is my example code. Beware, running it will freeze the VM.
>> 
>> | program process context debugSession |
>>         program := [1+2].
>>         process := program newProcess.
>>         context := process suspendedContext.
>>         debugSession := process newDebugSessionNamed: 'StepIntoForever' 
>> startedAt: context.
>>         [ true ] whileTrue: [ debugSession stepInto ].
>> 
>> Is there a way to have an exception be raised when a stepInto message is 
>> sent to a debugSession whose execution is finished, instead of just freezing 
>> the VM?
>> 
> 
> I like looking into these sort of things, but right now don't have time. (I'm 
> trying to be disciplined.)
> Probably a way does not currently existing, so the way is to change the 
> implementation.
> What I'd suggest is debugging into #stepInto to maybe discover how to do it 
> yourself.  :)  

In particular, your use of stepInto: will soon step into the process 
termination code.  See newProcess.  You have to stop simulating before you stop 
the current process by mistake.

> As a novice I found it really accessible to dig into this stuff, found it 
> quite enlightening and made me feel cool I could do it.
>          
> To be able to debug the debugger, first copy method #stepInto to #myStepInto 
> with a halt at the top, then try...
>     [ true ] whileTrue: [ debugSession myStepInto ].
> 
> btw, if you are executing your example from then Playground, note that it 
> executes in the UI thread, which you've blocked from progressing.
> Does the Image hang with this...? 
>      [  [ true ] whileTrue: [ debugSession stepInto ] ] forkAt: Processor 
> currentPriority - 1.
> 
> Note the lowered priority since processes are only pre-emptive between 
> priorities. 
> At the same priority processes are scheduled cooperatively, so require an 
> explicit yield or the tight loop would dominate the UI process. 
> So you might also try this...
>      [  [ true ] whileTrue: [ debugSession stepInto. Processor yield. ] ] 
> fork.
> 
> Give it a go and report back what you find and propose how you'd like it to 
> work. 
> Then we can see what it might break and wider implications I can't think of 
> right now.
> (Its a great learning experience for the experts to describe why some things 
> are a bad idea, and maybe alternatives.)
> 
> cheers -ben
> 
> P.S. This might be the sort of thing that MetaLinks is good for, but I'm not 
> much familiar with them.

Reply via email to