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 }