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

情况:


我的 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 的堆栈转储。


有没有办法做到这一点?


江户川乱折腾
浏览 166回答 2
2回答

繁花不似锦

如果您想从 Go 进程获取堆栈跟踪,默认的信号处理程序SIGQUIT将打印堆栈跟踪并退出。还有一些有用的设置可以通过GODEBUG和GOTRACEBACK环境变量启用,记录在运行时包中。在这种情况下,使用schedtrace、scheddetail或gctrace可能有助于显示程序冻结时发生的情况。

尚方宝剑之说

种族检测你说你有比赛,你应该尝试使用-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 的完整堆栈跟踪,而无需终止它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go