如何在不終止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中文網其他相關文章!