ホームページ  >  記事  >  バックエンド開発  >  Go プロセスを終了せずに Goroutine スタックをダンプするにはどうすればよいですか?

Go プロセスを終了せずに Goroutine スタックをダンプするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 00:22:02733ブラウズ

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 プロセスを中断することなく、各ゴルーチンのスタック トレースをキャプチャできるようになります。

以上がGo プロセスを終了せずに Goroutine スタックをダンプするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。