我正在嘗試除錯泄漏的 goroutine(使用 Gomega 的gleak)。當單元測驗結束時,一些 goroutines “頑固地”堅持不終止,gleak用他們的堆疊跟蹤轉儲罪魁禍首。這些堆疊跟蹤中的某些呼叫甚至在其引數或回傳值中包含幾個問號,例如:
foo.(*Fooler).Foo(0x40003efa40, {0xeeb638?, 0x40005bc580}, {0x400013a000?, 0x6, 0xd9c3a4?}) at foo.go
對應的接收函式簽名如下:
func (f *Fooler) Foo(context.Context, []string)
我檢查了幾篇關于“解釋 golang 堆疊跟蹤”的帖子/文章/問題,尤其是如何解釋 Go stacktrace,但在 Go 堆疊跟蹤中沒有發現任何提到問號的內容。我發現解釋的示例從未提及任何有問題的(?)呼叫引數或回傳值。
那么堆疊跟蹤中出現問號的原因是什么?這可能與在暫存器中傳遞的 args 有關并且無法正確恢復堆疊跟蹤嗎?
uj5u.com熱心網友回復:
來自https://go.dev/doc/go1.18#runtime:
Go 1.17 通常改進了堆疊跟蹤中引數的格式,但可能會為暫存器中傳遞的引數列印不準確的值。這在 Go 1.18 中通過在每個可能不準確的值后列印一個問號 (?) 得到了改進。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/480567.html
