非侵襲的に Go プロセス スタックをキャプチャする
実行を中断せずに、実行中の Go プロセス内のすべてのゴルーチンからスタック トレースをキャプチャするには、次の手順に従います。手順:
シグナルハンドラーの確立:
<code class="go">import ( "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) }</code>
SIGQUIT シグナルの受信:
ゴルーチン内のハンドラー関数は SIGQUIT シグナルをキャプチャします。
スタック トレースの生成:
ランタイム。スタック関数は、各 goroutine のスタック トレースを生成するために使用されます。
ハンドル メモリ制約:
スタック トレース バッファーにはサイズ制限があります。バッファーを超えると、トレースは切り捨てられます。
スタック トレースの印刷:
生成されたスタック トレースは標準出力に出力されます。 .
このシグナル ハンドラーを設定すると、ソース コードを変更したり実行を終了したりすることなく、実行中の Go プロセス内のすべての goroutine のスタック トレースを効果的にキャプチャして表示できます。
以上がGo プロセスから中断せずにスタック トレースをキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。