首頁 >後端開發 >Golang >如何取得正在運行的 Go 進程中所有 Goroutine 的堆疊追蹤?

如何取得正在運行的 Go 進程中所有 Goroutine 的堆疊追蹤?

Linda Hamilton
Linda Hamilton原創
2024-10-31 15:38:37615瀏覽

How to Get Stack Traces for All Goroutines in a Running Go Process?

如何轉儲正在運行的Go 進程中所有Goroutine 的堆疊追蹤

在偵錯或排除Go 進程故障時,取得所有Go>

在偵錯或排除Go 進程故障時,取得所有Go進程的堆疊追蹤它的goroutine 可能至關重要。然而,在不修改原始程式碼或終止進程的情況下執行此操作可能具有挑戰性。本指南提供了此問題的解決方案。

Go 運行時包含一項功能,可讓您按需轉儲堆疊追蹤。然而,從進程外部呼叫此功能並不是立即顯而易見的。

使用訊號處理程序

要捕獲所有 goroutine 的堆疊跟踪,您可以設定一個訊號監聽特定訊號的處理程序。收到訊號後,處理程序將產生並列印堆疊追蹤。

<code class="go">import (
    "fmt"
    "os"
    "os/signal"
    "runtime"
    "syscall"
)

func main() {
    // Create a channel to receive signals.
    sigChan := make(chan os.Signal)

    // Start a goroutine that will write stack traces to the channel.
    go func() {
        // Create a buffer to hold the stack trace.
        stacktrace := make([]byte, 8192)

        // Loop until a signal is received.
        for _ = range sigChan {
            length := runtime.Stack(stacktrace, true)
            fmt.Println(string(stacktrace[:length]))
        }
    }()

    // Register to receive SIGQUIT signals.
    signal.Notify(sigChan, syscall.SIGQUIT)

    // Continue with the main application logic.
    ...
}</code>
以下是範例程式碼片段:

發送訊號

kill -QUIT <process id>
設定處理程序後,您可以向行程堆疊SIGQUIT 訊號以觸發堆疊追蹤轉儲。您可以使用以下命令來執行此操作:

其中 是 Go 進程的 ID。

範例用法

    這是一個範例場景:
  1. 執行上面提供的程式碼片段作為單獨的 Go 進程。

    kill -QUIT <process id>
    進程運行時,打開終端機視窗並輸入Kill 指令:

Go 程式中所有goroutine 的終端堆疊追蹤將列印在終端堆疊視窗中。

以上是如何取得正在運行的 Go 進程中所有 Goroutine 的堆疊追蹤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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