Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 对工作过程生成跟踪_Go - Fatal编程技术网

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服务器程序中存在竞态条件问题:

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它确实是我在寻找的-它可以接受我问题的答案。