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  }