为了账号安全,请及时绑定邮箱和手机立即绑定

在工作过程中生成恐慌堆栈跟踪

在工作过程中生成恐慌堆栈跟踪

Go
江户川乱折腾 2021-12-20 09:51:55
情况:我的 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贡献1851条经验 获得超4个赞

如果您想从 Go 进程获取堆栈跟踪,默认的信号处理程序SIGQUIT将打印堆栈跟踪并退出。

还有一些有用的设置可以通过GODEBUGGOTRACEBACK环境变量启用,记录在运行时包中。在这种情况下,使用schedtracescheddetailgctrace可能有助于显示程序冻结时发生的情况。


查看完整回答
反对 回复 2021-12-20
?
尚方宝剑之说

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 的完整堆栈跟踪,而无需终止它。


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号