1. ホーム
  2. go

[解決済み] ゴルーチンのスタックトレースをダンプするには?

2022-09-18 23:54:03

質問

私はJavaのバックグラウンドを持っており、Javaのスレッドダンプを検査するためにシグナルQUITを使用するのが好きです。

Golangに全てのゴルーチンのスタックトレースを出力させるにはどうしたらいいですか?

どのように解決するのですか?

のスタックトレースを表示するには 現在の goroutine のスタックトレースを表示するには PrintStack() から runtime/debug .

<ブロッククオート <ブロッククオート

PrintStackはStackが返したスタックトレースを標準エラーに表示します。

例えば

import(
   "runtime/debug"
)
...    
debug.PrintStack()

のスタックトレースを表示するには すべて のゴルーチンを使用します。 Lookup WriteTo から runtime/pprof .

func Lookup(name string) *Profile
// Lookup returns the profile with the given name,
// or nil if no such profile exists.

func (p *Profile) WriteTo(w io.Writer, debug int) error
// WriteTo writes a pprof-formatted snapshot of the profile to w.
// If a write to w returns an error, WriteTo returns that error.
// Otherwise, WriteTo returns nil.

各プロファイルは一意な名前を持ちます。いくつかのプロファイルはあらかじめ定義されています。

goroutine - 現在のすべてのgoroutineのスタックトレース。

heap - すべてのヒープ割り当てのサンプリング。

threadcreate - OSの新しいスレッドの作成につながったスタックトレース

block - 同期プリミティブでのブロックにつながったスタックトレース。

例えば

pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)