我正在try 调试泄漏的goroutines(使用Gomega的gleak).当单元测试结束时,一些goroutine"顽固地"坚持不终止,gleak会转储罪魁祸首及其堆栈跟踪.这些堆栈跟踪中的某些调用在其参数或返回值中甚至包含几个问号,例如:

foo.(*Fooler).Foo(0x40003efa40, {0xeeb638?, 0x40005bc580}, {0x400013a000?, 0x6, 0xd9c3a4?}) at foo.go

相应的接收器功能签名如下:

func (f *Fooler) Foo(context.Context, []string)

我查看了几篇关于"解读golang stack traces"的帖子/文章/问题,至少有How to interpret Go stacktrace篇,但在Go stack traces中没有发现任何问号.我发现解释的例子从未提及任何可疑(?)调用参数或返回值.

那么,堆栈跟踪中出现问号的原因是什么?这是否与传入寄存器的参数有关,并且不能正确恢复堆栈跟踪?

推荐答案

https://go.dev/doc/go1.18#runtime开始:

Go 1.17通常改进了堆栈跟踪中参数的格式,但可能会为寄存器中传递的参数打印不准确的值.这在Go 1.18中通过打印问号(?)进行了改进在每个可能不准确的值之后.

Go相关问答推荐

Go:嵌入类型不能是类型参数""

消费者在NAT中是如何实现的

埃拉托塞尼筛:加快交叉关闭倍数步骤

Golang:访问any类型泛型上的字段

错误!在为 age-viewer-go 运行 wails dev 或 wails build 命令时

Get 请求在 Thunder 客户端/Postman 中返回数据,但在 Golang 代码中给出空白数据

使用图像解码 JPEG 时 colored颜色 不正确.解码并写入 PDF?

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

Go 信号处理程序不处理终端窗口关闭

Golang:如何判断通过缓冲通道进行通信时生产者或消费者是否较慢?

访问传递给可变参数函数的通用 struct 的特定字段

使用 golang 生成 vim

为什么当我忽略 template.New() 程序可以成功运行?

将shell输出绑定到Go中的 struct 的最佳方法?

如何使用特定的 Go 版本运行 govulncheck?

Golang 使用 docker 将敏感数据作为参数传递

Go模板中的浮点除法

golangci-lint 的 GitHub 操作失败,无法加载 fmt

Go/Golang:如何从 big.Float 中提取最低有效数字?

获取单调时间,同 CLOCK_MONOTONIC