我有 Java 背景,我喜欢使用信号 QUIT 来检查 Java 线程转储。
如何让 Golang 打印出所有 goroutine 堆栈跟踪?
要打印当前goroutine的堆栈跟踪,请使用PrintStack()fromruntime/debug。
PrintStack()
runtime/debug
PrintStack 将 Stack 返回的堆栈跟踪打印到标准错误。
例如:
import( "runtime/debug" ) ... debug.PrintStack()
要打印所有goroutine的堆栈跟踪,请使用Lookup和WriteTofrom runtime/pprof。
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 - 导致创建新操作系统线程的 堆栈跟踪 block - 导致同步原语阻塞的堆栈跟踪
每个配置文件都有一个唯一的名称。预定义了一些配置文件:
goroutine - 所有当前 goroutine 的堆栈跟踪 heap - 所有堆分配的 样本 threadcreate - 导致创建新操作系统线程的 堆栈跟踪 block - 导致同步原语阻塞的堆栈跟踪
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)