Debugging lazy functional programs poses serious challenges. In support of
the "stop, examine, and resume" debugging style of imperative languages, some
debugging tools abandon lazy evaluation. Other debuggers preserve laziness but
present it in a way that may confuse programmers because the focus of
evaluation jumps around in a seemingly random manner.
Ariola and Felleisen's call-by-need {\lambda}-calculus replaces a variable
occurrence with its value at the last possible moment. To support this gradual
notion of substitution, function applications-once established-are never
discharged. In this paper we show how to translate this notion of reduction
into an abstract machine that resolves variable references via the control
stack. In particular, the machine uses the static address of a variable
occurrence to extract its current value from the dynamic control stack.