driver: add -trace to record execution trace

This adds a -trace flag to specify a file name for recording an
execution trace of the benchmark.  This flag parallels go test -trace.

Change-Id: Ie01ca39699dea246f549212f2be78f18aa0835c9
Reviewed-on: https://go-review.googlesource.com/6830
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
diff --git a/driver/driver.go b/driver/driver.go
index 85644a7..4356528 100644
--- a/driver/driver.go
+++ b/driver/driver.go
@@ -38,6 +38,7 @@
 	affinity  = flag.Int("affinity", 0, "process affinity (passed to an OS-specific function like sched_setaffinity/SetProcessAffinityMask)")
 	tmpDir    = flag.String("tmpdir", os.TempDir(), "dir for temporary files")
 	genSvg    = flag.Bool("svg", false, "generate svg profiles")
+	trace     = flag.String("trace", "", "write an execution trace to the named file after execution")
 
 	BenchNum  int
 	BenchMem  int
@@ -80,6 +81,20 @@
 		return
 	}
 
+	if *trace != "" {
+		f, err := os.Create(*trace)
+		if err != nil {
+			fmt.Fprintln(os.Stderr, err)
+			os.Exit(1)
+		}
+		defer f.Close()
+		if err := pprof.StartTrace(f); err != nil {
+			fmt.Fprintf(os.Stderr, "can't start tracing: %s\n", err)
+			os.Exit(1)
+		}
+		defer pprof.StopTrace()
+	}
+
 	res := f()
 
 	var metrics []string