Causal-Consistent Replay Debugging for Message Passing Programs