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

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

Linda Hamilton
發布: 2024-10-31 15:38:37
原創
612 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板