【发布时间】:2019-08-10 19:33:31
【问题描述】:
情况:
我的 Go 服务器程序存在竞争条件问题:
go func() {
i := 1
for {
fmt.Printf("I am alive: %d\n",i)
time.Sleep(1 * time.Second)
i+=1
}
}()
在对我的程序进行大量并行请求后,它完全挂掉了,甚至 main 中的 goroutine 也没有再写任何东西。
问题:
我想消除这个问题。为此,我想在这种状态下生成一个 panic 并接收所有 goroutine 的堆栈转储。
有什么办法吗?
【问题讨论】:
-
使用
-race选项(例如go run -race xx.go)运行您的应用程序,如果在运行时检测到数据竞争,它将提醒您(将源文件名和确切的行打印到控制台)。 -
在这种情况下它没有多大帮助 - 我没有可以通过 -race 检测到的竞态条件。这就是为什么我首先要查找程序的当前状态。
-
你向 go 程序发送 SIGQUIT 以使其转储堆栈跟踪
-
哦,如果一切最终都冻结了,那通常是某处繁忙循环的迹象。
-
@JimB: SIGQUIT 这确实是我一直在寻找的——它可以被接受为我的问题的答案。
标签: go