首頁 >後端開發 >Golang >如何在 Go 進程中轉儲 Goroutine 堆疊而不終止它?

如何在 Go 進程中轉儲 Goroutine 堆疊而不終止它?

Patricia Arquette
Patricia Arquette原創
2024-11-05 00:22:02782瀏覽

How to Dump Goroutine Stacks in a Go Process Without Terminating It?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn