ホームページ >バックエンド開発 >Golang >コードの変更や終了を行わずに Go プロセス スタックをダンプするにはどうすればよいですか?

コードの変更や終了を行わずに Go プロセス スタックをダンプするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 04:54:29652ブラウズ

How Can I Dump Go Process Stacks Without Code Modifications or Termination?

Go プロセス スタックの非侵襲的なダンプ

実行中の Go プロセスは、その組み込みの機能を活用することで、コードを変更したり終了したりせずに分析できます。スタック ダンピング機能。

メソッド:

  1. シグナル処理:
    os.Signal と syscall を使用してシグナル ハンドラーを確立します。 .SIGQUIT。 SIGQUIT シグナルは、Go ランタイムにすべてのスタック トレースをダンプするように指示します。
  2. スタック トレース キャプチャ:
    ゴルーチンで、 runtime.Stack を使用してスタック トレースをキャプチャし、それらをバッファ。最初に、バッファーはスタック トレースを収容するのに十分な大きさである必要があり、実際のトレースの長さは runtime.Stack によって返されます。
  3. シグナル通知:
    シグナル ハンドラーに通知します。 SIGQUIT シグナルをリッスンする必要があることを示します。受信すると、ハンドラーはスタック トレース キャプチャ プロセスをアクティブ化します。
  4. プロセスの実行:
    通常どおり Go プロセスの実行を続行します。

送信時プロセスへの SIGQUIT シグナル (たとえば、Windows では ctrl \ を使用、Linux では kill -SIGQUIT process_pid を使用)、定義されたシグナル ハンドラーがそれをインターセプトし、スタック トレース キャプチャ ルーチンを呼び出します。キャプチャされたトレースは標準出力に出力され、プロセスの goroutine スタックの詳細なスナップショットが提供されます。

コード例:

<code class="go">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)

    // ... Process Logic
}</code>

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

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