一尘不染

我如何转储所有Go进程的堆栈而不杀死它?

go

Go进程正在运行。我想要

  1. 为每个goroutine转储堆栈跟踪
  2. 从外部,而不依赖于我添加到其源代码的任何内容
  3. 没有杀死它。

我怎样才能做到这一点?

这应该很容易-请求该功能:https :
//code.google.com/p/go/issues/detail?id=2516并根据该线程的结论进行了实施。那是两年多以前了。但是问题线程和提交都没有任何有关如何调用此功能的提示。

功能请求提到了 SIGQUIT
,这是JVM接受在那里调用相应功能的信号。但是SIGQUIT并不是答案。至少在go1.2上,SIGQUIT会执行#1和#2的操作,但也会终止进程。

不久前有人在这里问了一个相关的问题:如何转储goroutinestacktraces?但是他们没有明确要求#2或#3,没有一个答案符合#2,他们接受了一个不符合#2的答案。所以这是一个不同的问题。


阅读 262

收藏
2020-07-02

共1个答案

一尘不染

如果您使用的是net / http,则可以通过调试处理程序访问goroutine。如果您看以下资料

http://golang.org/src/pkg/runtime/pprof/pprof.go

您将goroutineProfile在第62行看到配置文件。该配置文件通过写入writeGoroutine。如果使用debug> =2调用writeGoroutine,则它将写出所有goroutine。

您应该能够将curl http://localhost:<port>/debug/pprof/goroutine?debug=2所有goroutines转储。不幸的是,我没有看到任何调用该代码的信号处理程序的引用,但是您可以在runtime.Stack上面的源代码中看到有关pprof如何利用它来轻松实现自己的引用。

2020-07-02