得到“父”goroutine的堆栈以及“孩子”的堆栈

时间:2017-08-17 19:10:59

标签: go

是否有一种方法可以使用一些调试标志,以获得所有goroutines的堆栈跟踪的转储以及“父”goroutines的堆栈跟踪(这里使用“parent”表示goroutine执行调用go foo()的调用,启动了有问题的goroutine)。这个问题的上下文是我有一个连接泄漏,并注意到awaitDone(在sql包中)阻塞了许多goroutine,并且这些goroutine产生了创建连接的地方。

2 个答案:

答案 0 :(得分:0)

如果我理解你的要求,你可以使用运行时包打印/输出你想要的信息。

看一看 https://golang.org/pkg/runtime/#Caller和跳过参数。加上框架文档:https://golang.org/pkg/runtime/#Frames

这就是你要追求的吗?

答案 1 :(得分:0)

runtime.Stack() 将为您提供运行时知道的所有堆栈信息。

阅读输出你可以看到,对于 Goroutines,它们被设计为不包含其祖先的信息。

但是,在堆栈输出中,您可以访问创建 goroutine 的位置。从技术上讲,您可以将其与其他 Goroutine 的堆栈输出自动交叉匹配,以部分不准确地推断拓扑。

AFAIK,这是解决调试问题的 Golang IDE。除非 Golang 核心团队对 Goroutine 的元数据改变主意,否则我认为这是最好的选择。