Debugging Distributed Systems with Causal Nets