【问题标题】:How to list all the running goroutines in a go program? [duplicate]如何列出 go 程序中所有正在运行的 goroutine? [复制]
【发布时间】:2020-07-22 10:06:18
【问题描述】:

官方工具或第三方工具中是否有工具可以让您列出所有正在运行的 goroutine,这些 goroutine 与您的主程序一起运行?

或者类似 Erlang/Elixir 中的观察者?

【问题讨论】:

  • 以什么方式列出它们?他们没有名字或身份证。您可以从runtime.NumGoroutine() 获取它们的数量。
  • 最接近“列出所有 goroutines”的方法是转储它们的所有堆栈跟踪,如 stackoverflow.com/questions/19094099/… 中所示,但这似乎不是你要找的。​​span >
  • 将它们列为goroutine 1 <some-timestamp-when-it-started-running>goroutine 2 ...goroutine 3 ... .....
  • 您需要自己跟踪;据我所知,Go 不会跟踪每个 goroutine 启动时的时间戳,它对这些信息没有用处。
  • @Adrian:严格来说,Goroutines确实有ID,但是reading them sends you straight to hell

标签: go


【解决方案1】:

获取所有个goroutine的堆栈跟踪:

您可以使用runtime.Stack() 并将all 设置为true

func Stack(buf []byte, all bool) int

Stack 将调用 goroutine 的堆栈跟踪格式化为 buf 并返回写入 buf 的字节数。如果一切都为真,Stack 会将所有其他 goroutine 的堆栈跟踪格式化为当前 goroutine 的跟踪之后的 buf。

【讨论】:

猜你喜欢
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 2015-04-28
  • 2019-09-26
  • 2011-02-10
  • 1970-01-01
相关资源
最近更新 更多