ホームページ  >  記事  >  バックエンド開発  >  実行中の Go プロセス内のすべてのゴルーチンのスタック トレースを取得するにはどうすればよいですか?

実行中の Go プロセス内のすべてのゴルーチンのスタック トレースを取得するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 15:38:37526ブラウズ

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

実行中の Go プロセスですべてのゴルーチンのスタック トレースをダンプする方法

Go プロセスをデバッグまたはトラブルシューティングするときに、すべてのゴルーチンのスタック トレースを取得するそのゴルーチンが重要になる可能性があります。ただし、ソース コードを変更したり、プロセスを終了したりせずにこれを行うのは困難な場合があります。このガイドでは、この問題の解決策を提供します。

Go ランタイムには、オンデマンドでスタック トレースをダンプできる機能が含まれています。ただし、プロセスの外部からこの機能を呼び出すことは、すぐにはわかりません。

シグナル ハンドラーの使用

すべてのゴルーチンのスタック トレースをキャプチャするには、シグナルをセットアップできます。特定のシグナルをリッスンするハンドラー。シグナルが受信されると、ハンドラーはスタック トレースを生成して出力します。

コード スニペットの例を次に示します。

<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>

シグナルの送信

ハンドラーが設定されたら、SIGQUIT シグナルをプロセスに送信してスタック トレース ダンプをトリガーできます。これを行うには、次のコマンドを使用します。

kill -QUIT <process id>

Where Go プロセスの ID です。

使用例

シナリオの例を次に示します。

  1. 上記のコード スニペットを別の Go プロセス。
  2. プロセスの実行中に、ターミナル ウィンドウを開いて kill コマンドを入力します。

    kill -QUIT <process id>

すべての Go プロセスのスタック トレースGo プロセスのゴルーチンがターミナル ウィンドウに表示されます。

以上が実行中の Go プロセス内のすべてのゴルーチンのスタック トレースを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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