情況:我的 Go 服務器程序中存在競爭條件問題:go func() { i := 1 for { fmt.Printf("I am alive: %d\n",i) time.Sleep(1 * time.Second) i+=1 }}()對我的程序進行了大量并行請求后,它完全掛斷了,甚至main中的goroutine也不再寫任何東西。問題:我想消除這個問題。為此,我想panic在這種狀態(tài)下生成 a并接收所有 goroutine 的堆棧轉儲。有沒有辦法做到這一點?
2 回答

尚方寶劍之說
TA貢獻1788條經(jīng)驗 獲得超4個贊
種族檢測
你說你有比賽,你應該嘗試使用-race
選項運行你的應用程序,例如
go run -race xx.go
如果在運行時檢測到數(shù)據(jù)競爭,它會提醒您(將源文件名和確切的行打印到控制臺)。
剖析
如果這沒有幫助(因為它們可能不會發(fā)生,所以沒有檢測到比賽),那么您應該分析您的應用程序。有一個標準的 HTTP 接口來分析數(shù)據(jù),請參閱net/http/pprof
.
基本上import _ "net/http/pprof"
,然后啟動您的應用程序并訪問(使用您的端口):
http://localhost:8080/debug/pprof/
如果您的應用程序還沒有啟動網(wǎng)絡服務器,那么您必須這樣做:將net/http
和添加log
到您的導入中,并將以下代碼添加到您的主函數(shù)中:
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 關注
- 154 瀏覽
添加回答
舉報
0/150
提交
取消