我使用golang编写了一个Web应用程序。在生产环境中运行时,有些goroutines被阻塞了。以下是相关信息(使用pprof
生成):
goroutine 792247 [chan receive, 948 minutes]:
database/sql.(*Tx).awaitDone(0xc4206e2b80)
/usr/local/go/src/database/sql/sql.go:1440 +0x57
created by database/sql.(*DB).begin
/usr/local/go/src/database/sql/sql.go:1383 +0x274
goroutine已经在通道上等待了948分钟。显然,有些问题。但是堆栈跟踪似乎不完整。这对我来说不足以找到错误。(我想要一些从我的程序开始的堆栈跟踪。)
如何获取此goroutine的完整堆栈跟踪?还有其他调试此问题的方法吗?
更新:
我已经阅读了database/sql/sql.go的源代码。原来database/sql/sql.go:1440在一个新的goroutine中。堆栈跟踪是不完整的,因为之前的堆栈跟踪属于父goroutine。
我的问题应该是:是否有更好的方法来调试此问题?
go run -race *.go
。 - Ari SeyhunRollback
或Commit
的。这就是为什么我想要获取完整的堆栈跟踪。无论如何,谢谢。 - Eaglego tx.awaitDone()
。每个 goroutine 都有自己的堆栈,所以这是您正在检查的 goroutine 的堆栈的开头。 - Adrian