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 サイトの他の関連記事を参照してください。