Go 对工作过程生成跟踪
情况: 我的Go服务器程序中存在竞态条件问题:Go 对工作过程生成跟踪,go,Go,情况: 我的Go服务器程序中存在竞态条件问题: go func() { i := 1 for { fmt.Printf("I am alive: %d\n",i) time.Sleep(1 * time.Second) i+=1 } }() 在对我的程序进行了大量并行请求之后,它完全挂起,甚至主程序中的goroutine也不再编写任何东西 问题: 我想消除这个问题。为此,我想在这种状态下产生一个恐慌,并接收所有gorout
go func() {
i := 1
for {
fmt.Printf("I am alive: %d\n",i)
time.Sleep(1 * time.Second)
i+=1
}
}()
在对我的程序进行了大量并行请求之后,它完全挂起,甚至主程序中的goroutine也不再编写任何东西
问题:
我想消除这个问题。为此,我想在这种状态下产生一个恐慌,并接收所有goroutine的堆栈转储
有没有办法做到这一点?种族检测
您说您有比赛,您应该尝试使用-race
选项运行应用程序,例如
go run -race xx.go
如果在运行时检测到数据争用,将向您发出警报(将源文件名和精确的行打印到控制台)
轮廓
如果这没有帮助(因为比赛可能不会发生,所以没有检测到比赛),那么你应该配置你的应用程序。有一个用于分析数据的标准HTTP接口,请参阅的包doc
基本上是导入net/http/pprof“
,然后启动你的应用程序并访问(使用你的端口):
如果您的应用程序尚未启动web服务器,则必须执行以下操作:将net/http
和log
添加到导入中,并将以下代码添加到主功能中:
go func() {
log.Println(http.ListenAndServe("localhost:8080", nil))
}()
可以在以下位置查看堆栈跟踪:
http://localhost:8080/debug/pprof/goroutine?debug=1
以及在
http://localhost:8080/debug/pprof/goroutine?debug=2
这些页面允许您查看实时应用程序所有goroutine的完整堆栈跟踪,而无需终止它
其他有用资源
种族检测
您说您有比赛,您应该尝试使用-race
选项运行应用程序,例如
go run -race xx.go
如果在运行时检测到数据争用,将向您发出警报(将源文件名和精确的行打印到控制台)
轮廓
如果这没有帮助(因为比赛可能不会发生,所以没有检测到比赛),那么你应该配置你的应用程序。有一个用于分析数据的标准HTTP接口,请参阅的包doc
基本上是导入net/http/pprof“
,然后启动你的应用程序并访问(使用你的端口):
如果您的应用程序尚未启动web服务器,则必须执行以下操作:将net/http
和log
添加到导入中,并将以下代码添加到主功能中:
go func() {
log.Println(http.ListenAndServe("localhost:8080", nil))
}()
可以在以下位置查看堆栈跟踪:
http://localhost:8080/debug/pprof/goroutine?debug=1
以及在
http://localhost:8080/debug/pprof/goroutine?debug=2
这些页面允许您查看实时应用程序所有goroutine的完整堆栈跟踪,而无需终止它
其他有用资源
如果要从Go进程获取堆栈跟踪,则
SIGQUIT
的默认信号处理程序将打印堆栈跟踪并退出
还可以通过
GODEBUG
和GOTRACEBACK
环境变量启用一些有用的设置,这些变量记录在中。在这种情况下,使用schedtrace
、scheddetail
或gctrace
可能有助于显示程序冻结时发生的情况 如果要从Go进程获取堆栈跟踪,SIGQUIT
的默认信号处理程序将打印堆栈跟踪并退出
还可以通过
GODEBUG
和GOTRACEBACK
环境变量启用一些有用的设置,这些变量记录在中。在这种情况下,使用schedtrace
、scheddetail
或gctrace
可能有助于显示程序冻结时发生的情况 使用-race
选项运行应用程序(例如go Run-race xx.go
),如果在运行时检测到数据竞争,该选项将向您发出警报(将源文件名和精确的行打印到控制台)。在这种情况下,这没有多大帮助-我没有可以通过比赛检测到的竞争条件。这就是为什么我首先要找到一个程序的当前状态。你向一个go程序发送一个SIGQUIT,使它转储一个堆栈跟踪,如果所有东西最终都冻结,这通常是某个地方循环繁忙的迹象。@JimB:SIGQUIT这确实是我在寻找的-它可以作为我问题的答案。使用-race
选项运行应用程序(例如go Run-race xx.go
),该选项将提醒您(将源文件名和精确的行打印到控制台)如果在运行时检测到数据争用,在这种情况下它没有多大帮助-我没有可以通过争用检测到的争用条件。这就是为什么我首先要找到一个程序的当前状态。你向一个go程序发送一个SIGQUIT,使它转储一个堆栈跟踪,如果所有东西最终都冻结了,这通常是某个地方循环繁忙的迹象。@JimB:SIGQUIT它确实是我在寻找的-它可以接受我问题的答案。