是否有一种方法可以使用一些调试标志,以获得所有goroutines的堆栈跟踪的转储以及“父”goroutines的堆栈跟踪(这里使用“parent”表示goroutine执行调用go foo()
的调用,启动了有问题的goroutine)。这个问题的上下文是我有一个连接泄漏,并注意到awaitDone
(在sql包中)阻塞了许多goroutine,并且这些goroutine产生了创建连接的地方。
答案 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 的元数据改变主意,否则我认为这是最好的选择。