【发布时间】:2017-09-12 19:05:35
【问题描述】:
我使用 golang 编写了一个网络应用程序。当它在生产中运行时,有一些 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 中。堆栈跟踪是incomplete,因为之前的堆栈跟踪属于parent goroutine。
我的问题应该是:有没有更好的方法来调试这个问题?
【问题讨论】:
-
尝试运行
go run -race *.go -
@Acidic 我已经尝试过了。也许这不是某种竞争条件。还是谢谢。
-
@Eagle /database/sql/sql.go:1440 正在等待提交或回滚事务。您可以检查您的代码是否有未解决的交易。
-
@JohnSPerayil 我检查了我的代码。有很多 API 使用 SQL 事务。但如果没有
Rollback或Commit,我找不到。这就是为什么我想获得完整的堆栈跟踪。还是谢谢。 -
公平地说,跟踪并不完整。它被称为
go tx.awaitDone()。每个 goroutine 都有自己的堆栈,因此这是您正在检查的 goroutine 堆栈的开头。
标签: performance go