  Understanding the run-time behavior of concurrent programs is a challenging
task. A popular approach is to establish a happens- before relation via vector
clocks. Thus, we can identify bugs and per- formance bottlenecks, for example,
by checking if two con icting events may happen concurrently. We employ a
two-phase method to derive vector clock information for a wide range of
concurrency features that includes all of the message-passing features in Go.
The rst phase (instrumentation and tracing) yields a run-time trace that
records all events related to message-passing concurrency that took place. The
second phase (trace replay) is carried out o ine and replays the recorded
traces to infer vector clock information. Trace replay operates on thread-local
traces. Thus, we can observe behav- ior that might result from some alternative
schedule. Our approach is not tied to any speci c language. We have built a
prototype for the Go programming language and provide empirical evidence of the
usefulness of our method.
