【问题标题】:how to debug goroutine in vscode?如何在 vscode 中调试 goroutine?
【发布时间】:2020-07-25 14:38:51
【问题描述】:

考虑下面的小sn-p:

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 中逐步运行,只需使用命令

goroutine 1 next

在vscode中,处理goroutines的唯一方法似乎是调用堆栈,然而,这似乎是go运行时的内部线程,而不是goroutines,所以我怎样才能将正在运行的进程集中在指定的goroutine中?

【问题讨论】:

    标签: go visual-studio-code goroutine delve


    【解决方案1】:

    那么我怎样才能将正在运行的进程集中在指定的 goroutine 中呢?

    vscode-go issue 1797应该带来一个可能的解决方案:

    例如,在调试一个简单的 hello world 程序时,调用堆栈中会出现 5 个不同的 goroutine:

    这个提议是(默认情况下)仅在调用堆栈中显示用户 goroutine。当使用这个新的默认值时,hello world 的调用堆栈将只显示一个 goroutine,正如一个没有并发的简单程序所期望的那样:

    它刚刚(2021 年 10 月)已在 CL 359402 提交(CL = 更改列表:一组提交/补丁)

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

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

    【讨论】:

    • 所以:尚未交付,但可能在 0.30 或 0.31 中。
    【解决方案2】:

    Jetbrains 推出了一项很酷的新功能,用于在其 IDE 中调试 go-routines。请关注这个link看看

    它使用 pprof 提供的标签功能,并且我认为它不是 jetbrains 独有的,尽管他们可能已经对其进行了调整以提高可用性。这是标签上的article,以便您也可以尝试在 vscode 中实现它。

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 2020-03-09
      • 2023-03-24
      • 2021-08-03
      • 1970-01-01
      • 2023-01-09
      • 2021-08-08
      • 2019-04-20
      • 1970-01-01
      相关资源
      最近更新 更多