// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package trace contains facilities for programs to generate trace // for Go execution tracer. // // The execution trace captures a wide range of execution events such as // goroutine creation/blocking/unblocking, syscall enter/exit/block, // GC-related events, changes of heap size, processor start/stop, etc. // A precise nanosecond-precision timestamp and a stack trace is // captured for most events. The generated trace can be interpreted // using `go tool trace`. // // Tracing a Go program // // Support for tracing tests and benchmarks built with the standard // testing package is built into `go test`. For example, the following // command runs the test in the current directory and writes the trace // file (trace.out). // // go test -trace=test.out // // This runtime/trace package provides APIs to add equivalent tracing // support to a standalone program. See the Example that demonstrates // how to use this API to enable tracing. // // There is also a standard HTTP interface to profiling data. Adding the // following line will install handlers under the /debug/pprof/trace URL // to download live profiles: // // import _ "net/http/pprof" // // See the net/http/pprof package for more details. package trace import ( "io" "runtime" ) // Start enables tracing for the current program. // While tracing, the trace will be buffered and written to w. // Start returns an error if tracing is already enabled. func Start(w io.Writer) error { if err := runtime.StartTrace(); err != nil { return err } go func() { for { data := runtime.ReadTrace() if data == nil { break } w.Write(data) } }() return nil } // Stop stops the current tracing, if any. // Stop only returns after all the writes for the trace have completed. func Stop() { runtime.StopTrace() }