情况:我的 Go 服务器程序中存在竞争条件问题:go func() { i := 1 for { fmt.Printf("I am alive: %d\n",i) time.Sleep(1 * time.Second) i+=1 }}()对我的程序进行了大量并行请求后,它完全挂断了,甚至main中的goroutine也不再写任何东西。问题:我想消除这个问题。为此,我想panic在这种状态下生成 a并接收所有 goroutine 的堆栈转储。有没有办法做到这一点?
2 回答

尚方宝剑之说
TA贡献1788条经验 获得超4个赞
种族检测
你说你有比赛,你应该尝试使用-race
选项运行你的应用程序,例如
go run -race xx.go
如果在运行时检测到数据竞争,它会提醒您(将源文件名和确切的行打印到控制台)。
剖析
如果这没有帮助(因为它们可能不会发生,所以没有检测到比赛),那么您应该分析您的应用程序。有一个标准的 HTTP 接口来分析数据,请参阅net/http/pprof
.
基本上import _ "net/http/pprof"
,然后启动您的应用程序并访问(使用您的端口):
http://localhost:8080/debug/pprof/
如果您的应用程序还没有启动网络服务器,那么您必须这样做:将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 的完整堆栈跟踪,而无需终止它。
- 2 回答
- 0 关注
- 165 浏览
添加回答
举报
0/150
提交
取消