実行中の 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
使用例
シナリオの例を次に示します。
プロセスの実行中に、ターミナル ウィンドウを開いて kill コマンドを入力します。
kill -QUIT <process id>
すべての Go プロセスのスタック トレースGo プロセスのゴルーチンがターミナル ウィンドウに表示されます。
以上が実行中の Go プロセス内のすべてのゴルーチンのスタック トレースを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。