github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/internal/debug/trace.go (about) 1 //+build go1.5 2 3 package debug 4 5 import ( 6 "errors" 7 "os" 8 "runtime/trace" 9 10 "github.com/quickchainproject/quickchain/log" 11 ) 12 13 // StartGoTrace turns on tracing, writing to the given file. 14 func (h *HandlerT) StartGoTrace(file string) error { 15 h.mu.Lock() 16 defer h.mu.Unlock() 17 if h.traceW != nil { 18 return errors.New("trace already in progress") 19 } 20 f, err := os.Create(expandHome(file)) 21 if err != nil { 22 return err 23 } 24 if err := trace.Start(f); err != nil { 25 f.Close() 26 return err 27 } 28 h.traceW = f 29 h.traceFile = file 30 log.Info("Go tracing started", "dump", h.traceFile) 31 return nil 32 } 33 34 // StopTrace stops an ongoing trace. 35 func (h *HandlerT) StopGoTrace() error { 36 h.mu.Lock() 37 defer h.mu.Unlock() 38 trace.Stop() 39 if h.traceW == nil { 40 return errors.New("trace not in progress") 41 } 42 log.Info("Done writing Go trace", "dump", h.traceFile) 43 h.traceW.Close() 44 h.traceW = nil 45 h.traceFile = "" 46 return nil 47 }