小编典典

如何转储 goroutine 堆栈跟踪?

go

我有 Java 背景,我喜欢使用信号 QUIT 来检查 Java 线程转储。

如何让 Golang 打印出所有 goroutine 堆栈跟踪?


阅读 223

收藏
2021-11-27

共1个答案

小编典典

要打印当前goroutine的堆栈跟踪,请使用PrintStack()fromruntime/debug

PrintStack 将 Stack 返回的堆栈跟踪打印到标准错误。

例如:

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

要打印所有goroutine的堆栈跟踪,请使用LookupWriteTofrom 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 - 导致同步原语阻塞的堆栈跟踪

例如:

pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
2021-11-27