This article describes the implementation of a debugger for lazy functional languages like
Haskell. The key idea is to construct a declarative trace which hides the operational details of
lazy evaluation. However, to avoid excessive memory consumption, the trace is constructed
one piece at a time, as needed during a debugging session, by automatic re-execution of the
program being debugged. The article gives a fairly detailed account of both the underlying
ideas and of our implementation, and also presents performance figures which demonstrate
the feasibility of the approach.