使用探查器标签
最后修改时间:2022 年 3 月 17 日Goroutine 是与其他函数或方法同时运行的函数或方法。要创建 goroutine,请使用go
关键字后跟函数调用(例如,go func(p string, rid int64)
)。但是使用大量的 goroutine 会使程序更难调试。为了区分 goroutine,您可以使用自定义数据来标记 goroutine。
从 Go 1.9 开始,您可以记录附加信息以提供有关执行路径的更多上下文。您可以将任何标签集记录为分析数据的一部分,并在以后使用这些标签来检查分析器输出。
例如,您有一个队列处理程序,用于处理在某处创建的事件。处理程序可以设置标签来标识这些事件的创建位置。
在调试和核心转储分析期间,上下文信息可能会有所帮助。例如,您可以使用此信息更轻松地查找特定的 goroutine。
添加标签
该runtime/pprof
包有几个可用于添加标签的新函数。最流行的是Do
功能。该Do
函数获取上下文,向该上下文添加标签,并将新上下文传递给 f 函数。
func Do(ctx context.Context, labels LabelSet, f func(context.Context))
该Do
函数仅为当前 goroutine 写入标签。如果您在 f 函数中创建新的 goroutine,则可以将上下文作为参数传递。
func main() {
ctx := context.Background()
for i := 0; i < 10; i++ {
labels := pprof.Labels("path", "/api/profile", "userId", strconv.Itoa(rand.Intn(100)))
go pprof.Do(ctx, labels, f)
}
time.Sleep(time.Second)
}
在 IntelliJ IDEA 中查看标签
出于说明目的,请从 GitHub复制以下代码示例。
在调用的地方放置一个断点println("ok")
。要放置断点,请单击第 21 行的装订线。运行该main
函数的调试。要开始调试,请单击函数附近装订线中的“运行”图标 ( ) ,然后选择“调试 <run_debug_configuration_name>”。从Goroutines列表中,观察可用的 Goroutines。main
按停止调试。删除该调用并取消注释该函数。按 重新运行调试过程。探索Goroutine列表。Goroutine 名称包含以下信息:. 您可以使用此信息在调试或核心转储分析期间查找特定的 goroutine。CtrlF2f(ctx)
Do
/api/profile, userId: <some number>
有用的链接
如何在调试期间查找 Goroutines:阅读有关如何在 IntelliJ IDEA 中使用探查器标签的教程。
Go 中的探查器标签位于 rakyll.org:了解有关探查器标签的更多信息。
感谢您的反馈意见!