  As modern software systems are increasingly developed for running in
distributed environments, it is crucial to provide fundamental techniques such
as dependence analysis for checking, diagnosing, and evolving those systems.
However, traditional dependence analysis is either inapplicable or of very
limited utility for distributed programs due to the decoupled components of
these programs that run in concurrent processes at physically separated
machines. Motivated by the need for dependence analysis of distributed software
and the diverse cost-effectiveness needs of dependence-based applications, this
paper presents D$^2$ABS, a framework of dynamic dependence abstraction for
distributed programs. By partial-ordering distributed method-execution events
and inferring causality from the ordered events, D$^2$ABS abstracts
method-level dependencies both within and across process boundaries. Further,
by exploiting message-passing semantics across processes, and incorporating
static dependencies and statement coverage within individual components, we
present three additional instantiations of D$^2$ABS that trade efficiency for
better precision. We present the design of the D$^2$ABS framework and evaluate
the four instantiations of D$^2$ABS on distributed systems of various
architectures and scales using our implementation for Java. Our empirical
results show that D$^2$ABS is significantly more effective than existing
options while offering varied levels of cost-effectiveness tradeoffs. As our
framework essentially computes whole-system run-time dependencies, it naturally
empowers a range of other dependence-based applications.
