如何在VSCode中调试Goroutine?

16

请考虑下面这个小片段:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        defer wg.Done()
        for i := 1; i < 100; i++ {
            fmt.Println("A:", i)
        }
    }()
    go func() {
        defer wg.Done()
        for i := 1; i < 100; i++ {
            fmt.Println("B:", i)
        }
    }()
    wg.Wait()
}

在Delve中,我们可以使用命令轻松地在goroutine之间切换,例如

goroutine
goroutine <id>
goroutine <id> <command>

如果我想在goroutine 1中逐步运行,只需使用以下命令

and if i want run step by step in goroutine 1, just use the command

goroutine 1 next
在vscode中,似乎处理goroutine的唯一方法是调用堆栈,但是这似乎是go运行时中的内部线程而不是goroutine,那么我该如何关注指定goroutine中的运行过程呢?
2个回答

2
那么如何将运行的进程集中在指定的 goroutine 中呢?vscode-go issue 1797 提供了可能的解决方案:
例如,当调试一个简单的 hello world 程序时,在调用栈中会出现 5 个不同的 goroutine: Program stopped on a breakpoint in main.go: 本提案是(默认)仅显示用户 goroutine 在调用栈中。使用这个新默认值时,hello world 的调用栈将只显示一个 goroutine,这符合没有并发的简单程序应该有的预期: unique goroutine 它刚刚在CL 359402(CL = 更改列表:一组提交/补丁)中提交(2021年10月)。

package.json: 添加配置以在调试时隐藏系统 goroutine

此更改包括在调试会话中隐藏系统 goroutine 的配置


所以:尚未交付,但可能在0.30或0.31版本中。 - VonC

-4

Jetbrains在其IDE中引入了一个很酷的新功能,用于调试go-routines。请点击此链接查看。

它使用pprof提供的标签功能,并不是Jetbrains独有的,尽管他们可能已经为可用性进行了调整。这里有一篇文章介绍标签,以便您也可以尝试在VSCode中实现它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接