github.com/Mrs4s/go-cqhttp@v1.2.0/global/signal.go (about)

     1  package global
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"runtime"
     8  	"sync"
     9  	"time"
    10  
    11  	log "github.com/sirupsen/logrus"
    12  )
    13  
    14  var (
    15  	mainStopCh chan struct{}
    16  	mainOnce   sync.Once
    17  
    18  	dumpMutex sync.Mutex
    19  )
    20  
    21  func dumpStack() {
    22  	dumpMutex.Lock()
    23  	defer dumpMutex.Unlock()
    24  
    25  	log.Info("开始 dump 当前 goroutine stack 信息")
    26  
    27  	buf := make([]byte, 1024)
    28  	for {
    29  		n := runtime.Stack(buf, true)
    30  		if n < len(buf) {
    31  			buf = buf[:n]
    32  			break
    33  		}
    34  		buf = make([]byte, 2*len(buf))
    35  	}
    36  
    37  	fileName := fmt.Sprintf("%s.%d.stacks.%d.log", filepath.Base(os.Args[0]), os.Getpid(), time.Now().Unix())
    38  	fd, err := os.Create(fileName)
    39  	if err != nil {
    40  		log.Errorf("保存 stackdump 到文件时出现错误: %v", err)
    41  		log.Warnf("无法保存 stackdump. 将直接打印\n %s", buf)
    42  		return
    43  	}
    44  	defer fd.Close()
    45  	_, err = fd.Write(buf)
    46  	if err != nil {
    47  		log.Errorf("写入 stackdump 失败: %v", err)
    48  		log.Warnf("无法保存 stackdump. 将直接打印\n %s", buf)
    49  		return
    50  	}
    51  	log.Infof("stackdump 已保存至 %s", fileName)
    52  }