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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 18:36:41866ブラウズ

How to Dump Goroutine Stacks Without Stopping a Go Process?

Go でプロセスを停止せずに Goroutine スタックをダンプ

実行中の Go プロセスがある場合、そのすべての goroutine のスタック トレースをコードなしでキャプチャできます。変更またはプロセスの終了。要件を満たすソリューションは次のとおりです。

実装:

  1. シグナル ハンドラー:

    • シグナルを受信するチャネル sigChan を作成します。
    • sigChan で SIGQUIT シグナルをリッスンするゴルーチンを開始します。
    • シグナルが受信されると、スタック トレースをフォーマットして出力します。
  2. シグナル通知:

    • signal.Notify(sigChan, syscall.SIGQUIT) を呼び出して、SIGQUIT シグナルを sigChan に送信します。 .
  3. スタック トレース ダンピング:

    • シグナル ハンドラーのゴルーチンで、 runtime.Stack() を呼び出して、スタック トレース。
    • 生成されたスタック トレースを出力します。

コード例:

<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 to listen for signals and dump stack traces
    go func() {
        stacktrace := make([]byte, 8192)
        for _ = range sigChan {
            length := runtime.Stack(stacktrace, true)
            fmt.Println(string(stacktrace[:length]))
        }
    }()

    // Notify the process to listen for SIGQUIT signals and send them to sigChan
    signal.Notify(sigChan, syscall.SIGQUIT)

    // Do some other work here...
}</code>

を実行するこのコードでは、Go プロセスを強制終了せずに SIGQUIT を送信することで、スタック トレース ダンプをトリガーできます。これを行うには、kill -6 を使用します。は Go プログラムのプロセス ID です。出力には、プロセス内で実行されているすべてのゴルーチンのスタック トレースが含まれます。

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

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