如何在不终止 Go 进程的情况下转储 Goroutine 堆栈
Go 进程需要能够转储每个 Goroutine 的堆栈跟踪而不改变其源代码或终止它。为此,请考虑使用以下代码片段实现信号处理程序:
import ( "fmt" "os" "os/signal" "runtime" "syscall" ) func main() { sigChan := make(chan os.Signal) go func() { stacktrace := make([]byte, 8192) for _ = range sigChan { length := runtime.Stack(stacktrace, true) fmt.Println(string(stacktrace[:length])) } }() signal.Notify(sigChan, syscall.SIGQUIT) ... }
收到 SIGQUIT 信号时,会将其转发到指定通道。随后,runtime.Stack 函数将堆栈跟踪格式化到指定的缓冲区中。如果堆栈跟踪超出缓冲区大小,则会被截断并打印。因此,这种方法可以在不中断正在运行的 Go 进程的情况下捕获每个 goroutine 的堆栈跟踪。
以上是如何在 Go 进程中转储 Goroutine 堆栈而不终止它?的详细内容。更多信息请关注PHP中文网其他相关文章!