  Causal-consistent reversible debugging allows one to explore concurrent
computations back and forth in order to locate the source of an error. In this
setting, backward steps can be chosen freely as long as they are "causal
consistent", i.e., as long as all the actions that depend on the action we want
to undo have been already undone. Here, we consider a framework for
causal-consistent reversible debugging in the functional and concurrent
language Erlang. This framework considered programs translated to an
intermediate representation, called Core Erlang. Although using such an
intermediate representation simplified both the formal definitions and their
implementation in a debugging tool, the choice of Core Erlang also complicated
the use of the debugger. In this paper, we extend the framework in order to
deal with source Erlang programs, also including some features that were not
considered before. Moreover, we integrate the two existing approaches
(user-driven debugging and replay debugging) into a single, more general
framework, and develop a new version of the debugging tool CauDEr including all
the mentioned extensions as well as a renovated user interface.
