Stop Mid Func Eval, Nested Break States



A coworker mentioned Func Eval sounds like “Funky-val”.  Stopping at a breakpoint in the middle of a function evaluation could be considered funky.  It is also useful.


 


VS Whidbey allows stopping at a BP or Exception during a function evaluation in C# or VB code.  To use it, you need to do the function evaluation from the ‘Immediate Window’, rather than the ‘Watch’, or ‘Quick Watch’ windows. 


 


Why is nesting restricted to the Immediate Window?  Despite the name, the Immediate window is not immediate.  Watch windows do synchronous Function evaluation.  If the evaluation takes too long, it will timeout and give an error.  That doesn’t happen in the immediate window, because it is infinitely patient.  The immediate window is implementing a REPL (Read Eval Print Loop).  However, it doesn’t bother to wait for the Eval & Print to finish, instead it executes an asynchronous func eval. The ‘Print’ is going to happen whenever the Eval gets done, which allows us to do the Nested Break States.  Here’s an example:


 


static bool Foo()


{


return false;


}


 


In the immediate window evaluate Foo 3 times:


?Foo()


?Foo()


?Foo()


 


Here is the Callstack:

NestedFuncEval

 


 


When I unrolled the set of Evaluations by hitting F5 three times, here is what I got in the immediate Window:


?Foo()


?Foo()


?Foo()


false


false


true


 


You might ask … why is the last one true?  It’s because I used Edit and Continue to change the return value to true before hitting F5 the third time.  Nested Func Eval allows you to literally “push a debug task” on the stack.  Once you’ve figured out why Foo was doing something wrong you can go back to debugging what you were looking at before.
 

Comments (3)

  1. I’ve mentioned func-eval (aka property eval) is evil for end-users; but it’s also evil if you want to…

  2. I created a blog category for Func-eval (aka Property Evaluation), and I updated some of my old…