回答

收藏

如何转储 goroutine 堆栈跟踪?

技术问答 技术问答 239 人阅读 | 0 人回复 | 2023-09-12

我有 Java 背景,我喜欢使用信号 QUIT 来检查 Java 线程转储。% z  \9 M; E, @% _4 w- A2 `. L" E
如何让 Golang 打印所有 goroutine 堆栈跟踪?- ]0 t  ~1 b" X
                                                                ; g: z4 z; h# h5 O. Z
    解决方案:                                                               
3 p% D; ?# G$ P5 J: `! y. e                                                                要打印当前goroutine请使用堆栈跟踪PrintStack()fromruntime/debug。
: k* `5 o2 ?3 ]8 w* R1 P8 G/ BPrintStack 将 Stack 返回的堆栈跟踪打印到标准错误。  J# G) j: j8 ~) d8 i
例如:' S& s) ]+ x1 L% W  w- y3 I
    import(   "runtime/debug")...    debug.PrintStack()) g' L0 k* i1 B$ h, L3 ~
要打印所有goroutine请使用堆栈跟踪Lookup和WriteTofrom runtime/pprof。. N5 i1 }. L' ?, X7 _
    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.2 z" G8 t  J! l. ~1 Q9 m0 p
每个配置文件都有一个独特的名称。预定义了一些配置文件:. E2 U5 ?& T1 g. Q1 H0 P
goroutine - 所有当前 goroutine 堆栈跟踪6 v! i0 y( w$ ?: Q! y6 g
heap - 所有堆分配
! O5 x7 R7 m. O2 b4 v0 k样本 threadcreate - 导致创建新操作系统线程
. @: m& X# [2 q8 h堆栈跟踪 block - 同步原语阻塞的堆栈跟踪) v, w# e& H8 Y& }
例如:
2 x  l7 b/ r$ {7 r* G
    pprof.Lookup("goroutine").WriteTo(os.Stdout,1)+ t# R, F1 T# J5 Y+ W
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则